در قسمت قبل، در حین بررسی رفتار جزیرههای تعاملی Blazor Server، نکتهی زیر را هم دربارهی راهبری صفحات SSR مرور کردیم: « اگر دقت کنید، جابجایی بین صفحات، با استفاده از fetch انجام شده؛ یعنی با اینکه این صفحات در اصل static HTML خالص هستند، اما ... کار full reload صفحه مانند ASP.NET Web forms قدیمی انجام نمیشود (و یا حتی برنامههای MVC و Razor pages) و نمایش صفحات، Ajax ای است و با fetch استاندارد آن صورت میگیرد تا هنوز هم حس و حال SPA بودن برنامه حفظ شود. همچنین اطلاعات DOM کل صفحه را هم بهروز رسانی نمیکند؛ فقط موارد تغییر یافته در اینجا به روز رسانی خواهند شد.» در این قسمت، نکات تکمیلی این قابلیت را که به آن enhanced navigation هم گفته میشود، بررسی میکنیم. روش غیرفعال کردن راهبری بهبودیافته برای بعضی از لینکها ویژگی راهبری بهبودیافته فقط در حین هدایت بین صفحات مختلف یک برنامهی Blazor 8x SSR، فعال است. اگر در این بین، کاربری به یک صفحهی غیر بلیزری هدایت شود، راهبری بهبود یافته شکست خورده و سعی میکند حالت full document load را پیاده سازی و اجرا کند. مشکل اینجاست که در این حالت دو درخواست ارسال میشود: ابتدا حالت راهبری بهبودیافته فعال میشود و در ادامه پس از شکست این راهبری، هدایت مستقیم صورت میگیرد. برای رفع این مشکل میتوان ویژگی جدید data-enhance-nav را با مقدار false، به لینکهای خارجی مدنظر اضافه کرد تا برای این حالتها دیگر ویژگی راهبری بهبودیافته فعال نشود: <a href="/not-blazor" data-enhance-nav="false">A non-Blazor page</a> فعالسازی مدیریت بهبودیافتهی فرمهای SSR در قسمت چهارم این سری با فرمهای جدید SSR مخصو, ...ادامه مطلب
تابحال مطالب زیادی را در مورد تمیزکردن ورودیهای کاربران، توسط ابزارهای Anti-XSS مطالعه کردهاید: - «ایجاد یک ActionFilter جهت تمیز کردن اطلاعات ورودی در ASP.NET Core» هدف تمام آنها این است که اگر اطلاعاتی از کاربر دریافت شد، پس از تمیز شدن، مشکلی با نمایش آنها نداشته باشیم و به محض نمایش یک صفحه، قطعه کد جاوااسکریپتی موجود در ورودی اولیهی کاربر، در پشت صحنه به صورت خودکار اجرا نشود. اما ... هرچقدر هم سعی کنیم، به مواردی خواهیم رسید که ممکن است توسط این «تمیز کنندههای ورودی» پوشش داده نشوند و دست آخر، قابلیت اجرایی داشته باشند. در این حالت به مفهوم دیگری میرسیم به نام Content security policy headers و یا به اختصار CSP که اساسا اجرای هر نوع اسکریپت تزریق شدهای را در صفحه، ممنوع میکند: - «افزودن هدرهای Content Security Policy به برنامههای ASP.NET» - «تولید هدرهای Content Security Policy توسط ASP.NET Core برای برنامههای Angular» برای مثال زمانیکه تنظیم CSP ابتدایی زیر را داریم: Content-Security-Policy: default-src 'self' یعنی مرورگر فقط در این صفحه، اطلاعاتی را که متعلق به سایت و دومین جاری است، بارگذاری میکند. در این حالت دیگر ویدیوهای یوتیوب معرفی شده، فایلهای CSS و یا جاوااسکریپتی دریافتی از یک CDN دیگر اجرا نمیشوند؛ چون بارگذاری نخواهند شد. همچنین دیگر نمیتوان یک قطعهی اسکریپتی را هم داخل صفحه به صورت inline تعریف و اجرا کرد. یعنی حداقل اسکریپتهای داخل صفحهای Google analytics هم از کار خواهند افتاد. که این رفتار دقیقا مطلوب ما است؛ , ...ادامه مطلب
در زمان ارائهی ASP.NET Core 2.1، ویژگی جدیدی به نام [ApiController] ارائه شد که با استفاده از آن، یکسری اعمال توکار جهت سهولت کار با Web API توسط خود فریمورک انجام میشوند؛ برای مثال عدم نیاز به بررسی وضعیت ModelState و بررسی خودکار آن با علامتگذاری یک کنترلر به صورت ApiController. یکی دیگر از این ویژگیهای توکار، تبدیل خروجی تمام status codeهای بزرگتر و یا مساوی 400 یا همان Bad Request، به شیء جدید و استاندارد ProblemDetails است: { "type": "https://example.com/probs/out-of-credit", "title": "You do not have enough credit.", "detail": "Your current balance is 30, but that costs 50.", "instance": "/account/12345/msgs/abc", "status": 403, } بازگشت یک چنین خروجی یکدست و استانداردی، استفادهی از آنرا توسط کلاینتها، ساده و قابل پیشبینی میکند. البته باید درنظر داشت که اگر در اینحالت، برنامه یک استثنای معمولی را سبب شود، ProblemDetails ای بازگشت داده نمیشود. اگر برنامه در حالت توسعه اجرا شود، با استفاده از میانافزار app.UseDeveloperExceptionPage، یک صفحهی نمایش جزئیات خطا ظاهر میشود و اگر برنامه در حالت تولید و ارائهی نهایی اجرا شود، یک صفحهی خالی (بدون داشتن response body) با status code مساوی 500 بازگشت داده میشود. این کمبود ویژه و امکانات سفارشی سازی بیشتر آن، به صورت توکار به ASP.NET Core 7x اضافه شدهاند و دیگر نیازی به استفاده از کتابخانههای ثالث دیگری برای انجام آن نیست. ProblemDetails بر اساس RFC7807 طراحی شدهاست RFC7807، قالب استانداردی را برای ارائهی خطاهای HTTP APIها تعریف میکند تا نیازی به وجود تعاریف متعددی, ...ادامه مطلب
دات نت 7 به همراه یک Regex Source Generator توکار است که به کمک آن میتوان عبارات باقاعده را تبدیل به کدهای سیشارپ معادل آنها کرد و پیش از اجرای برنامه، آنها را کامپایل و جزئی از خروجی نهایی نمود. این روش نسبت به روش پیشین تولید کدهای معادل عبارات باقاعده در زمان اجرای برنامه، از مزایای زیر برخوردار است: - اجرای یک عبارت باقاعده سریعتر خواهد شد. در این حالت دیگر نیازی نیست تا در حین اجرای برنامه، منتظر پردازش و تولید کدهای سیشارپ معادل آن شد. - کدهای تولیدی پیش از کامپایل برنامه، از مزایای بهینه سازی ویژهای برخوردار میشوند که پیشتر تنها با ذکر پرچم RegexOptions.Compiled در زمان اجرا میسر میشدند. - بعضی از سکوهای کاری مانند iOS، از تولید کد در زمان اجرای برنامه پشتیبانی نمیکنند. در این حالت یک تولید کنندهی کد سیشارپ معادل در زمان کامپایل برنامه، حداکثر کارآیی را برای اینگونه سکوهای کاری به ارمغان میآورد. - امکان مطالعهی کدهای سیشارپ تولیدی معادل یک عبارت باقاعده، برای اولین بار پیش از اجرای برنامه میسر شدهاست. - کدهای تولیدی معادل، قابلیت دیباگ دارند. - میتوان با مطالعهی این کدها، نکات جدیدی را فرا گرفت! چه عبارت باقاعدهای را میتوان به Regex source generators تبدیل کرد؟ برای استفاده از این تولید کنندهی کدهای معادل عبارات باقاعده، باید از NET 7. و C# 11 استفاده کرد. همچنین تمام پارامترهای Regex تعریف شده نیز باید ثابت باشند. برای نمونه در دو مثال زیر، در اولی، patte ثابت است و در دومی هم patte و هم سایر تنظیمات ذکر شده؛ بنابراین قابلیت تبدیل به روش استفاده از تولید کنندههای کد را دارند: if(new Regex("[a-z]+").IsMatch("abc")){} if(Reg, ...ادامه مطلب
LINQ یا همان Language-Integrated Query، یک زبان سادهی کوئری نوشتن یکپارچهی با دات نت است. به کمک آن میتوان اعمال پیچیدهای را بر روی اشیاء، به زبانی ساده بیان کرد و امروزه تقریبا توسط تمام توسعه دهندگان دات نت مورد استفاده قرار میگیرد. اما ... این سادگی، بهایی را نیز به همراه دارد: کمتر بودن سرعت اجرا و همچنین افزایش مصرف حافظه. با توجه به گستردگی استفادهی از LINQ، اگر بهبودی در این زمینه حاصل شود، بر روی کارآیی تمام برنامههای دات نتی تاثیر خواهد گذاشت و این امر در دات نت 7 محقق شدهاست. کارآیی متدهای LINQ to Objects در دات نت 7 (مانند متدهای Enumerable.Max, Enumerable.Min, Enumerable.Average, Enumerable.Sum) به شدت افزایش یافته و این افزایش گاهی حتی بیشتر از 10 برابر نسبت به نگارشهای قبلی دات نت است؛ اما چگونه به چنین کارآیی رسیدهاند؟ تدارک یک آزمایش برای بررسی میزان افزایش کارآیی متدهای LINQ در دات نت 7 در ادامه یک آزمایش سادهی بررسی کارآیی متدهای Enumerable.Max, Enumerable.Min, Enumerable.Average, Enumerable.Sum را با استفاده از کتابخانهی معروف BenchmarkDotNet مشاهده میکنید: using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Running; using System.Collections.Generic; using System.Linq; [MemoryDiagnoser(displayGenColumns: false)] public partial class Program { static void Main(string[] args) => BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args); [Params (10, 10000)] public int Size { get; set; } private IEnumerable<int> items; [GlobalSetup] public void Setup() { items = Enumerable.Range(1, Size).To, ...ادامه مطلب
استفادهی از Reflection در زیر ساختهای دات نت و ASP.NET Core، بسیار گستردهاست؛ به همین جهت هرگونه بهبود کارآیی در این زمینه، نه فقط بر روی خود فریمورک، بلکه تمام برنامههایی که از آن استفاده میکنند هم تاثیر گذار است. از این لحاظ دات نت 7 شاهد تغییرات گستردهای است تا حدی که کارآیی برنامههای مبتنی بر دات نت 7 ای که از Reflection استفاده میکنند، نسبت به نگارشهای قبلی دات نت، حداقل 2 برابر شدهاست و این برنامهها تنها کاری را که باید انجام دهند، صرفا تغییر target framework مورد استفادهی در آنها به نگارش جدید است. در این مطلب نحوهی رسیدن به این کارآیی بالاتر را بررسی خواهیم کرد. تدارک یک آزمایش برای بررسی میزان افزایش کارآیی Reflection در دات نت 7 یک برنامهی کنسول جدید را ایجاد کرده و سپس کلاس Person را به صورت زیر به آن اضافه میکنیم: namespace NET7Reflection; public class Person { private int _age; inteal Person(int age) => _age = age; private int GetAge() => _age; private void SetAge(int age) => _age = age; } همانطور که مشاهده میکنید، سازندهی این کلاس، inteal است و همچنین دو متد private هم دارد که اگر بخواهیم از آن در جای دیگری استفاده کنیم، یکی از روشهای متداول جهت دسترسی به این امکانات خصوصی، استفاده از Reflection است. به همین جهت ابتدا کتابخانهی BenchmarkDotNet را با TargetFramework دات نت 7 به صورت زیر به پروژه اضافه میکنیم: <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net7.0</TargetFramework> <Implicit, ...ادامه مطلب
بالاخره تفاوت کارآیی بین حلقههای for و foreach در دات نت 7 برطرف شدهاست که این مورد نیز یکی دیگر از دلایل بهبود کارآیی LINQ در دات نت 7 است. در این مطلب به همراه آزمایشی، این مورد را بررسی خواهیم کرد. تدارک یک آزمایش برای بررسی کارآیی حلقههای for و foreach در دات نت 7 یک برنامهی کنسول جدید را ایجاد کرده و سپس کتابخانهی BenchmarkDotNet را با TargetFramework دات نت 7 به صورت زیر به پروژه اضافه میکنیم: <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net7.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <ItemGroup> <PackageReference Include="BenchmarkDotNet" Version="0.13.4" /> </ItemGroup> </Project> در ادامه به این پروژه، کلاس زیر را اضافه میکنیم: using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Jobs; namespace NET7Loops; [SimpleJob(RuntimeMoniker.Net60)] [SimpleJob(RuntimeMoniker.Net70)] [MemoryDiagnoser(false)] public class Benchmarks { private int[] ItemsArray; private List<int> ItemsList; [GlobalSetup] public void Setup() { var random = new Random(420); var randomItems = Enumerable.Range(0, 1000).Select(_ => random.Next()); ItemsArray = randomItems.ToArray(); ItemsList = randomItems.ToList(); } [Benchmark] public void For_Array() { for (var i =, ...ادامه مطلب
نرم افزار Improve English: Word Games دارای الگاریتمی برای یاد گیری و یا بهبود فوق العاده آسان و موثر زبان انگلیسی شما میباشد. با استفاده از این نرم افزار شما با گذراندن چند مرحله ساده بعد از مدت کوتاهی به یک انگلیسی زبان حرفه ای تبدیل خواهید شد و قادر به صبحت با اساتید این رشته میشوید.برنامه Improve English: Word Games همانطور که گفته شد دارای چند مرحله یادگیری میباشد … آفلاین ۱۳۹۶-۱۰-۱۵ 433 بار بدون دیدگاه مجید پاشایینرم افزار Improve English: Word Games دارای الگاریتمی برای یاد گیری و یا بهبود فوق العاده آسان و موثر زبان انگلیسی شما میباشد. با استفاده از این نرم افزار شما با گذراندن چند مرحله ساده بعد از مدت کوتاهی به یک انگلیسی زبان حرفه ای تبدیل خواهید شد و قادر به صبحت با اساتید این رشته میشوید.برنامه Improve English: Word Games همانطور که گفته شد دارای چند مرحله یادگیری میباشد اولین مرحله از مراحل یادگیری آشنایی با حروف و ساختن واژگان به همراه بازی با کلمه ها به صورت زبانی ساده و قابل فهم میباشد. در مرحله اول شما قادر به ساختن بیش از ۲۰۰ نوع کلمه خواهید بود که بعد ها در جملات به کار شما خواهند آمد. نرم افزار Improve English: Word Games یک برنامه در سبک آموزشی و کاربردی با درجه سنی برای تمامی سنین میباشد. این برنامه توسط شرکت Knudge.me برای نسخه های اندروید تول, ...ادامه مطلب
این روزها اکثر بازیکان بخصوص لیدرها مشکلی یکسانی به نام وضعیت نابسامان دونیت نیرو دارند چرا که ممکن است بیشتر افراد یک کلن به این موضوع اهمیت نداده و در کلن خود دونیت انجام ندهند. امروز قصد داریم تا بصورت اختصاصی به برسی این مشکل و چگونگی رفع آن بپردازیم. دونیت بسیار زیاد نیرو به تنهایی کافی نیست اگر کلن شما همواره دارای اعضائی است که وضعیت دونیت آنها بسیار بد است و بیشتر از دونیت خود نیرو دریافت میکنند ، لازم نیست که حتما یک قانون بسیار سخت گیرانه و عجیب برای آن ها وضع کنید. برای مثال ، در کلن زیر ، یک قانون طلایی وضع شده است که دونیت اعضای آن نباید کم, ...ادامه مطلب