<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>پست‌های انتشارات Just for Fun</title>
        <link>https://virgool.io/justforfun/feed</link>
        <description>Just for fun</description>
        <language>fa</language>
        <pubDate>2026-06-16 14:55:46</pubDate>
        <image>
            <url>https://files.virgool.io/upload/publication/x6wgwxnlx8kj/3nvc8x.png</url>
            <title>Just for Fun</title>
            <link>https://virgool.io/justforfun</link>
        </image>

                    <item>
                <title>آموزش Sass به همراه مثال (قسمت دوم)</title>
                <link>https://virgool.io/justforfun/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-sass-%D8%A8%D9%87-%D9%87%D9%85%D8%B1%D8%A7%D9%87-%D9%85%D8%AB%D8%A7%D9%84-%D9%82%D8%B3%D9%85%D8%AA-%D8%AF%D9%88%D9%85-vrwmuqpvhprf</link>
                <description>تو این پارت قراره نحوه استفاده کردن از sass رو بهتون آموزش بدم:تو در تویی (Nesting)همونطور که میدونید ما توی css وقتی میخوایم استایل دهی کنیم یک id یا class یا تگ رو انتخاب میکنیم و توی بلوک خودش بهش استایل میدیم ولی در sass ما میتونیم بصورت تو در تو استایل بدیم که توی کد زیر نشونتون میدم باید چیکار کنید:.items { 
    display: flex;       
    flex-wrap: wrap;

    .item { 
       font-size:
     }
}تو این مثال کلاس items استایل هاشو گرفته و کلاس item که داخل کلاس items بصورت child وجود داره nested شده و استایل های ما روش اعمال میشهوقتی بخوایم از سودو المنت ها در sass استفاده کنیم باید بصورت زیر عمل کنیم:.item {      
    background-color: red;   
   
    &amp;:hover {         
      background-color: green;      
     } 
}تو این مثال گفتم وقتی item:hover شد رنگ پس زمینه سبز بشهایجاد متغیر  (Variables)با استفاده از متغیر شما می‌توانید مقداری را ذخیره کرده و بعدا بارها از آن در مکان‌های مختلف استفاده کنید، برای تعریف کردن متغیر در sass باید در ابتدای نام متغیر سیمبل $ رو قرار داده و بعدش اسم متغیر رو مینویسیم،  به مثال زیر توجه کنید:$primary-color: red;
$my-font-size: 20px;متغیرهای بالا رو تعریف کردیم وقتی بخوایم استفادشون کنیم مثل زیر عمل میکنیم:background-color: $primary-color;
font-size: $my-font-size;اینجا رنگ بکگراند قرمز میشه و سایز فونتمون 20 پیکسل قرار میگیرهمیکسین (Mixin)خیلی از قطعه کدها در css در مکان‌های مختلفی تکرار می‌شوند و هیچ راهی برای جلوگیری از تکرار آنها نداریم. اما در Sass این مشکل به کمک mixin حل شده، با استفاده از mixin می‌توان یک الگو ایجاد کرده و از آن الگو چندین در برنامه استفاده کرد، نحوه تعریف از mixin توی sass بصورت زیره:@mixin flexLayout {
    display: flex;
    justify-content: center;
    align-items: center;
 }اینجا گفتیم ما یه mixin داریم به اسم flexLayout که استایل های توش با هم یه جا نوشته شدنحالا اگه بخوای از mixin بالا استفاده کنیم باید کد زیر رو بنویسیم:.logo { 
      @include flexLayout;
  }در این مرحله گفتیم کلاس logo شامل mixin ای به اسم flexLayout باشه، اینجوری ما بجای اینکه 3 تا استایل مختلف رو توی کلاس logo بنویسیم یک بار از mixin اون استفاده میکنیم و کاملا قابلیت اینو داره که چنیدن بار استفاده بشهامیدوارم این قسمت هم مورد استفادتون قرار گرفته باشه</description>
                <category>Just for Fun</category>
                <author>Ali</author>
                <pubDate>Wed, 23 Jun 2021 13:16:56 +0430</pubDate>
            </item>
                    <item>
                <title>وب پک چیست و چرا باید از آن استفاده کنیم (قسمت دوم)</title>
                <link>https://virgool.io/justforfun/what-is-webpack-and-why-use-it-part-2-adok7c6dxpvo</link>
                <description>خب جلسه قبلی مزایای وب پک رو با همدیگه دیدیم و یه اپ ساده نوشتیم و از وب پک توش استفاده کردیم.وب پک چیست و چرا باید از آن استفاده کنیم ؟ساختن فایل تنظیمات برای وب پکگفتیم که وب پک کلی تنظیمات داره که میتونیم باهاش روی وب پک تسلط داشته باشیم و بهش بگیم دقیقا چجوری فایل ها رو برای ما باندل کنه. این جلسه قراره با همدیگه روی این تنظیمات یه نگاهی داشته باشیم.برای شروع اول فایل های جلسه قبل رو روی سیستم کلون کنیدhttps://github.com/alikomijani/webpack-demoخب برید داخل روت اصلی و یه فایل با اسم webpack.config.js ایجاد کنید. و خطوط زیر رو داخلش بنویسیدconst path = require(&#039;path&#039;);
module.exports = {
  entry: &#039;./src/index.js&#039;,
  output: {
    filename: &#039;main.js&#039;,
    path: path.resolve(__dirname, &#039;dist&#039;),
  },
};خط اول داره یه کتابخونه رو ایمپورت میکنه که کارش دسترسی به دایکتوری سیستم هست تو خط بعدی داریم تنظیمات وب پک رو اکسپورت میگیریم. تو خط بعد داریم میگیم ورودی وب پک از کدوم فایل هست و در خطوط بعدی هم داریم مشخصات فایل خرجی یا باندل شده رو به وب پک میدیماگه دقت کرده باشید این همون تنظیمات پیشفرض وب پک هست که در جلسه قبلی باهاش خروجی گرفتیم. با همین توظیحاتی که من دادم احتمالا الان دیگه باید بدونید چجوری اسم فولدری که خرجی ها داخلش ساخته میشه رو عوض کرد یا اینکه اسم فایل ورردی و خرجی رو چطور تعیین کرد.خب حالا در خط فرمان دستور زیر رو وارد کنید.$ npx webpack --config webpack.config.jsنکته به پارامتر آخر دقت کنید ما داریم با سوویچ config به وب پک میگیم که فایل تنظیمات تو اسمش چیه خب تو این مثال به این سوئیچ احتیاجی نداریم چون اسم پیشفرض فایل تنظیمات همین اسمی هست که الان روی فایل گذاشتیم ولی من خواستم این نکته رو آموزش بدم که اگه مثلا بخوایم چند نوع خروجی متفاوت بگیریم میتونیم چند تا فایل تنظیمات با اسم های مختلف بسازیم و براحتی به وب پک بگیم خروجی رو با کدوم تنظیمات و چطور بسازه.(قاعدتا حتی میتونید تو پوشه های مختلف خروجی بگیرید. مثلا یه نسخه مینیفای شده و یه نسخه غیره فشرده.)ایجاد دستور میان بر در نودخب وقتی پروژه بزرگ و بزرگتر میشه ما ممکنه بخوایم نسخه های مختلفی رو خرجی بگیریم ویا توسعه بدیم و یا حتی تست های مختلفی اجرا کنیم. هر کدوم از این عملیات ها مستلزم اینه شما یه سری دستور تو خط فرمان با سوئیچ های خاص خودش بزنید که خب هم زمان بره هم اگه بخواید پروژه رو به اشتراک بزاید باید این دستورات و سوئیچ ها رو با بقیه برنامه نویس ها هم به اشتراک بزارید. نود برای این مسئله یه راه حل تدارک دیده که اونم npm scripts هست. برای اینکه اولین اسکریپت خودمون رو بنویسیم برید و فایل pakage.json رو باز کنید {
   &amp;quotname&amp;quot: &amp;quotwebpack-demo&amp;quot,
   &amp;quotversion&amp;quot: &amp;quot1.0.0&amp;quot,
   &amp;quotdescription&amp;quot: &amp;quot&amp;quot,
   &amp;quotprivate&amp;quot: true,
   &amp;quotscripts&amp;quot: {
-    &amp;quottest&amp;quot: &amp;quotecho \&amp;quotError: no test specified\&amp;quot &amp;&amp; exit 1&amp;quot
+    &amp;quotbuild&amp;quot: &amp;quotwebpack&amp;quot
   },
   &amp;quotkeywords&amp;quot: [],
   &amp;quotauthor&amp;quot: &amp;quot&amp;quot,
   &amp;quotlicense&amp;quot: &amp;quotISC&amp;quot,
   &amp;quotdevDependencies&amp;quot: {
     &amp;quotwebpack&amp;quot: &amp;quot^5.4.0&amp;quot,
     &amp;quotwebpack-cli&amp;quot: &amp;quot^4.2.0&amp;quot
   },
   &amp;quotdependencies&amp;quot: {
     &amp;quotlodash&amp;quot: &amp;quot^4.17.20&amp;quot
   }
 }خطی که اول − داره رو پاک و خطی که + داره رو اضافه کنید(از این به بعد این قراردادمون هست) حالا کافیه تو خط فرمان دستور ٰ$ npm run buildرو اجرا کنیم تا خروجی ساخته بشه.امیدوارم از این قسمت هم لذت برده باشید. تو قسمت بعدی نحوه بارگذاری استایل ها و عکس ها رو بهتون آموزش میدم.</description>
                <category>Just for Fun</category>
                <author>علی کمیجانی</author>
                <pubDate>Thu, 17 Jun 2021 00:12:41 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش Sass به همراه مثال (قسمت اول)</title>
                <link>https://virgool.io/justforfun/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-sass-%D8%A8%D9%87-%D9%87%D9%85%D8%B1%D8%A7%D9%87-%D9%85%D8%AB%D8%A7%D9%84-%D9%82%D8%B3%D9%85%D8%AA-%D8%A7%D9%88%D9%84-nuurzje6c5ol</link>
                <description>شاید اسمشو شنیده باشید ولی ندونید برای چی استفاده میشه، برا همین میخوام تو این مقاله بهش بپردازم. Sass یه پیش پردازنده برای Css هست، در واقع Sass یسری امکانات اضافی و پرفورمنس بهتری رو برای ما به ارمغان میاره و میشه گفت Sass  محبوب ترین و پر کاربردترین پیش پردازنده برای Css هست.برای اضافه کردن Sass  به پروژه کافیه افزونه کامپایل کدهای Sass به Css رو توی کد ادیتورمون نصب کنیم و به جای پسوند css. برای استایل هامون از پسوند scss. یا sass. استفاده کنیم.تفاوت بین پسوندهای scss. و sass. تو سینتکسشونه و در عمل هیچ تفاوتی با هم ندارن، توی sass از {} و... استفاده نمیشه ولی توی scss  از مواردی که در Css خام استفاده میکنیم استفاده میشه و خوانایی راحت تری داره، برای مثال های این مقاله هم از سینتکس scss  استفاده میکنیم.حالا بریم نحوه نصب scss روی کد ادیتور vscode  و همچنین نحوه کامپایل کردن کدهای scss  به css  رو بهتون توضیح بدم.اول افزونه های sass  و live sass compiler  رو بر روی vscode  خودمون نصب میکنیم و توی vscode  مون یه قسمتی فعال میشه به اسم watch sass  سپس باید بریم توی setting  کد ادیتورمون و برگه setting.json  رو باز میکنیم و سپس در آخر این تنظیمات کد زیر رو در انتها قرار میدیم:&amp;quotliveSassCompile.settings.formats&amp;quot: [{
&amp;quotformat&amp;quot: &amp;quotexpanded&amp;quot,
&amp;quotextensionName&amp;quot: &amp;quot.css&amp;quot,
&amp;quotsavePath&amp;quot: &amp;quot./css&amp;quot
}]معنی این کد این میشه که فرمتی که قراره css هامون ذخیره بشه شبیه همون فایلای css  خودمونه و بصورت css. ذخیره میشه و محل ذخیره هم در قسمت  savePath مشخص کردیم که قابل تغییره، سپس برای اینکه بتونیم کدهای scss خودمون رو به css تبدیل کنیم، کدهایی که تو scss رو زدیم بعدش روی watch sass میزنیم و بصورت اتوماتیک کدهای scss مون در فایل css ای که محل ذخیره شو مشخص کردیم کامپایل  میشه و ما توی html مون ادرس اون فایل css رو link میکنیم و تغییرات روی استیال سایتمون اعمال میش شوند. در قسمت بعدی نحوه کد زدن با sass رو بهتون آموزش میدم.</description>
                <category>Just for Fun</category>
                <author>Ali</author>
                <pubDate>Wed, 16 Jun 2021 12:24:27 +0430</pubDate>
            </item>
                    <item>
                <title>وب پک چیست و چرا باید از آن استفاده کنیم؟ (قسمت اول)</title>
                <link>https://virgool.io/justforfun/%D9%88%D8%A8-%D9%BE%DA%A9-%DA%86%DB%8C%D8%B3%D8%AA-%D9%88-%DA%86%D8%B1%D8%A7-%D8%A8%D8%A7%DB%8C%D8%AF-%D8%A7%D8%B2-%D8%A2%D9%86-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%DA%A9%D9%86%DB%8C%D9%85-fawjsbvndkza</link>
                <description>سلام من علی کمیجانی هستم بیش از سه ساله که به صورت حرفه ای دارم کد میزنم و یک سالی هست که دارم دانش خودم رو توسط تدریس با بقیه تقسیم میکنم.خب بریم سر اصل مطلب؛ همیشه سرکلاس وقتی میخوام یه چیز جدید به بچه ها بگم سوال اولی که میپرسن اینه که این چیه و به چه درد میخوره و چرا باید ازش استفاده کنیم:) منم برای اینکه به این سوال بچه ها پاسخ بدم اول براشون یه نیاز ایجاد میکنم و بعدا توضیح میدم.یه نکته بگم  اگه با نود جی اس آشنایی ندارید این مقاله بدردتون نمیخوره، اگه دوست دارین با استفاده از نود یه پروژه کوچیک با همدیگه بنویسیم همینجا تو نظرات اعلام کنید که تو مقالات بعدی بریم سراغش.خب حتما براتون پیش اومده که وقتی دارین توی فرانت کد میزنین کلی کتابخونه رو خودتون ایمپورت کرده باشین و خب بدلیل تحریم ها و یا پرفورمنس یا هرعلت دیگه ای مجبور میشین اون کتابخونه ها رو دانلود کنید و از لوکال خودتون وارد کنید. تا حالا براتون پیش اومده که یه اسکریپتی رو اضافه کنین که توش از یه کتابخونه مثل جی کوئری استفاده کردین ولی چون اسکریپتتون رو بالا از ایمپورت جی کوئری ایمپورت کرده بودید کدتون اجرا نشده و خطا گرفتین؟ یا مرورگر کد جاوا اسکریپتی که نوشتین رو کش کرده و تغییراتی که رو کدتون اعمال کردین رو لود نمیکنه؟تاحالا شده از یه قابلیت پیشرفته در جاوا اسکریپت بخواین استفاده کنید ولی نگران این باشید که آیا همه مرورگرها این قابلیت رو ساپورت میکنن یا نه؟در واقع هرچقدر پروژه بزرگتر میشه مدیریت این مسائل سختر میشه شاید برای تک تک این مسائل راه حل های خوبی وجود داشته باشه ولی چقدر خوب میشد که یه راه حل جامع وجود داشت که این مشکلات اصلا بوجود نمیامد. خب خبر خوب اینکه این راه حل وجود داره و اسمش وب پک (webpack) هست.کار و‌ب‌پک باندل کردن هست و تمامی فایل های شما از قبیل استایل‌ها ، عکس‌ها ، فونت‌ها و  مهمتر از همه فایل‌های جاوااسکریپت شما رو مدیریت میکنه. یه خوبی دیگه‌ای هم که وب‌پک داره اینه که از پلاگین‌ها پشتیبانی میکنه و کارهای مثل مینیفای کردن یا تبدیل فایل‌های sass به css رو میتونه براتون به راحتی انجام بده.خب اگه از حرف زدن خسته شدین بهتر بریم سراغ کد و کمی دست به کد بشیم خب مراحل زیر رو با همدیگه انجام میدیمmkdir webpack-demo
