Web Devs
640 subscribers
218 photos
22 videos
17 files
233 links
Articles, News, Jokes, Quotes, Back-End and UI/UX for web developers.
Github : https://github.com/fullStackDevsGroup
Advertising: @adsfullStackDevs
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
#GitHub
#Mobile

GitHub Mobile is officially leaving beta and entering general availability today. Learn more and download: https://github.com/mobile/

@fullStackDevs
#css

CSS Custom Properties

Learn CSS Variables in 5 minutes - A tutorial for beginners

read more

@fullStackDevs
#DI
#Ioc
#DIP
#SOLID

✳️ Captive Dependency

🔹 در این پست به توضیح مشکلی میپردازیم که معمولا به دلیل اشتباه کانفیگ کردن سرویس های اپلیکیشن در IOC Container رخ میدهد.

🔸 تزریق وابستگی (Dependency Injection) از مفاهیم مهمی هست که باید به آن آشنا باشیم. برای استفاده از این مفهوم و مفاهیم مرتبط با آن مثل IOC ,DIP
در اپلیکیشن، ابزار ها یا فریم وورک هایی وجود دارند که به آنها IOC Container می گوییم.
🔻اگر با DI و IOC و DIP آشنا نیستید مقالات لینک شده را مطالعه کنید.
🔸مدیریت lifeTime سرویس های اپلیکیشن امری است که به کمک IOC Container مقدر میشود اما وظیفه register کردن و معرفی کردن وابستگی ها به IOC Container بر عهده Developer میباشد.
🔸 اشتباه کانفیگ کردن lifeTime برای سرویسی در اپلیکیشن، که خود دارای وابستگی هایی، با lifeTime ای کمتر از lifeTime سرویس اصلی هستند، باعث به وجود آمد مشکل Captive Dependency میشود.
🔹 برای درک مسئله به مثال زیر توجه کنید
فرض کنید دو کلاس با نام های
ScopedDependency
SingletonDependency
داریم.
🔸 همانطور که از نام ها مشخص است کلاس SingletonDependency به صورت Singleton به DI Contaner معرفی شده و در طول عمر اپلیکیشن فقط یک نمونه از آن ساخته میشود.
🔸 کلاس ScopedDependency هم به صورت Scoped در IOC Container معرفی شده و به ازای هر connection به سرور فقط یک نمونه از آن به ازای هر کانکشن و درخواست ساخته میشود.
🔸 بیایید فرض کنیم که چه اتفاقی می افتد اگر کلاس SingletonDependency برای انجام برخی کارها در درون خود به کلاس ScopedDependency وابسته باشد و ما نیاز داشته باشیم که کلاس ScopedDependency در درون آن تزریق کنیم.
🔹 با رجیستر کردن کلاس ScopedDependency بصورت Scoped انتظار این است که روند نمونه سازی از این کلاس Scoped گونه باشد. اما وقتی این کلاس را در یک کلاس دیگر که به صورت Singleton رجیستر شده است تزریق میکنید، قوائد بازی را برهم زده و باعث میشوید که کلاس Singleton مورد نظر در تمام طول عمر خود فقط از یک نمونه قدیمی از وابستگی خود استفاده کند. این نمونه قدیمی برای اولین بار در هنگام ساخته شدن کلاس Singleton ای که در درون آن وجود دارد ساخته شده و به زندگی خود به لطف حضور در یک کلاس Singleton ادامه میدهد.
پس در نتیجه برای SingletonDepedency ما فقط یک نمونه از ScopedDependency ساخته میشود و در تمام طول عر خود از همان نمونه قدیمی استفاده میکند.
🔸در نگاه اول شاید این مشکل حاد به نظر نرسد اما باید بدانید که در یک پروژه که پیچیدگی های خاص خود را دارد باعث بروز مشکلات و باگ های فاحش خواهد شد.

🔸 این مشکل توسط Developer با اشتباه کانفیگ کردن lifeTime برای سرویس های اپلیکیشن رخ میدهد و حتی IOC Container هایی مانند Autofac نمی توانند از آن جلوگیری کنند.
اما IOC Container پیشفرض Asp.Net Core سعی کرده است تا حدی از این مشکل جلوگیری کند.
🔸 فعال سازی این ویژگی برای IOC Container پیشفرض اختیاری بوده و در صورت فعال سازی آن، نکته ای که باعث بهبود performance میشود این است که فقط در محیط و هنگام Development از آن استفاده کنید.
🔻همچنین باید بدانید که این ویژگی فقط از بروز Captive Dependency برای سرویس هایی که به صورت Scoped رجیستر شده اند، جلوگیری میکند و باعث صادر شدن استثنای InvalidOperationException میشود. و برای سرویس های که به صورت Transient رجیستر شده اند کار نمیکند.

❇️ برای فعال سازی این ویژگی در کلاس Program بدین شکل عمل کنید.

public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.UseDefaultServiceProvider((env, c) =>
{
if (env.HostingEnvironment.IsDevelopment())
{
c.ValidateScopes = true;
}
});
}

@FullStackDevs
#multithread
#multitask
#thread
#task
#async

✳️ Multitasking vs Multithreading

🔻آیا تا به حال مدت ها منتظر کسی یا کاری بوده اید ، در حالی که هیچ کاری انجام نمی دهید و فکر می کنید که می توانستید کار دیگری انجام دهید؟ این زمانی است که اهمیت multithreading را درک می کنید. انتظار وقتی آسانتر می شود که بتوانید کارهای دیگری را انجام دهید در حالی که منتظر کسی یا چیز دیگری هستید. برای روشن تر شدن مفهوم چند وظیفه ای ، مادر خود را در نظر بگیرید. از زمان به دنیا آمدن ، من مادرم را دیده ام که همزمان چندین کار را انجام می دهد و همیشه تعجب می کنم که او چگونه این کار را انجام می دهد؟ او خانه را تمیز می کند ، لباس های می شوید و همزمان غذا را آماده می کند.

▪️در برنامه نویسی ، شما با وضعیت های بسیاری روبرو میشوید که مجبور می شوید از multithreading و multitasking استفاده کنید.

به عنوان مثال ، هنگام خواندن یک file بزرگ ، بهتر است به کاربر اجازه دهید کارهای دیگری انجام دهد. از این رو ، چه تفاوتی بین multithreading و multitasking وجود دارد؟ آیا آنها یکسان هستند؟

🔸Multitasking

به این معنی است که به کاربر اجازه می دهد چندین task را همزمان انجام دهد. کاربر می تواند ضمن نوشتن یک وبلاگ ، به موسیقی در حال اجرا در پس زمینه گوش دهد. بنابراین کامپیوتر چندین کار را برای کاربر انجام می دهد. هر task به منابع نیاز دارد. از آنجا که کامپیوتر از منابع محدودی برخوردار است ، تعداد کارهای انجام شده در همان زمان نیز محدود است.

🔹Multithreading

ترد ها مربوط به بالاترین سطح کد اجرا شده توسط یک پردازنده هستند ، بنابراین با بسیاری از تردها، سی پی یو شما می تواند همزمان چندین کار را انجام دهد. تمام CPU ها تردهای فعال دارند و هر فرایندی که در رایانه شما انجام می شود حداقل یک ترد واحد دارد.
ترد برای انجام task های متعدد استفاده می شود. هر task می تواند چندین thread داشته باشد. در یک برنامه multithreaded کاربر می تواند در مدت زمان کوتاتر نسبت به یک برنامه single thread کارهای بیشتری انجام دهد. امروزه تقریباً در هر برنامه
از multiple threading استفاده شده است. یک برنامه یا یک process می تواند یک user interface thread داشته باشد که در تعامل با کاربر باشد
و background worker threads که کارهای دیگری را انجام می دهند.

