مطالب
دریافت فایل از یوتیوب

سلام

سال نو مبارک! به امید سالی بهتر از پارسال!

این روزها با هزینه‌‌ای معادل هزینه‌ی تهیه‌ی یک هاست اشتراکی سالیانه برای بالاگذاری یک سایت معمولی در 5 سال قبل، می‌توان یک VPS تهیه کرد و به این صورت قفل و کلید یک نیمچه سرور را (با 200 و خرده‌ای مگ رم، 30 گیگ فضا، سرعت CPU نزدیک به 700 MHz و ویندوز سرور 2003 یا 2008) در اختیار شما قرار می‌دهند (البته به قول معروف هر چقدر پول بدهید همانقدر هم سخت افزار در اختیار شما قرار می‌دهند) بجای صرفا یک دایرکتوری مجازی محدود با 100 مگ فضای هاست که هر احدی در آن هاست اشتراکی می‌تواند سر مبارک را اندکی چرخانده و تمام زندگی شما را مرور کند و غیره!
استفاده‌ی مفیدی هم که این VPS برای من داشته، ترنس لود کردن یک سری فایل است (با توجه به سرعت‌های نجومی دریافت فایل این سرورها). برای مثال دریافت فایل از یوتیوب و انتقال به یک هاست دیگر برای دریافت ساده‌تر خودم و یا دیگران.
برای نمونه سایت dotnet-tv.com را در نظر بگیرید. تعدادی از ویدیوهای این سایت در یوتیوب هاست شده و از این دست زیاد هستند. خیلی‌ها برای فرار از مشکلات کمبود پهنای باند از یوتیوب استفاده می‌کنند. یوتیوب هم که از این طرف بسته است. خوب، من الان می‌خواهم ویدیوی مربوط به ASP.Net MVC آن را مشاهده کنم، چکار باید کرد؟!
یک برنامه‌ی ساده‌ی کنسول را تهیه کرده‌ام که این کار را برای VPS‌ داران تسهیل می‌کند.
- دریافت فایل از یوتیوب
- آپلود خودکار آن به رپیدشیر


یک نمونه خروجی آن: (فایل‌های یوتیوب سایت ذکر شده که به رپیدشیر منتقل شده)
دریافت

در سورس این برنامه موارد زیر پیاده سازی شده است:
- یافتن لینک‌های یوتیوب سایت dotnet-tv.com با استفاده از regular expressions
- یافتن لینک دانلود مستقیم این فایل‌ها از سایت یوتیوب که شامل استفاده از regular expressions برای استخراج قسمت‌های مفید از صفحات و همچنین استفاده از امکانات Json دات نت فریم ورک سه و نیم برای parse قسمت‌های استخراج شده است.
- ایجاد یک thread pool سفارشی که هر بار 7 لینک مستقیم را به صورت همزمان از یوتیوب دریافت می‌کند. (thread pool پیش فرض دات نت تمام تردها را به یکباره شروع می‌کند که برای اینکار مفید نیست. به همین جهت از این thread pool سفارشی شده استفاده شد)
پیش فرض فایلی که از سایت یوتیوب دریافت می‌شود MP4 با کیفیت بالا است که با fmt=18 در فایل Youtube.cs مشخص شده. فرمت‌های دیگر را می‌توانید از این فایل ایده بگیرید.
- آپلود فایل دریافتی از یوتیوب به یک اکانت رایگان کالکتور در رپیدشیر. (ماخذ این مورد در سایت code projects)
مشخصات این اکانت رایگان کالکتور در فایل app.config باید ذکر شود.

این سورس می‌تونه ایده‌ی ابتدایی بسیاری از کارهای مشابه باشد. برای مثال ایجاد یک وب سرویس، یک وب سایت، یک سرویس ایمیلی و غیره.



پ.ن.
کار انجام شده فعالیت وارز محسوب نمی‌شود زیرا مجوز ویدیوهای سایت یوتیوب این امکان توزیع (و بسیاری موارد دیگر) را به شما می‌دهد.

