نظرات مطالب
Blazor 5x - قسمت یازدهم - مبانی Blazor - بخش 8 - کار با جاوا اسکریپت
یک نکته‌ی تکمیلی: امکان بارگذاری با تاخیر فایل‌های جاوااسکریپتی در برنامه‌های Blazor

در مطلب جاری، فرض بر این است که توابع جاوا اسکریپتی، سراسری هستند و قرار است در تمام کامپوننت‌های برنامه قابل دسترسی باشند. به همین جهت ارجاع مستقیمی از فایل js. آن‌ها را در فایل index.html و یا Host_، قرار می‌دهیم. اما اگر تنها یک کامپوننت، نیاز به اسکریپت خاصی را داشته باشد و نه تمام کامپوننت‌های دیگر، چطور؟
در این حالت Blazor از مفهومی به نام JavaScript Isolation پشتیبانی می‌کند. برای توضیح آن، فایل جدید Client\wwwroot\MyMdl.Js را به پروژه اضافه کرده و سپس به صورت زیر تکمیل می‌کنیم:
export function showPrompt(message) {
  return prompt(message, "Type name");
}

export function showAlert(message) {
  return prompt(message, "Hello");
}
- همانطور که مشاهده می‌کنید، در اینجا توابع export شده‌اند (جزو پیشنیازهای JavaScript Isolation است) و در حقیقت یک ES-6 module تشکیل شده‌است.
- برخلاف قبل، مدخل جدیدی را از این فایل، به فایل‌های index.html و یا Host_  اضافه نمی‌کنیم. چون می‌خواهیم فقط کامپوننتی که به آن نیاز دارد، آن‌را بارگذاری کند.

سپس کامپوننت جدید Client\Pages\JsIsolation.razor را به صورت زیر تکمیل خواهیم کرد:
@page "/js-isolation"

@inject IJSRuntime jSRuntime

<button class="btn btn-primary" @onclick="Prompt">Prompt</button>
<button class="btn btn-primary" @onclick="ShowAlert">Alert</button>