cd webpack-demo
npm init -y
npm install webpack webpack-cli --save-devخط اول یه پوشه با اسم webpack-demo میسازه اگه ویندوزی هستید نترسید چیزخاصی نیست یه راست کلیک کنید و یه پوشه (folder) با این اسم هرجایی که دوست داشتید بسازید:) تو خط دوم میریم داخل پوشه و خط فرمان از این به بعد مقصد دستوراتش این پوشه اس. خط بعدی یه پروژه نود رو استارت میکنیم -y میگه ازم سوال نکن و همه سوالات رو خودت پاسخ پیشفرض بده برای وقتی که حال ندارید خوبه:)) خط آخر هم webpack و webpack-cli رو به عنوان کتابخونه های مورد نیاز برای توسعه برای پروژه نصب میکنه. خب حالا توی پوشمون یه فایل package.json داریم و یه پوشه node_module که کتابخونه های نود توش نصب شده.خب توی همین پوشه webpack-demo یه فایل درست کنید به اسم index.html و یه پوشه جدید به اسم src و داخل این پوشه جدید یه فایل index.js بسازید ساختار پوشمون باید این شکلی شده باشه webpack-demo
|-package.json
|-index.html
|-src
  |-index.jsحالا داخل فایل index.html کد های زیر رو اضافه میکنیم&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&amp;quotutf-8&amp;quot /&gt;
&lt;title&gt;Getting Started&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id=&#039;root&#039;&gt;&lt;/div&gt;
&lt;script
src=&amp;quothttps://code.jquery.com/jquery-3.6.0.min.js&amp;quot integrity=&amp;quotsha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=&amp;quot crossorigin=&amp;quotanonymous&amp;quot&gt;
&lt;script src=&amp;quot./src/index.js&amp;quot&gt;
&lt;/body&gt;
&lt;/html&gt;حالا داخل فایل index.js کد های زیر رو اضافه میکنیم$(&#039;#root&#039;).html(&#039;hello word&#039;)خب کل کاری که ما کردیم این بود که یه div با ایدی root ساخت و محتویاتش رو با جی کوئری تغییر دادیم تا اینجا هیچ چیز جدید وجود نداشت اما مشکل این شیوه کد زنی چیه؟داخل کد  index.js ما گفته نشده که این فایل به وجود جی کوئری وابسته اس اگه فایل جی کوئری لود نشه و یا حتی ترتیبش اشتباه باشه و زیر اسکریپت ما ایمپورت بشه کد ما کار نمیکنهاگه ما کتابخونه ای رو وارد کنیم ولی به هردلیلی ازش استفاده نکنیم مرورگر متوجه نمیشه و کماکان اون رو لود میکنهخب بریم ادامه ببینیم چجوری میشه این مشکلات رو با وب پک حل کرد اول بیاید یه پوشه با نام dist توی همون پوشه webpack-demo بسازید و فایل index.html رو منتقل کنید به اونجا و داخل index.html رو اصلاح کنید:&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&amp;quotutf-8&amp;quot /&gt;
&lt;title&gt;Getting Started&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id=&#039;root&#039;&gt;&lt;/div&gt;
&lt;script src=&amp;quotmain.js&amp;quot&gt;
&lt;/body&gt;
&lt;/html&gt;ما الان اسکریپت جی کوئری رو پاک کردیم و اسکریپت خودمون رو هم اسمش رو عوض کردیم ولی چرا؟ چون قرار اسکریپت جدید رو وب پک برامون بسازه یکم صبر کنید:)حالا توی همون خط فرمان قبلی بزنید npm i jquery --saveبا این کار پکیج منیجر میاد و جی کوئری رو روی سیستم نصب میکنهحالا فایل index.js رو باز کنید و کد زیر رو به اولش اضافه کنیدimport $ from &#039;jquery&#039;حالا نوبت جادوگری وب پک هست توی خط فرمان بزنید  npx webpackاین خط باعث میشه وب پک قایل نهایی رو بسازه حالا یه نگاه به پوشه dist بندازید. میبینید که یه فایل main.js به پروژه اضافه شده که اگه بازش کنید کل سورس جی کوئری به علاوه کد شما داخلش هست.خب این یه استارت ساده بود وب پک کلی امکانات داره و کلی تنظیمات که یاد دادن همه این ها تو یه مقاله نمیگنجه فعلا برای این مقاله در همین حد کافیه تو مقاله بعدی قول میدم کمتر حرف بزنم و بیشتر کد بزنیم.خوشحال میشم در مورد اولین نوشته من نظر بدین اگه سوالی هم داشتید همینجا ازم بپرسید.تو قسمت بعدی یاد میگریم چجوری وب پک رو کانفیگ کنیم چجوری استایل ها رو استفاده کنیم از عکس ها چجوری استفاده کنیم و فونت ها رو هم لود کنیمسعی میکنم فایلهای هر پروژه رو هم روی گیت بزارم و آدرسش رو آخر مقاله بزارم تا اگه مشکلی بود بتونید کد رو ببینید. دوستون دارم فعلا خدانگهدار.https://github.com/alikomijani/webpack-demoوب پک چیست و چرا باید از آن استفاده کنیم؟ (قسمت دوم)</description>
                <category>Just for Fun</category>
                <author>علی کمیجانی</author>
                <pubDate>Tue, 15 Jun 2021 00:56:16 +0430</pubDate>
            </item>
                    <item>
                <title>ریجِکس (RegEx) در جاوا اسکریپت بهمراه مثال</title>
                <link>https://virgool.io/justforfun/%D8%B1%DB%8C%D8%AC%D9%90%DA%A9%D8%B3-regex-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-%D8%A8%D9%87%D9%85%D8%B1%D8%A7%D9%87-%D9%85%D8%AB%D8%A7%D9%84-fuzcvzmdalno</link>
                <description>ریجکس مخفف عبارت Regular Expression که ترجمه فارسی آن عبارات با قاعده می باشد. ترجمه فارسی ریجکس زیاد کمک خاصی به شما نمی کنه در نتیجه بهتره سراغ مثال های عملی بریم.یک لحظه تصور کنید که دارید برنامه ای می‌نویسید که کاربر می‌خواهد نام کاربری خود را انتخاب کند که داری حروف، کاراکتر و اعداد باشد. همچنین تعداد کاراکترهای کاربر محدود باشد. برای اعتبار سنجی این نام کاربری باید از ریجکس استفاده کرد.برای اعتبار سنجی فرم ها در فرانت بهترین روشی که میتوان استفاده کرد ریجکس می باشد، با چند مثال عملی ریجکس را بصورت مقدماتی براتون توضیح میدم.در ریجکس لازمه یک الگو (pattern) تعریف شود که جستجو شود. در این الگو برخی حرف‌ها (متا کاراکترها) معنای خاصی دارند.سینتکس ریجکس بصورت // بین دو اسلش می باشد و برای نوشتن pattern ی که باهاش میشه اعتبار سنجی رو انجام داد باید داخل // نوشته بشه، با چن مثال بصورت عملی بهتون نشون میدم که باید چیکار کنید.let str = &amp;quot enigma love&amp;quot
