مطالب
جایگزین کردن jQuery با JavaScript خالص - قسمت سوم - تغییر شیوه‌نامه‌ی المان‌ها
در این قسمت روش جایگزین کردن متد css جی‌کوئری را با کدهای خالص جاوا اسکریپتی بررسی می‌کنیم.

کار با Inline Styles
  <h1>News</h1>
  <div>Welcome to our site!</div>

  <h2>World</h2>

  <h3>Title 1</h3>
  <div>description 1.</div>

  <h2>Science</h2>

  <h3>Title 2</h3>
  <div>description 2.</div>
در این مثال می‌خواهیم با استفاده از جاوا اسکریپت، المان‌های h2 و h3 را یافته و سپس h2ها را آبی و h3ها را سبز کنیم:
  var headings = document.querySelectorAll('h2, h3');
  for (var i = 0; i < headings.length; i++) {
    if (headings[i].tagName === 'H2') {
      headings[i].style.color = 'blue';
    }
    else {
      headings[i].style.color = 'green';
    }
  }
برای تغییر inline style المان‌ها، از خاصیت style آن‌ها استفاده می‌شود که در نهایت این شیوه‌نامه‌های جدید توسط ویژگی style به همان المان اضافه می‌شوند:
<h2 style="color: blue">….</h2>
<h3 style="color: green">….</h3>
خاصیت style جزو استاندارد DOM Level 2 است که در سال 2000 تصویب شده‌است (از زمان IE 8.0 به بعد در دسترس است). باید دقت داشت که از این روش بیشتر در کتابخانه‌های جاوا اسکریپتی برای شرایطی خاص، جهت تغییر پویای رابط کاربری استفاده می‌شود و هر تغییری که در اینجا اعمال شود، مقادیر قبلی موجود را بازنویسی می‌کند.
همچنین اگر بخواهیم به یک المان چندین شیوه‌نامه را انتساب دهیم، روش کار به صورت زیر است:
  <h2>World</h2>

  ...

  <h2>Science</h2>

 <script>
  var headings = document.querySelectorAll('h2');
  for (var i = 0; i < headings.length; i++) {
    headings[i].style.color = 'blue';
    headings[i].style.fontWeight = 'bold';
  }
 </script>
پس از یافتن المان‌های مدنظر، تنها کافی است نام شیوه‌نامه‌ی مدنظر را به خاصیت style اضافه و مقدار دهی کنیم. در اینجا نام شیوه‌نامه‌ای که «کبابی» باشد، مانند font-weight، به صورت camel case مانند fontWeight درج خواهد شد؛ هرچند از همان نام اصلی نیز می‌توان به صورت زیر استفاده کرد:
 headings[i].style['font-weight'] = 'bold';
روش دیگری نیز برای انجام این تغییرات چندتایی وجود دارد:
  var headings = document.querySelectorAll('h2');

  for (var i = 0; i < headings.length; i++) {
    headings[i].style.cssText = 'color: blue; font-weight: bold';
  }
خاصیت style یک المان، از نوع اینترفیس CSSStyleDeclaration است که دارای خاصیت استاندارد cssText نیز می‌باشد. توسط این خاصیت می‌توان چندین شیوه‌نامه را به صورت یکجا به عنصری انتساب داد و یا تمام آن‌ها را خواند.


کار با Style Sheets

Inline styles تنها روش کار با شیوه‌نامه‌ها نیست. روش صحیح و قابل مدیریت کار با شیوه‌نامه‌ها استفاده از فایل‌های style sheets است. برای مثال تغییرات قبل را می‌توان در فایلی به نام styles.css و با محتوای زیر ایجاد کرد:
h2 { color: blue; }
h3 { color: green; }
و سپس آن‌را به صفحه متصل نمود:
 <link href="styles.css" rel="style sheet">
و یا حتی می‌توان این شیوه نامه را به صورت inline نیز به ابتدای صفحه اضافه نمود:
<style>
  h2 { color: blue; }
  h3 { color: green; }
</style>
اما ممکن است در برنامه بخواهیم امکان تغییر پویای قالب را به کاربران بدهیم. در یک چنین حالتی اعمال این نوع شیوه‌نامه‌ها توسط جاوا اسکریپت مفهوم پیدا می‌کند:
var sheet = document.styleSheets[0];
sheet.insertRule('h2 { font-style: italic; }', sheet.cssRules.length - 1);
اولین سطر، اولین تگ style اضافه شده به صفحه را یافته (این style می‌تواند inline و یا لینک شده‌ی توسط یک فایل باشد) و سپس شیوه نامه‌ی جدیدی را توسط متد insertRule، در انتهای آن به صورت پویا درج می‌کند.


مخفی کردن و نمایش دادن المان‌ها در صفحه

جی‌کوئری به همراه متدهای hide و show است که کار مخفی کردن و یا نمایش دادن مجدد یک المان‌را انجام می‌دهند:
// hide an element
$element.hide();

