محمد حسین عزتی



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

اما چگونه می توان چابک شد؟

برای چابک شدن باید در پروسه توسعه و یا حتی سطوح کلان سازمان مانند مدیریت منابع انسانی پروژه و یا هر سطحی، ارزش ها و اصول چابک رعایت شوند و در نظر گرفته شوند. به عبارتی باید همه سازمان چابک شود و نه فقط بخش یا واحد توسعه نرم افزار. به همین دلیل حرکت سازمان به سمت 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"

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

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

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


به‌صورت کلی و عمومی برای دفاع استاندارد و خودکار در مقابل حملات 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ها یک قالب اجرائی برای کلاسها می باشند . بدین صورت که با تعریف مشخصات کلی متدها بدون پیاده سازی آنها، کلاسهای مشتق شده را مم به پیاده سازی کامل آن متدها میکند .

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  نوع کلاس را معین می کند . این تفاوت کمک بسیاری برای تشخیص زمان استفاده از این دو را  ، به برنامه نویسان میدهد .

اگر قصد حذف فیلد های اضافی در صفحه ی تسویه حساب رو دارید این کار به دو روش انجام می شود.

۱٫میتونید براحتی با افزودن کد های زیر در functions.php قالبتون این کار رو انجام بدید.

این کد برای حذف تمامی فیلد ها هست. اگر قصد حذف نکردن فیلدی دلخواه رو دارید از لیست زیر میتونید حذفش کنید.

RemoveCeckoutFildeWordPress

لینک دانلود کد فوق


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

۱ – قابلیت جدید ارسال نشریه و اطلاعیه
ادامه مطلب

تبلیغات

آخرین ارسال ها

آخرین جستجو ها

به سمت آینده GolGOli_Nevis :) صنایع سنگ و سرامیک تحقیق و مطالب علمی مداحی سحر نزدیک است... اسلام نیوز آریایی بویِ خوشِِِِ زندگی بهترین ارگانیک ها