let pattern = /^ enigma/
pattern.test(str)تو این مثال علامت ^ داخل // نشون میده که اگه کلمه enigma در اول اون اینپوتی که داریم اعتبار سنجی میکنیم بیاد به ما true برمیگردونه و ما با همین میتونیم احراز هویت انجام بدیم. (برای اعتبار سنجی pattern از متد test استفاده کردیم)✔پاسخ تست مثال ها true استlet str = &amp;quotlove enigma&amp;quot
let pattern = /enigma$/
pattern.test(str)تو این مثال علامت $ داخل // نشون میده که اگه کلمه enigma در آخر اون اینپوتی که داریم اعتبار سنجی میکنیم بیاد به ما true برمیگردونهlet str = &amp;quot enigma 2035&amp;quot
let pattern = /^enigma+\s+\d/
pattern.test(str)تو این مثال بعد از کلمه enigma حتما باید یه sapce بیاد و بعدش حتما عدد بیاد، s\ متاکاراکتر space می باشد و d\ متا کاراکتر عدد می باشد و بوسیله + بهم دیگه وصل میشنlet str = &amp;quot enigma22323&amp;quot
let pattern = /^enigma+\S+\D/
pattern.test(str)بعد از اینکه کلمه enigma  اومد بعدش نباید space و عدد بیاد، متاکاراکتر S\ نماد نیومدن space و D\ نماد نیومدن عدد هستش، تو این مثال به ما false  برگردونده میشه چون بعد از enigma  عدد اومدهlet str = &amp;quotenigma1&amp;quot
let pattern = /^enigma+\w/
pattern.test(str)بعد از اینکه کلمه enigma  اومد بعدش حتما باید یه کاراکتر حرف یا عدد یا سیمبول بیاد و اجباریهlet str = &amp;quothi enigma&amp;quot
let pattern = /\benigma/
pattern.test(str)شروع enigma  در هر جایی باشه true  برمیگردونهlet str = &amp;quotenigma@@&amp;quot
let pattern = /^enigma\@/
pattern.test(str)بعد از enigma حتما باید @ بیاد(همچنین میشه از ! # $ % ^ &amp; * علائم هم استفاده کرد)let str = &amp;quotenigmah&amp;quot
let pattern = /^enigma+h/
pattern.test(str)بعد از کلمه enigma حداقل باید یک بار کاراکتر h بیادlet str = &amp;quotenigmapp&amp;quot
let pattern = /^enigma+p{2}/
pattern.test(str)بعد از کلمه enigma حداقل باید دوبار کاراکتر p  بیادlet str = &amp;quotenigma1&amp;quot
let pattern = /[bC1]/
pattern.test(str)در داخل [ ] میتوان انواع از a  تا z  و 0 تا 9 و A تا Z رو قرار داد، در مثال بالا اگر حتی یکی از کاراکترهای b یا C  یا 1 بیاد  true  برگردونده میشهlet str = &amp;quotenigma1&amp;quot
let pattern = /[a-z0-9]/
pattern.test(str)از کاراکتر a  تا z و یا 0 تا 9 یکیشون هم بیاد true برمیگردونهlet str = &amp;quotenigma1&amp;quot 
let pattern = /[a-z]+[0-9]/
pattern.test(str)طبق این pattern  هم کاراکتر از a  تا z  اجباری هستش هم از عدد 0 تا 9 در غیر این صورت false برمیگردونهlet email = &#039;enigmateam.co@gmail.com&#039;
let pattern = /[a-z0-9]+@+[a-z]+\.+[a-z]/
pattern.test(email)تو این مثال اخر یه ایمیل ساده رو validate کردم، اولش گفته شده از کاراکتر a  تا z  یا 0  تا 9 رو میتونید وارد کنید بعد از اون حتما باید @  رو وارد کنید، بعدش از کاراکتر a تا z  سپس دات . و بعد از اون از کاراکتر a  تا z رو کاربر باید وارد کنهحالا وقتشه دو مورد از بهترین ولیدیشن هایی که میشه با ریجکس انجام داد و میتونید توی فرم هاتون استفاده کنید رو براتون مینویسم:Email Validation:/^(([^&lt;&gt;()\[\]\\.,;:\s@&amp;quot]+(\.[^&lt;&gt;()\[\]\\.,;:\s@&amp;quot]+)*)|(&amp;quot.+&amp;quot))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/Iran Mobile Number Validation:/(0|\+98)?([ ]|,|-|[()]){0,2}9[1|2|3|4]([ ]|,|-|[()]){0,2}(?:[0-9]([ ]|,|-|[()]){0,2}){8}/اینم یه سایت عالی برای Generate کردن ریجکس :https://regexr.comامیدوارم با نوشتن این مقاله تونسته باشم تا حدودی با ریجکس در جاوا اسکریپت آشناتون کنم.</description>
                <category>Just for Fun</category>
                <author>Ali</author>
                <pubDate>Sat, 12 Jun 2021 16:07:35 +0430</pubDate>
            </item>
                    <item>
                <title>ابزار مشابه nodemon در deno</title>
                <link>https://virgool.io/justforfun/%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1-%D9%85%D8%B4%D8%A7%D8%A8%D9%87-nodemon-%D8%AF%D8%B1-deno-xig1ezhfoiu3</link>
                <description>هر بار راه اندازی مجدد سرور deno برای هر تغییر کوچکی میتونه دیونه کننده باشه! مخصوصا اگه جایی مشکلی چیزی داشته باشید. توی node.js ابزاری به اسم nodemon وجود داشت hotReload بود. به صورتی که شما با هر بار ذخیره مجدد فایل های خودتون سرور خودش رو restart میکرد و جای خالی این ابزار توی deno به شدت قابل لمس کردن بود .فرض کنید قطعه کد زیر سرور شماست و اون رو با نام app.ts ذخیره کردیم .import { serve } from &amp;quothttps://deno.land/std@0.52.0/http/server.ts&quot;
const s = serve({ port: 8000 });
console.log(&amp;quothttp://localhost:8000/&amp;quot);
for await (const req of s) {
req.respond({ body: &amp;quotsimple response for testing hot reload\nby : amupxm&amp;quot });
}بعد برای شروع بهتره دنو رو آپدیت کنیم :$ deno upgradeو چون Denon (همون ابزاری که تلاش برای نصبش داریم) از ویژگی های unstable stdlib استفاده میکنه باید از پرچم (flag) غیر پایدار (--unstable ) استفاده کنیم.$ deno install --allow-read --allow-run --allow-write -f --unstable https://deno.land/x/denon/denon.tsو با کد زیر سرور رو اجرا کنیم:denon run -allow-env -allow-net app.ts:) ولی به نظر من دنو خیلی خوبه ولی خیلی کار داره تا به node برسه !(از نظر package های موجود )</description>
                <category>Just for Fun</category>
                <author>امیر حسین مکرمی فر</author>
                <pubDate>Sun, 05 Jul 2020 14:33:54 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش استفاده از express در deno</title>
                <link>https://virgool.io/justforfun/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-express-%D8%AF%D8%B1-deno-a2w103k2in1x</link>
                <description>سلام . توی این پست خیلی کوتاه میخایم یه سروریس deno برای api  بسازیم و توش از express استفاده کنیم.(پیشنهاد میشه اول آموزش نصب deno  رو مطالعه کنید).با توجه به ساختار جدید دنو ما نیازی به پکیج منیجر نداریم و این باعث شده کمی افراد در استفاده از این سرویس جدید دچار سردرگمی بشن. من با توجه به عادتی که در استفاده از express  در node.js داشتم خیلی دوست داشتم که بتونم با express توی deno  هم وب سرویس بسازم.برای این کار کافیه از دستور زیر برای import کردن expressiv یا همون express برای deno استفاده کنید:import * as expressive from &amp;quothttps://raw.githubusercontent.com/NMathar/deno-express/master/mod.ts&amp;quotدر گام بعدی به شمابه عملکردی که توی express  داشتیم میتونیم بریم جلو:import * as expressive from &amp;quothttps://raw.githubusercontent.com/NMathar/deno-express/master/mod.ts&amp;quotconst port = 3000;const app = new expressive.App();const server = await app.listen(port);بعد ما فرضا لازم داریم api بسازیم تا اطلاعاتی زمان الان رو نمایش بده:let req_number= 0;app.get(&amp;quot/now&amp;quot,async (req,res)=&gt;{let d= new Date();await res.json([{date : [d.getFullYear() ,d.getMonth() ,d.getDate() ].join(&amp;quot/&amp;quot),request_number : req_number++}]);});بعد با توجه به کد بالا خروجی زیر رو میده که شامل شماره request و تاریخ الانه :بعد بهتره که برای صفحاتی که وجود ندارند اررور 404 بفرستیم که میتونیم مثل ورژن های قدیمی express از کد زیر استفاده کنیم:app.use(async (req,res)=&gt;{res.status= 404;res.json([{error:404 }]);});همون جوری که قابل ملاحظه هست کد ۴۰۴ رو به عنوان header  ارسال کرده .کد کامل :import * as expressive from &amp;quothttps://raw.githubusercontent.com/NMathar/deno-express/master/mod.ts&amp;quotconst port = 3000;const app = new expressive.App();let req_number= 0;app.get(&amp;quot/now&amp;quot,async (req,res)=&gt;{let d= new Date();await res.json([{date : [d.getFullYear() ,d.getMonth() ,d.getDate() ].join(&amp;quot/&amp;quot),request_number : req_number++}]);});app.use(async (req,res)=&gt;{res.status= 404;res.json([{error:404 }]);});const server = await app.listen(port);</description>
                <category>Just for Fun</category>
                <author>امیر حسین مکرمی فر</author>
                <pubDate>Sat, 04 Jul 2020 19:44:07 +0430</pubDate>
            </item>
                    <item>
                <title>آموزش نصب Deno در UBUNTU 20 (+ راهنمای ZSH)</title>
                <link>https://virgool.io/justforfun/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%86%D8%B5%D8%A8-deno-%D8%AF%D8%B1-ubuntu-20-%D8%B1%D8%A7%D9%87%D9%86%D9%85%D8%A7%DB%8C-zsh-wwj3fj0niokh</link>
                <description>برای من تقریبا نیم ساعت زمان بردتا بتونم دنو رو توی سیستم خودم نصب کنم( به دلیل استفاده از zsh ) و دوست دارم این راه ( راحت ترین راه ممکن) رو با شما به اشتراک بزارم.طبق آموزش خود سایت Deno شما برای نصب توی لینوکس و مک از دستور زیر استفاده کنید:curl -fsSL https://deno.land/x/install/install.sh | shدر گام بعدی لازمه که Path  دنو رو برای سیستم خودتون مشخص کنید تا با هر بار تایپ کردن deno توی ترمینال اجرا بشه:cd ~ &amp;&amp; cp .bashrc .bashrc-copy &amp;&amp; echo &#039;export DENO_INSTALL=&amp;quot/home/$USER/.deno&amp;quotexport PATH=&amp;quot$PATH:$DENO_INSTALL/bin&amp;quot&#039; &gt;&gt; .bashrc البته توجه کنید در صورتی که از zsh استفاده میکنید بجای .bashrc از  .zshrc استفاده کنید تو قطعه کد بالایی.و بعد توی گام آخر سورس فایل رو مشخص میکنیم://age az Zsh estefade kardin:
 source ~/.zshrc
// dar qeir in soorat
 source ~/.bashrc</description>
                <category>Just for Fun</category>
                <author>امیر حسین مکرمی فر</author>
                <pubDate>Sat, 04 Jul 2020 16:04:35 +0430</pubDate>
            </item>
                    <item>
                <title>اشتراک داده ها بین لاراول و جاوااسکریپت</title>
                <link>https://virgool.io/justforfun/%D8%A7%D8%B4%D8%AA%D8%B1%D8%A7%DA%A9-%D8%AF%D8%A7%D8%AF%D9%87-%D9%87%D8%A7-%D8%A8%DB%8C%D9%86-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-%D9%88-%D8%AC%D8%A7%D9%88%D8%A7%D8%A7%D8%B3%DA%A9%D8%B1%DB%8C%D9%BE%D8%AA-eumdnnsmyxjp</link>
                <description>اشتراک داده ها بین بک‌ اند و فرانت اند جز مواردی هست که در اکثر اپلیکیشن های تحت وب مورد نیازه... مثلا زمانی رو در نظر بگیرید که شما در حین کار کردن با یک فریم‌ورک جاوااسکریپتی و یا حتی حین کارکردن با کتابخونه jQuery ، برای رندر کردن پروفایل کاربر نیاز به آبجکت user دارید. و طبیعتا این گونه اطلاعات در یه بانک داده ذخیره شدند که بک اند شما باهاش در تعامل هست. در واقع چندین روش برای رد و بدل کرد اطلاعات بین PHP و Javascript وجود داره. برخی از این روش‌ها کمی پیچیده ترند و برخی دیگه ساده تر و بهینه تر. در این نوشته به بررسی این روشها می پردازیم و جوانب مثبت (مزایا) و منفی (معایب) هر یک و همچنین نحوه پیاده سازی آنها را می بینیم. و در نهایت پکیج لاراولی رو معرفی میکنیم که به راحتی این کار رو برای ما انجام میده: ارسال درخواست AJAX برای دریافت دادهاکو کردن داده در جایی از صفحه و استفاده از جاوااسکریپت برای دریافت از DOMاکو کردن داده به طور مستقیم در جاوا اسکریپتارسال درخواست AJAX برای دریافت دادهاین گزینه بهترین روش حساب میشه، چونکه اسکریپت های سمت سرور و کلاینت شما کاملاً مجزا هستند.مزایا:جداسازی بهتر بین لایه ها: اگر قرار شد در آینده دیگه از PHP استفاده نکنید، نیازی نیست مقدار زیادی از کد جاواسکریپت رو تغییر بدید.خوانایی بیشتر: با ترکیب نکردن کدهای PHP و جاواسکریپت، خوانایی بیشتری در هر دو قسمت وجود داره.امکان انتقال داده های غیر همزمان: بعضی مواقع دریافت اطلاعات از سمت PHP میتونه زمان بر باشه، مسلما ما نمیخواهیم که همه چیز رو متوقف کنیم تا ابتدا داده ها رو دریافت کنیم و بعد صفحه رو رندر کنیم; پس در عوض صفحه رو رندر می‌کنیم و زمانی که اطلاعات دریافت شد، اطلاعات رو هم به صفحه ضمیمه می‌کنیم.حظور نداشتن داده ها در مارک‌آپ: مارک‌آپ (HTML) رو تمیز نگه می‌داریم و تنها جاوااسکریپت هست که به این داده ها دسترسی داره.معایب:تأخیر: درخواست AJAX در واقع یک درخواست HTTP هست ، و درخواست های HTTP از طریق شبکه انجام می شوند و این امر باعث میشه یه تأخیر جزئی رو احساس کنیم.نحوه پیاده سازی:برای درخواست AJAX به ۲ قسمت نیاز دارید: قسمتی در بک اند که اطلاعات رو فراهم میکنه. (معمول ترین جایی که ما اطلاعات رو ازش واکشی می‌کنیم دیتابیس هست) ما در اینجا برای سادگی بیشتر یه آبجکت ساده رو در نظر میگیریم که حاوی اطلاعات کاربر هست.. و قسمت بعد هم جایی هست که جاوااسکریپت از اطلاعات سمت بک اند استفاده میکنه:فرض کنید ما یه کوئری به سمت سرور می‌زنیم و آرایه زیر رو دریافت میکنیم:حال با استفاده از تابع json_enocde این آرایه رو به jSon تبدیل میکنیم و هنگامی کاربر endpoint مورد نظر رو درخواست کرد اطلاعات زیر رو بهش بر‌ میگردونیم:حالا برای ارسال درخواست AJAX از axios استفاده میکنیم و براحتی میتونیم در جاوااسکریپت، هر عملیاتی که دوست داشتیم روی داده های برگشتی انجام بدیم:اکو کردن داده در جایی از صفحه و استفاده از جاوااسکریپت برای دریافت از DOMاین روش نسبت به AJAX کمتر ارجحیت دارد اما مزایای خودش رو داره. در این روش میشه گفت نسبتا PHP و Javascript از هم جدا هستند. یا به عبارت دیگه کدهای PHP به صورت مستقیم در جاوااسکریپت حظور ندارندمزایا:سرعت: عملیات های مربوط به DOM تقریبا سریع انجام میشند و میتونید نسبتا سریع داده ها رو مقدار دهی و یا بازیابی کنیدمعایب:داشتن مارک‌آپ غیر معمول: معمولاً اتفاقی که می افته اینه که شما برای ذخیره اطلاعات از نوعی فیلد پنهان استفاده می کنید، چون گرفتن اطلاعات از inputNode.value ساده تره، اما انجام این کار به این معنی است که شما یک عنصر بی معنی در ساختار DOM به وجود آوردید.به هم ریختگی سورس: داده هایی که PHP تولید می کند مستقیماً به کدهای HTML منتقل می شود ، بدین معنی که شما یک منبع HTML بزرگتر و کمتر متمرکز دریافت می کنید.به دست آوردن داده های ساختار یافته سخت تر است: داده های ساختار یافته باید تگ‌های معتبر HTML باشند وگرنه باید خودتون عملیات تغییر و یا escaping رو روی رشته ها انجام بدید.ارتباط تنگاتنگ PHP با ساختار داده ها: جدا سازی PHP و ساختار داده ها از هم مشکل تر خواهد بود.نحوه پیاده سازی:در این روش یک المان بوجود میاریم که برای کاربر قابل مشاهده نباشه و با جاوااسکریپت بهش دسترسی پیدا می‌کنیم:اکو کردن داده به طور مستقیم در جاوا اسکریپتدرک و استفاده از این روش بسیار ساده تر از گزینه های قبلی هست.مزایا:پیاده سازی آسان: درک و پیاده سازی این روش بسیار سادست.عدم به هم ریختگی سورس: متغیرها مستقیماً به جاوااسکریپت منتقل می شوند ، بنابراین DOM تحت تأثیر قرار نمی گیرد.معایب:ارتباط تنگاتنگ PHP با ساختار داده ها: جدا سازی PHP و ساختار داده ها از هم مشکل تر خواهد بود.نحوه پیاده سازی:پکیج Laravel Shared Dataدر بالا روش های انتقال داده ها رو بین PHP و جاوااسکریپت بررسی کردیم. تمام این روش ها در لاراول هم قابل استفاده هستند. اما به تازگی پکیجی منتشر شده که تمام این مراحل رو برای ما انجام میده و داده های ارسالی از سمت لاراول رو به شئ window جاوااسکریپت اضافه میکنه.برای نصب این پکیج:و سپس به راحتی در کنترلر ها و یا هر جای دیگه که خواستید میتونید به شکل زیر داده ها رو به اشتراک بگذارید; میتونید از فساد و یا هلپری که این پکیج در اختیارمون قرار میده، استفاده کنید:انجام عملیات بالا باعث میشه داده ها به اشتراک گذاشته بشند و به شکل زیر به راحتی در جاوااسکریپت در دسترس باشند:تنها کاری که باید انجام بدید، اضافه کردن دایرکتیو shared@ به فایل های ویو هست:چنانچه خواستید نام آبجکت مربوطه در شئ window رو هم تغییر بدید، میتونید به تنظیمات پکیج مراجعه و به شکل زیر عمل کنید:برای اطلاعات بیشتر در مورد این پکیج، می‌تونید به ریپازیتوری این پکیج و یا مستنداتش مراجعه کنید.</description>
                <category>Just for Fun</category>
                <author>ali.bayat</author>
                <pubDate>Sat, 18 Jan 2020 21:46:10 +0330</pubDate>
            </item>
                    <item>
                <title>می شه موقع SSH زدن پسورد نزنم ؟</title>
                <link>https://virgool.io/justforfun/%D9%85%DB%8C-%D8%B4%D9%87-%D9%85%D9%88%D9%82%D8%B9-ssh-%D8%B2%D8%AF%D9%86-%D9%BE%D8%B3%D9%88%D8%B1%D8%AF-%D9%86%D8%B2%D9%86%D9%85-wdc0lripwykb</link>
                <description>بله می شه, به سادگی. برای اینکار شما باید مکانیزم Authentication بین کلاینت و سرور رو عوض کنید. برای اینکه نخواید هر بار پسورد خودتون رو تایپ ـ( یا Copy Past )‌ کنید می تونید از ssh-key استفاده کنید, برای این کار به یک Key نیاز دارید که باید توی مسیر زیر باشه:/home/username/.ssh/id_rsa.pubاگر فایل id_rsa.pub وجود نداره باید یدونه بسازید ( تولید کنید ). با دستور زیر:ssh-keygen -t rsaوقتی enter رو بزنید ۳ تا سوال می پرسه که هر سه تا رو enter بزنید بره (‌ حالت پیشفرض ) ولی خوب سوال اول اینه که کلید تولید شده رو کجا ذخیره کنه ؟ سوال دوم پسورد می خواد و سوال سوم هم تکرار پسورد که من توصیه می کنه برای راحتی کار پسورد رو خالی بزارید و ست نکنید.مرحله ی بعد دستور زیر رو بزنید تا کلید شما  روی کنسول پرینت بشه:cat /home/username/.ssh/id_rsa.pubیه استرینگ توی این مایه ها باید ببینید:ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCqCxg9nsKH88tXGcZ80iIguqzqsAD5SNYzoqioKLCxIj14G0Ay3Nq4/84q8ezDQPuHXowJSP00iPzHfEcEsMxiYlVzq/gMW1B8nTSYFctljQZJBROLio//63k58jiEYfVHEQI4KRaLhz7EVkmSArJZpdaFydPLTXbK/5fCZZc8ZIl+XXi8JXDhdrzyZ86dYSeLX3IcMmRGh9PK+5vEqpM0fy1KqYOoSYq3xlZeaev/eePv92j4n4A7szQzz8Psfr1C/itUWrd1D20vOe0iNRRnp201OtLA+IsuBWPrTOn360q2ujNBKOT984qS/o1AjB  ordidaad@ordidaadخوب این کلید شماست. در مرحله بعد باید این کلید رو به سروری که می خواید ssh بزنید اضافه کنید.روی سرور فایل زیر رو باز کنید: vim /root/.ssh/authorized_keysحالا کلید خودتون رو اضافه کنید.ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCqCxg9nsKH88tXGcZ80iIguqzqsAD5SNYzoqioKLCxIj14G0Ay3Nq4/84q8ezDQPuHXowJSP00iPzHfEcEsMxiYlVzq/gMW1B8nTSYFctljQZJBROLio//63k58jiEYfVHEQI4KRaLhz7EVkmSArJZpdaFydPLTXbK/5fCZZc8ZIl+XXi8JXDhdrzyZ86dYSeLX3IcMmRGh9PK+5vEqpM0fy1KqYOoSYq3xlZeaev/eePv92j4n4A7szQzz8Psfr1C/itUWrd1D20vOe0iNRRnp201OtLA+IsuBWPrTOn360q2ujNBKOT984qS/o1AjB  ordidaad@ordidaad می تونید چند تا کلید هم بزارید... مثلا سیستم توی خونه سیستم توی شرکت, لپتاپتون و ... فقط کافیه enter بزنید و کلید بعدی رو اضافه کنید. مثلا اینجوری :ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCqCxg9nsKH88tXGcZ80iIguqzqsAD5SNYzoqioKLCxIj14G0Ay3Nq4/84q8ezDQPuHXowJSP00iPzHfEcEsMxiYlVzq/gMW1B8nTSYFctljQZJBROLio//63k58jiEYfVHEQI4KRaLhz7EVkmSArJZpdaFydPLTXbK/5fCZZc8ZIl+XXi8JXDhdrzyZ86dYSeLX3IcMmRGh9PK+5vEqpM0fy1KqYOoSYq3xlZeaev/eePv92j4n4A7szQzz8Psfr1C/itUWrd1D20vOe0iNRRnp201OtLA+IsuBWPrTOn360q2ujNBKOT984qS/o1AjB  ordidaad@ordidaad

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCqCxg9nssdfsdfZ80iIguqzqsAD5SNYzoqioKLCxIj14G0Ay3Nq4/84q8ezDQPuHXowJsdfdsfMxiYlVzq/gMW1B8nTSYFctljQZJBROLio//63k58jiEYfVHEQI4KRaLhz7EVkmSArJZpdaFydPLTXbK/5fCZZc8ZIl+XXi8JXDhdrzyZ86dYSeLX3IcMmRGh9PK+5vEqpM0fy1KqYOoSYq3xlZeaev/eePv92j4n4A7szQzz8Psfr1C/itUWrd1D20vOe0iNRRnp201OtLA+IsuBWPrTOn360q2ujNBKOT984qS/o1AjB  ordidaad@companyخووووب... حالا وقتی  ssh بزنید می بیند که فرت می ره تو و دیگه پسورد نمی خواد.ssh root@192.168.1.10حالا اگه تنبلیتون میاد ip رو تایپ کنید یا ip ها زیاده و یادتون می ره می تونید بهش اسم بدید, برای این کار فایل زیر رو باز کنید: vim /etc/hostsبا بقیه خرت و پرت های توی این فایل کاری نداشته باشید بیاد آخرش و خط زیر رو اضافه کنید:api-server     192.168.1.10اینجا api-server یه اسم دلخواهه. حالا می تونید به شکل زیر ssh بزنید:ssh root@api-serverتمام!</description>
                <category>Just for Fun</category>
                <author>کوروش شریفی</author>
                <pubDate>Thu, 28 Nov 2019 00:20:22 +0330</pubDate>
            </item>
                    <item>
                <title>?سی و یکمین دورهمی گنو ? 3️⃣1️⃣</title>
                <link>https://virgool.io/justforfun/%D8%B3%DB%8C-%D9%88-%DB%8C%DA%A9%D9%85%DB%8C%D9%86-%D8%AF%D9%88%D8%B1%D9%87%D9%85%DB%8C-%DA%AF%D9%86%D9%88-3%EF%B8%8F1%EF%B8%8F-pqqwopn3mylt</link>
                <description>? دورهمی گنو (شماره ۳۱)پنجشنبه ۱۶ آبان ماه ۹۸  / ساعت ۱۷ تا ۱۹ما، طرف‌داران آزادی نرم‌افزار، هر ماه دور هم جمع شده و دربارهٔ نرم‌افزار، فرهنگ و دانش آزاد با هم گپ می‌زنیم.? تهران، خیابان آزادی، نرسیده به میدان انقلاب، جنب سازمان تاکسی‌رانی، طبقه ۸ پارکینگ کاوه، شرکت کارپینو? شرکت در دورهمی گنو برای همگان آزاد بوده و نیازی به ثبت‌نام نیست.برای اطلاع رسانی از طریق تلگرام می‌توانید به کانال تلگرام دورهمی گنو ملحق شوید :https://t.me/GnuMeetup</description>
                <category>Just for Fun</category>
                <author>خُرسند</author>
                <pubDate>Wed, 06 Nov 2019 08:52:28 +0330</pubDate>
            </item>
                    <item>
                <title>وصل شدن به vps از طریق Public Key</title>
                <link>https://virgool.io/justforfun/%D9%88%D8%B5%D9%84-%D8%B4%D8%AF%D9%86-%D8%A8%D9%87-vps-%D8%A7%D8%B2-%D8%B7%D8%B1%DB%8C%D9%82-public-key-qvsnksvavohn</link>
                <description>این چیزی که دارم مینویسم رو شاید خیلیا بلد باشن و واسشون ساده باشه اما واسه اونایی که تازه وارد دنیای لینوکس و کارهای مربوط به سرور شدن میتونه خیلی مفید باشه.همونطور که میدونید یکی از راه های وارد شدن به سرور لینوکسی از طریق ssh هست که به این صورت میتونید وارد سروری که دارید بشید:ssh user@ip_addressاما میشه راه بهتر و امن تری رو برای وارد به سرور انتخاب کرد.کلید های SSH بصورت جفت(کلید عمومی و کلید خصوصی) هستن.شما میتونید با ساختن یک کلید عمومی و خصوصی روی سیستمی که باهاش کار میکنید و اختصاص دادن اون به سرورتون بدون اینکه بخواید رمز وارد کنید وارد سرورتون بشید!مرحله اول: ساختن جفت کلید SSHاگه روی سیستم خودتون این فولدر رو ندارید باید اون رو بسازید:mkdir ~/.ssh
chmod 700 ~/.sshو حالا باید کلید های جفت SSH رو بسازید:ssh-keygen -t rsa -b 4096قسمت -t rsa به این معنی هست که یک کلید جفتی RSA تولید می کنید و قسمت -b 4096 به این معنی هست که شما دارید کلید های ۴۰۹۶ بیتی تولید می کنید.بعد از اجرای این دستور  باید با همچین چیزی مواجه بشید:اگر از شما پرسیده شد که کجا این فایل ذخیره بشه بدون نوشتن چیزی Enter اینتر بزنید.محل پیش فرض ذخیره ی کلید های SSH در قسمت: ~/.ssh/id_rsaهست. و حالا شما بعد از اجرای این دستور در فولدر .ssh باید دوتا فایل به اسم های id_rsa که شامل کلید خصوصی (private key) هست و id_rsa.pub که شامل کلید عمومی (public key) هست مواجه بشید.مرحله دوم: آپلود کردن کلید عمومی به سروربعد از اینکه وارد سرورتون شدید باید فولدر .ssh رو بسازید.cd ~
mkdir .sshو حالا باید محتویات داخل فایل id_rsa.pub رو به سرورتون منتقل کنید.با دستور (secure copy (SCP میتونید اینکار رو به راحتی انجام بدید.scp ~/.ssh/id_rsa.pub user@example.com:~/.ssh/uploaded_key.pub دستور scp  دوتا آرگومان لازم داره که آرگومان اول در اینجا آدرس فایل کلید عمومی شما روی سیستم خودتون هست و آرگومان دوم محل ذخیره فایل کلید عمومی در سروری که دارید.برای مثال:scp &lt;local location of the public key&gt; &lt;remote user&gt;@&lt;remote server address&gt;:&lt;destination file&gt;و حالا باید محتویات فایل uploaded_key.pub داخل فایلی به اسم authorized_keys بریزیم.cat uploaded_key.pub &gt;&gt; authorized_keysدر نهایت باید کمی تغییر در فایل /etc/ssh/sshd_config بدید.RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keysاگه این خط ها وجود داشتن و کامنت بودن، # رو از اول خط اونها بردارید.و حالا باید سرویس SSH سرور رو یک بار ریستارت کنید.sudo service ssh restartحالا میتونید به راحتی وارد سرورتون بشید.برای اینکار باید آدرس فایل کلید عمومی رو قبل از نوشتن نام کاربری سرورتون بنویسید.به این شکل:ssh -i &lt;path to your private key&gt; &lt;user&gt;@&lt;remote server address&gt;
 Example : ssh -i ~/.ssh/id_rsa root@192.168.56.166مرحله سوم: غیرفعال کردن رمز عبور برای وارد شدن به سروراین قسمت رو میتونید انجام ندید ولی برای امن تر کردن سرورتون میتونید نیاز به وارد کردن رمز عبور برای وارد شدن به سرورتون رو غیر فعال کنید. برای اینکار باید تغییراتی در فایل /etc/ssh/sshd_config  بدید:PasswordAuthentication noو حالا دوباره باید سرویس SSH رو ریستارت کنید که این تنظیم ذخیره بشه. حالا دیگه نمیتونید با رمز وارد سرور بشید و فقط باید از کلید عمومی و فقط سیستم خودتون وارد سرور بشید.تنظیمات اضافیشما میتونید پورت پیش فرض برای وارد شدن به سرورتون رو هم عوض کنید چون بصورت پیش فرض پورت ۲۲ برای وارد شدن به سرورها در نظر گرفته شده که احتمال حمله به سرورتون رو زیاد میکنه. برایبستن دسترسی از این پورت میتونید قسمت زیر رو کامنت کنید تا از این اتفاق جلوگیری کنید.#Port 22امیدوارم این آموزش به شما کمک کرده باشه.</description>
                <category>Just for Fun</category>
                <author>فرنام همایونفر</author>
                <pubDate>Mon, 14 Oct 2019 21:20:16 +0330</pubDate>
            </item>
                    <item>
                <title>داکر در عمل :: چرخه اجرای کانتینرها در داکر</title>
                <link>https://virgool.io/justforfun/%D8%AF%D8%A7%DA%A9%D8%B1-%D8%AF%D8%B1-%D8%B9%D9%85%D9%84-%DA%86%D8%B1%D8%AE%D9%87-%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C-%DA%A9%D8%A7%D9%86%D8%AA%DB%8C%D9%86%D8%B1%D9%87%D8%A7-%D8%AF%D8%B1-%D8%AF%D8%A7%DA%A9%D8%B1-ivfcsy4wxnfc</link>
                <description>در پست قبلی یک کانتینر در داکر اجرا کردیمdocker run dockerinaction/hello_wordوقتی این دستور را اجرا می کنید یک چرخه اجرا می شود که به آن می‌پردازیمچرخه اجرای فرمان در داکرپس از اجرا فرمان Hello World  داکر از کانتینر خارج شده و خودکار متوقف می‌شود. این موضوع را درک کنید که حالت اجرا یک کانتینر یا مخزن به اجرا برنامه درون آن بستگی دارد.</description>
                <category>Just for Fun</category>
                <author>محسن نیک نژاد</author>
                <pubDate>Wed, 18 Sep 2019 00:27:27 +0430</pubDate>
            </item>
                    <item>
                <title>داستان سخت‌افزار آزاد - قسمت اول : منطق و ریاضیات یاد بگیریم</title>
                <link>https://virgool.io/justforfun/wtf-is-logic-lem3xyyekw00</link>
                <description>مدتی میشه که سری داستان سخت افزار آزاد رو شروع کردم. این اولین قسمتیه که حقیقتا قراره کمی چیزی یاد بگیریم که به دردمون میخوره. حالا چی قراره یاد بگیریم؟ منطق و ریاضیات پایه‌ای که برای توسعه سخت افزار نیازمندیم. در این مطلب، اول کمی رویکرد دانشگاهی روی یادگیری منطق و ریاضیات رو بررسی می‌کنیم و بعد رفرنس معرفی میشه برای یادگیریش. چرا که اگر بخوام دوباره از اول شروع کنم به آموزش منطق، حقیقتا «هزارباره کاری» کردم! چرا که میلیون ها مطلب خوب در باب منطق و ریاضیات کامپیوتر در اینترنت موجودند و من قصدم از این سری، بیش از آموزش صرف و مکتب‌خانه‌ای؛ سرنخ دادن به علاقمندان به سخت افزار آزاده. قبل از خوندن این مطلب، چی بخونیم؟ اول پیش‌گفتار این سری :  https://virgool.io/@haghiri75/wtf-is-open-hardware-ddfmknbvhx1m بعدش هم مقدمه‌ش : )https://virgool.io/@haghiri75/gettingstarted-free-hardware-m5woqagva38wبعد از خوندن این دو مطلب، برگردید و به خوندن این مطلب ادامه بدید. منطق چیست؟شاید این بیش از این که سوال فنی باشه؛ جنبه فلسفی داشته باشه. اما خب به طور کلی، منطق علم استدلال کردنه. به این شکل که ما معمولا گزاره‌هایی داریم که بر راستی یا ناراستی یک موضوعی، دلالت میکنند. حالا با کنار هم قرار دادن این راستی و ناراستی ها؛ به یک سری نتایج راست یا ناراست میرسیم. فکر کنم بیش از اندازه پیچیده‌ش کردم. بیایید این دو گزاره را در نظر داشته باشیم: علی با حسن دوست است محمد با حسن دوست است فرض میکنیم هر دو گزاره فوق، راستگو هستند (یا به عبارت کامپیوتری تر True هستند). حالا میخواهیم از این نتیجه بگیریم : علی با محمد دوست است. آیا واقعا این نتیجه درسته؟ میتونه باشه و میتونه نباشه. در حقیقت ما نمی‌تونیم این موضوعاتی که نسبی هستند رو با منطق صوری (که به نوعی پایه علوم کامپیوتره) پاسخ بدیم و به انواع دیگر منطق (مثلا فازی) نیازمند خواهیم شد. اما بیاییم چند گزاره دیگر بررسی کنیم : علی از حسین قد بلندتری دارد. حسین از محمد قد بلندتری دارد. حالا میخواهیم نتیجه بگیریم : علی از محمد قد بلندتری دارد. خب، این گزاره ها دارند بر عواملی دلالت می‌کنند که احساسات یا در کل نسبیات در اونها تاثیر نداره. مثلا دوست بودن یک انسان با دیگری، ملاک و معیار کمی نداره اما قد انسانها معیار کمیه و به این شکل قابل مقایسه و نتیجه گیری. تا الان فکر کنم با کلیت منطق آشنا شدید. بیایید به این سوال پاسخ بدیم که چرا باید برای طراحی کامپیوتر، منطق بلد باشیم؟پاسخ ساده‌ست. کامپیوترها فقط صفر و یک می‌فهمند. در واقع الفبای کامپیوترها به جای ۳۲ حرف، فقط دو حرف صفر و یک داره (میشه از این نتیجه گرفت که کامپیوترها از ما زرنگ ترن؟ ?) و خب بسته به شرایط معمولا «یک» همون گزاره‌ایه که راستگوئه و «صفر» گزاره‌ای که «ناراستگو» محسوب میشه. پس کامپیوتر باید بتونه با چینش خاصی از مقایسات منطقی، محاسبات رو انجام بده. ریاضیات مورد نیاز گرچه منطق به تنهایی خودش یکی از شاخه های ریاضیات در کامپیوتر محسوب میشه، اما ما به ریاضیات متفاوتی هم برای طراحی کامپیوتر نیاز داریم. گرچه به خودی خود این ریاضیات خیلی پیچیده نیستند، اما بهرحال دونستن اونها لازمه. اولین شکلی از ریاضیات که بهش نیاز داریم، ریاضیات گسسته‌ست. در واقع مباحث مدارهای منطقی، معماری کامپیوتر، ساختمان های داده و الگوریتم همه از ریاضیات گسسته میان و شدیدا به ریاضیات گسسته وابسته‌ن. اگر ریاضیات گسسته رو به درستی فرا نگیرید، احتمال زیادی داره که در فهم این موضوعات به مشکل بخورید. دومین شکل، ریاضیات مهندسیه که خب کمی سخت‌تره. سختی ریاضی مهندسی اونجاییه که وارد مباحث انتگرال و ... میشه (فکر کنم کابوس همه دانشجوهای مهندسی بوده، هست و خواهد بود ?) ولی خب از اونجایی که ما در طراحی سخت افزار با «سیگنال» سر و کار داریم و ریاضیات مهندسی پایه‌های «سیگنال‌ها و سیستم‌ها» رو تشکیل میده، نیازه که حداقل کمی باهاش آشنا باشیم و بدونیم چطور با سیگنالهایی که دریافت میکنیم باید رفتار کنیم. در دانشگاه چطور منطق و ریاضیات یاد می‌گیریم؟ در دانشگاه، برای یادگیری منطق : ابتدا ریاضیات گسسته یاد می‌گیرید سپس ساختمان های داده و مدارهای منطقی معماری کامپیوتر و طراحی الگوریتم بعد از یادگیری اینها، شما احتمالا بدون مشکل میتونید درسایی که کاربردهای دنیای واقعی این درسها هستند رو اخذ کنید (ریزپردازنده، هوش مصنوعی، مهندسی نرم افزار، الکترونیک دیجیتال و ... ) و برای یادگیری ریاضیات : ابتدا ریاضی عمومی ۱ سپس ریاضی عمومی ۲، آمار و معادلات (اینها تا جایی که من میدونم هم نیاز هستند) سپس ریاضیات مهندسی که بعد از گذروندن اینها هم شما میتونید دروسی مثل سیگنال و سیستم یا انتقال داده رو اخذ کنید. بسیار خوب. تا اینجا با کلیت ماجرا آشنا شدیم. فهمیدیم منطق و ریاضیات کجای طراحی سخت افزار کاربرد دارند. از مطالب بعدی سعی می‌کنم شماتیک و ... آماده کنم و توضیح بدم که هرکدوم چه کاری میکنند. اما اگر خودتون کنجکاو هستید برای خوندن منطق، میتونم کتاب موریس مانو رو پیشنهاد کنم. ایشون به خوبی منطق و مدارات منطقی رو توضیح دادند. بعد از خوندن اون کتاب هم میتونید سایر منابع رو مرور کنید. اکثر منابع موجود برای مدار منطقی، بر اساس کتاب موریس مانو نوشته شدند. همچنین این کتاب من :  https://github.com/prp-e/micro-controller-design/releases فصل های ۲،۳ و ۴ رو میتونید برای یادگیری منطق، مطالعه کنید. خودم هم قسمت زیادی از اون بخش رو از موریس مانو ایده گرفتم پس مشکلی در جهت مطالعه بعد یا حتی قبل از موریس مانو؛ نخواهید داشت. </description>
                <category>Just for Fun</category>
                <author>محمدرضا حقیری | Muhammadreza Haghiri</author>
                <pubDate>Mon, 16 Sep 2019 22:48:08 +0430</pubDate>
            </item>
                    <item>
                <title>داکر در عمل :: نصب داکر روی دبیان/ابونتو/مینت</title>
                <link>https://virgool.io/justforfun/%D8%AF%D8%A7%DA%A9%D8%B1-%D8%AF%D8%B1-%D8%B9%D9%85%D9%84-%D9%86%D8%B5%D8%A8-%D8%AF%D8%A7%DA%A9%D8%B1-%D8%B1%D9%88%DB%8C-%D8%AF%D8%A8%DB%8C%D8%A7%D9%86%D8%A7%D8%A8%D9%88%D9%86%D8%AA%D9%88%D9%85%DB%8C%D9%86%D8%AA-y2erhihiual4</link>
                <description>نصب داکر از مخازن لینوکسیسلام ، در ادامه آموزش داکر درعمل نصب و راه‌اندازی داکر از طریق مخازن رو فرا می‏‏‌گیریم. من برای این آموزش نصب (Docker CE  (Community Edition را انجام خواهم داد،این نسخه کاملاً متن باز و انعطاف‌پذیر می باشد و برای تیم های توسعه و کوچک بهترین گزینه محسوب می‌شود.برای شروع کار با داکر ، Docker CE بهترین گزینه است ، حتما وقت بگذارید و با دنبال کردن آموزش آن را فرا بگیرید.در ابتدا توصیه می‌کنم قبل از هر کاری بررسی کنید در محیط لینوکس خود هیچگونه نسخه از داکر از قبل نصب نشده باشد. برای این کار فرمان زیر را وارد می‌کنیم:sudo apt remove docker docker-engine docker.io containerd runcبررسی و حذف نسخه‌های مختلف داکر در لینوکسپیش از هر کاری apt را بروز کنید sudo apt updateبه طور پیش‌فرض ، apt از پروتکل HTTPS استفاده نمی‌کند. بسته‌های زیر را نصب کنید که به APT امکان استفاده از مخازن HTTPS را می‌دهد.sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-commonبسته‏‌های پیش‌نیاز جهت استفاده از مخازن HTTPSبرای فعال کردن مخازن Docker ، کلید رسمی Docker دارای اهمیت است. روش اضافه کردن کلید رسمی GPG Docker به لیست مخازن APT:curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -افزودن کلید رسمی داکر جهت استفاده از مخازن اصلی و استانداردحتی پس از نمایش تائیدیه ، جهت اطمینان از افزوده شدن صحیح کلید دستور زیر را در خط فرمان وارد کنید:sudo apt-key fingerprint 0EBFCD88بررسی صحت افزوده شدن کلیددر مورد داکر ، سه مخزن مختلف وجود دارد - مخزن &quot;پایدار&quot; (برای همه توصیه می شود) ، &quot;شبانه&quot; یا &quot;تست&quot;. بگذارید مخزن &quot;پایدار&quot; را پیکربندی کنیم.sudo add-apt-repository &amp;quotdeb [arch=amd64] https://download.docker.com/linux/ubuntu
 bionic stable&amp;quotافزودن مخزن پایدارنکته:اگر هر کدام از مخازن تست (test) یا شبانه(nightly) را برای نصب انتخاب کردید. کافی است با کلمه stable در فرمان بالا جابه‌جا کنید.بعد از اضافه شدن مخزن داکر به لیست مخازن APT حتماً است تا دوباره آن را بروزرسانی کنید تا لیست آدرس‌های نصب داکر درون سیستم شما بارگذاری شود.sudo apt updateقرار گرفتن آدرس های نصبی داکر درون سیستم و مخزن aptدر نهایت هم دستور زیر را برای نصب داکر وارد می‌کنیم:sudo apt install docker-ce docker-ce-cli containerd.ioنصب داکرنصب کامل شد و حالا دیگه می‌توانید از داکر استفاده کنید :)نکات اضافه:اگر دنبال نصب نسخه خاصی از داکر و افزونه‌های آن هستید به روش زیر عمل کنیدابتدا دستور زیر را وارد می‌کنیم تا نسخه در دسترس را به ما نمایش دهدapt-cache madison docker-ceلیست نسخه‌های قابل نصب داکرحالا نسخه‌ای را که می‌خواهید نصب کنید در قالب زیر وارد نماییدsudo apt-get install docker-ce=&lt;نسخه مورد نظر&gt; docker-ce-cli=&lt;نسخه مورد نظر&gt;
containerd.ioخوب آموزشمون در این بخش به پایان می‌رسد اگر نظر یا نکته‌ای دارید با من در میان بگذارید.</description>
                <category>Just for Fun</category>
                <author>محسن نیک نژاد</author>
                <pubDate>Mon, 16 Sep 2019 22:40:15 +0430</pubDate>
            </item>
                    <item>
                <title>مانیتورینگ Nginx با استفاده از Grafana</title>
                <link>https://virgool.io/justforfun/%D9%85%D8%A7%D9%86%DB%8C%D8%AA%D9%88%D8%B1%DB%8C%D9%86%DA%AF-nginx-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-grafana-vzrhugbosbie</link>
                <description>سلام, به این تصویر نگاه کنیدهیچ چیز برای یه SysAdmin یا Developer مهم تر از این نیست که بدونه وضعیت سرویسی که راه اندازی کرده و یا داره ازش نگهداری می کنه چطوریه ؟ دیدن این صفحه برای خود من که یه حس رضایت ( اصطلاح معروفش Satisfaction ) خیلی زیادی داره.اما به اینطور صفحه ها چی می گن ؟ بله درسته, مانیتورینگ. مانیتورینگ یکی از حیاطی ترین اجزا یه سرویس زنده و در حال اجراس.انتخاب ابزار مناسب برای مانیتورینگ:اجازه بدید کلام رو کوتاه کنم و از مزایای مانیتورینگ زیاد ننویسم چون خودتون بیشترش رو می دونید. اما برای راه انداختن مانیتورینگ چیکار باید بکنیم ؟ مانیتورینگ هم مثل خیلی از سرویس های دیگه ابزار زیاد داره.. یه سری هاشون  Stand Alone هستن مثل Zabbix یا Nagios و یه سری هاشون هم یه صورت یه استک هستند مثل  ELK که مخفف Elasticseach, Logstash و Kibana هست یا استک Grafana, Telegraf و Influxdb.اما منظور از استک چیه ؟ اجازه بدید خیلی ساده بگم, معمولا مانیتورینگ ۳ قسمت اصلی داره:جمع آوری داده ها ذخیره ی داده های جمع آوری شده نمایش داده های ذخیره شده به شکل مناسب ( گراف و نمودار و ... )جمع آوری داده ها:خوب قاعدتا شما باید مشخص کنید که چه چیزی رو می خواید مانیتور کنید... وب سرور ؟ دیتابیس ؟ میزان مصرف منابع ؟ خوب بعد اینکه مشخص کردید باید یه ابزار مناسب ( Data Collector ) برای جمع آوری دیتای مورد نظرتون داشته باشید... اصطلاحا به این دیتا می گن metrics. مثلا nginx واسه خودش یه جور metrics داره و MySQL یه جور دیگه... خوشبختانه از اونجایی که در عصر تکنولوژی به سر می بریم ۱۰۰۰ جور Data Collector وجود داره مثل CollectD یا telegraf یا filebeat یا ... به این کالکتور ها Agent هم میگن. این کالکتور ها اکثرا برای سرویس های معروف و عامه مثل Nginx, Apache, MySQL و ماژول های آماده دارن و شما باید فقط یه کانفیگ ساده انجام بدید (‌مثلا آدرس فایل لاگ Nginx رو مشخص کنید) و بقیه کار ها رو خودشون انجام میدن.خوب, پس متوجه شدیم که باید یه ابزاری داشته باشیم که سورس رو بهش معرفی کنیم ( مثلا Log های Nginx )‌ و بهش بگیم دیتا رو از توی سورس برای ما بکش بیرون ( ادبی ترش می شه استخراج کن ).خوب حالا که دیتا رو استخراج کردیم چه کنیم ؟ قسمت بعد رو بخونید...ذخیره ی داده های جمع آوری شده:بعد از اینکه Agent ما یه سری دیتا برای ما جمع کرد باید این دیتا رو یه جایی ذخیره کنیم. تا بتونیم بعدا گزارش بگیریم, مثلا در کل ۱ ماه گذشته چه تعداد درخواست رو هندل کردیم ؟ برای این کار هم Data Store ها یا Database های مختلفی وجود داره... مثل elasticsearch یا Influxdb. فقط کافیه به Agent بگیم دیتایی که جمع کردی رو بفرست سمت Database جهت ذخیره سازی.نمایش داده های ذخیره شده (Visualization):خوب, تا اینجا دیتا (‌metrics) رو استخراج و دخیره کردیم... حالا باید اون ها رو به صورت آدمیزاد پسند و رئیس پسند نمایش بدیم, برای این کار هم ابزار های مختلفی هست که در حال حاضر معروف ترین هاشون kibana و grafana هستن که داده ها رو از database بر می دارن و به صورت چارت و گراف و نمودار و ... نشون می دن.مانیتور کردن Nginx با استفاده از Grafana, Influxdb, Telegraf:خوب اجازه بدید مباحث تئوری رو کم کنیم و یکم عملی کار کنیم. خوب من خودم این استک رو ترجیح می دم به خاطر اینکه خیلی شسته رفته تر و بی دردسر تره و تقریبا هر انتظاری که دارید رو برآورده می کنه. همونطور که قبلا گفتم ما به ۳ تا ابزار احتیاج داریم, Grafana برای نمایش, Influxdb برای ذخیر سازی داده ها و Telegraf برای جمع آوری داده ها.اجازه بدید از مراحل نصب و راه اندازی بگذریم چون خود سایت مرجع خیلی خوب توضیح داده و چیز ساده ای هست.اولین قدم کانفیگ تلگراف:خوب, از اونجایی که قراره Nginx رو مانیتور کنیم شما در مرحله ی اول باید telegraf رو روی سروری که Nginx شما اونجا هست نصب کنید. بعد از اینکه نصب کردید فایل زیر رو با یه Text Editor باز کنید: sudo vim /etc/telegraf/telegraf.confخوب حالا دنبال کانفیگ بلاک [[inputs.logparser]]  بگیردید, این ماژول به صورت پیش فرض توی تلگراف کامنت هست و شما باید این ماژول رو از کامنت خارج کنید و به شکل زیر تنظیم کنید:[[inputs.logparser]]
    files = [&amp;quot/var/log/nginx/access.log&amp;quot] // اینجا آدرس فایل لاگ رو مشخص کنید
    from_beginning = false
    [inputs.logparser.grok]
        patterns = [&amp;quot%{COMBINED_LOG_FORMAT}&amp;quot]
        measurement = &amp;quotnginx_access_log&amp;quot // کلیدی که دیتای مورد نظر قراره باهاش ذخیر بشه, دلخواه
        custom_pattern_files = []       خوب تا اینجا به تلگراف گفتیم دیتا رو از کجا بخون, حالا باید بهش بگیم دیتایی که استخراج کردی رو کجا بفرست برای ذخیره سازی.توی همون فایل telegraf.conf دنبال  بلاک  [[outputs.influxdb]]  بگردید, این ماژول هم کامنت شده هست, از کامنت خارجش کنید و کافیه فقط چند تا پارمتر ساده براش ست کنید, ip ماشین یا سروری که influxdb رو روش نصب کردید +‌ پورتی که influxdb روش جواب می ده که پیش فرض 8086 هست اگر خودتون عوضش نکرده باشید به همراه یوزر و پسورد و اسم دیتابیس.
[[outputs.influxdb]]
    urls = [&amp;quothttp://192.168.1.100:8086&amp;quot] 
    database = &amp;quottelegraf&amp;quot 
    username = &amp;quotfunnyusername&amp;quot 
    password = &amp;quotverykoloftpassword&amp;quotخبر خوب اینه که اگه database رو از قبل نساخته باشید خود به خود ساخته می شه و به خطا نمی خوره.خوب حالا سرویس تلگراف رو restart کنید:sudo service telegraf restartبعد از اینکه سرویس تلگراف رو restart کردید می تونید با دستور زیر تست کنید ببینید همه چی درسته یا نهsudo telegraf --testاگر خطایی دریافت نکردید یعنی همه چیز درسته. ( چه  جمله ی مسخره ای )خوب, تا اینجا گرافانا, اینفلاکس و تلگراف رو نصب کردیم, بعد تلگراف رو تنطیم کردیم تا لاگ های Nginx رو بخونه و در آخر بهش گفتیم دیتای رو بفرست سمت انفلاکس برای ذخیره سازی, حالا توی مرحله ی بعد که مرحله ی آخر هست می خوایم دیتای ذخیره شده رو نشون بدیم.تنظیمات Grafana برای مانیتور کردن Nginx:خوب اینجا دو تا راه داریم, اول اینکه خودمون یه دشبورد جدید بسازیم و به اینفلاکس کوئری بزنیم و دیتا رو بخونیم وصلش کنیم به ویجت ها و گراف های مختلف و نمایش بدیم, راه دوم اینه که از دشبورد های از پیش آماده که دیگران زحمت طراحی و ساختش رو کشیدن استفاده کنیم. بدون هیچ صحبت اضافه ای بریم برای توضیح راه دوم :D.خوب در قدم اول پنل وب گرافانا رو توی مرورگر باز کنید و لاگین کنید. اگر نمی دونید گرافانا به صورت پیش فرض روی پورت 3000 میاد بالا و یوزر پس پیش فرضش admin / admin هست.در قدم اول باید گرافانا رو به اینفلاکس وصل کنیم, برای اینکار بعد از اینکه لاگین کردید سمت چپ صفحه یه منوی عمودی می بینید یه یکیش عکس چرخدنده هست به اسم configuration که یه زیر منو داره به اسم data source, روش کلیک کنید. حالا روی دکمه add data source کلیک کنید. یه سری انتخاب بهتون می ده که یکیش influxdb هست.روش کلیک کنید یه فرم باز می شه, همه چی مشخصه طبق معمول یه اسم دلخواه برای کانکشن,  ip:port سرویس اینفلاکس, یوزر و پسورد و اسم دیتابیس رو انتخاب کنید بقیه تنظیمات هم لازم نیست تغییر بدید, تنها نکنه این بخش اینه که اسم دیتابیسی که وارد می کنید با اسم دیتابیسی که توی تلگراف وارد کردید باید یکی باشه.روی save and test کلیک کنید اگر مشکلی نباشه data source شما ایجاد می شه.خوب قسمت های سخت ماجرا تموم شد و فقط مونده ساختن یه دشبورد برای نمایش دیتا, شما می تونید برید توی وب سایت گرافانا و از این قسمت دشبورد های مخصوص nginx رو سرچ کنید و یکیش رو دانلود کنید, دشبورد مورد علاقه ی خود من این دشبورد هست. روی Download JSON کلیک کنید تا یه فایل json دانلود بشه.حالا وقتشه که داشبوردی که دانلود کردید رو به گرافانا اضافه کنید, از این منو روی زیر منوی import کلیک کنید:حالا روی دکمه ی سبز رنگ Upload .json File کلیک کنید و فایلی که دانلود کرده بودید رو آپلود کنید, یه فرم باز می شه که می تونید برای دشبورد اسم انتخاب کنید, در قسمت influxdb هم اون data source که قبلا ساختید رو انتخاب کنید و روی دکمه import کلیک کنید.خوب حالا اگه همه چی خوب پیش رفت باشه باید یه همچین تصویر زیبایی رو ببینید:خوب حالا اگه همه چی خوب پیش رفت باشه باید ه تصویر زیبا رو ببینید: تمام! بقیش رو خودتون با یکم وقت گذاشتن می تونید کشف کنید چون Grafana یه UX خیلی خوب داره, مثلا گوشه ی بالا سمت راست می تونید بازه زمانی نمایش اطلاعات رو انتخاب کنید یا انتخاب کنید هر چند وقت یک بار دشبورد ریفرش بشه.خسته نباشید.</description>
                <category>Just for Fun</category>
                <author>کوروش شریفی</author>
                <pubDate>Sat, 14 Sep 2019 22:51:04 +0430</pubDate>
            </item>
                    <item>
                <title>مار های ناهمزمان! ( async in python )</title>
                <link>https://virgool.io/justforfun/%D9%85%D8%A7%D8%B1-%D9%87%D8%A7%DB%8C-%D9%86%D8%A7%D9%87%D9%85%D8%B2%D9%85%D8%A7%D9%86-async-in-python-z6afpf4xhnzz</link>
                <description>این مقاله در مورد روش های ناهمزمانی هست که توی پایتون میشه پیاده کرد البته بیشتر سعی کردم رو مفاهیم و دلیل استفاده از این روش و مزیت ها و معایب هاشون تمرکز کنم تا آموزش پیاده سازی اون ها کدهای مثال ها هم به زبان پایتون هست چون خودم پایتون بلدم :)) و اینکه درکش راحت تر از بقیه زبان هاست. مسلما این مقاله خالی از عیب نیست و من هم متخصص نیستم پس هر جا مشکل داشت حتما بگیداز اول شروع میکنیم اصلا این async (ناهمزمانی) و sync (همزمانی) که ما میگیم یعنی چی ؟ یه مثال خیلی خوب و گیرا همه چیز رو روشن میکنه.  فرض کنید من رفتم به یه رستوران ایتالیایی و درخواست  آبگوشت  میدم اگه در مدتی که آبگوشت حاضر میشه من جلو پیشخوان وایسم و هیچ کاری نکنم من در واقع یه کار sync انجام دادم اگه تا وقتی که آبگوشت من حاضر میشه کار دیگه ای کنم مثلا قلیونی بکشم و وقتی که غذا حاضر شد صدام کردن و من رفتم آبگوشتم رو گرفتم من در واقع یه کار async انجام دادم البته میشه یه حرکت دیگه هم زد و اون اینه که یکی از دوستای بیکارمون رو بگیم وایسا جلو پیشخوان وقتی حاضر شد برامون بیار بعد خودمون بریم دوباره پی قلیونمون ! این حات هم async هست.خب فکر کنم متوجه شده باشید منظورم چیه حالا همین مثال تو دنیای برنامه نویسی خیلی پیدا میشه از وایستادن برای جواب ریکوست یا ریسپانس تو نت بگیر تا جواب یه پردازش سنگین تصویر یا یه الگوریتم پیچیده و ... روش هایی که تو پایتون وجود داره زیادن و اون هایی که من در موردشون اطلاع دارم عبارت اند از : MultiProcessing ( چند پردازشی )MultiThreading ( چند نخی )  AsyncIO  (خروج و ورود ناهمزمان ( این دیگه چه اسمیه!! ) )  ( خ و ناهم ) MQ or message queue ( صف پیام )این اخریه کلا به پایتون ربط نداره اما برای ناهمزمانی توی بعضی پروژه ها به کار میره تو این مقاله در موردش حرف نمیزنم شاید در آینده در موردش نوشتم خودتون به عنوان مشق شب در موردش تحقیق کنیم همه چی رو که من نباید بگم مرسی ا‌َهMultiProcessing:کلا من دوست دارم همه چیز رو از اول شروع کنم :))) پس میریم دنبال multiprocessing و کلا چی هست؟در روش multiprocessing ما از هسته های سی پی یو و سیستم زمان بندی سیستم عامل استفاده میکنیم به این صورت که ما چند process ایجاد میکنیم و سیستم عامل هم به صورت عادلانه وقتی که یکی از process نیاز به پردازش داشت اون process رو به یکی از هسته ها میفرسه تا  کاراش رو بکنه هر process فضا و اطلاعات خودش رو داره و process های مختلف نمیتونن اطلاعاتی که دارن رو با بقیه process ها به اشتراک بزارن یه مثال سادش تو پایتون اینه:( تو این مکان به صورت عجیبی من نمیتونم کد ها رو بزارم و سایت ویرگول ارور 403 میده پس خودتون برید مثالش رو تو نت ببینید )تو این روش  سیستم عامل هر process که ساخته شده رو به صورت عادلانه از cpu بهره مند میکنه و اونهارو موقعی که نیاز بود یا نوبتشون شده بود به یکی از هسته های cpu میفرسته که کارشون رو بکنن و برنامه شما parallel ( موازی ) میشه  و مسلما سرعتش هم بیشتر میشه در اینجا یه نکته وجود داره وقتی cpu شما یک هسته ای باشه دیگه کدای شما موازی اجرا نمیشه اما نیاز نیست اصلا نگران باشید چون شما روی شانه های غول ها وایستادید پس سیستم عامل همه کارارو براتون انجام میده و در هر زمان یکی از process هارو اجرا میکنه این موقع دیگه کد شما موازی نیست بهش میگن concurrency  نکته : در انگلیسی concurrency = synchronism ولی در برنامه نویسی concurrency ≠ synchronismMultiThreading:ثرد ها در واقع همون بچه process ها هستن که داخلی یک process ایجاد میشن و همون کار process رو انجام میدن و سیستم عامل هم برای زمان بندی تو اجرای اون ها بین process ها فرقی نمیزاره اماااااااااااااا یه فرق بزرگ و چند تا فرق کوچیک این وسط هست اولیش اینه که دیتاها تو ثرد ها میتونن به اشتراک گذاشته بشن به این شکل نگاه کنید:همون طور که اون بالا میبینید همه thread ها به اطلاعات اشراک گذاشته شده دسترسی دارن فرق های کوچیکشون هم اینه که thread ها رم کمتری مصرف میکنن و زمانی که طول میکشه ساخته بشن کمتره ولی در عوض  process ها کار باهاشون راحت تره و سرعتشون هم یه مقدار از thread ها بیشتره یه مثال تو پایتون این هست :import threading 
import time 
import random   

def worker(number):    
    sleep = random.randrange(1, 10)     
    import threading   
     
for i in range(5):        
    t = threading.Thread(target=worker, args=(i,))     
    t.start()  
   
print(&amp;quotAll Threads are queued, let&#039;s see when they finish!&amp;quot)خیلی شبیه کدای multiprocessing هستن نه ؟ ولی هر کی که سیبیل که داره بابای من نیست :)))) این دوتا کد در باطن اصلا شبیه هم نیستن اصلا Cpython ( نسخه پیشفرض پایتون) نمیتونه موازی سازی با threading رو انجام بده! فقط یکی از اون ثرد ها هر لحظه اجرا میشه یه لحظه وایسا چی؟؟؟؟؟؟؟؟؟؟؟ پس اونا چی بود گفتی ؟؟؟ گرفتی مارو حاجی ؟خب برای درکه این مطلب باید یه playback بزنیم به وقتی که میخواستن Cpython رو درست کنن و از اول شروع کنیم ( بازم از اول :))) )داستان از اینجا شروع میشه که دوستان عزیزی که میخواستن Cpython رو بسازم میخواستن هرچی لایبرری C دم دستشون هست بیارن وصل کنن به python و اکستنشن های اضافی هم در آینده راحت نوشته بشن اما یه مشکل وجود داشت ۱- بیشتر لایبرری های سی thread safe نیستن ۲- نوشتن کدی که thread safe باشه دقت و تجربه و زمان بیشتری میخواد ( کلا سخته ) پس گفتن حاجی بیخیال ورداشتن یه قفل گنده زدن رو چیزی که ساختن گذاشتن اسمش رو هم گذاشتن ( GIL (Global Interpreter Lock و تادددددامممم مشکل حل شد نکته : تحقیق در مورد thread safe  بر عهده دانش آموز استخب یه سوال چرا میشه موازی سازی با multiprocessing کرد ولی نمیشه با multithreading کرد؟ جوابش تو تفاوت اصلی این دوتاس همون اطلاعات اشتراک گذاشته شده مشکل thread safe رو ایجاد میکنن از اونجا که توی multiprocessing اصلا این ویژگی نیست پس کلا این مشکل هم ایجاد نمیشه پس استفاده ازش بلا مانع هستشاعر در این لحظه میگوید: شت ! خب حالا که نمیتونیم از این ویژگی خفن استفاده کنیم باید چیکار کنیم؟۳ حرکت میتونیم بزنیم اولی اینکه این کار رو بسپاریم به یه چیزی خارج از از Cpython یا از یه نسخه پایتون استفاده کنیم که GIL نداره یا برای سر بار کمتر از Green thread استفاده کنیمآخریه چی هست؟ در واقع شبیه سازی کار ثردها روی یه ثرد هست یعنی شما میتونی هر بخش از کدت رو در هر لحظه اجرا کنی اما نمیتونی همزمان اجرا کنی یعنی همون thread با GIL که تو پایتون هست ( thread های پایتون واقعیین) اما چون thread ها توسط لایبری ها  ساخته میشن هم سرعت ساخته شدنشون بیشتره هم رم کمتری میگرن  هم سرعت سویچشون بیشتره اما خب کار باهاش یکم سخت تره (یه خرده)اینم یه شکل که درک کار GIL رو راحت میکنهAsyncIO : اسینک آی ا‌ٌ   در واقع خیلی جدید نیست قبلا یه پروژه third-party بوده ولی الان بخشی از پایتون شده و خیلی هم محبوب هست   این کاری که asyncio انجام میده کار جدیدی هم نیست توی زبان ها و فریمورک های دیگه هم وجود داره مثلا nodejs خب اصلا این asyncio چی هست ؟ چی کار میکنه ؟ و وقتی multithreading و multiprocessing هست چرا اصلا از این استفاده کنیم ؟ اسینک آی ا‌ٌ چیز خوبیه :))) (اگه خوب نبود که ۲ تا keyword براش توی پایتون نمیدادن ) یه کتابخونه برای ایجاد  concurrency توی برنامه های شما هست و از اسمش هم معلوم هست برای io طراحی شده مثلا وقتی میخواید ۱۰ تا ریکویست بزنید دیگه لازم نیست یه ریکویست بزنید بعد منتظر جواب بمونید بعد دوباره یکی دیگه بزنید و  ... همه اون ها رو یه جا ایجاد میکنید بعد منتظر جواب میمونید و وقتی جواب اومد یه event ران میشه که بقیه کد شما رو اجرا میکنه و همه این ها روی یه thread یا process انجام میشهیه مثال: import asyncio
import datetime
import random

async def my_sleep_func():
    await asyncio.sleep(random.randint(0, 5))

async def display_date(num, loop):
    end_time = loop.time() + 50.0    
    while True:
        print(&amp;quotLoop: {} Time: {}&amp;quot.format(num, datetime.datetime.now()))
        if (loop.time() + 1.0) &gt;= end_time:
                break
        await my_sleep_func()
        
loop = asyncio.get_event_loop()

asyncio.ensure_future(display_date(1, loop))
asyncio.ensure_future(display_date(2, loop))

loop.run_forever()الان سوال سوم  واقعا چرا ؟ جواب : بخاطر GIL ( مثل اینکه همه چیز تقصیر اینه) واقعا وقتی از ویژگی موازی سازی ثرد ها نمیتونیم استفاده کنیم که برای این طراحی شدن اصلا چرا ازشون استفاده کنیم؟ مسلمه asyncio رم خیلی کمتری مصرف میکنه و محدودیتی هم توی ایجاد event نداره اما greenthread هم هست که هم میشه تعداد زیادی thread توشون spawn کرد و رم کمی هم مصرف میکنن پس اونا چی ؟ خب تفاوتشون توی محدودیت این green thread هاست از اونجا که اینا همون شبیه سازیه thread واقعی هستن پس محدودیت های thread های اون ها رو هم دارن مثل thread safe  بودن یا ارتباط نداشتن thread ها به هم دیگه ( مثلا کال کردن یه متد توی یه ثرد از یه ثرد دیگه) و پیچیده شدن کد ها و ... از اونجا که asyncio به صورت رادیکالی متفاوت پیاده سازی شده پس اون مشکل ها رو نداره و شما میتونید با خیال راحت کاراتون رو بکنید به همین راحتی امیدوارم که مفید واقع شده باشه و جالب باشه براتون در ادامه لیستی از کلمات کلیدی میدم که خواستید سرچ کنید توی این موضوع به درد میخوره asyncio , celery , MQ , rabbitmq , sub pub ,  multithreading , multiprocessing , thread safe  , sync ,  concurrency , greenlet , greenthread , gunicorn , uwsgi منابع :https://labs.getninjas.com.br/go-vs-cpython-visual-comparison-of-concurrency-and-parallelism-d29a1ebec20a#targetText=AsyncIO%20and%20Gevent%2Dish%20options,controls%20the%20green%20thread%20switching.http://masnun.rocks/2016/10/06/async-python-the-different-forms-of-concurrency/سایت medium ,   ویکی پدیا و stackoverflow و quora و هر چی دم دستم اومده...اینم اگه دوست دارید بیشتر در مورد thread ها بخونید :https://virgool.io/@GreatBahram/once-for-ever-parallelism-1-iqyzjwqmks0n </description>
                <category>Just for Fun</category>
                <author>امیرحسین بیدار</author>
                <pubDate>Sat, 14 Sep 2019 00:32:02 +0430</pubDate>
            </item>
                    <item>
                <title>استفاده از Nginx به عنوان Load Balancer</title>
                <link>https://virgool.io/justforfun/%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-nginx-%D8%A8%D9%87-%D8%B9%D9%86%D9%88%D8%A7%D9%86-load-balancer-hg3rzsqib1dk</link>
                <description>سلام, اگر شما یه SysAdmin یا Developer هستید حتما با وب سرور Nginx آشنایی دارید. امروز توی این پست می خوام راهنماییتون کنم که چطور با Nginx یه Load Balancer ساده راه اندازی کنید.آشنایی با مفهوم Load Balancingخوب اجازه بدید خیلی ساده بگم چون احتمالا خودتون می دونید, Load Balancing یعنی تقسیم بار بین چند تا سرور, یعنی وظیفه ی پاسخ دادن به درخواست هایی که از سمت کلاینت میاد فقط به عهده ی یه سرویس دهنده نباشه و بین چند تا سرویس دهنده با الگوریتم های مختلف پخش بشه.مزیت این کار چیه ؟ خوب اول اینکه سرویس شما همیشه در دسترس هست, چون اگر یکی از سرویس دهنده ها مشکل براش پیش بیاد بقیه سرویس دهنده ها  جاش رو می گیرن, ولی اگه شما فقط ۱ سرویس دهنده داشته باشید و از دسترس خارج بشه کل سرویس شما ( مثلا وب سایت ) از کار میفته.مزیت دومش اینه که می تونید منابعتون رو مدیریت شده مصرف کنید! یعنی نسبت به حجم باری که روی وب سایتتون هست تعداد سرویس دهنده ها رو کم یا زیاد کنید.تا اینجا چند بار از مفهوم سرویس دهنده استفاده کردم, دلیل اینکه نگفتم سرور و گفتم سرویس دهنده پارسی رو پاس داشتن نبود... دلیلش این هست که وقتی می گیم سرور خود به خود یاد یه سرور HP G8 میفتیم با شونصد گیگ رم و ۸۰۰ تا CPU... اینطوری توی ذهنمون جا افتاده... در حالی که سرویس دهنده ( سرور ) ما می تونه یه VPS باشه, می تونه یه VM باشه یا حتی یه Docker Container.پیاده سازی Load Balancing با استفاده از Nginx:برای پیاده سازی Load Balancing ابزار های دیگه ای هم هست مثل HA Proxy, اما خوب راه انداختن Load Balancing با  Nginx خیلی ساده هست.بریم سر اصل مطلب, فرض کنید ما یه Rest API داریم که روی پورت 80 پاسخ می ده و می خوایم روی این سرویس API خودمون  ‌Load Balancing پیاده کنیم.به مثال زیر نگاه کنید:    upstream api {
        server 192.168.1.10;
        server 192.168.1.11;
        server 192.168.1.12;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://api;
        }
    }خوب چه اتفاقی داره اینجا میفته ؟ ما اینجا با استفاده از کلمه ی کلیدی server یه بلاک تعریف کردیم و توش مشخص کردیم که هر درخواستی روی پورت 80 رسید رو از طریق HTTP بفرست روی یه سرویسی به اسم api. اما این api چی هست ؟ api یه بلاک دیگه توی Nginx هست که ما با استفاده از کلمه ی کلیدی upstream تعریفش کردیم, در واقع مرکز اصلی Load Balancing توی Nginx همین بلاک upstream هست. اون api هم که جلوی upstream نوشتیم یه اسم دلخواه هست و هر چیزی می تونه باشه.خوب پس تا اینجا ما به پورت ۸۰ گوش کردیم و هر درخواستی که اومد سمت این پورت رو فرستادیم سمت یه upstream به اسم api. اما این چیزایی که توی upstream نوشتیم چی هست ؟ خوب همونطور که مشخصه و شما هم انسان باهوشی هستید احتمالا متوجه شدید که ما توی این upstream سه تا سرور ( سرویس دهنده ) تعریف کردیم, فرض کنید این سه تا ip در واقع ip سه تا VM هست و سرویس api ما روی هر سه تا ماشین بالاس.همونطور که قبلا گفتم شما می تونید حتی از یه Docker Container هم یه عنوان سرویس دهنده استفاده کنید... خوب چجوری ؟ اجازه بدید یه دونه Container فرضی به استک سرویس دهنده هامون اضافه کنیم.    upstream api {
       server 192.168.1.10;         
       server 192.168.1.11;         
       server 192.168.1.12;
       server 192.168.1.13:34800  // یه کانتینر که روی پورت 34800 جواب می ده
    }به همین راحتی!حتی ما می تونیم پامون رو فراتر بزاریم و درخواستمون رو بفرستیم روی یه دامین دیگه!upstream api {
    server 192.168.1.10;                 
    server 192.168.1.11;                 
    server 192.168.1.12;        
    server 192.168.1.13:34800  // یه کانتینر که روی پورت 34800 جواب می ده
    server srv5.example.com; // اینجا
}خوب اصل قضیه تموم شد! به همین راحتی شما یه Load Balancer دارید.اما همونطور که گفتم Load Balancing الگوریتم های مختلفی داره, اینی که ما استفاده کردیم بهش می گن round-robin که در واقع درخواست ها رو نوبتی و به ترتیب می فرسته روی سرویس دهنده ها.الگوریتم های دیگه ای هم هست مثل ip_hash که به اینصورت کار می کنه که هر یک کلاینت رو فقط به یه سرور وصل می کنه. یکی از کاربرد های مهم این الگوریتم این هست که شما می تونید session کاربر رو حفظ کنید ( مثلا لاگین بودن کاربر ).مثال:upstream api {
    ip_hash; // مشخص کردن الگوریتم
    server 192.168.1.10;                      
    server 192.168.1.11;                      
    server 192.168.1.12;
}


خوب توضیحات من تموم شد, امیدوارم مفید بوده باشه! برای اطلاعات بیشتر می تونید این صفحه رو بخونید.</description>
                <category>Just for Fun</category>
                <author>کوروش شریفی</author>
                <pubDate>Fri, 13 Sep 2019 13:46:39 +0430</pubDate>
            </item>
                    <item>
                <title>بیاین بریم قطب جنوب!!!/چرا لینوکس؟ قسمت 0</title>
                <link>https://virgool.io/justforfun/%D8%A8%DB%8C%D8%A7%DB%8C%D9%86-%D8%A8%D8%B1%DB%8C%D9%85-%D9%82%D8%B7%D8%A8-%D8%AC%D9%86%D9%88%D8%A8%DA%86%D8%B1%D8%A7-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-%D9%82%D8%B3%D9%85%D8%AA-0-vjuyxyoohk6n</link>
                <description>قبل از شروع مطلب، روز برنامه نویس رو تبریک میگم(این مطلب قرار بود چند روز دیگه استارت بخوره، ولی به مناسبت این روز الان این مطلب رو میبینید!)خب بریم سر اصل مطلبمن میترسم!!!!خب این یک نکته طبیعیه، منم به عنوان کسی که از بچگی ویندوز داشته اولاش میترسیدم. وقتی چند سال از یه سیستم عامل استفاده کنیم، معلومه میترسیم که به یه سیستم دیگه سوییچ کنیم!! اما دلایل این ترس چیه؟لینوکس سخته!خب به هیچ وجه این حرف رو به یک لینوکسی نزنید! اگه بخوایم از سخت حرف بزنیم، ویندوز از همه سخت تره!درواقع ما میگیم ویندوز آسونه چون بهش عادت کردیم!لینوکس برای برنامه نویسا و خوره های کامپیوتره!معلومه که نه! در واقع لینوکس تو چند سال اخیر انقدر ساده شده که حتی کسی که فقط با کامپیوترش وبگردی میکنه هم میتونه ازش استفاده کنه!دسکتاپ لینوکس فقط یه ترمینال سیاه با کد های عجیبه!اگر همچین حرفی به کسی که از لینوکس استفاده میکنه بزنید، هیچکاری تون نمیکنه و فقط میخنده!تو زمینه دسکتاپ میشه گفت که لینوکس از ویندوز و مک هم بهتره، علاوه بر زیبایی های دسکتاپ هاش انقدر قابلیت شخصی سازی داره که تو ویندوز با هزار تا افزونه و نرم افزار نمیتونید به گرد پاش برسید!نصب لینوکس سخته!درواقع اگه تو نصب لینوکس حواستون به انتخاب پارتیشن ها باشه نصبش حتی از ویندوز هم راحت تر میشه.در نصب لینوکس باید گزینه ها رو با دقت بخونید(نه همش Next و Next و Next!!!)نرم افزار و بازی های لینوکس کمه!داخل لینوکس جایگزین واسه همه نرم افزار ها هست، ویرایشگر عکس و ویدیو،ویرایشگر متن،مرورگر و...ولی خل اگه روی نرم افزار های ادوبی تعصب دارید یا اینکه به نظرتون اونا بهترن، باید از ویندوز استفاده کنید و یا در لینوکس از شبیه ساز wine استفاده کنید(این مورد تو برنامه نویسی زبان سی شارپ هم صدق میکنه، برعکس پایتون تو لینوکس بهتر عمل میکنه)در مورد نرم افزار های آفیس هم یا میتونید از لیبر آفیس استفاده کنید که نه تنها چیزی از آفیس مایکروسافت کم ندراه بلکه میتونه فایل هاش رو به فایل های آفیس مایکروسافت تبدیل کنه. اگر هم نمیخواین میتونید از نسخه تحت وب مایکروسافت آفیس استفاده کنید که چندان فرقی با نرم افزارش نداره.اما اگر یک گیمر هستید باید بگم که باید از ویندوز استفاده کنید یا اگر یه سیستم قوی دارید از شبیه ساز wine استفاده کنید.البته بگم که لینوکس از بازی هایی مثل Dota و Minecraft پشتیبانی میکنه.درواقع بازی های لینوکس با اینکه کمن، اما نسبت به ویندوز با سرعت بیشتری اجرا میشن!چمدون رو ببندیم!خب حالا دیگه وقتشه چمدون رو ببندیم و بریم به سمت قطب جنوب، دنیایی آزاد با پنگوئن های لینوکسی!!!قسمت بعد، ویندوز یا لینوکس؟</description>
                <category>Just for Fun</category>
                <author>Max Vortex</author>
                <pubDate>Fri, 13 Sep 2019 11:15:59 +0430</pubDate>
            </item>
                    <item>
                <title>روز برنامه‌نویس</title>
                <link>https://virgool.io/justforfun/httpsvirgooliosadeghaliakbary%D8%B1%D9%88%D8%B2-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3-olfpztp6hjhj</link>
                <description>چند سالی است که روز ۲۲ شهریور مطابق با ۱۳ سپتامبر (۱۲ سپتامبر در سال‌های کبیسه) در بسیاری از کشورهای جهان به عنوان روز برنامه‌نویس شناخته می‌شود. این روز، دویست و پنجاه و ششمین روز سال در تقویم میلادی است. حالا چرا 256 ؟ برنامه‌نویسان خوب می‌دانند! برنامه‌نویسی یعنی تولید برنامه به زبانی که کامپیوتر بفهمد. از طرف دیگر در میان اعدادی که کوچکتر از ۳۶۵ (که تعداد روزهای یک سال است) هستند، عدد ۲۵۶ بزرگترین توان عدد 2 است. همچنین در سیستم اعداد دودویی (باینری)، یک بایت می‌تواند حداکثر ۲۵۶ عدد متمایز را پشتیبانی کند. پس عدد ۲۵۶ عددی آشنا برای کامپیوترها، و البته برای برنامه‌نویس‌هاست!مهندسان کامپیوتر و کارشناسان حوزه فناوری اطلاعات از اهمیت برنامه‌نویسی آگاهند. وجود موقعیت‌های شغلی فراوان در جهان و البته در ایران، رونق کسب‌وکارهای مبتنی بر برنامه‌نویسی و اشتیاق دانشجویان به تحصیل در رشته کامپیوتر، از نشانه‌های اهمیت روزافزون برنامه‌نویسی در ایران و البته در جهان است. اگر به فضای استارتاپی کشور هم بنگرید، بخش قابل توجهی از کسب‌وکارهای نوپا و موفق در ایران به حوزه فناوری اطلاعات متعلق است که مستقیماً به برنامه‌نویسی کامپیوتر وابسته است.اما دیگر برنامه‌نویسی مهارتی مختص مهندسان و کارشناسان حوزه کامپیوتر نیست. در سال‌های اخیر، نیاز به مهارت برنامه‌نویسی در بسیاری از شغل‌های دیگر دیده می‌شود. امروزه متخصصان مختلفی را از حوزه‌های مختلف می‌بینیم که برنامه‌نویسی می‌دانند. من پزشکان، روانشناسان، هنرمندان، مهندسان غیرکامپیوتری (مثل مهندس عمران و مکانیک) و دانشمندان حوزه‌های علوم انسانی (مثل مدیریت و اقتصاد) و متخصصان علوم پایه (مثل فیزیک و ریاضی) فراوانی می‌شناسم که از مهارت برنامه‌نویسی به شکل جدی در شغل خود استفاده می‌کنند. ولی این هم همه ماجرا نیست. شعار بسیاری از متخصصان در سال‌های اخیر، مهارت برنامه‌نویسی برای همه مردم است. نه فقط کسانی که در شغل خود به صورت مستقیم یا غیرمستقیم به برنامه‌نویسی کامپیوتر نیاز دارند. استیو جابز معتقد بود که همه مردم باید برنامه‌نویسی کامپیوتر یاد بگیرند، زیرا برنامه‌نویسی به شما می‌آموزد که چگونه فکر کنید. در واقع، برنامه‌نویسی یک روش حل مسأله (Problem Solving) است. حتی اگر در زندگی شغلی از مهارت برنامه‌نویسی استفاده نکنید، در ابعاد مختلف زندگی به مهارت حل مسأله نیاز خواهید داشت.من برنامه‌نویسان مختلفی را می‌شناسم که عاشق این کارند. اما چرا؟ حل مسأله، حس رضایت در انسان ایجاد می‌کند. ولی برنامه‌نویسی فقط حل مسأله هم نیست! فضای برنامه‌نویسی، جایی بین دانش، مهارت و هنر است. یعنی روح و احساس و میل به زیبایی‌شناسی را نیز گاهی درگیر می‌کند. به‌علاوه، برنامه‌نویسی به معنی خلق کردن برنامه‌های جدید است. یک برنامه‌نویس، هر روز در حال خلق کردن یک موجود جدید کامپیوتری و نرم‌افزاری است. حسی که خلق کردن و خلاقیت در انسان ایجاد می‌کند، شگفت‌انگیز است. خلق کردن کار خوبی است، وگرنه خدا هم این کار را انجام نمی‌داد!نمی‌دانید خلق کردن برنامه‌های کامپیوتری چه حس خوبی دارد! می‌دانید؟!...پی‌نوشت: یادگیری برنامه‌نویسی مختص سن و شغل و تحصیلات خاصی نیست. اگر دسترسی به کامپیوتر و اینترنت دارید، از همین امروز شروع کنید. آدرس دسترسی به چند آموزش ویدیویی برنامه‌نویسی در ادامه آمده است. شما هم اگر آموزش خوبی می‌شناسید، کامنت بگذارید.https://maktabkhooneh.org/course/برنامه-نویسی-پیشرفته-mk187/https://gotoclass.ir/courses/آموزش-پایتون/https://javacup.ir/javacup-training-videos/https://quera.ir/college/https://sokanacademy.com/courses/python/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86</description>
                <category>Just for Fun</category>
                <author>صادق علی‌اکبری</author>
                <pubDate>Thu, 12 Sep 2019 12:16:52 +0430</pubDate>
            </item>
            </channel>
</rss>