Mahi in Tech
یک نمونه پیادهسازی خیلی ساده در asp.net
👍5
Forwarded from رقصنده با کد (Ali KhodaeiDoost)
shahriaarrr
مطلب فنی کافیه، یکی جلوی AI رو بگیره :))))))-
2 19 6
یکی از دوستان کاربلد و تیمش مدتیه که روی یه سرویس جذاب به اسم «مثلث» کار میکنن؛ یه پلتفرم تولید محتوای خودکار با هوش مصنوعی (AI) که الان به بلوغ خیلی خوبی رسیده و نتایجش واقعاً دیدنیه.
چیزی که من از خروجیهاش دیدم، قشنگ کار ۳ نیروی انسانی رو براتون انجام میده 😄. انگار بهجای استخدام چند نفر، یه سیستم خودکار دارید که:
- هر روز سایتتون رو با محتوای سئو شده و کامل بهروز میکنه.
- مستقیماً به سرچکنسول وصل میشه تا آمار واقعی بده.
- توی ۶۰ روز میتونه رشد ۳۰ تا ۵۰ درصدی توی کلیک و ایمپرشن ایجاد کنه.
- وقتی به صفحه اول گوگل (Top 10) برسید، خودش بهتون خبر میده.
اگه دنبال رشد بیدردسر سایتتون هستید، پیشنهاد میکنم تستش کنید.
رایگان امتحان کنید:
کد تخفیف ۵۰٪ هم توی تصویر هست، میتونید استفاده کنید.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥3
توی یکی از پروژههای فرانتاندی اخیر، قصد داشتم مثل همیشه از swagger codegen استفاده کنم تا از مزایاش برای ارتباط راحتتر با api بهرهمند شم (در ادامه میگم)، ولی خب از اونجایی فایل executableش یک فایل jar بود و نیاز به نصب جاوا داشت و منطقی نبود 😁 تصمیم گرفتم دنبال پکیج جایگزینی بگردم، که با Orval آشنا شدم.
حالا این چیکار میکنه و چرا باید ازش استفاده کرد؟
سناریوی دردناک و رایج:
تیم بکاند تغییری در خروجی API میده (مثلاً userName تبدیل میشه به fullName).
فرانتاند کار از این تغییر بیخبره یا فراموش میکنه اینترفیسهای TypeScript رو آپدیت کنه.
پروژه بیلد میشه، اما توی مرورگر کاربر به خطای undefined میخوره و کرش میکنه!
جدا از این، نوشتن دستی Typeها و Interfaceها برای هر API وقتگیر و خستهکنندهست.
✅ راه حل: ابزار Orval به شما کمک میکنه بهجای اینکه دستی کدهای ارتباط با API یا Schemaـها رو بنویسید، میاد و فایل Swagger/OpenAPI بکاند رو میخونه و تمام کدهای مورد نیاز فرانتاند (مثل هوکهای React Query، کلاینت Axios و تایپهای TypeScript) رو بهصورت خودکار و ساختاریافته تولید میکنه.
⚙️ چطوری کار میکنه؟ کافیه آدرس فایل swagger.json خروجی گرفته شده از ASP.NET (یا هر تکنولوژی دیگهای) رو به Orval بدید.
نتیجه:
- تولید خودکار هوکها: مثلاً بهجای نوشتن دستی useQuery، خودش ()useGetUsers رو با تایپ دقیق ورودی و خروجی بهت میده.
- امن بودن تغییرات (Type Safety): اگر بکاند اسم فیلدی رو عوض کنه، کد فرانتاند دیگه بیلد نمیشه (Compile Error) و همون لحظه متوجه میشی، نه هنگام استفاده!
- هماهنگی ۱۰۰٪: فرانتاند همیشه با آخرین تغییرات داکیومنت بکاند سینک میمونه.
اطلاعات بیشتر:
github.com/orval-labs/orval
حالا این چیکار میکنه و چرا باید ازش استفاده کرد؟
سناریوی دردناک و رایج:
تیم بکاند تغییری در خروجی API میده (مثلاً userName تبدیل میشه به fullName).
فرانتاند کار از این تغییر بیخبره یا فراموش میکنه اینترفیسهای TypeScript رو آپدیت کنه.
پروژه بیلد میشه، اما توی مرورگر کاربر به خطای undefined میخوره و کرش میکنه!
جدا از این، نوشتن دستی Typeها و Interfaceها برای هر API وقتگیر و خستهکنندهست.
نتیجه:
- تولید خودکار هوکها: مثلاً بهجای نوشتن دستی useQuery، خودش ()useGetUsers رو با تایپ دقیق ورودی و خروجی بهت میده.
- امن بودن تغییرات (Type Safety): اگر بکاند اسم فیلدی رو عوض کنه، کد فرانتاند دیگه بیلد نمیشه (Compile Error) و همون لحظه متوجه میشی، نه هنگام استفاده!
- هماهنگی ۱۰۰٪: فرانتاند همیشه با آخرین تغییرات داکیومنت بکاند سینک میمونه.
اطلاعات بیشتر:
github.com/orval-labs/orval
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - orval-labs/orval: orval is able to generate client with appropriate type-signatures (TypeScript) from any valid OpenAPI…
orval is able to generate client with appropriate type-signatures (TypeScript) from any valid OpenAPI v3 or Swagger v2 specification, either in yaml or json formats. 🍺 - orval-labs/orval
4👍7 4
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰10
Forwarded from Software Philosophy
بازنویسی تاریخی در دنیای داتنت با 9 NET.!
تیم NuGet در مایکروسافت موفق شد الگوریتم Restore را در نسخه 9 NET. بهطور کامل بازنویسی کند؛ نتیجه؟ افزایش سرعت تا ۱۶ برابر!
📉 زمان Restore برای پروژههای بزرگ از ۳۲ دقیقه به فقط ۲ دقیقه رسید!
چرا این اتفاق افتاد؟
- الگوریتم قبلی بیش از ۱۰ سال بدون تغییر باقی مانده بود.
- پروژههای بزرگ مثل TeamX با کندی شدید مواجه شده بودند.
- ساختار بازگشتی و حافظهبر باعث دیباگ سخت و مصرف منابع بالا شده بود.
چه تغییراتی اعمال شد؟
- حذف ساخت گراف کامل و جایگزینی با ساختار تخت و تصمیمگیری لحظهای.
- بهینهسازی حافظه، کاهش تعداد تکرارها و حذف نودهای تکراری.
- اضافه شدن ویژگیهایی مثل transitive pinning و مدیریت بهتر خطاها.
📈 نتیجه نهایی:
- افزایش چشمگیر بهرهوری توسعهدهندگان.
- صرفهجویی در منابع زیرساختی.
- آمادهسازی برای مقیاسپذیری در پروژههای عظیم.
🔗 توضیحات کامل را در این لینک ببینید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
تیم NuGet در مایکروسافت موفق شد الگوریتم Restore را در نسخه 9 NET. بهطور کامل بازنویسی کند؛ نتیجه؟ افزایش سرعت تا ۱۶ برابر!
📉 زمان Restore برای پروژههای بزرگ از ۳۲ دقیقه به فقط ۲ دقیقه رسید!
چرا این اتفاق افتاد؟
- الگوریتم قبلی بیش از ۱۰ سال بدون تغییر باقی مانده بود.
- پروژههای بزرگ مثل TeamX با کندی شدید مواجه شده بودند.
- ساختار بازگشتی و حافظهبر باعث دیباگ سخت و مصرف منابع بالا شده بود.
چه تغییراتی اعمال شد؟
- حذف ساخت گراف کامل و جایگزینی با ساختار تخت و تصمیمگیری لحظهای.
- بهینهسازی حافظه، کاهش تعداد تکرارها و حذف نودهای تکراری.
- اضافه شدن ویژگیهایی مثل transitive pinning و مدیریت بهتر خطاها.
📈 نتیجه نهایی:
- افزایش چشمگیر بهرهوری توسعهدهندگان.
- صرفهجویی در منابع زیرساختی.
- آمادهسازی برای مقیاسپذیری در پروژههای عظیم.
🔗 توضیحات کامل را در این لینک ببینید.
⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنتها به اشتراک بگذارید.
#حامد_حاجیلو (لینکدین)
کانال تلگرام:
@SoftwarePhilosophy
______
Microsoft News
How we ended up rewriting NuGet Restore in .NET 9
Learn about the journey that led to a full rewrite of the NuGet Restore algorithm in .NET 9, achieving break-through scale and performance.
🤩2👍1
دست از سر using (new HttpClient) بردارید 😁
توی دنیای داتنت، همیشه به ما یاد دادن که هر کلاسی که IDisposable رو پیادهسازی کرده، باید توی بلاک using استفاده بشه تا منابعش بعد از انجام کار بلافاصله آزاد شه.
اما درمورد HttpClient یه استثنای بزرگ هست که خیلی از افراد هنوز درگیرش میشن.
سناریوی مشکلساز:
شما کدی مینویسید که قراره یه API خارجی رو کال کنه. طبق عادت، اینطوری مینویسید:
روی سیستم خودتون همه چیز عالی هست. پروژه میره روی پروداکشن و زیر بار ترافیک قرار میگیره؛ اما ناگهان لاگها پر میشه از خطای SocketException و سرور عملاً از دسترس خارج میشه.
حالا چرا این اتفاق میافته؟
وقتی شما اینستنس کلاینت رو Dispose میکنید، آبجکت توی کد از بین میره، اما سیستم عامل پورت شبکه (Socket) متصل به اون رو تا چند دقیقه (بهخاطر وضعیت TIME_WAIT در پروتکل TCP) باز نگه میداره.
اگر ترافیک بالا باشه، تمام پورتهای سرور اشغال میشن و سیستم عامل دیگه پورتی نداره که به درخواستهای جدید اختصاص بده (Socket Exhaustion).
✅ یکی از راه حلها: استفاده از
مایکروسافت از نسخهی ۲.۱ داتنت core به بعد، یک راهکار استاندارد و تمیز براش ارائه کرد. به جای ساختن نمونههای جدید، باید مدیریت طول عمر HttpClient رو به فکتوری خودش بسپرید.
⚙️ پیادهسازی:
۱. اول توی فایل Program.cs سرویساش رو رجیستر کنید:
۲. حالا توی سرویس یا کنترلر خودتون، IHttpClientFactory رو اینجکت کنید:
مزایای این روش:
- جلوگیری از کرش سرور: کانکشنها به صورت هوشمند بازیافت و مدیریت میشن.
- پرفورمنس بالاتر: سربار ساختن مداوم کلاینت حذف میشه.
- مدیریت DNS: مشکل معروفِ "کش شدن DNS در HttpClientهای استاتیک" رو هم هندل میکنه.
ℹ️ البته که وقتی از IHttpClientFactory استفاده میکنید، فقط به ساختن کلاینتهای عمومی محدود نیستید و میتونید کلاینتهایی بسازید که تنظیمات خاص خودشون رو داشته باشند یا حتی لاجیک درخواست رو در خودشون نگه دارن، که خب در این پست نمیگنجه. میتونید اینجا و اینجا درموردشون مطالعه کنید.
Use IHttpClientFactory to implement resilient HTTP requests
توی دنیای داتنت، همیشه به ما یاد دادن که هر کلاسی که IDisposable رو پیادهسازی کرده، باید توی بلاک using استفاده بشه تا منابعش بعد از انجام کار بلافاصله آزاد شه.
اما درمورد HttpClient یه استثنای بزرگ هست که خیلی از افراد هنوز درگیرش میشن.
سناریوی مشکلساز:
شما کدی مینویسید که قراره یه API خارجی رو کال کنه. طبق عادت، اینطوری مینویسید:
using (var client = new HttpClient())
{
var response = await client.GetAsync("https://api.example.com");
}
روی سیستم خودتون همه چیز عالی هست. پروژه میره روی پروداکشن و زیر بار ترافیک قرار میگیره؛ اما ناگهان لاگها پر میشه از خطای SocketException و سرور عملاً از دسترس خارج میشه.
حالا چرا این اتفاق میافته؟
وقتی شما اینستنس کلاینت رو Dispose میکنید، آبجکت توی کد از بین میره، اما سیستم عامل پورت شبکه (Socket) متصل به اون رو تا چند دقیقه (بهخاطر وضعیت TIME_WAIT در پروتکل TCP) باز نگه میداره.
اگر ترافیک بالا باشه، تمام پورتهای سرور اشغال میشن و سیستم عامل دیگه پورتی نداره که به درخواستهای جدید اختصاص بده (Socket Exhaustion).
IHttpClientFactoryمایکروسافت از نسخهی ۲.۱ داتنت core به بعد، یک راهکار استاندارد و تمیز براش ارائه کرد. به جای ساختن نمونههای جدید، باید مدیریت طول عمر HttpClient رو به فکتوری خودش بسپرید.
۱. اول توی فایل Program.cs سرویساش رو رجیستر کنید:
builder.Services.AddHttpClient();۲. حالا توی سرویس یا کنترلر خودتون، IHttpClientFactory رو اینجکت کنید:
public class MyService
{
private readonly IHttpClientFactory _clientFactory;
public MyService(IHttpClientFactory clientFactory)
{
_clientFactory = clientFactory;
}
public async Task GetData()
{
var client = _clientFactory.CreateClient();
var response = await client.GetAsync("...");
}
}
مزایای این روش:
- جلوگیری از کرش سرور: کانکشنها به صورت هوشمند بازیافت و مدیریت میشن.
- پرفورمنس بالاتر: سربار ساختن مداوم کلاینت حذف میشه.
- مدیریت DNS: مشکل معروفِ "کش شدن DNS در HttpClientهای استاتیک" رو هم هندل میکنه.
Use IHttpClientFactory to implement resilient HTTP requests
Please open Telegram to view this post
VIEW IN TELEGRAM
درود و امید که خوب باشید.
یکسری منابع قرار میدم که شاید توی این وضعیتای که امیدوارم هرچه زودتر به خوبی تموم شه، بهدردتون بخوره.
دیاناس داخلی:
5.202.100.100
5.202.100.101
رجیستری داکر:
hub.hamdocker.ir
docker.mobinhost.com
docker.arvancloud.ir
میرور NPM, PyPi:
runflare.com/mirrors
میرور Ubuntu:
mirror.digitalvps.ir/ubuntu
ubuntu.pishgaman.net/ubuntu
ubuntu.pars.host
mirror.arvancloud.ir/ubuntu
داکیومنت یهسری از تکنولوژیها و ویکیپدیای کامپیوتر:
193.151.130.199
DNSTT Resolver:
8.8.8.8:53
77.88.8.8:53
77.88.8.1:53
2.188.21.130:53
2.189.1.1:53
یکسری منابع قرار میدم که شاید توی این وضعیتای که امیدوارم هرچه زودتر به خوبی تموم شه، بهدردتون بخوره.
دیاناس داخلی:
5.202.100.100
5.202.100.101
رجیستری داکر:
hub.hamdocker.ir
docker.mobinhost.com
docker.arvancloud.ir
میرور NPM, PyPi:
runflare.com/mirrors
میرور Ubuntu:
mirror.digitalvps.ir/ubuntu
ubuntu.pishgaman.net/ubuntu
ubuntu.pars.host
mirror.arvancloud.ir/ubuntu
داکیومنت یهسری از تکنولوژیها و ویکیپدیای کامپیوتر:
193.151.130.199
DNSTT Resolver:
8.8.8.8:53
77.88.8.8:53
77.88.8.1:53
2.188.21.130:53
2.189.1.1:53
👍3
Mahi in Tech
درود و امید که خوب باشید. یکسری منابع قرار میدم که شاید توی این وضعیتای که امیدوارم هرچه زودتر به خوبی تموم شه، بهدردتون بخوره. دیاناس داخلی: 5.202.100.100 5.202.100.101 رجیستری داکر: hub.hamdocker.ir docker.mobinhost.com docker.arvancloud.ir …
اگر هم قصد داشتید که یک پیامرسان سلفهاست بالا بیارید (چیزی که توی این خاموشی ارتباطات به کار میاد) و حوصلهی سر و کله زدن با اینها و قطعی اینترنت رو برای بالا آوردن mattermost یا rocketchat و یا هرچی نداشتین، میتونید از سرویس hamravesh.com استفاده کنید و روش RocketChat خودتون رو بدون دردسر راهاندازی کنین، E2EE هم میشه روش فعال کرد تا خیالتون کمی راحتتر باشه.
درغیر اینصورت ایمیجهاشون توی همین رجیستریها موجود هستن، میتونید خودتون بالا بیارید.
درغیر اینصورت ایمیجهاشون توی همین رجیستریها موجود هستن، میتونید خودتون بالا بیارید.
👍3