TG Telegram Group Link
Channel: Software Philosophy
Back to Bottom
Forwarded from Software Philosophy
و بالاخره... اینم از سخنرانی تدکس من: «پروژه یک من جدید!».
تو تدکس در مورد نرون‌های آینه‌ای صحبت کردم و اینکه چطور این قسمت عجیب از مغز می‌تونه کمک کنه کارهای عجیبی رو انجام بدیم. کارهایی که به نظر خیلی نشدنی میان!

یکی از چیزهایی که انتقالش خیلی سخته، انتقال درده! خیلی سخته یه یکی توضیح بدی چطور درد می‌کنه! یه مفهوم بی‌ربط دیگه هم هست که به نظر همینقدر سخته: انتقال مهارت‌های کار تیمی! تو این TEDx Talk توضیح دادم که چطور یه قسمت از مغزمون به نام Mirror Neurons (که خیلی هم غافلیم ازش) می‌تونه کمک کنه این کارهای خیلی سخت رو، به حتی بدون صحبت کردن انجام بدیم!

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

لینک ویدئوی کامل در صفحه رسمی تدکس در یوتیوب: https://www.youtube.com/watch?v=DfTuWdPV6JU

در صورت باز نشدن، این ویدئو در آپارات هم آپلود شده.
انتقال Git Stashes بین دستگاه‌ها

ابزار Git stashes ابزاری قدرتمند برای ذخیره موقت تغییرات است. اما اگر نیاز دارید این stashes را به دستگاه دیگری منتقل کنید، چطور؟ در این پست، نحوه انتقال Git stashes را باهم برسی می‌کنیم تا هیچ کدام از تغییرات در حال انجام را از دست ندهید.

پیش‌نیازها :
ابتدا Git را طوری تنظیم کنیم که شامل فایل‌های غیر ردیابی (Untracked) شده را هم در stash‌هایمان نیز باشد:

git config stash.showIncludeUntracked true


این تنظیمات تضمین می‌کند که وقتی یک stash می‌سازیم، تمام تغییرات از جمله فایل‌های غیر ردیابی شده شامل شوند.

گام 1: ایجاد یک Stash
روی دستگاه فعلی خود، تغییرات را stash کنید:

git stash push -u


پارامتر -u فایل‌های غیر ردیابی شده را هم در stash شامل می‌شود.

گام 2: ایجاد یک فایل Patch
حالا یک فایل patch از stash ایجاد کنید:

git stash show "stash@{0}" -p > changes.patch


این فرمان یک فایل با نام changes.patch ایجاد می‌کند که شامل تمام تغییرات در آخرین stash شماست.

گام 3: انتقال فایل Patch
فایل changes.patch را به دستگاه دیگر خود منتقل کنید.

گام 4: اعمال Patch در دستگاه جدید
روی دستگاه جدید، به مخزن Git خود بروید و patch را اعمال کنید:

git apply changes.patch


این فرمان تغییرات را از فایل patch به پوشه کاری شما اعمال می‌کند.

نکته : می‌توانید برای stash‌های مختلف، فایل‌های patch مجزا ایجاد کنید (مثلاً stash@{1}, stash@{2}).

با دنبال کردن این مراحل، می‌توانید بدون توجه به جایی که در حال کار هستید به راحتی Git stashes خود را بین دستگاه‌ها منتقل کنید و پیوستگی جریان کاری خود را حفظ کنید.

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

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

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

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

______
Forwarded from Dubai .NET Developers
.NET Conf Watch Party!
Put a comment if you want to watch the conference online, but together!
It will be on Teams :)
استفاده از Span در سی‌شارپ

فرض کنید که یک رشته متن دارید و می‌خواهید تاریخ را از آن جدا کنید. اگر از متدهای Split یا Substring استفاده می کنید، برای رشته‌های جدید ایجاد شده، هربار حافظه اختصاص می‌یابد. این فرآیند می‌تواند کند باشد و میزان زیادی از حافظه را به خود اختصاص دهد، به خصوص زمانی که با مجموعه داده‌های بزرگ سروکار داریم.  