🔵 حال می بینیم که چگونه multithreading و multitasking در C # کار می کند.

▪️یک task چیزی است که شما می خواهید انجام شود. ترد یکی از موارد ممکن است که آن task را انجام میدهد.

▫️در دات نت Task یک عملیات واحد را نشان می دهد و معمولاً بصورت غیر همزمان (asynchronous) انجام می شود.

▪️تسک آبجکت Task Object ها یکی از کامپوننت های اصلی task-based asynchronous pattern است که برای اولین بار در .NET Framework 4 معرفی شده است.

▫️ کارهایی که توسط یک task انجام می شود به طور معمول بصورت غیر همزمان برروی
یک thread از threadpool اجرا می شود. تسک ها برای پردازنده های چند هسته ای تنظیم شده اند.

▪️تسک Task ها توسط task library تنظیم می شوند تا از thread های threadpool به روشی بسیار کارآمدتر از زمانی که خود از thread استفاده میکنید ،استفاده میکند.
ایجاد thread بسیار گران است ، Task ها صف خواهند شد و از thread ها استفاده مجدد میشود. بنابراین هنگامی که مثلا از یک thread در انتظار network I/O است ، در واقع می توان از آن برای اجرای یک کار دیگر استفاده کرد. شما فقط می توانید تعداد thread هایی را که با تعداد هسته پردازنده شما مطابقت دارد ، اجرا کنید (به طور همزمان)

همیشه سعی کنید از task استفاده کنید و اگر با مشکلی روبرو هستید که باعث می شود خودتان بخواهید thread را کنترل کنید (احتمالاً 1٪) سپس از thread ها استفاده کنید.

@fullStackDevs
#AsynchronousProgramming
#Async #Await
#Tasks

✳️ Async/Await on a Separate Thread

🔸 اجرای عملیات های long-running به صورت غیر همزمان (asynchronous) در سی شارپ با mark کردن آنها با استفاده از کلمه کلیدی های async/await انجام میشود.
🔹 متد هایی که یک Task را به عنوان خروجی باز میگردانند با استفاده از این کلمه کلیدی ها به صورت غیر همزمان اجرا میشوند.
درواقع از await میتوان به همراه یک awaitable argument استفاده کرد که یک عملیات asynchronous است.
دو نوع رایج awaitable argument ها در دات نت ،
Task , Task<T>
میباشد.
🔹 اجرای متدهای long-running به صورت همزمان (synchronous)، باعث بلاک شدن thread جاری تا زمان اتمام آن متد میشود.
🔹همچنین در اپلیکیشن هایی که رابط گرافیکی کاربری دارید اجرای متد های long-running به صورت همزمان، سبب بلاک شدن thread اجرا کننده رابط گرافیکی (UI) میشود و تا زمان اتمام اجرای آن متد رابط کاربری به صورت فریز شده باقی میماند.
اما چنین متدی که خروجی آن یک Task نیست و نمیتوان آنرا با استفاده از async و await به صورت asynchronous اجرا کرد، را چگونه به یک متد asynchronous تبدیل کنیم تا در یک thread جدا اجرا شود.
اینجاست که Task.Run به کمک ما می آید.
🔸 متد Run از کلاس Task باعث اجرا شدن کد های صف شده در یک thread جدا میشود.
معمولا این thread جدید ازthread pool می آید .
▫️ در واقع thread pool مجموعه ای از worker thread هایی است که توسط .net برای اجرای اپلیکیشن، مدیریت میشوند.
▫️ هم چنین یک worker thread یک thread ای است که به درخواست یک client برای انجام کاری فعال میشود.
🔹 مهمترین نکته این که Task.Run به عنوان خروجی یک Task باز میگرداند که این بدین معنی است که می توانید آنرا await کنید.
متد Task.Run دارای overload های متفاوتی است که به عنوان پارامتر یک Action delegate یا یک Func delegate دریافت میکند.
🔸 تاکنون دانستیم که صدا زدن متد Task.Run برای اجرای یک متد long-running باعث اجرا شدن این متد بروی یک thread جدید در thread pool میشود اما پس از اتمام اجرای این متد long-running بقیه و ادامه کد ها بروی کدامین thread اجرا خواهد شد⁉️
🔸 در اکثر مواقع می خواهیم تا ادامه کار بروی thread اصلی ادامه پیدا کند مخصوصا زمانی که اپلیکیشن دارای یک رابط کاربری گرافیکی میباشد و میخواهیم بعد از انجام شدن آن متد long-running عناصری را بروی رابط گرافیکی در thread اصلی آپدیت نماییم. برای آنجام این کار کافیست Task.Run را await نمایید زیرا زمانی که که یک Task را await می کنید اطلاعات context جاری از SynchronizationContext گرفته میشود تا دوباره به thread اصلی اپلیکیشن باز گردد.
🔻زمانی که روی یک متد ای که به صورت Async اجرا میشود ConfigureAwait(false) قرار میدهید. بازگشت به context اصلی صورت نمیگیرد.

🔹 اما SynchronizationContext چیست و کار آن چه میباشد؟
🔸 هنگامی که با یک اپلیکیشن UI based کار میکنید وابستگی و ارتباط بین thread ها مسئله بسیار مهمی است
زمانی که با چنین اپلیکیشن هایی کار میکنید محدودیتی که وجود دارد این است که عناصر و کنترلر های صفحه توسط UI thread ساخته شده یا تغییر و آپدیت شوند و اگر نیاز باشد که به عنوان مثال 10 تغییر بروی عناصر صفحه صورت گیرد، این عملیات ها در صف قرار میگیرند تا به صورت متوالی توسط UI thread انجام شوند.
این محدودیت برای کمک به UI framework جهت جلوگیری از پیچیدگی های هماهنگی و مدیریت بین thread های مختلف برای آپدیت عناصر و کنترلر های صفحه صورت گرفته است.
و SynchronizationContext ارتباط با UI thread را به صورت منظم مرتب میکند.
در Asp.net Core اما SynchronizationContext برایر null میباشد.

✳️ درا این قسمت یک overview در مورد Task.Run پرداختیم تا در قسمت بعدی به عملیات های I/O و CPU bound پرداخته و با مفاهیم Asynchronous بیشتر آشنا میشویم.


@FullStackDevs
#linkedin
#RemoveAllMessage

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

1- به صفحه پیامهایتان بروید.
2-کروم console را باز کنید.
3-قطعه کد زیر را در کنسول paste کنید .


;(function () {
setInterval(() => {
let deleted = false;
let dropdowns = document.querySelectorAll('artdeco-dropdown-item');
for (let i = 0; i < dropdowns.length; i++){
let txt = dropdowns[i].textContent.trim();
if (txt === 'Delete') {
deleted = true;
dropdowns[i].click();
}
}
if (deleted){
setTimeout(() => {
let messageModal = document.querySelector('.msg-modal-delete-convo');
let deleteBtn = messageModal.querySelector('.artdeco-button--primary');
deleteBtn.click();
}, 500)
} else {
let messageConverstionCard = document.querySelector('.msg-conversation-card__list-action-icon');
messageConverstionCard.click();
}
}, 1000);
}());


