#CLI
#NETCLI
وقتی که از dotnet CLI برای پروژه ای میخواییم استفاده کنیم (مثلا زمانی که میخوایم از vsCode برای توسعه یه پروژه دات نتی مثلا web api استفاده میکنیم) و میخوایم Migrations بزنیم روی پروژه ای که یک سولوشنمون با دو تا یا بیشتر پروژه و لایبرری داریم (api,infra,application and ...) برای migration اضافه کردن باید از دستور زیر استفاده کنیم:
برای مثال فرض کنید MyDbContext توی لایه infrastructure است و AdminApi هم api و InitialCreate نام فایل ای که ایجاد خواهد شد:
و برای اپدیت کردن از دستور زیر استفاده کنید
دقت کنید پکیج زیر حتما روی پروژه ای (DataAccess_Project) که DBContext توش قرار داره و قراره مایگریشن بزنید باید نصب باشد.
و همچنین پکیج زیر باید در پروژه WebApp_Project
نصب باشد.
@fullStackDevs
#NETCLI
وقتی که از dotnet CLI برای پروژه ای میخواییم استفاده کنیم (مثلا زمانی که میخوایم از vsCode برای توسعه یه پروژه دات نتی مثلا web api استفاده میکنیم) و میخوایم Migrations بزنیم روی پروژه ای که یک سولوشنمون با دو تا یا بیشتر پروژه و لایبرری داریم (api,infra,application and ...) برای migration اضافه کردن باید از دستور زیر استفاده کنیم:
CD My_Solution
dotnet ef migrations add YourMigrationName --project DataAccess_Project --startup-project WebApp_Project
برای مثال فرض کنید MyDbContext توی لایه infrastructure است و AdminApi هم api و InitialCreate نام فایل ای که ایجاد خواهد شد:
dotnet ef migrations add InitialCreate --project Infrastructure --startup-project AdminApi
و برای اپدیت کردن از دستور زیر استفاده کنید
dotnet ef database update --project DataAccess_Project --startup-project WebApp_Project
دقت کنید پکیج زیر حتما روی پروژه ای (DataAccess_Project) که DBContext توش قرار داره و قراره مایگریشن بزنید باید نصب باشد.
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
و همچنین پکیج زیر باید در پروژه WebApp_Project
نصب باشد.
dotnet add package Microsoft.EntityFrameworkCore.Design
@fullStackDevs
👍8👏1
#Roslyn
#Performance
🔰 بررسی و معرفی یک نکته پرفورمنسی در شی شارپ
🔹 در نسخه 3.0 سی شارپ Anonymous type ها معرفی شدند.
که بهتون قابلیت نمونه سازی ابجکت های مختلف بدون مشخص کردن تایپ اونها رو میده.
▪️ به کمک این قابلیت و همچنین فیچری که در کامپایلر سی شارپ ( roslyn ) وجود داره می تونید آرایه هایی به شکل زیر تعریف کنید.
🔸 نکته ای که جالبه بدونید اینکه اگه ارایه بالا به شکل زیر تعریف بشه با کامپایلر ارور مواجه می شین.
▪️ علت این موضوع برمیگرده به ویژگی type identity کامپایلر برای Anonymous Type ها.
🔹 به این صورت که کامپایلر در مواجه با نمونه سازی یک Anonymous Type در کد (object initializer)، ابتدا نام و نوع پراپرتی ها رو تشخیص میده ( به طور خیلی خلاصه ) و در نهایت برای اون Anonymous type، یک تایپ (class) با نامی که خودش انتخاب میکنه میسازه و از اون نمونه سازی میکنه.
🔸 از نظر کامپایلر Anonymous Type ها دارای یک identical structure هستند که برای تشخیص identical بودن ( یکسان بودن ) دو Anonymous Type باید نام و نوع پراپرتی ها و همچنین ترتیب تعریف شدن پراپرتی های اونها یکسان باشه.
🔸 حتی اگه دو Anonymous Type نام و نوع پراپرتی های اونها یکی باشه اما ترتیب تعریف کردن پراپرتی هاشون موقع نمونه سازی متفاوت باشه، کامپایلر برای هرکدوم از اونها تایپ های متفاوتی generate میکنه.
▪️ به همین خاطره که نمونه کد دوم تعریف آرایه با کامپایل ارور مواجه میشه، چون تمام عناصر ارایه باید از یک نوع باشن.
🔸 رعایت این نکته در نمونه سازی از Anonymous Type ها باعث افزایش پرفورمنس و کاهش مصرف حافظه میشه چون اگه توی یک assembly یک یا چندین Anonymous Type وجود داشته باشه که identical structure باشن، کامپایلر اونها رو از یک نوع تایپ در نظر میگیره و فقط یک تایپ براشون generate میکنه.
@fullStackDevs
#Performance
🔰 بررسی و معرفی یک نکته پرفورمنسی در شی شارپ
🔹 در نسخه 3.0 سی شارپ Anonymous type ها معرفی شدند.
که بهتون قابلیت نمونه سازی ابجکت های مختلف بدون مشخص کردن تایپ اونها رو میده.
▪️ به کمک این قابلیت و همچنین فیچری که در کامپایلر سی شارپ ( roslyn ) وجود داره می تونید آرایه هایی به شکل زیر تعریف کنید.
var arr = new[]
{
new { Id = 1 , Name = "Anonymous" },
new { Id = 2, Name = "BitBard" }
};
🔸 نکته ای که جالبه بدونید اینکه اگه ارایه بالا به شکل زیر تعریف بشه با کامپایلر ارور مواجه می شین.
var arr = new[]
{
new { Id = 1 , Name = "Anonymous" },
new { Name = "BitBard" , Id = 2, }
};
▪️ علت این موضوع برمیگرده به ویژگی type identity کامپایلر برای Anonymous Type ها.
🔹 به این صورت که کامپایلر در مواجه با نمونه سازی یک Anonymous Type در کد (object initializer)، ابتدا نام و نوع پراپرتی ها رو تشخیص میده ( به طور خیلی خلاصه ) و در نهایت برای اون Anonymous type، یک تایپ (class) با نامی که خودش انتخاب میکنه میسازه و از اون نمونه سازی میکنه.
🔸 از نظر کامپایلر Anonymous Type ها دارای یک identical structure هستند که برای تشخیص identical بودن ( یکسان بودن ) دو Anonymous Type باید نام و نوع پراپرتی ها و همچنین ترتیب تعریف شدن پراپرتی های اونها یکسان باشه.
🔸 حتی اگه دو Anonymous Type نام و نوع پراپرتی های اونها یکی باشه اما ترتیب تعریف کردن پراپرتی هاشون موقع نمونه سازی متفاوت باشه، کامپایلر برای هرکدوم از اونها تایپ های متفاوتی generate میکنه.
▪️ به همین خاطره که نمونه کد دوم تعریف آرایه با کامپایل ارور مواجه میشه، چون تمام عناصر ارایه باید از یک نوع باشن.
🔸 رعایت این نکته در نمونه سازی از Anonymous Type ها باعث افزایش پرفورمنس و کاهش مصرف حافظه میشه چون اگه توی یک assembly یک یا چندین Anonymous Type وجود داشته باشه که identical structure باشن، کامپایلر اونها رو از یک نوع تایپ در نظر میگیره و فقط یک تایپ براشون generate میکنه.
@fullStackDevs
👍9
NET 9 is out today.
𝗖# 𝟭𝟯
Params collections, enhanced lock types, and a new escape make coding smoother. Plus, implicit index access to simplify initialization.
𝗔𝗦𝗣.𝗡𝗘𝗧 𝗖𝗼𝗿𝗲
OpenAPI enhancements, faster asset delivery, PAR support, and the new HybridCache library boost performance and security.
𝗘𝗙 𝗖𝗼𝗿𝗲
Improved Cosmos DB support, pre-compiled AOT queries, better LINQ, and streamlined migrations make data handling faster.
𝗥𝘂𝗻𝘁𝗶𝗺𝗲
Feature switches, control-flow enforcement, and dynamic adaptation improve performance across different app sizes.
𝗟𝗶𝗯𝗿𝗮𝗿𝗶𝗲𝘀
Base64Url, new TimeSpan overloads, new collections, and cryptography upgrades add flexibility and security.
𝗦𝗗𝗞
Run tests in parallel, new terminal logger by default, a workload sets feature.
.𝗡𝗘𝗧 𝗔𝘀𝗽𝗶𝗿𝗲
New MSBuild SDK, an improved dashboard, telemetry updates, support to wait for dependencies, and lots more.
.𝗡𝗘𝗧 𝗠𝗔𝗨𝗜
Opt into Native AOT deployment, embedding APIs, full trimming, and new controls for smaller, faster mobile apps.
@fullStackDevs
𝗖# 𝟭𝟯
Params collections, enhanced lock types, and a new escape make coding smoother. Plus, implicit index access to simplify initialization.
𝗔𝗦𝗣.𝗡𝗘𝗧 𝗖𝗼𝗿𝗲
OpenAPI enhancements, faster asset delivery, PAR support, and the new HybridCache library boost performance and security.
𝗘𝗙 𝗖𝗼𝗿𝗲
Improved Cosmos DB support, pre-compiled AOT queries, better LINQ, and streamlined migrations make data handling faster.
𝗥𝘂𝗻𝘁𝗶𝗺𝗲
Feature switches, control-flow enforcement, and dynamic adaptation improve performance across different app sizes.
𝗟𝗶𝗯𝗿𝗮𝗿𝗶𝗲𝘀
Base64Url, new TimeSpan overloads, new collections, and cryptography upgrades add flexibility and security.
𝗦𝗗𝗞
Run tests in parallel, new terminal logger by default, a workload sets feature.
.𝗡𝗘𝗧 𝗔𝘀𝗽𝗶𝗿𝗲
New MSBuild SDK, an improved dashboard, telemetry updates, support to wait for dependencies, and lots more.
.𝗡𝗘𝗧 𝗠𝗔𝗨𝗜
Opt into Native AOT deployment, embedding APIs, full trimming, and new controls for smaller, faster mobile apps.
@fullStackDevs
👍2🔥2
📌 LLM چیست؟ (مدلهای زبانی بزرگ) 🤖
🔹 تا حالا فکر کردی چطور چتباتهای هوشمند مثل ChatGPT میتونن باهات مکالمه کنن؟
🔹 چطور یه مدل هوش مصنوعی میتونه کدنویسی کنه، متن بنویسه و ترجمه کنه؟
همهی اینا به لطف LLM یا Large Language Model (مدلهای زبانی بزرگ) انجام میشه! 🚀
💡 LLM چطور کار میکند؟
مدلهای زبانی بزرگ با استفاده از شبکههای عصبی عمیق و معماری Transformer روی حجم عظیمی از دادههای متنی آموزش میبینن. این مدلها میتونن:
✅ متن تولید کنن
✅ سؤالات رو پاسخ بدن
✅ کدنویسی کنن
✅ ترجمه و خلاصهسازی کنن
🔥 چند نمونه از LLMهای معروف:
💠 GPT-4 (OpenAI) – مدل ChatGPT
💠 Gemini (Google DeepMind)
💠 Claude (Anthropic)
💠 LLaMA (Meta)
💠 Mistral (مدل متنباز)
این مدلها در حال تغییر دنیای برنامهنویسی، تولید محتوا و تعاملات دیجیتال هستن! 🌍💻
📢 نظر تو چیه؟ آیندهی هوش مصنوعی و برنامهنویسی رو چطور میبینی؟ 👇✨
🔹 #هوش_مصنوعی #LLM #ChatGPT #یادگیری_ماشین #توسعه_دهنده #کدنویسی
@fullStackDevs
🔹 تا حالا فکر کردی چطور چتباتهای هوشمند مثل ChatGPT میتونن باهات مکالمه کنن؟
🔹 چطور یه مدل هوش مصنوعی میتونه کدنویسی کنه، متن بنویسه و ترجمه کنه؟
همهی اینا به لطف LLM یا Large Language Model (مدلهای زبانی بزرگ) انجام میشه! 🚀
💡 LLM چطور کار میکند؟
مدلهای زبانی بزرگ با استفاده از شبکههای عصبی عمیق و معماری Transformer روی حجم عظیمی از دادههای متنی آموزش میبینن. این مدلها میتونن:
✅ متن تولید کنن
✅ سؤالات رو پاسخ بدن
✅ کدنویسی کنن
✅ ترجمه و خلاصهسازی کنن
🔥 چند نمونه از LLMهای معروف:
💠 GPT-4 (OpenAI) – مدل ChatGPT
💠 Gemini (Google DeepMind)
💠 Claude (Anthropic)
💠 LLaMA (Meta)
💠 Mistral (مدل متنباز)
این مدلها در حال تغییر دنیای برنامهنویسی، تولید محتوا و تعاملات دیجیتال هستن! 🌍💻
📢 نظر تو چیه؟ آیندهی هوش مصنوعی و برنامهنویسی رو چطور میبینی؟ 👇✨
🔹 #هوش_مصنوعی #LLM #ChatGPT #یادگیری_ماشین #توسعه_دهنده #کدنویسی
@fullStackDevs
👍4
Generate beautiful API documentation from OpenAPI
Redoc is an open source tool for generating documentation from OpenAPI (formerly Swagger) definitions.
By default Redoc offers a three-panel, responsive layout:
The left panel contains a search bar and navigation menu.
The central panel contains the documentation.
The right panel contains request and response examples.
Live demo
If you want to see how Redoc renders your OpenAPI definition, you can try it out online at https://redocly.github.io/redoc/.
Source: https://github.com/Redocly/redoc
#ReDoc #OpenAPI #Swagger
@fullStackDevs
Redoc is an open source tool for generating documentation from OpenAPI (formerly Swagger) definitions.
By default Redoc offers a three-panel, responsive layout:
The left panel contains a search bar and navigation menu.
The central panel contains the documentation.
The right panel contains request and response examples.
Live demo
If you want to see how Redoc renders your OpenAPI definition, you can try it out online at https://redocly.github.io/redoc/.
Source: https://github.com/Redocly/redoc
#ReDoc #OpenAPI #Swagger
@fullStackDevs
👍5
Ultimate Docker Commands Cheat Sheet – All You Need to Know! 🐳
Save these images to have all essential Docker commands at your fingertips! 💡
#Docker #DevOps #Containers #Kubernetes #Cloud #Backend
@fullStackDevs
Save these images to have all essential Docker commands at your fingertips! 💡
#Docker #DevOps #Containers #Kubernetes #Cloud #Backend
@fullStackDevs
🔥6
#Algorithm #Sliding_window
#SlidingWindow #CSharp
🧩 الگوریتم Sliding Window:
الگوریتم Sliding Window یکی از تکنیکهای مهم برای حل مسائل آرایهها و رشتهها به طور بهینه است. این روش با استفاده از دو نشانگر برای بررسی بخشهای مختلف داده، به سرعت جواب رو پیدا میکنه.
🔑 چطور کار میکنه؟
- دو نشانگر (`left` و `right`) برای نمایش پنجره (قسمتی از داده) استفاده میکنیم.
- نشانگر راست حرکت میکنه و هر بار یک کاراکتر یا مقدار جدید بررسی میشه.
- وقتی که شرایط خاصی مثل وجود مقدار تکراری یا رسیدن به اندازهای خاص محقق بشه، نشانگر چپ حرکت میکنه تا پنجره رو کوچکتر کنیم.
مزیت اصلی: زمان اجرا به O(n) کاهش مییابد که نسبت به روشهای سنتی با O(n²) بسیار سریعتر است.
💡 مثال: طول بزرگترین زیررشته بدون کاراکتر تکراری
ورودی: "abcabcbb"
خروجی: 3 (زیربرنامه "abc" بزرگترین زیررشته بدون تکرار است)
کاربردها:
- پیدا کردن طول بزرگترین زیررشته یا زیرآرایه
- جستجوی زیرمجموعهها با ویژگیهای خاص
- مسائل مربوط به جمع یا مقایسه زیرآرایهها و زیررشتهها
این الگوریتم خیلی مفیده برای حل مسائل بهینه در آرایهها و رشتهها، خصوصاً وقتی نیاز به
بررسی بخشهای مختلف داریم!
@fullStackDevs
#SlidingWindow #CSharp
🧩 الگوریتم Sliding Window:
الگوریتم Sliding Window یکی از تکنیکهای مهم برای حل مسائل آرایهها و رشتهها به طور بهینه است. این روش با استفاده از دو نشانگر برای بررسی بخشهای مختلف داده، به سرعت جواب رو پیدا میکنه.
🔑 چطور کار میکنه؟
- دو نشانگر (`left` و `right`) برای نمایش پنجره (قسمتی از داده) استفاده میکنیم.
- نشانگر راست حرکت میکنه و هر بار یک کاراکتر یا مقدار جدید بررسی میشه.
- وقتی که شرایط خاصی مثل وجود مقدار تکراری یا رسیدن به اندازهای خاص محقق بشه، نشانگر چپ حرکت میکنه تا پنجره رو کوچکتر کنیم.
مزیت اصلی: زمان اجرا به O(n) کاهش مییابد که نسبت به روشهای سنتی با O(n²) بسیار سریعتر است.
💡 مثال: طول بزرگترین زیررشته بدون کاراکتر تکراری
ورودی: "abcabcbb"
خروجی: 3 (زیربرنامه "abc" بزرگترین زیررشته بدون تکرار است)
using System;
using System.Collections.Generic;
class Solution {
public int LengthOfLongestSubstring(string s) {
HashSet<char> set = new HashSet<char>();
int left = 0, maxLength = 0;
for (int right = 0; right < s.Length; right++) {
while (set.Contains(s[right])) {
set.Remove(s[left]);
left++;
}
set.Add(s[right]);
maxLength = Math.Max(maxLength, right - left + 1);
}
return maxLength;
}
}
کاربردها:
- پیدا کردن طول بزرگترین زیررشته یا زیرآرایه
- جستجوی زیرمجموعهها با ویژگیهای خاص
- مسائل مربوط به جمع یا مقایسه زیرآرایهها و زیررشتهها
این الگوریتم خیلی مفیده برای حل مسائل بهینه در آرایهها و رشتهها، خصوصاً وقتی نیاز به
بررسی بخشهای مختلف داریم!
@fullStackDevs
👍5
🔰وقتی سیستمها با هم حرف میزنند:
Command vs Event vs Pub/Sub
معمولا پیام هایی که در بین سیستم ها تبادل می شود در دو دسته قرار دارن.
❇ در دسته اول فرستنده پیام هایی میفرسته که مشخص کننده اینکه یک عملیات باید انجام بشه، مثل PlaceOrder که به معنی "ثبت سفارشجدید " هست. این نوع پیامها Command نام دارند.
در مورد Command، بین فرستنده (sender) و گیرنده (receiver) یک وابستگی منطقی (logical coupling) وجود داره، چون فرستنده میدونه که گیرنده باید با اون دستور چی کار کنه.
این یعنی فرستنده دقیقاً مشخص میکنه چه کاری باید انجام بشه (مثلاً "سفارش ثبت کن") و فرض میگیره که گیرنده توانایی انجامش رو داره.
دستورها (Commands) معمولاً فقط توسط یک گیرنده پردازش میشن، که این موضوع باعث انعطافپذیری کمتری میشه.
📌 برای مثال: اگر بخوای چند سیستم همزمان به یک Command پاسخ بدن، باید تغییراتی در منطق اون Command ایجاد کنی که برخلاف اصل Open/Closed هست.
❇ در دسته دوم Event ها هستن، Event ها فقط اطلاع میدن که "یه اتفاق افتاده"، مثلاً OrderCreated یعنی "سفارش ثبت شد".
🚨 فرقش با Command اینه که Event یه گزارشه از یه چیزیه ک تمومشده، نه درخواست اجرای یه عملیات.
و Eventها loosely coupled هستن چون فرستنده اصلاً نمیدونه که چه کسی قراره به این پیام واکنش نشون بده یا چطور باهاش برخورد بشه. فرستنده فقط میگه: "این اتفاق افتاد" .
دلیل این موضوع هم اینه که Event ها معمولاً بر اساس الگوی(Publish/Subscribe) کار میکنن. یعنی یه نفر Event رو publish میکنه، و هر کسی که به اون Event علاقهمنده (subscriber) اون رو دریافت میکنه.
بهخاطر این وابستگیه کمی که Publish/Subscribe در بین Publisher و Subscriber ایجاد میکنه، در خیلی از موارد استفاده از Event ها ترجیح داده میشن نسبت به Commandها.
یکی از مزایای مهم Event اینه که میتونی Subscriber جدید اضافه کنی بدون اینکه کدهای موجود رو تغییر بدی.
💡 این خیلی ارزشمنده چون توسعه سیستم رو بدون درگیر شدن با بقیه بخشها ممکن میکنه.
یعنی تیم بیزینس میتونه یه Bounded Context جدید به راحتی اضافه کنه، بدون اینکه به کدهای فعلی دست بزنه یا کار تیمهای دیگه رو مختل کنه.
📌 مثلاً در مثال فروشگاه اینترنتی، اگر OrderCreated منتشر بشه، تیم مارکتینگ فقط با Subscribe کردن به اون Event میتونه وارد جریان بشه، بدون اینکه توی سیستم سفارشگذاری اصلی دخالتی ایجاد کنه.
@fullStackDevs
Command vs Event vs Pub/Sub
معمولا پیام هایی که در بین سیستم ها تبادل می شود در دو دسته قرار دارن.
❇ در دسته اول فرستنده پیام هایی میفرسته که مشخص کننده اینکه یک عملیات باید انجام بشه، مثل PlaceOrder که به معنی "ثبت سفارشجدید " هست. این نوع پیامها Command نام دارند.
در مورد Command، بین فرستنده (sender) و گیرنده (receiver) یک وابستگی منطقی (logical coupling) وجود داره، چون فرستنده میدونه که گیرنده باید با اون دستور چی کار کنه.
این یعنی فرستنده دقیقاً مشخص میکنه چه کاری باید انجام بشه (مثلاً "سفارش ثبت کن") و فرض میگیره که گیرنده توانایی انجامش رو داره.
دستورها (Commands) معمولاً فقط توسط یک گیرنده پردازش میشن، که این موضوع باعث انعطافپذیری کمتری میشه.
📌 برای مثال: اگر بخوای چند سیستم همزمان به یک Command پاسخ بدن، باید تغییراتی در منطق اون Command ایجاد کنی که برخلاف اصل Open/Closed هست.
❇ در دسته دوم Event ها هستن، Event ها فقط اطلاع میدن که "یه اتفاق افتاده"، مثلاً OrderCreated یعنی "سفارش ثبت شد".
🚨 فرقش با Command اینه که Event یه گزارشه از یه چیزیه ک تمومشده، نه درخواست اجرای یه عملیات.
و Eventها loosely coupled هستن چون فرستنده اصلاً نمیدونه که چه کسی قراره به این پیام واکنش نشون بده یا چطور باهاش برخورد بشه. فرستنده فقط میگه: "این اتفاق افتاد" .
دلیل این موضوع هم اینه که Event ها معمولاً بر اساس الگوی(Publish/Subscribe) کار میکنن. یعنی یه نفر Event رو publish میکنه، و هر کسی که به اون Event علاقهمنده (subscriber) اون رو دریافت میکنه.
بهخاطر این وابستگیه کمی که Publish/Subscribe در بین Publisher و Subscriber ایجاد میکنه، در خیلی از موارد استفاده از Event ها ترجیح داده میشن نسبت به Commandها.
یکی از مزایای مهم Event اینه که میتونی Subscriber جدید اضافه کنی بدون اینکه کدهای موجود رو تغییر بدی.
💡 این خیلی ارزشمنده چون توسعه سیستم رو بدون درگیر شدن با بقیه بخشها ممکن میکنه.
یعنی تیم بیزینس میتونه یه Bounded Context جدید به راحتی اضافه کنه، بدون اینکه به کدهای فعلی دست بزنه یا کار تیمهای دیگه رو مختل کنه.
📌 مثلاً در مثال فروشگاه اینترنتی، اگر OrderCreated منتشر بشه، تیم مارکتینگ فقط با Subscribe کردن به اون Event میتونه وارد جریان بشه، بدون اینکه توی سیستم سفارشگذاری اصلی دخالتی ایجاد کنه.
@fullStackDevs
👍5