@code
{
    private IJSObjectReference module;

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if(firstRender)
        {
            module = await jSRuntime.InvokeAsync<IJSObjectReference>("import", "./MyMdl.Js");
        }
    }

    private async Task Prompt()
    {
        var result = await module.InvokeAsync<string>("showPrompt", "What's your name?");
    }

    private async Task ShowAlert()
    {
        await module.InvokeVoidAsync("showAlert", "Hello!");
    }
}
- کار در قسمت OnAfterRenderAsync و در اولین بار رندر کامپوننت شروع می‌شود. در اینجا روش بارگذاری و import یک ماژول جاوااسکریپتی را مشاهده می‌کنید. در این حالت، این فایل js. پس از فراخوانی متد InvokeAsync بارگذاری شده و اطلاعات آن تنها در همین کامپوننت قابل دسترسی خواهد بود.
- اکنون که module یا IJSObjectReference را در اختیار داریم، می‌توان با استفاده از متدهای InvokeAsync و یا InvokeVoidAsync، با متدهای موجود در آن کار کرد.
نظرات مطالب
Senior Developer به چه کسی گفته می شود؟
توضیح خوبی بود، ولی از بین تمام این مطالب این قسمت از نظر شما به دلم نشست:
در ضمن هنگام تهیه و مطالعه رزومه باید به عناوین تسلط و آشنایی و آگاهی دقت لازم را داشته باشیم. 
خیلی از افراد کفر آدم رو در می‌آرن، ردیف کرده کلی تخصص حتی بدون تفکیک و شاخه بندی. جالب اینه که در همه زمینه‌ها هم اصطلاح تسلط رو به کار برده. من خودم به شخصه تسلط بر یک مبحث رو خیلی اصطلاح سنگین و دشواری میبینم. چون واقعا برای شایسته این اصطلاح بودن باید در سطح آگاهی و آشنایی نباشیم، باید در سطحی باشیم که چندین و چند بار از این اطلاعات و آگاهی‌ها در عمل استفاده کرده باشیم. به نظر من کلاس‌های آموزشی و مطالعه کتاب و بسیاری از موارد دیگر تنها ما رو به سطح آشنایی می‌رسانند ولی بدون استفاده عملی و کاربردی از اطلاعات در همین سطح باقی میمونیم و به تسلط بر آن موضوع دست پیدا نمی‌کنیم.
با این تفاسیر متاسفانه کارفرمایان بین این واژه‌ها تفاوت چندانی قائل نمیشوند و بیشتر به اصطلاحات دهن پر کن توجه میکنند که البته در طولانی مدت هم با مشکل مواجه خواهند شد.
بگذارید با یک مثال ملموس این قضیه رو روشن کنم:
یادتون بیارید زمانی که تازه با کامپیوتر آشنا شدید، نصب نرم افزارهای کاربردی کوچک همیشه برای شما سورپرایزی داشته اند یعنی ممکنه برای نصب بعضی از نرم افزارها با مشکل مواجه شده باشید، شما در اینترنت و یا کتاب به دنبال راه حلی برای نصب آن نرم افزار بودید، تا اینجا در مرحله آگاهی قرار دارید، یعنی می‌دانید که نصب نرم افزار فرایندی بدون خطا نیست، شاید یه جاهایی با مشکل مواجه بشید که به راحتی نتونید حل کنید.
بعد از مدتی که این روند تکرار میشه آگاهی‌های شما تعمیم پیدا میکنه و به سطح آشنایی میرسه، دیگه نصب نرم افزار‌ها برای شما استرس و مشکلات پیش بینی نشده ای نداره. شما اکنون در مرحله آشنایی هستید.
الان در چه مرحله ای هستید؟ یقینا در سطح تسلط هستید، امکان نداره نصب مشکلترین نرم افزارها الان برای شما در بدترین حالت بیشتر از 1 ساعت طول بکشه. دیگه حتی به حدی رسیدید که دکمه Next‌و پذیرفتن لایسنز و محل نصب نرم افزار و ... جز روتین کار شده و مکثی روی این موارد ندارید.
شما الان می‌تونید بگید که من به نصب نرم افزارها تسلط کامل دارم.
آیا در زمینه Design pattern‌ها هم به همین صورت هستید؟ آیا در زمینه آزمایش واحد هم به همین صورت هستید؟ آیا استفاده از فلان الگوی طراحی به اندازه استفاده از حلقه For و کاربردش در ذهنتون قرار گرفته؟ آیا به اندازه با الگوی‌های طراحی کار کردید که در موقعیت‌های خاص ناخوداگاه به یاد استفاده از فلان الگوی طراحی بیفتید؟
اگر پاسخ این سولات مثبته شما واقعا به الگوی‌های طراحی مسلط هستید؟
اگر نیاز به کمی مکث و آزمون و خطا دارید، شما به الگوی‌های طراحی آشنا هستید؟
اگر فقط می‌دونید که برای فلان مسئله الگوی طراحی کاربرد داره و بتونید فلان کد رو که از الگوی طراحی استفاده کرده تا حدودی تحلیل کنید،‌شما به الگوی‌های طراحی آگاهی دارید.

پس به قول آقای پاکدل بین این سه مفهوم لطفا تفاوت قائل بشید.
مطالب
Performance در AngularJS قدم سوم
خیلی خوشحالم که تا این مرحله، این مقاله‌ها را دنبال می‌کنید. در مقالات قبل مسائل ساده و مهمی در بحث Performance مطرح شد. در این مقاله می‌خواهم قدم سوم در بهبود Performance را توضیح دهم که رعایت کردن این مسائل می‌تواند کمک زیادی در بهبود عملکرد برنامه‌های مبتنی بر AngularJS داشته باشد.

scope؟
همه‌ی برنامه نویسان و توسعه دهندگان، یکی از اولین مفاهیمی را که در AngularJS یاد می‌گیرند، scope هست. اما scope چیست؟ به صورت خیلی ساده می‌توان گفت scope مشخص کننده‌ی حوزه متغیر‌ها و توابعی هست که قرار است در View تاثیر داشته باشند. کد زیر را مشاهده کنید:
<div>نام و نام خانوادگی: {{name}}</div>
<div>معدل: {{avg()}}<div>
و کد سمت controller
scope.nums=[19,20,17,16,15,18,19];
scope.name='بهنام محمدی';
scope.avg= function(){
  return scope.nums.reduce(function(previousValue, currentValue) {
      return previousValue + currentValue;
   })/scope.nums.length;
}
و اما خروجی نهایی
نام و نام خانوادگی: بهنام محمدی
معدل:17.71
خوب چون ما در قسمت controller به صورت scope.name و scope.avg عمل کرده‌ایم، می‌توانیم در View به صورت name و avg از این متغیر‌ها استفاده کنیم. در نتیجه اگر ما در controller، به جای scope.name بنویسیم name و یا به جای scope.avg بنویسیم avg به مشکل بر می‌خوریم؛ چون قسمت View ما متغیر‌های داخل scope را در View دخیل می‌کند و متغیر‌های داخل scope توسط Watcher‌ها رصد می‌شود.

