برنامه نویس - اسکرام مستر - DevOps

۹ مطلب با موضوع «آموزشی» ثبت شده است

مشاهده کدهای Asp.Net Core Identity

کد کنترلرها و View ها کجاست؟ 

این پیاده سازی از معماری MVC به Razor Pages تغییر یافته است، که در آن تمامی صفحات Razor در یک کتابخانه مجزا اجرا می شوند. 

سورس این کدها در ریپوزیتوری GitHub موجود است. 

جهت اطلاع:

بسته جدید NuGet که به آن ارجاع شده است Microsoft.AspnetCore.Identity.UI است.

صفحات Razor به شما اجازه می دهند که قسمتی از یک کد را بصورت مستقل در خود صفحه یا یک صفحه code-behind نمایش دهید.

در صورت نیاز به سفارشی سازی بیشتر این صفحات، می توانید برای ایجاد صفحات خود به سورس کدی که در GitHub بدان اشاره شد مراجعه کنید، تا ببینید چه کلاس های CSS-ی برای شخصی سازی آن مورد استفاده قرار می گیرد. 

همچنین یک راه آسان برای سفارشی سازی صفحات از Visual Studio وجود دارد. 

مراحل انجام کار:

تمام آنچه شما باید انجام دهید این است که در Solution Explorer ،بروی پروژه مورد نظر خود راست کلیک کرده و به زیر منوی گزینه Add بروید در آنجا گزینه New Scaffold Item را انتخاب کنید، و در پنجره نمایش داده شده از قسمت Identity گزینه Identity را انتخاب کرده و دکمه add را بزنید. با این کار تمامی صفحات Identity را می توانید در برنامه override کنید.

پنجره dialog جدیدی باز می شود که به شما اجازه می دهد تا همه صفحات یا صفحاتی که باید برای اعمال تغییرات override کنید را انتخاب کنید.

برای نمونه، صفحه ورود به سیستم و ثبت نام در تصویر فوق انتخاب شده است. می توانید صفحات تولید شده را در قسمت Area/Identity پیدا کنید. 

اکنون می توانید UI را به همراه code-behind برای نیاز خود بصورت کامل مشاهده و شخصی سازی کنید.


 

۰ نظر موافقین ۰ مخالفین ۰
محمدحسین عزتی

چرا با توجه به اینکه تنظیمات SMTP درست است ایمیل ارسال نمی شود؟

اگر در زمان ارسال ایمیل در کد خود با این پیام

"The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required"

برخورد می کنید.

لطفا موارد زیر را بررسی کنید

  1. صحت کلمه عبور وارد شده
    (یک بار با همین پسورد مجدد به اکونت خود لاگین کنید.)
  2. زمانی که شما سعی می کنید از یک برنامه جانبی برای اولین بار به حساب کاربری خود وارد شوید
    (برای این کار به حساب کاربری خود در گوگل وارد شوید و به لینک زیر بروید
    https://www.google.com/settings/security/lesssecureapps
    و گزینه اجازه ورود به برنامه های نا امن را فعال کنید (Allow less secure apps: ON)
    بدین صورت شما می توانید از تمامی برنامه ها به حساب کاربری خود وارد شوید.)
  3. در برخی مواقع بدلیل اختلاف زمانی یا IP سروری که برنامه را بروی آن پابلیش کردید این اتفاق رخ می دهد
    (در سرور مورد نظر یک بار به حساب کاربری خود وارد شوید)

۰ نظر موافقین ۱ مخالفین ۰
محمدحسین عزتی

۱۲ ترفند بسیار مفید جاوا اسکریپت - قسمت اول

در این پست قصد دارم ۱۲ ترفند مفید از جاوا اسکریپت رو براتون توضیح بدم که با استفاده از اونها کدهاتون کمتر و بهینه تر میشه . 

اما قبل از اینکه توضیحات رو شروع کنیم اول باید مطمئن بشید که اپلیکیشن وبی شما در اکثر مرورگرها و تلفن های همراه به خوبی نمایش داده میشه . 

برای تست کردن این مورد میتونید خیلی ساده وارد سایت Endtest بشین که یک ابزار مناسب برای تست اپلیکیشن های شماست . خوب بریم که ترفندهای جالبمونو یاد بگیریم .

۱- تبدیل کردن به boolean با عمگلر !!