@fullStackDevs
#IOBound
#CPU_Bound
#AsynchronousProgramming
#Async #Await

✳️ CPU vs. I/O-Bound Code

🔸 برای تشخیص اینکه چه زمانی از Task.Run استفاده کنیم. ابتدا نیاز به دانستن تفاوت بین کد های CPU-bound و I/O-bound داریم.

🔹 CPU-Bound
🔸 وقتی کدی CPU-Bound باشد اساسا این منظور را میرساند که پردازنده کامپیوتر یا به طور خاص thread ای در پردازنده، جایی است که به واسطه اجرای آن کد دچار ترافیک و صرف زمان زیاد خواهد شد.
▫️ در زمان اجرای کد های CPU-Bound پردازنده تا جای ممکن با سرعت به اجرای چنین کدهایی میپردازد اما با این وجود باز هم مدت زمانی که صرف اجرای چنین کدهایی خواهد شد قابل توجه خواهد بود. به عبارت دیگر در اجرای چنین کدهایی پردازنده محلی است که شما را از اجرای سریعتر باز میدارد و میتوانیم بگوییم که اجرای این کد ها باعث delay در پردازنده خواهد شد.

🔹 I/O-Bound Code
🔸 در مقابل در کد های I/O-Bound نرخ انتقال داده در دستگاه های ورودی و یا خروجی و یا عملیات های ورودی و خروجی عاملی است که باعث ایجاد delay خواهد شد.
مانند خواندن یا ذخیره کردن داده ها از یک فایل یا برقراری ارتباط با سرور جهت دانلود یا آپلود و ...
▫️ در همه این عملیات ها پردازنده تا حدودی بیکار است به این خاطر که منتظر اتمام ارسال و دریافت داده ها میباشد. در صورتی که عملیات I/O-Bound یک ارتباط با یک سرور خارجی باشد و به هر دلیلی اتصال به درستی برقرار نشود احتمالا پردازنده کاملا بیکار خواهد بود تا زمانی که ارتباط برقرار شود.

🔸 همانطور که متوجه شدید گرچه در هر دو عملیات های CPU vs. I/O-Bound تاخیر (delay) وجود دارد اما این عملیات ها در ذات کاملا متفاوت هستند.

✳️ Nature of Asynchronous operation

اصولا استفاده از Task,Run برای اجرای یک عملیات در thread ای جدا، برای عملیات های CPU Bound مسمر ثمر است، ام نه برای عملیات های I/O Bound. ولی چرا ⁉️

🔸 اکثر کامپیوترهای امروزی چندین هسته دارند که کمی شبیه این است که انگار چندین پردازنده دارند. زمانی که اپلیکیشن شروع به اجرا شدن میکند دسته ای از thread ها توسط .Net runtime ساحته میشود تا اپلیکیشن از آنها استفاده کند.
تعداد این thread ها به تعداد هسته های پردازنده کامپیوتر مرتبط است
در نتیجه اگر thread اصلی اپلیکیشن مشغول باشد می توانیم با استفاده از Task.Run عملیات سنگین خود را به لطف پردازنده چند هسته ای مان در thread ای جدا اجرا کنیم .

🔻توجه داشته باشید که thread و core گرچه مرتبط هستند اما با هم تفاوت دارند .
یک thread یک مفهوم نرم افزاری است و یک core یک ابزار سخت افزاری .
▫️ این امکان وجود دارد تا هر چند thread ای که میخواهید بسازید اما تعداد core ها ثابت است .

🔸 وقتی Task.Run را صدا میزنید یک thread از thread pool (اگر در دسترس باشد) اجرا خواهد شد و این امر بهبود عملکردی را برای اپلیکیشن به ارمغان می آورد.

🔸 وقتی که یک عملیات I/O Bound را با استفاده از Task.Run اجرا میکنید بر روی یک thread از thread pool (اگر در دسترس باشد) اجرا خواهد شد ولی در اون thread هم باز باید برای دریافت داده ها، منتظر اتمام عملیات I/O باشد.
اینکار ممکن است روشی سریع و آسان برای پاسخگو نگه داشتن اپلیکیشن برای انجام فرامین کاربران باشد اما راه کارآمدی برای استفاده هر چه بهتر منابع سیستم نیست.

🔸 در چنین عملیات هایی راه جل خیلی بهتر استفاده از async و await است. در این روش باز هم اپلیکیشن پاسخو خواهد بود .

🔸 به منظور استفاده از await برای عملیات های I/O Bound بدون استفاده کردن از Task.Run لازم است که از یک متد asynchronous استفاده کنید که یک Task را return کند. خود این متد نباید از Task.Run استفاده کرده باشد .
انجام این کار زمانی که دارید با کلاس های از پیش ساخته شده .Net نظیر FileStream
و HttpClient کار میکنید، ساده است زیرا این کلاس ها برای اعمال خود متد های asynchronous را در اختیار مان قرار میدهند.
گاهی ممکن است کلاسی در درون .net یا یک لایبری فقط متد های synchronous در اختیار مان قرار دهد که در این موارد ممکن مجبور شوید تا از Task.Run استفاده کنید.
اما همیشه و تا جای ممکن از async و await به جای Task.Run برای عملیات های I/O Bound استفاده کنید.

@FullStackDevs
#NET5Preview3
معرفی net 5 preview 3

🔸نسخه NET 5.0 شامل مجموعه ای از ویژگی های جدید و بهبود عملکرد است. و در حال کار بر روی ویژگی های بزرگتری میباشند که نسخه 5.0 release را تعریف می کند.

🔹در اینجا میتونید به پست و مخزن dotnet / design نگاهی بیندازید و هر بازخوردی را که دارید با تیم دات نت در میان بگذارید.

🔹شما میتونید نسخه دات نت 5 را برای Windows, macOS, و Linux دانلود کنید .

▪️بهبود کیفیت کد در RyuJIT:
هر نسخه شامل مجموعه ای از تغییرات است که باعث بهبود machine code ای می شود که JIT تولید می کند (ما این را "code quality" می نامیم). کیفیت بهتر کد به معنای عملکرد بهتر برنامه است.

▫️بهبود System.Text.Json
برطرف کردن مشکل ReferenceLoopHandling در System.Text.Json که یکی ازویژگی های مهم سریال سازی در JSON.NET است.

اضافه شدن چند Extension method برای HttpClient که امکان سریال سازی از / به JSON را دارند مثلا:
GetJsonAsync<T>(HttpClient, String)
return await client.GetJsonAsync<List<Country>>(new Uri(url));
در مثال بالا فرض کنید api داریم که لیست کشور ها رو بصورت json برمیگرداند و با <GetJsonAsync<T که T نوع آبجکت خروجی deserialize شده لیستی از country خروجی داریم .(لیست HttpClientJsonExtensions )

در این نسخه پشتیبانی از structs و کلاس ها immutable را به JsonSerializer اضافه می کند.(توی Newtonsoft.Json یه اتریبوتی دارد بنام [JsonConstructor] که این امکان رو میده وقتی چند constructor داریم ،کدوم آنها در زمان deserialize صدا زده بشه ولی تو System.Text.Json فقط از constructor بدون پارامتر پشتیبانی میشود)

▪️پشتیبانی NET SDK برای اسمبلی Net framework
این
تغییر ساخت پروژه های Net Framework را بر روی یک دستگاه بدون نصب package مورد نیاز NET Framework مورد نیاز امکان پذیر می کند. این پیشرفت مختص هدف قرار دادن package ها است و وابستگی های دیگری که ممکن است یک پروژه داشته باشد را در نظر نمی گیرد.

