3509
چکیدهای از مفاهیم به روز مهندسی نرم افزار برای مهندسین نرمافزار. معماری نوین نرمافزار، تکنولوژیهای برنامه نویسی جدید
ویکی هوشمند برای کدهای گیتهاب - DeepWiki
اگر بخواهید خیلی سریع داکیومنتی کامل و جامع از هر ریپازیتوری گیت هابی داشته باشید میتوانید از DeepWiki استفاده کنید.
- فقط کافی است در URL ریپازیتوری گیت هاب به جای github.com بنویسید deepwiki.com (تا همین جا یک نمونه را امتحان کنید و ببینید چه اتفاقی رخ میدهد!)
- مستندی کامل شامل خلاصه پروژه، تکنولوژیهای استفادهشده، ساختار فایلها و نمودارهای معماری را خودکار دریافت میکنید.
- هر سوالی داشته باشید یا اگر به طور مثال به باگی خوردید میتوانید همانجا بپرسید و جواب بگیرید!
🔗 توضیحات تکمیلی را اینجا بخوانید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
رابط (Interface) در سیشارپ
#csharp_for_beginners
تعریف و کاربرد
کلمه کلیدی interface برای تعریف یک قرارداد به کار میرود. این قرارداد مجموعهای از امضاهای اعضا را مشخص میکند که میتواند شامل متدها، ویژگیها، ایندکسرها، رویدادها و غیره باشد.
یک interface میتواند اعضایی بدون پیادهسازی یا اعضایی با پیادهسازی پیشفرض داشته باشد. همچنین امکان تعریف اعضای static نیز وجود دارد.
از نسخه سیشارپ ۱۱ به بعد interface میتواند اعضای static abstract یا static virtual داشته باشد. این موضوع زمانی مفید است که بخواهیم در یک نوع عمومی (generic) رفتار مشخصی برای تمام انواع پیادهساز اجباری کنیم. به عنوان مثال در کتابخانه داتنت انواع عددی مختلف واسط INumber را پیاده میکنند تا عملیات ریاضی مشترک میان آنها تضمین شود.
قوانین دسترسی و سطح تعریف
یک interface سطح بالا (در فضای نام) میتواند internal یا public باشد. پیشفرض internal است.
اگر interface به صورت تو در تو داخل یک نوع دیگر تعریف شود میتوان از هر نوع اصلاحکننده دسترسی استفاده کرد.
اعضای interface که بدون پیادهسازی هستند اصلاحکننده دسترسی ندارند. اما اگر برای آن عضو پیادهسازی پیشفرض بنویسیم میتوان دسترسی آن را مشخص کرد.
انواع اعضا در interface
یک interface میتواند شامل موارد زیر باشد:
-متدها
-ویژگیها
-ایندکسرها
-رویدادها
-ثابتها
-عملگرها
-انواع تو در تو
-سازنده ایستا
پیادهسازی
یک interface میتواند از یک یا چند interface دیگر مشتق شود. هر نوعی که interface مشتق را پیاده کند باید تمام اعضای interfaceهای پایه و مشتق را پیادهسازی کند.
کلاس یا ساختار میتواند اعضای interface را به صورت ضمنی یا به صورت صریح (explicit implementation) پیاده کند.
اگر یک عضو interface پیادهسازی پیشفرض داشته باشد معمولاً تنها از طریق نمونهای از نوع interface قابل دسترسی است نه مستقیماً از طریق کلاس پیادهساز.
مثالها
تعریف یک قرارداد ساده
interface ISampleInterface
{
void SampleMethod();
}
class ImplementationClass : ISampleInterface
{
void ISampleInterface.SampleMethod()
{
// پیادهسازی متد
}
}
interface IPoint
{
int X { get; set; }
int Y { get; set; }
double Distance { get; }
}
class Point : IPoint
{
public int X { get; set; }
public int Y { get; set; }
public double Distance => Math.Sqrt(X * X + Y * Y);
}
اجرای کدهای پایتون در داتنت با جادوی CSnakes!
اگر امکان اجرای کدهای پایتون در همان پروسس داتنت وجود داشته باشد، یعنی تمام ۱.۵ میلیون مدل هوش مصنوعی که تا به حال روی HuggingFace قرار گرفته را میتوان با همان پرفورمنس و بدون نیاز به کشیدن لایههای REST در دسترس داشت.
پروژه CSnakes در واقع یک Source Generator و Runtime برای سیشارپ است که با بهرهگیری از Python C-API امکان تولید خودکار کلاسهای داتنت از اسکریپتهای پایتون رو فراهم میکنه. شما فقط کافیه پکیج CSnakes.Runtime رو از NuGet نصب کنید و اسکریپتهای پایتونتون رو به پروژه اضافه کنید تا بدون کوچکترین overhead یا لایه اضافی، هر تابع پایتون بهصورت یک متد native سیشارپ قابل فراخوانی باشد. این رویکرد، سرعت و مقیاسپذیری Enterprise داتنت را با انعطافپذیری و اکوسیستم غنی پایتون پیوند میزند و توسعه اپلیکیشنهای هوشمصنوعی و Data Science را به سطحی جدید میرساند.
کلکلهایی هم که این دونفر سر زبانهای سیشارپ و پایتون میکنن خیلی با مزهس!
🔗 در این ویدئو Scott Hanselman و Anthony Shaw پروژه CSnakes را معرفی میکنند. پیشنهاد میکنم حتما این ویدئوی جذاب را ببینید.
#csharp #python #machine_learning
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
مدل Claude Sonnet 4.5، قویترین مدل کدنویسی دنیا، حتی جلوتر از GPT-5!
شرکت Anthropic با معرفی Claude Sonnet 4.5 نه تنها در کدنویسی بیرقیب شده است، بلکه در منطق، ریاضی و امنیت هم جهش بزرگی داشته.
چرا Claude 4.5 خاص است؟
- صدرنشین بنچمارک OSWorld با امتیاز 61.4٪ (GPT-5 پایینتره)
- عملکرد 82٪ در SWE-bench Verified برای حل مشکلات واقعی برنامهنویسی
- تمرکز پایدار در وظایف طولانی (بیش از ۳۰ ساعت!)
- اجرای مستقیم کد، ساخت فایلها، و تعامل با ابزارها در گفتگو
- وجود SDK اختصاصی برای ساخت ایجنتهای هوشمند با حافظه بلندمدت و زیرایجنتها
- افزونههای VS Code و Chrome برای توسعهدهندهها
امنیت و همراستایی:
مدل Claude 4.5 تحت سطح ایمنی ASL-3 عرضه شده؛ با کاهش رفتارهای ناهماهنگ مثل چاپلوسی، توهمزایی، و مقاومت بالا در برابر حملات prompt injection.
📊 مقایسه با GPT-5:
در حالی که GPT-5 در زبان و تولید محتوا قویتر است، Claude 4.5 در استفاده عملی از کامپیوتر، اجرای کد، و ... برتری دارد. مخصوصاً برای توسعهدهندهها، Claude انتخابی حرفهایتر است.
📎 جزئیات کامل در معرفی رسمی مدل توسط Anthropic
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
خبر داغ برای توسعهدهندگان وب!
🔐 کتابخانه محبوب Auth.js (که قبلاً با نام NextAuth.js شناخته میشد) حالا تحت مدیریت تیم Better Auth قرار گرفته است!
اگر تا حالا با ChatGPT، Google Labs یا Cal.com کار کرده باشید، احتمالاً با Auth.js هم تعامل داشتهاید، یکی از پراستفادهترین ابزارهای احراز هویت در دنیای جاوااسکریپت.
📌 چرا این مسئله مهم است؟ تیم Better Auth با هدف ارتقاء تجربه احراز هویت، حالا مسئول نگهداری و توسعه Auth.js شده. این یعنی امنیت بیشتر، امکانات بهتر و مسیر روشنتر برای آیندهی این ابزار قدرتمند.
✅ به پروژههای جدید پیشنهاد میشود با Better Auth شروع کنند.
✅ برای پروژههای فعلی، Auth.js همچنان پشتیبانی میشود.
✅ راهنمای مهاجرت از NextAuth به Better Auth هم آماده است.
🎯 هدف نهایی؟ اینکه کنترل کامل احراز هویت دست خود شما باشد!
📚 اطلاعات بیشتر و راهنماها.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
ایندکسر (Indexer) در سیشارپ
#csharp_for_beginners
وقتی یک کلاس یا ساختار (struct) را میسازیم، ممکن است بخواهیم از آن مانند آرایهای با “[]” به موقعیتهای کلاس یا ساختار دسترسی داشت: هم خواندن و هم نوشتن. ایندکسرها این امکان را فراهم میکنند. یعنی به جای روشهای معمول مثل GetItem(…) یا SetItem(…)، بتوان نوشت:
myObject[i] = value;
var x = myObject[i];
ساختار ایندکسر
ایندکسر شبیه پراپرتی تعریف میشود، با این تفاوت که زمان get و set یک یا چند پارامتر (معمولاً اندیس) دریافت میکند. برای تعریف ایندکسر از کلمهی کلیدی this استفاده میکنیم:
public class SampleCollection<T>
{
private T[] arr = new T[100];
public T this[int i]
{
get { return arr[i]; }
set { arr[i] = value; }
}
انواع ایندکسر
خواندنی و نوشتنی (Read/Write): هم get و هم set را داراست.
فقط خواندنی (Read-only): فقط get را داراست. مثلاً اگر لازم باشد فقط به دادهها دسترسی دهیم ولی تغییری در دادهها ندهیم.
چند پارامتری: ایندکسر میتواند بیشتر از یک ایندکس داشته باشد، مانند ایندکسر دو بعدی
غیر عددی: الزامی نیست شاخصها عدد باشند؛ میاتونند نوعی مانند رشته، تاریخ یا هر نوع دلخواهی باشند.
موارد استفاده
شبیهسازی آرایه یا لیست: وقتی کلاس شما مانند یک مجموعه عمل میکند، ولی نمیخواهید جزئیات داخلی را بیرون دهید.
دیکشنری / نگاشت (mapping): مثلاً وقتی میخواهید بر اساس کلید (مانند رشته یا تاریخ) مقدار دهی کنید یا مقداری را بگیرید، بجای متدهایی مانند Get یا Find، میتوانید بنویسید: obj[“key”] .
دادههای وابسته به زمان یا تاریخ: مانند ثبت دما بر اساس تاریخ، طوری که بتوانید با obj[date] بخوانید یا بنویسید.
زمانی که نمیخواهیم کل دادهها به صورت همزمان در حافظه داشته باشیم: ممکن است بخشهایی از داده را بر حسب نیاز بارگذاری یا حذف کنید. ایندکسر اجازه میدهد که فقط وقتی به دادهای نیاز داریم، آن قسمت پردازش شود.
🔗 مطلب کامل را در این لینک میتوانید مطالعه کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
🧵 مقایسه AOT در NET. و Java، کدام برای تولید آمادهتر است؟
در سال ۲۰۲۵، AOT (کامپایل پیش از اجرا) به یک ابزار کلیدی برای بهینهسازی زمان شروع، مصرف حافظه و سادهسازی دیپلوی تبدیل شده. اما بین NET. و Java، کدام بهتر عمل کرده؟
خلاصه NET Native AOT
✅ کاملاً یکپارچه با SDK
✅ خروجی اجرایی مستقل از runtime
✅ شروع سریع و مصرف حافظه پایین
✔️ محدودیت در کدهای داینامیک (مثل Reflection.Emit)
خلاصه Java GraalVM Native Image
✅ خروجی باینری مستقل از JVM
✅ مناسب برای ابزارهای CLI و serverless
✔️ نیاز به پیکربندی دستی برای reflection و proxy
✔️ زمان ساخت طولانیتر و پیچیدگی بیشتر
📊 مقایسه نهایی
در حال حاضر NET Native AOT. گزینهای بالغتر و آمادهتر برای استفاده در محیطهای تولیدی است. Java با GraalVM قدرتمند است، اما بیشتر مناسب پروژههای خاص یا جدید.
📎 مطلب کامل را اینجا بخوانید.
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
وقتی تعداد ورودیها مشخص نیست، params وارد میشود!
در دنیای توسعه نرمافزار، همیشه با توابعی مواجه میشویم که باید انعطافپذیر باشند؛ یعنی بتوانند با ورودیهای مختلف و تعداد متغیر از دادهها کار کنند. زبان سیشارپ با کلمه کلیدی params این امکان را فراهم کردهاست تا بدون دردسر، توابعی بنویسیم که مثل یک میزبان خوشبرخورد، هر تعداد مهمان را با آغوش باز بپذیرند!
🔘مثال:
public static void LogErrors(params string[] errorMessages)
{
foreach (var msg in errorMessages)
{
Console.WriteLine($"[ERROR] {DateTime.Now}: {msg}");
}
}
LogErrors("خطا در اتصال به دیتابیس");
LogErrors("کاربر یافت نشد", "توکن منقضی شده", "دسترسی غیرمجاز");
🚀 کارگاه GenAI/LLM Fundamentals for Business People
👤 توسط : مهران داودی
📅 تاریخ: چهارشنبه، ۲۶ شهریور ۱۴۰۴
🕒 زمان:
- ساعت ۱۱:۳۰ صبح (تورنتو)
- ساعت ۵:۳۰ عصر (اروپا)
- ساعت ۷:۰۰ شب (ایران)
🚀 «مبانی GenAI و مدلهای زبانی بزرگ (LLM) برای افراد بیزنسی»
این کارگاه برای مدیران و متخصصان کسبوکار طراحی شده که میخواهند درک دقیقی از کاربردهای عملی هوش مصنوعی مولد و مدلهای زبانی بزرگ در فضای واقعی کسبوکار داشته باشند. چه در آغاز مسیر یادگیری هوش مصنوعی باشید و چه به دنبال تعمیق دانش خود، این ورکشاپ پایههای ضروری برای حرکت در مسیر پرشتاب GenAI را در اختیار شما قرار میدهد.
شرکت برای همه آزاد و رایگان است.
▫️اینجا ثبت نام کنید:
https://www.linkedin.com/feed/update/urn:li:activity:7372270104853610496/
کانال تلگرام:
@SoftwarePhilosophy
______
بهبود عملکرد JSON در داتنت با حذف Reflection!
در اپلیکیشنهای داتنت که در حجم بالا با JSON سروکار دارند، استفاده از JsonSerializer باعث کندی در شروع برنامه، مصرف زیاد حافظه و کاهش سرعت میشود. دلیل این موضوع استفاده از Reflection در زمان اجراست که منابع زیادی مصرف میکند.
راهحل:
در داتنت ۶ قابلیت جدیدی معرفی شده: Source Generator برای System.Text.Json. این ابزار در زمان کامپایل کدهای لازم برای سریالسازی و دیسریالسازی را تولید میکند، و دیگر نیازی به Reflection در زمان اجرا نیست!
مزایای این موضوع:
- افزایش سرعت سریالسازی تا ۱.۶ برابر
- کاهش زمان شروع برنامه
- کاهش مصرف حافظه
- سازگاری بهتر با trimming و کاهش حجم نهایی اپ
public class Person {
public string FirstName { get; set; }
public string LastName { get; set; }
}[JsonSerializable(typeof(Person))]
internal partial class MyJsonContext : JsonSerializerContext { }
var person = new Person { FirstName = "Jane", LastName = "Doe" };
var json = JsonSerializer.Serialize(person, MyJsonContext.Default.Person);
معرفی کلی Pattern Matching در زبان سیشارپ
#csharp_for_beginners
تکنیک Pattern matching روشی است که امکان بررسی یک عبارت (expression) براساس ویژگیهای خاصی را فراهم میکند.
این روش در سیشارپ کمک میکند تا کدها خواناتر، مختصرتر و ایمنتر شوند، مثلاً به جای عملیات مرسوم قبلی، بررسی نوع یا وضعیت ارزشها را در قالبهایی مستقیمتر انجام میدهد.
سازوکارها و ساختارهای اصلی در سیشارپ
۱. is Expression (عملگر is)
این ساختار بررسی میکند که آیا یک عبارت با یک الگو (pattern) تطابق دارد یا خیر، و در صورت موفقیت، امکان تعریف متغیر جدید نیز فراهم میشود.
کاربرد معمول: چک نوع متغیر و استخراج آن در قالب متغیر محلی
مثال
int? maybe = 12;
if (maybe is int number) {
Console.WriteLine($"The value is {number}");
}
visitorCount switch {
1 => 12.0m,
2 => 20.0m,
_ => 0.0m
}
var x = 4;
string result = x switch {
1 => "one",
2 => "two",
3 => "three",
_ => "other"
};
Console.WriteLine(result); // خروجی: "other"
اجرای مستقیم فایلهای سیشارپ با dotnet run
آیا تا به حال برای تست یک کد ساده سیشارپ مجبور بودهاید پروژه بسازید و فایل .csproj درست کنید!
با نسخه جدید NET 10. میتونید فایلی ساده مثل app.cs را مستقیم با دستور زیر اجرا کنید:
dotnet run app.cs
#:package Humanizer@2.14.1
using Humanizer;
Console.WriteLine(DateTime.Now.AddDays(-3).Humanize());
#:sdk Microsoft.NET.Sdk.Web
var app = WebApplication.Create();
app.MapGet("/", () => "Hello from ASP.NET Core!");
app.Run();
#:property LangVersion preview
Console.WriteLine("Using C# preview features!");
dotnet project convert app.cs
مدیریت بهتر سرویس های self-hosted
اگر سایت و اپلیکیشنهای خود را روی سرورهای ویندوزی و لینوکسی بالا میآورید و از سرویسهای ابری استفاده نمیکنید، احتمالا مشکلاتی در مدیریت سرویسهای خود دارید.
از دیپلوی کردن گرفته تا مدیریت بکآپها و نسخههای مختلف و Environment های متفاوت که کنترل این موارد به صورت دستی مشکل است و علاوه بر آن ریسک ایجاد مشکل در سرویسها را بالا میبرد.
ابزارهای متنوعی برای مدیریت این موضوع وجود دارد مثل Heroku، Vercel یا Netlify که محدودیتهای زیادی دارند.
- ابزاری اوپن سورس و رایگان وجود دارد به نام Coolify
ابزاری اوپنسورس و سلفهاستد (self-hosted) که به شما اجازه میدهد خیلی راحت پروژههای خود را روی سرور خود دیپلوی و مدیریت کنید.
بدون نیاز به کلی کانفیگ عجیب غریب، میتوانید با چند کلیک ساده سرویسهایی مثل دیتابیس، اپلیکیشنهای داکری، یا حتی پروژههای Next.js و Laravel و Asp.net و ... را ران کنید.
🔗 آدرس گیتهاب.
📖 مستندات کامل.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
متغیرهای محلی با نوع ضمنی (var) در سیشارپ
#csharp_for_beginners
در سیشارپ، زمانی که متغیری را با استفاده از کلیدواژه var تعریف میکنید، نیازی به مشخص کردن نوع آن ندارید؛ زیرا کامپایلر نوع مناسب را از بند عبارت سمت راست تشخیص میدهد.
نوع ممکن است جزئی از انواع داخلی مثل int یا string باشد، یا حتی انواع ناشناس (anonymous types) یا انواع تعریفشده توسط کاربر یا کتابخانههای داتنت.
نمونههای کاربردی
مثالهایی از تعریف متغیرهای ضمنی با var:
var i = 5; // نوع int
var s = "Hello"; // نوع string
var a = new[] { 0, 1, 2 }; // نوع int[]
var expr = from c in customers where c.City == "London" select c; // IEnumerable<Customer> یا IQueryable<Customer>
var anon = new { Name = "Terry", Age = 34 }; // نوع ناشناس
var list = new List<int>(); // List<int>
var امکانپذیر نیست، نظیر: var a = 1, b = 2; باعث خطا میشود.var studentQuery = from student in students
where student.FirstName[0] == firstLetter
select new { student.FirstName, student.LastName };
foreach (var anonType in studentQuery)
{
Console.WriteLine($"First = {anonType.FirstName}, Last = {anonType.LastName}");
}
var، امکان دسترسی به خواص این نوعها وجود ندارد.var فقط زمانی استفاده کنید که نوع از مقدار سمت راست بهوضوح مشخص باشد. یعنی اگر از خواننده انتظار دارید نوع را تشخیص دهد، فقط در آن صورت از var استفاده کنید.var به نوع صریح (explicit type) را برای خوانایی بیشتر فراهم کرده است؛ البته در شرایطی که مقدار در همان خط تعریف نشده یا نوع ناشناس نیست.
تبدیل نوع (Casting & Type Conversions) در سیشارپ
#csharp_for_beginners
در زبان برنامهنویسی سیشارپ، متغیرها انواع (Types) مختلفی دارند؛ مانند int، double، string و غیره. گاهی اوقات نیاز داریم مقدار یک نوع را به نوعی دیگر تبدیل کنیم. این فرآیند تبدیل نوع (Type Conversion) یا Casting نامیده میشود. سیشارپ دو نوع اصلی تبدیل دارد:
Implicit Conversion
Explicit Conversion / Casting
تبدیل ضمنی (Implicit Conversion)
در این نوع تبدیل، کامپایلر خودش بهطور خودکار نوع را تبدیل میکند، چون خطر از دست رفتن داده وجود ندارد. مثلاً وقتی مقدار int را به long تبدیل میکنیم:
int myInt = 100;
long myLong = myInt; // تبدیل ضمنی
double myDouble = 123.45;
int myInt = (int)myDouble; // تبدیل صریح
string myString = "123";
int myInt = Convert.ToInt32(myString); // تبدیل رشته به عدد صحیح
string myString = "456";
int myInt = int.Parse(myString); // اگر رشته ناصحیح باشد، استثناء رخ میدهد
bool success = int.TryParse(myString, out int result);
// اگر موفق باشد، result مقدار عددی میگیرد، در غیر این صورت صفر میشود
object obj = "Hello";
string str = (string)obj; // تبدیل صریح با cast
// استفاده از 'as'
string str2 = obj as string; // اگر نشود، مقدار null برمیگرداند
اقدامات جدید مایکروسافت در جهت افزایش چشمگیر امنیت ابری
مایکروسافت بهجای استفاده از ماژولهای امنیتی متمرکز (HSM)، حالا تراشههای امنیتی را داخل هر سرور قرار داده است. این یعنی امنیت بیشتر و حذف نیاز به ارتباط TLS با سرور مرکزی.
🔐 تراشه اختصاصی Azure Integrated HSM
این تراشه علاوه بر رمزنگاری، قابلیت تشخیص نفوذ و دستکاری را هم دارد. طراحی هم به گونهای است که کممصرف و کوچک باشد تا در هر سرور قابل استفاده باشد.
🧠 محافظت از دادهها در زمان استفاده
با فناوری Confidential Computing، حتی وقتی دادهها در حال پردازش هستند، محافظت میشوند. این موضوع برای multi-tenant environments بسیار مهم است.
تراشهای متنباز معرفی کرده است که بهعنوان Root Of Trust عمل میکند. این حرکت باعث شفافیت بیشتر در امنیت و تفاوت با سایر ارائهدهندگان ابری شده است.
🔗 در این لینک میتونید اطلاعات دقیقتری از این موضوع را مطالعه و همچنین آمار جالبی که مایکروسافت داده را هم مشاهده کنید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
🚀 تعریف color در css با OKLCH
🔹 خیلی وقتها در طراحی (وب یا گرافیک) از RGB یا HSB استفاده میکنیم.
ولی یک مدل رنگ جدیدتر به اسم OKLCH آمده است که دقیقتر و طبیعیتر عمل میکند.
مدل OKLCH یک فضای رنگ ادراکی (Perceptual) است، یعنی رنگها را به گونهای تعریف میکند که تغییراتش برای چشم انسان واقعیتر و یکنواختتر باشد.
پارامترها:
پارامتر L (Lightness) : روشنایی (۰ تا ۱۰۰)
پارامتر C (Chroma): شدت/خلوص رنگ
پارامتر H (Hue): فام (زاویه روی چرخه رنگ ۰ تا ۳۶۰)
🔄 تفاوت با RGB
مدل RGB بر اساس سختافزار (سه کانال قرمز، سبز، آبی) است.
اما OKLCH بر اساس چشم انسان.
در RGB وقتی رنگ را روشنتر میکنیم، ممکن است فامش تغییر کند. ولی در OKLCH همان رنگ فقط روشنتر میشود.
🔄 تفاوت با HSB
مدل HSB سادهتر از RGB است، ولی همچنان غیرادراکی
در واقع Saturation و Brightness تو HSB خطی نیستند.
در مدل OKLCH اما Chroma و Lightness دقیقاً همان چیزی هستند که چشم ما حس میکند.
🎨 مثال
گرادینت از قرمز به آبی در RGB : وسط بنفشی تیره و کدر میشود.
background: linear-gradient(to right, rgb(255,0,0), rgb(0,0,255));
background: linear-gradient(to right, oklch(65% 0.25 29), oklch(65% 0.25 265));
تعامل هوشمند با کاربر از طریق Azure OpenAI
مدلهای زبانی مثل GPT با استفاده از Chat Completions API به توسعهدهندگان این امکان را میدهند که مکالماتی هوشمند، زمینهمحور و شخصیسازیشده در اپلیکیشنها پیادهسازی کنند. برخلاف روشهای سنتی که فقط یک ورودی و خروجی ساده دارند، این API از ساختار مکالمهای پشتیبانی میکند. یعنی میتوانید چند پیام با نقشهای مختلف ارسال کنید و پاسخهایی دقیقتر و طبیعیتر دریافت کنید.
❓برای اتصال به Azure OpenAI چه چیزهایی لازم است؟
- اشتراک Azure فعال
- فعالسازی سرویس Azure OpenAI از طریق Azure Portal
- دریافت Endpoint و کلید دسترسی (API Key)
- نام مدل و Deployment ID که خودتان در پورتال تعریف میکنید (مثلاً gpt-4-deployment)
✅نکات مهم درباره Chat Completions
• نقشها (roles): هر پیام باید نقش داشته باشد، برای تنظیم رفتار مدل، برای ورودی کاربر و برای پاسخ مدل.
• زمینه مکالمه: میتوانید چند پیام پشت سرهم ارسال کنید تا مدل، زمینه را بهتر بفهمد.
• تنظیم (temperature): عددی بین ۰ تا ۱ که میزان خلاقیت پاسخ را کنترل میکند. عدد بالاتر یعنی پاسخهای متنوعتر.
کد نمونه (C# با استفاده از Chat Completions API در Azure)
public async Task<string> GetGptReplyAsync(string userMessage)
{
var endpoint = new Uri("https://YOUR_RESOURCE_NAME.openai.azure.com/");
var apiKey = new AzureKeyCredential("YOUR_API_KEY");
var client = new OpenAIClient(endpoint, apiKey);
var chatOptions = new ChatCompletionsOptions()
{
Messages =
{
new ChatMessage(ChatRole.System, "شما یک دستیار هوشمند هستید که به کاربران در نوشتن مقاله کمک میکنید."),
new ChatMessage(ChatRole.User, userMessage)
},
Temperature = 0.7f
};
var deploymentName = "gpt-4-deployment"; // نامی که موقع ساخت مدل در Azure انتخاب کردی
Response<ChatCompletions> response = await client.GetChatCompletionsAsync(deploymentName, chatOptions);
string reply = response.Value.Choices[0].Message.Content;
return reply.Trim();
}
🎬✨ همین دیروز Sora 2 رسید!
دیروز OpenAI از مدل جدید و قدرتمند خودش، Sora 2، رونمایی کرد؛ مدلی که نهتنها ویدیوهایی با دقت فیزیکی و واقعگرایی بالا تولید میکنه، بلکه صدا، دیالوگ و افکتهای صوتی رو هم با کیفیت سینمایی همگامسازی میکنه!
🔹 اجرای حرکات پیچیده مثل ژیمناستیک المپیکی و ...
🔹 کنترل دقیق صحنهها و حفظ وضعیت اصلی در چند شات
🔹 و مهمترین ویژگی امکان حضور خودتون یا دوستانتون در ویدیوها با ویژگی Cameo
📚 اطلاعات بیشتر در سایت OpenAI.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
🎯فیدو (FIDO2) چیست و چرا مهم است؟
فیدو - FIDO2 استانداردی جهانی برای احراز هویت بدون رمز عبور است که توسط مایکروسافت و شرکتهای بزرگ دیگر طراحی شده است تا امنیت ورود به حسابها را بالا ببرد و جلوی حملات فیشینگ و هک رو بگیرد.
🔐 چگونه کار میکند؟
به جای رمز عبور، FIDO2 از یک جفت کلید رمزنگاری استفاده میکند:
- کلید عمومی برای سرور.
- کلید خصوصی که فقط روی دستگاه شما میماند.
وقتی میخواهید وارد حساب کاربری خود شوید، دستگاه شما رمزنگاری را با کلید خصوصی امضا میکنه و امنیت را تضمین میکند.
📱 انواع احراز هویتکنندهها:
۱. قابل حمل (Roaming): مانند فلش امنیتی، گوشی یا ساعت هوشمند.
۲. داخلی (Platform): مثل اثر انگشت یا تشخیص چهره روی لپتاپ یا موبایل.
✅ مزایای FIDO2:
- امنیت بالا در برابر فیشینگ و بدافزار.
- حفظ حریم خصوصی (اطلاعات بیومتریک فقط روی دستگاه ذخیره میشود).
- راحتی در ورود بدون نیاز به رمز.
- مقیاسپذیری برای شرکتها و سازمانها.
💻 نمونه کد ساده برای استفاده از FIDO2 در سیشارپ:
بخش ابتدایی جهت ایجاد کلیدها:
// 1. پیکربندی اولیه FIDO2
var fidoConfig = new Fido2Configuration
{
ServerDomain = "myapp.com",
ServerName = "My Secure App",
Origin = "https://myapp.com"
};
var fido2 = new Fido2(fidoConfig);
// 2. تعریف کاربر
var user = new Fido2User
{
DisplayName = "Hamed",
Name = "hamed123",
Id = Encoding.UTF8.GetBytes("unique-user-id")
};
// 3. ایجاد گزینههای ثبتنام
var options = fido2.RequestNewCredential(
user,
new List<PublicKeyCredentialDescriptor>(), // لیست دستگاههای قبلی
AuthenticatorSelection.Default,
AttestationConveyancePreference.None
);
// 4. ارسال گزینهها به کلاینت برای ادامه ثبتنام
return Json(options);
var success = await fido2.MakeAssertionAsync(
clientResponse, // پاسخ امضا شده از کلاینت
assertionOptions,
storedPublicKey, // کلید عمومی ثبتشده قبلی
storedUserHandle
);
if (success.Result.Status == "ok")
{
// ورود موفق
return Ok("ورود با موفقیت انجام شد!");
}
else
{
return BadRequest("احراز هویت ناموفق بود.");
}
کارگاه «Mastering MCP: A Technical Deep Dive»
تو این کارگاه قراره یه MCP رو با هم از صفر بنویسیم و بعدش هم با هم جزئیات پروتکل MCP رو بررسی کنیم و بفهمین که چه امکاناتی داره و چطور میشه ازش تو نرمافزارهای جدید و مبتنی بر هوشمصنوعی استفاده کرد.
📅 Wednesday, September 24, 2025
🕒 11:30 AM Toronto | 5:30 PM Europe | 7:00 PM Iran
https://meet.google.com/zht-fcyx-pkg
🚀 هوش مصنوعی Local با Ollama و GPT-OSS در CSharp
اگر به دنبال راهی ساده، امن و قدرتمند برای اجرای مدلهای هوش مصنوعی برروی سیستم خود هستید، Ollama دقیقاً همان چیزی است که میخواهید! با ترکیب Ollama و مدل GPT-OSS میتوانید دستیاری هوشمند بسازید که کاملاً آفلاین و خصوصی کار میکند.
🔧 چه لازم دارید؟
- سیستم با حداقل ۱۶ گیگ رم و GPU مناسب (یا مک با Apple Silicon)
- نصب NET 8. یا بالاتر
- نصب Ollama و اجرای دستور زیر برای دریافت مدل:
ollama pull gpt-oss:20b
dotnet new console -n OllamaGPTOSS
cd OllamaGPTOSS
dotnet add package Microsoft.Extensions.AI
dotnet add package OllamaSharp
Program.cs:dotnet run
سادهسازی Property ها با کلمه کلیدی field
در نسخههای جدید سیشارپ، ویژگیای معرفی شدهاست که میتواند تعریف propertyها را سادهتر کند: کلمه کلیدی field.
با این قابلیت، دیگر نیازی به تعریف دستی فیلد پشتیبان نیست و کدنویسی تمیزتر و سریعتر میشود.
در نسخههای قبلی سیشارپ، وقتی یک property تعریف میشد و قصد داشتید در get یا set به فیلد پشتیبانش دسترسی داشته باشید، باید آن فیلد دستی تعریف میشد. اما حالا با filed ، میتوان از فیلد پنهانیای که کامپایلر خودش برای property تولید میکند استفاده کرد.
🔘 روش قدیمی (قبل از اضافه شدن field):
private string _email;
public string Email
{
get => _email;
set
{
if (!value.Contains("@"))
throw new ArgumentException("Invalid email address");
_email = value;
}
}
public string Email
{
get => field;
set
{
if (!value.Contains("@"))
throw new ArgumentException("Invalid email address");
field = value;
}
}
کانستراکترها (سازندهها) در سیشارپ
#csharp_for_beginners
۱. تعریف و نقش
کانستراکتر روش (متودی) است که توسط محیط زمان اجرای (Runtime) هنگام ساخت یک شیء (instance) از یک کلاس یا ساختار (struct) فراخوانی میشود. میتوان برای یک کلاس یا struct چندین کانستراکتر با پارامترهای مختلف تعریف کرد تا اطمینان حاصل شود که اشیاء جدید در وضعیت معتبر ساخته میشوند.
۲. ترتیب اجرای مراحل ساخت شیء
هنگام ساخت یک شیء با عملگر new، مراحل زیر به ترتیب انجام میشوند:
۱. میدانهای نمونهای (instance fields) به مقدار پیشفرض (مثل صفر) مقداردهی میشوند.
۲. مقداردهی اولیهی فیلدها (field initializers) در نوع مشتقشده اجرا میشود.
۳. مقداردهی اولیهی فیلدها در نوع پایه آغاز میشود تا به System.Object برسد.
۴. کانستراکترهای نمونهای کلاسهای پایه ابتدا اجرا میشوند تا به کلاس جاری برسند.
۵. در نهایت، کانستراکتر خود کلاس اجرا میشود.
۶. اگر از initializerهای شیء (object initializers) استفاده شده باشد، آنها بعد از کانستراکتر اجرا میشوند، به ترتیب متنی ظاهرشده.
در ساختارها (struct) اگر از مقدار پیشفرض (default) استفاده شود، همه فیلدها به صفر مقداردهی میشوند.
در آرایهها هم تمامی عناصر هنگام ساخت آرایه به مقدار پیشفرضشان (صفر یا null) تنظیم میشوند.
۳. کانستراکترهای استاتیک (static constructors)
کانستراکتر استاتیک (بدون پارامتر) برای مقداردهی اولیهی اعضای استاتیک استفاده میشود.
این کانستراکتر حداکثر یکبار، پیش از هر کانستراکتر نمونهای اجرا میشود.
در صورت عدم تعریف آن، کامپایلر بهطور خودکار اعضای استاتیک را به مقادیر پیشفرضشان مقداردهی میکند.
نمونه کانستراکتر:
public class Person
{
private string last, first;
public Person(string lastName, string firstName)
{
last = lastName;
first = firstName;
}
}
public class LabelledContainer<T>(string label)
{
public string Label { get; } = label;
public required T Contents { get; init; }
}
. میتوان برای یک کلاس یا struct چندین کانستراکتر با پارامترهای مختلف تعریف کرد تا اطمینان حاصل شود که اشیاء جدید در وضعیت معتبر ساخته میشوند
گاهی وقتها لازم است مرورگر بهصورت خودکار اجرا شود و بخشی از کارها را انجام دهد.
مثال:
- نوشتن تست E2E برای نرمافزار: باز کردن سایت، لاگین، بررسی مودالها
- گرفتن PDF یا اسکرینشات از صفحات خاص
- اسکرپینگ دادهها از سایتهای مختلف
برای این کارها، سه ابزار محبوب داریم:
ابزار Selenium: قدیمیترین و پایدارترین ابزار تست مرورگرها. پشتیبانی از همه مرورگرها، سازگار با زبانهای مختلف (Java, Python, C#, ...)، سرعت پایینتر.
نکته: Dockerize کردن آن گاهی دردسر دارد، بخصوص در CI/CD.
ابزار :Puppeteer / PuppeteerSharp: ابزاری مدرن مبتنی بر DevTools، مخصوص Chrome/Chromium، سریع و سبک، مناسب برای اسکرپینگ، تولید PDF، گرفتن اسکرینشات.
نکته: نسخهی #CSharp با نام PuppeteerSharp در NuGet موجود است و راحت در محیطهای Docker قابل استفاده ولی محدود به مرورگرهای گوگل!
ابزار Playwright: نسل جدید از مایکروسافت، با قابلیتهای پیشرفته، پشتیبانی از Chrome, Firefox, Safari (WebKit) ،Auto-wait هوشمند، کانتکستهای ایزوله، پشتیبانی رسمی از #CSharp، Node.js، Python، Java، مناسب برای تستهای مدرن و پروژههای جدید، عالی برای شبیهسازی چند کاربر همزمان.
پیشنهاد من:
پروژهی جدید و کراسمرورگر از Playwright
اسکرپینگ سبک یا تولید PDF فقط روی کروم از Puppeteer / PuppeteerSharp
پروژهی Enterprise یا نیاز به سازگاری Legacy از Selenium
▫️اگه تجربهای با این ابزارها دارید یا سوالی براتون پیش اومده، خوشحال میشم بشنوم.
🔗 مطلب کامل را در browserscan/which-to-choose-for-web-scraping-selenium-vs-puppeteer-vs-playwright-d007f5ec938e">اینجا بخوانید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
آیا هوش مصنوعی جای برنامهنویسان را میگیرد؟
شاید بهتر باشد بپرسیم: کدام برنامهنویسان با هوش مصنوعی جایگزین میشوند؟ در تیم CrystaCode، استفاده از ابزارهایی مثل GitHub Copilot باعث شده توسعهدهندگان ارشد بتوانند کاری را که قبلاً یک تیم در ۱۰ روز انجام میداد، تنها در ۴ ساعت به پایان برسانند. این یعنی مسیر سنتی رشد از طریق بازبینی کد و انجام کارهای تکراری، حالا فشردهتر و سریعتر شده. ابزارهای هوش مصنوعی دیگر فقط تکمیلکننده نیستند؛ آنها به همکارانی تبدیل شدهاند که تفکر معماری، درک سیستم و مهارت در طراحی راهحل را انجام میدهند.
در این چشمانداز جدید، توسعهدهندهای موفق خواهد بود که بتواند با هوش مصنوعی همکاری کند، نه اینکه با آن رقابت کند. مهارتهایی مثل توانایی طراحی end-to-end، درک کسبوکار و ارائه خروجی مستقل، حالا ارزشمندتر از صرفاً نوشتن کد هستند. توصیه من به برنامهنویسان تازهکار این است: سریعتر ارشد شوید. آینده منتظر شما نمیماند، بلکه با سرعت در حال حرکت است.
🔗 مطلب کامل را اینجا بخوانید.
#مهران_داودی (لینکدین - بلاگ)
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
کانال تلگرام:
@SoftwarePhilosophy
______
آشنایی باScope of Variables در سیشارپ
#csharp_for_beginners
در سیشارپ Scope به معنای محدودهای است که یک متغیر در برنامه قابل دسترسی بوده و قابل استفاده است. در زبان سیشارپ، محدودهی تغییرپذیری متغیرها معمولاً به سه سطح اصلی تقسیم میشود: در سطح کلاس (Class-Level Scope)، در سطح متد (Method-Level Scope)، و در سطح بلوک (Block-Level Scope)
۱. سطح کلاس Class-Level Scope
متغیرهایی که در داخل کلاس اما بیرون از تمامی متدها تعریف میشوند، دارای محدودهی سطح کلاس هستند و بهعنوان field یا اعضای کلاس شناخته میشوند. این متغیرها در تمامی متدها و بلوکهای همان کلاس قابل دسترسیاند—مگر دسترسی آنها توسط Access Modifier محدود شده باشد، اما داخل همان کلاس تأثیری بر دسترسی ندارد.
مثال:
class Geeks {
int a = 10; // کلاس-سطح
public void Display() {
Console.WriteLine(a); // قابل دسترسی
}
}for (int i = 0; i < 5; i++) {
Console.WriteLine(i);
}
// Console.WriteLine(i); // خطا—خارج از بلوک for
تجربه معماری شش ضلعی در نتفلیکس
وقتی تیم Studio Workflows در نتفلیکس تصمیم گرفت اپلیکیشن جدیدی برای مدیریت تولید محتوا بسازد، با چالشی بزرگ روبهرو شد: دادههایی که نیاز داشتند، در سیستمهای مختلف پخش شده بود — از gRPC گرفته تا GraphQL و JSON API.
آنها میدانستند که این منابع داده قرار است در آینده تغییر کنند، ولی نمیخواستند منطق برنامههایشان هر بار به هم بریزد. برای همین تصمیم گرفتند از معماری ششضلعی (Hexagonal Architecture) استفاده کنند.
نتیجه؟ وقتی مجبور شدند منبع داده را از JSON API به GraphQL تغییر دهند، بدون آنکه منطق اصلی برنامه دست بخورد!
این معماری کمک کرد تا:
- منطق کسبوکار را از منابع داده جدا کنند.
- تستنویسی راحتتر و سریعتری داشته باشند.
- برای تغییرات آینده آماده باشند.
اگه دوست داری بیشتر دربارهی این تجربه بخونی، این مقالهی نتفلیکس رو از دست نده:
🔗 تجربهی نتفلیکس با معماری ششضلعی یا Hexagonal Architecture
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
جایگزینهایی برای کتابخانههای محبوب AutoMapper و MediatR
همانطور که احتمالا در جریان هستید، دو کتابخانه محبوب و پرکاربرد یعنی AutoMapper و MediatR قرار است بهزودی نسخههای تجاری داشته باشند و دیگر کاملاً متنباز نخواهند بود. جیمی بوگارد، توسعهدهنده اصلی این پروژهها، اعلام کرده که برای ادامه توسعه و پشتیبانی، باید مدل تجاری را تهیه کنید.
❗️این یعنی ممکن است در آینده برای استفاده از نسخههای جدید یا پشتیبانی، نیاز به پرداخت هزینه باشد.
پس اگه در پروژههای خود از این پکیجها استفاده میکنید، باید زودتر تصمیم بگیرید که میخواهید از چه جایگزینهایی استفاده کنید. یا این که خب پولش رو بدید :)
البته خیلی هم بد نشد! Automapper داشت از Reflection استفاده میکرد در حالی که جایگزینهایی ساخته شدهاند که زمان کامپایل Mapping را انجام میدهند و حداقل ۴ برابر سرعت بهتر و همچنین استفاده منابع کمتری نیاز دارند.
به هر حال جایگزینهای متنوعی وجود دارد ولی بررسیهایی که من برای پروژههای فعال انجام دادم به دو نتیجه رسیدم که اینجا مطرح میکنم، ممنون میشم اگه پیشنهاد بهتری دارید یا چنانچه موافق هستید، توی کامنت همین پست نظر خود را به اشتراک بذارید
این دو گزینه Mapperly و Mapster هستند.
بین اینها هم از لحاظ آپدیت بودن سورس کد گیت هاب، راحتی بهتر برای دیباگ و رفع خطای بهتر و ... هم از Mapperly استفاده میکنم.
🔗 در ramyelnaghy/choosing-the-right-net-core-object-mapper-a-comparative-guide-175ae215845b">این لینک به مقایسه اجمالی بین Mapper ها پرداخته.
❓در مورد MediatR چه پیشنهادی دارید و به چه نتیجهای رسیدید؟ لطفا تجربه خود را با ما به اشتراک بگذارید ...
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
آشنایی با Namespace
#csharp_for_beginners
۱. مفهوم Namespace
در سیشارپ، Namespace برای سازماندهی کد استفاده میشود و دو نقش مهم دارد:
سازماندهی داخلی: تقسیم کلاسها، ساختارها، رابطها و… در پروژه، به گونهای که ساختار واضحتری داشته باشند.
نمایش بیرونی: وقتی که برنامه یا کتابخانهای قرار است در جایی دیگر استفاده شود، نام اعضا (types) مشخص و قابل تفکیک هستند.
۲. نحوه تعریف Namespace
با کلیدواژه namespace و سپس یک شناسه (یا مجموعهای از شناسهها با نقطه)
namespace MyApp.Services
{
class MyService { }
}
csharp
namespace MyApp.Services;
class MyService { }