گاهی اوقات شما به این نیاز پیدا میکنید که چک کنید آیا مقداری برای یک متغییر وجود دارد یا خیر . یا اصلا اگر وجود دارد مقدار true برگشت داده بشه . برای انجام دادن چنین اعتبار سنجی میتونید از عملگر !! (دو علامت تعجب پشت هم ) استفاده کنید به عنوان مثال !!variable , این حالت به شما کمک میکند تا در صورت اینکه variable شما برابر با مقادیری مثل ۰, null, "", undefined یا NaN بود مقدار false رو در خروجی دریافت کنید یا اگر برابر با هیچ کدوم اینها نبود شما میتونید مقدار true رو در خروجی نمایش بدید . هیچی بهتر از یک مثال خوب برای درک این مسئله نمی تونه به شما کمک کنه به مثال زیر دقت کنید : 


function Account(cash) {  
    this.cash = cash;
    this.hasMoney = !!cash;
}
var account = new Account(100.50);  
console.log(account.cash); // 100.50  
console.log(account.hasMoney); // true
var emptyAccount = new Account(0);  
console.log(emptyAccount.cash); // 0  
console.log(emptyAccount.hasMoney); // false

در این کد اگر مقدار account.cash بزرگتر از ۰ باشد برای شما مقدار true برگشت داده میشود . 

۲- تبدیل به عدد با عملگر +

این واقعا خیلی جالبه و استفاده کردن از اون هم خیلی ساده اما فقط برای حالت های کار میکنه که رشته های شما فقط حاویه عدد باشن در غیر این صورت برای شما مقدار NaN به معنیه (Not a Number) برگشت داده میشه . به مثال زیر نوجه کنید .

function toNumber(strNumber) {  
    return +strNumber;
}
console.log(toNumber("1234")); // 1234  
console.log(toNumber("ACB")); // NaN

این مورد برای Date ها هم کار میکنه و برای شما یک timestamp رو بر میگردونه

console.log(+new Date()) // 1461288164385

۳- شرط های کوتاه

شما قطعا کد زیر را در جاوا اسکریپت دیده اید : 

if (conected) {  
    login();
}

در مثال بالا login تنها در صورتی اجرا میشود که connected برابر با مقدار true باشد اگر شما میخواید چنین بدنه ای را پیداه سازی کنید میتونید کار رو از این هم ساده تر انجام بدید و از عملگر && همون ( AND ) استفاده کنید تا فقط در صورتی که connected برابر true بود تابع login اجرا بشه . به کد پایین دقت کنید . 

conected && login();

 

و گاهی اوقات شما میخواید اول چک کنید که ایا object مورد نظر شما وجود دارد و بعد در صورت وجود داشتن به بخشی از اون دسترسی پیدا کنید برای انجام این کار هم از کد زیر استفاده میکنیم . 

user && user.login();

 ۴ - ثبت مقدار پیشفرض با عملگر || 

امروزه با استفاده از ES۶ میتونید مقدار های پیش فرض رو برای مقادیر مختلف به سادگی تعریف کنید .اما در مرورگرهای قدیمی تر که از ES۶ به خوبی پشتیبانی نمی کنن چه راهی واقعا برای برای تعریف حالت پیش فرض وجود داره . شما میتونید به سادگی با استفاده عملگر || یا همون (OR خودمون ) ، مقدار پیش فرضی رو برای متغیر تعریف کنید در صورتی که مقدار اولی false برگشت بده مقدار دوم داخل متغیر قرار میگیره . به کد زیر دقت کنید : 

function User(name, age) {  
    this.name = name || "Oliver Queen";
    this.age = age || 27;
}
var user1 = new User();  
console.log(user1.name); // Oliver Queen  
console.log(user1.age); // 27
var user2 = new User("Barry Allen", 25);  
console.log(user2.name); // Barry Allen  
console.log(user2.age); // 25

 ۵ - کش کردن array.length در حلقه ها

ببنید این موضوع خیلی ساده است ، اما فهمیدنش میتونه بهتون کمک کنه کدهاتون رو خیلی بهینه کنید چون مسئله خیلی مهمی به حساب میاد . اساسا همه ای افرادی که با جاوا اسکریپت کار میکنن بصورت زیر حلقه رو تعریف میکنند . 