از طرف دیگر، Span مستقیماً روی حافظه اصلی بدون ایجاد و تخصیص حافظه جدید عمل می کند. این کار باعث می‌شود تا به طور قابل توجهی انجام کار سریعتر و کارآمدتر شود.
 
در نظر داشته باشید که Span از نظر نوع و حافظه ایمن است. بدون ایجاد نسخه‌های اضافی، مستقیماً روی حافظه کار می‌کند و می‌تواند با آرایه‌ها، رشته‌ها، حافظه، پشته و غیره کار کند.

در مواقع Span ها مانند یک view بروی حافظه یا مکان مورد نظر شما می‌باشند و در نتیجه بسیار سریع هستند.

🔗 برای مشاهده فیلم کوتاه در یک دقیقه ، اینجا کلیک کنید.

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

#محمدرضا_پازوکی (لینکدین)

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

______
ورک‌شاپ TDD OpenAI with SemanticKernel and skUnit
ارائه: مهران داودی
زبان ورک‌شاپ: انگلیسی

این چهارشنبه ساعت ۵ تا ۶ عصر، ورک‌شاپ برنامه‌نویسی هوش‌مصنوعی (OpenAI و LLM) در #dotnet با استفاده از فریم‌ورک‌های #SemanticKernel و #skUnit برگزار می‌شه.

تو این ورک‌شاپ یک kernel هوش مصنوعی از صفر ساخته ساخته می‌شه و همزمان نحوه تست کردنش با استفاده از skUnit آموزش داده می‌شه.

🔥 این روزها اگر برنامه‌نویس دات‌نت هستید، خیلی خوش‌شانس هستید! چون نوشتن برنامه‌های با کیفیت هوش‌مصنوعی فقط یک قدم با شما فاصله داره.


🙂 لینک ورک‌شاپ:
https://www.linkedin.com/events/7246447233418547201/comments/
Please open Telegram to view this post
VIEW IN TELEGRAM
چگونه با Scrutor و Autofac تزریق وابستگی را در .NET به سطح بعدی ببریم؟

در توسعه پروژه‌های بزرگ .NET، مدیریت تزریق وابستگی (Dependency Injection) به یکی از مهم‌ترین بخش‌های معماری نرم‌افزار تبدیل می‌شود. هنگامی که تعداد سرویس‌ها و ریپازیتوری‌ها افزایش پیدا می‌کند، ثبت دستی هر یک از آن‌ها می‌تواند نه تنها زمان‌بر، بلکه منجر به بروز اشتباهات و پیچیدگی‌های غیرضروری شود. اینجاست که ابزارهای قدرتمندی مثل Scrutor و Autofac به کمک ما می‌آیند.

ابزار Scrutor یک کتابخانه سبک برای DI پیش‌فرض .NET است که امکان اسکن خودکار اسمبلی‌ها و ثبت سرویس‌ها را با چند خط کد فراهم می‌کند. شما می‌توانید کلاس‌ها و اینترفیس‌ها را به سادگی بر اساس namespace یا الگوهای دیگر شناسایی و به عنوان وابستگی‌ها در پروژه تزریق کنید. این روش نه تنها کد شما را تمیزتر و منظم‌تر می‌کند، بلکه از بروز مشکلات ناشی از ثبت دستی جلوگیری می‌کند.

از طرف دیگر، Autofac یک کانتینر IoC بسیار قدرتمند است که کنترل و انعطاف بیشتری در تزریق وابستگی‌ها به شما می‌دهد. با استفاده از Autofac، شما می‌توانید وابستگی‌ها را به صورت ماژولار مدیریت کنید، لایف‌تایم دقیق هر سرویس را تنظیم کرده و حتی از امکانات پیشرفته‌ای مانند AOP (Aspect-Oriented Programming) بهره‌مند شوید. با این ابزارها، شما نه تنها کارهای تکراری را حذف می‌کنید، بلکه معماری پروژه خود را حرفه‌ای‌تر و مقیاس‌پذیرتر می‌سازید.

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

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

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

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