@fullStackDevs
#EFCore5Preview3
#EFCore5

معرفی Entity Framework Core 5.0 Preview 3

🔸پیش نمایش های EF Core 5.0 نیاز به NET Standard 2.1 دارد. این یعنی:
▫️انتیتی فریمورک Core 5.0 در NET Core 3.1 اجرا می شود. نیازی به NET 5 ندارد.( این ممکن است در پیش نمایش های آینده بسته به نحوه تکامل برنامه برای NET 5 تغییر کند.)
▪️انتیتی فریمورک Core 5.0 بر روی سیستم عامل های دیگری که از NET Standard 2.1 پشتیبانی می کنند اجرا می شود.
▫️انتیتی فریمورک Core 5.0 بر روی سیستم عاملهای استاندارد NET Standard 2.0، از جمله Net Framework اجرا نمی شود.

🔹چگونه می توان پیش نمایش های EF Core 5.0 را دریافت کرد:
انتیتی فریمورک منحصراً به صورت مجموعه ای از NuGet packages توزیع می شود.
به عنوان مثال ، برای افزودن SQL Server provider به پروژه خود ، می توانید از دستور زیر با استفاده از ابزار dotnet استفاده کنید:
dotnet add package Microsoft.EntityFrameworkCore.SqlServer --version 5.0.0-preview.3.20181.2
همچنین نسخه 5.0 پیش نمایش 3 از ارائه دهنده Microsoft.Data.Sqlite.Core ADO.NET را منتشر کرده ایم.

🔸نصب dotnet ef
مانند EF Core 3.0 و 3.1 ، ابزار خط فرمان dotnet ef دیگر در .NET Core SDK گنجانده نشده است. قبل از اجرای دستورات EF Core migration or scaffolding commands ، باید این بسته را به عنوان یک ابزار global یا محلی نصب کنید.
برای نصب ابزار ، ابتدا نسخه های موجود را با استفاده از زیر حذف کنید:
dotnet tool uninstall --global dotnet-ef
سپس دستور زیر برای نصب نسخه پیش نمایش:
dotnet tool install --global dotnet-ef --version 5.0.0-preview.3.20181.2

🔹می توان از این نسخه جدید dotnet ef با پروژه هایی استفاده کرد که از نسخه های قدیمی تر EF Core runtime استفاده می کنند.

🔻امکانات جدیدی که به این نسخه اضافه شده:
Filtered Include

پشتیبانی
قابلیت Filter کردن Include ها

var blogs = context.Blogs
.Include(e => e.Posts.Where(p => p.Title.Contains("Cheese")))
.ToList();

این Query بلاگ ها را به همراه هر post مرتبط باز می گرداند ، اما فقط هنگامی که عنوان post حاوی "cheese" باشد.( برای جزئیات کامل به مستندات شامل مراجعه کنید.)
New ModelBuilder API for navigation properties
متد
جدید Navigation که وقتی navigation properties نیاز به تنظیمات اضافی داشته باشد میتونید استفاده کنید.
modelBuilder.Entity<Blog>().Navigation(e => e.Posts).HasField("_myposts");


⛔️توجه داشته باشید که API navigation جایگزین پیکربندی relationship نمی شود.
درعوض امکان تنظیمات اضافی از خصوصیات navigation را در روابط قبلاً تعریف شده فراهم می کند.
New command-line parameters for namespaces and connection strings
اکنون
Migrations و scaffolding اجازه می دهد تا namespaces در خط فرمان مشخص شود.
به عنوان مثال ، برای مهندسی معکوس یک database که context و کلاس های مدل را در namespace های مختلف نامگذاری می کند
dotnet ef dbcontext scaffold "connection string" Microsoft.EntityFrameworkCore.SqlServer --context-namespace "My.Context" --namespace "My.Model"


همچنین ، connection string اکنون می تواند به دستور database-update منتقل شود:

dotnet ef database update --connection "connection string"

EnableDetailedErrors has returned
به
دلایل عملکرد ، EF در هنگام خواندن مقادیر از پایگاه داده ، بررسیهای null-checks را انجام نمی دهد.
و در صورت مواجهه با null ، این امر می تواند به exception منجر شود.

با استفاده از EnableDetailedErrors ، بررسیهای null checking اضافه می شود.

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder
.EnableDetailedErrors()
.EnableSensitiveDataLogging() // Often also useful with EnableDetailedErrors
.UseSqlServer(Your.SqlServerConnectionString);

@fullStackDevs
Forwarded from Web Devs
#StaticType
#DynamicType

✳️ What are Exactly Static and Dynamic Types⁉️

🔹لزوما برای فهمیدن پایه ایه این مفهوم نیاز به دانستن زبان برنامه نویسی خاصی ندارید زیرا اینها مفاهیم طراحی زبان های برنامه نویسی هستند.پس بنابراین عدم آشنابودن با یک زبان برنامه نویسی خاص به درک این مفهوم لطمه ای وارد نمیکند.

🔻در ابتدای امر باید بدانید منظور از کلمه type در static type و dynamic type نوع داده ای متغیر ها میباشد.

▪️برای تشریح static type یا dynamic type بودن تعاریف مختلفی وجود دارد که در این پست به معقول ترین آنها میپردازیم.

▪️ type checking

🔸 فرایند تایید و اعمال محدودیت ها بروی انواع داده ها را type checking می گویند. در برخی زبانها type checking در زمان compile time و در برخی در زمان runtime انجام میشود. در واقع انجام عملیات type checking در مورد type safe بودن برنامه است تا type error های احتمالی را کاهش دهد.

▫️ type error

🔸یک type error میتواند وضعیتی باشد که در هنگام انجام یک عملیات بروی نوع های داده ای اتفاق بیافتد. برای مثال جمع کردن یک رشته با یک عدد صحیح باهم.
خطاهای type error در زبان های برنامه نویسی زیادی اتفاق می افتد بسته به نوع زبان برنامه نویسی این ارور ها در زمان compile time یا در زمان runtime صادر میشود.
▪️type safe

🔸به عملیاتی الحاق میشود که در آن برنامه از درست بودن نوع داده هایی که عملیات بروی آنها انجام میشود اطمینان حاصل میکند.

✳️ static type language

🔸 یک زبان برنامه نویسی static type زبانی است که نوع داده ای متغیر ها در زمان compile time مشخص میشود.در زبان های برنامه نویسی static type زمانی که یک متغیر با یک نوع داده ای مشخص تعریف شده است دیگر قادر به پذیرفتن داده هایی با نوع دیگر نخواهد بود . در صورت اختصاص دادن داده ای با نوع داده ای مختلف با یک type error در زمان compile time مواجه میشوید.

✳️ Dynamic type language

🔸یک زبان برنامه نویسی dynamic type زبانی است که نوع متغیر ها در زمان runtime چک و همچنین مشخص میشود. در زبان های dynamic type اگر به یک متغیر مقدار integer اختصاص دهید نوع آن متغیر از نوع integer تعیین میشود. اما اگر به همان متغیر در چند خط پایین تر در کد یک مقدار رشته ای تخصیص دهید نوع داده ای تعیین شده برای متغیر به string تغییر پیدا خواهد کرد.