for (var i = 0; i < array.length; i++) {  
    console.log(array[i]);
}

 خوب کد بالا هیچ مشکلی نداره و و به خوبی هم کار میکنه اما اگر طول ارایه شما بزرگ باشه در هر بار تکرار حلقه ، حلقه مجبوره که طول آرایه رو از اول اندازه گیری کنه و این موضوع میتونه کمی سرعت محاسبات حلقه ها رو پایین بیاره . اما شما با کش کردن طول حلقه array.length میتونید خیلی ساده این موضوع رو رفع کنید اما چطور ؟ خوب به کد زیر دقت کنید . 

var length = array.length;  
for (var i = 0; i < length; i++) {  
    console.log(array[i]);
}

 شما کد بالا رو میتونید هنوز هم ساده تر کنید : 

for (var i = 0, length = array.length; i < length; i++) {  
    console.log(array[i]);
}

 ۶ - تشخص وجود properties در object

این روش خیلی به ما کمک میکنه تا به سادگی چک کنیم آیا یک propertie در یک object وجود داره یا نه . این موضوع کجا استفاده میشه ؟ جاهای که ما قصد داریم کدهای cross-browser ایجاد کنیم تا در تمام مرورگرها کدهای ما به خوبی کار کند . خوب میشه یه مثال از این حالت بزنی ؟ خوب اره نگاه کنید فرض کنید شما کدی رو دارید ایجاد میکنید که دوست دارید حتی در مرورگر  Internet Explorer ۶ هم اجرا بشه برای مثال میخواید از کد document.querySelector() استفاده کنید اما مطمئن نیستید که این مورد در مرورگر Internet Explorer ۶ وجود داره یا خیر پس باید اول چک کنید که اگر این روش وجود نداشت از روشی استفاده بشه کد های شما به مشکل بر نخوره . باز هیچی بهتر از مثال نیست . به مثال زیر دقت کنید.

if ('querySelector' in document) {  
    document.querySelector("#id");
} else {
    document.getElementById("id");
}

 در این مورد اگر querySelector  در شی document وجود نداشته باشه از مقدار document.getElementById استفاده میشه .

امیدوارم این ۶ ترفند مورد استفاده شما قرار گرفته باشن . منتظر شنیدن نظراتتون هستم . ۶ ترفند دوم رو در پست بعد به شما معرفی میکنم.

۰ نظر موافقین ۱ مخالفین ۰
محمدحسین عزتی

Normal vs Abstract vs Static vs Sealed Class Difference

+-------------------------+---+--------+--------+--------+----------+
|       Class Type        |   | normal | static | sealed | abstract |
+-------------------------+---+--------+--------+--------+----------+
| Can be instantiated     | : | YES    | NO     | YES    | NO       |
| Can be inherited        | : | YES    | NO     | NO     | YES      |
| Can inherit from others | : | YES    | NO     | YES    | YES      |
+-------------------------+---+--------+--------+--------+----------+
۰ نظر موافقین ۰ مخالفین ۰
محمدحسین عزتی

مقایسه Interface و Abstract Class و زمان استفاده از آن

 مقایسه Interface و Abstract Class و زمان استفاده از آن 

به طور کلی Interfaceها یک قالب اجرائی برای کلاسها می باشند . بدین صورت که با تعریف مشخصات کلی متدها بدون پیاده سازی آنها، کلاسهای مشتق شده را ملزم به پیاده سازی کامل آن متدها میکند .

Interface   چیست ؟


به طور کلی  Interfaceها  یک قالب اجرائی برای کلاسها می باشند . بدین صورت که با تعریف مشخصات کلی متدها بدون پیاده سازی آنها، کلاسهای مشتق شده را ملزم به پیاده سازی کامل آن متدها میکند . بنابراین ، فقط مشخصات متدها یک بار در Interface تعریف می شوند و هر جا که لازم باشد پس از ارث بری  ، متدهای آنها پیاده سازی می شود . در کلیه نسخ دات نت Interface ها با حرف I  شروع میشود و با این خصیصه از دیگر اجزا جدا و مشخص می شوند . تعریف آن بسیار شبیه کلاس میباشد ولی با همان تفاوت که در بالا ذکر شد یعنی متدهای آن فاقد کد می باشند . اینتر فیس ها سازنده و فیلد هم ندارند و نمی شود از روی آنها نمونه ای ایجاد کرد .
مزایای Interface  ها چیست ؟

