<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های حسین منصوری</title>
        <link>https://virgool.io/feed/@mansourihosein</link>
        <description>طراح، تحلیل‌گر، برنامه‌نویس بک اند و مدیر دیتابیس. علاقمند به فیلم و سریال، اهل پادکست و سفر، طرفدار زندگی و عاشق گفتگو :)</description>
        <language>fa</language>
        <pubDate>2026-04-14 21:40:42</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/7514/avatar/avatar.png?height=120&amp;width=120</url>
            <title>حسین منصوری</title>
            <link>https://virgool.io/@mansourihosein</link>
        </image>

                    <item>
                <title>بهترین روش‌های طراحی صف و مدیریت RabbitMQ</title>
                <link>https://virgool.io/@mansourihosein/%D8%A8%D9%87%D8%AA%D8%B1%DB%8C%D9%86-%D8%B1%D9%88%D8%B4%D9%87%D8%A7%DB%8C-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D8%B5%D9%81-%D9%88-%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA-rabbitmq-aobkhk3wxd3s</link>
                <description>توی این مقاله میخواهیم با هم در مورد بهترین الگوهای طراحی صف، بهینه کردن روابط بین Exchangeها،  مدیریت بهتر RabbitMQ و همچنین اشتباهات مرسوم توی این حوزه با هم صحبت کنیم. بخشی از این مقاله حاصل خوندن مقاله‌ها و دیدن ویدئویهای مرتبط با مدیریت RabbitMQ و بخشی از اون هم ماحصل تجربه‌های خودم از کار با RabbitMQ است.قبل از خوندن این مقاله اگر دوست داشتید می‌تونید دو جلسه کارگاه آموزش RabbitMQ رو در اینجا و اینجا ببنید.الگوهای طراحی Exchangeها داشتن تنها یک Exchange خارجی در هر پروژه: Exchangeها در RabbitMQ میتونند به صورت خارجی External و یا به صورت داخلی Internal باشند. امکان دسترسی خارجی به Internal Exchangeها در RabbitMQ وجود نداره. معمولا برای هر پروژه خوبه که از یک Exchange خارجی استفاده کنیم و مابقیExchangeها، صف‌ها و روابط بین این‌ها رو پشت اون Exchange خارجی مخفی کنیم. با این کار طراحی صف‌ها رو کپسوله میکنیم و تغییرات Exchangeها و روابطمون بینشون یک مسئله‌ی داخلی محسوب میشه و تغییراتشون موجب تغییر توی اپلیکیشن‌های خارجی نمیشه.استفاده از Topic Exchangeها و عدم استفاده از Header Exchangeها: در RabbitMQ ما چهار نوع Exchange اصلی داریم: Fanout، Direct، Topic و Header. وظیفه‌ی Exchange Fanout ارسال کپی پیام به تمام صف‌های متصل به اونه و این کار رو بدون هیچگونه مسیریابی و یا Filtering پیام انجام میده. Exchange Direct امکان ارسال پیام رو با Route مشخص فراهم میکنه. Exchange Topic میتونه علاوه بر Routing معمولی از Wildcard Routing هم پشتیبانی میکنه و در نهایت Header Exchangeها مسیریابی رو با آرایه‌ای از Key و Valueها انجام میده. از بین این چهار نوع اصلی بیشتر فشار و بار رو برای مسیریابی Header Exchangeها ایجاد میکنند و توی دیتا با حجم بالا خودش میتونه یک گلوگاه توی سیستم باشه. معمولا ما به مسیریابی در هنگام ارسال پیام در RabbitMQ نیاز داریم و توی سیستم‌های پیشرفته کمتر از ارسال پیام بدون مسیریابی استفاده میکنیم. به همین دلیل کاربرد Fanout میتونه محدود باشه. در عوض Topic Exchange همه‌ی قابلیت‌ها Direct Exchange رو در داخل خودش داره و از طرف با پشتیبانی از مسیریابی همراه با Wildcard میتونه ما رو توی مسیریابی بهینه در پروژه‌مون یاری کنه. کل یک پروژه‌ی پیچیده رو با ده‌ها Exchange و صدها صف میشه با Topic Exchange به راحتی مدیریت کرد و بهینه‌ترین و پچیده‌ترین الگوی روابط رو هم به راحتی با این Exchange پیاده کرد. استفاده از Alternate Exchange: یک پیام به هر دلیلی از جمله اشتباه در طراحی سیستم و یا استفاده از Routing نامناسب در Client ممکنه که در RabbitMQ به مقصد نرسه. در حالت معمول در صورتی که یک پیغام به مقصد نرسه اون پیغام lost میشه و ما برای همیشه اون پیغام رو از دست میدیم. موقعی که داریم یک Exchange رو تعریف میکنیم میتونیم به RabbitMQ بگیم که اگر اون Exchange نتونست کارش رو به درستی انجام بده و به هر دلیلی پیغام به مقصد نرسید اون پیغام رو به یک Exchange دیگه تحویل بده. در اصل این Exchange کارش رسیدگی به امور پیغامهای از دست رفته است. به طور مثال توی پروژه ما میتونیم یک Exchange داشته باشیم و این Exchange رو به عنوان Alternate Exchange تمامی Exchangeهای پروژه‌مون تعریف کنیم. مرسومه که نوع این Exchange از نوع Fanout باشه و یک صف بهش متصل باشه تا همیشه بدون توجه به Routing اولیه پیغامهای مسیریابی نشده رو داخل صف متصل به خودش قرار بده. اون وقت هر چند وقت یک بار میتونیم سراغ این صف بریم و این پیغامها رو بررسی کنیم تا دلیل به مقصد نرسیدنشون رو متوجه بشیم. الگوهای طراحی Queueهااستفاده از Lazy Queueها در زمان مناسب: به طور پیش فرض برای کسب Performance بهتر در RabbitMQ همه‌ی پیام‌ها در رم نگه داری میشه. وقتی که حجم هر پیامتون بالاست و تعدادی زیادی پیام رو میخواهید توی صف نگهداری و مدیریت کنید، به سادگی رم سیستم پر میشه و به مشکل کمبود فضا میخورید. هر وقت تعداد بالای پیام و یا پیام‌های با حجم سنگین داشتید حتما قابلیت Lazy Mode صفی که باهاش کار میکنید رو فعال کنید. با استفاده از این قابلیت پیام‌ها توی هارد ذخیره میشه و در صورت نیاز از هارد بازیابی میشه و در اختیار مصرف‌کننده‌گان پیام قرار داده میشه. استفاده محدود از Priority Queueها: در RabbitMQ این امکان فراهم شده که ما صف‌هایی داشته باشیم که پیام‌های داخل اونها به ترتیب اولویت تعیین شده مرتب بشه. حداقل اولویت یک صف عدد 0 و حداکثر اون میتونه تا عدد 255 تعیین بشه. هر بار که پیام جدیدی به صف میرسه RabbitMQ این پیام جدید رو با پیام‌های قبلی مقایسه میکنه تا اون رو در جای مناسب قرار بده تا ترتیب اولویت بین پیام‌ها حفظ بشه. بدیهیه که توی تعداد بالای پیام و اولویت‌های متفاوت این موضوع روی سیستم بار و فشار زیادی میاره. عدد بهینه حداکثر داشتن ده اولویت توی یک صفه و البته بهینه‌ترین کار اینه که صف‌های متفاوت برای مدیریت اولویت پیام‌های مختلف‌تون داشته باشید تا هر بار RabbitMQ مجبور به مرتب سازی صف نشه. حذف خودکار صف‌های اضافی: در RabbitMQ امکانات متفاوتی برای مدیریت صف‌های یکبار مصرف وجود داره. از جمله صف Exclusive که بعد از بسته شدن Connection به طور خودکار حذف میشه و یا صف‌هایی که وقتی دیگه مصرف کننده‌ای بهشون متصل نیست، خودشون رو حذف میکنند. هر وقت که صف رو به طور موقت میخواستید استفاده کنید از این امکانات استفاده کنید و بدون دلیل RabbitMQ رو شلوغ نکنید.خالی نگه داشتن صف‌ها: از صف‌ها به عنوان انباره‌ی داده استفاده نکنید. ماهیت RabbitMQ انتقال و مسیریابی دیتاست. برای نگهداری دیتاها میتونید از دیتابیس‌ها یا ابزارهای دیگه موجود استفاده کنید. وقتی که صف‌هاتون بیش از حد حجیم هستند در صورتی که سیستم Reboot بشه زمان بیشتری لازمه تا تمام اطلاعات دوباره توی Ram بارگذاری بشه. تا جایی که میتونید برای صف‌ها و پیغام‌هاتون حداکثر طول عمر تعیین کنید. همچنین میتونید حداکثر تعداد پیغام و حداکثر حجم برای صفتون تعیین کنید. در نهایت میتونید برای پیغام‌های حذف شده‌تون صف دیگه‌ای در نظر بگیرید تا به صورت خودکار داخل اون صف ریخته بشند.استفاده بهینه از Connectionها و Channelهاعدم باز و بسته کردن Connection به ازای هر پیام: برای اتصال به RabbitMQ ما در ابتدا باید یک Connection رو باز کنیم. Connection یک ارتباط واقعی TCP/IP بین Client و نرم‌افزار RabbitMQ است. بر روی این Connection ما میتونیم یک تا بینهایت ارتباط مجازی داشته باشیم. در RabbitMQ این ارتباط مجازی رو Channel میگن. باز و بسته کردن Connectionها مخصوصا وقتی از SSL/TLS استفاده میکنیم برای سیستم هزینه‌بر و زمان‌بره. بهینه‌تر اینه که ما Connectionهامون رو توی طول برنامه تا جایی که نیازشون داریم باز نگه داریم و در صورت عدم استفاده‌ی طولانی مدت اونها رو ببندیم. در نهایت خوبه که Channel برا ارسال و یک Channel برای دریافت داشته باشیم. عدم اشتراک گذاری Channelها بین Threadهای مختلف: در اکثر کتابخونه‌هایی که سمت Client برای RabbitMQ نوشته شده، برای رسیدن به Performance بیشتر Channelها رو Thread Safe ننوشتند. به خاطر این موضوع به هر Thread چنل خاص خودش رو باید داشته باشه و از به اشتراک گذاری Channelها بین Threadهای مختلف خودداری کنید.روش‌های بهینه دریافت پیاماستفاده از روش Push به جای استفاده از روش Pull: به دو صورت میتونیم دیتا رو از RabbitMQ بخونیم. اولین روش استفاده از Push است. با استفاده از این روش هر وقت پیغامی داخل صفی که ما بهش گوش میدیم درج میشه، از طرف RabbitMQ یک نوتیفیکیشن برای ما ارسال میشه و ما میتونیم اون پیغام رو دریافت کنیم. در روش Pull این Client هست که هر چند مدت یک بار از RabbitMQ میپرسه که آیا دیتای جدیدی داره یا نه؟ به طور پیش فرض برای خوندن اطلاعات صف از روش Push استفاده کنید. این روش کارآمدتر و بهینه‌تر از روش Pull است. تنها در صورتی از روش Pull استفاده کنید که سیستم‌هاتون به صورت غیر همزمان با هم متصل هستند. مثلا یک صف برای ذخیره لاگ دارید و سیستم لاگتون هر شب ساعت دوازده شب به این صف سر میزنه. در این سناریو میتونید از روش Pull استفاده کنید و پس از خوندن کل صف، ارتباطتون رو قطع کنید.تنظیم کردن QoS: به طور پیشفرض وقتی به یک صف متصل هستید و دارید اون صف رو Consume‌ میکنید، هر پیغامی به صف ارسال بشه به طور خودکار همون لحظه این پیغام به کلاینت ارسال میشه. با تنظیم کردن پارامترهای QoS میتونید مشخص کنید که تا وقتی پیغام قبلی رو تعیین وضعیت نکردید پیغام جدیدی بهتون ارسال نشه و پیغام‌های جدید در صف نگهداری بشن. اینجوری اگر سیستمون یکدفعه کرش کنه تنها یک پیغام باید بازیابی بشه و دوباره به صف برگرده. البته با توجه به سناریوی خودتون میتونید هر بار تعداد بیشتری پیام دریافت کنید و به صورت دسته‌ای به پیغام‌ها رسیدگی کنید اما حتما بر اساس نیازتون Qos رو تنظیم کنید.فرستادن Auto-acknowledgements رو متوقف کنید: موقعی که دارید تنظیمات دریافت پیام رو توی Client انجام میدید میتونید به RabbitMQ بگید که پس از ارسال پیام به شما به صورت خودکار اون پیغام رو از داخل صف حذف کنه. مشکل کار اینجاست که اگر در میانه‌ی راه پیغام به هر دلیلی به شما نرسه یا اینکه شما نتونید به درستی پیغام رو پردازش کنید، اون پیغام برای همیشه از دست رفته و قابل بازیابی نیست. به جای فرستادن Auto act خودکار، در ابتدا پیغام رو دریافت کنید و در صورت پردازش صحیح، پیغام act رو برای RabbitMQ بفرستید. در این صورت اگر هر اتفاقی برای پیام بیافته و به صورت صحیح پردازش نشه، RabbitMQ اون رو به صف بر میگردونه و پیغام از دست نمیره.سیستم RabbitMQ رو میتونید با ابزار پرمتئوس مانیتور و مدیریت کنید. هم همیشه نسخه‌ی Erlang و RabbitMQ خودتون رو بروز نگه دارید و در اتنها امیدوارم که این مقاله براتون مفید واقع شده باشه و اگر نکته‌ای به نظرتون میرسه خوشحال میشم که باهام در میون بزارید.</description>
                <category>حسین منصوری</category>
                <author>حسین منصوری</author>
                <pubDate>Fri, 11 Dec 2020 20:22:03 +0330</pubDate>
            </item>
                    <item>
                <title>آموزش RabbitMQ به همراه بررسی مثالهای عملی</title>
                <link>https://virgool.io/@mansourihosein/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-rabbitmq-%D8%A8%D9%87-%D9%87%D9%85%D8%B1%D8%A7%D9%87-%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D9%85%D8%AB%D8%A7%D9%84%D9%87%D8%A7%DB%8C-%D8%B9%D9%85%D9%84%DB%8C-zahqlilklebr</link>
                <description>RabbitMQچند وقت پیش دو جلسه ی ارائه در مورد RabbitMQ توی سازمانمون داشتم. توی این دو ارائه تلاش کردم مباحث مختلف این حوزه رو در حد توانم توضیح بدم. در ابتدا انواع Patternهای انتقال اطلاعات رو بررسی کردم و در ادامه از مدلهای مختلف صف، Exchange و پیام صحبت کردم. در ادامه ویژگی‌های این سه عنصر اساسی در RabbitMQ توضیح دادم. یک نگاهی به نصب RabbitMQ توی پلتفرمهای مختلف انداختم. انواع مختلف Exchange رو بررسی کردم. همچنین در مورد Scale out کردن صحبت کردم و در نهایت هم یک مقایسه‌ی کوچیک بین کافکا و RabbitMQ داشتم. لیست کامل سر فصل‌هاش به شرح زیر است:Integrations PatternsRabbitMQ Basic DefinitionExchangesAdvanced ExchangeMessaging PatternAdvanced QueueScaling OutKafka vs RabbitMQ زمان دو تا جلسه تقریبا 1:40 دقیقه شد و لینکهاش رو اینجا باهاتون به اشتراک میزارم.   https://www.aparat.com/v/1PgNT  https://www.aparat.com/v/NxpMY امیدوارم مفید واقع بشن و دوستشون داشته باشید. اگر هر سوال، نکته و یا ایرادی بود خوشحال میشم بهم اطلاع بدید.</description>
                <category>حسین منصوری</category>
                <author>حسین منصوری</author>
                <pubDate>Fri, 04 Dec 2020 22:10:03 +0330</pubDate>
            </item>
                    <item>
                <title>بررسی ویژگی‌های جدید ECMAScript 2020</title>
                <link>https://virgool.io/Only-js/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D9%88%DB%8C%DA%98%DA%AF%DB%8C%D9%87%D8%A7%DB%8C-%D8%AC%D8%AF%DB%8C%D8%AF-ecmascript-2020-kuefd87kywbm</link>
                <description>ECMAScript 2020 New featuresچند روزی میشه که نسخه‌ی پایدار Node.js به نسخه‌ی v14 بروزرسانی شده. با این بروزرسانی علاوه بر بهبود‌های مختلف ما می‌تونیم از ویژگی‌های ECMAScript 2020توی کدهامون به صورت پایدار استفاده کنیم. این کار کمکمون میکنه که کدهای بهتر و پایدارتری بنویسیم. با هم قراره که این ویژگی‌ها رو توی این نوشته بررسی کنیم.جدول 1 زمانی نسخه های مختلف NodeJS پراپرتی امن یا  (?.) Optional Chaining operatorتا قبل از نسخه 2020 برای اینکه null error exception نخوریم مجبور بودیم null نبودن تمام پراپرتیهای درونی یک شی رو با نوشتن یک عالمه if چک کنیم. حالا با اومدن این ویژگی همه چی به شکل آب خوردن شدنه!const employee = {
name: &amp;quotAlice&amp;quot,
};

const person = employee.address?.city;
console.log(person);
// results in undefined as city is not existing in employee objectاپراتور جایگزینی مقادیر نال یا (??) Nullish coalescing operator با استفاده از این اپراتور میتونیم مشخص کنیم که اگر مقدار سمت چپ عبارت برابر با nullیا undefined بود با مقدار سمت راست عبارت جایگزین بشه.const person = null ?? &amp;quotmy Name&amp;quot
console.log(person);
// prints &amp;quotmy Name&amp;quot

const myNumber = 0 ?? 42;
console.log(myNumber)
// prints 0ویژگی Dynamic importsدر جاوااسکریپت import کردن یک ماژول تا به حال صورت کاملا strict و static صورت میپذیرفت. بعد از کلمه‌ی کلیدی import ما فقط مجاز به استفاده از یک رشته متنی بودیم و به طور مثال حق استفاده از یک تابع رو نداشتیم.import ... from getModuleName();//Error, only from &amp;quotstring&amp;quot is allowedیا نمیتونستیم به صورت dynamic مقدار import رو تغییر بدیم.if (...) {
  import ...; // Error, not allowed!
} else {
   import ...; // Error, we can&#039;t put import in any block
}که البته مزیتهای زیادی توی آنالیز یا bundle بهتر کد در اختیار ما میگذاشت. حالا با استفاده از عبارت  ()import این موضوع تغییر کرده و ما میتونیم به صورت پویا یک ماژول رو import کنیم و این کار رو هر قسمت از کد هم می‌تونیم انجام بدیم.const moduleToImport = &amp;quot./dir/myModule.js&amp;quot
import(moduleToImport).then((module) =&gt; module.myFun());با استفاده از عبارت import() ما یک promise به دست میاریم.افزوده شدن پشتیانی از Bigint و Uint64تا قبل از ECMAScript 2020 نسخه‌ی استاندارد ECMAScript برای پشتیبانی از اعداد وابسته به مقدار 64-bit floating point numbers بود. اما از این نسخه به بعد اعداد بدون اعشار نوع اختصاصی خودشون به نام bigint رو پیدا کردند.console.log(typeof 123n)
// &amp;quotbigint&amp;quotویژگی () String.prototype.matchAllدر ECMAScript 2020 متد () matchAll به نوع String اضافه شده. این متد عبارت‌های match شده یک regular expression رو به صورت یکدفعه برمیگردونه.let regexp = /t(e)(st(\d?))/g;
let str = &amp;quottest1test2&amp;quot
let array = [...str.matchAll(regexp)];
console.log(array[0]);

// [&amp;quottest1&amp;quot,&amp;quote&amp;quot,&amp;quotst1&amp;quot,&amp;quot1&amp;quot]ویژگی Promise.allSettledاین ویژگی به ما کمک میکنه که پس از حل شدن وضعیت تمام Promiseهای وابسته اعم از اینکه resolve بشن یا اینکه reject بشن یک Promise صادر بشه. اینجوری ما متوجه میشیم که Promiseهای وابسته به سرانجام خودشون رسیدند و کارهای بعدی رو میتونیم از سر بگیریم.const promise1 = Promise.resolve(3);
const promise2 = new Promise((resolve, reject) =&gt;
            setTimeout&#40;reject, 100, &amp;quotfoo&amp;quot&#41;
);const promises = [promise1, promise2];
Promise.allSettled(promises).then((results) =&gt;
              results.forEach((result) =&gt; console.log(result.status)));// expected output:
// &amp;quotfulfilled&amp;quot
// &amp;quotrejected&amp;quotویژگی Runtime Independent globalThisبه صورت تاریخی برای دسترسی به شی global در محیط مختلف اجرای جاوا اسکریپت نیازمند Syntaxهای متفاوت بود. برای مثال توی web میتونستیم از window، self و یا frame با با توجه به محیط اجرای کدمون استفاده کنیم. در حالی که هیچ کدوم از کلمات کلیدی بالا در محیط nodejs کاربردی نداشت و در این محیط باید از کلمه‌ی کلیدی global استفاده می‌کردیم. توی ECMAScript 2020 با استفاده از کلمه‌ی کلیدی globalThis این مشکل حل شده.منابع: + و + و + و +.</description>
                <category>حسین منصوری</category>
                <author>حسین منصوری</author>
                <pubDate>Sat, 31 Oct 2020 17:45:08 +0330</pubDate>
            </item>
                    <item>
                <title>الزامات طراحی صفحات 404، بررسی بهترین روش‌ها</title>
                <link>https://virgool.io/CreativePie/%D8%A7%D9%84%D8%B2%D8%A7%D9%85%D8%A7%D8%AA-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-404-%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D8%A8%D9%87%D8%AA%D8%B1%DB%8C%D9%86-%D8%B1%D9%88%D8%B4%D9%87%D8%A7-xbqjopc39sa6</link>
                <description>صفحه‌ی 404، صفحه‌ای است که هیچ برنامه‌نویسی دوست ندارد که کاربران سایت با آن مواجه شوند و البته چه دوست داشته باشیم و چه دوست نداشته باشیم، کاربران ما با این صفحه مواجه خواهند شد.تجربه کاربران در مواجه با صفحه 404 ناراحت کننده و ناخوشایند است. هیچکس دوست ندارد که به یک آدرس نامعتبر هدایت شود. هر چند به دلیل وجود لینک‌های شکسته، اشتباه در تایپ، کپی ناقص آدرس و .. برخورد کاربران با این صفحه اجتناب ناپذیر است.برای رسیدن به یک صفحه‌ی 404 ایده‌آل باید با آن به عنوان یک صفحه‌ی ورود (Landing Page) برخورد کرد. البته تلاش حداکثری باید بر این باشد که کاربران کمتری با این صفحه برخورد کنند. همچنین اینگونه صفحات معمولا نرخ پرش بالایی دارند، باید تلاش شود که هر چقدر که امکان دارند نرخ پرش این صفحات کاهش پیدا کند.صفحه 404 باید شامل چه موارد باشد؟برای عدم گسست تجربه‌ی کاربری در کل سایت، در صفحه‌ی 404 حداقل موارد زیر باید رعایت شود:توضیح مناسب برای آنچه رخ داده است: کاربر باید در لحظه‌ی اول و بدون هیچ تلاشی متوجه وجود خطا شود. استفاده از صفحه‌ نمایش خطای پیش‌فرض برای کاربران و نمایش دادن عناوینی مانند Internal server error و File or directory not found آن هم به صورت انگلیسی باید جز جنایت علیه بشریت دسته‌بندی شود.یکپارچگی در ظاهر: نام پایگاه، لوگو و قالب اصلی سایت باید در این صفحه نیز نمایش داده شود.لینک دادن به صفحات اصلی پایگاه: حداقل بین 3 تا 4 لینک به محتوای اصلی سایت مانند خانه، لیست اصلی پایگاه و .. باید در این صفحه وجود داشته باشد. البته افراط بیش از حد در لینک دادن موجب سردرگمی کاربر می‌شود.فراخوانی برای اقدام (Call to action) : کاربران در مواجه با این صفحه نباید تصور کنند که کنترل جریان بازدید سایت را از دست داده‌اند. وجود کادر جستجو همیشه در این صفحه قابل دفاع است.داشتن کمی خلاقیت: برای کاهش تجربه‌ی ناخوشایند برخورد کاربر با صفحه‌ی 404 وجود لحن کمتر رسمی و کمی هم شوخی فکر چندان بدی به نظر نمی‌رسد. هر چند زیاده‌روی در هر کاری ناپسند و موجب دور شدن این صفحه از کارکرد اصلی آن می‌شود.ساده نگه داشتن همه چیز: قرار نیست که کاربر در این صفحه برای مدت طولانی نگه داشته باشد. این صفحه باید محلی برای شروع مجدد گشت و گذار در پایگاه باشد. ساده و سبک نگه داشتن این صفحه یک رویکرد کاملا منطقی می‌باشد.نگه داشتن کاربر در صفحه 404 یا تغییر مسیر کاربر به یک صفحه‌ی دیگر؟برای انتخاب کردن بین دو گزینه‌ی نگه داشتن کاربر در صفحه‌ی 404 یا تغییر مسیر کاربر (Redirect) به صفحه‌ی دیگر به صورت خودکار در هنگام مواجه با صفحه‌ی 404 دو رویکرد زیر را همیشه به خاطر بسپارید:اگر صفحه‌ای داشتید که ورودی زیادی از گوگل دریافت می‌کرد و به هر دلیل تصمیم به حذف این صفحه با صفحه‌ی مشابه دیگر گرفتید، در صورت بازدید کاربر از این صفحه می‌توانید کاربر را به صورت مستقیم به صفحه‌ی جدیدتر هدایت کنید.در مابقی موارد نگه‌داشتن کاربر در صفحه‌ی خطا موجب شفافیت بیشتر برای کاربران می‌شود. فرستادن یک کاربر به یک صفحه‌ی ناخواسته بدون اینکه اطلاع رسانی مناسبی در این باره صورت بگیرد، قطعا یک تجربه ناخوشایند برای کاربر خواهد بود.در هنگام مواجه با صفحه‌ی 404، تحت هر شرایطی کاربر را به صفحه‌ی اصلی پایگاه هدایت نکنید. جز احساس ناخوشایند سردرگمی هیچ چیزی عاید کاربر نخواهد شد.بهترین صفحات 404 موجود برای الهام گرفتنمشاهده و بررسی سایت‌هایی که صفحه‌ی 404 را به بهترین نحو ممکن پیاده‌سازی کرده‌اند، می‌تواند الهام‌بخش یک طراحی مناسب برای این صفحه شود.1-Starbucksتوضیح مناسب علت‌های مختلف رخ دادن خطا، کارهایی که کاربر می‌تواند انجام دهد و از همه مهمتر گزارش وجود خطا در وب سایت، این صفحه را به یک الگوی مناسب تبدیل می‌کند.2-  Mediumتوضیح اتفاق رخ داده با بالاترین فونت ممکن، وجود کادر جستجو جهت دادن کنترل به کاربر و از همه جالب، همدردی با کاربر و نمایش سه مقاله مرتبط با گم شدن به کاربر، نبوغ کامل طراحان این صفحه را نمایش می‌دهد.3-legoکاربرتان به صفحه‌ی ناخواسته‌ی 404 هدایت شده است؟ تهدید را به فرصت تبدیل کنید و آن را به صفحه‌ی فروشگاه خود هدایت کنید. این دقیقا کاری است که مدیران فروشگاه Lego در پایگاه خود انجام می‌دهند.4- path.blueاز محتویات پایگاه خود به صورت خلاقانه استفاده کنید. نمایش یک نقشه از حضور مابقی کاربران، تعیین یک نقطه خارج از نقشه جهت نمایش موقعیت فعلی کاربر و توضیحات مناسب نشانده‌ی خلاقیت منحصر به فرد طراحان تجربه‌ی کاربری این پایگاه می‌باشد.منابع: + و +.</description>
                <category>حسین منصوری</category>
                <author>حسین منصوری</author>
                <pubDate>Sat, 15 Aug 2020 17:36:13 +0430</pubDate>
            </item>
                    <item>
                <title>مقدمه‌ای بر Min.io: یک Object Storage قدرتمند</title>
                <link>https://virgool.io/coderlife/%D9%85%D9%82%D8%AF%D9%85%D9%87%D8%A7%DB%8C-%D8%A8%D8%B1-minio-%DB%8C%DA%A9-object-storage-%D9%82%D8%AF%D8%B1%D8%AA%D9%85%D9%86%D8%AF-uglsda8qo3au</link>
                <description>با توجه به افزایش سالانه‌ی حجم فایل‌های تحت مدیریت شرکت‌ها، نرم‌افزارها و وب‌سایت‌ها، این روزها مدیریت فایل‌‌ بخش جدایی‌ناپذیری از چالش‌های پروژه‌های نرم‌افزاری شده است. با افزایش تنوع فایل‌ها و بالا رفتن حجم کلی سیستم، مدیریت فایل‌ها به سادگی می‌تواند گلوگاه و پاشنه‌ی آشیل تمام سیستم‌های نرم‌افزاری موجود باشد. در فضای نرم‌افزاری سیستم‌های مدیریت فایل با نام Object Storage شناخته می‌شوند.برای حل مشکل مدیریت فایل‌ها برخی از شرکت‌ها سراغ گزینه‌های آماده شرکت‌های  بزرگ از جمله Amazon S3 یا Azure Blob storage میروند. اما به خاطر مباحث امنیتی، نداشتن کنترل کامل در این سیستم‌ها و ایجاد ساختار هماهنگ در کل پروژه [و یا حتی تحریم در ایران] برخی دیگر از شرکت‌ها یا به تنهایی مسئولیت تهیه و توسعه یک Object Storage داخلی را می‌پذیرند و یا به سراغ نرم‌افزارهای آماده مدیریت فایل موجود در بازار می‌روند. این نرم‌افزارهای قابلیت نصب بر روی سرورهای داخلی سازمان -به صورت on promise- را دارا می‌باشند.به صورت اختصاصی Min.io برای کار در محیط ابری طراحی شده استاز بهترین Object Storageهای بازار که قابلیت نصب به صورت on-promise را دارا می‌باشند میتوان به Ceph Swift و Min.io اشاره کرد. در ابتدا به مقایسه این سه ابزار با هم می‌پردازیم.مقایسه Ceph، Swift و Min.ioنرم‌افزار Ceph: توسعه دهنده‌های نرم‌افزار Ceph محصول‌شون رو به صورت &quot;یک نرم‌افزار آزاد برای بستر ذخیره سازی&quot; معرفی می‌کنند. Ceph علاوه بر مدیریت اشیا، امکان مدیریت بلاک‌ها و مدیریت فایل سیستم رو هم داره. به خاطر این موضوع Ceph میتونه در دسته‌ی File Storage ها هم قرار بگیره. DigitalOcean و Runtastic از جمله مشتریان نرم‌افزار Ceph هستند. این نرم‌افزار تحت لیسانس LGPL 2.1 به بازار عرضه شده.نرم‌افزار Openstack Swift: پروژه object storage شرکت Openstack با نام Swift شناخته میشه. Swift رو میشه یک object/blob store با دسترس‌پذیری بالا و توزیع شده دونست. این نرم‌افزار با اهمیت دادن به دسترس‌پذیری بالا از تکنیک در نهایت سازگار -eventually consistent- استفاده میکنه. شرکت‌های Vimtastic و  Datto از جمله مشتریان Swift هستند. Swift برای ذخیره‌سازی داده‌های غیرساخت‌یافته با رشد و دسترسی‌پذیری بالا مناسبه.نرم‌افزار Min.io: به عنوان اصلی‌ترین جایگزین متن باز Amazon S3 شناخته میشه. این نرم‌افزار برای داشتن کارایی بالا با زبان Go نوشته شده و تحت لیسانس Apache 2.0 عرضه شده. همچنین APIهای دسترسی به Min.io برای تطبیق بیشتر مبتنی بر استاندارد Amazon S3 تهیه و تولید شده. این نرم‌افزار بیشتر 21 هزار ستاره در گیت‌هاب دریافت کرده و همچنین نسخه‌ی داکری اون بیشتر از 355 میلیون بار Pull شده. این نرم‌افزار در دسته‌ی Cloud Storage ها قرار داره. کدهای Min.io رو می‌تونید در این آدرس مشاهده کنید. کمپانی‌هایی مثل Github، AgFlow و codebeat از جمله مشتریان Min.io هستند. در اصل به گفته‌ی سایت اصلی شرکت بیش از نیمی از 500 شرکت برتر آمریکا از نرم‌افزار Min.io استفاده میکنند. از دیگر قابلیت‌های Min.io قابلیت اتصال به نرم‌افزارها و سیستم‌های متنوع دیگه‌ای مانند آپاچی کافکا، پرومتئوس، آپاچی فلینک، آپاچی اسپارک می‌باشد. لیست طولانی تمامی این نرم‌افزارها رو می‌تونید در این آدرس مشاهده کنید.بین این سه گزینه Ceph و Swift برای مدیریت دیتاسنترهای یک شرکت خدمات‌دهنده‌ی ابری استفاده می‌شوند در حالی که هدف Min.io جایگزینی برای خدمات Amazon S3 می‌باشد. به همین دلیل شرکت DigitalOcean از Ceph و شرکت گیت‌هاب از Min.io استفاده می‌کند. در مجموع برای مدیریت فایل‌های یک شرکت نرم‌افزار Min.io گزینه‌ی مناسب‌تری می‌باشد.ویژگی‌های Min.ioپیاده‌سازی شده با زبان Goمبتنی بر Cloud و داشتن هماهنگی کامل با داکر و Kubernetesقابلیت خواندن دیتا با سرعت بیش از 180 گیگابایت بر ثانیه و نوشتن دیتا با سرعت بیش از 170 گیگابایت بر ثانیهکاملا و به صورت صد در صد Open Sourceداشتن API های مبتنی بر استاندارد S3 آمازونداشتن SDK های متنوع برای زبان‌های گوناگون از جمله جاوا اسکریپت، سی شارپ، پایتون، جاوا، ...جلوگیری از دست رفتن دیتا با استفاده از highwayhashپشتیبانی از رمزنگاری فایل‌ها با استفاده از الگوریتم‌های متنوع از جمله AES-256-GCM، ChaCha20-Poly1305، AES-CBCپشتیبانی از رمزنگاری با کلید متفاوت به ازای هر فایل و استفاده از Master key برای دسترسی به کلیدهاقابلیت احراز هویت با استفاده از سیستم‌های مبتنی بر OpenIDقابلیت ایجاد Replication های همزمان و پیوستهقابلیت اجرا در بسترهای متفاوت و ایجاد یک مدیریت یکپارچهپشتیبانی از معماری چند مستاجریدلایل استفاده از Min.ioبه جای پیاده‌سازی سیستم مدیریت فایلچه در سطح ملی و چه در سطح شرکت‌ها و افراد همیشه میل زیادی به پیاده‌سازی نرم‌افزارها و سیستم‌ها به صورت بومی و شخصی بوده است. در سطح ملی پروژه‌هایی مانند سیستم‌عامل‌ ملی، موتور جستجوی ‌ملی، زبان‌برنامه‌نویسی ملی چند نمونه از ده‌ها پروژه‌ی شکست خورده در این زمینه هستند. در سطح شرکت‌ها نیز بارها شاید پیاده‌سازی ORM بومی و جایگزینی برای Entity Framework و همچنین داشتن CMS بومی برای مقابله با Wordpress بوده‌ام.در اصل منابع انسانی و مالی دولت‌ها و شرکت‌ها محدود و برای هیچکدام پیاده‌سازی تمام نرم‌افزارها به صورت بومی امکان‌پذیر نمی‌باشد. به طور مثال ممکن است که شش ماه اول یک پروژه صرف پیاده‌سازی یک ORM بهینه به نسب ORM های بهینه‌ی موجود در یک شرکت شود اما در انتها زمانی که می‌توانست به توسعه‌ی نرم‌افزار اصلی پرداخته شود، صرف محصولی شده است که معمولا در نهایت کارایی مناسبی به نسبت رقیب خود ندارد. علاوه بر این به طور معمول ابزارها و سیستم‌ها توسط تیم‌های قدرتمند و به طور دائمی در حال توسعه هستند و بعد از مدتی فاصله‌ی بین ابزار پیاده شده و ابزار دنیا بیرون بیشتر و بیشتر می‌شود. به طور مثال سیستم مدیریت فایل Min.io ده‌ها قابلیت متفاوت و کارگشا دارد که پیاده‌سازی هر کدام مدت‌های طولانی برای یک شرکت زمان و هزینه می‌برد. در حال حاضر برای توسعه‌ی کدهای این پروژه بیش از 200 نفر نقش داشته‌اند و بیش از 6 هزار بار بر روی این پروژه commit صورت گرفته است.از طرف دیگر شرکت‌ها دغدغه‌‌ی کنترل بیشتر ابزارهای مورد استفاده را دارند و از طرف دیگر نگران عدم توسعه‌ی نرم‌افزار آماده از طرف شرکت اصلی هستند. برای حل مشکل انتخاب نرم‌افزارهای آزاد یک تصمیم منطقی به نظر می‌رسد. به طور مثال پروژه‌ی Min.io بیشتر از 2 هزار بار در گیت‌هاب Fork گرفته شده است و تیم‌های متفاوتی با توجه به نیاز خود اقدام به توسعه و بروزرسانی این نرم‌افزار در مسیر متفاوتی از نرم‌افزار اصلی کرده‌اند. Slack این پروژه نیز برای عموم در دسترس است و می‌توان از سمت و سوی آینده پروژه با خبر شد و در جریان کامل فرآیند توسعه‌ی این ابزار قرار گرفت.گستره‌ی کاربردنرم‌افزار Min.io سریع‌ترین رشد را در مارکت Object Storage ها در دنیا دارد و به طور روز افرون مورد استفاده‌ی شرکت‌های بیشتری قرار میگیرد. پوشش سراسری استفاده از Min.ioبرای شروع کار با Min.io می‌تونید به این آدرس مراجعه کنید.</description>
                <category>حسین منصوری</category>
                <author>حسین منصوری</author>
                <pubDate>Sun, 17 May 2020 15:35:19 +0430</pubDate>
            </item>
                    <item>
                <title>چگونه APIهای خود را با Postman تست کنیم؟</title>
                <link>https://virgool.io/shayanweb/%DA%86%DA%AF%D9%88%D9%86%D9%87-api%D9%87%D8%A7%DB%8C-%D8%AE%D9%88%D8%AF-%D8%B1%D8%A7-%D8%A8%D8%A7-postman-%D8%AA%D8%B3%D8%AA-%DA%A9%D9%86%DB%8C%D9%85-rdkps5dn2ekz</link>
                <description>تقریبا تمام کسانی که با API ها سروکار داشتند حتما با ابزار Postman آشنا هستند. این ابزار با سادگی فوق‌العاده‌اش کار با API ها رو راحت‌تر میکنه و در مراحل مختلف نوشتن API میتونه کمک مناسبی برای برنامه‌نویس‌ها‌ باشه. یکی از قابلیت‌های فوق‌العاده‌ی Postman نوشتن تست برای API می‌باشد. با افزودن تست‌ به API های خودتون می‌تونید همیشه از صحت کارکرد آنها مطمئن بشید.امکانات ابزار قدرتمند Postmanبرای شروع کار به دو چیز احتیاج داریم. در ابتدا آخرین نسخه‌ی Postman رو از این آدرس دانلود کنید. توی این مقاله از APIهای آماده سایت Github استفاده می‌کنیم، پس به خاطر این موضوع در گام دوم به این آدرس برید و برای خودتون یک token بگیرید. حالا آماده‌ایم که کار رو شروع کنیم. ما می‌خواهیم با استفاده این API به همراه Postman یک Repository جدید برای خودمون ایجاد کنیم. خروجی کار در Postman شماره 1: قید سرویس رو Post انتخاب می‌کنیم.شماره 2: آدرس سرویس رو برابر https://api.github.com/user/repos انتخاب میکنیمنوع ورودی سرویس 3 و 4: سرویس رو از نوع Body و raw و در نهایت JSON تنظیم میکنیم.ورودی سرویس برابر با مقدار زیر است: (5){
    &amp;quotname&amp;quot: &amp;quothello-world&amp;quot,
    &amp;quotdescription&amp;quot: &amp;quotThis is your first repository&amp;quot,
    &amp;quothomepage&amp;quot: &amp;quothttps://github.com&amp;quot,
    &amp;quotprivate&amp;quot: false,
    &amp;quothas_issues&amp;quot: true,
    &amp;quothas_projects&amp;quot: true,
    &amp;quothas_wiki&amp;quot: true
}حالا اگر با تنظیمات بالا سرویس رو اجرا کنید با خطای زیر مواجه میشید.دسترسی لازم برای اجرای سرویس رو ندارید!دلیل این مشکل اینه که شما دسترسی لازم برای اجرای این سرویس رو ندارید. برای حل این مشکل باید از توکن github که در بالا دریافتش کردید، استفاده کنید. نحوه‌ی استفاده از Tokenدر تب Authorization (شماره 1) نوع توکن ورودی رو برای با Bearer Token (شماره 2) قرار بدید و Token دریافتی خودتون رو داخل کادر (شماره 3) کپی کنید. حالا پس از اجرای سرویس در صورت وارد کردن صحیح تمامی اطلاعات باید با خروجی زیر مواجه بشید.خروجی موفق سرویسکد خروجی اجرای صحیح سرویس برای 201 (شماره 1) و می‌تونید اسم Repository ایجاد شده رو در کادر شماره 2 ببینید. حالا بیایید با هم تست‌ها رو بنویسیم. پنل تستامکان نوشتن تست‌ها در زبانه Test (شماره 1) فراهم شده است. با رفتن به این زبانه یک سری کد آماده برای استفاده در پنل سمت چپ (شماره 2) برای آسون‌تر کردن کار وجود داره. از این پنل گزینه‌ی Status code: Code is 200 رو انتخاب می‌کنیم. هدف از انتخاب این تست‌ بررسی مقدار Http Status برگشتی است.انتخاب تست مناسب مقدار Status بازگشتی از سرویس ایجاد ایجاد Repository گیت‌هاب برابر با 201 است. به خاطر همین تکه کد اول رو به صورت زیر تغییر میدیم. اصلاح کدیک بار دیگه سرویس رو فراخوانی کنید، اگر همه چیز رو درست انجام داده باشید با خطای زیر مواجه می‌شوید!خطای 422ابتدای این مطلب ما با هم مخزنی با نام hello-world در گیت‌هاب ایجاد کردیم و حق استفاده از نام تکراری رو نداریم، به همین دلیل Status خروجی برابر با 422 (شماره 1) شده. تست ما منتظر Status 201 بود، به خاطر این موضوع به درستی fail هم شده. بهترین راه برای اینکه صحت عملکرد یک تست رو تست کنیم، اینه که یک بار موجب fail شدن اون بشید!برای رفع این مشکل به سراغ زبانه Pre-request Script میریم. در این زبانه با نوشتن کدهای جاوا اسکریپت ما میتونیم جریان قبل از اجرای سرویس رو در اختیار بگیریم. دستورات کنترل جریان قبل از اجرای سرویس در خط اول یک عدد تصادفی رو به دست آوردیم. در خط دوم این عدد تصادفی رو به نام hello-world اضافه کردیم تا از این به بعد نام Repository انتخابی تکراری نباشه. مانند زبانه تست از تکه کدهای سمت چپ مقدار Set an environment variable رو انتخاب میکنیم. سپس مانند خط سوم اون رو اصلاح می‌کنیم تا مقدار نام Repository رو در متغیری به نام repositoryName ذخیره کنیم.حالا به سراغ body میریم و اون رو به صورت زیر تغییر میدیم. تغییر مقادیر Bodyدر Body مقدار name رو برابر با متغیر ایجاد شده در قسمت قبل قرار دادیم. برای استفاده از متغیرهای Postman اونها رو باید به این صورت در دو کروشه {{...}} قرار بدیم. حالا اگر دوباره سرویس رو اجرا کنیم، همه چیز به درستی انجام میشه و پیغام زیر رو توی زبانه Test Result دریافت میکنیم.نمایش نتایج اجرای تست ها در زبانه Test Resultتا اینجا همه چیز عالی بوده و با هم تونستیم یک Test در محیط Postman بنویسیم. اما تنها مقید به یک تست به ازای هر سرویس نیستیم و می‌تونیم تست‌های بیشتری به ازای هر تست داشته باشیم. پس در گام بعدی تستی می‌نویسیم که برابری مقدار name بازگشتی از اجرای سرویس رو با نامی که ما در body انتخاب کردیم مقایسه کنه و نتیجه رو به ما گزارش کنه. برای این کار دوباره به زبانه Test میریم و از تکه‌کدهای سمت چپ مقدار Response body: JSON value check رو انتخاب میکنیم و این تکه کد رو به صورت زیر تغییر میدیم.بررسی برابری نام ورودی و خروجیپس از اجرای سرویس در زبانه Test Result می‌تونیم نتیجه‌ی کار رو مشاهده کنیم.نتیجه‌ی نهایی کارامیدوارم که از خوندن این مطلب لذت برده باشید.</description>
                <category>حسین منصوری</category>
                <author>حسین منصوری</author>
                <pubDate>Tue, 12 May 2020 10:43:04 +0430</pubDate>
            </item>
                    <item>
                <title>لاگ کردن در Node js و جاوااسکریپت</title>
                <link>https://virgool.io/@mansourihosein/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-logging-%D8%AF%D8%B1-node-js-fwfimyeyrohj</link>
                <description>لاگ یک بخش کلیدی از نگهداری و داشتن تضمین کارایی یک سیستم در طول زمانه. طبیعت یک سیستم نرم‌افزاری پیچیده است و قرار نیست همیشه همه چیز عالی و درست پیش بره. در هر لحظه یک سیستم نرم‌افزاری ممکنه با خطا و مشکل ناخواسته‌ای مواجه بشه که در زمان طراحی و پیاده‌سازی کدها به اون توجهی نشده. لاگ کردن به ما کمک میکنه که برنامه‌ی خودمون رو بهتر درک کنیم. بدون لاگ درست ما باید ساعت‌های متوالی رو برای پیدا کردن منشا خطا در هنگام production صرف کنیم و ممکنه بارها و بارها به یک خطا بر بخوریم بدون اینکه به طور کامل بتونیم حلش کنیم. توی این نوشته قراره یک سری به دنیا لاگ در Node.js بزنیم و با هم امکانات موجود در این حوزه رو بررسی کنیم.هشدار: هیچ وقت اطلاعات حساس یا دیتای شخصی مثل رمزعبور و نام‌کاربری کاربران یا اطلاعات حسابشون رو داخل لاگ ذخیره نکنید. دو کتابخونه‌ی winston (به اندازه‌ی سیگارش معروفه) و morgan (به خاطر علاقه به دکستر مورگن نام‌گذاری شده) اصلی‌ترین کتابخونه‌ها این این حوزه به شمار میرن که به ترتیب در حال حاضر بیش از 5 میلیون و 2 میلیون دانلود در هفته دارند. هدف اصلی کتابخونه‌ی winston ایجاد یک ساختار لاگ کامل و چند سطحیه و این کار رو با دو ابزار Transports و Logging levels انجام میده. Transports این امکان رو برای ما فراهم میاره که لاگ‌های متفاوت رو توی زمان‌های متفاوت در در بسترهای متفاوت ذخیره کنیم. مثلا در زمان development فقط لاگ‌های خطاهای سری 400 و 500 رو توی کنسول نمایش بدیم و در زمان production لاگ اجرای تمامی سرویس‌ها رو توی دیتابیس ذخیره کنیم. مدیریت لاگ با Transportمثلا توی تکه کد بالا ما تصمیم گرفتیم همه‌ی لاگ‌ها رو توی فایل ذخیره کنیم اما فقط هنگامی که در Moody به غیر از production هستیم لاگ اجرای سرویس‌ها رو در کنسول هم به نمایش بزاریم. سطح‌ها یا levelها ابزار قدرتمند دیگه این کتابخونه برای مدیریت لاگه. سطح‌های این کتابخونه شامل موارد زیر است:سطح‌های کتابخونه‌ی winstonمشخصه که مهمترین سطح لاگ سطح صفر یا خطا هست و هر چقدر که بالاتر میاییم از اهمیت سطح‌ لاگ کاسته میشه. به طور مثال میتونیم option زیر رو برای مدیریت سطح‌های مختلف طراحی کنیم:نوشتن option برای مدیریت بهتر لاگ‌هادر option بالا ما برای دو سطح برنامه ریزی کردیم. لاگ‌های تا سطح info رو داخل فایل ذخیره کردیم. همچنین فرمت ذخیره‌سازی لاگ‌ها رو json انتخاب کردیم. سطح debug هم رو برای مدیریت اطلاعات در هنگام development انتخاب و کانفیگ کردیم. در تکه کد اولی ما از این optionها به عنوان تنظیمات Transport ها استفاده کردیم.کارمون تقریبا با کتابخونه‌ی winston اینجا تمومه و به سراغ کتابخونه‌ی morgan میریم. این کتابخونه در اصل یک middleware برای لاگ کردن اطلاعات هنگام api نویسیه. این کتابخونه مانند winston از option های متفاوتی برای ذخیره لاگ استفاده میکنه که شامل option هایی از قبیل tiny، dev، common و .. است. تفاوت این option ها به مقادیری اطلاعاتیه که اونها ذخیره میکنند. به طور مثال tiny شامل موارد زیر میشه: :method :url :status :res[content-length] - :response-time msعلاوه بر option های پیش فرض امکان شخصی‌سازی اونها هم وجود داره. به طور مثال تکه کد زیر رو در نظر بگیرید:تنظیمات کتابخونه ی morganاینجا چند تا اتفاق مهمه افتاده. اول اینکه ما یک option شخصی‌سازی شده برای این کتابخونه طراحی کردیم. ما مشخص کردیم که نوع متد، آدرس، وضعیت اجرا، طول پاسخ و زمان پاسخ رو ذخیره کنیم. همچنین منبع ذخیره‌سازی لاگ‌های این کتابخونه رو winston اعلام کردیم. اینجوری قدرت این دو تا کتابخونه رو با هم ترکیب کردیم. ترند اصلی ذخیره‌سازی لاگ علاوه بر ذخیره در دیتابیس Mongodb استفاده از اکوسیستم Elasticsearch به همراه Logstash و نمایش لاگها در Kibana است. همچنین کدهای این مطلب در این آدرس قرار داده شده.</description>
                <category>حسین منصوری</category>
                <author>حسین منصوری</author>
                <pubDate>Thu, 30 Apr 2020 12:02:48 +0430</pubDate>
            </item>
                    <item>
                <title>پیش به سوی WSL 2، لینوکس در ویندوز کاراتر از همیشه!</title>
                <link>https://virgool.io/@mansourihosein/%D9%BE%DB%8C%D8%B4-%D8%A8%D9%87-%D8%B3%D9%88%DB%8C-wsl-2-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-%D8%AF%D8%B1-%D9%88%DB%8C%D9%86%D8%AF%D9%88%D8%B2-%DA%A9%D8%A7%D8%B1%D8%A7%D8%AA%D8%B1-%D8%A7%D8%B2-%D9%87%D9%85%DB%8C%D8%B4%D9%87-gkyzfiy2mrnl</link>
                <description> تکنولوژی Windows Subsystem for Linux یا WSL این امکان رو برای کاربران فراهم میکنه که محیط GNU/Linux رو با اکثر به قریب امکانات -شامل خط فرمان، ابزارها و برنامه‌ها- بدون استفاده از VMware در ویندوز تجربه و استفاده کنند. به زبان ساده‌تر ما یک توزیع لینوکس رو با سربار بسیار پایین روی ویندوز خودمون تجربه می‌کنیم. لینوکس سریع‌تر با WSL 2مزایای این کار شامل: انتخاب توزیع GNU/Linux دلخواه از فروشگاه مایکروسافتاجرای اکثر دستورات خط فرمان‌های نرم‌افزارهای آزاد شامل grep، sed، awk و یا بقیه باینری‌های ELF-64 اجرای اسکریپت‌های Bash shell و نرم‌افزارهای GNU/Linux شامل:         ابزارهایی از قبیل vim، emacs و tmux         استفاده از اغلب زبان‌های برنامه‌نویسی جریان اصلی شامل Javascript/node.js، Ruby، Python، C++/C، Rust، Go، سی شارپ و ...        استفاده از سرویس‌هایی شامل sshd، MySQL، Apache، lighttpdنصب نرم‌افزارهای مورد نیاز با استفاده از مخزن‌های توزیع‌های مختلف لینوکسفراخوانی اپلیکیشن‌های ویندوزی با استفاده از خط فرمان شل Unix-likeفراخوانی اپلیکیشن‌های GNU/Linux بر روی ویندوزپیش به سوی WSL 2 معماری WSL 2این بروزرسانی به ویندوز امکان استفاده از ویژگی‌های باینری ELF64 لینوکس رو میده. مهمترین هدف این بروزرسانی و تغییر معماری افزایش کارایی هنگام کار با فایل سیستمه. به زبان ساده‌تر از این به بعد با سرعت بالاتری عملیات I/O انجام میدید. هر کدوم از توزیع‌های لینوکس که روی WSL امکان نصب دارند، بدون هیچ مشکلی خاص روی WSL 2 هم کار می‌کنند. در اصلی در هر زمان که اراده کنید این امکان رو دارید که بین این دو تا معماری سوئیچ کنید و توزیع مورد نظرتون رو با معماری مناسب اجرا کنید. در بروزرسانی WSL 2 از آخرین نسخه‌ی هسته‌ی لینوکس استفاده شده و این هسته برای داشتن کارایی بیشتر روی ویندوز بروزرسانی شده. (توضیحات بیشتر)افزایش سرعت با بروزرسانی به WSL 2نصب WSL 2برای نصب WSL 2 باید نسخه‌ی ویندوزتون 18917 یا بالاتر باشه و البته قبلش ویژگی WSL رو با استفاده از این مطلب فعال کرده باشید. حالا میتونید با استفاده از دستورات زیر توی Power shell این کار رو انجام بدید:dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestartdism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestartقبل از هر کار دیگه ویندوزتون رو باید ری استارت کنید.دستورات WSL 2با این دستور میتونید یک توزیع خاص رو با WSL 2 به جای WSL 1 اجرا کنید.wsl --set-version &lt;Distro&gt; 2با این دستور هم میتونید لیست نسخه‌های لینوکس روی ویندوزتون همراه با نسخه WSLای که با اون اجرا می‌شوند رو ببینید. wsl -l -vبرای مطالعه بیشتر هم می‌تونید به صفحه‌ی رسمی این تکنولوژی در سایت مایکروسافت مراجعه کنید و در نهایت امیدوارم که از لینوکس‌های روی ویندوزتون لذت کافی رو ببرید. </description>
                <category>حسین منصوری</category>
                <author>حسین منصوری</author>
                <pubDate>Tue, 28 Apr 2020 21:18:31 +0430</pubDate>
            </item>
                    <item>
                <title>تشریح OKR و بررسی تفاوتهای آن با KPI</title>
                <link>https://virgool.io/@mansourihosein/%D8%AA%D8%B4%D8%B1%DB%8C%D8%AD-okr-%D9%88-%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D8%AA%D9%81%D8%A7%D9%88%D8%AA%D9%87%D8%A7%DB%8C-%D8%A2%D9%86-%D8%A8%D8%A7-kpi-q38au8fhsoze</link>
                <description>پیش به سوی OKRدر سالهای گذشته تقریبا تمام شرکت‌ها و سازمان‌ها برای بررسی عملکرد خودشون از KPI یا شاخص‌های کلیدی عملکرد استفاده می‌کنند. چند سالیه که توی ایران و کشورهای دیگه بحث OKR هم به شدت داغ شده. بررسی تفاوت‌های این دو شاخص از جمله‌ی مباحث داغ این چند وقت اخیر مدیران و واحدهای ارزیابی شرکت‌هاست. بیایید با هم بیشتر این دو شاخص رو بررسی کنیم. شاخص‌های کلیدی عملکرد یا KPI چیست؟هر سازمانی ممکنه برای ارزیابی پیشرفت پروژه یا کسب و کارش از شاخص‌های متفاوتی استفاده کنه. به این شاخص Performance indicator گفته میشه. حالا بر حسب اهمیت چندتا از این شاخص‌ها به عنوان شاخص‌های کلیدی مشخص میشن که بهشون KPI یا Key Performance indicator گفته میشه. این شاخص‌های کلیدی نشانه‌گرهایی هستند که ما با اونا وضعیت پیشرفت یک شرکت، پروژه، برنامه و ... رو در گذر زمان می‌سنجیم. این شاخص‌ها باید مشخصات زیر رو داشته باشند:مرتبط با اهداف استراتژیک باشندبتونند جهت‌دهی تخصیص منابع به پروژه رو مشخص کنندقابل اندازه‌گیری و مقایسه با اهداف پروژه باشندمثلا توی یک پروژه‌ی نرم‌افزاری شما می‌تونید شاخصی مثل تعداد خط کد یا تعداد semicolon رو به عنوان شاخص پیشرفت پروژه در نظر بگیرید، اما چون با اهداف پروژه همخوانی ندارند، اندازه‎گیری و ثبت‌شون کاملا بی معنیه.مثال‌های KPIبا توجه به سابقه و گستردگی KPI در شرکت‌ها برای تمامی صنعت‌ها معمولا مثال‌های خوبی برای KPI وجود داره.صنعت خرده فروشی: فروش هر فروشگاه، فروش به ازای هر کارمند، سود به ازای هر فروشگاه و ...بخش منابع انسانی: میانگین زمان جذب نیرو، کارایی کارمندانصنعت فناوری: تعداد کاربر فعال، میزان وفاداری مشتریان، میزان فروشصنعت درمان: میزان زمان انتظار تا ویزیت، متوسط هزینه‌های درمان، نرخ مرگ و میراهداف و نتایج کلیدی یا OKR چیست؟از یک طرف OKR روشی برای ساختارمند کردن اهداف و از طرف دیگر شامل تعدادی قوانین و Best Practice برای رسیدن به آنهاست. با OKR میتونیم اهداف سازمان‌مون رو به درستی مدیریت کنیم و مسیر مشخص و واضحی برای رسیدن به اونها ترسیم کنیم. همچنین در چهارچوب OKR اهداف به بخش‌ها و افراد تقسیم و تخصیص داده میشه و وظیفه و چشم‌انداز فعالیت هر بخش و فرد در چارچوب استراتژی سازمان مشخص میشه. بر خلاف KPI اینجا ما با چیزی از جنس استراتژی روبرو هستیم. ساختار سلسله مراتبی تخصیص منابع به بخش‌ها و افراد اهدافی که در OKR تعیین میشه باید مشخصات زیر رو داشته باشند.همیشه قابل اندازه‌گیری باشندبشه به صورت 0 تا 1 یا 0 تا 100 درصد ارزیابی‌شون کردمقید به یک محدوده‌ی زمانی باشندبلندپروازانه باشند(اگر به راحتی بشه به دستشون آورد به اندازه‌ی کافی جاه‌طلبانه انتخاب نشدند)حرف K یا مهمترین نکته‌ی مغفولاولین چیزی که توی OKR یاد می‌گیرید اینه که بین موضوعات مهم (keyها) و مابقی مسائل تفکیک قائل بشید.  اولویتهای شرکت/سازمان رو به صورت واضح مشخص کنید و یاد بگیرید که مابقی مسائل نه بگید! گاهی وقتها دیده میشه که یک شرکت یا استارتاپ ده‌ها شاخص کلیدی داره و با یک داشبورد پیچیده هر  روز مشغولی بررسی و رصد شاخص‌های مختلف میشن. در اصل هر شرکتی (مخصوصا شرکتهای با سایز متوسط و کوچک) بیش از چند تا شاخص کلیدی مثل &quot;افزایش فروش&quot; یا &quot;افزایش تعداد کاربران&quot; ندارند. مابقی شاخص‌ها PI یا Performance Indicator هستند و همیشه باید بشه از میان ده‌ها شاخص چند شاخص اصلی رو برای مشاهده و زیر نظر گرفتن هر روزه جدا کرد. تاریخچه‌ی OKRمدیریت بر اساس اهداف -management by objectives- اولین بار توسط Peter Drucker در کتابی با عنوان practice  of management چاپ 1950 مطرح شد. از آن زمان به بعد objective ها یک مبحث اساسی برای مدیریت سازمان‌ها و شرکت‌ها شدند و طی سال‌ها استفاده و کاربرد سازمان‌ها یاد گرفتند که چه اهدافی مناسب و کارا هست و چه اهدافی برای یک سازمان نمیتونه مثمر ثمر باشه.تاریخچه ی روش‌های مدیریت اهدافبر اساس تجربیات شرکت‌ها در انتخاب اهداف و مشاهده‌ی نتایج سیستم هدف‌گذاری SMART توسط George Doran معرفی شد. بر اساس این سیستم هدف‌گذاری هر هدف باید مشخصات زیر رو داشته باشد:Specific- مشخصMeasurable - قابل اندازه‌گیریAttainable - دست‌یافتنیRelevant- مرتبطTime-Bound- و مقید به یک محدوده‌ی زمانیچارچوب‌های هدف‌گذاری دیگه‌ای هم مثل BSC توسط Kaplan و Norton توسعه داده‌شدند. مهمترین نقطه ضعف این چارچوب‌های هدف‌گذاری عدم اتصال اون‌ها به کارها و فعالیت‌های اجرایی افراد و بخش‌ها در شرکت بود. هدف‌گذاری توسط یک سری از افراد و تسک‌ها بدون توجه به اهداف توسط اشخاص دیگر انجام می‌شد. با توجه با نقاط قوت چهارچوب‌های هدف‌گذاری و درس گرفتن از نقاط ضعف اونها سیستم OKR معرفی شد. هدف OKR پر کردن فاصله بین استراتژی و اجرا است. در اصل OKR یک strategy execution هست. تاریخچه‌ی OKRپدر واقعی OKR هم‌بنیان‌گذار شرکت اینتل آقای Andy Grove هستند. ایشون در کتابی به نام High Output Management که در سال 1983 منتشر شد برای اولین بار به مفهوم Objectives and Key Results اشاره کردند. ایشون ایده‌ی Peter Drucker خالق MBO که مدیریت بر اساس اهداف بود رو توسعه دادند و مفهوم Result رو بهش اضافه کردند. آقای John Doerr که در اینتل کار میکرد مستقیم مفهوم OKR و پیاده‌سازی اون رو از آقای Andy Grove یاد گرفت. بعدها وقتی ایشون به گوگل پیوست و این مفهوم رو برای موسسان گوگل آقای Larry Page و آقای Sergey Brin تشریح کرد، اونها از این به شدت استقبال کردند. همین موضوع باعث به کارگیری و پیاده‌سازی مفهوم OKR در گوگل شد. از زمان که گوگل تنها 40 نفر بود تا الان که بیش از 60 هزار نفر در گوگل کار می‌کنند، اهداف و پیشرفت گوگل بر اساس چارچوب OKR انجام میشه.چرا به OKR نیاز داریم؟در سطح سازمان و یا شرکت مدیران سطح بالا معمولا اقدام به تنظیم اهداف پنج ساله و یا یک ساله می‌کنند. مشکل اینجاست که اکثر کارمندهای شرکت یا حتی مدیرهای میانی نه از این اهداف خبر دارند و نه اینکه به اونها اهمیتی میدن. درصد عدم آگاهی از اهداف شرکت برای مدیران میانی بیش از 45% درصد و برای کارمند بیش‌تر از 95% است. اکثر کارمندها از اینکه فعالیت‌هاشون چه تاثیری در چشم‌اندازی اصلی شرکت میزاره خبر ندارند و اهمیت کارشون برای شرکت غافل هستند.در سال 2005 تحقیقاتی توسط آقای Kaplan و آقای Norton مشخص کرد که از هر 10 سازمان 9 سازمان در رسیدن به اهداف‌شون شکست می‌خورند. در این حوزه Best Practice ها چیست؟منابع مختلف اعداد مختلفی رو برای بهترین عدد برای تعداد اهداف و نتایج کلیدی برای هر هدف اعلام می‌کنند اما بیشتر منابع به این اعداد اشاره کردند:داشتن بین 1 تا 3 هدف (بیشتر از اون باعث عدم تمرکز میشه)داشتن بین 3 تا 5 KPI به ازای هر هدفبازه‌ی پیاده‌سازی بین 3 تا 1 سال (بهترینش پیاده‌سازی 1 ساله است با جلسات ارزیابی‌ 3 ماهه با مدیران بالادستی و ارزیابی‌های دو هفته‌ای درون بخشی)چطوری با OKR هدف گذاری کنیم؟در اولین گام باید اهدافمون رو مشخص کنیم. این اهداف به ما نشون میدن که به کجا میخواهیم برسیم. در ادامه برای هر هدف KPI هایی مشخص می‌کنیم تا مشخص بشه که آیا به اون اهداف رسیدیم یا نه. در ادامه برای رسیدن به اون اهداف Task هایی تعریف میکنیم تا اونها رو انجام بدیم.به طور مثال برای شرکت سه هدف زیر رو تعیین می‌کنیم:تسلط بر بازار یک جای فوق‌العاده شدن برای کار(جهت جذب استعدادهای برتر بازار)مشتریها عاشق تیم پشتیبانی ما باشنداهدافی که در نظر گرفتیماگر به مورد آخر توجه کنیم میتونیم KPIهای زیر رو برای رسیدن به این هدف در نظر بگیریم:میزان رضایت مشتری به بیش از 97%رسیدن به میانگین اولین پاسخ به درخواست مشتری به کمتر از 1 ساعترسیدن به میانگین حل کامل مشتری به کمتر از 12 ساعتمثال‌هایی برای KPIحالا برای رسیدن به اهداف و KPI ها میتونیم Taskهای زیر رو تعریف کنیم:مصاحبه با 10 نفر و جذب افراد جدید برای کاهش زمان کلی پاسخگوییمنتشر کردن FAQ در پایگاه برای پاسخ دادن به سوال‌های پرکاربردراه‌اندازی Live chat در اپلیکیشن شرکت برای پاسخگویی مستقیم به مشتری برای کاهش زمان اولین پاسخکارهایی که برای انجام دادن تعریف میکنید. چطور OKR رو ایرانیزه کنیم؟از اونجا که وقتی توی ایران یک اسم جدید میاد و ما اون رو به تازگی یاد گرفتیم دوست داریم از صدر تا ذیل زندگی‌مون رو بر اساس این اسم بچینیم، چارچوب OKR هم از این مسئله دور نیست. اولین کار اینه که تمام کارهای شرکت رو بر اساس OKR بچینیم. در اصل هیچ کس هیچ کاری به جز رسیدن به  OKR انجام نده. این جوری در گام اول مشکلی که در Task Management داشتیم حل میکنیم و دیگه نیازی نیست که  یک ابزار مدیریت و تخصیص کار به صورت جداگانه و حرفه‌ای داشته باشیم.دومین کار اینه که چون سیستم پاداش و ارزیابی مشخصی نداریم، این سیستم رو به OKR متصل کنیم تا آخر سال مبتنی بر OKR به ازای هر فرد، بهش پاداش بدیم و اون رو ارزیابی کنیم.سومین کار اینه که تمام KPIهای مختلفی که داریم دور بریزیم و تنها به OKR ها توجه کنیم. در واقع چون به تازگی با OKR کار میکنیم فکر میکنیم دیگه به مابقی KPI ها نیازی نداریم.دوباره تاکید کنم این کارها کارهایی هست که نباید انجام بدیم، هر چند دو مورد اول رو همه دارند انجام میدن.توسعه فردی و OKRعلاوه بر شرکت‌ها و سازمان‌ها به نظرم هر کسی میتونه که از OKR برای برنامه‌ریزی توسعه‌ی فردی خودش کمک بگیره. هم جهت‌گیری مناسبی به اهداف هر فرد میده و هم میتونه شاخص‌های مناسبی برای رسیدن به اون اهداف برای هر فرد مشخص کنه. به نظرم خیلی خوبه که اگر تا اینجا رو خوندید برای سال آینده اهداف‌تون رو مبتنی بر OKR طراحی و اجرا کنید. متشکر و ممنونم.منابع: + و + و +.</description>
                <category>حسین منصوری</category>
                <author>حسین منصوری</author>
                <pubDate>Sat, 29 Feb 2020 10:38:40 +0330</pubDate>
            </item>
                    <item>
                <title>قواعد نام گذاری در جاوا اسکریپت</title>
                <link>https://virgool.io/@mansourihosein/httpsvirgooliomansourihoseinjavascript-naming-conventions-m0m7mx1d2oy2</link>
                <description>رعایت استانداردهای نام‌گذاری هر زبان برنامه‌نویسی یکی از اولین معیارهای برنامه‌نویس حرفه‌ای بودنه. چه وقتی تیمی کار می‌کنیم، چه حتی وقتی که تنها کار می‌کنیم، رعایت استانداردها کمک میکنه که کدهامون قابل فهم‌تر باشه و بتونیم در آینده راحت‌تر اونها رو پشتیبانی کنیم. توصیه‌هایی برای بهتر کد زدناگر از مشتریهای توییتهای دونالد ترامپ باشید میدونید که استفاده از Caps lock به موقع چقدر اهمیت داره? پیروی از نام‌گذاری استاندارد همون قدر برای یک برنامه‌نویس اهمیت داره ?پیش درآمدچهار مدل مشهور برای نام‌گذاری اشیا در زبان‌های برنامه‌نویسی وجود داره. که به فارسی سخت به اونها نام‌گذاری پاسکالی، نام‌گذاری شتری، نام‌گذاری ماری و نام‌گذاری کبابی میگن  ? هر چند نام‌های انگلیسی اونها مشهورتر هستند. در نام‌گذاری متغیرها ما نمیتونیم از space استفاده کنیم و این موضوع فلسفه‌ی اصلی این نام‌گذاری‌ها را تشکیل میدن.پاسکالی (PascalCase): حرف اول تمام کلمات در رشته با حروف بزرگ نوشته میشه. معمولا برای نام‌گذاری کلاس استفاده می‌کنیم.شتری (camelCase) : کلمه‌ی اول رشته با حرف کوچک نوشته میشه و مابقی کلمات با حرف بزرگ شروع میشن. برای نام‌گذاری متغیرهای محلی استفاده میشه.ماری (snake_case): تمام کلمات با حرف کوچک شروع میشن و بینشون under line قرار میگیره. معمولا برای نام‌گذاری ثابت‌ها ازش استفاده میشد.کبابی (kebab-case): تمام کلمات با حرف کوچک شروع میشن و بینشون خط فاصله (-) قرار میگیره. برای نام‌گذاری فایل‌ها و آدرس‌دهی urlها معمولا استفاده میشه.قواعد نام‌گذاری در جاوا اسکریپت: متغیرزبان جاوا اسکریپت Case sensitive هست. یعنی بین نام متغیر با حروف کوچک با نام متغیر با حروف بزرگ تفاوت قائل میشه. جاوا اسکریپت case sensitive است!نامی که انتخاب میکنید باید بتونه خودش رو توصیف کنه. از علائم مختصر، بی‌معنی و کوتاه استفاده نکنید. برای اسم متغیر خساست به خرج ندید!اکثرا در هنگام تعریف متغیر در جاوا اسکریپت از نامگذاری Camel case استفاده میکنیم. در اکثر زبانهای برنامه‌نویسی قاعده نام‌گذاری متغیر به همین شکله.نام‌گذاری متغیرها به صورت Camel caseقواعد نام‌گذاری در جاوا اسکریپت: Booleanبرای نام‌گذاری متغیرهای boolean استفاده از prefix های are، is و has توصیه میشه. این موضوع سبب میشه که این متغیرها از مابقی متغیرها متمایز باشند و نام اونها بامعنی‌تر بشه.نام‌گذاری boolean هاقواعد نام‌گذاری در جاوا اسکریپت: تابعتوصیه میشه که نام تابع رو با فعل شروع کنیم. همچنین تحت هیچ شرطی از نام‌هایی مثل get2 یا getNameNew استفاده نکنید. اینجا هم خساست به خرج ندید، هر چقدر که نام تابع بتونه توصیف بهتری از کار اون تابع باشه، بهتر هست.نام‌گذاری توابعقواعد نام‌گذاری در جاوا اسکریپت: کلاسدر جاوا اسکریپت مثل اکثر زبانها کلاس‌ها به صورت Pascal Case نام‌گذاری میشن. این موضوع به افزایش contrast بین کلاس و دیگر متغیرها کمک میکنه.نام‌گذاری کلاسقواعد نام‌گذاری در جاوا اسکریپت: Componentما component ها رو اغلب سمت frameworkهای front end مثل ری اکت یا vue.js میبینم. مثل کلاس‌ها اینجا هم از نام‌گذاری Pascal Case استفاده می‌کنیم. نام‌گذاری Componentبه دلیل استفاده از نام‌گذاری Pascal Case تمایز خوبی هم بین Component ما با المان‌های پیش فرض html به وجود میاد.تمایز با المان‌های htmlقواعد نام‌گذاری در جاوا اسکریپت: متداینجا هم به مانند نام‌گذاری تابع‌ها، نام متد رو با فعل شروع میکنیم و از استاندارد camel Case استفاده میکنیم.نام‌گذاری متدقواعد نام‌گذاری در جاوا اسکریپت: متغیرهای Privateهر چند در این مورد قانون کلی وجود نداره اما بهتر هست که متغیر و متدهای private یک کلاس رو که قرار نیست در مابقی پروژه استفاده بشه، با استفاده underscore (_) شروع کنید. در زبان‌های برنامه‌نویسی دیگه هم این قانون برقرار است.نام‌گذاری متغیرهای Privateقواعد نام‌گذاری در جاوا اسکریپت: ثابت‌هاثابت‌ها متغیرهایی هستند که قرار نیست مقدار اونها توی طول برنامه تغییر کنه. بهتر هست که ثابت‌ها رو با حروف بزرگ بنویسید. نام‌گذاری ثابت‌هااگر ثابت چند کلمه‌ای داشتید، میتونید کلمات ثابت رو با زیر خط جدا کنید. ثابت چند کلمه‌ایقواعد نام‌گذاری در جاوا اسکریپت: متغیرهای Globalمتغیرهای Global متغیرهایی هستند که در کل پروژه از مقدارشون استفاده میکنیم. خوبه که موارد زیر رو هنگام تعریف این متغیرها در نظر بگیرید:متغیرهای Global رو در ابتدا فایل بنویسید. اگر مقدار متغیرتون در طول برنامه تغییر میکنه از نام‌گذاری camel Case استفاده کنید.اگر مقدار متغیرتون در طول برنامه ثابته از نام‌گذاری Pascal Case استفاده کنید.قواعد نام‌گذاری در جاوا اسکریپت: استفاده از Underscoreاز وقتی که نام‌گذاری‌های Pascal Case و camel Case محبوب‌تر شدند، استفاده از Underscore برای معرفی متغیر به شدت محدود شده. این روزها فقط برای معرفی متغیرهای private از Underscore استفاده میکنیم و پیشنهاد میشه که کمتر از این نوع نام‌گذاری استفاده کنیم.قواعد نام‌گذاری در جاوا اسکریپت: استفاده از Dashاستفاده از Dash هم برای نام‌گذاری متغیرها چندان منطقی این روزها به نظر نمیرسه و موجب ناخوانی کدهای ما میشه.نام‌گذاری نادرست با استفاده از dashقواعد نام‌گذاری در جاوا اسکریپت: فایل در سمت Front End معمولا فایلها رو به صورت Pascal Case نام‌گذاری می‌کنند. نام‌گذاری فایل در سمت Front Endبرخلاف Front End در سمت Back End معمولا از روش kebab-case استفاده میشه.نام‌گذاری فایل در سمت Back Endممکنه که سیستم عاملی بین کاراکترهای بزرگ و کوچک توی نام‌فایل تفاوتی قائل نشه. به همین دلیل به نظر میرسه که استفاده از نام گذاری kebab-case منطقی‌تر باشه.امیدوارم این نوشته براتون مفید واقع بشه، اگر چیزی رو از قلم انداختم یا جایی اشتباه کردم حتما بهم بگید و خوشحالم کنید.منابع: + و +.</description>
                <category>حسین منصوری</category>
                <author>حسین منصوری</author>
                <pubDate>Mon, 13 Jan 2020 14:05:06 +0330</pubDate>
            </item>
                    <item>
                <title>راهنمای استفاده از SQLite در Nodejs با Promise و الگوی Repository</title>
                <link>https://virgool.io/@mansourihosein/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-sqlite-%D8%AF%D8%B1-nodejs-%D8%A8%D8%A7-promise-%D9%88-%D8%A7%D9%84%DA%AF%D9%88%DB%8C-repository-xisbxnnw8pnd</link>
                <description>توی این راهنما با هم می‌خواهیم یک پروژه‌ی نمونه آماده کنیم که برامون دسترسی متمرکزی به SQLite توی محیط Node.js با الگوی Repository فراهم بیاره. از Promiseها هم استفاده میکنیم تا در طول کار با برنامه بتونیم از Promise chain ها استفاده کنیم.دیتابیس SQLite یک دیتابیس سبک، Cross platform و محبوبه. هنوز هم به شدت کارا و توی کاربردهای زیادی از جمله برنامه‌های موبایلی از این دیتابیس استفاده میشه. جایگاه SQLite به نسبت مابقی دیتابیس‌ها رو می‌تونید اینجا مشاهده کنید.الگوی Repository هم امکان دسترسی متمرکز و یکپارچه به داده‌ها رو برامون فراهم میکنه. با استفاده از این الگو تنها یک نقطه‌ی اتصال به دیتابیس در طول برنامه داریم و لایه دسترسی به دیتا رو می‌تونیم از بقیه برنامه جدا کنیم. برای مطالعه بیشتر می‌تونید اینجا رو مشاهده کنید.امروز قرار نیست که به تئوری‌ها بپردازیم. پس بریم به ادامه کار به صورت عملی بپردازیم.ایجاد پروژهتوی سیستم یک پوشه با نام node-sqlite-tutorial (یا هر نام دلخواه خودتون) ایجاد کنید. برای نصب کتابخانه‌های مورد نیاز و تشکیل ساختار پروژه، با git bash (و یا cmd) ابتدا به محل ایجاد پروژه برید و در ادامه دستور زیر رو وارد کنید.npm init و بعد توی جواب سوال مقادیر زیر رو وارد کنید (به دلخواه خودتون میتونید بعضی از مقادیر رو تغییر بدید)name: (app) sqlite-tutorial
