Software Philosophy – Telegram
Software Philosophy
3.46K subscribers
160 photos
41 videos
1.54K links
چکیده‌ای از مفاهیم به روز مهندسی نرم افزار برای مهندسین نرم‌افزار.
معماری نوین نرم‌افزار، تکنولوژی‌های برنامه نویسی جدید
Download Telegram
مدیریت هوشمند Migrationها در EF Core با Docker و EF Tools

در این روش، شما EF Core Tools را مستقیماً داخل Docker نصب می‌کنید، که به شما امکان می‌دهد migrationها را بدون نیاز به نصب ابزارهای اضافی روی سیستم شخصی خود، کاملاً داخل کانتینر مدیریت کنید. این روش برای CI/CD و محیط‌های تولیدی عالی است، چون همه چیز ایزوله و مستقل داخل کانتینر انجام می‌شود.

مراحل نصب EF Core Tools در Docker و اجرای migrationها

۱. تنظیم Dockerfile

در Dockerfile، EF Core Tools را نصب می‌کنیم تا migrationها به‌طور خودکار داخل کانتینر اجرا شوند. هر بار که کانتینر ساخته و اجرا می‌شود، migrationها اعمال و دیتابیس آماده استفاده می‌شود.
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["YourProject/YourProject.csproj", "YourProject/"]
RUN dotnet restore "YourProject/YourProject.csproj"
COPY . .
RUN dotnet build "YourProject/YourProject.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "YourProject/YourProject.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .

# نصب EF Core Tools و اجرای migrationها
RUN dotnet tool install --global dotnet-ef
ENV PATH="$PATH:/root/.dotnet/tools"
RUN dotnet ef database update

ENTRYPOINT ["dotnet", "YourProject.dll"]

۲. ساخت و اجرای کانتینر

کافی است دستورات زیر را اجرا کنید تا کانتینر ساخته و اپلیکیشن شما اجرا شود:
docker build -t your-image-name .
docker run -d your-image-name

مزایای این روش

▫️سادگی و انعطاف در CI/CD:
عملیات migrationها خودکار اجرا می‌شوند و برای محیط‌های CI/CD فوق‌العاده مناسب هستند.

▫️استقلال از محیط توسعه:
نیاز به ابزارهای اضافی روی سیستم شخصی نیست؛ همه چیز داخل Docker انجام می‌شود.

▫️دیتابیس همیشه به‌روز:
هر بار که کانتینر اجرا شود، migrationها اعمال می‌شوند و دیتابیس سینک می‌ماند.


این روش یه راهکار راحت و ایزوله برای مدیریت migrationهاست و کار با Docker را هم ساده‌تر می‌کند.

🔗 برای مطالعه بیشتر میتوانید به این لینک مراجعه نمایید.

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#هوتن_همتی (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

________
👍173🔥2
Media is too big
VIEW IN TELEGRAM
کوپایلوتی ساده برای پزشکان

هفته پیش برای کنگره دندان‌پزشکان یه ورک‌شاپ هوش‌مصنوعی داشتم.
دو سه روز قبل کنگره یه کد خیلی ساده نوشتم که بشه توانایی‌های هوش‌مصنوعی و پتانسیل‌هایی که داره رو به دندون‌پزشکا نشون بدم و نتیجش شد این.

توضیح اینکه این از یه مدل ساده بدون هیچ بهبودی داره استفاده می‌کنه و برای پیاده‌سازیش از مدل‌های Azure AI استفاده کردم و کدش رو هم با #csharp نوشتم.

#openai #gpt #dotnet #azure

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#مهران_داودی (لینکدین - بلاگ)

کانال تلگرام:
@SoftwarePhilosophy

__________
5👏15👍74🔥3
Media is too big
VIEW IN TELEGRAM
معرفی Bit Boilerplate Project Template، بهشت دات‌نتی‌ها!

در کمتر از ده دقیقه با یکی از کامل‌ترین NET project template. های حال حاضر برای Cross Platform Desktop/Mobile/Web development آشنا بشید و ببینید با Blazor چه اپ‌های خفنی می‌شه توسعه داد که هم سبک و سریع باشن و بهینه و با معماری فوق‌العاده.

این فریم‌ورک جذاب توسط یه تیم ایرانی درست شده که الان استارتاپ‌شون تو هلنده و خیلی از شرکت‌های خارجی و ایرانی از زیرساختشون استفاده می‌کنن.

https://bitplatform.dev/boilerplate
#dotnet #csharp #blazor #maui

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#مهران_داودی (لینکدین - بلاگ)

کانال تلگرام:
@SoftwarePhilosophy

__________
2👍1711🔥7👏5🤬2🤩1
بررسی و تفاوت چند نوع عددی در سی شارپ: float , int , double , decimal

#csharp_for_beginners

وقتی شما برای زمان طولانی مدت با زبان برنامه نویسی C# کار می‌کنید متغییرها برای شما به چیزهای عادی و روزمره تبدیل می‌شوند اما حالا می‌خواهیم نگاهی دقیق‌تر به متغییرهای عددی مانند (decimal , double , float , int) داشته باشیم.

