Software Philosophy
3.46K subscribers
157 photos
41 videos
1.52K links
چکیده‌ای از مفاهیم به روز مهندسی نرم افزار برای مهندسین نرم‌افزار.
معماری نوین نرم‌افزار، تکنولوژی‌های برنامه نویسی جدید
Download Telegram
کارگاه «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
105🔥93👍1👏1
ایندکسر (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

______
👍43
🎯‌فیدو (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("احراز هویت ناموفق بود.");
}



🔗 داکیومنت ها ( ۱ و ۲ )

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

#حامد_حاجیلو (لینکدین)

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

______
14👍7🔥1
خبر داغ برای توسعه‌دهندگان وب!

🔐 کتابخانه محبوب 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

______
7👍5
🎬 همین دیروز Sora 2 رسید!

دیروز OpenAI از مدل جدید و قدرتمند خودش، Sora 2، رونمایی کرد؛ مدلی که نه‌تنها ویدیوهایی با دقت فیزیکی و واقع‌گرایی بالا تولید می‌کنه، بلکه صدا، دیالوگ و افکت‌های صوتی رو هم با کیفیت سینمایی همگام‌سازی می‌کنه!

🔹 اجرای حرکات پیچیده مثل ژیمناستیک المپیکی و ...
🔹 کنترل دقیق صحنه‌ها و حفظ وضعیت اصلی در چند شات
🔹 و مهمترین ویژگی امکان حضور خودتون یا دوستانتون در ویدیوها با ویژگی Cameo




📚 اطلاعات بیشتر در سایت OpenAI.

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

#حامد_حاجیلو (لینکدین)

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

______
🔥82👍2
مدل 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

______
👍82
تعامل هوشمند با کاربر از طریق 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();
}

🔗 در این مورد در اینجا بیشتر بخوانید.

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

#نگار_قاسمی (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy
_________
👍91🔥1
اجرای کدهای پایتون در دات‌نت با جادوی 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

______
👍109🔥2👏1😱1
🚀 تعریف 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));


همان گرادینت در OKLCH: بنفشی روشن و طبیعی به وجود می‌آید.
background: linear-gradient(to right, oklch(65% 0.25 29), oklch(65% 0.25 265));



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


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

#حامد_حاجیلو (لینکدین)

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

______
👍93
رابط (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);
}



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

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

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

______
👍2
اقدامات جدید مایکروسافت در جهت افزایش چشم‌گیر امنیت ابری

مایکروسافت به‌جای استفاده از ماژول‌های امنیتی متمرکز (HSM)، حالا تراشه‌های امنیتی را داخل هر سرور قرار داده است. این یعنی امنیت بیشتر و حذف نیاز به ارتباط TLS با سرور مرکزی.

🔐 تراشه اختصاصی Azure Integrated HSM
این تراشه علاوه بر رمزنگاری، قابلیت تشخیص نفوذ و دست‌کاری را هم دارد. طراحی هم به‌ گونه‌ای است که کم‌مصرف و کوچک باشد تا در هر سرور قابل استفاده باشد.

🧠 محافظت از داده‌ها در زمان استفاده
با فناوری Confidential Computing، حتی وقتی داده‌ها در حال پردازش هستند، محافظت می‌شوند. این موضوع برای multi-tenant environments بسیار مهم است.

تراشه‌ای متن‌باز معرفی کرده است که به‌عنوان Root Of Trust عمل می‌کند. این حرکت باعث شفافیت بیشتر در امنیت و تفاوت با سایر ارائه‌دهندگان ابری شده است.

🔗 در این لینک می‌تونید اطلاعات دقیق‌تری از این موضوع را مطالعه و همچنین آمار جالبی که مایکروسافت داده را هم مشاهده کنید.

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

#حامد_حاجیلو (لینکدین)

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

______
👍3
ویکی هوشمند برای کدهای گیت‌هاب - DeepWiki

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