✳️ معایب و مزایا
▪️static type
🔹حجم کثیری از خطاها و ارورها در فرایند توسعه مشخص و برطرف میشود.
🔹پرفورمنس بهتر(به دلیل اعمال محدودیت بر انواع داده ای و مشخص شدن نوع داده ها در زمان کامپایل)، کد ماشین بهینه تری تولید میشود.
🔹مستند سازی بهتر زیرا با مشخص بودن نوع داده ها و برطرف کردن خطاهای احتمالی رفتار تابع ها قابل پیش بینی تر خواهد بود.
🔹پیدا کردن راحت تر اشیا و متغیر ها در کد.
🔹کار کردن راحت تر با دیتابیس های رابطه ای و دیگر سیستم هایی که متکی به static type بودن هستند.

▪️Dynamic type language

🔹کد فشرده تر و کمتر
🔹عدم وجود مرحله کامپایل به این معنی که برای تست کردن تغییرات در کد دیگر منتظر کامپایلر برای کامپایل کردن کدها نیستید.این نوع زبان ها غالبا مفسری هستند و اگر در زمان runtime اروری اتفاق بیافتد، باعث کاهش پرفورمنس برنامه میشود.همچنین انجام type checking ها در زمان runtime در این نوع زبان ها بر پرفورمنس برنامه تاثیر منفی دارد.
🔹صرف زمان کمتر برای برطرف کردن syntax و همچنین semantic ارورها و به جای آن کل زمان خود را میتوانید به برطرف کردن logic ارورها بپردازید.
🔹ریفکتور کردن کدها فقط باعث تغییرات محلی میشود. برای مثال در زبان های static type با تغییر نام یک کلاس باید در سراسر کد خود این تغییر را اعمال کنید.(البته این کار در IDE های امروزی به راحتی قابل انجام است).

🔻منابع
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9

@FullStackDevs
Forwarded from Web Devs
#Caching

کشینگ (Caching) چیست؟

از جمله مواردی که استفاده درست و بجا از آن به طور قابل ملاحظه ای باعث افزایش کارایی برنامه میشود Caching میباشد.درواقع Caching مکانیزمی است که داده ها را ذخیره میکند تا درخواست های آینده برای آن داده ها سریعتر انجام شود و نتیجه به کلاینت زودتر بازگشت داده شود.داده های ذخیره شده می تواند نتیجه محاسبات قبلی یا کپی ای از داده های دیگر در جای دیگری باشد.این کار برای جلوگیری از محاسبات تکراری و یا کاهش درخواست ها به دیتابیس،برای داده هایی که امکان تغییر مداوم آنها کم است و همچنین هزینه محاسبه و یا ساخت دوباره آن زیاد است، صورت میگیرد.
خوشبخانه AspNetCore از روش های مختلف Caching پشتیبانی میکند.
از جمله این روش ها به Cache In Memory و Distributed Cache می توان اشاره کرد.
روش Cache In Memory از حافظه رم سرور برای ذخیره داده های کش شده استفاده میکند. این نوع Cache متناسب برای یک سرور است و برای استفاده از این روش زمانی که چند سرور دارید از ویژگی یا تکنینک Sticky session ( که به معنی درخواست های کلاینت به همان سروری که داده ها را Cache کرده برای پردازش Route میشوند) استفاده کرد.
از روش Distributed Cache برای share کردن داده های کش شده بین چندین سرور استفاده میشود. معمولا داده ها در یک سرور خارجی نگه داشته میشوند و دیگر سرور ها به آن دسترسی دارند.

محل قرا گیری عملیات Caching در معماری پروژه هایمان کجاست؟
معماری رایج در بین وب اپلیکیشن ها غالبا یک معماری تمیز (Clean Architecture) میباشد . و ما در این پست به قرار دادن عملیات مربوط به caching در چنین معماری هایی میپردازیم.
در این قبیل معماری ها براساس اصول طراحی و قوائد تعیین شده در DDD اپلیکیشن به لایه هایی تقسیم میشود و به ترتیب داخلی ترین لایه که Domain layer میباشد و کمترین وابستگی را به یک Dll خارجی دارد و هرچه به لایه های بالاتر میرویم وابستگی لایه ها به یکدیگر بیشتر میشود. از ویژگی های یک معماری خوب Loose Coupling در بین لایه ها میباشد یعنی وابستگی لایه ها به یکدیگر را بقدری کاهش داد که با تغییر یک لایه خللی در کار دیگر لایه ها صورت نگیرد. البته در این تعریف منظور از کاهش وابستگی یعنی کاهش وابستگی در زمان Compile time.

در یک Clean Architecture یا به عبارتی در یک Clean DDD Architecture معمولا لایه های بدین شکل خواهند بود :
1 - Domain|Core layer
2 - Services | Application Layer
3 - Infrastructure Layer
4 - UI Layer

در لایه Domain اپلیکیشن Entitiy ها و Contract ها(interface) های قرار میگیرد و در لایه Infrastructure معمولا پیاده سازی دسترسی به داده ها و دیگر سرویس ها خارجی مانند FileLogger و SmtpNotifier میباشد.این لایه امکان دسترسی و ذخیره سازی دائمی داده ها را ممکن میسازد،همچنین اطلاعات موجود Domain Entity ها در دیتابیس یا هر store دیگری به صورت دائمی در این لایه برای ذخیره، پیاده سازی میشود.از سوی دیگر ریپازیتوری های ما در این لایه پیاده سازی میشوند.(ریپازیتوری محلی است که امکان دسترسی یه اینتیتی ها و valueObject ها را فراهم میکند).
برای پیدا کردن محل درست caching باید با وظیفه یک عامل دیگر اشنا باشیم.

Repository pattern

الگوی طراحی ریپازیتوری یک روش برای انتزاعی کردن دسترسی به داده ها به جای استفاده Concrete شده از آنها میباشد.
از جمله دلیل استفاده از این الگو جلوگیری از دوباره نویسی Query ها و همچنین امکان تغییر دیتابیس یا ORM اپلیکیشن را میتوان بر شمرد.
همانطور که گفتیم ریپازیتوری راه دسترسی ما به داده هاست ، این داده ها ممکن از از دیتابیس واکشی شوند یا اینکه از Cache خوانده شوند و از آنجایی که پیاده سازی الگوی Repository در لایه Infrastructure صورت میگیرد پس در نتیجه لایه قرارگیری caching نیز در همین لایه و در ریپازیتوری میباشد .
اما پیاده سازی caching در داخل خود ریپازیتوری چند مشکل اساسی دارد، مشکل، عدم تست پذیری و نقض اصل اول Solid یعنی Single responsibility میباشد.
برای حل این مشکل یک الگوی طراحی Structural به کمک ما می آید و با پیاده سازی آن این مشکل را حل میکنیم.

در این قسمت به بررسی یک سری از مسائل پایه پرداختیم و در قسمت بعدی این پست به طریقه پیاده سازی آن خواهیم پرداخت.

@fullStackDevs
Forwarded from Web Devs
#Chain_posts
#JavaScript_code_snippets

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

🔸در این پست به معرفی چند code snippet در زبان جاوا اسکریپت می پردازیم که به صورت زنجیروار ادامه خواهد داشت.
🔹.all
▫️خروجی این قطعه کد true خواهد بود اگر شرط مورد نظر برای تمام عناصر آرایه true باشد و بلعکس.

const all = (arr, fn = Boolean) => arr.every(fn);

all([4, 2, 3], x => x > 1); // true
all([1, 2, 3]); // true