▫️چرا int پیش فرض است؟
این به این معنی است که اگر شما یک عدد صحیح را بدون مشخص کردن نوع آن بنویسید، c# به طور خودکار آن را به عنوان int در نظر می‌گیرد.
در سی شارپ، برای بهبود عملکرد، متغیر عدد به طور پیش فرض روی int قرار می گیرد. int به بهترین وجه با معماری ۳۲ بیتی دات نت هماهنگ است و عملیات سریعتر و کارآمدتر را تضمین می کند. این ممکن است با استاندارد شدن معماری 64 بیتی تغییر کند، اما در حال حاضر، اعداد صحیح ۳۲ بیتی کارآمدترین انتخاب هستند.

مانند مثال روبرو :
var number = 10




▫️ تفاوت نوع اعداد در C#.

استفاده از float و double و decimal در محاسبات، تفاوت‌های آنها را نشان می دهد: float دقت بالاتری دارد، double دارای محدوده بزرگ‌تری از دقت است است، و decimal برای اعداد اعشاری با رقم های بسیار بالا که حدود 29 رقم داشته باشند به کار می‌رود .

مثالی برای درک بهتر تفاوت ها
float floatValue = 1f / 3f; 
double doubleValue = 1d / 3d;
decimal decimalValue = 1m / 3m;



🔗 نسخه کامل این مقاله را ‌می‌توانید در اینجا مطالعه کنید.

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

کانال تلگرام:
@SoftwarePhilosophy

______
1👍132
ظهور #InstructUI برای ساخت #ui با #ai برای #blazor !!!

این ویدئوی ۵ دقیقه‌ای نشان می‌دهد که چطور می‌توانید با چت کردن صفحات مورد نظر خود را بسازید و خروجی لایو آن را ببینید.
محصول جدیدی نیست و قبلا مشابه آن وجود داشته، اما جذابیت این یکی تولید خروجی روی #blazor و #webassembly به جای #react و #javanoscript هست.

دنیای #بلیزر و #وب‌اسمبلی خیلی دنیای جالبی داره می‌شه و به نظر آینده خیلی خوبی داره در چند سال آینده.

https://www.youtube.com/watch?v=4PiIx4TPgbw

#مهران_داودی (لینکدین - بلاگ)

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

کانال تلگرام:
@SoftwarePhilosophy

______
2🔥12👍61
حلقه‌ها در سی‌شارپ

#csharp_for_beginners

در برنامه‌نویسی، حلقه‌ها ابزارهای قدرتمندی برای اجرای مجموعه‌ای از دستورات به‌صورت مکرر هستند. در زبان برنامه‌نویسی C#، انواع مختلفی از حلقه وجود دارد که به برنامه‌نویسان امکان می‌دهد تا وظایف تکراری را با کارایی بالا انجام دهند. در این مقاله، انواع مختلف حلقه‌ها در C# را بررسی کرده و نحوه استفاده از آن‌ها را توضیح خواهیم داد.

حلقه for
حلقه for معمولاً زمانی استفاده می‌شود که تعداد تکرارها مشخص باشد. این حلقه شامل سه بخش اصلی است:
۱. مقداردهی اولیه
۲. شرط ادامه حلقه
۳. افزایش یا کاهش مقدار متغیر کنترلی

مثال:
for (int i = 0; i < 5; i++)
{
; ("مقدار i: " + i)Console.WriteLine
}


حلقه while
حلقه while معمولاً زمانی استفاده می‌شود که تعداد تکرارها از قبل مشخص نباشد و اجرای حلقه به یک شرط وابسته باشد.

مثال:
int i = 0;
while (i < 5)
{
;("مقدار i: " + i)Console.WriteLine
i++;
}


این حلقه نیز مانند for مقدار i را از صفر تا ۴ نمایش می‌دهد، اما شرط در ابتدای حلقه بررسی می‌شود.

حلقه do-while
حلقه do-while مشابه while است، با این تفاوت که شرط در انتهای حلقه بررسی می‌شود. بنابراین، بدنه‌ی حلقه حداقل یک بار اجرا خواهد شد.

مثال:
int i = 0;
do
{
;("مقدار i: " + i)Console.WriteLine
i++;
} while (i < 5);


🔗 نسخه کامل این مقاله را ‌می‌توانید در اینجا مطالعه کنید.

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

کانال تلگرام:
@SoftwarePhilosophy

______
👍71
۱۰ برابر شدن سرعت TypeScript با پورت کامپایلر به GO

در این ویدئو Andres Hejlsberg (خالق تایپ‌اسکریپت و سی‌شارپ) توضیح می‌دهد که چگونه با پورت کردن کدهای کامپایلر TypeScript به GO، سرعت کامپایل را 10x بهتر کرده‌اند!

او همچنین توضیح می‌دهد که چرا زیرساخت JavaScript برای این کار مناسب نیست. در حقیقت این زبان بیشتر برای کارهای UI طراحی شده بوده و زیرساخت‌های لازم برای کارهای performance-intensive مانند این کار را ندارد.