- فقط کافی است در URL ریپازیتوری گیت هاب به جای github.com بنویسید deepwiki.com (تا همین جا یک نمونه را امتحان کنید و ببینید چه اتفاقی رخ می‌دهد!)
- مستندی کامل شامل خلاصه پروژه، تکنولوژی‌های استفاده‌شده، ساختار فایل‌ها و نمودارهای معماری را خودکار دریافت می‌کنید.
- هر سوالی داشته باشید یا اگر به طور مثال به باگی خوردید می‌توانید همان‌جا بپرسید و جواب بگیرید!

🔗 توضیحات تکمیلی را اینجا بخوانید.

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

#حامد_حاجیلو (لینکدین)

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

______
👍144🔥2
اپراتورها در سی‌شارپ

#csharp_for_beginners

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

دسته‌های اصلی اپراتورها
۱. اپراتورهای حسابی: برای انجام محاسبات ریاضی مثل جمع، تفریق، ضرب، تقسیم و باقی‌مانده استفاده می‌شوند.
۲. اپراتورهای مقایسه‌ای: برای مقایسه دو مقدار به‌کار می‌روند، مثل بزرگ‌تر، کوچک‌تر یا برابر بودن.
۳. اپراتورهای منطقی بولی: برای ترکیب و معکوس کردن مقادیر درست و نادرست (true/false) استفاده می‌شوند.
۴. اپراتورهای بیت‌به‌بیت و شیفت: برای کار روی بیت‌های داخلی داده‌های عددی کاربرد دارند.
۵. اپراتورهای برابری: برای بررسی مساوی یا نامساوی بودن دو مقدار استفاده می‌شوند.
۶. اپراتورهای انتساب و ترکیبی: برای مقداردهی متغیرها یا ترکیب یک عملیات با انتساب به‌کار می‌روند، مانند += یا -=.
۷. اپراتور شرطی سه‌تایی: یک عبارت شرطی است که بین دو مقدار یکی را انتخاب می‌کند.
۸. اپراتورهای Null: برای بررسی نال بودن و جایگزین کردن مقدار پیش‌فرض استفاده می‌شوند.
۹. اپراتورهای دسترسی به عضو، ایندکس، افزایش یا کاهش و تبدیل نوع: برای دسترسی به اعضای یک شیء، کار با آرایه‌ها، افزایش/کاهش مقدار یا تبدیل نوع داده به نوع دیگر استفاده می‌شوند.

اولویت و جهت اجرای اپراتورها
اپراتورها در سی‌شارپ اولویت‌های مختلفی دارند. اپراتورهایی با اولویت بالاتر زودتر اجرا می‌شوند. اگر چند اپراتور در یک سطح اولویت باشند، ترتیب اجرا توسط جهت ارجاع مشخص می‌شود. اکثر اپراتورهای دوتایی از چپ به راست اجرا می‌شوند، اما برخی مانند انتساب و اپراتور شرطی از راست به چپ اجرا می‌شوند.
به‌عنوان مثال، عبارت a + b - c به‌صورت (a + b) - c محاسبه می‌شود، ولی عبارت x = y = z به شکل x = (y = z) ارزیابی خواهد شد

ترتیب ارزیابی عملوندها
به‌طور پیش‌فرض، عملوندهای یک اپراتور از چپ به راست محاسبه می‌شوند. با این حال، برخی اپراتورها شرطی هستند و ممکن است همه عملوندها محاسبه نشوند.
• در اپراتور && اگر عملوند سمت چپ برابر false باشد، سمت راست دیگر بررسی نمی‌شود.
• در اپراتور || اگر عملوند سمت چپ true باشد، سمت راست اجرا نمی‌شود.
• در اپراتور ?? یا ??=، اگر مقدار سمت چپ نال نباشد، سمت راست محاسبه نمی‌شود.
• در اپراتور شرطی سه‌تایی ?: فقط یکی از شاخه‌ها اجرا می‌شود.
• در عملگرهای شرطی نال مانند ?. یا ?[]، اگر شیء سمت چپ نال باشد، ادامه‌ی عبارت متوقف می‌شود

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

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

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

______
👍81🔥1
فراتر از چت‌بات‌ها، نزدیک‌تر به انسان