🔻متد every() یک تابع را بروی تمام عناصر ارایه برای مطمئن شدن از برقرار بودن شرط مورد نظر چک میکند. اگر عنصری در این آرایه نتواند شرط مورد نظر را پاس کند ، دیگر عناصر ارایه (باقیمانده) چک نخواهند شد.

🔹.allEqual
▫️خروجی قطعه کد زیر در صورت برابر بودن تمام عناصر آرایه با یکدیگر true خواهد بود
const allEqual = arr => arr.every(val => val === arr[0]);

allEqual([1, 2, 3, 4, 5, 6]); // false
allEqual([1, 1, 1, 1]); // true

🔻عملگر === در جاوا اسکریپت دو متغیر را براساس نوع و مقدار با هم مقایسه میکند.
11 === 11 // => true
11=== '11' // => false

🔹. approximatelyEqual
▫️این قطعه کد چک خواهد کرد که دو عدد به طور تقریبی با هم برابر هستند یا خیر.
🔻در این کد کلمه کلیدی const به این معنی میباشد که متغیر تعریف شده ثابت بوده و غیر قابل تغییر در سراسر کد میباشد.

const approximatelyEqual = (v1, v2, epsilon = 0.001) => Math.abs(v1 - v2) < epsilon;

approximatelyEqual(Math.PI / 2.0, 1.5708); // true

🔻متد math.abs معادل قدر مطلق در ریاضی میباشد. خروجی یک قدر مطلق همواره عددی مثبت است.

🔹.arrayToHtmlList
▫️این قطعه کد هر عنصر از آرایه را به یک تگ <li> تبدیل کرده و انها را به یک لیست با یک ID میچسباند.

const arrayToHtmlList = (arr, listID) =>
(el => (
(el = document.querySelector('#' + listID)),
(el.innerHTML +=
arr.map(item => `<li>${item}</li>`).join(''))
))();

arrayToHtmlList(['item 1', 'item 2'], 'myListID');

🔻متد arr.map() یک non-mutating متد بوده (یعنی باعث تغییر آرایه پدر نمیشود) و کار آن ساخت ارایه جدید به وسیله صدا زدن یک تابع بروی هریک از عناصر آرایه پدرمیباشد.

@FullStackDevs
This media is not supported in your browser
VIEW IN TELEGRAM
🔰Microsoft Build (For developers by developers )

❇️ Free digital event

Starts
: May 19, 2020 at 8 AM Pacific Time
Ends
: May 21, 2020 at 8 AM Pacific Time


📢 @FullStackDevs
Forwarded from Web Devs
#SVG
#ScalableVectorGraphics

🔻 این SVG چیست و چرا باید از آن استفاده کنیم؟

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


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

این بدین معنی نیست که در آینده نزدیک از تصاویری با فرمت های PNG، JPG و غیره دیگر استفاده نمی شود، نه، بلکه آنها همچنان کاربرد خود را در وب خواهند داشت و در کنار SVG به حیات خود در دنیای وب ادامه خواهند داد.

🔻 حالا SVG چیست؟
SVG (Scalable Vector Graphics)

در دنیای کامپیوتر ترسیمات می توانند از دو نوع Raster یا Vector باشند.

در Raster Graphics یا گرافیک شطرنجی تصویر به صورت مجموعه ‌ای از پیکسل‌ها ذخیره می‌شود و رنگ هر پیکسل به طور جداگانه ذخیره می‌شود. تغییر اندازه این تصاویر کیفیت آنها را تحث تاثیر قرار می دهد. اکثر فرمت‌های رایج فایل‌های تصویری مانند jpg، gif، و bmp بر مبنای گرافیک شطرنجی هستند.

در Vector Graphics یا گرافیک برداری روشی در تولید و ذخیرهٔ فایل‌های تصویری کامپیوتری است که در آن تصویر در قالب مجموعه‌ای از مشخصات هندسی نقاط، خط‌ها، منحنی‌ها و چندضلعی‌ها ذخیره می‌شود. واژهٔ «بردار» در این کاربرد معنایی وسیع‌تر از یک خط راست دارد.

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

این تصاویر مستقل از رزولوشن هستند و می‌توان آنها را بزرگ و کوچک کرد و در هر رزولوشن بدون از دست دادن جزئیات و وضوح چاپ کرد. یکی از شناخته شده ترین فرمت‌های ذخیرهٔ فایل‌های گرافیک برداری، فرمت SVG است.

در SVG بر اساس XML است این یعنی سینتکس آن خیلی هم غریبه نخواهد بود و به HTML شباهت دارد. به این صورت که برای ترسیم شکل های مختلف تگ های مختلف وجود دارد مثلا برای ترسیم دایره از تگ
<circle/>
استفاده می شود و در نهایت همه اشکال، درون یک تگ
<svg />
قرار می گیرند.
ادامه در پست بعدی ...
@fullStackDevs
Forwarded from Web Devs
ادامه پست قبل

🔻 چرا SVG ؟

🔹 مستقل از رزولوشن

یکی از نقاط قوت SVG این است که در صفحه نمایش هایی با کیفیت بسیار بالا هم به بهترین شکل نمایش داده می شود و کیفیتش تغییر نمی کند. برخلاف تصاویر Raster که کیفیت خود را از دست می دهند و مجبوریم برای صفحه نمایش هایی با کیفیت بالاتر نسخه با کیفیت تری از تصویر را نمایش دهیم.

دیگر مهم نیست اندازه تصویر چه باشد، یا چقدر کاربر Zoom کند و یا اینکه کیفیت صفحه نمایش کاربر چه اندازه باشد. در همه این موارد SVG قصه ما همان حالت با کیفیت و تیزش را حفظ می کند.

🔸 سازگار با CSS

از اونجایی که SVG هم مثل HTML یک markup است می تواند Class یا css داشته باشد و از آن طریق در css می تواند در دسترس باشد.
پس می توانیم روی ترسیمات برداری از طریق css کارهای زیادی انجام دهیم که این کار برای ترسیمات Raster امکان پذیر نمی باشد.
فرض کنید مستطیلی را از طریق SVG ساخته ایم می توانیم رنگ آن را بصورت های مختلف تغییر دهیم ولی اگر همان مستطیل از نوع تصاویر معمولی مثلا با فرمت PNG بود می توان گفت دیگر این امکان برای ما وجود نداشت.

🔹 تعامل پذیری ساده از طریق Javascript

به همان دلیلی که SVG با CSS سازگار است می توان گفت که به راحتی می توان از طریق جاواسکریپت با آن تعامل داشت و مواردی مثل انیمیشن و غیره را به راحتی پیاده و در نتیجه تجربه کاربری و تعاملی خوبی را به سادگی برای کاربر مهیا کرد.

🔸 درخواست HTTP کمتر

هر زمان که بواسطه تگ <img> از تصویری به صورت عادی در یک صفحه وب استفاده کنید مرورگر برای ترسیم آن تصویر یک درخواست HTTP به سرور می فرستد تا تصویر را از سرور گرفته و نمایش دهد. اگر از روش خطی برای SVG استفاده کنیم SVG بصورت مستقیم در فایل HTML قرار دارد و دیگر نیازی به یک درخواست جداگانه برای تصویر ما نخواهد بود.

🔹 ویرایش ساده

برای تغییر یک فایل SVG فقط به یک ویرایشگر متن نیاز داریم این یعنی در همان محیط کدنویسی می توانیم ویراش مورد نظرمان را انجام دهیم. اما اگر یک تصویر Raster را بخواهیم ویرایش کنیم باید به فوتوشاب یا مشابه آن پناه ببریم.