برای من خیلی جالب بود خالق سی‌شارپ، زبان GO را برای این کار انتخاب کرده، پس مستندات مربوط به این تصمیم را خواندم.
https://github.com/microsoft/typenoscript-go/discussions/411

اولین نکته جالب این بود که چقدر بدون تعصب و با ذهن باز زبان‌های مختلف رو بررسی کردن.
با توجه به اینکه هر دو زبان‌ C#, GO از لحاظ پرفورمنسی بسیار خوب هستند، یکی از مهم‌ترین دلایل انتخاب GO تشابه بسیار بالای سینتکس آن با TypeScript بوده است.

کامپایلر قبلی تایپ‌اسکریپت، با خود تایپ‌اسکریپت نوشته شده و تیم نمی‌خواستند که کل آن را بازنویسی کنند.
در حقیقت هدف rewrite کردن نبوده، بلکه port کردن بوده.
آنها دنبال پورت کردن آن به یک زبان با پرفورمنس بالا بودند که تشابه سینتکسی بالایی داشته باشد تا عملیات پورت بتواند راحت‌تر انجام شود.

از بین زبان‌های C#, GO و Rust، زبان گو تشابه سینتکسی بیشتری با تایپ‌اسکریپت داشته و در نهایت انتخاب شده.

به نظرم نحوه انتخاب زبان برای این کار توسط خالق سی‌شارپ و تایپ‌اسکریپ، درس‌های تکنیکال و بیزسنی زیادی برای یاد گرفتن داره. نظر شما چیه؟


https://www.youtube.com/watch?v=pNlq-EVld70

#مهران_داودی (لینکدین - بلاگ)

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

کانال تلگرام:
@SoftwarePhilosophy

______
1🔥20👍144
👍3🔥1
آشنایی با Outbox Pattern و اهمیت آن در سیستم‌های توزیع‌شده

آیا تاکنون در توسعه‌ی یک سیستم توزیع‌شده با این دغدغه مواجه شده‌اید که هنگام ثبت تغییرات در پایگاه داده و هم‌زمان ارسال پیام (رویداد) به یک سرویس دیگر (مانند RabbitMQ یا Kafka)، ممکن است یکی از این مراحل با موفقیت انجام شود و دیگری با شکست روبه‌رو گردد؟ در چنین شرایطی، بخشی از داده‌ها به‌روز می‌شود اما سرویس‌های مصرف‌کننده از این تغییرات بی‌خبر می‌مانند و هماهنگی میان بخش‌های مختلف سیستم از بین می‌رود.

مشکل اصلی کجاست؟
به‌طور معمول، اگر در حین به‌روزرسانی یک موجودیت در پایگاه داده بخواهیم یک رویداد نیز به سیستم دیگری ارسال کنیم و مراحل دیتابیس و ارسال پیام در یک تراکنش مجزا یا به‌صورت ناهم‌زمان انجام شوند، احتمال از دست رفتن یا عدم ارسال پیام وجود دارد. این امر ممکن است به ناسازگاری در داده‌ها و عملکرد سرویس‌های وابسته منجر شود.

راه‌حل چیست؟
در اینجاست که الگوی Outbox وارد عمل می‌شود. این الگو پیش‌بینی می‌کند که ابتدا همه‌ی رویدادهایی که قرار است برای سیستم‌های دیگر ارسال شوند در جدولی اختصاصی (Outbox Table) در همان پایگاه داده‌ی اصلی ذخیره شوند. این کار هم‌زمان با تراکنش به‌روزرسانی سایر داده‌ها صورت می‌گیرد، به‌طوری‌که اگر عملیات اصلی موفق باشد، اطلاعات رویداد نیز قطعاً ثبت می‌شود.

سپس چه می‌شود؟
یک فرایند مجزا (Outbox Process) به‌طور مستمر این جدول را بررسی می‌کند و رویدادهای ثبت‌شده را به پیام‌رسان (Message Broker) ارسال می‌کند. در صورت موفقیت در ارسال، رکورد مربوطه از جدول Outbox حذف می‌شود و بدین ترتیب از ارسال مجدد ناخواسته جلوگیری می‌گردد. اگر هم پیام‌رسان در لحظه غیرفعال باشد یا خطایی رخ دهد، رکورد رویداد کماکان در پایگاه داده باقی می‌ماند تا در تلاش بعدی مجدداً ارسال شود.

مزایای Outbox Pattern
۱. جلوگیری از ناسازگاری داده‌ها: با انجام ثبت رویداد و تغییرات داده در یک تراکنش واحد، احتمال بروز تناقض در داده‌ها کاهش می‌یابد.
۲. اطمینان از عدم از دست رفتن رویدادها: حتی اگر زیرساخت ارتباطی یا پیام‌رسان موقتاً از دسترس خارج شود، پیام در Outbox محفوظ می‌ماند و پس از بازگشت سرویس، ارسال خواهد شد.
۳. مقیاس‌پذیری بالا: افزودن سرویس‌های جدید یا گسترش زیرساخت پیام‌رسانی تحت تأثیر این الگو به‌راحتی امکان‌پذیر است، چرا که شیوه‌ی ثبت و ارسال رویدادها مشخص و یکپارچه است.