در حالت عادی ارث بری از چند کلاس به طور هم زمان امکان پذیر نیست ولی Interface ها این مزیت را دارند که به هر تعداد که لازم است ، کلاسهای مشتق شده  از آنها ارث بری کنند . این موضوع یکی از مهم ترین مزایای Interface می باشد .

هم چنین با استفاده از Interface کد ها قبلیت بهتری در نگهداری ، انعطاف و استفاده مجدد پیدا میکنند .

Abstract Class  چیست ؟


کلاس Abstract  یکی از ابزارهای  مهم OOP  می باشد که نمیتوان از آنها نمونه ای ساخت . به عبارتی دیگر نمی توانیم متغیری از کلاس Abstract  تعریف کنیم .

یک کلاس Abstract  شبیه Interface میباشد ولی با دیدی وسیعتر . این کلاسها می تواند دارای متدهای Abstract  باشد که شبیه Interface فقط اعلام میشوند و باید در کلاسهای مشتق شده ، بازنویسی شوند . البته میتوان در این کلاسها متد هائی داشت که Abstract نیستند و احتیاجی به پیاده سازی آنها در کلاسهای مشتق شده ندارند .

با توجه به تعاریف ذکر شده کلاس Abstract  حالتی بین کلاسهای معمولی و Interface ها میباشد و کلاسی میباشد که غیر قطعی و ناتمام میباشد که باید در سطح فرزندانش تکمیل شود .
 مزایای کلاسهای Abstract  چیست ؟

یکی از مزیت های کلاس Abstract  فراهم نمودن کلاس پایه برای  دیگر کلاسهای مشتق شده  می باشد با این توضیح متدهای آن می توانند کد نویسی شده باشند یا نه . از طرفی پیاده سازی تمام متدهای Abstract  در کلاس مشتق شده اجباری نیست .(برخلاف Interface)  .

تعریف سطوح دسترسی برای متدها و خصوصیتها مانند کلاسهای معمولی نیز یکی دیگر از مزیت های این کلاسها می باشد .
 تفاوت بین کلاسهای Abstract و Interface

1-      یک کلاس معمولی می تواند از یک کلاس Abstract ارث بری کند ولی همان کلاس میتواند از چندین Interface ارث ببرد .

2-      یک Interface  فقط میتواند اعلان متدها و خصوصیتها را داشته باشد اما یک کلاس Abstract  علاوه بر آنها میتوانید متدها و خصوصیتهایی با کدهای کامل داشته باشد .

3-      عناصر موجود در کلاس Abstract میتوانند مانند یک کلاس معمولی دارای سطح دسترسی باشند  ولی Interface  ها فاقد این امکان می باشند .

4-      وقتی شما متدی را به کلاس Abstract اضافه می کنید ، اگر این متد Abstract  نباشد به طور خودکار به همه زیر کلاسها اعمال می شود اما در Interface اگر متدی اضافه کنید باید در تمام زیر کلاسها آن را اعمال کنید .

5-      کلاس Abstract   مانند کلاسهای معمولی می توانند دارای فیلد و عناصر دیگری باشند در حالی که Interface  فاقد این امکان می باشد .

6-      Abstract  یکی از انواع کلاس است ولی Interface   کلاس نیست .

 
چه زمانی از Interface  ها یا کلاسهای Abstract استفاده کنیم ؟

با توجه به توضیحات ذکر شده  مواقعی که نیاز به وراثت چند گانه داریم باید از Interface استفاده کنیم ، به دلیل اینکه این امکان در کلاس های Abstract  وجود ندارد .

زمانی که بخواهیم تمام متدهای معرفی شده در کلاس پایه به طور کامل در کلاس مشتق شده پیاده شود باید از Interface   استفاده کنیم.

وقتی در پروژه های بزرگ با تغییرات زیادی مواجه هستیم استفاده از کلاس Abstract  توصیه می شود چون با تغییر آن به طور خودکار تغییرات در کلاسهای مشتق شده اعمال می شود .

با توجه به اینکه به غیر از اعلان متدها و خصوصیتها امکان تعریف عناصر دیگر در Interface  ها وجود ندارد ، در صورتی که ملزم به استفاده  از این عناصر باشیم ، استفاده از کلاسهای Abstract  ضروری می باشد .

