Software Philosophy – Telegram
Software Philosophy
3.45K subscribers
160 photos
41 videos
1.54K links
چکیده‌ای از مفاهیم به روز مهندسی نرم افزار برای مهندسین نرم‌افزار.
معماری نوین نرم‌افزار، تکنولوژی‌های برنامه نویسی جدید
Download Telegram
بررسی خطای همزمانی آپدیت در EFCore

فرض کنید از جدول user یک آبجکت با آیدی x لود و track کرده‌اید. سپس فیلد name را آپدیت می‌کنید. اما هنوز SaveChange را صدا نزده‌اید.
در این بین (بعد از لود و قبل از save کردن) در یک جای دیگر از سیستم همین user آپدیت می‌شود.

می‌توانید مثالی شبیه به کد زیر را پیاده سازی کرده و نتیجه را ببینید:

var user = await Db.Users.Find(x);
user.Name = "jamez";
Db.Database.ExecuteSqlRaw("UPDATE User SET Name = 'david',age=22 WHERE Id = x");
await Db.SaveChangesAsync();

⁉️ چه اتفاقی خواهد افتاد؟

اتفاقی که خواهد افتاد صادر شدن خطای DbUpdateConcurrencyException است.

چون چیزی که track شده مقدارش steve است ولی در زمان ذخیره مقدار در دیتابیس متفاوت است.

برای درک بهتر این اتفاق و بررسی نحوه حل کردن آن می‌توانید از این لینک کمک بگیرید.

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

 // TODO: decide which value should be written to database
// proposedValues[property] = <value to be saved>;

در مثال لینک بالا اینگونه به نظر می‌رسد که باید یکی از آپدیت‌های دیتابیس یا #EF را اعمال کنیم.

اما در این حالت مشکلی وجود دارد. فرض کنید با EF یک user لود کرده‌اید و نام او را به "jamez" تغییر داده‌اید و در آن لحظه age برابر ۲۰ بوده (یعنی ما اصلا در اینجا کاری با age نداریم)
در این مثال قبل از این که savechange را صدا بزنید یک جابی ران شده ونام را به "david" تغییر داده و علاوه بر آن age را نیز به 22 تغییر داده است.

در لینک بالا سیاستی که پیش گرفته شده این است که یا باید name=jamez , age=20 را اعمال کنیم یا name=david, age=22.
در صورتی که به نظر منطقی‌تر این است که name=jamez و age= 22 را اعمال کنیم.

برای این حالت هم می‌توانیم به جای Catch ای که در اینجا آمده از این کد استفاده کنیم:


foreach (var entry in ex.Entries)
{
var proposedValues = entry.CurrentValues;
var databaseValues = await entry.GetDatabaseValuesAsync(cancellationToken);


foreach (var property in proposedValues.Properties)
{
var proposedValue = proposedValues[property];
var databaseValue = databaseValues[property];
var propEnrty = entry.Property(property.Name);
if (propEnrty.IsModified)
{
proposedValues[property] = proposedValue;
}
else
{
proposedValues[property] = databaseValue;
}
}
// Refresh original values to bypass next concurrency check
entry.OriginalValues.SetValues(databaseValues);
}

___________

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

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

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

________
👍10🔥94
نحوه کار کردن با UTC در دیتابیس‌هایی که خارج از ایران مستقر شده‌اند

در یکی از پروژه‌هایمان پایگاه‌ داده‌ ما خارج از ایران مستقر شده است و زمانی که کوئری‌هایی را می‌نویسیم که نیاز به مقایسه تاریخ داده با تاریخ حال حاضر سیستم دارد (سیستم SQL) دچار مشکل می‌شویم.

⁉️چه مشکلی؟
فرض کنید الان ساعت ۲ بامداد روز ۵ مرداد است (با احتساب TimeZone ایران). پایگاه داده ما جایی مستقر شده است که TimeZone اش برای مثال 01:00+ است.
اگر بخواهیم داده‌های ۵ مرداد فراخوانی شود (همین دو ساعت، یعنی تا ۲ بامداد) چه اتفاقی خواهد افتاد؟

🖊 پاسخ:
اگر تاریخ SQL را در ساده‌ترین حالت مورد استفاده قرار دهیم داده‌های روز قبل فراخوانی می‌شوند.
منظور از ساده ترین حالت مثال زیر است:

select CAST( SYSDATETIMEOFFSET() AS Date )

خروجی این کوئری در مثال ما در آن ساعت‌های خاص به جای این که ۵ مرداد باشد برابر است با ۴ مرداد.

⁉️اما راه حل چیست؟
برای این مشکل شما باید مستقیما به #SQL بگویید که چه تایم‌زونی مد نظرتان است:

select SYSDATETIMEOFFSET() AT TIME ZONE 'Iran Standard Time'

برای دیدن لیست TimeZone ها نیز می‌توانید از کوئری زیر استفاده کنید:

SELECT * FROM sys.time_zone_info;

برای بررسی بیشتر موارد مربوطه می‌توانید از این دو مطلب ( یک , دو ) استفاده کنید.

___________

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

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

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

________
👍241🔥1
دردسرهای فعال کردن nullable reference types و راه حل جدید سی‌شارپ

📘قبل از ورژن ۱۱ سی شارپ، اگر شما nullable value type را در پروژه خود فعال می‌کردید، هنگام تعریف یک property اگر این property از نوع nullable بود، به چالشی که قرار است مطرح کنیم بر نمی‌خوردیم، اما اگر nullable نباشد، شما با warning ای مواجه می‌شوید که باید حتما مقدار اولیه را به این property بدهید.

📗چالش‌هایی در مقدار دهی این property ها وجود داشت که باعث شد مایکروسافت در C# 11 از کلمه کلیدی required رو نمایی کند.