در واقع Outbox Pattern راهکاری قدرتمند و مطمئن برای ساخت سیستم‌های توزیع‌شده و مبتنی بر رویداد است و کمک می‌کند دغدغه‌ی شکست ارسال پیام و ناسازگاری داده‌ها برطرف شود.

🔗 برای مطالعه بیشتر می‌توانید به این لینک مراجعه نمایید.

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#هوتن_همتی (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

___________
1👍164🔥2
درک انواع داده‌ها در سی‌شارپ

#csharp_for_beginners

در دنیای C#، درک تفاوت‌های بین انواع داده‌ها برای برنامه‌نویسی مؤثر بسیار مهم است. این مقاله به بررسی تفاوت‌های بین انواع داده‌های decimal، double و float می‌پردازد و بر دقت، صحت و تأثیرات عملکردی آن‌ها تمرکز می‌کند.

دقت (Precision): به نزدیکی اندازه‌گیری‌ها اشاره دارد. به عنوان مثال، اگر یک مقدار را چندین بار اندازه‌گیری کنیم و نتیجه یکسانی بگیریم، نشان‌دهنده دقت بالا است.

صحت (Accuracy): نشان‌دهنده نزدیکی یک اندازه‌گیری به یک استاندارد شناخته شده است. یک اندازه‌گیری که از مقدار واقعی دور است، نادرست تلقی می‌شود.

دقت حسابی (Arithmetic Precision): به تعداد ارقام استفاده شده برای نمایش یک عدد اشاره دارد. ارقام بیشتر به معنای دقت بالاتر است.

تایپ decimal
دقت: دقت بالا (28-29 رقم معنادار).
موارد استفاده: ایده‌آل برای محاسبات مالی که در آن دقت بسیار مهم است.
عملکرد: به دلیل نمایندگی پایه 10، کندتر از double و float است.

تایپ double
دقت: دقت متوسط (15-16 رقم معنادار).
موارد استفاده: مناسب برای محاسبات علمی که در آن عملکرد مهم‌تر از دقت است.
عملکرد: به دلیل نمایندگی پایه 2، سریع‌تر از decimal است.

تایپ float
دقت: دقت پایین (7 رقم معنادار).
موارد استفاده: در برنامه‌هایی که صرفه‌جویی در حافظه مهم‌تر از دقت است، مانند گرافیک، استفاده می‌شود.
عملکرد: مشابه double است اما با دقت کمتر.

مقایسه عملکرد
هنگام مقایسه عملکرد این انواع داده، مشخص می‌شود که:

تایپ Double سریع‌ترین است و برای برنامه‌هایی که به محاسبات سریع نیاز دارند، مناسب است.
تایپ Decimal کندترین است اما بالاترین دقت را ارائه می‌دهد و برای برنامه‌های مالی ایده‌آل است.
تایپ Float تعادلی بین سرعت و استفاده از حافظه ارائه می‌دهد اما دقت را فدای آن می‌کند.

🔗 ویدئو را از اینجا می‌توانید ببیند.

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

کانال تلگرام:
@SoftwarePhilosophy

______
1👍202👏1
ساخت یک MCP Server‌ ساده با سی‌شارپ

اگه برنامه‌نویس #دات‌نت هستین، تو این پست توضیح داده که چطور با #سی‌شارپ می‌تونین یه MCP Server بالا بیارین و توی Cursor تستش کنین.
اگر نمی‌دونین MCP چیه، یه چورایی همون معادل REST API دنیای وب، در هوش مصنوعیه. یعنی سیستم‌های مختلف امکانات هوش‌مصنوعی خودشون رو از این طریق در اختیار بقیه سیستم‌های هوش‌مصنوعی قرار می‌دن.
مفهوم MCP از اونجایی خیلی مهمه که می‌تونه همون نقشی که ظهور API ها در دنیای وب باعث گسترش یک عالمه اینتگریشن شد، همون نقش رو می‌تونن MCP ها هم بازی کنن و باعث رشد خیلی زیاد محصولات هوش‌مصنوعی باشیم.

تو این پست قدم به قدم اول یه پروژه دات‌نتی ساده درست کرده و بعد کدهای مربوط به MCP رو نوشته و در آخر هم نشون داده که چطور می‌تونین این MCP رو با Cursor تست کنین.

https://dev.to/mehrandvd/create-an-mcp-server-with-net-and-c-251p

https://dev.to/mehrandvd/create-an-mcp-server-with-net-and-c-251p

#مهران_داودی (لینکدین - بلاگ)

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

کانال تلگرام:
@SoftwarePhilosophy

______
5👍1910🔥4
انواع عددی صحیح (Integral Numeric Types) در سی شارپ

#csharp_for_beginners