// show it again
$element.show();
در کل روش‌های زیادی برای مخفی کردن یک المان وجود دارند. برای مثال می‌توان opacity آن‌را به صفر تنظیم کرد و یا position آن‌را به absolute و سپس آن‌را در مختصاتی خارج از صفحه قرار داد. اما عموما خاصیت display را به none تنظیم می‌کنند. همچنین در استاندارد W3C HTML5، خاصیت جدید hidden از نوع boolean نیز به المان‌ها اضافه شده‌اند که دقیقا برای همین‌منظور بکار می‌رود. مزیت مهم این خاصیت نه فقط استاندارد بودن آن، بلکه بالابردن دسترسی پذیری المان‌های صفحه توسط برنامه‌های «screen reader» مخصوص معلولین است. بنابراین با استفاده از جاوا اسکریپت خالص برای مخفی کردن یک المان می‌توان نوشت:
element.setAttribute('hidden', '');
این روش 25 بار سریعتر از متد hide جی‌کوئری است! از این جهت که jQuery در پشت صحنه مدام متد window.getComputedStyle را برای موارد خاص و بحرانی کار با شیوه‌نامه‌ها فراخوانی می‌کند (در تمام متدهایی که با CSS کار می‌کنند) و این متد تاثیر منفی بر روی کارآیی برنامه دارد.
و چون خاصیت hidden از نوع Boolean است، ذکر آن در یک المان یعنی تنظیم آن به true و حذف آن، یعنی تنظیم آن به false یا نمایش مجدد المان در اینجا:
element.removeAttribute('hidden');


اندازه‌گیری تاثیر شیوه‌نامه‌ها بر روی طول و عرض المان‌ها

CSS Box Model یک چنین تعریفی را دارد:


زمانیکه از متدهای ()width و ()height جی‌کوئری بر روی المانی استفاده می‌شود، صرفا طول و عرض قسمت «content» را دریافت خواهید کرد.
برای این منظور در جاوا اسکریپت خالص این خواص در اختیار ما است:
<style>
  .box {
    padding: 10px;
    margin: 5px;
    border: 3px solid;
    display: inline-block;
  }
</style>
<span class="box">a box</span>
روش اندازه گیری Content + Padding توسط جاوا اسکریپت خالص:
 // returns 38
var clientHeight = document.querySelector('.box').clientHeight;

// returns 55
var clientWidth = document.querySelector('.box').clientWidth;
این خواص هرچند اخیرا به استانداردهای CSS به صورت رسمی اضافه شده‌اند، اما از زمان IE 6.0 پشتیبانی می‌شده‌اند و با متدهای ()innerWidth و ()innerHeight جی‌کوئری قابل مقایسه هستند.

روش اندازه گیری Content + Padding + Border توسط جاوا اسکریپت خالص:
 // returns 44
var offsetHeight = document.querySelector('.box').offsetHeight;

// returns 61
var offsetWidth = document.querySelector('.box').offsetWidth;
این خواص از زمان IE 8.0 پشتیبانی می‌شده‌اند.
مطالب
روش Controller as در AngularJs
در پست‌های قبلی بیان شد که برای پیاده سازی عملیات مقید سازی عناصر View به مدل در کنترلر باید scope$ را به تابع سازنده کنترلر تزریق کرد. برای مثال:
var app = angular.module('myApp', []);

app.controller('myController', function ($scope) {
    $scope.name = 'Masoud';
    $scope.family = 'Pakdel';
})
View متناظر نیز به صورت می‌باشد:
<div ng-app="myApp">
    <div ng-controller="myController">       
        <div>
            {{name}} {{family}}
        </div>
    </div>
</div>
در Angular 1.2 روشی به نام controller as معرفی شده است که با توجه به نوع پیاده سازی آن نیازی به تزریق scope$ در توابع سازنده نیست. فقط در کنترلر به جای وابستگی مستقیم به scope$ ا زکلمه کلیدی this و در هنگام عملیات مقید سازی باید از نام مستعار تعیین شده برای کنترلر استفاده نمایید. برای مثال
var app = angular.module('myApp', []);

app.controller('myController', function () {
    this.name = 'Masoud';
    this.family = 'Pakdel';
})
و استفاده آن در View
<div ng-app="myApp">
    <div ng-controller="myController as myCtrl">       
        <div>
            {{myCtrl.name}} {{myCtrl.family}}
        </div>
    </div>
</div>
در هنگام عملیات routing نیز می‌توان این عناوین مستعار را برای کنترلر با استفاده از controllerAs مشخص نمود. به صورت زیر:
app.config(function($routeProvider){
    $routeProvider.when('/first', { 
            templateUrl: 'first.html', 
            controller: 'FirstCtrl', 
            controllerAs:'fc' })
        .when('/second', { 
            templateUrl: 'second.html' , 
            controller: 'ُSecondCtrl', 
            controllerAs:'sc' })
        .otherwise({ 
            redirectTo: '/first' 
       });
});
اشتراک‌ها
ایجاد دیالوگ bootstrap با استفاده از Tag Helper
<modal title="Modal title">
    <modal-body>
        <p>One fine body&hellip;</p>
    </modal-body>
    <modal-footer>
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Save changes</button>
    </modal-footer>