خوب سؤال، همه چیز که عالی هست پس مشکل در کجاست؟
مشکل در متغیر scope.nums هست! به کد زیر توجه کنید:
var nums=[19,20,17,16,15,18,19];
scope.name='بهنام محمدی';
scope.avg= function(){
  return nums.reduce(function(previousValue, currentValue) {
      return previousValue + currentValue;
   })/nums.length;
}
فکر کنم متوجه تفاوت این کد با کد بالایی شده‌اید. اما کدام کد درست است؟ یا بهتر بگویم کدام کد بر روی Performance تاثیر مناسبی دارد؟ کد پایینی Performance بالایی دارد. دلیل این موضوع این است وقتی ما از nums در View هیچ استفاده‌ای نمی‌کنیم، بهتر است به صورت var nums تعریف شود. در کد بالایی که این متغیر به صورت scope.nums تعریف شده بود، با اینکه در View استفاده نشده بود، ولی توسط Watcher AngularJS در هر لحظه رصد می‌شود و این کار باعث کندی و کاهش عملکرد AngularJS خواهد شد. بنابراین در کل متغیرهایی را که در View استفاده نمی‌کنید، به صورت var test استفاده نمایید تا Watcher AngularJS این متغیر‌ها را رصد نکند.
امیدوارم از این مقاله لذت برده باشید. منتظر مقاله بعدی من باشید.

مطالب
آشنایی و بررسی ابزار MiniProfiler
در کنار کتابخانه elmah که وظیفه ثبت تمامی خطاهای برنامه را دارد کتابخانه MiniProfiler امکان یافتن مشکلات کارایی و تنگناهای وب سایت را در اختیارمان قرار می‌دهد. دو قابلیت عمده که این ابزار فراهم می‌نمایید
  1. امکان مشاهده و بررسی کوئری‌های خام ADO.NET از قبیل SQL Server,Oracle و LINQ-to-SQL و EF/First Code و...
  2. نمایش زمان اجرای عملی صفحات
برای استفاده از این ابزار کافیست تا آن را از nuget دریافت نمایید
PM> Install-Package MiniProfiler
 در ASP.NET MVC در صفحه Layout_ قبل از بسته شدن تگ body تابع RenderIncludes را مانند زیر صدا بزنید تا در همه صفحات نمایش داده شود
@using StackExchange.Profiling;
<head>
 ..
</head>
<body>
  ...
  @MiniProfiler.RenderIncludes()
</body>
در کلاس global کد زیر را برای اجرای MiniProfiler اضافه نمایید
protected void Application_BeginRequest()
{
    if (Request.IsLocal)
    {
        MiniProfiler.Start();
    }
}

protected void Application_EndRequest()
{
    MiniProfiler.Stop();
}

برای پیکربندی MiniProfiler در web.config کد زیر را اضافه نمایید
<system.webServer>
  ...
  <handlers>
    <add name="MiniProfiler" path="mini-profiler-resources/*" verb="*" 
         type="System.Web.Routing.UrlRoutingModule"
         resourceType="Unspecified" 
         preCondition="integratedMode" />
  </handlers>
</system.webServer>
یا کتابخانه MiniProfiler.MVC را از nuget دریافت نمایید
PM> Install-Package MiniProfiler.MVC
با اضافه شدن این کتابخانه همه پیکربندی بصورت صورت خودکار انجام می‌گیرد. حال وب سایت را اجرا کنید در بالای صفحه مانند شکل زیر مدت زمان بارگذاری صفحه نمایش داده می‌شود که با کلیک بر روی آن اطلاعات بیشتری را مشاهده می‌نمایید

اگر در اکشن اجرا شده کوئری اجرا شد باشد ستونی به نام query times نمایش داده می‌شود که تعداد کوئری‌ها و مدت زمان آن را نمایش می‌دهد

حال بر روی گزینه sql کلیک کنید که صفحه دیگری باز شود و کوئری خام آن را مشاهد نمایید اگر کوئری تکرار شده باشد در کنار آن با DUPLICATE متمایز شده است