در زبان برنامه‌نویسی C#، انواع عددی صحیح (Integral Numeric Types) برای نمایش اعداد صحیح به کار می‌روند. این انواع داده‌ای به‌عنوان نوع‌داده‌های مقداری (Value Types) شناخته می‌شوند و از عملیات‌های حسابی، منطقی بیتی، مقایسه‌ای و تساوی پشتیبانی می‌کنند

▫️در C#، انواع داده‌ای عددی صحیح شامل موارد زیر هستند:

نوع sbyte: از مقدار ۱۲۸- تا ۱۲۷ را در ۸ بیت ذخیره می‌کند و معادل System.SByte در .NET است.
نوع byte: از مقدار ۰ تا ۲۵۵ را در ۸ بیت ذخیره می‌کند و معادل System.Byte است.
نوع short: از مقدار ۳۲۷۶۸- تا ۳۲۷۶۷ را در ۱۶ بیت ذخیره می‌کند و معادل System.Int16 است.
نوع ushort: از مقدار ۰ تا ۶۵۶۳۵ را در ۱۶ بیت ذخیره می‌کند و معادل System.UInt16 است.
نوع int: از مقدار -2,147,483,648 تا 2,147,483,647 را در 32 بیت ذخیره می‌کند و معادل System.Int32 است.
نوع uint: از مقدار ۰ تا ۴,۲۹۴,۹۶۷,۲۹۵ را در ۳۲ بیت ذخیره می‌کند و معادل System.UInt32 است.
نوع long: از مقدار -9,223,372,036,854,775,808 تا 9,223,372,036,854,775,807 را در 64 بیت ذخیره می‌کند و معادل System.Int64 است.
نوع ulong: از مقدار ۰ تا ۱۸,۴۴۶,۷۴۴,۰۷۳,۷۰۹,۵۵۱,۶۱۵ را در ۶۴ بیت ذخیره می‌کند و معادل System.UInt64 است.
نوع nint: اندازه‌ای وابسته به پلتفرم دارد (در سیستم‌های ۳۲ بیتی، ۳۲ بیت و در سیستم‌های ۶۴ بیتی، ۶۴ بیت است) و معادل System.IntPtr می‌باشد.
نوع nuint: مانند nint، اندازه‌ای وابسته به پلتفرم دارد و معادل System.UIntPtr است.
این انواع داده‌ای برای ذخیره اعداد صحیح استفاده می‌شوند و بسته به نیاز حافظه و محدوده مقادیر مورد نظر انتخاب می‌شوند

مقادیر پیش‌فرض: مقدار پیش‌فرض برای تمامی انواع عددی صحیح، صفر (0) است.

حداقل و حداکثر مقادیر: هر نوع داده‌ای دارای ویژگی‌های MinValue و MaxValue است که به ترتیب حداقل و حداکثر مقدار قابل‌پذیرش را نشان می‌دهند.

انواع با اندازه وابسته به پلتفرم: انواع nint و nuint به اندازه پلتفرم وابسته هستند؛ یعنی در فرآیندهای ۳۲ بیتی به‌صورت ۳۲ بیتی و در فرآیندهای ۶۴ بیتی به‌صورت ۶۴ بیتی عمل می‌کنند.

انواع بدون مرز: برای نمایش اعداد صحیح با اندازه نامحدود، می‌توان از ساختار System.Numerics.BigInteger استفاده کرد.

🔗 مطلب کامل را در این لینک می‌توانید مطالعه کنید.

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

کانال تلگرام:
@SoftwarePhilosophy

______
1👍153
ساخت برنامه‌‌های Mixed Reality و 3D با Unity

ساختن برنامه‌هایی که با دنیای واقعی مرتبط هستند یکی از قسمت‌های هیجان‌انگیز برنامه‌نویسی است.
یکی از معروف‌ترین ابزارها برای ساخت چین برنامه‌‌هایی Unity هست.
کاربرد اصلی Unity ساخت بازی است. بازی‌هایی که هم در کامپیوتر، و هم در محیط‌هایی مثل VR/AR Headsets قابل اجرا هستند.
با اینکه کاربرد اصلی Unity ساخت بازی است، ولی از آن برای ساخت برنامه‌های Enterprise ی که نیاز به محیط‌های 3D و Mixed Reality هم استفاده می‌شود. مثلا نمایش وضعیت دستگاه‌های یک کارخانه، یا وضعیت هواپیماها در یک فرودگاه.

این ویدئو، در مورد ساخت چین برنامه‌هایی صحبت می‌کند و توضیح می‌دهد که چگونه می‌توان با Unity برای این نوع مسائل برنامه‌بنویسی کرد.

آخرای این ویدئو کوه کلیمانجارو رو توی اتاق خونش رندر می‌کنه!
و بعدش نشون می‌ده که چطور مغز انسان رو تو اتاق و جلوی چشمش لود می‌کنه و این نوع برنامه‌ها چه کمک‌های بزرگی به علم پزشکی می‌کنن.

🔗 ویدئو را می‌توانید اینجا ببینید.

#مهران_داودی (لینکدین - بلاگ)

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

کانال تلگرام:
@SoftwarePhilosophy

