Forwarded from DotNetZoom (ALI_1992)
💡#آیا_میدانستید
✅ آیا میدانستید حلقه for سریع تر از list.ForEach یا اصلاحا ForEach Lambda است؟
✅ آیا میدانستید حلقه list.ForEach سریع تر از foreach است؟ زیرا list.ForEach داخل خود از for استفاده میکند ولی foreach داخل خود از مکانسیم Enumerator Iteration که به مراتب سنگین تر است، استفاده میکند.
✅ آیا میدانستید حلقه for که مقدار count آن توسط یک متغیر خوانده شود سریع تر از حلقه for ایی است که مقدار count خود را از list.Count میخواند؟ زیرا سرعت خواندن متد get یک property زمانبر تر از خواندن مقدار یک متغیر است.
مثال :
var count = list.Count;
for (int i = 0; i < count ; i++) { }
از روش زیر سریع تر است
for (int i = 0; i < list.Count ; i++) { }
نتیجه :
در تست انجام شده، سرعت اجرای حلقه ها روی 100 میلیون آیتم به ترتیب زیر است
1- حلقه for که از متغیر count میخواند (زمان : 378 میلی ثانیه)
2- حلقه for که از خاصیت list.Count میخواند (زمان : 415 میلی ثانیه)
3- حلقه list.ForEach یا اصطلاحا ForEach Lambda (زمان : 650 میلی ثانیه)
4- حلقه foreach (زمان : 1136 میلی ثانیه)
همانطور که مشاهده میکنید تفاوت این ها آنقدر محسوس نیست که سرعت پروژه را کاهش دهد.
درنتیجه بهتر از کدی را بنویسید که «تمیز» تر است.
_______________
@DotNetZoom
✅ آیا میدانستید حلقه for سریع تر از list.ForEach یا اصلاحا ForEach Lambda است؟
✅ آیا میدانستید حلقه list.ForEach سریع تر از foreach است؟ زیرا list.ForEach داخل خود از for استفاده میکند ولی foreach داخل خود از مکانسیم Enumerator Iteration که به مراتب سنگین تر است، استفاده میکند.
✅ آیا میدانستید حلقه for که مقدار count آن توسط یک متغیر خوانده شود سریع تر از حلقه for ایی است که مقدار count خود را از list.Count میخواند؟ زیرا سرعت خواندن متد get یک property زمانبر تر از خواندن مقدار یک متغیر است.
مثال :
var count = list.Count;
for (int i = 0; i < count ; i++) { }
از روش زیر سریع تر است
for (int i = 0; i < list.Count ; i++) { }
نتیجه :
در تست انجام شده، سرعت اجرای حلقه ها روی 100 میلیون آیتم به ترتیب زیر است
1- حلقه for که از متغیر count میخواند (زمان : 378 میلی ثانیه)
2- حلقه for که از خاصیت list.Count میخواند (زمان : 415 میلی ثانیه)
3- حلقه list.ForEach یا اصطلاحا ForEach Lambda (زمان : 650 میلی ثانیه)
4- حلقه foreach (زمان : 1136 میلی ثانیه)
همانطور که مشاهده میکنید تفاوت این ها آنقدر محسوس نیست که سرعت پروژه را کاهش دهد.
درنتیجه بهتر از کدی را بنویسید که «تمیز» تر است.
_______________
@DotNetZoom
در پی جنبش "Black Lives Matter" که این روزها در ایالات متحده شدت گرفته نیل فریدمن مدیر عامل گیتهاب اعلام کرد این شرکت در حال تغییر عنوان پیشفرض "master" به "main" است.
شرکتهای دیگر فن آوری هم در حال حذف اصطلاح Master و Slave از کتابخانه ها و نرم افزارهایشان هستند.
گوگل اعلام کرده است عباراتی مثل Black List و White List را حذف می کند و کلماتی چون "Block List" و "Allow List" جایگزین می کند. اتفاقات مشابهی در PHP و Curl و Linkedin و سایر شرکتهای آی تی در جریان است.
تغییر دادن نام متغیرها، متدها یا کتابخانه ها دردسرهای پیش بینی نشده زیادی به همراه دارد و انتظار میرود کار پر هزینه ای باشد. اما به نظر میرسد این تصمیم گرفته شده و حذف عبارت هایی که ریشه در دوران برده داری دارند یا نژاد پرستانه هستند از همین حالا شروع شده است.
شرکتهای دیگر فن آوری هم در حال حذف اصطلاح Master و Slave از کتابخانه ها و نرم افزارهایشان هستند.
گوگل اعلام کرده است عباراتی مثل Black List و White List را حذف می کند و کلماتی چون "Block List" و "Allow List" جایگزین می کند. اتفاقات مشابهی در PHP و Curl و Linkedin و سایر شرکتهای آی تی در جریان است.
تغییر دادن نام متغیرها، متدها یا کتابخانه ها دردسرهای پیش بینی نشده زیادی به همراه دارد و انتظار میرود کار پر هزینه ای باشد. اما به نظر میرسد این تصمیم گرفته شده و حذف عبارت هایی که ریشه در دوران برده داری دارند یا نژاد پرستانه هستند از همین حالا شروع شده است.
قبلا در چند ویدیو استفاده از روش Async در ASP NET Core بررسی شد. این بار از دید سرور به شمارش تعداد Thread ها و مدت زمان تولید Response می پردازیم و رفتار Thread Pool در بکارگیری الگوریتم های Hill Climbing و Starvation Avoidance مشاهده می کنیم.
https://codehaks.com/go/dwt
https://codehaks.com/go/dwt
Forwarded from کدهک
Forwarded from DotNetZoom (ALI_1992)
❇️ نکاتی در مورد تست نویسی روی EF6 / EFCore توسط دیتابیس InMemory
🔸یکی از مزیت های الگوی Repository، قابلیت تست پذیری لایه دیتا به واسه ساختن ریپازیتوری های Fake هست. در واقع ریپازیتوری هایی میسازیم که از (مثلا IRepository) ارث بری میکنه ولی به جای ذخیره سازی در بانک اطلاعاتی، دیتا ها رو به صورت InMemory ذخیره و واکشی میکنه
همچنین روش های دیگری برای اینکار وجود داره مثل Mock کردن DbContext یا DbSet که هر کدوم دردسر ها و محدودیت های خودشو داره تا جایی که حتی بخشیدن عطاش به لقاش منطقی تره
اینجا لیستی از بهترین منابعش رو گلچین کردم (1 و 2 و 3 و 4 و 5 و 6 و 7 و 8 و 9) تا واسه خودمم آرشیو بمونه
🔻توی EFCore به دلیل وجود پروایدر InMemory نیازی به این کار نیست و عمل تست نویسی رو برامون خیلی راحت کرده ولی توی EF6 چون پروایدر InMemory نداریم مجبوریم تن به یکی از این بدیم.
🔹پروژه سورس باز و رایگان Effort یک پروایدر InMemory مخصوص Entity Framework هست (که از نسخه های 5 و 6 EF پشتیبانی میکنه) و امکان Unit Test نویسی برای EF رو براحتی براتون فراهم میکنه و سعی کرده
این کتابخونه از برای دیتابیس خودش از NMemory استفاده میکنه که یک Engine دیتابیس رابطه ای InMemory هست و سعی کرده تا حد زیادی رفتار های یک دیتابیس واقعی رو شبیه سازی کنه و از مواردی از جمله Indexes و Foreign Key Relations و Transaction Handling and Isolation و Stored Procedures و... پشتیبانی میکنه پس به نسبت بقیه روش ها (مثل یه List استاتیک!) در مورد شبیه سازی دیتابیس، رفتار بسیار بسیار قابل اعتماد تری ارائه میده
🔰کار باهاش هم خیلی راحته و از لینک و دردسر ها و محدودیت های پیاده سازی روش های قبلی رو نداره
https://entityframework-effort.net/overview
واسه مطالعه بیشتر هم لینک های زیر خوبن (اینجا و اینجا و اینجا)
نکته:
🔸تمام روش های بالا و اساسا تمام دیتابیس های InMemory (حتی پروایدر InMemory خود EFCore) یه مشکل اساسی دارن و اون هم اینه که هیچ کدوم نمیتونن 100 درصد رفتار یک دیتابیس واقعی رو شبیه سازی کنن. بدیهی هم هست چون که هیچ کدوم نمیتونن تمام قابلیت های دیتابیس واقعی پروژه شما (مثلا SqlServer) رو داشته باشن.
این کمبود ها که تعدادشونم کم نیست بعضی مواقع باعث مشکل میشن مثلا در مورد دیتابیس InMemory خود EFCore :
▪️شما نمیتونین SP های خودتون رو روش اجرا کنین
▪️شما نمیتونین از Transaction های دیتابیسی استفاده کنین
▪️شما نمیتونین از Function های دیتابیسی و یا کلا هر قابلیت منحصر به دیتابیس تون استفاده کنین
▪️قیودی که فقط توی دیتابیس واقعی اعمال میشن و ...
▪️حتی یک کوئری یکسان روی InMemory و دیتابیس واقعی میتونه نتایج متفاوتی داشته باشه (بدلیل تفسیر متفاوتی ازش توسط پروایدر مربوطه انجام میشه)
▪️در واقع تست درون حافظهی LINQ to Objects با تست واقعی LINQ to Entities که روی یک بانک اطلاعاتی واقعی اجرا میشود، الزاما نتایج یکسانی نخواهد داشت
▪️حتی اگه یه متدی که معادل SQL ایی نداره توی کوئری هاتون استفاده کنین، هنگام استفاده از InMemory خطا نمیده ولی موقع دیتابیس واقعی خطای عدم امکان تفسیر به معادل Sql میده
🔹در نتیجه همه اینها پاس شدن یک تست با دیتابیس InMemory الزاما دلیل بر صحت عملکرد پروژه و به معنای درست کار کردن برنامه در دنیای واقعی نیست. و ممکنه همون تست با دیتابیس واقعی به خطا بخوره.
🔸در نهایت هرچند که دیتابیس InMemory رفتار قابل اطمینانی از یه دیتابیس رو نمیتونه شبیه سازی کنه ولی در مورادی که به این تناقض ها بخورد نمیکنیم (معمولا در حد CRUD و یه Storage) میتونه خیلی مفید و کاربردی باشه. فقط نکته اش اینه که حواسمون به این کمبود ها باشه و توصیه میشه که حتما در این گونه موارد که از Integration Test به همراه یک دیتابیس واقعی استفاده کنیم
🔻نظر شما در این باره چیه؟ توی پست های بعدی توضیحات بیشتری خواهم داد.
___________________
@DotNetZoom
🔸یکی از مزیت های الگوی Repository، قابلیت تست پذیری لایه دیتا به واسه ساختن ریپازیتوری های Fake هست. در واقع ریپازیتوری هایی میسازیم که از (مثلا IRepository) ارث بری میکنه ولی به جای ذخیره سازی در بانک اطلاعاتی، دیتا ها رو به صورت InMemory ذخیره و واکشی میکنه
همچنین روش های دیگری برای اینکار وجود داره مثل Mock کردن DbContext یا DbSet که هر کدوم دردسر ها و محدودیت های خودشو داره تا جایی که حتی بخشیدن عطاش به لقاش منطقی تره
اینجا لیستی از بهترین منابعش رو گلچین کردم (1 و 2 و 3 و 4 و 5 و 6 و 7 و 8 و 9) تا واسه خودمم آرشیو بمونه
🔻توی EFCore به دلیل وجود پروایدر InMemory نیازی به این کار نیست و عمل تست نویسی رو برامون خیلی راحت کرده ولی توی EF6 چون پروایدر InMemory نداریم مجبوریم تن به یکی از این بدیم.
🔹پروژه سورس باز و رایگان Effort یک پروایدر InMemory مخصوص Entity Framework هست (که از نسخه های 5 و 6 EF پشتیبانی میکنه) و امکان Unit Test نویسی برای EF رو براحتی براتون فراهم میکنه و سعی کرده
این کتابخونه از برای دیتابیس خودش از NMemory استفاده میکنه که یک Engine دیتابیس رابطه ای InMemory هست و سعی کرده تا حد زیادی رفتار های یک دیتابیس واقعی رو شبیه سازی کنه و از مواردی از جمله Indexes و Foreign Key Relations و Transaction Handling and Isolation و Stored Procedures و... پشتیبانی میکنه پس به نسبت بقیه روش ها (مثل یه List استاتیک!) در مورد شبیه سازی دیتابیس، رفتار بسیار بسیار قابل اعتماد تری ارائه میده
🔰کار باهاش هم خیلی راحته و از لینک و دردسر ها و محدودیت های پیاده سازی روش های قبلی رو نداره
https://entityframework-effort.net/overview
واسه مطالعه بیشتر هم لینک های زیر خوبن (اینجا و اینجا و اینجا)
نکته:
🔸تمام روش های بالا و اساسا تمام دیتابیس های InMemory (حتی پروایدر InMemory خود EFCore) یه مشکل اساسی دارن و اون هم اینه که هیچ کدوم نمیتونن 100 درصد رفتار یک دیتابیس واقعی رو شبیه سازی کنن. بدیهی هم هست چون که هیچ کدوم نمیتونن تمام قابلیت های دیتابیس واقعی پروژه شما (مثلا SqlServer) رو داشته باشن.
این کمبود ها که تعدادشونم کم نیست بعضی مواقع باعث مشکل میشن مثلا در مورد دیتابیس InMemory خود EFCore :
▪️شما نمیتونین SP های خودتون رو روش اجرا کنین
▪️شما نمیتونین از Transaction های دیتابیسی استفاده کنین
▪️شما نمیتونین از Function های دیتابیسی و یا کلا هر قابلیت منحصر به دیتابیس تون استفاده کنین
▪️قیودی که فقط توی دیتابیس واقعی اعمال میشن و ...
▪️حتی یک کوئری یکسان روی InMemory و دیتابیس واقعی میتونه نتایج متفاوتی داشته باشه (بدلیل تفسیر متفاوتی ازش توسط پروایدر مربوطه انجام میشه)
▪️در واقع تست درون حافظهی LINQ to Objects با تست واقعی LINQ to Entities که روی یک بانک اطلاعاتی واقعی اجرا میشود، الزاما نتایج یکسانی نخواهد داشت
▪️حتی اگه یه متدی که معادل SQL ایی نداره توی کوئری هاتون استفاده کنین، هنگام استفاده از InMemory خطا نمیده ولی موقع دیتابیس واقعی خطای عدم امکان تفسیر به معادل Sql میده
🔹در نتیجه همه اینها پاس شدن یک تست با دیتابیس InMemory الزاما دلیل بر صحت عملکرد پروژه و به معنای درست کار کردن برنامه در دنیای واقعی نیست. و ممکنه همون تست با دیتابیس واقعی به خطا بخوره.
🔸در نهایت هرچند که دیتابیس InMemory رفتار قابل اطمینانی از یه دیتابیس رو نمیتونه شبیه سازی کنه ولی در مورادی که به این تناقض ها بخورد نمیکنیم (معمولا در حد CRUD و یه Storage) میتونه خیلی مفید و کاربردی باشه. فقط نکته اش اینه که حواسمون به این کمبود ها باشه و توصیه میشه که حتما در این گونه موارد که از Integration Test به همراه یک دیتابیس واقعی استفاده کنیم
🔻نظر شما در این باره چیه؟ توی پست های بعدی توضیحات بیشتری خواهم داد.
___________________
@DotNetZoom
Docs
Testing with a mocking framework - EF6
Testing with a mocking framework in Entity Framework 6
Forwarded from کدهک
غلغلک دادن یک دایناسور تک شاخ :
بررسی Single-thread بودن Node.js و مقایسه ی آن با ASP NET Core
https://goo.gl/Y5RpRz
بررسی Single-thread بودن Node.js و مقایسه ی آن با ASP NET Core
https://goo.gl/Y5RpRz
آیا قراردادن کلاسها در کتابخانه های جدا به معنی چند لایه کردن پروژه است؟ تصمیم گیری درباره محل قرار گرفتن اجزای پروژه یکی از ساده ترین در عین حال سخت ترین مراحل پیاده سازی هر پروژه ای است. در این ویدیو می بینیم که چطور فایلها را دسته بندی کنیم و یک مدل انعطاف پذیر برای ساختار پروژه در نظر بگیریم.
https://codehaks.com/go/agt
https://codehaks.com/go/agt
آموزش آپلود کردن فایل در ASP NET Core
در این ویدیو تمامی مراحل آپلود کردن فایل در ASP NET Core آموزش داده میشود. فایل با IFormFile از مرورگر کاربر دریافت میشود و در فولدر سرور کپی میشود. در ادامه با محدود کردن دسترسی به فایل آشنا میشوید.
https://codehaks.com/go/eoz
در این ویدیو تمامی مراحل آپلود کردن فایل در ASP NET Core آموزش داده میشود. فایل با IFormFile از مرورگر کاربر دریافت میشود و در فولدر سرور کپی میشود. در ادامه با محدود کردن دسترسی به فایل آشنا میشوید.
https://codehaks.com/go/eoz
Forwarded from DotNetZoom (ALI_1992)
✅ کتابخانه اعتبارسنجی FoolProof برای ASP.NET Core
خیلی وقتا لازم میشه یه سری اعتبارسنجی روی مقادیر ورودی کاربر داشته باشیم. مثلا مقدارش کمتر یا بیشتر از فلان مقدار نباشه و ... تو این شرایط معمولا خودمون میایم و یه Attribute Validation سفارشی ایجاد میکنیم (که تازه اعتبار سنجی سمت کلاینت با jQuery رو هم نداره و فقط سمت سرور چک میشه) ولی الان میخوام یه کتابخونه رو معرفی کنیم که کارتون رو خیلی راحت میکنه.
🔸کتابخانه FoolProof.Core تعداد زیادی Attribute برای اعتبار سنجی مقادیر کاربر داره که همگی علاوه بر Server-side از Client-side Validation هم پشتیبانی میکنن. نسخه قدیمی آن (foolproof) برای ASPNET MVC سابق است.
(آموزش استفاده از آن در سایت dotnettips) ولی این نسخه از ASPNET Core پیشتیبانی میکنه
🔹لیست Attribute های پشتیبانی شده:
✔️ Is
✔️ EqualTo
✔️ NotEqualTo
✔️ GreaterThan
✔️ LessThan
✔️ GreaterThanOrEqualTo
✔️ LessThanOrEqualTo
✔️ Improved required validators:
✔️ RequiredIf
✔️ RequiredIfNot
✔️ RequiredIfTrue
✔️ RequiredIfFalse
✔️ RequiredIfEmpty
✔️ RequiredIfNotEmpty
✔️ RequiredIfRegExMatch
✔️ RequiredIfNotRegExMatch
✔️ In
✔️ NotIn
🔰لینک پکیچ Nuget و مخزن گیتهاب
https://www.nuget.org/packages/FoolProof.Core/
https://github.com/rpgkaiser/FoolProof.Core
#FoolProof #Validation #اعتبارسنجی
__________________
@DotNetZoom
خیلی وقتا لازم میشه یه سری اعتبارسنجی روی مقادیر ورودی کاربر داشته باشیم. مثلا مقدارش کمتر یا بیشتر از فلان مقدار نباشه و ... تو این شرایط معمولا خودمون میایم و یه Attribute Validation سفارشی ایجاد میکنیم (که تازه اعتبار سنجی سمت کلاینت با jQuery رو هم نداره و فقط سمت سرور چک میشه) ولی الان میخوام یه کتابخونه رو معرفی کنیم که کارتون رو خیلی راحت میکنه.
🔸کتابخانه FoolProof.Core تعداد زیادی Attribute برای اعتبار سنجی مقادیر کاربر داره که همگی علاوه بر Server-side از Client-side Validation هم پشتیبانی میکنن. نسخه قدیمی آن (foolproof) برای ASPNET MVC سابق است.
(آموزش استفاده از آن در سایت dotnettips) ولی این نسخه از ASPNET Core پیشتیبانی میکنه
🔹لیست Attribute های پشتیبانی شده:
✔️ Is
✔️ EqualTo
✔️ NotEqualTo
✔️ GreaterThan
✔️ LessThan
✔️ GreaterThanOrEqualTo
✔️ LessThanOrEqualTo
✔️ Improved required validators:
✔️ RequiredIf
✔️ RequiredIfNot
✔️ RequiredIfTrue
✔️ RequiredIfFalse
✔️ RequiredIfEmpty
✔️ RequiredIfNotEmpty
✔️ RequiredIfRegExMatch
✔️ RequiredIfNotRegExMatch
✔️ In
✔️ NotIn
🔰لینک پکیچ Nuget و مخزن گیتهاب
https://www.nuget.org/packages/FoolProof.Core/
https://github.com/rpgkaiser/FoolProof.Core
#FoolProof #Validation #اعتبارسنجی
__________________
@DotNetZoom
www.nuget.org
FoolProof.Core 1.2.1
Migration to asp.net core of the "MVC Foolproof Validation" library.
منظور از Availability در یک سیستم در دسترس بودن آن است.
در یک سرویس آنلاین عواملی مثل رشد تعداد کاربرها ، ترافیک ناگهانی یا وابستگی به سرویس های بیرونی میتواند تاثیر مستقیم در میزان دسترسی داشته باشد. مثلا اگر برای ثبت نام از سرویس پیامک استفاده می کنید و این سرویس از دسترس خارج شود سرویس شما هم عملا بدون استفاده میشود.
وقتی یک سیستم پیچیده میشود و اجزای زیادی دارد رفع باگ و بروز رسانی آن کند صورت میگیرد. بدهی فنی در این سیستم زیاد است و در نهایت دیر یا زود به مشکل برخورد میکند.
تعداد 9 ها یا The Nines اصطلاحی است که جهت نشان دادن درصد دسترسی به یک سیستم استفاده میشود.
برای بدست آوردن تعداد 9 های یک سیستم ابتدا باید با پیاده سازی سیستم مونیتورینگ مناسب میزان Down-Time را اندازه گرفت و با تقسیم آن در بازه زمانی درصد Availability را بدست آورد.
بسته به اینکه چه سرویسی ارائه می کنید میزان دسترسی مورد نیاز تغییر میکند.
سرویس شما به چه میزان Availability نیاز دارد؟
تعداد 9 های سرویس شما چندتاست؟
در یک سرویس آنلاین عواملی مثل رشد تعداد کاربرها ، ترافیک ناگهانی یا وابستگی به سرویس های بیرونی میتواند تاثیر مستقیم در میزان دسترسی داشته باشد. مثلا اگر برای ثبت نام از سرویس پیامک استفاده می کنید و این سرویس از دسترس خارج شود سرویس شما هم عملا بدون استفاده میشود.
وقتی یک سیستم پیچیده میشود و اجزای زیادی دارد رفع باگ و بروز رسانی آن کند صورت میگیرد. بدهی فنی در این سیستم زیاد است و در نهایت دیر یا زود به مشکل برخورد میکند.
تعداد 9 ها یا The Nines اصطلاحی است که جهت نشان دادن درصد دسترسی به یک سیستم استفاده میشود.
برای بدست آوردن تعداد 9 های یک سیستم ابتدا باید با پیاده سازی سیستم مونیتورینگ مناسب میزان Down-Time را اندازه گرفت و با تقسیم آن در بازه زمانی درصد Availability را بدست آورد.
بسته به اینکه چه سرویسی ارائه می کنید میزان دسترسی مورد نیاز تغییر میکند.
سرویس شما به چه میزان Availability نیاز دارد؟
تعداد 9 های سرویس شما چندتاست؟
در بسیاری از پروژه ها لازم است اطلاعات فایل از کاربر دریافت و در سرور ذخیره شود. این ذخیره سازی ممکن است درون فولدر یا در دیتابیس انجام شود. در این مجموعه به آموزش کامل تمامی مراحل آپلود و دانلود فایل در ASP NET Core می پردازیم.
در این دوره آموزشی با تکنیک های آپلود به سرور و ذخیره سازی آن در دیتابیس آشنا می شوید. می آموزید استریم کردن فایل چطور انجام میشود و برای برش دادن عکس یا ایجاد گالری عکس از چه تکنیکهایی استفاده میشود.
مدت دوره 140 دقیقه
https://codehaks.com/go/fmn
در این دوره آموزشی با تکنیک های آپلود به سرور و ذخیره سازی آن در دیتابیس آشنا می شوید. می آموزید استریم کردن فایل چطور انجام میشود و برای برش دادن عکس یا ایجاد گالری عکس از چه تکنیکهایی استفاده میشود.
مدت دوره 140 دقیقه
https://codehaks.com/go/fmn
آموزش ایجاد Global Tools در دات نت
یک Global Tool در اصل یک برنامه کنسول است که میتوانید آن را از هر جایی در سیستم اجرا کنید. این ابزار شباهت زیادی به پکیج های گلوبال در NPM دارند و می توانید برای پیاده سازی ابزارهای برنامه نویسی و کارهای عمومی از آنها استفاده کنید.
https://codehaks.com/go/glb
یک Global Tool در اصل یک برنامه کنسول است که میتوانید آن را از هر جایی در سیستم اجرا کنید. این ابزار شباهت زیادی به پکیج های گلوبال در NPM دارند و می توانید برای پیاده سازی ابزارهای برنامه نویسی و کارهای عمومی از آنها استفاده کنید.
https://codehaks.com/go/glb
ساده بگیرید!
در اواخر جنگ جهانی دوم ارتش سرخ ماهانه 1300 تانک T-34 تولید می کرد. این تانک سبک بود و تعداد قطعات کمی داشت. اشکالاتی در طراحی داشت که باعث خرابی در مسافتهای طولانی میشد. با این وجود مهندسان روسی تصمیم گرفتند اشکالات را برطرف نکنند چون خط تولید را تغییر میداد و از سرعت تولید کم میشد. در عوض به همراه تانک قطعات یدک قرار میدادند. از آنجا که طراحی ساده ای داشت افراد با مهارت کم می توانستند در میدان جنگ تعمیرات را انجام دهند.
در سمت دیگر تانکهای Panther و Tiger آلمان از با کیفیت ترین ابزار نبرد بود. صدها کیلومتر بدون مشکل فنی حرکت می کرد و توپخانه سنگین آن می توانست انواع موانع را نابود کند. اما تولید این تانکها سخت بود. هر ماه کمتر از 200 تانک تولید میشد. در زمانی که آلمان با مشکل مواد خام مواجه شد تعمیر تانکهای قبلی هم ممکن نبود چون از نظر فنی پیچیده بود و نیاز به متخصص و زمان زیادی بود تا تانک دوباره به میدان برگردد. در نتیجه بسیاری از آنها با کوچکترین مشکل فنی در میدان جنگ رها میشد.
در مهندسی اصل KISS یا Keep it simple, Stupid می گوید بهتر است همه چیز را آنقدر ساده طراحی کنید تا احمق ها هم بتوانند از آن استفاده کنند.
بسیاری از برنامه نویسها سعی می کنند به کدهایشان پیچیدگی اضافه می کنند تا حرفه ای دیده شوند. تصور عمومی این است که اگر پروژه ای ساده پیاده شده باشد کار مبتدی است. این برنامه نویسها هر روز کدهایشان را بررسی می کنند تا فلان الگوی طراحی که در کتاب خوانده اند را به آن اضافه کنند. برای این افراد نشان دادن کد ساده به دیگران مایه ننگ است. اما این افراد نمی دانند که فردا باید باگهای همین کدهای پیچیده را خودشان برطرف کنند و در زمانی که سرور پایین آمده و هر ثانیه هم حیاتی است در انبار کاه باید به دنبال سوزن باشند. این افراد داکیومنت تحویل نمی دهند 6 ماه بعد خودشان هم نمی دانند در پروژه چه کردند و نیستند که پاسخگو باشند.
شاید تابلو های نقاشی یا جواهرات زینتی با پیچدگی و جزئیات زیاد زیباتر جلوه کند اما در مهندسی زیبایی در سادگی است. اگر به اطرافتان نگاه کنید می بینید که ابزاری دوست دارید و هر روز از آنها استفاده می کنید ساده طراحی شده اند. مسئله ما صرفا خلق یک محصول نیست بلکه باید برای خرابی آن هم برنامه داشته باشیم.
هرچقدر حرفه ای تر باشید از ساده ترین روشها برای حل پیچیده ترین مشکلات استفاده می کنید. پس قبل از نوشتن هر خط کد و اضافه کردن پیچیدگی بیشتر از خود بپرسید :
" آیا واقعا لازمش دارم؟"
در اواخر جنگ جهانی دوم ارتش سرخ ماهانه 1300 تانک T-34 تولید می کرد. این تانک سبک بود و تعداد قطعات کمی داشت. اشکالاتی در طراحی داشت که باعث خرابی در مسافتهای طولانی میشد. با این وجود مهندسان روسی تصمیم گرفتند اشکالات را برطرف نکنند چون خط تولید را تغییر میداد و از سرعت تولید کم میشد. در عوض به همراه تانک قطعات یدک قرار میدادند. از آنجا که طراحی ساده ای داشت افراد با مهارت کم می توانستند در میدان جنگ تعمیرات را انجام دهند.
در سمت دیگر تانکهای Panther و Tiger آلمان از با کیفیت ترین ابزار نبرد بود. صدها کیلومتر بدون مشکل فنی حرکت می کرد و توپخانه سنگین آن می توانست انواع موانع را نابود کند. اما تولید این تانکها سخت بود. هر ماه کمتر از 200 تانک تولید میشد. در زمانی که آلمان با مشکل مواد خام مواجه شد تعمیر تانکهای قبلی هم ممکن نبود چون از نظر فنی پیچیده بود و نیاز به متخصص و زمان زیادی بود تا تانک دوباره به میدان برگردد. در نتیجه بسیاری از آنها با کوچکترین مشکل فنی در میدان جنگ رها میشد.
در مهندسی اصل KISS یا Keep it simple, Stupid می گوید بهتر است همه چیز را آنقدر ساده طراحی کنید تا احمق ها هم بتوانند از آن استفاده کنند.
بسیاری از برنامه نویسها سعی می کنند به کدهایشان پیچیدگی اضافه می کنند تا حرفه ای دیده شوند. تصور عمومی این است که اگر پروژه ای ساده پیاده شده باشد کار مبتدی است. این برنامه نویسها هر روز کدهایشان را بررسی می کنند تا فلان الگوی طراحی که در کتاب خوانده اند را به آن اضافه کنند. برای این افراد نشان دادن کد ساده به دیگران مایه ننگ است. اما این افراد نمی دانند که فردا باید باگهای همین کدهای پیچیده را خودشان برطرف کنند و در زمانی که سرور پایین آمده و هر ثانیه هم حیاتی است در انبار کاه باید به دنبال سوزن باشند. این افراد داکیومنت تحویل نمی دهند 6 ماه بعد خودشان هم نمی دانند در پروژه چه کردند و نیستند که پاسخگو باشند.
شاید تابلو های نقاشی یا جواهرات زینتی با پیچدگی و جزئیات زیاد زیباتر جلوه کند اما در مهندسی زیبایی در سادگی است. اگر به اطرافتان نگاه کنید می بینید که ابزاری دوست دارید و هر روز از آنها استفاده می کنید ساده طراحی شده اند. مسئله ما صرفا خلق یک محصول نیست بلکه باید برای خرابی آن هم برنامه داشته باشیم.
هرچقدر حرفه ای تر باشید از ساده ترین روشها برای حل پیچیده ترین مشکلات استفاده می کنید. پس قبل از نوشتن هر خط کد و اضافه کردن پیچیدگی بیشتر از خود بپرسید :
" آیا واقعا لازمش دارم؟"
Forwarded from DotNetZoom (ALI_1992)
✅ معرفی Design Pattern ها به همراه مثال در زبان های مختلف
یکی از بهترین سایت هایی که میشه به عنوان مرجع برای #DesignPattern ها بهش نگاه کرد سایت زیر هست.
این سایت خیلی روون و ساده الگو های برنامه نویسی رو توضیح داده، براشون مثال زده و توی زبان های مختلفی از جمله #C و JavaScript و Java و Python و ... پیاده سازیشون کرده
https://refactoring.guru/design-patterns/catalog
🔰2تا ریپوی زیر هم پیاده سازی ایی از این دیزاین پترن ها در سی شارپ هست
1️⃣ https://github.com/exceptionnotfound/DesignPatterns
2️⃣ https://github.com/HamidMosalla/CSharpDesignPatterns
_____________________
@DotNetZoom
یکی از بهترین سایت هایی که میشه به عنوان مرجع برای #DesignPattern ها بهش نگاه کرد سایت زیر هست.
این سایت خیلی روون و ساده الگو های برنامه نویسی رو توضیح داده، براشون مثال زده و توی زبان های مختلفی از جمله #C و JavaScript و Java و Python و ... پیاده سازیشون کرده
https://refactoring.guru/design-patterns/catalog
🔰2تا ریپوی زیر هم پیاده سازی ایی از این دیزاین پترن ها در سی شارپ هست
1️⃣ https://github.com/exceptionnotfound/DesignPatterns
2️⃣ https://github.com/HamidMosalla/CSharpDesignPatterns
_____________________
@DotNetZoom
Forwarded from کدهک
آشنایی با Docker
داکر ابزاری برای توزیع و اجرای نرم افزار است که مشکل سازگاری با سیستم عامل های مختلف را حل میکند. این ابزار امروزه همه جا مورد استفاده قرار میگیرد و خوب است به عنوان توسعه دهنده ی نرم افزار درباره آن بیشتر بدانید. در این ویدیو به معرفی داکر می پردازیم و در ادامه از Docker در یک پروژه ASP NET Core استفاده می کنیم.
https://cutt.ly/ortrfXx
داکر ابزاری برای توزیع و اجرای نرم افزار است که مشکل سازگاری با سیستم عامل های مختلف را حل میکند. این ابزار امروزه همه جا مورد استفاده قرار میگیرد و خوب است به عنوان توسعه دهنده ی نرم افزار درباره آن بیشتر بدانید. در این ویدیو به معرفی داکر می پردازیم و در ادامه از Docker در یک پروژه ASP NET Core استفاده می کنیم.
https://cutt.ly/ortrfXx
Forwarded from کدهک
آشنایی با Docker - قسمت دوم
در این ویدیو با استفاده از Docker دیتابیس Redis رو نصب و اجرا می کنیم
سپس از پروژه ASP NET Core یک Image داکر تهیه می کنیم.
https://tinyurl.com/cdhk-docker2
در این ویدیو با استفاده از Docker دیتابیس Redis رو نصب و اجرا می کنیم
سپس از پروژه ASP NET Core یک Image داکر تهیه می کنیم.
https://tinyurl.com/cdhk-docker2
با استفاده از قابلیت Expression Bodied Members می توانید کدهای کمتر و مرتب تری در سی شارپ داشته باشید.
https://codehaks.com/go/bfq
https://codehaks.com/go/bfq
Forwarded from اِسکیلی Skilly (مهدی کرامتی)
🔈🤑 تخفیف 40% کلیه پکیج های آموزش ویدئویی برنامه نویس - ویژه تیرماه 99
کد تخفیف: Tir99
تاریخ انقضای کد تخفیف فوق: جمعه، 13 تیر 99، ساعت 12 شب
لازم به ذکر است قیمت پکیج های آموزشی نیز جهت رفاه حال شما عزیزان کاهش یافته است، بدین صورت که پس از اعمال کد تخفیف فوق، قیمت هر یک از پکیج های ASP.NET MVC و ASP.NET Core و Angular 8 مبلغ 90.000 تومان، قیمت پکیج سی شارپ سطح 1 مبلغ 60.000 تومان، و پکیج های آموزش مفاهیم وب مبلغ 30.000 تومان خواهد بود.
همچنین، آموزش های ارائه شده در پکیج های آموزش ASP.NET Core، بدون هیچ تغییری در ASP.NET Core 3.1 نیز قابل استفاده است.
با تقدیم احترام
#مهدی_کرامتی
#تخفیف
@barnamenevis_net
@barnamenevis_org
کد تخفیف: Tir99
تاریخ انقضای کد تخفیف فوق: جمعه، 13 تیر 99، ساعت 12 شب
لازم به ذکر است قیمت پکیج های آموزشی نیز جهت رفاه حال شما عزیزان کاهش یافته است، بدین صورت که پس از اعمال کد تخفیف فوق، قیمت هر یک از پکیج های ASP.NET MVC و ASP.NET Core و Angular 8 مبلغ 90.000 تومان، قیمت پکیج سی شارپ سطح 1 مبلغ 60.000 تومان، و پکیج های آموزش مفاهیم وب مبلغ 30.000 تومان خواهد بود.
همچنین، آموزش های ارائه شده در پکیج های آموزش ASP.NET Core، بدون هیچ تغییری در ASP.NET Core 3.1 نیز قابل استفاده است.
با تقدیم احترام
#مهدی_کرامتی
#تخفیف
@barnamenevis_net
@barnamenevis_org