دوره‌ها
مبانی Async در C# 5
دات نت فریم ورک، از زمان ارائه نگارش یک آن، از اعمال غیرهمزمان و API خاص آن پشتیبانی می‌کرده‌است. همچنین این مورد یکی از ویژگی‌های Win32 نیز می‌باشد. نوشتن کدهای همزمان متداول بسیار ساده است. در این نوع کدها هر عملیات خاص، پس از پایان عملیات قبلی انجام می‌شود، اما برای انجام اعمال طولانی مانند دریافت اطلاعات از وب، مناسب نبوده و سبب قفل شدن ترد اصلی برنامه می‌شوند. برای حل این مشکل، راه‌حل‌های غیرهمزمانی از نگارش‌های آغازین دات نت وجود داشته‌اند؛ اما کار کردن با آن‌ها ساده نبوده و در روال‌های رخ‌دادگردان و یا تردهای دیگری بجز ترد اصلی و رابط کاربری برنامه صورت می‌گیرند که هر کدام مشکلات خوانایی، نگهداری و توسعه‌ی خاص خود را دارند. برای رفع این مشکلات، پشتیبانی توکاری از اعمال async در سی‌شارپ 5 صورت گرفته است که موضوع بحث دوره‌ی جاری می‌باشد.
اشتراک‌ها
پروژه MsQuic ماکروسافت سورس باز شد

پروتکل‌های قبل از HTTP/3 از پروتکلTCP برای انتقال اطلاعات و از لایه امنیتی TLS "بر روی آن" برای تامین امنیت استفاده می‌کردند

ولی HTTP/3 از پروتکل QUIC (مخفف Quick UDP Internet Connections) برای انتقال اطلاعات و از TLS 1.3 "به صورت تو کار" استفاده میکند. 

پروتکل QUIC یک Transport Layer Network Protocol (پروتکل انتقال اطلاعات در شبکه - مثلا مشابه TCP یا UDP است) که در ابتدا توسط گوگل توسعه داده شده و بعد‌ها توسط IETF (کارگروه مهندسی اینترنت) به عنوان یک استاندارد به ثبت رسیده.

این پروتکل نسبت به TCP سریع‌تر و قابل اطمینان‌تر است، latency (تاخیر) کمتری دارد و ایمن‌تر است.

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

از طرفی قراره توی دات نت 5 به صورت آزمایشی از HTTP/3 پشتیبانی بشه و داخل Kestrel و HttpClient ازش بهره برده بشه. تیم دات نت برای پیاده سازی این این قابلیت از MsQuic استفاده میکنه 

پروژه MsQuic ماکروسافت سورس باز شد
نظرات مطالب
غنی سازی کامپایلر C# 9.0 با افزونه‌ها
یک نکته‌ی تکمیلی: ارتقاء به NET 7.0.12. و دریافت خطای CA1852

اگر نکات این مطلب را پیاده سازی کرده و برای مثال TreatWarningsAsErrors را فعال کرده باشید، با ارتقاء به NET 7.0.102. حتی در مورد فایل Program.cs نیز خطای زیر را دریافت خواهید کرد:
CA1852:  Type can be sealed because it has no subtypes in its containing assembly and is not externally visible
عموما از هر نگارشی به نگارش دیگر، تعداد آنالایزرهای توکار دات نت بیشتر می‌شوند. یک چنین موردی در نگارش ابتدایی دات نت 7 وجود نداشت، اما الان قابل مشاهده است. در جهت مواجه شدن با آن یا می‌توان کلاس عنوان شده را با واژه‌ی کلیدی sealed مزین کرد و یا فقط کافی است فایل editorconfig. را باز کرده و یک سطر زیر را به آن اضافه کنید:
dotnet_diagnostic.CA1852.severity = suggestion
به این صورت میزان شدت گزارش یاد شده، صرفا به یک توصیه تقلیل پیدا می‌کند و مانع build برنامه نخواهد شد؛ هرچند در IDE هنوز به صورت یک هشدار آبی رنگ قابل مشاهده‌است.
نظرات مطالب
آزمون‌های یکپارچگی در برنامه‌های ASP.NET Core
یک نکته‌ی تکمیلی: دسترسی به کلاس Program از نوع internal دات نت 6 در یک پروژه‌ی دیگر

در مطلب فوق چنین قطعه کدی را داریم:
public class CustomWebApplicationFactory : WebApplicationFactory<Program>
اگر از top level programs دات نت 6 استفاده کنیم، اینبار کلاس Program دیگر public نیست و internal است. به همین جهت نمی‌توان از کلاس Program در یک اسمبلی دیگر استفاده کرد؛ مگر اینکه در فایل csproj پروژه‌ی اصلی، تنظیم زیر را اضافه کنیم. در اینجا Include به نام پروژه‌ی Test (و فضای نام اصلی اسمبلی آن) اشاره می‌کند. همچنین چون Program از نوع internal است، اینبار کلاس فکتوری تهیه شده نیز باید internal تعریف شود:
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <InternalsVisibleTo Include="ProjName.Tests" />
  </ItemGroup>