در دنیایی که هوش مصنوعی هر روز مرزهای تازه‌ای را فتح می‌کند، مدل جدید GPT-4o از شرکت OpenAI نقطه‌ی عطفی در مسیر تعامل طبیعی‌تر میان انسان و ماشین به شمار می‌آید. این مدل چندوجهی با توانایی پردازش همزمان متن، تصویر و صوت، تجربه‌ای بی‌سابقه از گفت‌وگوهای هوشمند و واکنش‌های لحظه‌ای را فراهم کرده است. نسخه جدید Realtime API نیز با بهره‌گیری از قدرت GPT-4o، امکان ساخت دستیارهای صوتی با واکنش سریع، صدای طبیعی و درک عمیق‌تر از زبان انسانی را فراهم می‌کند.

ویژگی‌های برجسته gpt-realtime:
- تبدیل گفتار به گفتار (Speech-to-Speech): برخلاف مدل‌های قبلی که گفتار را به متن و بعد دوباره به گفتار تبدیل می‌کردند، این مدل مستقیماً گفتار تولید می‌کند. این باعث کاهش تأخیر و طبیعی‌تر شدن مکالمه می‌شود.
- درک بهتر دستورها: مدل می‌تواند دستورهای پیچیده را دقیق‌تر دنبال کند، مثل گفتن جملات با لحن خاص یا تکرار دقیق اطلاعات مثل شماره‌ها و حروف.
- توانایی چندزبانه: می‌تواند وسط جمله زبان را عوض کند و حتی نشانه‌های غیرکلامی مثل خنده را تشخیص بدهد.
- صداهای جدید: دو صدای جدید به نام‌های Cedar و Marin معرفی شده‌اند که طبیعی‌ترین کیفیت گفتار را دارند.

قابلیت‌های جدید Realtime API:
- پشتیبانی از تصاویر: حالا می‌توانید عکس یا اسکرین‌شات را همراه با صوت یا متن ارسال کنید تا مدل بتواند درباره آن تصویر صحبت کند.
- تماس تلفنی با SIP: امکان تماس صوتی واقعی از طریق پروتکل SIP فراهم شده است.
- اتصال به سرورهای MCP: برای استفاده از ابزارهای خارجی بدون نیاز به تنظیمات پیچیده.
- قیمت‌گذاری جدید: هزینه‌ها ۲۰٪ کاهش پیدا کرده و کنترل بیشتری روی طول مکالمه‌ها برای کاهش هزینه فراهم شده است.

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

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

#نگار_قاسمی (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy
_______
👍52
ساخت شرط‌های پویا با OR در LINQ to SQL

در بسیاری از پروژه‌های نرم‌افزاری، نیاز داریم تا بر اساس ورودی‌های کاربر، فیلترهایی را به صورت پویا روی داده‌ها اعمال کنیم. یکی از چالش‌های رایج، ترکیب چند شرط با عملگر OR در کوئری‌های LINQ است، به‌ویژه زمانی که از LINQ to SQL استفاده می‌کنیم.

مشکل کجاست؟
در LINQ، وقتی چند .()Where پشت سر هم استفاده می‌کنیم، شرط‌ها به صورت AND ترکیب می‌شوند. اما اگر بخواهیم چند شرط را با OR ترکیب کنیم، نمی‌توانیم به راحتی از .()Or استفاده کنیم، چون <<Expression<Func<T, bool چنین متدی ندارد.

راه‌حل: استفاده از Expression.OrElse
برای ساخت شرط‌های OR، باید از Expression.OrElse استفاده کنیم و پارامترهای مشترک را با دقت جایگزین کنیم. در ادامه، روشی ارائه می‌شود که لیستی از شرط‌ها را دریافت کرده و آن‌ها را با OR ترکیب می‌کند:
public static Expression<Func<T, bool>> OrElse<T>(IEnumerable<Expression<Func<T, bool>>> expressions)
{
var parameter = Expression.Parameter(typeof(T), "x");
Expression? body = null;

foreach (var expr in expressions)
{
var visitor = new ReplaceParameterVisitor(expr.Parameters[0], parameter);
var visitedBody = visitor.Visit(expr.Body);
body = body == null ? visitedBody : Expression.OrElse(body, visitedBody);
}

return body != null
? Expression.Lambda<Func<T, bool>>(body, parameter)
: x => false;
}