🔸 حجم فایل کمتر

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

🔹طراحی واکنشگرا

اگر تصویر شما می تواند بصورت SVG باشد دیگر نگرانی برای واکنشگرا بودن آن نخواهید داشت. ولی در صورت استفاده از تصاویری با فرمت PNG یا JPG شاید مجبور شوید تا در صفحه نمایش های مختلف نسخه های مختلفی از آن تصاویر را قرار دهید.

✔️ بهترین موارد استفاده SVG :

▪️ آیکون ها
▫️ ترسیمات ساده مثل شکل های مختلف
▪️ بنرهای تبلیغاتی
▫️ ترسیمات متحرک
▪️ اینفوگراف ها و مصورسازی داده ها
می باشند.

🌀 واضح است که اگر تصویری از یک منظره داشته باشیم که توسط یک عکاس گرفته شده است، نمایش آن بوسیله SVG منطقی نخواهد بود چرا که در این مورد حجم فایل به مراتب بیشتر از فرمت PNG یا JPG خواهد بود.

@fullStackDevs
❇️ Object Destructuring in ES6

🔸 ویژگی Object Destructuring یکی از ویژگی های جدید ES6 میباشد و در این پست قصد داریم به معرفی آن بپردازیم هم چنین در این پست برای اختصار از OD بجای Object Destructuring استفاده میکنیم.

🔻توجه داشته باشید که این اختصار اصلا رایج نبوده و فقط برای نگارش آسان تر در این پست استفاده شده است

🔹 اضافه شدن ویژگی OD به ES6 باعث به وجود آمدن هزاران syntax جدید در ES6 شد.
ویژگی OD کاربرهای بسیاری دارد و هنگام کار کردن با object ها array ها function ها بسیار پر استفاده خواهد بود.
🔹می توانیم از OD به همراه object ها برای ترکیب کردن دو یا سه یا .. object با یکدیگر استفاده کنیم یا حتی انتخاب برخی از فیلد های یک object و تبدیل آن به یک object کوچکتر استفاده کنیم.

🔹هم چنین از OD به همراه array ها برای ترکیب کردن ارایه ها یا حتی شکستن یک ارایه به بخش کوچکتر استفاده کنیم .

🔹در function ها از OD برای فیلتر کردن ارایه ها و object هایی که به عنوان آرگومان تعریف کرده ایم استفاده میکنیم.

( توجه کنید که کاربرد OD ها محدود به این موارد نیست و کاربرد های بسیار فراوانی دارد، موارد فوق صرفا جهت معرفی بخش کوچکی از کاربرد های این ویژگی ذکر شده اند. )

✳️ در این پست از OD به همراه object ها استفاده میکنیم.
🔸ابتدا باید به کمک یک مثال مشکلی قدیمی را بررسی کنیم و به ببینیم که چگونه OD به کمک ما می آید.
فرض کنید چنین object ای داریم :
const person = {
first: 'Brendan ',
last: 'Eich ',
country: 'USA',
city: 'Pittsburgh',
};
و برای دریافت مقادیر فیلد های این object بدین شکل عمل میکردیم :
const first = person.first;
const last = person.last;

🔹اگر object ما ده ها فیلد داشت برای دریافت مقدار هر یک از فیلد های ان باید متغیر تعریف کنیم و هر بار مقدار فیلد مورد نظر را به متغیر خود اختصاص دهیم. کاری تکراری و طاقت فرسا.
اینجاست که OD وارد میشود و به کمک ما می آید.
const { first, last } = person;

🔹در این کد فیلد های last و first از person خوانده میشود و در متغیر های همنام متناظر خود قرار میگیرد و از این به بعد میتوانیم مقادیر را از متغیر های last و first بخوانیم و در جای جای scope استفاده کنیم.
🔹سینتکس مثال قبل یکی از سینتکس ها و کاربرد های فراوان OD میباشد.
هم چنین اگر مقدار فیلد city را person نیاز داشته باشیم میتوانیم به این شکل عمل کنیم.
const { first, last,city } = person;

console.log(first); //Brendan
console.log(last); //Eich
console.log(city); //Pittsburgh

حال بیایید object خود را کمی پیچیده تر کنیم فرض کنید چنین object ای داریم :
const person = {
first: 'Brendan',
last: 'Eich',
links: {
social: {
site: 'https://brendaneich.com',
twitter: 'https://twitter.com/BrendanEich',
}
}
};
از این object فقط مقادیر site و twitter را نیاز داریم .
در گذشته برا خواندن این مقادیر بدین شکل عمل میکردیم :
const twitter = person.links.social.twitter;
const site = person.links.social.site;

اما می توانیم با کمک OD بدین شکل عمل کنیم :
const { twitter, site } = person.links.social;

console.log(twitter, site);
🔻 نکته مهم این است که متغیر ها بایستی همنام با فیلد های object باشند تا مقادیر مورد نظر در آنها ریخته شود.
اما اگر لازم بود تا متغیری با نامی متفاوت از آنچه که فیلد object هست داشته باشیم بدین شکل عمل میکنیم :
const person = {
first: 'Brendan ',
last: 'Eich ',
country: 'USA',
city: 'Pittsburgh',
};

const { first : personFirstName } = person;
بدین صورت میتوانید به متغیر های خود در OD نامی متفاوت دهید.

✳️ Set default value with OD

🔸چگونه در هنگام destruct کردن یک آبجکت مقادیر پیشفرض برای متغیر ها اختصاص دهیم.
فرض کنیم object زیرا داریم
const settings = {
speed: 150
}
const { speed, width } = settings;

🔹 همانطور که مشخص است ابجکت settings دارای فیلدی به نام width نیست با log کردن این فیلد مقدار undefined لاگ خواهد شد.
برای set کردن مقدار پیفرض برای متغیر width در هنگام destruct کردن آبجکت settings :

const { speed, width = 500 } = settings;
بدین شکل عمل میکنیم .

🔻 نکته بسیار مهم این است که فقط در صورتی که مقدار متغیر width براربر با undefined باشد این مقدار پیشفرض برای آن set خواهد شد.
در صورتی که آبجکت settings دارای فیلد متناظری باشد حتی اگر مقدار آن null false 0 هم باشد این مقادیر در متغیر width قرار میگیرد.

☑️قسمت های بعدی OD در صورت دریافت فیدبک های انرژی بخش ادامه خواهد داشت.

❇️ Happy JS Coding 😉

@FullStackDevs
Forwarded from Web Devs
This media is not supported in your browser
VIEW IN TELEGRAM
🔰Microsoft Build (For developers by developers )

❇️ Free digital event

Starts
: May 19, 2020 at 8 AM Pacific Time
Ends
: May 21, 2020 at 8 AM Pacific Time


📢 @FullStackDevs
Forwarded from Web Devs
#OAuth


در این پست می آموزیم که OAuth چیست.
درابتدا باید بدانیم که OAuth مخفف Open Authorization میباشد.
🔳 OAuth
یک پروتکل برای اهدای مجوز برای دسترسی به اطلاعات کاربر توسط اپلیکیشنی دیگر است.

🔸 این پروتکل ابتدا در سال 2007 معرفی شد و توسط توییتر استفاده شد و با توجه به استقبال و گستردگی ان در سال 2010 نسخه OAuth 2.0 توسط IEFT (جامعه بین المللی آزاد از طراحان شبکه ، اپراتورها ، فروشندگان و محققانی است که بر روی تدوین استانداردهای فنی برای اینترنت کار می کنند.) معرفی شد.