</modal>
ایجاد دیالوگ bootstrap با استفاده از Tag Helper
اشتراک‌ها
چگونه npm را در ویندوز به روز رسانی کنیم؟

اگر نگارش‌های آغازین ابزارهای node.js را در ویندوز نصب کرده باشید، با نصب نگارش آخرین نگارش آن ... هیچ تغییری را مشاهده نخواهید کرد و عملا به روز رسانی نمی‌شود و هنوز با اجرای دستور npm -v، همان نگارش قبلی نمایش داده می‌شود. برای رفع این مشکل، ابتدا آخرین بسته‌ی node.js را نصب کنید. سپس دستور npm -g i npm را صادر کنید؛ اگر باز هم به روز رسانی صورت نگرفت، از روش زیر استفاده نمائید:

Set-ExecutionPolicy Unrestricted -Scope CurrentUser -Force
npm install -g npm-windows-upgrade
npm-windows-upgrade --npm-version latest
چگونه npm را در ویندوز به روز رسانی کنیم؟
نظرات مطالب
کار با Docker بر روی ویندوز - قسمت چهارم - اجرای برنامه‌های خط فرمان درون Containerها
یک کاربرد دیگر در رابطه با مثال آخر میتواند جنریت کردن یک فایل ویدئویی باشد؛ این مورد رو من همیشه بهش نیاز داشتم مثلاً موقع تست یک اندپوینت آپلود فایل ویدئویی:

docker run --rm -v $(pwd):$(pwd) -w $(pwd)\
        jrottenberg/ffmpeg \
        -f lavfi -i testsrc=size=1280x720 -t 60 -pix_fmt yuv420p testsrc.mp4
در اینجا توسط فیلتر testsrc یک فایل ویدئویی یک دقیقه‌ایی (عدد ۶۰ مدت زمان ویدئو را تعیین میکند) با رزلوشن 1280x720 تولید خواهد شد:

  

نظرات مطالب
اعتبارسنجی مبتنی بر کوکی‌ها در ASP.NET Core 2.0 بدون استفاده از سیستم Identity
باسلام و عرض ارادت
من به مشکل زیر برخورد کردم

و به شکل زیر پیاده سازی CheckArgumentIsNull را در ApplicationDbContext انجام دادم:

public interface IUnitOfWork : IDisposable
    {
        DbSet<TEntity> Set<TEntity>() where TEntity : class;

        int SaveChanges(bool acceptAllChangesOnSuccess);
        int SaveChanges();
        Task<int> SaveChangesAsync(bool acceptAllChangesOnSuccess, CancellationToken cancellationToken = new CancellationToken());
        Task<int> SaveChangesAsync(CancellationToken cancellationToken = new CancellationToken());
        void CheckArgumentIsNull(string v);
void CheckArgumentIsNull(string arg)
        {
            if (arg == null)
                throw new ArgumentNullException(nameof(arg));
        }

آیا کاری که کردم درست است؟

نظرات مطالب
شروع به کار با EF Core 1.0 - قسمت 3 - انتقال مهاجرت‌ها به یک اسمبلی دیگر
اگر علاقمند بودید تا کار افزودن مهاجرت‌ها، به همراه تولید خودکار نام فایل، بر اساس تاریخ و ساعت روز باشد، می‌توان از دستورات ذیل در خط فرمان استفاده کرد (و یا درست کردن یک فایل bat. برای آن):
For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set mydate=%%c_%%a_%%b)
For /f "tokens=1-2 delims=/:" %%a in ("%TIME: =0%") do (set mytime=%%a%%b)
dotnet ef --configuration Release --startup-project ../ProjName/ migrations add V%mydate%_%mytime%
نظرات مطالب
پردازش‌های Async در Entity framework 6

مثلا برای همچین کدی میشه از روش بالا استفاده کرد مشکل حل میشه ؟

        {
            for (int i = 1; i <=500; i++)
            {
                ThreadPool.QueueUserWorkItem(Execute, i + 1);
            }
        }
void Execute(Object obj)
        {
             int thread = (int)obj;
            try
            {
                using (TestEntities ctx = new TestEntities())
                {
                    int i = 1;
                    foreach (var v in ctx.Customers)
                    {
                        Thread.Sleep(i * 1000);
                        i++;
                    }
                }
                listBox1.Items.Add("Thread " + thread.ToString() + " End Success ");
            }
            catch (Exception e)
            {
                listBox1.Items.Add("Thread " + thread.ToString() + " Error :" + e.Message);
            }
        }