class ReplaceParameterVisitor : ExpressionVisitor
{
private readonly ParameterExpression _oldParam;
private readonly ParameterExpression _newParam;

public ReplaceParameterVisitor(ParameterExpression oldParam, ParameterExpression newParam)
{
_oldParam = oldParam;
_newParam = newParam;
}

protected override Expression VisitParameter(ParameterExpression node)
{
return node == _oldParam ? _newParam : base.VisitParameter(node);
}
}


مثال:
فرض کنید می‌خواهید لیستی از افراد را فیلتر کنید که یا سن‌شان بالای ۳۰ باشد، یا نام‌شان با "ن" شروع شود، یا فعال باشند:
var filters = new List<Expression<Func<Person, bool>>>
{
p => p.Age > 30,
p => p.Name.StartsWith("ن"),
p => p.IsActive
};

var combined = OrElse(filters);
var result = db.People.Where(combined);

این کوئری به صورت زیر در SQL ترجمه می‌شود:
WHERE Age > 30 OR Name LIKE 'ن%' OR IsActive = 1


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

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

#نگار_قاسمی (لینکدین)

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

________
👍16
ساختارها در سی‌شارپ

#csharp_for_beginners

ساختار یا struct نوعی value type در زبان سی‌شارپ است که برای نگهداری داده‌ها و رفتار مرتبط با آن‌ها استفاده می‌شود.
وقتی متغیری از نوع struct ساخته می‌شود، داده‌ها مستقیماً درون آن متغیر ذخیره می‌شوند، نه در یک شیء جداگانه در heap.
در نتیجه، وقتی یک struct به متد ارسال یا از متد بازگردانده می‌شود، کل مقدار آن کپی می‌گردد.
به همین دلیل، struct برای انواع داده‌ای کوچک و مستقل مناسب است.
در مقابل، اگر نوعی داده رفتار پیچیده یا اندازه‌ی بزرگ دارد، معمولاً کلاس گزینه‌ی بهتری است.

مثال ساده از تعریف ساختار

public struct Coords
{
public Coords(double x, double y)
{
X = x
Y = y
}

public double X { get }
public double Y { get }

public override string ToString() => $"({X}, {Y})"
}



یک نوع دیگر به نام readonly struct & readonly

می‌توان یک ساختار را با کلیدواژه readonly تعریف کرد تا تغییرناپذیر باشد.
در یک readonly struct تمام فیلدها باید readonly باشند و تمام ویژگی‌ها (properties) باید فقط getter داشته باشند یا از نوع init باشند. در این حالت ساختار دیگر قابل تغییر نیست و اطمینان حاصل می‌شود که داده‌ها پس از ساخت ثابت باقی می‌مانند.

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

مثال از readonly struct

public readonly struct Coords
{
public Coords(double x, double y)
{
X = x
Y = y
}

public double X { get; init; }
public double Y { get; init; }

public readonly override string ToString() => $"({X}, {Y})"
}


آرایه‌های درون‌خطی (inline arrays)

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

مقداردهی اولیه و مقدار پیش‌فرض struct

ساختارها مستقیماً داده‌ها را درون خود ذخیره می‌کنند. هنگامی که از دستور default برای ساختار استفاده شود، همه‌ی فیلدها با مقدار پیش‌فرض خود مقداردهی می‌شوند و هیچ سازنده‌ای فراخوانی نمی‌شود.

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

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



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

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

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

______
👍4
🎬 برنامه‌نویسی ویدیو با React!

اگر دنبال راهی خلاقانه برای ساخت ویدیو با کدنویسی هستید، ریپازیتوری Remotion یک انتخاب بی‌نظیر است. این فریم‌ورک قدرتمند به شما اجازه می‌دهد با استفاده از React و تکنولوژی‌های وب مثل CSS، SVG، Canvas و حتی WebGL، ویدیوهای کاستوم بسازید.