</Project>
نظرات مطالب
PHP سریعتر از ASP.NET! افسانه یا واقعیت؟

چندین علت داره:

- پروسه کامپایل کدهای دات نت یک مرحله‌ای نیست. کلا در دات نت کدها به یک زبان میانی به نام IL ترجمه میشن. بعد این IL توسط  JIT compiler تبدیل به کدهای ماشین میشه. در ASP.NET این مساله هم برای کدهای پشت صحنه برنامه و هم برای خود صفحات رخ می‌ده. بنابراین برای بار اول مشاهده، روند این پروسه الزامی هست. ولی برای دفعات بعدی مشاهده خیر. البته روش برای پیش کامپایل کردن کامل صفحات هم وجود داره و یا در IISهای جدید یک سری مبحث warmup توکار پیش بینی شده.

- همچنین IIS برای مدیریت منابع سرور، یک سایت رو مدام در حافظه نگه نمی‌داره. فقط زمانیکه اولین درخواست به سرور میرسه سایت رو بارگذاری می‌کنه و application pool اون رو استارت. این هم یک زمان اولیه اندکی رو ممکنه به خودش اختصاص بده. بعلاوه پس از مدتی، یک سایت بیکار رو از حافظه خارج می‌کنه. بهش می‌گن ریسایکل کردن. در ASP.NET 4.0 به بعد امکان تنظیم auto-start برای سایت‌ها هست.

نظرات مطالب
خلاصه‌ای کوتاه در مورد WinRT
خیر. به WinRT یا Windows run time جدید به چشم Silverlight run time نگاه کنید. لایه‌ای است بالاتر از Win32 API که برفراز آن‌ می‌شود برنامه توسعه داد (WPF فقط یک روش طراحی رابط کاربری جدید است، run time نیست). WinRT شبیه به همان مدل امنیتی بسته سیلورلایت را به ارث برده. همان لایه نمایش XAML را به ارث برده. با این تفاوت که این run time جدید آن علاوه بر XAML ، امکان کار با HTML5 و جاوا اسکریپت را هم می‌دهد و محدود به XAML نیست. برخلاف سیلورلایت، این run time فقط محدود به دات نت هم نیست و با CPP و Native کد هم می‌شود با آن کار کرد. به این نتیجه رسیدند که طراحی خوبی انجام دادن، خوب چرا فقط دات نت استفاده کند؟
ضمنا این محدودیت‌های امنیتی ذکر شده برای آن قطعا برای خیلی از برنامه نویس‌ها خوشایند نخواهد بود. برای دسترسی بیشتر، مجبور خواهند شد به سیستم‌های دسکتاپ سابق رجوع کنند.
مطالب
Data Access Layer based on ADO.NET - Mapper Class
مدتی بود هنگام کار کردن با لایه SqlDataProvider در دات نت نیوک ، به این فکر می کردم که چطور میشه بدون استفاده از کلاس های خود دات نت نیوک  ، از قابلیت Mapping ی که داره استفاده کرد یا به زبان دیگر یه کلاس Mapper ایجاد کرد (شبیه EF) که نیاز به تنظیمات EF نداشته باشه ولی Mapping را انجام دهد. (برای آن دسته از دوستانی که با DotNetNuke آشنایی ندارند باید عرض کنم که DNN یک معماری سه لایه دارد شامل DataProvider  ، SqlDataProvider ، Control و Info که در SqlDataProvider شما اطلاعات مربوط به دیتابیس را تنظیم کرده و می توانید آن را با کلاس Info که یک Common Layer محسوب می شود Map کنید) . برای همین شروع به نوشتن یک Data Access Layer کردم که میتواند این نگاشت را بین خروجی کوئری و Property های کلاس ایجاد کند. البته این اسمبلی بیشتر مناسب خروجی با ستون های زیاد و سطر های کم می باشد. 
این اسمبلی را برای دانلود قرار می دهم و از شما می خواهم که آن را آزمایش کرده و نظر خود را با بنده درمیان بگذارید .
 با تشکر و آرزوی موفقیت

دانلود Version 1.2.0.0 + Help File