______
1👍72🔥1
می‌‌دونستین راز ساختن محصولات #ai روی #dotnet در مفاهیم IChatClient و Microsoft.Extentions.AI است؟

فردا تو این لایو لیندکین قراره در مورد اینا صحبت کنم.
می‌بینمتون.
#cs_internship


#مهران_داودی (لینکدین - بلاگ)

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

کانال تلگرام:
@SoftwarePhilosophy

______
112👍5🔥2😁1
متدها در سی‌شارپ

#csharp_for_beginners

متدها در زبان برنامه‌نویسی C# بلوک‌هایی از کد هستند که مجموعه‌ای از دستورات را در بر می‌گیرند. اجرای این دستورات با فراخوانی متد و ارائه آرگومان‌های مورد نیاز صورت می‌گیرد. در C#، هر دستور اجرایی در زمینه یک متد انجام می‌شود. به عنوان مثال، متد Main نقطه ورود هر برنامه C# است که توسط محیط اجرای مشترک زبان (CLR) هنگام شروع برنامه فراخوانی می‌شود.

امضای متدها
متدها در یک کلاس، ساختار یا اینترفیس با مشخص کردن سطح دسترسی (مانند public یا private)، اصلاح‌کننده‌های اختیاری (مانند abstract یا sealed)، نوع بازگشتی، نام متد و هر پارامتر مورد نیاز تعریف می‌شوند. این اجزا با هم امضای متد را تشکیل می‌دهند. توجه داشته باشید که نوع بازگشتی بخشی از امضای متد برای اهداف سربارگذاری متد محسوب نمی‌شود، اما در تعیین سازگاری بین یک نماینده (delegate) و متدی که به
آن اشاره می‌کند، مهم است.

فراخوانی متدها
برای فراخوانی یک متد، پس از نام شیء، یک نقطه، نام متد و پرانتزها را اضافه می‌کنیم. آرگومان‌ها در داخل پرانتزها قرار می‌گیرند و با کاما از هم جدا می‌شوند. به عنوان مثال، اگر کلاسی به نام Motorcycle با متدهایی مانند StartEngine، AddGas و Drive داشته باشیم، می‌توانیم آن‌ها را به صورت زیر فراخوانی کنیمTestMotorcycle moto = new TestMotorcycle();

moto.StartEngine();
moto.AddGas(15);
moto.Drive(5, 20);
double speed = moto.GetTopSpeed();
Console.WriteLine("My top speed is {0}", speed );


پارامترها و آرگومان‌ها
تعریف متد مشخص می‌کند که چه پارامترهایی با چه نام‌ها و نوع‌هایی مورد نیاز است. هنگام فراخوانی متد، مقادیر مشخصی به نام آرگومان برای هر پارامتر ارائه می‌شود. این آرگومان‌ها باید با نوع پارامتر سازگار باشند، اما نام آرگومان در کد فراخوانی لزوماً نباید با نام پارامتر در تعریف متد یکسان باشد.

🔗 مطلب کامل را در این لینک می‌توانید مطالعه کنید.

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

کانال تلگرام:
@SoftwarePhilosophy

______
👍9👏1
نگاهی‌ کمی فلسفی‌تر به MCP

مفهوم MCP بحث داغ این روزهای دنیای هوش مصنوعی است.
با نگاهی خاص می‌توان گفت که MCP می‌تواند همان تاثیری را در دنیای هوش‌مصنوعی بگذارد که REST بر دنیای وب گذاشت.

در این مقاله جالب که به مقایسه این دو تکنولوژی و کارکردهایشان پرداخته، مفهوم Discovery را هم بررسی کرده که در حال حاضر بخشی از استاندارد REST نیست ولی MCP این فیچر را دارا است.

به نظرم من نقطه نظر نویسنده این مقاله در این مورد خیلی جالب است. قبلا هم در دنیای وب تکنولوژی‌ها و پروتکل‌هایی وجود داشت که Discovery هم داشتند، ولی از آنجایی که معمولا هیچ برنامه‌نویسی از آن ویژگی‌ها استفاده نمی‌کرد زیاد مورد استقبال قرار نگرفت.
ولی در دنیای هوش‌مصنوعی، ایجنت‌های هوش‌مصنوعی استفاده بسیار زیادی از این ویژگی می‌کنند.

🔗 پیشنهاد می‌کنم حتما این مقاله جذاب رو بخونین.

#مهران_داودی (لینکدین - بلاگ)

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

کانال تلگرام:
@SoftwarePhilosophy

______
5👍181🔥1
مقدمه‌ای بر کلاس‌ها در سی شارپ

#csharp_for_beginners

در زبان برنامه‌نویسی C#، کلاس‌ها (Classes) به عنوان یکی از اصلی‌ترین ساختارهای برنامه‌نویسی شیءگرا عمل می‌کنند. کلاس‌ها در C# قالبی برای ایجاد اشیاء (Objects) هستند و شامل داده‌ها (فیلدها و خصوصیات) و رفتارها (متدها) می‌شوند.