______
شمشیر دو لبه IEnumerable و yield return در C# : راهکارهایی برای بهینه‌سازی و جلوگیری از افت عملکرد

در زبان C#، وقتی می‌خواهیم با مجموعه‌ای از داده‌ها یا توالی‌ها کار کنیم، معمولاً از ساختارهای داده‌ای مثل لیست‌ها یا آرایه‌ها استفاده می‌کنیم. اما گاهی نیاز داریم داده‌ها را به صورت تنبل (Lazy) پردازش کنیم، یعنی فقط زمانی داده‌ها تولید شوند که واقعاً به آن‌ها نیاز داریم. اینجاست که IEnumerable و yield return وارد میدان می‌شوند و می‌توانند کار ما را بسیار ساده‌تر و بهینه‌تر کنند.

ابزار IEnumerable این امکان را به ما می‌دهد که به طور مؤثر بر روی مجموعه‌ای از داده‌ها پیمایش کنیم، بدون اینکه نیاز باشد تمام داده‌ها را یکجا در حافظه بارگذاری کنیم. از طرف دیگر، yield return به ما اجازه می‌دهد که یک توالی از داده‌ها را مرحله به مرحله و در طول زمان تولید کنیم، به جای اینکه همه‌چیز یکجا آماده شود.

اما مشکل از آنجا شروع می‌شود که استفاده نادرست از این قابلیت‌ها می‌تواند منجر به کاهش کارایی برنامه شود. مثلاً فرض کنید در حال استفاده از yield return هستید و هر بار که از داده‌های تولید شده استفاده می‌کنید، محاسبات سنگینی برای تولید آن داده‌ها انجام می‌شود. اگر این محاسبات هر بار تکرار شوند، زمان اجرای برنامه افزایش می‌یابد و منابع سیستم بی‌مورد مصرف می‌شوند. یا در مواقعی که منابعی مثل فایل‌ها یا دیتابیس را در دسترس داریم، استفاده نادرست از IEnumerable و اجرای به تعویق افتاده (Deferred Execution) ممکن است باعث خطاهایی در مدیریت منابع شود.

در این پست، ما دقیقاً به این مشکلات می‌پردازیم و نشان می‌دهیم که چطور می‌توانیم با آگاهی و استفاده صحیح از IEnumerable و yield return هم از مزایای آنها بهره‌مند شویم و هم از بروز مشکلات و افت عملکرد جلوگیری کنیم. همچنین چند مثال عملی از جمله کار با دیتابیس، فایل‌ها، و لیست‌های داده ارائه می‌دهیم که به شما کمک می‌کند این ابزارها را به درستی به کار بگیرید.

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

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

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

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

_______
Software Philosophy
ورک‌شاپ TDD OpenAI with SemanticKernel and skUnit ارائه: مهران داودی زبان ورک‌شاپ: انگلیسی این چهارشنبه ساعت ۵ تا ۶ عصر، ورک‌شاپ برنامه‌نویسی هوش‌مصنوعی (OpenAI و LLM) در #dotnet با استفاده از فریم‌ورک‌های #SemanticKernel و #skUnit برگزار می‌شه. تو این ورک‌شاپ…
ورک شاپ TDD OpenAI with Semantic Kernel and skUnit

برنامه‌نویسی چت‌بات‌های هوش‌مصنوعی بر پایه LLM در دات‌نت هیچ وقت انقدر شیرین و لذت‌بخش نبوده!
در این ورک‌شاپ مهران داودی یک چت‌بات رو از صفر می‌سازه و نشون می‌ده چطور می‌شه برای این copilot ها تست‌های اتوماتیک نوشت که بتونه از طریق خود LLM تست‌های معنایی انجام بده (Semantic Assert).

این ورک‌شاپ قبلا به صورت لایو در لینکدین برگزار شده بود و الان ویدئوش در یوتیوب آپلود شده.

https://www.youtube.com/watch?v=JVyLLD5bgoE&t=9s
برسی متدهای جدید LINQ در دات نت ۹