برای مشاهده کوئری‌های Entity Framework/First Code کتابخانه MiniProfiler.EF را اضافه نمایید
PM> Install-Package MiniProfiler.EF
اگر بصورت دستی MiniProfiler را پیکربندی کرده باشید می‌بایست در Application_Start دستور زیر را اجرا نمایید
protected void Application_BeginRequest()
{
    if (Request.IsLocal)
    {
        MiniProfiler.Start();
        MiniProfilerEF.Initialize();
    }
}
در حالت پبشرفته‌تر اگر قصد داشته باشید زمان یک قطعه کد را جداگانه محاسبه نمایید بصورت زیر عمل نمایید
public ActionResult Index()
{
    
    var profiler = MiniProfiler.Current;

    using (profiler.Step("Step 1"))
    {
        //code 1
    }

    using (profiler.Step("Step 2"))
    {
        //code 2
    }

    return View();
}
با این کار زمان هر step را بصورت جداگانه محاسبه می‌نماید. در ASP.NET Webforms دقیقا به همین صورت استفاده می‌شود فقط کافیست در masterpage اصلی یا اگر از masterpage استفاده نمی‌کنیم در صفحه مورد نظر تابع RenderIncludes را بصورت زیر صدا بزنیم
<%= StackExchange.Profiling.MiniProfiler.RenderIncludes() %>
امیدوارم مفید واقع شده باشد.
بازخوردهای دوره
متدهای async تقلبی
یا باید API جدیدی را ارائه بدهند و یا روش «تبدیل روش‌های قدیمی کدنویسی غیرهمزمان به async سی شارپ 5» در صورت امکان استفاده شود. راه حل «async واقعی» دیگری ندارد؛ مگر اینکه یک Task.Run را خودتان به آن اضافه کنید تا بر روی یک ترد دیگر اجرا شود تا UI هنگ نکند؛ مانند مثال‌های async غیرواقعی زده شده.
نظرات اشتراک‌ها
معرفی کتابخانه‌ی DNTCaptcha.Core
- سشن شما در سرور به هر علتی ریست شده (سرور ری استارت شده، application pool ری استارت شده، استفاده از load balancer و توزیع برنامه بر روی چند سرور و ...).
- ضمنا این پروژه از روش‌های دیگری مانند کوکی و یا کش هم برای ذخیره سازی استفاده می‌کند (یا می‌تواند استفاده کنید).
نظرات اشتراک‌ها
Hashtable یا ConcurrentDictionary ؟
زمانیکه اطلاعات یک شیء در چند ترد همزمان مورد استفاده قرار می‌گیرد، برای جلوگیری از تخریب اطلاعات، از روش‌های قفل گذاری مانند واژه‌ی کلیدی lock در سی‌شارپ استفاده می‌شود. یک سری الگوریتم خاص هم هستند که نیازی به استفاده از lock در این حالت‌های خاص ندارند. به آن‌ها lock free algorithms گفته می‌شود.
نظرات اشتراک‌ها
10 دلیل برای اینکه برنامه نویس‌های وب باید AngularJS را فرا بگیرند
مسلما نیاز به تیم قوی‌تری نسبت به روش‌های متداول توسعه برنامه‌های وب دارد. دانش بالاتری از جاوا اسکریپت را نیاز دارد. به علت تازگی، دانش فنی چندانی از آن نسبت به سایر روش‌ها منتشر نشده‌است و تعداد کمتری به آن مشغول هستند.
نظرات مشابهی در این مورد:
SPA سخت است و همیشه خواهد بود!
مالیات SPA
نظرات اشتراک‌ها
تصحیح Optional Calendar در تقویم فارسی دات نت
در حالت نمایشی تقویم در اصل میلادی، نیاز به بازنویسی قسمتی از کدهای آن هست. تعداد روزهای ماه متفاوت هست در شمسی و میلادی. سال کبیسه و غیره هم روش‌های دیگری داره. روز اول هفته این‌ها هم فرق می‌کند. 
به همین جهت عموما از کنترلرهای سفارشی فارسی استفاده می‌شود. مثلا یک نمونه در اینجا
اشتراک‌ها
دریافت گزارش خطاهای برنامه اندرویدی شما در گوشی کاربران

اگر دوست دارید خطاها یا کراش‌های برنامه اندرویدی شما که روی تعدادی وسیعی از گوشی کاربرانتان رخ میدهد را دریافت کنید از طریق این سورس اقدام نمایید ، راه اندازی و کانفیگ آن بسیار ساده است و می‌توانید خطاها را از طریق ایمیل و روش‌های دیگر که بهترین و راحت‌ترین آن‌ها backend است استفاده کنید

دریافت گزارش خطاهای برنامه اندرویدی شما در گوشی کاربران