در صورتی که نخواهیم کلیه متد ها در کلاس های مشتق شده پیاده شود و تعدادی از آنها را در کلاس پدر کدنویسی  کنیم ، باید از کلاس Abstract  استفاده کنیم .

به طور کلی Interface ها چارچوب و قابلیتهای کلاس را مشخص میکند و یک قرارداد است  ولی کلاس Abstract  نوع کلاس را معین می کند . این تفاوت کمک بسیاری برای تشخیص زمان استفاده از این دو را  ، به برنامه نویسان میدهد .
۰ نظر موافقین ۰ مخالفین ۰
محمدحسین عزتی

نصب mongoDB بروی ویندوز

نصب mongoDB بروی ویندوز
در این آموزش ما نشان خواهیم داد چگونه MongoBD را بروی ویندز نصب کنید

  1. MongoDB 2.2.3
  2. Windows 8.1

نکته: MongoDB نیاز به نصب ندارد، فقط فایلهای آن را دانلود کنید و از حالت زیپ شده خارج کرده و به محل مورد نظر جهت استفاده کپی نمایید و با استفاده از فایل کانفیگوریشن پوشه دیتا را پیکربندی کرده و با کامند استارت کنید.

ادامه مطلب...
۰ نظر موافقین ۱ مخالفین ۰
محمدحسین عزتی

پیاده سازی Dependency Injection در ASP.NET Web API

Dependency Injection (به اختصار DI، ترجمه فارسی : تزریق وابستگی) الگویی است که جهت پیاده سازی اصل Dependency Inversion در طراحی شی گراء مطرح شده است. در صورتی که با مفاهیم Dependency Injection و IoC Container آشنایی ندارید، می توانید به مطالعه ی این مقاله از آقای Martin Fowler بپردازید. Castle Windsor یکی از  IoC Container های معروف، رایگان و متن باز نوشته شده برای NET. می باشد. در این مقاله به پیاده سازی این الگو در ASP.NET Web API با کتابخانه ی Castle Windsor میپردازیم.
 
پیاده سازی Controller ها و Service ها
ابتدا Controller ها و کلاس های سرویس مورد نظر را خود را پیاده سازی کنید. سپس با استفاده از Constructor Injection کلاس های سرویس خود را به داخل Controller ها Inject کنید. مثال ساده ی زیر را در نظر بگیرید :
ادامه مطلب...
۰ نظر موافقین ۱ مخالفین ۰
محمدحسین عزتی

نصب / حذف سرویس های دات نتی ویندوز

در این مثال میخواهم نحوه ننصب / حذف سرویس های دات نتی ویندوز را توضیح دهم


جهت نصب سرویس مورد نظر خود باید از فایل اجرایی InstallUtil.exe استفاده کنید

جهت استفاده از این ابزار درصورتی که ویژوال استودیو را نصب دارید ویژوال استودیو کامندپرامپت برای برنامه نویسان یا (Developer Command Prompt for Vs) را باز کنید و دستور فوق را در آن اجرا کنید نام فایل اجرایی که بصورت سرویس نوشته اید و میخواهید از این به بعد بصورت سرویسی اجرا شود را با ذکر آدرس آن مانند دستور زیر وارد نماید در این مثال فرض من بر این است که فایلی که قصد سرویس کردن آن را دارم در درایو D سیستمم قرار دارد

InstallUtil.exe "D:\myService.exe"

جهت حذف همین سرویس عینا دستور فوق را با سویچ u/ اجرا میکنیم مانند زیر:

InstallUtil.exe /u "D:\myService.exe"


توجه: در صورتی که فایل InstallUtil.exe را قبلا ریجستر نکرده باشید دستور فوق را میتوانید بصورت زیر بنویسید:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe "D:\myService.exe"

و همچنین برای حذف داریم:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe "D:\myService.exe"

۰ نظر موافقین ۱ مخالفین ۰
محمدحسین عزتی

تفکر شیء گرا

تاریخچه برنامه نویسی شیءگرا
چرا از OOP استفاده کنیم؟
مشخصات برنامه نویسی شیء گرا 
شناسایی ساختار کلاس
شناسایی تعاملات بین اشیاء
ادامه مطلب...
۰ نظر موافقین ۱ مخالفین ۰
محمدحسین عزتی