دات‌نت ۹، که قرار است در نوامبر ۲۰۲۴ منتشر شود، پیش‌نمایش جدیدی ارائه کرده است که چندین متد LINQ جدید شامل CountBy، AggregateBy و Index را معرفی می‌کند:

متد CountBy: این متد امکان شمارش سریع عناصر در یک مجموعه بر اساس تابع انتخاب کلید را فراهم می‌کند و دیکشنری‌ای برمی‌گرداند که کلیدها مقادیر منحصربه‌فرد هستند و مقادیر، تعداد هر کلید را نشان می‌دهند.

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

متد Index: این متد یک مجموعه ایندکس شده ایجاد می‌کند، به طوری که هر عنصر با ایندکس خود در مجموعه اصلی همراه است.

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

در ادامه، مثال‌هایی از هر یک از متدهای جدید LINQ همراه با خروجی آن‌ها ارائه شده است:

۱. مثال متد CountBy

فرض کنید لیستی از افراد داریم که شامل نام و سن آن‌هاست و می‌خواهیم تعداد افراد را بر اساس سن آن‌ها شمارش کنیم.
var people = new List<Person>
{
new Person { Name = "Ali", Age = 25 },
new Person { Name = "Sara", Age = 30 },
new Person { Name = "Reza", Age = 25 },
new Person { Name = "Maryam", Age = 30 },
new Person { Name = "Nima", Age = 20 }
};

var ageCounts = people.CountBy(p => p.Age);
foreach (var ageCount in ageCounts)
{
Console.WriteLine($"Age: {ageCount.Key}, Count: {ageCount.Value}");
}

خروجی:
Age: 25, Count: 2
Age: 30, Count: 2
Age: 20, Count: 1


۲. مثال متد AggregateBy

در این مثال، ما قصد داریم مجموع سن‌ها را بر اساس گروه‌های سنی (به عنوان مثال زیر ۳۰ و بالای ۳۰) تجمیع کنیم.
var people = new List<Person>
{
new Person { Name = "Ali", Age = 25 },
new Person { Name = "Sara", Age = 30 },
new Person { Name = "Reza", Age = 25 },
new Person { Name = "Maryam", Age = 30 },
new Person { Name = "Nima", Age = 20 }
};

var ageSums = people.AggregateBy(
p => p.Age < 30 ? "Under 30" : "30 and Above",
(key, group) => group.Sum(p => p.Age)
);

foreach (var ageSum in ageSums)
{
Console.WriteLine($"Group: {ageSum.Key}, Sum of Ages: {ageSum.Value}");
}

خروجی:
Group: Under 30, Sum of Ages: 70
Group: 30 and Above, Sum of Ages: 60


۳. مثال متد Index

در این مثال، لیستی از نام‌ها داریم و می‌خواهیم هر نام را همراه با ایندکس آن در لیست نمایش دهیم.
var names = new List<string> { "Ali", "Sara", "Reza", "Maryam", "Nima" };

var indexedNames = names.Index();
foreach (var item in indexedNames)
{
Console.WriteLine($"Index: {item.Index}, Name: {item.Value}");
}

خروجی:
Index: 0, Name: Ali
Index: 1, Name: Sara
Index: 2, Name: Reza
Index: 3, Name: Maryam
Index: 4, Name: Nima


‼️برای دیدن نمونه مثال و مطالعه بیشتر به دو لینک زیر مراجعه کنید:

🔗لینک اول

🔗لینک دوم

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

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

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

_______
مدیریت هوشمند 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

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

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

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

#openai #gpt #dotnet #azure

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

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

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

__________
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

__________
بررسی و تفاوت چند نوع عددی در سی شارپ: 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

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

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

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

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

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

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

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

______
حلقه‌ها در سی‌شارپ

#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

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

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

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

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

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

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

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

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


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

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

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

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

______
آشنایی با Outbox Pattern و اهمیت آن در سیستم‌های توزیع‌شده

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

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

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

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

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

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

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

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

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

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

___________
درک انواع داده‌ها در سی‌شارپ

#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

______
HTML Embed Code:
2025/07/04 05:03:25
Back to Top