به طور خلاصه در اجایل یک سری ارزش و اصول معرفی شده است که با به کار بستن آنها در محیط توسعه می توان به نتایجی مانند محصولات کارآمد ، مشتری خوشحال ، نیروی کار با انگیزه دست یافت. اما مشکلی که وجود داشت این بود که اجایل در حد یک بیانیه یا تعریف بود و هیچ راه حل عملی برای آن مطرح نشده بود. در همین زمان متدهایی مطرح شدند(البته قبل از اجایل مطرح شده بودند) که اصول و ارزش های اجایل در آنها نهادینه شده بود.
اما چگونه می توان چابک شد؟
برای چابک شدن باید در پروسه توسعه و یا حتی سطوح کلان سازمان مانند مدیریت منابع انسانی پروژه و یا هر سطحی، ارزش ها و اصول چابک رعایت شوند و در نظر گرفته شوند. به عبارتی باید همه سازمان چابک شود و نه فقط بخش یا واحد توسعه نرم افزار. به همین دلیل حرکت سازمان به سمت Agile را تغییر یا Change گفته نمی شود و از اصطلاح Transformation یا تحول استفاده می شود. یعنی باید سازمان در راه چابک شدن متحول شود.
برای اینکه بتوان به سطحی از چابکی دست یافت می توان از Practice های Agile مانند Scrum , XP , Crystal و یا … بهره جست.
یکی از این متدها اسکرام است
اسکرام یکی از متدهای رایج و پرطرفدار اجایل می باشد که تیم ها در آن با همکاری خود مشتری، چند هفته یکبار خروجی از نرم افزار را بیرون می دهند و فیدبک ذینفعان را دریافت می کنند و طبق بازخورد ها محصول را در مسیر درست قرار می دهند و اینگونه می شود که محصولات مشتری پسندی به وجود می آید.
مشکل بزرگی که در صنعت نرم افزار وجود داشت این بود که خروجی پروژه ها مثلا بعد از دو سال هزینه بدرد نخور می شد ، یعنی تیم دو سال بر روی پروژه کار میکرد و نهایتاً مشتری می گفت این آن چیزی نیست که من می خواستم و … . امّا بعد از ظهور اجایل ما مجبوریم مشتری را در روند تولید محصول دخیل نماییم به طور مداوم بازخوردهای او را بگیریم ، خلاقیت ایجاد نماییم و به طور کلی محصول را خوشمزه کنیم.
نتیجه گیری
Agile یک تفکر ناب در زمینه توسعه نرم افزار می باشد که خروجی و هدف آن ارائه نرم افزار کارآ می باشد. در Agile هزینه توسعه بدلیل Lean بودن و تحلیل و طراحی سازگار پایین خواهد بود. در Agile بدلیل Iteration عمل کردن و ارتباط چهره به چهره دائم با مشتری و آزمایش یکپارچه شاهده محصول با کیفیت و کارکننده خواهیم بود. در Agile به دلیل خود سازمانده بودن تیم ها شاهد نفرات و تیم های خوشحال و راضی خواهیم بود. و سازمان نیز بدلیل چابک بودن دارای سود بالایی خواهد بود.
شرکت های توسعه نرم افزار در ایران معمولا و اکثرا در مقوله مدیریت منابع انسانی با مشکل مواجه هستند. به همین دلیل است که اکثر برنامه نویس ها در محیط کاری خود احساس راحتی نمی کنند و همیشه عذاب می کشند و اکثراً فکر می کنند که در حال حیف شدن می باشند و باید در شرکت هایی مثل گوگل و یا مایکروسافت کار کنند .
دلیل اینکه برنامه نویس در محیط کار احساس راحتی نمی کند مدیریت اشتباه می باشد. مدیریت جوی را درست می نماید که برنامه نویس در آن جو نمی تواند نفس بکشد و همیشه دوست دارد در جای دیگری جز آنجا کار کند. کاری کنیم نیروی کار علاقه مند به پروژه بشود. گفتم به پروژه و نه برنامه نویسی به این دلیل که خوشبختانه اکثر برنامه نویس های ما به برنامه نویسی علاقه شدیدی دارند ولی متاسفانه به خود پروژه و یا محصول علاقه چندانی ندارند. برنامه نویس کاری ندارد که پروژه به کجا میرود آیا Fail می شود یا نه؟ آیا پروژه سر وقت تمام می شود یا نه؟ و این خیلی بد است که برنامه نویس فقط می خواهد رفع تکلیف کند.
برای اینکه بتوانیم برنامه نویس ها را از حالت رفع تکلیف خارج نماییم .
ادامه مطلب
اگر در زمان ارسال ایمیل در کد خود با این پیام
"The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required"
برخورد می کنید.
لطفا موارد زیر را بررسی کنید
بهصورت کلی و عمومی برای دفاع استاندارد و خودکار در مقابل حملات CSRF که نیاز به مداخله کاربر در دفاع نباشد، دو بررسی جداگانه زیر پیشنهاد میگردد. در این بررسیها بهصورت عمدی و خودکار، درخواست مجوز متقابل یا Cross بهصورت لحظهای و آنی، رد خواهد شد.
· بررسی هدرهای استاندارد برای تائید درخواست همان منبع
· بررسی توکن های CSRF
برای دفاع از حملات CSRF راههای گوناگونی وجود دارد که میتوانید بهطور خاص در برابر این حملات دفاع نمایید. در توصیههای استاندارد حداقل یکی از موارد زیر را برای دفاع در برابر این حملات استفاده نمایید.
· همگام ساز توکن ها یا Synchronizer Tokens
· دفاع کوکیهای دوگانه یا Double Cookies Defense
· رمزگذاری الگوهای توکن یا Encrypted Token Pattern
· سربرگ سفارشی یا Custom Header
دیگر راهکارهای موجود برای جلوگیری از حملات CSRF در زیر بیانشدهاند؛ که باید برنامه نویسان و طراحان وبسایتها این موارد را در طراحیهای خود در نظر داشته باشند.
· استفاده از Captcha در فرمها
· استفاده از متد POST بجای متد GET
· تمامی متدهای POST باید بصورت parameter less باشند
· تمامی درخواست ها همراه توکن به سرور ارسال شود
· در تمامی درخواست ها نام دامنه چک شود (نام دامنه را در setting نرم افزار قرار دهید)
· تمامی درخواست های ارسالی از کلاینت حتما باید بصورت ایجکسی باشد
· پرهیز استفاده از Register_Global در صفحات پردازشگر
· گرفتن تائید مجدد پس از ارسال یک فرم از کاربر برای انجام فرآیندها
· ایجاد متغیرهای تصادفی در سمت سرور و بازپسگیری آن از طرف کاربر در زمان ارسال هر فرم
· اجبار کاربر به ورود مجدد رمز عبور قبل از انجام عملیاتهای مهم مثل انتقال پول
· استفاده از Captcha قبل از انجام عملیات های مهم
· اطمینان از عدم وجود فایل clientaccesspolicy.xml که موجب دسترسی ناخواسته Silverlight گردد
· اطمینان از عدم وجود فایل crossdomain.xml که موجب دسترسی ناخواسته Adobe flash گردد
· در صورتی که بخش مدیریت سایت جداست (مثلا در مسیر admin/ قرار دارد)، میتوان بخش ادمین را از طریق زیردامنه خاص و غیرقابل حدس یا حتی دامنه دیگر کنترل کرد تا حملات csrf و همچنین xss تا حد بالایی دفع شود.
در این پست قصد دارم ۱۲ ترفند مفید از جاوا اسکریپت رو براتون توضیح بدم که با استفاده از اونها کدهاتون کمتر و بهینه تر میشه .
اما قبل از اینکه توضیحات رو شروع کنیم اول باید مطمئن بشید که اپلیکیشن وبی شما در اکثر مرورگرها و تلفن های همراه به خوبی نمایش داده میشه .
برای تست کردن این مورد میتونید خیلی ساده وارد سایت 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 استفاده میشه .
امیدوارم این ۶ ترفند مورد استفاده شما قرار گرفته باشن . منتظر شنیدن نظراتتون هستم . ۶ ترفند دوم رو در پست بعد به شما معرفی میکنم.
بعد از ایجاد فایل Configuration.cs در پوشه Migrations توسط فرمان enable-migrations دستور زیر را در سازنده کلاس بنویسید
AutomaticMigrationsEnabled = false;
فرمان enable-migrations بصورت زیر می باشد
enable-migrations -ContextTypeName Repository.PhoneBookContext -MigrationsDirectory:Migrations\PhoneBookContextMigration
تغیرات زیر را در DbContext جهت فقط خواندنی کردن آن اعمال کنید
public class MyReadOnlyContext : DbContext
{
// Use ReadOnlyConnectionString from App/Web.config
public MyReadOnlyContext () : base("Name=ReadOnlyConnectionString")
{
Configuration.LazyLoadingEnabled = false;
Configuration.ProxyCreationEnabled = false;
Configuration.ValidateOnSaveEnabled = false;
Configuration.AutoDetectChangesEnabled = false;
}
// Don't expose Add(), Remove(), etc.
public DbQuery<PhoneBook> PhoneBooks
{
get
{
// Don't track changes to query results
return Set<PhoneBook>().AsNoTracking();
}
}
public override int SaveChanges()
{
// Throw if they try to call this
throw new InvalidOperationException("This context is read-only.");
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Need this since there is no DbSet<Customer> property
modelBuilder.Entity<PhoneBook>();
}
}
+-------------------------+---+--------+--------+--------+----------+
| 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ها یک قالب اجرائی برای کلاسها می باشند . بدین صورت که با تعریف مشخصات کلی متدها بدون پیاده سازی آنها، کلاسهای مشتق شده را مم به پیاده سازی کامل آن متدها میکند .
اگر قصد حذف فیلد های اضافی در صفحه ی تسویه حساب رو دارید این کار به دو روش انجام می شود.
۱٫میتونید براحتی با افزودن کد های زیر در functions.php قالبتون این کار رو انجام بدید.
این کد برای حذف تمامی فیلد ها هست. اگر قصد حذف نکردن فیلدی دلخواه رو دارید از لیست زیر میتونید حذفش کنید.
درباره این سایت