در این مقاله، مفهوم کلاس در C#، نحوه تعریف آن، انواع اعضای کلاس، اصول شیءگرایی مرتبط و مفاهیم پیشرفته بررسی خواهند شد.

۱. تعریف کلاس در C#

در C#، کلاس با استفاده از کلمه کلیدی class تعریف می‌شود. یک کلاس می‌تواند شامل متغیرها، خصوصیات، متدها و رویدادها باشد. در ادامه یک نمونه ساده از کلاس آورده شده است:

public class Car
{
public string Brand;
public string Model;
public int Year;

public void DisplayInfo()
{
Console.WriteLine($"Brand: {Brand}, Model: {Model}, Year: {Year}");
}
}


۲. ایجاد شیء از کلاس
برای استفاده از کلاس، باید یک نمونه (Object) از آن ایجاد کنیم:

class Program
{
static void Main()
{
Car myCar = new Car();
myCar.Brand = "Toyota";
myCar.Model = "Corolla";
myCar.Year = 2022;

myCar.DisplayInfo();
}
}


در این کد:
• یک شیء myCar از کلاس Car ساخته شده است.
• مقادیر فیلدهای آن مقداردهی شده‌اند.
• متد DisplayInfo برای نمایش اطلاعات خودرو فراخوانی شده است.

۳. فیلدها، خصوصیات و متدها

فیلدها (Fields)
فیلدها متغیرهایی هستند که داده‌های کلاس را نگهداری می‌کنند. در مثال قبل، Brand، Model و Year فیلد بودند.

خصوصیات (Properties)
خصوصیات راهی استاندارد برای دسترسی ایمن به داده‌های کلاس هستند. به جای استفاده مستقیم از فیلدها، می‌توان از property استفاده کرد:

public class Car
{
private string brand;

public string Brand
{
get { return brand; }
set { brand = value; }
}
}


استفاده از property باعث افزایش امنیت و کنترل بیشتر بر روی داده‌ها می‌شود.

متدها (Methods)
متدها وظایف خاصی را در کلاس انجام می‌دهند. در مثال‌های قبل، DisplayInfo() یک متد بود که اطلاعات را چاپ می‌کرد.

🔗 مطلب کامل را در این لینک می‌توانید مطالعه کنید.

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

کانال تلگرام:
@SoftwarePhilosophy

______
👍63
پشتیبانی از عملگر LeftJoin در NET 10.

در نسخه جدید NET 10.، پشتیبانی بومی از عملگر LeftJoin در LINQ به این فریم‌ورک اضافه شده است. این تغییر مهم در زمان نوشتن کوئری‌ها در Entity Framework Core (EF Core) به شما کمک می‌کند تا کد ساده‌تری بنویسید و از پیچیدگی‌های قبلی که نیازمند استفاده از ترکیب چندین متد مانند SelectMany و GroupJoin بود، رهایی یابید.

قبل از NET 10.:

در نسخه‌های قبلی EF Core، برای استفاده از عملیات LeftJoin نیاز به ترکیب چندین متد پیچیده بود. در این روش، ابتدا با استفاده از GroupJoin داده‌ها را به هم پیوند می‌دادیم، سپس از SelectMany و DefaultIfEmpty برای شبیه‌سازی رفتار LeftJoin استفاده می‌کردیم.

مثال کد قبل از NET 10.:

var query = students
.GroupJoin(
departments,
student => student.DepartmentID,
department => department.ID,
(student, departmentList) => new { student, subgroup = departmentList })
.SelectMany(
joinedSet => joinedSet.subgroup.DefaultIfEmpty(),
(student, department) => new
{
student.student.FirstName,
student.student.LastName,
Department = department.Name ?? "[NONE]"
});


پس از اضافه شدن LeftJoin در NET 10.:

با معرفی متد LeftJoin در NET 10.، نوشتن کوئری‌ها بسیار ساده‌تر و خواناتر شده است. دیگر نیازی به استفاده از ترکیب چندین متد نخواهید داشت، بلکه می‌توانید به راحتی از این متد جدید استفاده کنید.

مثال کد پس از NET 10.:

var query = context.Students
.LeftJoin(
context.Departments,
student => student.DepartmentID,
department => department.ID,
(student, department) => new
{
student.FirstName,
student.LastName,
Department = department.Name ?? "[NONE]"
});


مزایای استفاده از LeftJoin در NET 10.:

- سادگی و خوانایی بیشتر: به جای استفاده از ترکیب پیچیده‌ی متدها، می‌توانید با یک متد ساده به راحتی LeftJoin را انجام دهید.
- عملکرد بهتر: به دلیل بهینه‌سازی‌های داخلی در EF Core، عملیات LeftJoin به شکل بهینه‌تری در پایگاه داده اجرا می‌شود.
- کاهش پیچیدگی کد: به جای کدهای طولانی و پیچیده، می‌توانید کدهای ساده‌تری بنویسید که فهم آن‌ها برای سایر برنامه‌نویسان راحت‌تر است.