▪️ برای مثال ممکن است موقع ثبت نام در سایتی گزینه هایی همچون “login with Google” یا “login with Facebook” را دیده باشید که عملیات login را بسیار ساده میکند و با اعطای مجوز دسترسی به اطلاعاتتان به سایتی که میخواهید در آن حساب بسازید عملیات ورود و ساخت حساب را انجام میدهید.
سه اجزایی که در یک مکانیزم OAuth وجود دارند عبارتند از :
1️⃣ OAuth Provider,Resource Provider
سرویسی که با دریافت تاییدیه امکان استفاده از اطلاعات کاربر را به یک اپلیکیشن دیگر میدهد. مانند گوگل ، فیس بوک و... که بایستی پروتکل OAuth را پیاده سازی کرده باشد.
2️⃣ OAuth Client
وب سایت یا اپلیکیشنی که اجازه دسترسی به اطلاعاتمان را به آن میدهیم.
3️⃣ Resource Owner

شخصی که اطلاعات آن در اختیار Resource Provider است.
طی این فرایند شما با اعطای مجوز به OAuth Client و دریافت یک access token این امکان را به OAuth Client میدهید که به اطلاعات شما از طریق آن access token دسترسی داشته باشد .

@fullStackDevs
Forwarded from Web Devs
#OpenID


💡 What is Open ID?

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

اما اپن آیدی پروتکلی برای authentication و تصدیق هویت میباشد این پروتکل لایه ای بر روی OAuth 2.0 میباشد .
با استفاده از این پروتکل، Token ID ای دریافت میکنید که JWT بوده و اپلیکیشن جانبی تان علاوه بر دسترسی از طریق این توکن اطلاعاتی هم درباره کاربر جاری دارد.
اپن آیدی اجازه استفاده از یک حساب(اکانت) برای چندین سایت بدون اینکه نیاز به تغییر رمز عبور داشته باشید میدهد.

💢 مراحل انجام کار

1. ارسال اطلاعات کلاینت به Identity Provider
2. دریافت این اطلاعات در سمت Identity Provider و شناسایی و لاگین کاربر
3. ارسال یک Access Token و یک ID Token (اگر کلاینت درخواست کند) از سمت identity Provider به کلاینت.
4. دریافت این توکن ها در سمت کلاینت و کلاینت میتواند با استفاده از Access Token درسمت Identity Provider برای دسترسی به اطلاعات api هایی رو صدا بزند و همچنین از ID Token برای بازیابی اطلاعات کاربر استفاده کند.

این پروتکل برای اولین بار در سال 2005 معرفی و پیاده سازی شد و نسخه بعدی آن که OpenID Connect نامیده میشود در فوریه 2014 ارئه گردید.


@fullStackDevs
#CSharp9
#InitOnlyProperty
#NewFeature

🔰 اگر دنبال کننده خبرها باشید حتما میدانید که Microsift Build 2020 به تازگی به اتمام رسید است، که معرفی ویژگی های C# 9 از جمله چیزهای جدیدی بود که در این بیلد معرفی شد.

▫️ در اول لیست ویژگی های C# 9
❇️ Init-only properties
به
چشم میخوره و اما بیایید به ببینیم این ویژگی چی هست و اصلا چرا به سی شارپ اضافه شد

🔸قبلا از شروع بایستی با تعریف های زیر آشنایی داشته باشید
▪️ Immutable type :
یک Immutable type نوعی هست که پراپرتی های آن نوع، فقط در زمان ساخته شدن آن میتوانند مقدار دهی شوند و بعد از آن قابل تغییر نیستند.

▪️immutable property :
به طور ساده یک immutable property یک read-only property میباشد.

✳️ سی شارپ این اجازه را میدهد تا به صورت positional و nominal کد بنویسید.
برای استفاده از سینتکس positional از متد سازنده میتوان استفاده کرد و Object initializer هم از سینتکس های nominal میباشد.

🔹تاقبل از سی شارپ 9 استفاده از سینتکس nominal برای Initialize کردن ابجکت ها دارای محدودیتی بود که پراپرتی ها الزاما بایستی writable میبودند تا بتوان آنها را در هنگام ساختن آبجکت با استفاده از سینتکس nominal مقدار دهی کرد.

❇️ Positional Creation
🔸این
سبک کد نویسی یک سبک مرسوم و قدیمی میباشد که از ابتدای عمر C# مورد استفاده قرار میگرفته است که از متد سازنده برای initialize کردن پراپرتی های یک آبجکت استفاده میکنیم.
و در هنگام نمونه سازی از کلاس بایستی پارامتر های لازم را از طریق متد سازنده برای initialize کردن ابجکت پاس دهیم.
```
public class Person
{
public string FirstName { get; }
public string LastName { get; }

public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
}

public class Racer : Person
{
public string RacingTeam { get; }

public Racer(string firstName, string lastName, string racingTeam)
: base(firstName, lastName)
{
RacingTeam = racingTeam;
}
}

Person p = new Racer("Charles", "Leclerc", "Ferrari");
```
❇️ Nominal Creation
🔸با استفاده از این سبک کدنویسی، کد کمتری مینویسید و به جای تعریف کردن متد سازنده از ویژگیه object initializer استفاده میکنید.

public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}

public class Racer : Person
{
public string RacingTeam { get; set; }
}

Person p = new Racer { FirstName = "Charles", LastName = "Leclerc", RacingTeam = "Ferrari" };

🔹اما استفاده از object initializer محدودتی هایی به همراه دارد، علی رغم دم دست بودن و راحتی که در مقایسه با Positional دارد اما در پشت صحنه مقادیر پراپرتی ها بعد از اتمام صدا زده شدن و اجرای متد سازنده کلاس، set میشوند و بدین ترتیب با استفاده از این سبک کد نویسی نمیتوانید یک immutable type تعریف کنید و بدین منظور باید از سبک قبلی (Positional Creation) استفاده کنید.

🔰 تمام آنچه که تاکنون گفته شد مقدمه ای بود برای بررسی علت معرفی Init-only property در سی شارپ 9 و اینکه چرا این نیاز در سی شارپ حس شد.
بدین ترتیب Init-only property ها معرفی شدند تا امکان مقدار دهی و تعریف immutable proprty ها immutable type ها را هنگام استفاده از object initilizer داشته باشیم .
🔸بدین منظور accessor جدیدی تحت عنوان init اضافه گردیده است که شکلی دیگر از accessor پیشین set میباشد.
در هنگام initilize کردن یک ابجکت با استفاده از object initializer، پراپرتی هایی که با این accessor تعریف شوند، هنگام اجرا شدن متد سازنده کلاس مقدار دهی میشوند و بعد از ساخته شدن آبجکت به صورت readonly خواهند بود و نمیتوان به آنها مقداری اختصاص داد.
❇️ Validation assigned value to init-only properties

🔸گاهی اوقات نیز الزامی است تا مقداری که به init-only property اختاصاص داده میشود، اعتبار سنجی شود.
نکته ای که وجود دارد این است که به صورت تک فیلد برای هر init-only property نمیتوانید اعتبار سنجی انجام دهید و بایستی به صورت یک بلاگ کد برای init-only property های خود اعتبارسنجی انجام دهید.

public class Person
{
public string FirstName { get; init; }
public string LastName { get; init; }

init
{
if (FirstName.Length + LastName.Length > 52)
{
throw new Exception("...");
}
}
}

🔎 منبع
@FullStackDevs