🔗 از این لینک (https://vrgl.ir/1aVWd) می‌توانید جهت مشاهده دقیق‌تر چالش‌ها و همچنین نحوه استفاده از این ویژگی جدید استفاده کنید.


___________

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

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

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

________
👍129
امکان Raw String Literals، یکی از جذاب‌ترین‌های C# 11

معمولا زمانی که قصد دارید در متغییری از جنس string داده‌ای قرار دهید که فرمت خاصی دارد، مثلا داخل آن " وجود دارد یا زمانی که قصد دارید در یک sting interpolated کاراکتر کرلی براکت ({}) نیز در خروجی نمایش داده شود.

و یا زمانی که با گذاشتن @ قبل از string قصد دارید با زدن Enter، در خروجی نیز محتوایی ببینید که Enter خورده است ولی مجبورید خطوط بعدی را به اول کد بچسبانید و یا زمانی که قصد دارید یک xml یا json ایجاد کنید و آن را داخل یک string بریزید...

تقریبا باید با نوشتن کدهای بی‌ریخت آپولو هوا کنید!

مایکروسافت در ورژن ۱۱ سی‌شارپ خود امکان Raw String Literals را اضافه کرده است و به تمام این شامورتی بازی ها خاتمه داده است.

جهت مشاهده نحوه کار با این قابلیت می‌تواتید از این لینک استفاده کنید.

___________

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

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

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

________
👍182🔥1
رسیدن به Small Team, Big Impact با تکنولوژی‌های Cross-Platform

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

تیمی را فرض کنید که باید محصولی را بنویسد، در حالت سنتی، شما به تیم‌هایی با زبان‌های متفاوت برای هر کار نیاز دارید، مثلا:

Backend: Java
Frontend: Angular
Android: Kotlin
iOS: Swift
IoT: C++
Windows: C#

اگر هر تیم قرار باشد از یک تکنولوژی با زبان متفاوت کار کند شما تقریبا به ۶ تیم نیاز دارید. همچنین اگر بخواهید تیم نسبت به رفت و آمد نیرو امن باشد باید برای هر کاری حداقل ۳ نفر در تیم‌تان داشته باشید. یک نفر با تسلط ۱۰۰٪، یک نفر با تسلط ۷۰٪ و یک نفر با تسلط ۵۰٪.

بنابراین برای داشتن یک تیم امن شما به حدود ۱۸ نفر نیرو نیاز خواهید داشت تا بتوانید دیسیپلین‌های بالا را پوشش دهید.

شاخص «تحمل‌پذیری» یک تیم نرم‌افزاری

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

مقاله زیر نشان می‌دهد که چطور استفاده از یک تکنولوژی Cross-Platform می‌تواند به شما کمک کند به تحمل‌پذیری بالاتری در تیم خود برسید و بتوانید این کار را حتی با تعداد برنامه‌نویس کمتر انجام دهید.
در حقیقت این مقاله برای یک مخاطب بیزنسی نوشته شده‌است تا توضیح دهد چرا از لحاظ بیزنسی استفاده از این تکنولوژی‌ها بسیار به نفع شرکت است.

توضیحات دقیق‌تر را می‌توانید در اینجا مطالعه کنید.

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

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

_____
👍20🔥4
راهنمای قدم به قدم برای آپتیمایز کردن کدی برای ساخت ۲،۰۰۰،۰۰۰ GUID

فرض کنید با مسئله‌ای مواجه هستید که باید ۲ میلیون گوئد (GUID) در ثانیه بسازید؛ و بسیار مهم است که این کار در کوتاه‌ترین زمان ممکن انجام شود.

در مقاله زیر ابتدا ساده‌ترین کد ممکن که حلقه‌ای ساده برای انجام این کار است نوشته شده، و سپس قدم به قدم با استفاده از تکنیک‌های مختلف آپتیمایز شده. کد ساده‌ای که با آن کار شروع شده حدود ۲۱۲ میلی‌ثانیه زمان می‌برد و پس از اعمال آخرین آپتیمایزیشن این کار ۴۵ میلی‌ثانیه طول می‌کشد.

کل کد و بنچمارک این کار در گیت‌هاب وجود دارد و می‌توانید آن را امتحان کنید و یا حتی راه‌های دیگری برای آپتیمایز کردن آن پیشنهاد دهید.

https://dev.to/mehrandvd/optimizing-guid-generation-step-by-step-225o

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

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

_____
👍26🔥31👏1🤯1
داستان بازگشت به دات‌نت پس از ۱۰ سال!

دا‌ت‌نت در ۲۰ سال گذشته فراز و نشیب‌های زیادی داشته. همه می‌دانیم دات‌نتی که امروز با آن کار می‌کنیم تفاوت‌های بسیار بنیادینی با ابتدای آن دارد. مایکروسافت گریزان از اوپن‌سورس تبدیل شده به یکی از بزرگترین طرفداران پروژه‌های اوپن سورس جهان.
ولی بسیاری از برنامه‌نویسان که با دات‌نت خداحافظی کرده‌بودند از تغییرات اخیر آن خبر ندارند و کماکان از چیزی متنفرند که دیگر آن نیست!
در مقاله زیر که توسط مدیرعامل شرکت Functionland نوشته شده، او توضیح می‌دهد که چطور پس از ۱۰ سال دوباره به دات‌نت برگشته و چرا فکر می‌کند ظاهرا زمان خوبی برای برگشتن به دات‌نت است.
این مقاله در لینکدین با این عنوان منتشر شده:

Is Microsoft becoming the cool company that Google used to be? I shared our recent experience with the new .NET!

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

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

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

_____
👍18🔥9🥰3👏3
داستان ساخت یک تیم نرم‌افزاری نینجایی برای شرکت FxLand!

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

A hard deadline for December 30th!

در پست زیر داستان ساخت چنین تیم نرم‌افزاری که باید در عرض یک هفته ساخته می‌شد را می‌خوانید.
تیمی که باید در عرض مدت سه ماه، یک اپ را برای پلتفرم‌های Android, iOS, Windows و macOS آماده می‌کرد، و بر خلاف داستان‌های معمول ساخت تیم‌های نرم‌افزاری، این بار پایان خوشی داشت!

https://mehrandvd.me/2022/12/18/building-a-ninja-team-for-fxland/


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

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

_____
👍12🔥2👏1
ویژگی های محیط Debug و تفاوت آن با محیط Release

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

در محیط Debug ابزارهایی داریم که نقش پررنگی در پیدا کردن مشکل ایجاد شده دارند، یکی از این ابزارها Breakpoint ها هستند که به ما برنامه نویس‌ها قدرت کارآگاه بودن می‌دهد و می‌توانیم قسمت‌هایی را که به عنوان سرنخ تشخیص داده‌ایم با تمام جزئیات ببینیم.

اگر دوست دارید مسیر کارگاه بودن در کدهایتان را آغاز کنید می‌توانید از این لینک شروع کنید.


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

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

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

________
👍9🔥3👏1🤔1
👍6
Software Philosophy
Photo
سفر قهرمانی #C از روزی که به دنیا آمد!

این قهرمان ما از سال ۲۰۰۲ سفر خودش را همراه با Visual Studio 2002 شروع کرد و تا امروز (۲۰۲۳) حدود ۱۱ بار آپدیت‌های جدیدی را ارائه داده است.
در اوایل کار زبانی شبیه به Java بود و صرفا نسبت به زبان‌های سطح پایین تنها چیزی که اضافه داشت بحث شی‌گرایی بود، اما در ادامه وارد دوره‌های مختلفی شد که نگاهی به این مسیر خواهیم کرد.

〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️

🔹عصر نخستین: تبدیل شدن به یک زبان قابل قبول
C# 1.0, C# 1.2, C# 2.0

در این عصر زبانی را مشاهده می‌کنیم که تقریبا مثل بقیه زبان‌های C-Base است و تفاوت چندانی با آن‌ها ندارد. می‌شود گفت اینجا کار کردن با انواع داده‌ها نسبت به بقیه زبان‌ها آسون‌تر است.
با قابلیت‌های شی‌گرایی شروع کرده و در ادامه به خاطر چالش‌های نشت حافظه و ... ویژگی‌های دیگری را در ورژن‌های بعدی ارائه داد.

〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️


🔹عصر دوم: اضافه شدن امکانات منحصر بفرد
C# 3.0, C# 4.0, C# 5.0

حدود سال ۲۰۰۷ قهرمان ما تصمیم گرفت امکانات منحصر بفردی را ارائه دهد تا این زبان را از بقیه هم ردیف‌های خود متمایز کند.
این امکانات همراه با NET Framework version 3.5 و Visual Studio 2008 وارد بازار شدند.
امکانات نام آشنایی از قبیل Lambda expression ها،Object and collection initializer ها و ... در این ورژن به سی‌شارپ اضافه شدند.

〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️

🔹عصر سوم: باز نویسی کامل کامپایلر با سی‌شارپ (Roslyn)
C# 6.0

سال ۲۰۱۵ سی‌شارپ ۶ همراه با Visual Studio 2015 وارد بازار شد. اینبار سی‌شارپ شروع به اعمال تغییراتی کرد که عمدتا با ذهنیت کد تمیز و ساده همراه بود. از جمله تغییرات مهم هم بازنویسی کامل کامپایلر با خود زبان سی‌شارپ بود.

〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️

🔹عصر چهارم: رضایت طرفداران کد تمیز و ساده
C# 7.0, C# 7.1, C# 7.2, C# 7.3

استارت تغییرات کوچک نسخه ۶ سی‌شارپ خورده شده بود ولی از نسخه ۷ به بعد مایکروسافت تمرکز بیشتری روی این امر داشت و تغییرات همگی دارای یک هدف مهم بودند: آسان و تمیز بودن کدها!
امکاناتی از قبیل tuple,out,ref و ... از جمله این تغییرات بودند.

〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️〰️

🔹عصر پنجم:‌ دنیای Cross-Platform، خداحافظی با NullReferenceException و تلاش برای شبیه شدن به زبان‌های اسکریپت نویسی

C# 8.0, C# 9, C# 10, C# 11

با روی کار آمدن NET Core. مایکروسافت امکاناتی را ارائه داده بود که مبتنی بر توانایی‌های CLR بود.
سال‌ها برنامه نویس‌ها با خطای NullReferenceException دست و پنجه نرم می‌کردند ولی حالا با استفاده درست از قابلیت Nullable refrence type ها می‌شد تا حد قابل قبولی جلوی این اتفاق را گرفت.
در ادامه تغییرات به سمتی رفته که زبان سی‌شارپ را شبیه به یک زبان اسکریپت نویسی کرده بود. حالا می‌شد بدون تعریف کلاس و متد خاصی دستورات ساده را اجرا کرد. همچنین قابلیت‌هایی که در pattern maching به سی‌شارپ اضافه شد باعث ساده‌تر و قابل فهم‌تر شدن سی‌شارپ می‌شد.

🔗 مشاهده جزئیات ورژن های مختلف سی‌شارپ
🔗 مطالعه مقاله در ویرگول

___________

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

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

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

________
👍289🔥3🤩2
ولیدیشنی آسان و بدون درد!

در NET. ابزارهایی برای Validation پراپرتی‌های یک کلاس وجود دارد که نام آشناترین آن‌ها DataAnnotation است.

اما یکی از قوی‌ترین و آسان‌ترین Library ها، ابزار FluentValidation است.

دلیل آسان بودن کار کردن با این کتابخانه strongly-typed بودن آن است.

مثال:
RuleFor(person => person.UserName)
.NotEmpty()
.MinimumLength(3);

🔗 نسخه کامل این مقاله را ‌می‌توانید در اینجا مطالعه کنید. با مطالعه کامل این مقاله می‌توانید از این ابزار در هر جایی استفاده کنید. یکی از کاربردی ترین امکانات آن استفاده در EF Core و Razor Page ها است. همچنین می‌توانید Validation های Customize شده توسط خودتان را نیز تعریف و اعمال کنید.

🔗 داکیومنت FluentValidation

🔗 سورس کد پروژه FluentValidation

___________

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

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

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

________
👍157🔥3👏2
Forwarded from Functionland Announcements (Kel ~ Does Not PM first)
Join us and learn how Blazor MAUI can help you maximize code sharing across Web, Android, iOS, Windows, macOS and more.

This is a must-see event for anyone who knows C#! Come see how Blazor worked its magic for Functionland’s FxFiles app!📲

Gain valuable insights on FxFiles development from our very own CEO Keyvan M.Sadeghi and software architecture Mehran Davoudi.💫

bit.ly/BlazorFxFiles

@functionland
🔥7👍4🎉21
یک تیر و دو نشان با Blazor United

همانطور که می‌دانید در ASP.NET Core دو روش برای بیلد web UI وجود دارد:
۱. روش Server Side Rendering (SSR): در این روش HTML مورد نیاز برای نمایش سمت سرور ساخته می‌شود و همه چیز آماده نمایش سمت کلاینت می‌رسد و کلاینت فقط و فقط باید HTML رندر شده را نمایش دهد. با توجه به اینکه همه کارهای سخت مثل گرفتن دیتا و نحوه نمایش سمت سرور مشخص شده است، وظایف سمت کلاینت خیلی سبکتر است. بنابراین از مزایای این روش سرعت لود بالا و سئو بهتر است.
۲. روش Client Side Rendering (CSR): در این روش اتفاقاتی که روی UI رخ می‌دهد، سمت کلاینت هندل می‌شود. این در حالیست که در روش SSR هر تغییر و اتفاق روی UI باید سمت سرور فرستاده شود تا نتیجه مشخص گردد. به همین دلیل سرور رندرینگ برای پروژه‌هایی که تعامل زیادی با کاربر دارد مناسب نیست و CSR پیشنهاد می‌شود.

در بیشتر پروژه‌ها ترکیبی از این دو روش لازم است، یعنی برخی صفحات تعامل کمتری با کاربر دارند ولی سرعت لود بالایی را می‌طلبند و اینکه لازم است بتوانند به راحتی ایندکس شوند، مانند صفحات home و درباره ما و مانند آن. از طرف دیگر برخی صفحات ارتباط بیشتری با کاربر دارند و پاسخگو بودن در هر لحظه حائز اهمیت است.
اینجاست که Blazor United به کار می‌آید. Blazor United به شما این امکان ر می‌دهد که با معماری واحد از هر کدام از روش های لازم (SSR or CSR)، برای رندرینگ صفحات خود استفاده کنید. حتی به شما این امکان را می‌دهد که از هر دو روش در یک صفحه استفاده کنید.

در این رابطه می‌توانید صحبت‌های Steve Sanderson را بشنوید:

https://youtu.be/48G_CEGXZZM

⁉️ سوالات و نکات خود را در قسمت کامنت با ما در میان بگذارید.

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

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

_______
👍14🔥43
بهبود‌های NET7. فقط از جنس Performance نیست!

یکی از مهم ترین تغییرات در NET7. در بحث Network مشاهده می‌شود که می‌توان آن‌ها را به چهار دسته زیر تقسیم بندی کرد:

۱- بهبود‌های مربوط به HTTP
۲- معرفی API جدید QUIC
۳- امنیت شبکه
۴- مسائل مربوط به WebSocket ها


🔽 بررسی موارد مربوط به HTTP
🔹یکی از تاثیر گذارترین تغییرات مدیریت connection هایی هست که attempt failures در آن‌ها رخ داده است.
🔹دومین مورد Thread safe شدن HttpHeader ها است.
🔹مورد بعدی قابل درک‌تر شدن خطاهای HTTP/2 و HTTP/3:
در لایه های پایینی ممکن است خطاهای خاصی رخ دهد. مثلا امکان دارد در HTTP2 خطای REFUSED_STREAM (0x7) رخ دهد یا در HTTP3 با خطای H3_EXCESSIVE_LOAD (0x0107) مواجه شوید.

اینها همگی خطاهایی هستند که برای کاربر در لایه‌های بالاتر کد معنای خاصی ندارند.
در عوض در NET7. ما می‌توانیم با استفاده از HttpProtocolException که در inner exception کلاس HttpRequestException است خطاهای مربوطه را catch کنیم:

try
{
using var response = await httpClient.GetStringAsync(url);
}
catch (HttpRequestException ex) when (ex.InnerException is HttpProtocolException pex)
{
Console.WriteLine("HTTP error code: " + pex.ErrorCode)
}

زمانی هم که با ریسپانس‌های HttpContent کار می‌کنیم، مستقیم می‌توانیم از HttpProtocolException استفاده کنیم:

using var response = await httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
using var responseStream = await response.Content.ReadAsStreamAsync();
try
{
await responseStream.ReadAsync(buffer);
}
catch (HttpProtocolException pex)
{
Console.WriteLine("HTTP error code: " + pex.ErrorCode)
}

🔽 توضیح مختصری در مورد QUIC
پروتکل QUIC یا Quick UDP Internet Connections یکی از پروتکل‌های لایه transport شبکه است که قبلا مایکروسافت پیاده سازی خود را در قالب MsQuic ارائه داده بود.
بعدها در NET5. در کدهای خود هم از این امکان استفاده می‌کرد.
در NET7. هم امکان استفاده از این قابلیت با استفاده از System.Net.Quic امکان پذیر شده است.

نحوه کارکرد آن نیز در استفاده از سه کلاس زیر خلاصه می‌شود:

QuicListener 
QuicConnection
QuicStream

در این بین تمرکز اصلی ما بر روی مورد اول یعنی (بهبود‌های مربوط به HTTP) بود و توضیح کوتاهی نیز در مورد مورد QUIC ارائه دادیم.

برای مشاهده توضیحات کامل می‌توانید از 🔗 این لینک استفاده کنید.

🔗لینک ویرگول این پست.

___________

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

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

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

________
👍186🔥3👏2
آشنایی با clip-path در CSS

با کمک پراپرتی clip-path در CSS می‌توانید سطحی از المنت را مشخص کنید که در آن سطح نمایش داده شود و خارج آن سطح دیده نشود.
معمولا این کار را با عکس‌ها انجام می‌دهند ولی محدودیتی وجود ندارد و شما می‌توانید در المنت‌های حاوی متن هم از این پراپرتی استفاده کنید.
سطحی که با استفاده از این پراپرتی مشخص می‌شود می‌تواند شکلی مشخص مثل دایره یا بیضی یا ... باشد و یا یه شکلی دلخواه مانند آرم بتمن یا هر چیز دیگری!
برای استفاده راحت‌تر از این پراپرتی،‌ فایرفاکس امکانی را در devTools قرار داده است که inspect هر المنتی را می‌توانید ببینید.

نکته دیگری که خیلی توجه من را جلب کرد این مطلب بود که با کمک این پراپرتی می‌شود خیلی راحت‌تر و زیباتر Transition را اعمال کرد.

اگه می‌خواهید بیشتر در مورد این پراپرتی بدانید،‌ بلاگ زیر را از دست ندهید.

https://ishadeed.com/article/clip-path/

⁉️ سوالات و نکات خود را در قسمت کامنت با ما در میان بگذارید.

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

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

_______
👍113🔥1🥰1😢1
الگوی "try-catch-finally" به زبان ساده

الگوی "try-catch-finally" در سی‌شارپ یک ساختار برنامه‌نویسی است که برای مدیریت خطاها استفاده می‌شود. این دستور در سی‌شارپ نسخه 1.0 معرفی شد و راهی برای مدیریت و بازیابی خطاهایی که ممکن است در حین اجرای یک برنامه رخ‌ دهد ارائه می‌دهد.

فلسفه‌ی پشت الگوی «try-catch-finally» این است که برنامه‌نویسان را قادر می‌سازد تا کدی بنویسند که بتواند خطاهای غیرمنتظره را به شیوه‌ای زیبا و کنترل شده مدیریت کند.

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

دستور "finally" برای انجام عملیات پاکسازی، مانند بستن فایل‌ها یا آزاد کردن منابع، مفید است، که باید بدون توجه به اینکه آیا خطایی وجود دارد یا خیر، انجام شود.

به طور کلی، الگوی "try-catch-finally" یک ابزار قدرتمند برای مدیریت خطاها در برنامه‌های سی‌شارپ است و بخشی ضروری از هر برنامه قوی و قابل اعتمادی است.

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

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

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

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

________
👍51👏1
سرنخ‌های شرطی

در قسمت دوم چگونه کارآگاه کدهایمان باشیم، یاد می‌گیریم باتوجه به قابلیت‌هایی که ابزار Visual Studio به ما می‌دهد بتوانیم از سرنخ‌هایمان بهتر استفاده کنیم.

در این مقاله یاد ‌می‌گیریم که، زمانی که سرنخی را پیدا کردیم، آیا می‌خواهیم تا انتهای سرنخ را برسی کنیم یا برایمان همین اطلاعات که از این قسمت از سرنخ به دست‌آورده‌ایم کافی است؟ در واقع در این قسمت انواع Step ها را در زمان دیباگ کردن که به یک Breakpoint می‌رسیم را بررسی می‌کنیم.

برای این کار از ابزار View Result استفاده می‌کنیم تا بتوانیم در هر مرحله از برسی‌هایمان، نگاهی به مقادیری که قبلا داشته‌ایم هم داشته‌باشیم.

هر کارآگاهی روش مختص به خودش را دارد مثلا، یک نفر ترجیح می‌دهد که اگر یک سرنخ شرایط خاصی را داشت بررسی کند، یک نفر دیگر اگر آن سرنخ چند بار تکرار شود! این امکانات در محیط Visual Studio تعبیه شده که آن‌ها را با اسم Condition Breakpoint تعریف کرده‌اند.

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

برای خواندن قدم دوم می‌توانید از این لینک استفاده کنید.

قسمت اول را می‌توانید اینجا بخوانید.


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

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

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

________
6👍3👏1
تسک‌های پس زمینه خود را به ما بسپارید!

اگه تا به حال سایتی را پیاده سازی کرده باشید، به احتمال زیاد نیاز به سیستمی داشتیه‌اید که در پس زمینه سایت شما کار‌هایی را انجام دهد.

مثلا هر شب ایمیل خاصی را به کاربران بخصوصی بفرستد. یا هر ساعت مجموع فاکتورها را محاسبه کرده و برای مدیر محصول sms کند و ...

برای پیاده سازی این سیستم راه‌های مختلفی مانند Hangfire و ... وجود دارد.

ولی در ASP.Net یکی از ساده‌ترین و در عین حال (به نظر من) ناشناخته‌ترین‌ها! خود سرویس پیشفرض IHostedService است.

می‌تونید از این لینک برای اطلاع از نحوه کار با این سرویس استفاده کنید.

___________

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

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

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

________
👍17🔥61
چگونه در #C دو String را با یکدیگر مقایسه کنیم؟

به نظر سوال ساده‌ای است. اولین چیزی که به ذهن می‌رسد استفاده از == است.

این روش جواب می‌دهد ولی راه بهینه‌ای نیست. مخصوصا زمانی که به lower و upper تبدیل می‌کنید.

〰️〰️〰️〰️〰️
دو روش درست برای این کار وجود دارد.

استفاده از string.Compare

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

〰️〰️〰️〰️〰️

استفاده از String.Equal

در این متد هم می‌توانید از هر دو حالت Ordinal و OrdinalIgnoreCase برای مقایسه استفاده کنید.

〰️〰️〰️〰️〰️

از این لینک می‌توانید برای آشنایی با نحوه کارکرد این روش‌ها و درک بهتر موضوع استفاده کنید.

___________

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

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

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

________
👍134👎2🔥2👏1