🔗 برای مطالعه بیشتر می‌توانید به این لینک مراجعه نمایید.

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#هوتن_همتی (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

________
👍206
🔶 امشب ساعت ۸:۳۰ تو این لایو یوتیوب قراره در مورد مفاهیم LLM و روش‌‌های برنامه‌نویسی باهاشون در دات‌نت صحبت کنیم، و در نهایت هم نحوه ساختن و استفاده کردن از MCP ها رو بررسی کنیم.

#dotnet #csharp #openai #llm #azure #mcp

#cs_internship



https://www.youtube.com/live/c75VZWa_wbU

کانال تلگرام:
@SoftwarePhilosophy

____
1👍129🔥3
نوع داده char در زبان سی‌شارپ

#csharp_for_beginners

در زبان برنامه‌نویسی #C، نوع داده‌ای char نمایانگر یک واحد کد UTF-16 یونیکد است که معمولاً به عنوان یک کاراکتر UTF-16 شناخته می‌شود. کلمه کلیدی char در #C معادل ساختار System.Char در .NET است.

ویژگی‌های کلیدی نوع char:
محدوده مقادیر: از U+0000 تا U+FFFF
اندازه: 16 بیت
مقدار پیش‌فرض: \0 یا U+0000

عملگرهای پشتیبانی‌شده برای char:
مقایسه‌ای: مانند == و !=
افزایشی و کاهشی: مانند ++ و --
عملگرهای حسابی و بیتی: این عملگرها بر روی کد پوینت‌های مربوطه عمل کرده و نتیجه را به صورت مقدار int ارائه می‌دهند.

تبدیل نوع char:
تبدیل ضمنی به انواع عددی: char به طور ضمنی قابل تبدیل به انواع عددی صحیح مانند ushort، int، uint، long، ulong، nint و nuint است. همچنین، به انواع عددی اعشاری مانند float، double و decimal نیز قابل تبدیل است.
تبدیل صریح از انواع دیگر به char: تبدیل از سایر انواع به char به
صورت صریح انجام می‌شود.

مثال‌هایی از مقداردهی به char:

var chars = new[]
{
'j',
'\u006A', // استفاده از توالی فرار یونیکد
'\x006A', // استفاده از توالی فرار هگزادسیمال
(char)106, // تبدیل عدد صحیح به char
};
Console.WriteLine(string.Join(" ", chars)); // خروجی: j j j j



🔗 مطلب کامل را در این لینک می‌توانید مطالعه کنید.

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

کانال تلگرام:
@SoftwarePhilosophy

______
👍82🔥1
قابلیت‌های جدید Data Annotations در دات نت ۸

در نسخه جدید NET 8.، ویژگی‌های Data Annotations پیشرفت‌های قابل توجهی داشته‌اند. این ویژگی‌ها، کدنویسی معتبرسازی داده‌ها را بسیار ساده‌تر و تمیزتر کرده است. در ادامه به صورت گام به گام این ویژگی‌های جدید را بررسی می‌کنیم:

۱. ویژگی Length
این Annotation برای مشخص کردن حداقل و حداکثر طول رشته استفاده می‌شود.

[Length(2, 30)]
public string Name { get; set; }

[Length(2, 255)]
public string Denoscription { get; set; }


در مثال بالا:
- مقدار Name باید حداقل ۲ و حداکثر ۳۰ کاراکتر داشته باشد.
- مقدار Denoscription باید حداقل ۲ و حداکثر ۲۵۵ کاراکتر داشته باشد.

---

۲. ویژگی Range با پارامترهای Exclusive
ویژگی Range حالا قابلیت مشخص کردن مقادیر انحصاری را نیز دارد.

[Range(1, 1000, MinimumIsExclusive = true, MaximumIsExclusive = false)]
public decimal Price { get; set; }

در این مثال:
- مقدار Price باید بزرگتر از ۱ (به دلیل MinimumIsExclusive = true) و کوچکتر یا مساوی ۱۰۰۰ (به دلیل MaximumIsExclusive = false) باشد.

---

۳. ویژگی AllowedValues
این Annotation مقادیر مجاز برای یک خصوصیت را مشخص می‌کند.

[AllowedValues("S", "M", "L", "XL", "XXL")]
public string Size { get; set; }

در اینجا، تنها مقادیر S, M, L, XL, XXL برای Size قابل قبول هستند.

---

۴. ویژگی DeniedValues
برای مشخص کردن مقادیری که غیرمجاز هستند استفاده می‌شود.

[DeniedValues("Electronics", "Computers")]
public string Category { get; set; }

در این مثال، مقادیر Electronics و Computers برای Category ممنوع هستند.

---

۵. ویژگی Base64String
برای معتبرسازی اینکه مقدار یک رشته به صورت Base64 باشد استفاده می‌شود.

[Base64String]
public string Image { get; set; }

این اطمینان را ایجاد می‌کند که Image حاوی یک رشته معتبر Base64 است.

🔗 برای مطالعه بیشتر می‌توانید به این لینک مراجعه نمایید.

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#هوتن_همتی (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

__________
1👍203🔥2