version: (0.0.0) 1.0.0 
description: A Simple Project To Use Sqlite in Node 
entry point: (index.js) app.js 
test command:  
git repository:  
keywords:  sqlite, node
author: Your Name 
license: MITدر نهایت فایل package.json ما باید چیزی شبیه به این بشه.{
    &amp;quotname&amp;quot: &amp;quotsqlite-tutorial&amp;quot,
    &amp;quotversion&amp;quot: &amp;quot1.0.0&amp;quot,
    &amp;quotdescription&amp;quot: &amp;quotA Simple Project To Use Sqlite in Node&amp;quot,
    &amp;quotmain&amp;quot: &amp;quotapp.js&amp;quot,
    &amp;quotscripts&amp;quot: {
        &amp;quottest&amp;quot: &amp;quotecho \&amp;quotError: no test specified\&amp;quot &amp;&amp; exit 1&amp;quot
        },
    &amp;quotkeywords&amp;quot: [ &amp;quotsqlite&amp;quot, &amp;quotnode&amp;quot ],
    &amp;quotauthor&amp;quot: &amp;quotHosein Mansouri&amp;quot,
    &amp;quotlicense&amp;quot: &amp;quotMIT&amp;quot
}تنها کتابخونه‌ای که امروز نیاز داریم کتابخونه‌ی sqlite3 است. با دستور زیر این کتابخونه رو به پروژه اضافه کنید.npm install --save sqlite3جداول پروژهتوی این پروژه ما دو تا جدول پروژه و وظیفه داریم. هر پروژه‌ای شامل چندین و چند وظیفه مختلف میشه. ساختار جداول پروژه به شرح زیر است:Project: { // جدول پروژه
        Id int identity, // کلید اصلی جدول
        Name nvarchar(250) // نام پروژه
}Task: { // جدول وظیفه
    Id int identity, //کلید اصلی جدول
    ProjectId int, // کلید خارجی جدول پروژه
    Name nvarchar(250), //نام وظیفه
    Description nvarchar(1000), //توضیحات
    IsCompleted bit // مشخص نمودن اتمام کار
}حالا که جدول‌ها رو می‌شناسیم با هم سراغ پیاده‌سازی اونها میریم. پیاده‌سازی کلاس Contextیک پوشه به نام context به همراه یک فایل به نام context.js ایجاد کنید. محتوای این فایل دسترسی متمرکز به دیتابیس رو برای ما فراهم میکنه. const sqlite3 = require(&amp;quotsqlite3&amp;quot); //ایمپورت کردن کتابخانه کار با اس کیو ال لایت
class Context {
    constructor(dbFilePath) { //سازنده ی کلاس
        this.db = new sqlite3.Database(dbFilePath, err =&gt; { //ایجاد شی دی بی
            if (!err) console.log(&amp;quotConnected to Database&amp;quot); 
            else  console.log(&amp;quotCould not connected to database&amp;quot, err);
      }
 }); اینجا یک کلاس با نام Context ساختیم. داخل این کلاس تمام عملیات مورد نیاز دیتابیس رو انجام میدیم. توی تابع سازنده این کلاس آدرس دیتابیس رو می‌گیریم و برای اتصال به دیتابیس تلاش می‌کنیم. در صورت موفقیت یا عدم موفقیت هم پیغام مناسب رو توی کنسول نشون میدیم. همچنین یک شی با نام db هم برای ارتباط با دیتابیس توی این متد ایجاد می‌کنیم.کتابخونه‌ی SQLite3 تابع‌های مختلفی داره. سه از مهمترین تابع‌های این ها هستند:تابع run: این تابع وظیفه اجرای هر تغییری بر روی دیتابیس رو بر عهده داره. این تغییر میتونه ایجاد یک جدول باشه یا اینکه دیتاهای یک جدول رو با دستورات insert و update یا delete تغییر بده.تابع get: این تابع یک سطر از نتیجه ی کوئری رو برای من برمیگردونه. (برای گرفتن اطلاعات بر اساس id استفاده میشه)تابع all: این تابع چندین سطر از جواب رو برای ما میتونه برگردونه.این الگو رو توی کتابخونه‌های دیگه مثل GraphQL هم داریم که دستوراتی که دیتابیس رو تغییر میدن با دستورات فقط خواندنی هستند جدا شدند. پیاده‌سازی دستورات کار با دیتابیسالگوی متد run به شکل زیر هست.db.run(&#039;SOME SQL QUERY&#039;, [param1, param2], (err) =&gt; {   
            if (err) console.log(&#039;ERROR!&#039;, err)
})ورودی اول این متد، کوئری مورد نظر ماست. بخش دوم به صورت اختیاری میتونه شاید یک یا چند تا پارامتر باشه. دلیل استفاده از پارامترها هم جلوگیری از sql injection توی برنامه است. متد run رو به شکل زیر پیاده سازی میکنیم. متد اصلی نتیجه کار رو به صورت callback بر میگردونه. به خاطر اینکه از جهنم callback فرار کنیم ما این متد را با استفاده از کلمه کلیدی Promise  و الگوی خط دوم کد به یک تابعی Promise شده تغییر میدیم. این کدها رو بعد از تابع contractor به فایلمون اضافه میکنیم.this.run = (sql, params = []) =&gt; {
    return new Promise((resolve, reject) =&gt; {
            this.db.run(sql, params, function(err) {
            if (err) reject(err);  //برگردوندن خطا
            else resolve({ id: this.lastID });
        });
    });
};الگوی تابع‌های get و all هم شبیه تابع run هست. به همین دلیل این دو تابع از پیاده‌سازی مشابه‌ای استفاده میکنند. بعد از متد run خطوط زیر رو میتونید به فایل context اضافه کنید. this.get = (sql, params = []) =&gt; {
        return new Promise((resolve, reject) =&gt; {
                this.db.get(sql, params, (err, result) =&gt; {
                      if (err) reject(err);
                      else resolve(result);
              });
        });
};this.all = (sql, params = []) =&gt; {
     return new Promise((resolve, reject) =&gt; {
            this.db.all(sql, params, (err, result) =&gt; {
                   if (err) reject(err);
                   else resolve(result);
             });
       });
};متدهای اصلی کار با دیتابیس در طول برنامه همین سه متد هستند. اینجا کار با فایل context تموم میشه و میتونیم سراغ نوشتن فایل‌های repository بریم.پیاده‌سازی لایه Repositoryاین لایه وظیفه جداسازی لایه‌ سرویس رو از لایه ارتباط با دیتا داره. اینجوری لایه سرویس هیچ وقت به طور مستقیم با دیتابیس در ارتباط نیست و در صورت تغییر دیتابیس تنها با تغییر لایه repository همه چیز مثل قبل کار خواهد کرد.در root پروژه یک پروژه با نام repository ایجاد کنید و در ادامه داخل این پوشه دو فایل زیر رو بسازید.project-repository.jstask-repository.jsدر ابتدا سراغ فایل project-repository میریم. class ProjectRepository {         constructor(context) { //تابع سازنده
                   this.context = context;
         }
module.exports = ProjectRepository;توی سازنده این کلاس ما شی context رو به صورت ورودی میگیریم. و در تمام تابع‌های بعدی این کلاس از این شی برای کار با دیتابیس استفاده میکنیم. اینجوری راه رو برای تغییرات آینده‌ی برنامه باز نگه می‌داریم.در ادامه هم کدهای زیر را بعد از تابع سازنده به این کلاس اضافه کنید. createTable() { //ساخت جدول
        const sqlQuery = `CREATE TABLE IF NOT EXISTS Project                 
                   (Id INTEGER PRIMARY KEY AUTOINCREMENT,Name TEXT)`;
        return this.context.run(sqlQuery);
   }insert(name) { //درج دیتا
        return this.context.run(`INSERT INTO Project (Name) VALUES (?)`, [name]);
   }update(project) {//بروزرسانی دیتا
        const { id, name } = project;
        return this.context.run(`UPDATE Project SET Name = ? WHERE Id = ?`, [name,id]);
  }  
  delete(id) {//حذف
                  return this.context.run(`DELETE FROM Project WHERE Id = ?`, [id]);
}getById(id) {// گرفتن با ای دی
                return this.context.get(`SELECT * FROM Project WHERE Id = ?`, [id]);
}getAll() { // گرفتن کل اطلاعات
        return this.context.all(`SELECT * FROM Project`);
}تابع‌های این کلاس شامل درج، بروزرسانی، حذف، گرفتن اطلاعات بر اساس Id و گرفتن تمام رکوردهای جدول Project هست. توی تمامی این تابع‌ها شی context صدا زده شده و اجرای کوئری‌ها به این کلاس سپرده شده و خود کلاس repository به طور مستقیم با دیتابیس در ارتباط نیست. حالا سراغ فایل task-repository.js میریم و کدهای زیر رو توی این فایل درج می‌کنیم.class TaskRepository {
    constructor(context) {// سازنده تابع
            this.context = context;
    }
    createTable() { // ایجاد جدول
            const sqlQuery = `CREATE TABLE IF NOT EXISTS Task (
            Id INTEGER PRIMARY KEY AUTOINCREMENT,Name TEXT,Description TEXT,
            IsComplete INTEGER DEFAULT 0,ProjectId INTEGER,
            CONSTRAINT Task_fk_ProjectId FOREIGN KEY (ProjectId)
            REFERENCES Project(id) ON UPDATE CASCADE ON DELETE CASCADE)`;
            return this.context.run(sqlQuery);
      }
      insert(name, description, isComplete, projectId) { //درج
              return this.context.run(
                      `INSERT INTO Task (Name, Description, IsComplete, ProjectId)
                      VALUES (?, ?, ?, ?)`,[name, description, isComplete, projectId]);
      }
      update(task) { // بروزرسانی
            const { id, name, description, isComplete, projectId } = task;
            return this.context.run(`UPDATE Task SET name = ?,Description = ?,
                       IsComplete = ?,ProjectId = ?WHERE Id = ?`,
                       name, description, isComplete, projectId, id]);
       }
       delete(id) { // حذف
             return this.context.run(`DELETE FROM Task WHERE Id = ?`, [id]);
       }
       getById(id) { // گرفتن اطلاعات با ای دی
               return this.context.get(`SELECT * FROM Task WHERE Id = ?`, [id]);
      }
      getByProjectId(projectId) {//گرفتن اطلاعات با شناسه پروژه
              return this.context.all(`SELECT * FROM Task WHERE ProjectId = ?`, projectId);
      }
      getAll() {//گرفتن تمام اطلاعات
               return this.context.all(&#039;SELECT * FROM Task&#039;);
      }
}
module.exports = TaskRepository;تنظیمات اولیهتقریبا کارمون رو به اتمامه. برای ساخت دیتابیس و پر کردن اون با مقادیر اولیه دو فایل config.js و seed.js رو توی پوشه‌ی context ایجاد کنید. اول سراغ فایل config.js میریم. این فایل وظیفه ساخت جداول رو داره.//Import File
const Context = require(&amp;quot./context&amp;quot);
const ProjectRepository = require(&amp;quot../repository/project-repository&amp;quot);
const TaskRepository = require(&amp;quot../repository/task-repository&amp;quot);

//init class
const context = new Context(&amp;quot./database.sqlite3&amp;quot);
const projectRepo = new ProjectRepository(context);
const taskRepo = new TaskRepository(context);
module.exports.createTable = () =&gt; {//ساخت جداول
    return new Promise((resolve, reject) =&gt; {
    projectRepo
    .createTable()
    .then(() =&gt; taskRepo.createTable();)
    .then(() =&gt; resolve(&amp;quotCreate Table&amp;quot))
    .catch(err =&gt; reject(&amp;quotCreate Table Error&amp;quot + err));
    });
};با استفاده از Promise کردن تابع‌های sqlite3 توی فایل context اینجا به راحتی میتونیم زنجیره‌ای از promiseها بسازیم و از جهنم call backهای تو در تو فرار کنیم. کدهای زیر توی فایل seed.js کپی کنید.//Import File
const Context = require(&amp;quot./context&amp;quot);
const ProjectRepository = require(&amp;quot../repository/project-repository&amp;quot);
const TaskRepository = require(&amp;quot../repository/task-repository&amp;quot);

//init class
const context = new Context(&amp;quot./database.sqlite3&amp;quot);
const projectRepo = new ProjectRepository(context);
const taskRepo = new TaskRepository(context);
const blogProjectData = { name: &amp;quotFirst Project&amp;quot };
let projectId;
module.exports.fillData = () =&gt; {
      return new Promise((resolve, reject) =&gt; {
      projectRepo
      .insert(blogProjectData.name)
      .then(data =&gt; {projectId = data.id;
      const tasks = [
        {name: &amp;quotFirst Task&amp;quot, description: &amp;quotStart&amp;quot,isComplete: 1,projectId},
        {name: &amp;quotSecond Task&amp;quot,description: &amp;quotEnd&amp;quot,isComplete: 0,projectId}
        ];
      return Promise.all(
         tasks.map(task =&gt; {
         const { name, description, isComplete, projectId } = task;
         return taskRepo.insert(name, description, isComplete, projectId);
      })
     ); })
     .then(() =&gt; resolve(&amp;quotFill Data is successed&amp;quot))
     .catch(err =&gt; {reject(err);});
   });
};اجرای برنامهتوی root پروژه فایل app.js رو ایجاد کنید و کدهای زیر رو داخل این فایل قرار دهید.const config = require(&amp;quot./context/config&amp;quot);
const seed = require(&amp;quot./context/seed&amp;quot);
function app() {
    config
    .createTable()
    .then(resolve =&gt; {console.log(resolve);
        return seed.fillData();})
    .then(resolve =&gt; console.log(resolve))
    .catch(err =&gt; console.log(err));
}app();با دستور node app.js میتونید پروژه رو اجرا کنید و خروجی رو ببینید. کدهای پروژه رو از این آدرس می‌تونید دریافت کنید. همچنین برای نوشتن این مقاله از برخی از کدهای این مقاله استفاده شده.</description>
                <category>حسین منصوری</category>
                <author>حسین منصوری</author>
                <pubDate>Sat, 28 Dec 2019 11:49:22 +0330</pubDate>
            </item>
                    <item>
                <title>زیر دامنه بهتر است یا پوشه؟ انتخاب اصلح برای سئو</title>
                <link>https://virgool.io/@mansourihosein/%D8%B2%DB%8C%D8%B1-%D8%AF%D8%A7%D9%85%D9%86%D9%87-%D8%A8%D9%87%D8%AA%D8%B1-%D8%A7%D8%B3%D8%AA-%DB%8C%D8%A7-%D9%BE%D9%88%D8%B4%D9%87-%D8%A7%D9%86%D8%AA%D8%AE%D8%A7%D8%A8-%D8%A7%D8%B5%D9%84%D8%AD-%D8%A8%D8%B1%D8%A7%DB%8C-%D8%B3%D8%A6%D9%88-n0dbz1uus9e2</link>
                <description>از جمله سوال‌های اساسی بشر از ابتدای تاریخ و یکی از مهمترین دلایل سرگشتی سئو کارها انتخاب بین زیر دامنه (sub domain) و یا پوشه (sub directory) برای گسترش کسب و کار یک وب سایت بوده.?برای مشخص شدن اهمیت این موضوع به طور مثال این روزها آدرس http://maps.google.com به آدرس https://www.google.com/maps ریدایرکت میشه. یعنی حتی برای شرکتی مثل گوگل هم این موضوع مهم بوده. اگر حوصله‌ی خوندن نوشتن‌های طولانی ندارید و برای رسیدن به قسمت نتیجه‌گیری سریع به انتهای مطلب اسکرول می‌کنید باید با خیال راحت بهتون بگم که جواب ساده پوشه است. البته اگر اهل معرفت هستید و جواب درست‌تری میخواهید باید بهتون بگم که جواب درست اینه که چی کاری میخواهید انجام بدید؟ در اصل هدف کسب و کارتون و حوزه‌های فعالیتتون روی تک تک استراتژی‌های سئو تاثیر گذاره و بر اساس اونها باید یک استراتژی مناسب برای بهبود سئوی سایتتون در نظر بگیرید. زیر دامنه در مقایسه با پوشه؟ در مورد چه چیزی صحبت می‌کنیم؟کی از زیر دامنه استفاده کنیم؟یکی از مهمترین دلایل ایجاد زیر دامنه‌ها در اینترنت، استقلال فیزیکی و مالی اونها بود. توی اوایل اینترنت هزینه‌های نگهداری سرور به شدت بالا بود و به خاطر این موضوع، گاهی زیر دامنه‌های کم اهمیت‌تر یک وب سایت رو، روی یک هاست ارزون‌تر نگهداری میکردند. همچنین اگر سازمانی چند بخش مختلف مثل حقوقی و مالی داشت،  به ازای هر بخش یک زیر دامنه روی وب سایت اصلی ایجاد می‌کردند، این شکلی هزینه‌های نگهداری هر بخشی جداگانه حساب و مشخص میشد. حالا کسب و کاری دارید و میخواهید وارد حوزه‌ی دیگه‌ای بشید که ارتباط چندانی با کسب و کار اصلی‌تون نداره. مثلا فروشگاه آنلاین مواد غذایی دارید و حالا قصد دارید که در مورد واردات محصولات غذایی از کشورهای شرق آسیا یک وبلاگ تخصصی داشته باشید و این دو کسب و کار رو میخواهید مجزا از هم نگه دارید، تبلیغات و مارکتینگ جداگانه براشون انجام بدید، مشتری‌های هدف متفاوتی دارید و در نهایت کلید واژه‌های متفاوتی رو انتخاب کردید. اینجا انتخاب زیر دامنه منطقیه.اینجوری هم شفافیت کامل دارید، هم میتونید تیم‌های مارکتینگ متفاوتی داشته باشید. همچنین میتونید از تکنولوژی‌های مختلف برای طراحی وب‌سایتتون استفاده کنید و همه چیز رو مستقل نگه دارید. زیر دامنه‌ها کاربردهای دیگه‌ای هم دارند. به همون مثال فروشگاه برگردیم. این بار توی فروشگاه محصولات غذاییمون دو تا بازار مستقل برای ایران و عراق داریم و سایتمون به دو زبان عربی و فارسی ارائه میشه. ممکنه حتی هر زبان محصولات خاص خودش رو داشته باشه. هدفمون هم اینه که کاربرهای هر کشور وقتی که توی گوگل در مورد محصولات ما جستجو می‌کنند، نتایج مرتبط با همون کشور رو مشاهده کنند. اینجوری میتونیم زبان‌های مختلف وب‌سایتمون رو به صورت ar.shop.com و fa.shop.com نام‌گذاری کنیم. هر کدوم از این زیر دامنه‌ها آدرس، تلفن و مشخصات خاص خودشون رو دارند. در نهایت میتونیم سایت فارسی‌مون رو توی ایران و سایت عربی‌مون رو توی کشور عراق میزبانی کنیم. اینجوری گوگل با توجه به نزدیکی کاربرها به هر کدوم از وب‌سایتها، زیر دامنه‌ی مورد نظر رو توی نتایج جستجوی گوگل اهمیت میده. حالا کی از پوشه استفاده کنیم؟ جواب درست تقریبا همیشه است!بنا بر ادعای گوگل هم در زیر دامنه و هم پوشه توسط کرولرهای گوگل به صورت یکسان مشاهده و ایندکس میشن. اما مشکل اینجاست که گوگل این دو سایت رو مستقل از هم محسوب میکنه و اعتبار هر کدوم رو به صورت جداگانه در نظر میگیره.اینجوری بودجه و هزینه‌ای که برای ارتقا در نتایج گوگل می‌کنیم، بین زیر دامنه‌های مختلف وب‌سایتمون تقسیم میشه و احتمالا این چیزی نیست که ما میخواهیم. مشکل دیگه اینجاست که به دلیل استقلال زیر دامنه، وقتی کاربر از سایت اصلی به زیر دامنه مراجعه میکنه، چون کاربر از سایت اصلی خارج میشه گوگل نرخ پرش وب سایت ما رو بالا میبره و زمان مشاهده وب سایت ما رو کاهش میده. همچنین اعتبار دامنه‌ی اصلی و زیر دامنه جداگانه حساب میشه و کلید واژه‌هایی که براشون زحمت کشیدیم بین این دو وب سایت تقسیم میشه. بروز بودن مطالب یک وب سایت با الگوریتم Freshness گوگل اندازه‌گیری میشه. وقتی به طور مثال وقتی وبلاگمون رو به زیر دامنه انتقال میدیم و فقط اونجا مطلب جدید میزاریم، از نظر گوگل وب سایت اصلی ما تنها یک وب سایت static با مطالب قدیمی میشه و Rank اون توی جستجوها کاهش پیدا میکنه.ارتباط صفحات در پوشه مستحکم‌تر و پیوند اونها با لینک‌های داخلی قوی‌تر از زیر دامنه است. هر چند با استراتژی مناسب در زیر دامنه میتونیم زیر دامنه‌های مختلف رو نزدیک هم قرار بدیم اما به نسبت پوشه باید کلی کار اضافه‌تر انجام بدیم.آخرین نکته‌ی قابل ذکر اینه که وقتی به طور مثال وب سایت ما با ASP.NET نوشته شده و بر روی وب سرور IIS قرار گرفته و یک وبلاگ با Wordpress هم داریم، تنظیم وبلاگ به صورت پوشه یک مقدار با پیچیدگی فنی ممکنه مواجه بشه.جهت مطالعه‌ی بیشتر اینجا و اینجا رو میتونید مشاهده کنید.</description>
                <category>حسین منصوری</category>
                <author>حسین منصوری</author>
                <pubDate>Mon, 23 Dec 2019 10:06:55 +0330</pubDate>
            </item>
                    <item>
                <title>19 راه ساده برای Node.js کار بهتر شدن - بخش اول</title>
                <link>https://virgool.io/@mansourihosein/19-%D8%B1%D8%A7%D9%87-%D8%B3%D8%A7%D8%AF%D9%87-%D8%A8%D8%B1%D8%A7%DB%8C-nodejs-%DA%A9%D8%A7%D8%B1-%D8%A8%D9%87%D8%AA%D8%B1-%D8%B4%D8%AF%D9%86-%D8%A8%D8%AE%D8%B4-%D8%A7%D9%88%D9%84-bc0jhnmjdy66</link>
                <description>همه جا با Node!این روزها افق نور خورشید جاوااسکریپت بی پایانه! برای رسیدن به سرمرزهای این افق هر برنامه‌نویسی علاوه بر دانش عمومی در حوزه‌ی Node.js باید در مورد ترندها، شیوه‌ها و تکنولوژی‌های بروز در این حوزه آگاه باشه و بدونه در کدوم پروژه از چه متدهایی برای بهبود کل فرآیند استفاده کنه. با هم در دو قسمت در مورد 19 روش و مهارتی که میتونه برای ما به عنوان یک Developer حوزه Node.js ارزش‌آفرینی کنه صحبت میکنیم. با خوندن این مطلب اصلا دچار ترس و اضطراب نشید، کمتر برنامه‌نویسی وجود داره که توی همه‌ی این موارد حرفه‌ای باشه و حرف زیادی برای گفتن داشته باشه. این مباحث بیشتر یک نقشه‌ی راه و یک طرح کلی برای کشیدن نقشه‌ی یادگیری و ارتقا شخصی برنامه‌نویس‌های Node.js است. 1- افزودن نوع و اسکیما: با کاندیداتوری Typescriptنیم نگاهی به Type Scriptاز لذت‌های اصلی جاوااسکرپیت Type Less و یا بدون نوع بودن اونه. اما تحقیقات نشون میده که کدنویسی بدون مشخص کردن نوع متغیرها میتونه که تعداد خطاها رو افزایش بده (منبع). مخصوصا با افزایش اندازه‌ی پروژه و پیچیدگی نرم‌افزار بدون نوع بودن همه چیز میتونه پیچیدگی‌های بیشتر برای بررسی خطاها به وجود بیاره. این موضوع به این معنی نیست که از فردا راه بیافتیم و تمام نوع‌های پروژه‌مون رو مشخص کنیم، بلکه میتونیم با استفاده از ارزیابی‌کردن (validate) مدل‌ها و ورودی‌هامون از کلی حجم خطایی که ممکنه رخ بده، کم کنیم. یک راه ساده بر این کار هم استفاده از typechecker ای که فیسبوکه (گیتهاب پروژه). در نهایت یکی از بهترین راه‌ها استفاده از syntax همراه با نوع Typescript استفاده کنیم. استفاده از Typescript یکی از ترندهای حوزه Node.js و جاوااسکریپت در سالهای اخیر بوده. حتی میتونید فریمورک‌های سمت Front رو هم مثل Vue با Typescript امتحان کنید. حتی شاید وسوسه شدید که از امکاناتی شبیه Interface و abstract کلاسها هم استفاده کنید. مثال‌ها:Explicit models schemas with JSON SchemaStatic typing over vanilla JS using Facebook flowTyped syntax with Typescript2-استفاده از Linterها یا ارزیاب‌های کدهر چقدر هم که برنامه‌نویس خبره‌ای باشیم باز هم ممکن موقع برنامه‌نویس چیزی رو فراموش کنیم و یک باگ برای آینده پروژه‌مون کنار بزاریم. Linterها مثل ناهار مجانی می‌مونند، چند دقیقه صرف نصب‌شون می کنیم و می‌تونند ما رو از یک عالمه خطا در طول عمر برنامه نجات بدن. از فراموش کردن یک semi colon ساده تا مشخص کردن promiseهای resolve نشده از جمله کارهایی هست که خطایاب‌ها برامون انجام میدن. اگر اهل برنامه‌نویسی سی شارپ با Visual Studio باشید حتما با Resharper آشنا هستید. یک مقدار CPU و RAM میدید ولی عوضش سرعت برنامه‌نویسی و خطایابی خیلی بهتری دارید. چند مثال از کارهایی که Linter انجام میدن:eslint-plugin-chai-expect can discover tests without assertionseslint-plugin-promise can discover promises with no resolve (your code will never continue)eslint-plugin-security can discover eager regex expressions (that might get used for DOS attacks)3- عمیق‌تر کردن دانش معماری و طراحی نرم‌افزارDesign patternاین روزها توی اکوسیستم نرم‌افزاری همه از مایکروسرویس‌ها حرف میزنند و MVC هم مهمترین الگوی طراحی این روزها نرم‌افزار شده. مشکل کار کجاست؟ خیلی بعیده که بتونیم تمام نیازهایی شبیه منطق پروژه، نقش‌ها، لایه مدیریت دیتا و مابقی نیازهای نرم‌افزارهامون رو توی قالب دو تا کلاس Controller و Model ذخیره کنیم. تازه کسی صحبت از این نمیکنه هر کدوم از مایکروسرویس‌ها رو به صورت مستقل چه جوری مدیریت و طراحی کنیم. این نقل قول از عمو باب رو هم اضافه کنم که:MVC is a delivery mechanism, not an application architectureبه نظر میاد که نباید ترسی از استفاده از Patternهای پیچیده‌تر و معماری‌های مقیاس‌پذیرتر داشته باشیم. مخصوصا با افزایش اندازه‌ی پروژه انتخاب یک معماری صحیح‌تر خودش رو بیشتر نشون میده. میتونید برای ادامه‌ی این مبحث مثال‌های زیر رو دنبال کنید:Did you read my Node.js best practices section 1 — architecture?code of this nice Node.js boilerplatedata mapper pattern see a shortened version of this Novel book here4-استفاده از Async-Hooks برای Trace بهتر contextوقتی که از معماری غیرهمزمان استفاده میکنیم مهمترین اتفاق اینه که درخواستها context خودشون رو از دست میدن و در طول چرخه درخواست-پاسخ همه‌ی متغیرهای درخواست حفظ نمیشن. مشکل اینجاست که برنامه‌نویس‌های دوست دارن که تمام اطلاعات طول یک درخواست رو به صورت پیوسته log کنند که بعدا بتونند اشکالات و گلوگاه‌های سیستم رو به راحتی شناسایی کنند. مکانیسم‌هایی برای تزریق کدها به این فرآیند وجود داره که تمام نیازهای ما رو از دنبال کردن متغیرهای یک Context در طول چرخه‌ی عمرش پوشش بده. در ادامه چند مثال برای ارتقای Tracing توی Node.js لیست شده:cls-hooked allows sharing variables and context through the entire request life-cycleJaeger client will visualize the entire request flowLearn about async-hooks opportunities and how to code against it5-مطالعه‌ی بیشتر در مورد معماری ServerLess فراتر از سرورهای محلیخیلی از شرکت‌ها توی گذشته یک یا چندین سرور فیزیکی در محل شرکت یا دیتاسنتر داشتند و تمام عملیات مرتبط با سرور رو خودشون انجام میدادن. این روزها معماری FasS یا Function as a service یکی از ترندهای اصلی دنیا نرم‌افزار هست. شما با استفاده از این معماری قرار نیست که دوباره همه چیز رو خودتون پیاده‌سازی کنید یا تمام چیزهایی رو که لازم دارید نصب، config و نگهداری کنید. تنها بر اساس سرویس‌هایی که احتیاج دارید و مقدار مصرفتون، هزینه میکنید و به راحتی هر موقع که خواستید تقاضای امکانات سخت‌افزاری بیشتری از ارائه‌دهنده‌ی خدمات FasS می‌کنید. آشنایی با معماری Server less و استفاده از صحیح از اون شما رو میتونه یک مرحله بالاتر از برنامه‌نویس‌های دیگه قرار بده.اگر خارج از ایران زندگی میکنید، حتما سر به خدمات شرکت‌هایی مثل آمازون، گوگل و مایکروسافت توی این زمینه بزنید. اگر ایران زندگی میکنید برای شروع میتونید به ابر فندق یا سرویس‌های شرکت آرمان مراجعه کنید.برای مطالعه بیشتر:AWS Lambda SAM tool allows defining and running FaaS locallyAWS Lambda now supports canary deployments!AWS Lambda layers6- یادگیری ویژگی‌ها و امکانات جدید جاوا اسکریپتهمیشه برنامه‌نویس‌هایی وجود دارند که شبیه گذشته کد می‌زنند. علاوه بر واجب بودن یادگیری JS 6 باید یک نگاه‌هایی هم به نسل‌های دیگه جاوااسکریپت مثل JS 7  و JS 8 و .. بندازید و ویژگی‌ها و امکاناتشون رو یاد بگیرید. همچنین سایت https://node.green مرجع خوبی برای این هست که بدونید از چه امکانی میتونید توی کدوم نسخه از node استفاده کنید و چه ویژگی‌ها رو هنوز بلد نیستید که میتونه کدهاتون رو ساده‌تر و تمیزتر کنه.Async iteratorspromise-finally7-جدی‌تر گرفتن grpc و استفاده‌ی عملی از GraphQLانتخاب‌های متفاوت برای یک مسئله‌ی همیشگیسال‌های زیادیه که rest api سلطان بلامنازع الگوی نوشتن سرویس‌ها توی حوزه‌ی وب هست. اینکه هر موجودیتی endpoint خاص خودش رو داشته باشه و بتونیم از قیدهای http برای مدیریت درخواست‌ها استفاده کنیم از مهمترین مزایا الگوی rest api هست. اما همه چیز rest نیست و rest هم نمیتونه همه چیز رو پشتیبانی کنه. به دلیل ماهیت و معماری rest api و Stateless بودن اون امکان پیاده‌سازی سرویس‌هایی مثل چت‌های آنلاین با  rest api امکان پذیر نیست. همچنین مشکل n + 1 دررخواست از دیگر مشکل‌های اصلی سرویس‌های مبتنی بر rest api هست. توی این سال‌های گذشته دو الگوی GraphQL و grpc به شدت محبوب و پر کاربرد شدن. حتی اگر آگهی‌های استخدامی این روزهای ایران رو هم نگاه کنید، شرکت‌هایی زیادی وجود دارند که برای استخدام node.js کار مورد علاقه‌شون شرط آشنایی با GraphQL رو هم مطرح کردند. بهتر هست به این دو تکنولوژی نگاه دقیق‌تری بندازید و حداقل یک پروژه با GraphQL انجام بدید. مطالعه بیشتر:Learning by contrasting is great — REST vs Graph vs grpcSkim through a GraphQL, Node &amp;amp;amp; Express tutorialWatch a short YouTube (11 min) — what is GraphQL?8- فراتر رفتن از unit و integration تست‌هاتوی سال‌های گذشته برنامه‌نویسی با وجود مایکروسرویس‌ها، معماری server less و فرانت‌های تغییرهای اساسی به خودش دیده اما توی حوزه‌ی تست نویسی ما هنوز و اغلب تنها از unit تست‌ها، integration تست‌ها و end-to-end تست‌ها استفاده میکنیم (واقعا استفاده میکنیم؟ :) ). میشه گفت این روزها تنها این تست‌ها کافی نیست، باید روش‌ها و متدهای جدیدتری هم توی این زمینه یاد بگیریم. برای شروع میتونید لینک‌های زیر رو بررسی کنید:Consumer-driven contractsSnapshot testsComponent testsSee my YouTube video on “Beyond Unit Tests: 5 Shiny Node.JS Test Types (2018)9-یادگیری ابزارهای مانیتورینگ کد بر روی سروراین روزها این قدر مشغول یادگرفتن کتابخونه‌های جدید و ترندهای برنامه‌نویسی در هنگام Develop کردن هستیم که فراموش میکنیم بخش اصلی کار وقتی هست که کدهای ما توی محیط Production قرار میگیره. میدونم که مانیتورینگ سرور رو میتونند دوستان شبکه کار به عهده بگیرند اما به عنوان برنامه‌نویس هم باید کمی با این موضوعات آشنا باشیم. مثلا بدونیم که زمان پاسخدهی هر کدوم از سرویس‌هامون به طور متوسط چند میلی ثانیه است یا اینکه برای هر رکوئست چقدر CPU و RAM استفاده میکنیم. تازه علاوه بر این‌ها باید به درستی بتونیم خطاها رو ردیابی کنیم و یا زودتر از هر کسی دیگه‌ای از اشکالات سرورمون خبردار بشیم. برای شروع میشه این مطالب رو بررسی کرد:Read about the 4 monitoring ‘Golden signals’Read Google Site Reliability Engineering book, or at least the chapter on monitoringrequest-stats10- فکر کردن مثل هکرها: یادگیری ابزارهای هک برای تمرین دفاع مناسباگر نتونید مثل یک هکر فکر کنید و ابزارهای حمله‌ی اون‌ها رو بلد باشید، هیچ وقت نمی‌تونید یک استراتژی مناسب برای دفاع در نظر بگیرید. توی سال 2019 انجام یک کار کافی نیست، باید بلد بشید چه طوری از نرم‌افزارتون و داده‌های مشتری‌هاتون محافظت کنید و در صورت مورد حمله واقع شدن خسارت رو به حداقل برسونید. به هشدارهای امنیتی هم توجه کنید و همیشه حواستون به Patchهای امنیتی ابزارهاتون باشه. همچنین فراموش نکنید امنیت چیزی نیست که در انتهای پروژه به کدهاتون اضافه کنید، بلکه چیزیه که از همون روز اول باید یک نقشه‌ی مناسب براش داشته باشید. برای مرور بیشتر:OWASP ZAP — a rich assessment &amp;amp; penetrationRead my list of Node.js Security best practicesاین نوشته ترجمه‌ی آزادی از این مطلب در مدیومه. سعی میکنم خیلی زود قسمت دومش رو مثل همین ترجمه‌ی آزاد منتشر کنم.</description>
                <category>حسین منصوری</category>
                <author>حسین منصوری</author>
                <pubDate>Mon, 04 Nov 2019 09:47:23 +0330</pubDate>
            </item>
                    <item>
                <title>نصب لینوکس روی ویندوز به صورت مستقیم و بدون VMWare!</title>
                <link>https://virgool.io/@mansourihosein/%D9%86%D8%B5%D8%A8-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-%D8%B1%D9%88%DB%8C-%D9%88%DB%8C%D9%86%D8%AF%D9%88%D8%B2-%D8%A8%D9%87-%D8%B5%D9%88%D8%B1%D8%AA-%D9%85%D8%B3%D8%AA%D9%82%DB%8C%D9%85-%D9%88-%D8%A8%D8%AF%D9%88%D9%86-vmware-ri2cmbv6dqsi</link>
                <description>حتما تا به حال به عنوان یک برنامه‌نویس/شبکه‌کار نیاز به نصب یکی از توزیع‌های لینوکس بر روی ویندوز پیدا کردید. تا الان برای این کار مجبور بودیم یکی از یک از ابزارهای مجازی‌سازی مثل VMware‌ یا Hyper-v  رو استفاده کنید. هر کدوم از این ابزارها سر بار و Overhead خاص خودشون رو دارند و معمولا این قدری از سیستم رم و CPU مصرف می‌کنند که در نهایت مجبور می‌شدیم که ماشین‌ها رو به وقت نیاز روشن کنیم و در مابقی موارد از کندی سیستم و مشکلات Performance‌ توی سیستم‌های معمولی رنج ببریم. حالا خبر خوب اینه که مایکروسافت از نسخه‌ی 1607‌ ویندوز 10 قابلیت WSL یا Windows Subsystem for Linux رو به سیستم‌عامل خودش اضافه کرده که به ما این امکان رو میده که به راحتی یک لینوکس سبک، کارا، با Performance‌ مناسب و به صورت یک Application‌ ویندوزی معمولی داشته باشیم. چه خبر هیجان انگیزی!Linux in Windowsبرای استفاده از قابلیت WSL‌ در ویندوز باید از نسخه‌ی 1607 یا بالاتر ویندوز 10 استفاده کنید. برای اینکه بدونید از چه نسخه‌ای در حال حاضر استفاده می کنید،‌ مسیر زیر رو دنبال کنید:Setting &gt; System &gt; About و شماره‌ی نسخه‌ی ویندوز خودتون رو در انتهای صفحه پیدا کنید.Windows Versionیا اینکه در منوی Run کلمه‌ی winver بنویسید و دکمه‌ی اینتر رو بزنید. اونوقت تصویر زیر رو مشاهده می‌کنید.در نهایت اگر احساس خفن بودن می‌کردید می‌تونید توی Powershell دستور زیر رو تایپ کنید.[System.Environment]::OSVersion.Version اگر شماره‌ی نسخه‌ی ویندوزتون پایین‌تر از 1607 بودید باید ویندوزتون قبل از اینکه بتونید به مرحله‌ی بعد برید، بروزرسانی کنید.فعال کردن قابلیت WSL‌ در ویندوزاگر هنوز PowerShell‌ رو از قسمت قبل نبستید و اون رو به صورت Run as Administrator‌ اجرا کردید، با خط فرمان زیر می‌تونید قابلیت WSL رو فعال کنید.Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linuxاگر هم حوصله‌ی PowerShell‌ رو هنوز ندارید، مسیر زیر رو دنبال کنید. Add or remove programs &gt; Programs and Features &gt; Turn Windows features on or off و گزینه‌ی Windows Subsystem for Linux‌ رو انتخاب کنید. افزودن قابلیت WSL‌ در ویندوز 10 همچنین اگر توی منوی استارت عبارت Turn Windows features on or off رو جستجو کنید به همین صفحه می‌رسید :)در نهایت به خاطر اصل همیشگی Pay for Play برای فعال شدن این قابلیت باید هزینه‌ی ری‌استارت شدن مجدد ویندوزتون رو به جون بخرید :)نصب لینوکس در ویندوز با شیوه راحت‌تر از خرید یک دبه ماست!اگر هنوز هم PowerShell‌ رو اجرا نکردید، اصلا نگران نباشید! کافیه که Region‌ ویندوزتون رو به هر کشوری به جز وطن پر افتخارمون تغییر بدید و اون وقت Store‌ مایکروسافت رو باز کنید  و کلمه‌ی Ubuntu‌ رو سرچ کنید و به این صفحه برسید. به جز Ubuntu توزیع‌های دیگه‌ای از لینوکس هم توی Store‌ مایکروسافت وجود داره. می‌تونید لیستش رو از این آدرس مشاهده کنید.Ubuntu In Storeیا حتی مستقیم‌تر می‌تونید موقع جستجو به سراغ صفحه‌ی Ubuntu 18.04 LTS‌ برید.Ubuntu 18.04 LTS in Storeحالا با زدن دکمه‌ی GET به راحتی می‌تونید نسخه‌ی مورد نظر لینوکس‌تون رو دریافت کنید و بعدش بر روی دکمه‌ی Launch کلیک کنید.صفحه دریافت پس از اتمام عملیات دانلودحالا می‌تونید از لینوکس بر روی ویندوز لذت ببرید! اما اگر هنوز احساس خفن بودن می‌کنید و دوست دارید باز هم از Powershell استفاده کنید برای نصب توزیع مورد نظرتون می‌تونید دستورات زیر را به ترتیب اجرا کنید. Invoke-WebRequest -Uri https://aka.ms/wsl-ubuntu-1804 -OutFile Ubuntu.appx -UseBasicParsingو توزیع مورد نظرتون رو با دستور زیر نصب کنید.Add-AppxPackage .\Ubuntu.appxتوضیحات بیشتر رو می‌تونید در این صفحه ببینید. همچنین اگر پس از دانلود و نصب و موقع اجرا به خطاهای عجیب و غریب خوردید، کلمه‌ی Ubuntu رو توی ابزارهایی مثل Everything‌ جستجو کنید. برای خودم من که از خط فرمان لینوکس رو نصب کردم، ویندوز فایلهای ابونتو رو توی پوشه‌ای ریخته بود که به فولدر بالاترش دسترسی نداشتم. به خاطر همین موضوع امکان اجرای نرم‌افزار رو نداشتم. با جا به جایی محتوای فولدر به یک جای دیگه به سادگی مشکلم حل شد!بعد از نصب می‌تونید توزیع لینوکسی که انتخاب کردید رو به عنوان یک APP در سیستم‌عاملتون مشاهده کنید.Ubuntu Appبعد از اجرای لینوکسی که نصب کردید، دستورات زیر رو توی خط فرمان وارد کنید، تا ابزارهای مورد نیازتون نصب بشه.sudo apt update &amp;&amp; sudo apt upgradeامیدوارم از این نوشته خوشتون اومده باشه. برای کار در منزل هم می‌تونید از این لینک سراغ نسخه‌ی دوم این تکنولوژی با نام WSL2 برید. ویژگی‌ها و ارتقاهای اون رو مشاهده کنید و یادتون باشه که برای اجرای WSL2‌ به نسخه 18917 یا بالاتر ویندوز 10 نیاز دارید. </description>
                <category>حسین منصوری</category>
                <author>حسین منصوری</author>
                <pubDate>Mon, 29 Jul 2019 11:45:22 +0430</pubDate>
            </item>
                    <item>
                <title>ویدئوی سمینار SQL Server Modern and Advanced Features</title>
                <link>https://virgool.io/@mansourihosein/%D9%88%DB%8C%D8%AF%D8%A6%D9%88%DB%8C-%D8%B3%D9%85%DB%8C%D9%86%D8%A7%D8%B1-sql-server-modern-and-advanced-features-g3gaftzv5z9n</link>
                <description>چند روز پیش توی سازمانم سمیناری در مورد ویژگیهای جدید و مدرن SQL Server  داشتم. سر فصل‌های این سمنار شامل موارد زیر هست. همچنین ویدئوی این کنفرانس رو می‌تونید از این آدرس تماشا کنید.•SQL Server on Linuxand Docker•Adaptive query processing•Automatic tuning•Graph•New TSQL functions•High availability•Resumable online index•Temporal Tables•Machine Learning Services•Real-time analytics/ HTAP•Always Encrypted•Row-Level Security•Dynamic Data Masking•Stretch Database•SQL Server 2019 new featuresامیدوارم دوست داشته باشید و لذت ببرید. اگر سوالی هم در مورد کنفرانس و مطالب بود در خدمت هستم.</description>
                <category>حسین منصوری</category>
                <author>حسین منصوری</author>
                <pubDate>Wed, 24 Jul 2019 11:52:36 +0430</pubDate>
            </item>
                    <item>
                <title>نقشه راه توسعه NET. تا سال 2023</title>
                <link>https://virgool.io/@mansourihosein/%D9%86%D9%82%D8%B4%D9%87-%D8%B1%D8%A7%D9%87-%D8%AA%D9%88%D8%B3%D8%B9%D9%87-net-%D8%AA%D8%A7-%D8%B3%D8%A7%D9%84-2023-sfuz3rwzdxvt</link>
                <description>در ماه می سال جاری میلادی مایکروسافت نقشه‌ی توسعه NET. رو تا سال 2023 منتشر کرد و این نقشه نه فقط مربوط به NET Core. بلکه همه‌ی خانواده‌ی NET. هست. این بروزرسانی علاوه بر ویندوز خانواده‌ی بزرگی از بسترهای متنوع و متفاوتی مثل لینوکس، سیستم‌عامل مک، IOS، اندروید، سیستم‌عامل‌های تلویزیون، سیستم‌عامل ساعت اپل، Web Assembly، ابزارهای متنوع IoT، و کلی بستر متفاوت دیگه رو شامل میشه. بیایید با هم نقشه‌ی راه مایکروسافت رو برای توسعه‌ی NET. بررسی کنیم..NET 5 Architectureاز ابتدای راه NET Core. تا حالا بیشتر از 50 هزارتا API به این فریمورک افزوده شده. توی نسخه آخر NET. Core 3 علاوه بر بهبود ویژگی‌های مختلف فریمورک امکان نوشتن برنامه Desktop هم به NET Core. اضافه شده تا gap بین NET Core. و NET Framework. کمتر بشه..NET 5 = .NET Core vNextعلاوه بر ویندوز که از شماره‌ی 8 به شماره ی 10 رسید و همچنین شرکت اپل هم شماره‌ی 9 رو توی نام‌گذاری گوشیهاش فراموش کرد، مایکروسافت هم نام‌گذاری NET Core 4. رو قلم انداخته و نسخه‌ی بعدی رو با نام NET 5. عرضه میکنه. دلیل این نام‌گذاری هم اینه که با خانواده‌ی NET Framework 4.x. تفاوت نام‌گذاری داشته باشه و باهاش اشتباه گرفته نشه. همچنین کلمه‌ی Core هم از NET Core. حذف میشه و ما از این به بعد تنها از کلمه NET. برای نام بردن از این فریمورک استفاده می‌کنیم. زمان عرضه‌ی این نسخه هم نوامبر 2020 در نظر گرفته شده و اولین Preview این نسخه هم در نیمه‌ی اول سال آینده‌ی میلادی عرضه میشه.زمانبندی ارائه نسخه‌های آینده دات نتاهداف اصلی این بروزرسانی NET. شامل موارد زیر است:تولید یک نسخه‌ی واحد از فریمورک و runtime دات نت که همه جا قابل اجرا باشه و رفتارش در زمان اجرا و تجربه‌ی برنامه‌نویسی یکسانی داشته باشه. توسعه قابلیت‌ها .NET با استفاده از گرفتن بهترین قابلیتهای NET Core.، دات نت فریمورک، Xamarin، و پروژه‌ی Mono.ساخت یک محصول با تنها یک code base که توسعه دهنده‌ها (اعم از توسعه دهنده‌های خود مایکروسافت و توسعه‌های آزاد) بتونند توسعه‌اش بدن و تمام سناریوها رو به صورت یکپارچه پیش ببرند.بهبود عملکرد در زمان اجرااز همون ابتدای دات نت امکان Cross Platform کردن اون وجود داشت. اولین و مهمترین پروژه چندسکویی دات نت فریمورک هم با نام Mono شناخته میشد. تاریخ اولین Release این پروژه مربوط به چهارده سال پیش میشه! در نهایت هم توسط خود مایکروسافت بهبود پیدا کرد  و به عنوان بخشی از زامارین برای تولید اپ‌های اندروید و IOS استفاده میشه. اما یکی از دلایلی که سالهای زیادی مونو مهجور موند این بود که برنامه‌نویسهای دیگه‌ای به جز برنامه‌نویس‌های اصلی دات نت مشغول Portکردن کدهای دات نت به بسترهای مختلف بودند و همیشه اگر کسی نیاز داشت که از تمام امکانات دات نت فریمورک استفاده کنه محدود به استفاده ازش در محیط ویندوز بود.همون طور که مطلع هستید با اومدن NET Core. این موضوع تغییر پیدا کرد. NET Core. برای اجرای دستوراتش از CoreCLR استفاده میکنه. با استفاده از CoreCLR برنامه‌نویسان دات نت فریمورک تونستند که کدهاشون رو علاوه بر ویندوز روی بسترهای دیگه مثل لینوکس و سیستم‌عامل مک هم اجرا کنند. در ادامه توسعه‌ی دات نت مایکروسافت قصد که ویژگی‌های خوب Mono و CoreCLR رو با هم ترکیب کنه و این امکان رو برای برنامه‌نویس‌های فراهم کنه که بنا مقتضیات کارشون امکان کامپایل متفاوت برای کدهاشون رو داشته باشند. هر کدوم از نوع کامپایل کردن کدها ویژگیهای مختلفی دارند و اهداف متفاوتی رو دنبال میککند. در ادامه این دو نوع کامپایل کردن رو با هم بررسی و مقایسه میکنیم. بهره‌وری و توان عملیاتی بالاتراز ابتدای شروع دانت نت کدهایی که توسعه میدادیم به یک زبان میانی (Intermediate Language (IL) code) تبدیل میشدند. بعد نوبت به کامپایلر زمان اجرا Just In Time Compiler یا JIT میرسد در موقع اجرای نرم‌افزار که کد زبانی میانی رو به کد ماشین تبدیل کنه. این کامپایلرها همچنین با توجه به CPU و سخت‌افزار سیستم بهینه‌سازی‌های مورد نظر رو توی خروجی کدها اعمال میکنند تا اونها بالاترین بهره‌وری رو هنگام اجرا داشته باشند. به طور خلاصه در هنگام شروع اجرای نرم‌افزار ما یک هزینه اضافی برای تولید کدهای ماشین توسط کامپایلر زمان اجرا رو متقبل میشیم اما بعد از تبدیل اولیه، ما کدی رو داریم که با توجه به ماشینی مورد استفاده‌مون بهینه شده و بالاترین کارایی ممکن رو داره. این ویژگی موجب میشه که کدهای برای اجرای طولانی مدت روی ابر یا روی سرورهای بهینه و کارا باشند. یکی از دلایل کارایی بالای ASP.NET Core هم استفاده از کامپایلر زمان اجرا هست. در آینده‌ی دانت هم این کامپایلر نقش مهمی رو توی بالا بردن عملکرد سیستم ایفا میکنه.JIT Compilerراه اندازی سریع، رد پای کم و استفاده کمتر از حافظهتوی پاراگراف قبلی از مزایای کامپایلرهای زمان اجرا صحبت کردیم. در آینده دات نت هم این کامپایلر نقش مهمی رو ایفا میکنه. اما در اکو سیستم دات نت دو استثناء هم وجود داره که در اون ها به جای استفاده از JIT از (AOT (ahead-of-time یا کامپایل مقدماتی یا جلوتر از زمان استفاده شده. این دو استثناء شامل خروجی پروژه‌ی مونو برای IOS و همچنین پروژه Blazor هست. پروژه Mono توی چند سال اخیر بر روی موبایل و کنسول‌های بازی متمرکز بوده. به خاطر همین موضوع تیم توسعه‌ی Mono برای حفظ کارایی و داشتن عملکرد مناسب کار تبدیل کدها رو به زبان ماشین با استفاده از کامپایلر AOT انجام میده.  در این نوع کامپایل کردن تمامی کدها در همون ابتدای کار به زبان ماشین ترجمه میشن. به همین دلیل در اجرای اولیه کد این کدهای سریع‌تر اجرا میشن و کاربر هزینه تبدیل این کدها رو به زبان ماشین در ابتدای اجرا کار پرداخت نمیکنه. کامپایلر AOT پروژه Mono مبتنی کامپایلر LLVM هست. شاید در مورد این کامپایلر کم شنیده باشید اما چند سال اخیر و آینده دنیای برنامه رو تا دهه‌ی آینده احتمالا کامپایلرهای مبتنی بر LLVM شکل خواهند داد. به طور مثال کامپایلر زبان Swift شرکت اپل هم مبتنی بر LLVM توسعه داده شده. توی این مطلب قرار نیست در مورد این کامپایلر صحبت کنیم اما خوب بود که بدونیم قدرت کامپایلر پروژه‌ی Mono از کجا نشات گرفته.در توسعه‌ی دات نت به دو صورت از کامپایلرهای AOT استفاده میشه:برنامه به صورت کامل و صد درصد با این کامپایلر کامپایل بشه.برخی از اجزای ثابت پروژه با AOT کامپایل بشه و مابقی بخش‌های پروژه که چندان با این کامپایلر سازگار نیست مثل Generic ها از کامپایلر JIT استتفاده بشه.در حال حاضر از کامپایلر AOT برای پروژه‌های IOS و کنسولهای بازی در دات نت استفاده میشه اما برای آینده هر جا به سرعت بالاتر و سربار کمتر زمان اولین اجرا نیاز باشه، قرار هست که امکان استفاده از AOT فراهم بشه.AOT Compilerدر نهایتهر دو نوع کامپایل در دات نت مزایا و معایب خاص خودشون رو دارند و این طوری که یک نوع کامپایل برتری کاملی بر نوع کامپایل دیگه داشته بانشد. تیم توسعه دات نت در حال نزدیک کردن این دو نوع کامپایل کردن به هم هست. به خاطر همین موضوع کارهای زیر رو انجام دادند.الان میشه از MonoVM به عنوان یکی از کتابخونه‌های CoreFx استفاده کردتمام تست‌های CoreFx الان بر روی MonoVM اجرا میشهامکان اجرای کدهای ASP.NET Core بر روی MonoVM فراهم شدهامکان توسعه Mono بر روی Mac مبتنی بر CoreCLR فراهم شدهدر نهایت پروژه‌ی NET 5. یک گام مهم در آینده دات نت هست و چراغ راهی برای توسعه‌های سال‌های آینده این فریمورک محبوبه.منبع با دخل و تصرف +</description>
                <category>حسین منصوری</category>
                <author>حسین منصوری</author>
                <pubDate>Mon, 08 Jul 2019 12:05:47 +0430</pubDate>
            </item>
                    <item>
                <title>راهنمای پروژه‌های متوسط به بالا در سال 2019</title>
                <link>https://virgool.io/@mansourihosein/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C-%D9%BE%D8%B1%D9%88%DA%98%D9%87%D9%87%D8%A7%DB%8C-%D9%85%D8%AA%D9%88%D8%B3%D8%B7-%D8%A8%D9%87-%D8%A8%D8%A7%D9%84%D8%A7-%D8%AF%D8%B1-%D8%B3%D8%A7%D9%84-2019-o0abhpviuqyf</link>
                <description>در سال‌های اخیر پروژه‌های نرم‌افزاری بزرگ‌تر، پیچیده‌تر و دارای نیازمندهای بیشتری شده‌اند. شاید در دهه‌‌های قبلی یک پروژه‌ی نرم‌افزاری شامل چند صد نفر ساعت کار  و حجم دیتابیس پروژه بیش از یک گیگابایت نبود اما این روزها کار کردن بر روی پروژه‌های با چند ده هزار ساعت نفر کار و حجم دیتابیس ترابایتی حتی در ایران هم یک امر مرسوم و متداول شده است. با هم نیم‌نگاهی به تکنولوژی‌های مطرح و معروف سال 2019 برای انجام یک پروژه‌ی متوسط و یا بزرگ می‌اندازیم. معماری کلی نرم‌افزارمعماری پیشنهادی برای وب سایت‌های جدید مبتنی بر مایکروسرویس، داکر و تحت مدیریت نرم‌افزار Kubernetes  می‌باشد. Microservices with Docker and Kubernetes: An Overviewاستفاده از معماری مایکروسرویس امکان ماژولار کردن نرم‌افزار را فراهم می‌آورد. به دلیل ماهیت مستقل سرویس‌ها می‌توان با توجه به نیاز هر کدام از آنها را به صورت جداگانه Replicate‌ و به سادگی در گلوگاه‌های سیستم Load Balance‌ ایجاد کرد. همچنین طراحی، توسعه،‌ تست و Publish هر کدام از سرویس‌ها به طور مستقل انجام می‌پذیرد که این موضوع هزینه‌های توسعه و نگهداری سیستم را به طور عمده کاهش می‌دهد. این روزها بروزرسانی و انتشار نرم‌افزار بدون استفاده از داکر کاری سخت و طاقت‌فرسا به شمار می‌رود. با استفاده از داکرایز کردن پروژه انتشار هر قسمت از پروژه به سادگی امکان‌پذیر می‌شود و اختلاف اجرا در محیط‌های عملیاتی به نسبت محیط Develop به حداقل می‌رسد. برای مدیریت، بروزرسانی و ایجاد Load Balance بر روی کانینترها سیستم Kubernetes پیشنهاد می‌شود. کوبرنتیز یک سیستم متن باز می‌باشد که اولین برای توسط گوگل ایجاد و برای مدیریت هزارسرور و ده هزار کانتینر داکر مورد استفاده قرار گرفته است. پیاده‌سازی یک سیستم CI/CD مناسب و ایجاد فرهنگ DevOps نیز زمان و هزینه‌ی نگهداری و توسعه نرم‌افزار را به اندازه‌ی قابل توجهی کاهش میدهد.الگوی طراحی چند مستاجریاز جمله الگوهای طراحی مورد توجه این روزهای جامعه نرم‌افزاری میتوان به معماری چند مستاجری اشاره کرد. برای پروژه‌ها در دو سطح معماری چند مستاجری (Multi tenancy) می‌تواند مفروض واقع شود. این الگوی طراحی دو پیاده‌سازی متفاوت دارد: 1-جداسازی دیتابیس، 2-جداسازی اسکیما.در جدا سازی دیتابیس هر محصول دیتابیس، دیتا و لایه‌ی ارائه‌ی کننده‌ی دیتا خود را دارد، اما یک سرویس و هسته‌ی مشترک تمام عملیات را کنترل می‌کند. در مدل جداسازی اسکیما تنها لایه‌ی ارائه‌کننده‌ی دیتا متفاوت است ولی همه از یک دیتابیس و هسته‌ی مشترک استفاده می‌کنند. به طور مثال اگر چندین فروشگاه اینترنتی متفاوتی دارید که هر کدام وب سایت و اپ متفاوت خود را دارند اما تمام فروشگاه‌ها هسته و دیتابیس یکسان دارند. multi-tenant systemانتخاب فریمورک اصلی سیستمپیشنهاد معماری اپلیکیشن اصلی استفاده از Web API و جداسازی کامل Back-End و Front-End می‌باشد. سرویس‌های شما به طور همزمان می‌توانند به تمام اپلیکیشن‌های موجود از جمله Front-End، اپلیکیشن‌های موبایلی و دیگر  سیستم‌ها سرویس ارائه دهند. از بین زبان‌های معروف و فریمورک‌های مختلف چند گزینه برای پیاده‌سازی اپلیکیشن اصلی سایت پیشنهاد می‌شود.ASP.NET Core + grpcفریمورک جدید مایکروسافت Cross Platform و Open Source است. سرعت و Performance این فریمورک همپا با سریع‌ترین زبان‌ها مانند Go می‌باشد. تعداد برنامه‌نویس زیاد این فریمورک در ایران از دیگر مزایای آن برای شرکت‌های خصوصی می‌باشد. همچنین پیشنهاد می‌شود که به جای استفاده از Rest API از تکنولوژی grpc استفاده شود. grpc به جای HTTP1.1 از HTTP 2.0 استفاده می‌کند. همچنین استفاده از ProtoBuf به جای JSON (استفاده از نقل و انتقال باینری دیتا به جای String) موجب بهبود سرعت و علمکرد این تکنولوژی به نسبت Rest API شده است. همچنین در grpc امکان stream دو طرفه برای کلاینت و سرور نیز وجود دارد.Node.js + GraphQLعلاوه بر فریمورک ASP.NET Core، گزینه‌ی جایگزین پیاده‌سازی با Node.js است. به دلیل ماهیت ذاتی Node.js تولید نرم‌افزار با این فریمورک سریع‌تر و به دور از پیچیدگی‌های مرسوم ASP.NET می‌باشد. همچنین پیشنهاد می‌شود که از GraphQL  برای پیاده‌سازی APIهای سرویس‌ها استفاده شود. GraphQL به کلاینت‌ها اجازه می‌دهد که تنها فیلدها و دیتاهای مورد نیاز خود را از سمت سرویس دریافت کنند و تنها مبتنی بر سرویس‌های آماده شده در سمت Back End نباشند.Front End:مارکت Front End در چند سال اخیر در قبضه‌ی سه کتابخانه Angular، React و Vue بوده است. هر سه این کتابخانه نقاط قوت و ضعف خود را دارند. به توجه به کارایی، منحنی یادگیری و ترند این روزهای دنیا برنامه‌نویسی استفاده از کتابخانه Vue.js برای طراحی Front End پایگاه پیشنهاد می‌شود. همچنین ظاهر پایگاه باید Responsive باشد و از PWA پیشتیبانی کند.React vs. Angular vs. Vueدیتابیس اصلی سیستمچند گزینه‌ی متفاوت برای انتخاب اصلی دیتابیس سیستم مطرح می‌باشد. بخشی از فرآیند انتخاب دیتابیس توجه به نوع کسب و کار و داده‌های آن است. در اصل دیتابیس باید پاسخگوی نیازهای کسب و کار شما باشد.یکی از پیشنهاد‌های اصلی برای انتخاب دیتابیس استفاده از پایگاه‌داده MSSQL Server نسخه 2017 یا 2019 می‌باشد. این دیتابیس بنابر گزارش گارتنر در جایگاه بالاترین کارایی و رهبری بازار در حوزه‌ی دیتابیس است. علاوه بر قابلیت‌های بی‌شمار MSSQL Server امکان Always On آن که از نسخه‌ی 2017 اضافه شده است امکان ایجاد کپی‌های چندتایی فقط خواندنی از دیتایبس اصلی فراهم می‌آورد. این کپی‌ها می‌توانند به صورت همزمان/غیر همزمان تهیه شوند و در یک یا چند مرکز داده‌ی مختلف نگهداری شوند. قابلیت Always On این امکان را فراهم می‌آورد که معماری CQRS را در سطح دیتابیس با پیچیدگی کم پیاده‌سازی کنیم و خواندن اطلاعات را نه از دیتابیس اصلی بلکه از دیتابیس‌های Read Only انجام دهیم و بدین صورت بار خواندن را از روی دیتابیس اصلی برداریم. همچنین می‌توانیم از این دیتابیس‌های بدون اختلال از پایگاه اصلی برای گزارش‌های مدیریتی و یا پردازش‌های متن کاوی استفاده کنیم.همچنین قابلیت‌های بیشمار دیگر مانند Column Store Index و پشتیبانی از JSON ترکیب کارایی و اطمینان بالایی را برای استفاده‌کنندگان آن فراهم می‌آورد.combines SQL Server and Apache Spark to create a unified data platformدیتابیس MongoDB پیشنهاد دوم برای ذخیره و بازیابی اطلاعات است. پشتیبانی بهتر از دیتاهای سندگرا و همچنین وجود ایندکس‌های خودکار و امکان توسعه افقی از مزایای MongoDB می‌باشد.موتور جستجوبا توجه به  اقبال جهانی، کارایی و عملکرد فوق‌العاده موتور جستجوی پایگاه موتور جستجوی الاستیک بهترین گزینه برای موتور جستجوی سیستم می‌باشد . جستجو‌ها، نمایش لیست‌ها و مدیریت فست‌ها را با خیال راحت می‌توان به این موتور جستجو واگذار کرد.Object Storage: در سامانه‌های جدید اطلاعاتی، نیازمند سیستم فایلی هستیم که هر نوع موجودیت فایلی را به صورت یک شیء منحصر بفرد ذخیره کند یعنی همزمان بتواند عکس، فیلم، صدا، مستندات و سایر انواع فایل را به راحتی و به صورت یک شی با شناسه و خصوصیات خاص خود، ذخیره و بازیابی کند. نیز قادر باشد مشابه تمامی سامانه های نوین که از طریق REST API خدماتشان را به سایرین ارائه می‌کنند، از طریق یک درخواستHTTP ، بدون نیاز به یک وب سرور بتوانیم با فایلها کار کرده، آنها را ذخیره و جستجو کنیم. این نوع از سیستم‌های فایل که به آنها Object Storage می گوئیم در مقابل سیستم‌های فایل سنتی که به سیستم های File level معروفند، قرار می‌گیرند.در سیستم‌های File Level، هر فایل یک آدرس منحصر به فرد و یک نام دارد که از طریق آن قابل دسترسی خواهد بود. سیستم فایل بلاکی هم نوع دیگری از این گونه سیستم های فایل است که در آن هر فایل به چند بخش تقسیم شده و در تعدادی بلاک که سیستم فایل در اختیار یک فایل قرار می‌دهد، ذخیره می‌شود(منبع). می‌توانیم برای لایه ذخیره و بازیابی از Ceph  استفاده کنیم و برای ایجاد یک نمای هماهنگ از کل سیستم ازAlluxio  بهره ببریم. یعنی ترکیبCeph  وAlluxio  را در کنار سیستم‌های فایل موجود مانند HDFS استفاده کنیم. Alluxio یک لایه کش و نهانگاه هم در حافظه ایجاد می کند که سرعت دستیابی به فایل‌ها در پشت صحنه که می تواندCeph و HDFS باشد را بسیار بهبود می‌بخشد (منبع).هر چند به دلیل مسئولیت‌های بی‌شمار و با توجه به نیاز پروژه امکان راه‌اندازی یک سیستم مدیریت فایل بومی نیز وجود دارد. این سیستم باید با استفاده از لایه‌ی Caching، امکان مقیاس پذیری افقی، پشتیبانی از دیتای ترابایتی و .. را باید فراهم کند.Message brokers:در حال حاضر بین سه گزینه‌ی ActiveMQ، RabbitMQ و کافکا برای Message Brokers، نرم‌افزار RabbitMQ یک پیشنهاد مناسب می‌باشد. از دلایل انتخاب RabbitMQ د منحنی یادگیری کمتر به نسبت کافکا و منابع آموزشی بهتر میتوان نام برد (داشبود تصمیم گیری). مثال استفاده از صف در پایگاه میتوان به ارتباط پایگاه با موتورهای جستجو، ارتباط پایگاه با Object Storage، ارتباط پایگاه با سیستم ذخیره لاگ و .. اشاره کرد. برای گزینه‌ی دوم به دلیل امکان Stream Data برای استفاده برای لاگ و همچنین استفاده از ایندکس به جای حذف پیام،  کافکا نیز گزینه‌ی قابل توجه‌ای می‌باشد.Caching system:برای ذخیره تمامی اطلاعات Read-only سیستم دسترسی‌های کاربر و دیتای چند زبانگی و .. استفاده از دیتابیس In Memory شرکت Redis پیشنهاد می‌شود. این دیتابیس از سیستم Key/Value استفاده می‌کند، همچنین به دلیل ذخیره اطلاعات در رم دسترسی بالا و با هزینه‌ی I/O پایین را فراهم می‌آورد. گزینه‌های دیگر شامل دیتابیس Memcached و استفاده از قابلیت جداول In-Memory دیتابیس MSSQL Server می‌باشد.Audit logging:ذخیره رفتار کاربران بهترین چراغ راه توسعه سیستم در آینده می‌باشد. این امر باید از ابتدای توسعه نرم‌افزار جدی و مهم در نظر گرفته و پیاده سازی مناسبی برای آن انجام شود. استفاده از کافکا و الاستیک این روزها یکی از ترندهای اصلی ذخیره و پردازش لاگ می‌باشد. Exception Log: در حال حاضر استفاده از NLOG به همراه MongoDB و یا الاستیک به همراه Logstash از جمله گزینه‌های معتبر برای ذخیره سازی لاگ در سال 2019 هستند (منبع). گزارش‌های مدیریتیوظیفه‌ی ارائه‌ی گزارش‌های مدیریتی می تواند بر عهده‌ی سیستم Power BI باشد. نرم‌افزار Power BI بر طبق گزارش گارتنر به قدرتمندترین ابزار Self BI تبدیل شده است. در اصل میتوان با استفاده از سیستم Dremio دیتاهای مناسب برای استفاده‌ی تحلیلی بخش‌های مختلف سازمان آماده کرد و وظیفه‌ی نمایش اطلاعات را بر عهده‌ی نرم‌افزار Power BI گذاشت.سیستم مانتورینگسیستم‌های سنتی مانیتورینگ تنها زنده بودن یک پایگاه و یا یک سرویس را بررسی می‌کنند. در سیستم‌های بروزتر علاوه بر لاگ زنده موندن، بررسی SLA تعریف شده، میزان Performance هر قسمت و گزارش‌های آماری خیلی بیشتری ارائه می‌کنند. ترند اصلی در این حوزه استفاده از Prometheus برای مانتورینگ سیستم‌ها و استفاده از Grafana برای سیستم گزارش مانتورینگ می‌باشد.Prometheus with Graphana</description>
                <category>حسین منصوری</category>
                <author>حسین منصوری</author>
                <pubDate>Thu, 04 Jul 2019 10:47:51 +0430</pubDate>
            </item>
                    <item>
                <title>وب اپلیکیشن پیش‌ رونده (PWA)</title>
                <link>https://virgool.io/@mansourihosein/httpsvirgooliomansourihoseinpwa-a5937nkdxgw3</link>
                <description>به طور خلاصه امکان استفاده از بخش بزرگی از ویژگی‌های یک برنامه موبایلی در وب سایت‌ها با استفاده از تکنولوژی PWA فراهم شده است. به طور مشخص‌تر وب سایت ما علاوه بر تمامی امکانات موجود در فضای وب به ویژگی‌های منحصر به فرد اپلیکیشن‌های موبایلی مانند دسترسی به دوربین، لرزش گوشی، موقعیت مکانی کاربر، اعلان از طرف سرور (Push Notification) و غیره دسترسی دارد. کلمه‌ی پیش‌رونده به معنی قابل استفاده بودن وب اپلیکیشن PWA در تمامی سیستم‌عامل‌ها، مرورگرها، گوشی‌های هوشمند و غیره است. مزایای یک وب‌اپلیکیشن· قابلیت اطمینان: کاربران باید امکان استفاده از وب اپلیکیشن را با هر کیفیت اینترنتی داشته باشند. حتی در صورت قطع اینترنت نیز برای کاربران امکان استفاده‌ی آفلاین نیز باید فراهم شده باشد.· سریع بودن: جابه‌جایی بین صفحات وب سایت باید به سادگی و به سرعت انجام شود. همچنین Scroll کردن صفحات نیز باید بدون تاخیر و به طور صحیح انجام بپذیرد. بر طبق آمار گوگل هشتاد درصد کاربر اپلیکیشن‌هایی که بالاتر از سه ثانیه لودشون طول میکشد رو پاک می‌کنند.· استفاده از Splash Screen: برای اینکه کاربر هنگام استفاده از وب اپلیکیشن ما احساس قرابت بیشتری با نرم‌افزارهای بومی موبایلی داشته باشد، داشتن یک Splash Screen توصیه می‌شود.· عدم نیاز به نصب: کاربران برای استفاده از وب اپلیکیشن‌ها نیازی به دانلود و نصب هیچگونه فایل مجزایی ندارند.· بهبود رنک در موتورهای جستجو: اپلیکیشن‌های موبایلی برای موتورهای جستجو قابل ایندکس کردن نیستند و این موتورها به محتوای اپلیکیشن‌های موبایلی دسترسی ندارند. اما در وب اپلیکیشن‌ها کاربران بازدید صفحات وب سایت بالاتر می‌رود و در موتورهای جستجو رنک وب سایت ما افزایش می‌یابد. موتورهای جستجو برای وب‌سایت‌های منطبق با صفحه نمایش موبایلی ارزش بیشتری قائل هستند و در نتایج جستجو آنها رو در رتبه‌های بهتری از دیگر سایت‌ها قرار می‌دهند. در اصل با استفاده از وب اپلیکیشن‌ها بهبود SEO خودکار اتفاق می‌افتد. · بروزرسانی دائمی: تنها پس از زمان اندکی از بروزرسانی وب سایت در سمت سرور تمامی کاربران استفاده کننده از وب اپلیکیشن بدون هزینه‌ی نصب یک فایل چند ده مگابایتی آخرین نسخه‌ را دریافت و استفاده می‌کنند. · عدم نیاز به فروشگاه‎های نصب اپلیکیشن: در حال حاضر فروشگاه بازار در ایران سهم 30 درصدی از فروش داخل اپلیکیشن را برای خود برمیدارد. همچنین دسترسی اپلیکیشن‌های ایرانی در App Store شرکت اپل قطع شده است. در تمامی فروشگاه برنامه‌نویسان موبایل برای قراردادن اپلیکیشن خود نیازمند خرید یک اکانت Developerای هستند. با استفاده از وب اپلیکیشن‌ها تمامی این نگرانی‌ها برطرف می‌شود.ویژگی‌های اصلی PWAدسترسی‌های یک وب‌اپلیکیشن در موبایلوب‌اپلیکیشن‌ها از دسترسی‌های متفاوت و گوناگونی با توجه قابلیت‌های سیستم‌عامل  و مجوزهای کاربر می‌توانند برخوردار شوند: این دسترسی‌ها شامل: استفاده و مدیریت دوربین و میکروفن، امکان اعلان‌های سروری (Push Notification) و اعلان‌های محلی، مدیریت دسترسی، دسترسی به فایل‌ها و دیوایس مرتبط با آن، امکان دریافت و ارسال اطلاعات در پس زمینه، اطلاعات مکانی کاربر، ویبره، بلوتوث، اطلاع از وضعیت شبکه.همچنین در حال حاضر برای وب اپلیکیشن‌ها دسترسی به SMS، مخاطبین گوشی، تقویم، ارتباط با مابقی اپلیکیشن‌های نصب شده فراهم نیست. مزایای PWAمزیت وب‌اپلیکیشن‌ها برای کاربراندر سناریوهای معمول یک کاربر برای استفاده از یک اپلیکیشن موبایل باید وارد فروشگاه (app store) موبایل خود شود، به دنبال برنامه مورد نظر خود گردد، حجمی چند ده مگابایتی برای دانلود اپلیکیشن خود متحمل شود تا در انتها بتواند از اپ مورد نظر خود استفاده کند. با توجه به تحقیقات اخیر بیش از 50 درصد از افراد دارای گوشی هوشمند در یک ماه گذشته هیچ اپلیکیشن جدیدی را دانلود نکرده‌اند. همچنین اکثر استفاده کنندگان از گوشی‌های هوشمند هیچ علاقه‌ای به بروزرسانی اپلیکیشن‌های قدیمی خود ندارند. بنابراین شانس نصب و بروزرسانی یک اپلیکیشن از طرف کاربر بسیار پایین است.نصب اپلیکیشن PWA تنها با چند کلیک امکان پذیر است و کاربر متحمل هیچ هزینه‌ی دانلودی نمی‌شود. همچنین کاربران ما به طور پیوسته و دائمی همیشه از آخرین نسخه‌ی وب سایت را در گوشی هوشمند خود استفاده می‌کنند.نحوه انتخاب پلتفرم متناسبمزیت وب‌اپلیکیشن‌ها برای شرکت‌هاتولید یک برنامه‌ی موبایلی کاری پر هزینه، زمانبر و پیچیده می‌باشد. شرکت‌های نرم‌افزاری برای تولید اپلکیشن‌های موبایلی در حال حاضر باید حداقل دو تیم مجزا برای برنامه‌نویسی اندروید و IOS داشته باشند. فرآیند تحلیل و طراحی و نیازسنجی کاربران در موبایل باید دوباره انجام شود و همچنین ارتباط مناسبی بین برنامه‌نویسان سمت سرور و برنامه‌نویسان سمت موبایل باید برقرار شود. با استفاده از PWA با هزینه‌ای حدود 10 درصد تولید یک نرم‌افزار موبایلی میتوان همان امکانات را در اختیار کاربران موبایلی قرار داد. شرکت‌های مانند اوبر، علی‌بابا، آمازون و ... هم اکنون به طور کامل وب‌سایت‌های خود را به تکنولوژی PWA انطباق داده‌اند. در ایران به دلیل تحریم اپلیکیشن‌های ایرانی توسط Apple راهکار استفاده از PWA نه یک انتخاب بهتر بلکه تنها انتخاب موجود برای شرکت‌ها و کاربران برای استفاده از اپلیکیشن‌های موبایلی در سیستم آیفون می‌باشد. در حال حاضر شرکت‌های مثل اسنپ، دیجی‌کالا و اپلیکیشن لنز ایرانسل و ده‌ها شرکت دیگر از PWA استفاده می‌کنند.همچنین در چند وقت اخیر امکان داشتن برنامه‌های Desktopای با PWA نیز فراهم شده است. حتی مایکروسافت این امکان رو فراهم کرده که این اپلیکیشن‌ها در Store ویندوز نیز اضافه شوند. یعنی با یک بار کد زدن تمامی پلتفرم‌های ممکن رو می توانید پوشش بدهید. غول‌های تکنولوژی و پشتیبانی از وب‌اپلیکیشن‌هاهر کدام از غول‌های دنیای تکنولوژی به دلایل متفاوتی از وب‌اپلیکیشن‌ها پشتیبانی می‌کنند. شرکت‌های سامسونگ و مایکروسافت به دنبال شکستن انحصار گوگل و اپل در حوزه‌ی اپلیکیشن هستند. همچنین شرکت گوگل به دلیل وجود اپلیکیشن‌های موبایلی و عدم دسترسی به محتوای آنها توسط موتور جستجوی خود، پادشاهی خود را در زمینه در خطر می‌بیند. با توسعه هر چه بیشتر وب‌اپلیکیشن‌ها موتور جستجوی گوگل به دیتای بیشتری دسترسی دارد. دیگر شرکت‌ها مانند علی‌بابا و آمازون با استفاده از وب‌اپلیکیشن‌ها کاربران بیشتری را به سمت پلتفرم‌های خود جذب می‌کنند و از این طریق سود سالانه‌ی خود را افزایش داده‌اند. پشتیبانی مرورگرهای مختلف از PWAنیازهای حداقلی برای استفاده از وب‌اپلیکیشن‌ها استفاده از HTTPS: استفاده از اکثر قابلیت‌های اصلی وب اپلیکیشن تنها در صورتی که وب سایت ما از HTTPS استفاده کند امکان‌پذیر است. در اصل بدون رمزنگاری کردن ارتباط بین سرور و اپلیکیشن ما، مرورگر گوشی کاربر به دلیل امنیت پایین ارتباط‌های رمزنگاری نشده امکان استفاده از وب اپلیکیشن‌ها را نمی‌دهد.طراحی واکنش‌گرا (Responsive): برای عملکرد صحیح یک وب اپلیکیشن در گوشی کاربر از ابتدا باید وب‌سایت قابلیت Responsive بودن داشته باشد و گرنه نیاز به باز طراحی ظاهر وب سایت می‌باشد.استفاده از فریمورک‌ها: هر چند تکنولوژی وب اپلیکیشن‌ به کتابخانه و فریمورک خاصی وابسته نیست اما اگر در سمت Front End وب سایت از یکی از تکنولوژی‌های مطرح این حوزه مانند Angular، React و Vue استفاده شده باشد، به دلیل قابلیت‌های توکار این تکنولوژی‎ها هزینه‎ی پیاده‌سازی کاهش پیدا می‌کند. مزایای استفاده از PWAزمانبندی و هزینه‌های پیاده‌سازیچند عامل در زمانبندی و هزینه‌ی پیاده‌سازی وب اپلکیشن‌ها دخیل هستند. اولین موضوع Responsive کردن وب سایت می‌باشد. با توجه به پیچیدگی وب‌سایت و کیفیت کدهای اولیه احتمالا چند هفته پیاده‌سازی این موضوع زمان می‌برد. افزودن کدهای PWA به وب‌سایت کار چندان پیچیده‌ای نیست اما استفاده از هر کدام از قابلیت‌های موجود زمان و هزینه‌ی خود را می‌طلبد. می‌توان در ابتدا تنها کدهای اولیه PWA را به وب‌سایت تزریق کرد و مابقی توسعه‌ها را در فازهای بعدی انجام داد. همچنین قابلیت استفاده آفلاین از اپلیکیشن نیازمند صرف هزینه‌ی جانبی می‌باشد و باید با توجه به سناریوهای مورد نظر انجام شود.</description>
                <category>حسین منصوری</category>
                <author>حسین منصوری</author>
                <pubDate>Sun, 12 May 2019 19:00:24 +0430</pubDate>
            </item>
                    <item>
                <title>راهنمای بروز بودن یک برنامه‌نویس NET. در سال 1398</title>
                <link>https://virgool.io/@mansourihosein/%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C-%D8%A8%D8%B1%D9%88%D8%B2-%D8%A8%D9%88%D8%AF%D9%86-%DB%8C%DA%A9-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87%D9%86%D9%88%DB%8C%D8%B3-net-%D8%AF%D8%B1-%D8%B3%D8%A7%D9%84-1398-zi0wnggli7sp</link>
                <description>همانطور که می‌دونید برنامه‌نویس‌ها برای اینکه توی صنعت نرم‌افزار حرفی برای گفتن داشته باشند همیشه باید خودشون رو بروز نگه دارند. گاهی این بروزرسانی شامل یادگیری ویژگی‌های نسخه‌ی جدید یک تکنولوژی و گاهی شامل یادگیری یک تکنولوژی جدیده. که این دومی سخت‌تر و پیچیده‌تر از یک بروزرسانی ساده است. خوشبختانه برای برنامه‌نویس‌های پلتفرم دات‌نت این کار ساده‌تر و راحت‌تر انجام می‌پذیره چون توی این سال‌ها مایکروسافت به صورت دائمی به توسعه ابزارهای برنامه‌نویسیش پرداخته. این روزها برنامه‌نویس‌ها با پلتفرم دات نت امکان برنامه‌نویسی مبتنی بر کانتینترها، مبتنی بر ابر و نوشتن نرم‌افزارهای cross platform رو دارند. حالا وقتش هست که با هم چندتا قدم برای بروز کردن خودمون توی سال 1398 رو مرور کنیم: اول: چندسالی هست که NET Core. معرفی شده، اگر هنوز باهاش آشنا نیستید وقتش شده که اولین برنامه‌تون را باهاش بنویسید و از مزایای فوق‌العاده‌اش از جمله Cross Platform بودنش استفاده کنید و لذت ببرید. خوبه که به عنوان یک برنامه‌نویس NET. بتونید تفاوت‌های NET Framework. و NET Core. با NET Standard. رو بدونید و با معماری‌های هر کدوم آشنا باشید. از ویژگی‌های جدید NET Core 3.0 هم غافل نشید.یک نگاهی هم به ویژگی‌های جدید NET Framework 4.8. بندازید و اگر چندوقتی هست که خودتون رو بروز نکردید بروزرسانی NET Framework. رو از نسخه 4.5 به بعد و #C  رو از نسخه 7 به بعد دنبال کنید. هر کدوم از نسخه‌های سی شارپ 7، 7.1، 7.2 , .. ویژگی‌های خوب و فوق‌العاده‌ای رو به این زبان اضافه کردند. علاوه بر این‌ها یک نگاه عمیق‌تری هم به NET Standard. داشته باشید. پروژه‌های که برای این پلتفرم نوشته میشن علاوه برای NET Framework. با NET Core. و mono نیز سازگار هستند.دوم: اگر برنامه‌نویس client side هستید و با Windows Form، WPF و Xamarin کار میکنید حتما سراغ NET Core 3.0. برید. برای اولین توی این نسخه از NET. امکان برنامه‌نویسی client side با NET Core. فراهم شده. همچنین با زامارین امکان نوشتن برنامه‌هایی رو دارید که به صورت همزمان بر روی IOS، Android، Mac و .. امکان Publish دارند و کار می‌کنند.سوم: اگر برنامه‌نویس client side هستید و با web و یا smart client کار می‌کنید. باید به اطلاع برسونم که پشتیبانی از web assembly به دات نت اضافه شده و  خوبه که یک نگاهی بهش بندازید. وب اسمبلی امکان استفاده از کدهای c و ++c رو توی مرورگر برای ما فراهم میکنه. هر چند که در حال حاضر جاوااسکریپت تقریبا تمام نیازهامون رو پوشش میده اما برای کارهای سریع‌تر مثل بازی‌ها، موتورهای فیزیک و .. جای خالی یک زبان سریعتر احساس می‌شد. همچنین امکان استفاده از Blazor که  UI فریمورک wasm رو دارید.چهارم: اگر برنامه‌نویس سمت سرور هستید باید بدونید که کانتینترها این روزها ترند اصلی این حوزه هستند. امکان استفاده داکر، Kubernetes، آمازون AWS، مایکروسافت Azure و مابقی پلتفرم‌های ابری توی VS 2019  و NET. Core به خوبی فراهم شده. این روزها توسعه یک وب سایت بدون از استفاده از این ابزارها تقریبا دیگه بی معنیه.پنجم: علاوه بر اینکه یک برنامه‌نویس خوب باید تکنولوژی‌های روز رو بشناسه و به خوبی از اونها استفاده کنه باید مهارت‌های شناخت بازار و ارتباط خوب با مشتریان رو یاد بگیره. همچنین با متدولوژی‌های توسعه‌ی نرم‌افزار از جمله روش اسکرام باید آشنا باشه. در نهایت یادگیری DevOps رو فراموش نکنید که بدون استفاده از اون توسعه، نگهداری و بروزرسانی یک نرم‌افزار کار سخت و دشواری شده.ششم: چندوقتی هست که مایکروسافت ابزارهای AIاش در قالب کتابخانه ML.NET در اختیار برنامه‌نویس‌ها گذاشته. به تازگی نسخه ML.NET 1.0 انتشار پیدا کرده. با استفاده از این کتابخانه پروژه‌هایی رو به سادگی می‌تونید توسعه بدید که بدون اون باید مدت‌های زیادی وقت براش صرف می‌کردید.ترجمه‌ی آزاد از منبع همراه با تلخیص و تصرف.</description>
                <category>حسین منصوری</category>
                <author>حسین منصوری</author>
                <pubDate>Thu, 11 Apr 2019 16:51:59 +0430</pubDate>
            </item>
                    <item>
                <title>انواع Map در Power BI</title>
                <link>https://virgool.io/dataio/%D8%A7%D9%86%D9%88%D8%A7%D8%B9-%D9%86%D9%82%D8%B4%D9%87-%D8%AF%D8%B1-power-bi-hno011febbei</link>
                <description>توی چند روز گذشته توی شرکت سارین هوشمند قرار شد که یک مروری بر انواع Map توی Power BI داشته باشم. دوست داشتم خلاصه‌ای از این گزارش رو با هم اینجا مرور کنیم. در Power BI راه‌های متفاوتی برای نشون دادن نقشه وجود داره. تمامی این نقشه‌ها به جز اینکه از از فایل‌های SVG‌ استفاده کنید، از نقشه Bing‌ کمک می‌گیرند. به همین دلیل هنگام مشاهده نقشه در Power BI کاربر باید آنلاین باشد.نقشه  Bubble Mapاولین نقشه توی Power BI که با هم بررسی می‌کنیم نقشه Bubble Map‌ هست. این نقشه جز اولین نقشه‌هایی هست که در Power BI‌ اضافه شد. اندازه‌های حباب‌ها روی این نقشه بر اساس سایز مقادیر ورودیه و در نسخه های اخیر Power BI‌ میشه اندازه حباب‌ها رو تنظیم کرد. همچنین مثل همه‌ی نقشه‌های آنلاین با بزرگنمایی نقشه اطلاعات بیشتری به کاربر نشون داده میشه. این نقشه از موتور جستجوی Bing برای نمایش نقشه ها استفاده می کنه.تصویر سمت چپ: دیتای فرضی بر اساس استان به همراه رنگبندی بر اساس استان  تصویر سمت راست: دیتای فرضی بر اساس استان به همراه رنگبندی بر اساس دسته بندی مقادیر نقشه  Filled Map این نقشه مشابه نقشه‌ی Bubble‌ هست با این تفاوت که به جای استفاده از حباب‌ها اون منطقه رو به طور کامل نقاشی میکنه. ترتیب رنگها به وسیله‌ی کاربر توی این نقشه قابل کنترله. این نقشه نیز از موتور جستجوی Bing‌ برای نمایش اطلاعات استفاده میکنه.تصویر سمت چپ: دیتای فرضی بر اساس استان به همراه رنگبندی بر اساس استان  تصویر سمت راست: دیتای فرضی بر اساس استان به همراه رنگبندی بر اساس دسته بندی مقادیر نقشه  Shape Mapاین نقشه جز نقشه های اخیرا اضافه شده در Power BI هست. از نظر ظاهری این نقشه شبیه نقشه‌ی Filled Map هست اما در واقع به جای استفاده از نقشه های Bing‌ یک فایل آماده رو رنگ بندی میکنه. این نقشه هنوز قابل استفاده در Power BI‌به صورت افلاین نیست. به نظر میرسه پس از اضافه شدن این نقشه به Power BI‌ به صورت کامل یکی از بهترین نقشه‌ها برای نشون دادن اطلاعات به صورت استانه. در صورتی که امکان استفاده از Custom Mapهای دیگه هم وجود داشته باشه کار ارائه اطلاعات رو به شدت ساده میکنه.تصویر سمت چپ: دیتای فرضی بر اساس استان به همراه رنگبندی بر اساس استان.  تصویر سمت راست: دیتای فرضی بر اساس استان به همراه رنگبندی بر اساس دسته بندی مقادیر نقشه  ArcGIS Mapیکی از کامل‌ترین راه‌های نشون نقشه استفاده از نقشه های ArcGIS‌هست. Power BI  امکان نشون دادن نقشه به صورت ArcGIS  رو برای کاربرانش فراهم کرده. به نظر میرسه دسترسی خوبی هم به لایه‌بندی‌های مختلف این قبیل نقشه‌ها نیز فراهم شده. دیتای نمونه ایالت فلوریدا به همراه لایه‌های مختلف در نقشه نقشه  Globe Mapاین نقشه امکان نمایش اطلاعات رو به صورت سه بعدی بر روی نقشه برای کاربران فراهم میکنه. این نقشه جز نقشه‌های پیش‌فرض Power BI‌ نیست و باید این Custom Visual‌ رو جداگانه نصب کنید. یکی از اشکالات این نقشه شخصی سازی به شدت محدود اون هست اما از زیبایی های بصری این نقشه نیمشه گذشت.دیتای فرضی بر اساس میزان فروش هر نقطه
نقشه  Heat Mapیکی از نقشه‌های مفید برای نشون دادن اطلاعات در Power BI‌ نقشه Heat Map هست. این نقشه پراکندگی اطلاعات رو به وسیله‌ی نقشه‌های حرارتی با رنگ‌‎بندی به کاربران نشون میده. موقعی که پراکندگی دیتا داریم و میخواهیم اون رو روی نقشه مشخص کنیم،‌ Heat Map‌ یک گزینه‌ی عالیه.دیتای فرضی بر اساس پراکندگی دیتا نقشه  Flow Mapبرای نشون دادن حرکت وسایل نقلیه، کشتی، هواپیما و یا هر حرکت دیگه‌ای نقشه Flow Map‌ یک انتخاب مناسبه. این Visual‌ جریان حرکتی موجودیت‌ها رو به خوبی نشون میده.دیتای فرضی بر اساس ارسال محموله از هوا و زمین نقشه  SVG Mapدر نهایت همیشه به این احتیاج پیدا می‌کنیم که نقشه‌ها رو به صورت Offline‌ و بدون استفاده از اینترنت به کاربرانمون نمایش بدیم. حتی گاهی‌ها وقت‌ها نیاز پیدا می‌کنیم که نقشه یک ساختمون و یا هر نقشه‌ی دیگه رو به کاربرانمون نمایش بدیم. استفاده از نقشه‌های SVG‌ با استفاده از Custom Visual ای به نام Synoptic Panel by OKViz‌ فراهم شده. شما امکان این رو دارید که هر نقشه‌ای رو در سایت synoptic.design آپلود کنید و پس از مشخص نمودن محل‌های مورد استفاده در نقشه، یک خروجی مناسب Power BI‌ بگیرید و اون نقشه رو استفاده کنید. دیتای فرضی یک طبقه از ساختمان بر اساس طرح مدل شده نمونه نقشه ایراندر تصویر آخر هم نقشه شهرهای کشورمون رو با هم می‌بینیم که با استفاده از اطلاعات طول و عرض جغرافیایی توی Power BI‌ نمایش داده شده.دیتای مختصات شهرهای ایران به همراه چند شهر دیگه در خاورمیانه امیدوارم از خوندن این نوشته لذت برده باشید.</description>
                <category>حسین منصوری</category>
                <author>حسین منصوری</author>
                <pubDate>Fri, 19 Oct 2018 23:28:37 +0330</pubDate>
            </item>
            </channel>
</rss>