برای شروع فقط کافی است دستور زیر را اجرا کنید:
npx create-video@latest


و مابقی ماجرا را در گیت هاب می‌توانید ببینید.

📚 مستندات کامل و API Reference در remotion.dev در دسترس است.

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

#حامد_حاجیلو (لینکدین)

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

______
3👍2🔥2
تجربه کار با Map و پکیج‌های مختلف در Blazor و Angular

تیم ما در سال‌های اخیر زمان زیادی را برای کار کردن با Map توی بیلیزور گذراند و تجربه‌های خوبی به دست آورده‌ایم. انواع مختلف نیازمندی‌های Map را توانستیم با MapBox GL و Wrapper سی‌شارپی‌ای که برایش نوشتیم پیاده سازی کنیم.

اخیرا هم در پروژه دیگری که Angular است از Map استفاده کردیم و چون نیاز خیلی ساده‌ای داشتیم از Leaflet استفاده کردیم.

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

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

#حامد_حاجیلو (لینکدین)

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

______
👍41
تعریف Enum

#csharp_for_beginners

یک Enum در واقع نوع داده‌ای سفارشی است که مجموعه‌ای از ثابت‌های عددی نام‌گذاری‌شده را در خود نگه می‌دارد. برای مثال:

enum Season
{
Spring,
Summer,
Autumn,
Winter
}


در اینجا، اعضا به ترتیب دارای مقادیر عددی 0، 1، 2 و 3 هستند. نوع پایه‌ی Enum به‌صورت پیش‌فرض int است، اما می‌توان آن را تغییر داد.

تعیین نوع پایه و مقادیر صریح


می‌توان نوع پایه و مقادیر اعضا را به‌صورت دستی مشخص کرد:

enum ErrorCode : ushort
{
None = 0,
Unknown = 1,
ConnectionLost = 100,
OutlierReading = 200
}


در این مثال، نوع پایه ushort است و هر عضو مقدار خاص خود را دارد.

نکات مهم در استفاده از Enum
مقدار پیش‌فرض یک Enum برابر با عدد صفر است، حتی اگر هیچ عضوی با مقدار صفر تعریف نشده باشد.

تبدیل عددی به Enum مجاز است، اما اگر مقدار عددی به هیچ عضو مشخصی مربوط نباشد، نتیجه ممکن است نامعتبر باشد.

کاربردهای Enum

۱. انتخاب از میان چند مقدار مشخص
یک Enum زمانی مفید است که بخواهیم متغیری یکی از چند مقدار مشخص را بگیرد. مثلاً برای وضعیت سفارش یا فصل سال:

enum OrderStatus
{
Pending,
Processing,
Shipped,
Delivered
}


۲. استفاده به‌صورت ترکیبی (Flags)
گاهی لازم است چند مقدار با هم ترکیب شوند. در این حالت از ویژگی [Flags] استفاده می‌کنیم و مقادیر را به‌صورت توان‌های دو تعریف می‌کنیم:

[Flags]
public enum Days
{
None = 0,
Monday = 1,
Tuesday = 2,
Wednesday = 4,
Thursday = 8,
Friday = 16,
Saturday = 32,
Sunday = 64,
Weekend = Saturday | Sunday
}



جمع‌بندی
ابزار Enum یکی از ابزارهای ساده اما قدرتمند در سی‌شارپ است که به شما کمک می‌کند مجموعه‌ای از مقادیر ثابت را با نام‌های قابل فهم تعریف کنید. این کار باعث افزایش خوانایی، کاهش خطا و بهبود نگهداری کد می‌شود. با رعایت چند قاعده‌ی ساده —مثل داشتن عضو صفر، اعتبارسنجی مقادیر و استفاده‌ی درست از [Flags]— می‌توان Enumهایی ساخت که در پروژه‌های واقعی بسیار کاربردی و ایمن باشند.

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

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

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

______
👍82