<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Gholamhossein Tavasoli</title>
        <link>https://virgool.io/feed/@gtavasoli</link>
        <description>فعلا چیزی برای گفتن ندارم. ان شاء الله تا بعد...</description>
        <language>fa</language>
        <pubDate>2026-06-16 06:04:23</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/54448/avatar/jTTnxm.png?height=120&amp;width=120</url>
            <title>Gholamhossein Tavasoli</title>
            <link>https://virgool.io/@gtavasoli</link>
        </image>

                    <item>
                <title>کجا نباید از Airflow استفاده کرد؟</title>
                <link>https://virgool.io/@gtavasoli/airflow-bad-practice-idzp6pupeow8</link>
                <description>مقدمهخوب فرصتی دست داد  تا راجع به تجربه کاری که در مورد Airflow داشتیم، بنویسم. بسیاری از  راهنماهای کاربری و آموزش ها صرفا به جنبه های و ویژگی های گوناگون مورد  آموزش می پردازند. بعضی وقت ها اگر بدانیم یک تکنولوژی به درد چه کار هایی  نمی خورد، به مراتب راه گشاتر از دانستن موارد مناسب بکارگیری آن است. چرا  که استفاده از یک تکنولوژی در جای نادرست می تواند منجر به افزایش هزینه  تولید محصول شود.اخیرا در یکی از پروژه ها می بایست یک ETL پیاده  سازی کنیم. در حقیقت نیاز به Fetch مجموعه متنوعی داده، دستکاری آن و در  نهایت ذخیره سازی در پایگاه داده داشتیم. یکی از کاندیداهای پیاده سازی ETL  نرم افزار Airflow بود. چرا؟ چون وقتی کلمات کلیدی نظیر etl python و یا data pipeline python رو جستجو کنید هزار و شونصد تا پست میاد و میگه که میشه با Airflow یک  پایپلاین دیتا راه اندازی کرد. برای تیم ما مهم بود تکنولوژی که استفاده می  کنیم برای این کار مبتنی بر پایتون باشد (که اشتباه می کردیم، حتی اگر  نصفه و نیمه پایتون رو هم پشتیبانی می کرد کافی بود). حتی شما وقتی etl airflow رو هم جستجو کنید به تعداد بسیاری مقاله می رسید که به شما می فهمانند که Airflow برای این کار هست. این طور شد که به دام افتادیم! معرفی Airflowدر مستندات Airflow می خوانیم:نرم افزار Airflow یک پلتفورم است که امکان ساخت، زمانبندی و مانیتور گردش‌های کاری را از طریق برنامه نویسی بدست می دهد.از  Airflow می توان برای نوشتن گردش کار به شکل یک گراف بدون دور جهت دار  (DAG) از وظایف استفاده کرد. زمانبند Airflow در حالی که وابستگی های مشخص  شده در گراف را دنبال می کند، وظایف شما را در قالب یک آرایه از گردش های  کاری اجرا می کند.به بیان دیگر شما وظایف را در قالب  یک تابع به زبان پایتون پیاده سازی می کند، از طرف دیگر با همین زبان  وابستگی بین وظایف از نظر اجرا را مشخص می کنید که در نتیجه آن گردش کاری  تعریف می شود. در نهایت زمابند Airflow این گردش های کاری را اجرا طبق  زمانبندی اجرا می کند. یعنی یک Job Scheduler که وابستگی زمانی اجرای بین  Jobها رو هم در نظر میگیره. برای یک ETL که قرار هست یه سری کار پشت سر هم  روی دیتا اعمال بشه چی از این بهتر! این  پلتفرم یک رابط کاربری در اختیار شما قرار می دهد تا گردش های کاری را  مانیتور کنید، اجرای گردش کاری را متوقف و یا آغاز نمایید و یا اقدام به  عیب یابی در صورت بروز خطا کنید. Airflow همچنین اولین پیاده سازی موفق از  یک الگوی مفید و انعطاف پذیر گردش کاری به شکل کد (Workflow-as-Code) است.اما نکته مهمی که باید به آن توجه کرد این است که Airflow ابزار خوبی برای طراحی گردش های کاری با حرکت کند و اجرای ایستا در یک زمانبندی ثابت است. یعنیبرای جابجایی های سریع بین وظایف و همچنین وظایف سریع ساخته نشده است.طراحی نشده تا مدام در فرایند کار گردش کاری را تغییر دهید.در این مقاله قصد آموزش Airflow رو ندارم؛ تا دلتون بخواد منابع خوب برای یادگیری Airflow روی وب پیدا میشه؛ مستندات خوبی هم داره.بعد  از تجربه تلخ بکارگیری Airflow برای راه اندازی یک ETL، و در نهایت کنار  گذاشتن آن، اخیرا به مقاله ای بر خوردم که به طور فنی به این مساله پرداخته  است که «چرا Airflow نه؟».  برای دانستن این مساله بهتر است به مقاله مراجعه فرمایید. این مقاله نسبتا  طولانی است و در این پست بنده بخشی از مقاله را به صورت خلاصه، بخصوص  مواردی که ما در پروژه آن را تجربه کرده ایم، برجسته کرده ام.برای چه کارهایی Airflow مناسب نیست؟در مقاله یاد شده آمده است:کاربران غالباً با چپاندن مورد استفاده خود در مدل Airflow خودشون رو به دردسر می اندازند. (ما رو میگه! ) برای نمونه از مواردی که Airflow نمی تواند به طور قابل قبولی برآورده کند می توان به موارد زیر اشاره کرد:۱.  پیاده سازی DAG هایی که بخواهیم آن ها رو بدون زمانبندی یا خارج از  زمانبندی اجرا کنیم (ما به این مشکل خوردیم. در مورد اجرای یک DAG بر اساس  تقاضا – OnDemand DAG)۲. اجرای DAG ها به صورت موازی با زمان شروع یکسان۳. DAG های حاوی انشعابات با منطق های پیچیده۴. DAG های با تعداد زیاد وظایف سریع۵.  DAG هایی که بر روی تبادل داده بین وظایف تکیه دارند (این بزرگترین مشکل  ما در جابجا کردن دیتا بین وظایف بود، هم از نظر حجم و هم از نظر نوع)۶. DAG های پارامتری۷. DAG های پویامعمولا  شرکت های متوسط-تا-بزرگ برای این که بر موارد فوق فائق بیان در نهایت  مجبور میشن یک DSL سفارشی شده بنویسند یا پلاگین های بخصوصی رو پیاده سازی  کنند تا این دست نیازمندی ها را رفع کند. در نهایت ارتقاء سیستم سخت میشه و  سربار نگهداری به طور چشمگیری افزایش پیدا می کند. این یعنی بهتره دنبال  ابزار بهتری باشید کاری که ما در نهایت مجبور به انجام آن شدیم. در ادامه مقاله به نقایص بخش های مختلف Airflow پرداخته که در اینجا تنها به برخی از موارد تجربه شده توسط خود ما اشاره می شود.جریان داده (Data Flow)این یک دام است، لطفا گول نخورید. با  توجه به آنچه که در مقدمه گفته شده، یکی از متداول ترین موارد استفاده از  Airflow ایجاد نوعی خط لوله داده است. این خیلی مسخره است؛ و واقعا من  موندم چرا اینقدر این مورد تبلیغ میشه. چون اصلا Airflow از جریان داده به  طور خیلی خوب (و یا حتی خوب) پشتیبانی نمی کنه.یه امکانی به اسم  XCom، (چه اسم خفنی) برای تبادل قطعات کوچک متادیتا بین وظایف ارائه کرده  است. بعدها از روی بررسی schema دیتابیسی که Airflow داره ازش استفاده می  کنه متوجه شدیم این XCom در قالب یک جدول پیاده سازی شده! این یعنی اگر شما  نیاز به تبادل داده زیاد بین وظایف داشته باشید، یکی از جدول های پایگاه  داده شما مدام در حال نوشته شدن و خوانده شده است. عجب! استفاده از جدول به  عنوان فضای اشتراکی بین وظایف!حالا ما چطور می خواستیم از این  امکان برای تبادل دیتا (ی بخصوص حجیم) بین وظایف استفاده کنیم. قاعدتا باید  یک فضای ذخیره سازی دیگری می داشتیم تا داده ها را در اون ذخیره کنیم و  بهشون ID و یا آدرس بدیم و بجای داده این ID یا آدرس را از طریق XCom بین  وظایف جابجا کنیم!!!معایب این مکانیزم:در یک محیط توزیع شده نیاز به یک فضای ذخیره سازی ابری (اشتراکی) برای همه وظایف است.مجوز نوشتن در پایگاه فراداده Airflowاین داده ها زمان انقضاء ندارند، این یعنی خودتون باید مدیریتشون کنیدامکان XCom  وابستگی upstream/downstream شدیدی بین وظایف ایجاد می کند که Airflow و  زمانبند از آن اطلاعی ندارند. اگر کاربر دقت نکند Airflow ممکن است این  وظایف را به ترتیب اشتباهی انجام دهد.def puller(**kwargs):
    ti = kwargs[&#039;ti&#039;]
    # get value_1
    v1 = ti.xcom_pull(key=None, task_ids=&#039;push&#039;)مشکل  دیگه این که تازه کارها، پایگاه داده خود را به خاطر استفاده بیش از حد از  XCom از بین می برند. دیده شده کسی یک داده کوچک (۱۰ گیگابایتی!) ایجاد  کرده و با کمک XCom آن را بین چند وظیفه جابجا کرده است. حالا اگر ۱۰ تا  وظیفه اینجا داشته باشیم هر اجرا ۱۰۰ گیگابایت داده دائمی را در پایگاه  داده فراداده XCom ذخیره می کند!!!یه تعداد محدودیت دیگه هم در مقاله اشاره شده که در ادامه به چندتا از آن ها به طور خلاصه اشاره کردم.زمانبندی و زمانیکی  از گیج کننده ترین موارد برای تازه واردها به دنیای Airflow مساله  زمانبندی است. مقاله جزئیاتی در مورد این امکان بیان می کند؛ به طور خلاصه  اگر بخواهیدگردش کاری خود را با یک زمانبندی نامنظم یا بدون زمانبندی اجرا کنید،چندین اجرای همزمان از یک گردش کاری را بخواهید اجرا کنید،گردش کاری را تنها برای اجرای دستی نگهداری کنید. (یکی از مواردی که ما به شدت تو کارمون بهش نیاز داشتیم.)راه حل Airflow ابزار درستی برای کارتان نخواهد بود.سرویس زمانبند Airflowستون فقرات Airflow سرویس زمانبند آن است؛ سرویس زمانبند مسئول موارد زیر است:وارسی پوشه DAG ها هر چند ثانیه برایچک کردن زمانبندی DAG ها و تعیین این که آیا یک DAG آماده اجرا استچک کردن تمام وابستگی وظایف برای تعیین این که آیا وظایف برای اجرا آماده اند.ذخیره آخرین وضعیت یک DAG در پایگاه دادهسرویس زمانبند Airflow از مشکلاتی رنج می برد، که می توان به موارد زیر اشاره کرد:سرویس  متمرکز زمانبند Airflow تاخیری بین نقطه زمانی برآورده شدن همه پیش نیاز  ها و اجرای وظیفه ایجاد کرده است. بنابراین اگر وظایف شما از نظر اجرا  طولانی باشند (این تاخیر قابل چشم پوشی است) همه چی روبراه است اما اگر  تعداد زیادی وظیفه کوتاه داشته باشید و یا این که زمان برای شما مهم باشد  به راحتی زمانبند به گلوگاه تبدیل می شود. ما به این مشکل بر خوردیم، یه  مشت جاب کوچیک داشتیم که داده های ورودی رو دستکاری می کرد و انتظار داشتیم  به صورت Real-Time اجرا بشن ولی این اتفاق نیافتاد.سرویس زمانبند Airflow ذاتا متمرکز است؛ این مساله آن را به یک نقطه خرابی واحد برای سیستم تبدیل کرده است.این  که هر چند ثانیه پوشه DAG ها مجدد بررسی می شود تا تغییرات DAG ها ثبت  شود، می تواند منجر به ناسازگاری شود. (حالتی را در نظر بگیرید زمانبند در  حال اجرای وظیفه است، زمانی که می خواهد مجددا از خود نمونه سازی کند، در  حالی که متوجه می شود دیگر وجود ندارد!)نرم افزار Airflow از اجرا کننده های  متعددی نظیر پردازه های محلی، Celery، Dask و Kubernates برای افزایش بهره  وری پشتیبانی می کند، اما خود زمانبند مجددا گلوگاه می شود برای اجرا (با  تنظیمات پیش فرض) ۱۰ ثانیه برای هر اجرا زمان صرف می شود (۵ ثانیه برای این  که وظیفه به صف اجرا برود، ۵ ثانیه هم برای ارسال برای اجرا!).گردش کار پارامتری در Airflowیکی  دیگه از مسایلی که ما تو کار باهاش مواجه شدیم این بود که DAG ها باید به  صورت ایستا تعریف می شدند و امکان اجرای پارامتری آن وجود ندارد. بنابراین  برای انجام یه کار مشخص برای منابع دیتای مختلف، API های گوناگون باید DAG  های مختلفی با بدنه یکسان تولید می کردیم.خیلی خوب میشه اگر گردش  کاری داشته باشیم که بتونه به ورودی های مختلف پاسخ بده. یه گردش کار ممکنه  مراحلی رو داشته باشه که بشه اون ها رو برای اطلاعاتی که از API ها،  دیتابیس ها و یا ID های مختلف میاد تکرار کنه. یعنی یه منطق پردازشی یکسان  داشته باشیم برای ورودی های مختلف.این مدل جزء الگوهای اصلی Airflow  نیست؛ با این حال با توجه به این که پوشه DAG ها هر چند ثانیه مجددا چک می  شود، می تونیم با استفاده از متغیر ها در Airflow این الگو رو پیاده سازی  کنیم.گردش کار پویابعضی وقت ها نیاز  هست یه وظیفه مشخص در گردش کار به تعداد نامعلومی تکرار شود. برای مثال فرض  کنید وظیفه A یه کوئری به دیتابیس میزنه و فهرست مشتریان جدید رو بازیابی  می کنه بعد قرار هست CustomerID بره برای وظیفه دیگه ای که یه سری پردازش  روش انجام بشه. تنها گزینه پیاده سازی این سناریو در Airflow پیاده سازی یک  وظیفه downstream هست که لیستی از ID ها رو به عنوان ورودی بگیره و با یه  حلقه روی اون یه تعداد عملیات انجام بده. مشکلش چیه:رابط کاربری جریان کاری پویا رو نمی فهمه، رو همین حساب مانیتورش هم سخت میشهاگر یکی از رکوردها دچار خطا بشه، کل وظیفه به خطا میخورهعمل «تلاش مجدد» رو باید خودت پیاده سازی کنی و سیستم از عمل شما آگاه نمیشهتخصیص نسخه به گردش های کاریامکان  تخصیص شماره نسخه به DAG به صورت داخلی در Airflow در نظر گرفته نشده است.  اگر بخواهید نسخه های قدیمی DAG خود را داشته باشید باید با نام دیگری آن  را ذخیره کنید. از طرف دیگه رابط کاربری اصلا چیزی راجع به نسخه DAG شما  نمی دونه. در عمل شما باید DAG هاتون رو توی Git مدیریت کنید و در Airflow  از روش های قدیمی تر مثل اضافه کردن شماره نسخه به نام فایل DAG برای مشخص  کرده نسخه DAG استفاده کنید. یعنی مدیریت نسخه اینقدر فشل!جایگزین Airflow برای راه اندازی ETLما به جایگزین به مراتب بهتری برای راه اندازی یک خط لوله داده رسیده ایم. این جایگزین ذاتا برای این کار طراحی شده است. ما از Apache NiFi برای دریافت داده، پردازش آن و همچنین ذخیره سازی در پایگاه داده استفاده کردیم.مزایای استفاده از این ابزار عبارت است از:برعکس  Airflow که رابط کاربریش تنها یک بازنمایی از دیتابیس هست، کلیه کارهای  NiFi از طریق رابط کاربری انجام میشه؛ در واقع NiFi برای انجام همه کارهاش  یک REST API ارائه کرده رابط کاربری روش سوار شده. بنابراین کلیه کارهای  مربوط به ساخت گردش های کاری، تنظیمات وظایف و پایش گردش های کاری از طریق  رابط کاربری انجام میشهذاتا برای جریان داده طراحی شده است؛ بین  هر دو وظیفه یک صف قرار داده شده؛ بنابراین هر زمان که بخواهید می توانید  یک وظیفه را متوقف کنید، بدون آن که نگران از دست رفتن داده باشید. پس از  انجام تنظیمات دوباره وظیفه را اجرا و داده های درون صف را پردازش کنید.  این یعنی در زمان اجرا شما می تونید جریان کاری رو دستکاری کنید.امکان  ساخت وظیفه دلخواه را به صورت بومی با کنترل کامل با Java و به صورت  اسکریپتی با امکانات محدود با زبان های دیگه مثل Python براش وجود دارهبرعکس Airflow برای وظایف سریع و با تاخیر کم طراحی شدهنرم افزار NiFi به صورت توزیع شده طراحی شده و پارامترهای کلیدی خود را در پایگاه داده توزیع شده Zookeeper نگهداری می کنهامکان  تخصیص نسخه به گردش های کاری کاملا پشتیبانی میشه. اصلا شما یه چیزی به  اسم NiFi Registry دارید که وصلش می کنید به Git. با تغییر نسخه با یه  آپدیت می تویند جریان کاریتون رو بروز کنید.امکان دنبال کردن تمامی تغییرات دیتا از نقطه ورود تا پایان جریان کاری رو دارید (Data Provenance)ان شاءالله اگر عمری باقی بود، جزئیات بیشتری در پست های بعدی در مورد نای فای ارائه خواهد شد.مطالب مرتبطتوازن بار با کمک HAProxyرابط کاربری خط فرمان سفارشیاین نوشتار پیش‌تر در سفر خاک منتشر شده است. https://gtavasoli.com/airflow_bad_practice </description>
                <category>Gholamhossein Tavasoli</category>
                <author>Gholamhossein Tavasoli</author>
                <pubDate>Thu, 10 Feb 2022 14:34:18 +0330</pubDate>
            </item>
                    <item>
                <title>رابط کاربری خط فرمان سفارشی</title>
                <link>https://virgool.io/@gtavasoli/%D8%B1%D8%A7%D8%A8%D8%B7-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%DB%8C-%D8%AE%D8%B7-%D9%81%D8%B1%D9%85%D8%A7%D9%86-%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C-rw82cgszixw3</link>
                <description>اخطار: روش ارائه شده در این پست قابل دور خوردن است. روش های دور زدن و مقابله با آنها در نوشتاری دیگر تشریح خواهد شد!حالتی را در نظر بگیرید که بخواهید اجازه دسترسی به رابط کاربری خط فرمان  را به کاربری بدهید و در عین حال کاربر تنها مجاز به اجرای برخی فرامین خاص  سیستم عامل باشد. برای مثال فرض کنید بخواهید به کاربر تنها اجازه  پیکربندی اولیه سیستم را با دستوراتی مثل ifconfig، ip، route، date و …  بدهید. برای انجام چنین کاری نیاز به رابط کاربری خط فرمان سفارشی دارید.در این پست یکی از روش های ایجاد رابط کاربری خط فرمان سفارشی (محدود) را  تشریح می کنم. انشاالله در پست های بعدی روش های دیگری برای ساخت رابط  کاربری خط فرمان سفارشی تر! ارائه خواهد شد. لازم به ذکر است روش ارائه شده  در این نوشتار تنها بر روی سیستم عامل لینوکس تست شده است.معرفی rbashنرم افزار rbash گزینه جایگزین حساب کاربری chroot شده است. (chroot چیه؟ بعدا راجع بهش میگم) در واقع rbash همون bash هست با این تفاوت که برخی امکانات shell در اون غیر فعال شده است. برای  مثال اگر shell یک کاربر رو rbash قرار بدیم امکان تغییر متغیر محلی PATH  رو نخواهد داشت یا از آدرس کامل برای اجرای دستورات نمی تونه استفاده کنه و  یا اینکه امکان تغییر مسیر جاری از طریق دستور cd را ندارد.اگر به بخش ۶.۱۰ راهنمای کاربری bash مراجعه کنید، می تونید فهرست محدودیت هایی که rbash برای کاربر ایجاد می  کنه رو مشاهده کنید. برخی از محدودیت ها رو اینجا فهرست کردم.تغییر مسیر جاری با دستور cdذخیره و یا حذف مقادیر از متغیرهای SHELL، PATH، ENV و BASH_ENVقرارگیری / (اِسلَش) در نام دستورذخیره خروجی دستور به کمک عملگرهای &gt;, &gt;|, &lt;&gt;, &gt;&amp;, &amp;&gt; و &gt;&gt;استفاده از دستور exec برای جایگزینی shell با یک دستور دیگهخاموش کردن مد محدود شده با set +r و یا set +o restrictedاگر به فهرست کامل موارد غیر فعال شده در rbash نگاهی بیندازید متوجه می شوید کاربر را تا حد زیادی محدود می کنه. با این حال روش های بسیاری وجود دارد تا کاربر از حصار rbash فرار کند! در پست های بعدی به برخی از این روش های اشاره می کنیم.راهنمای کاربری rbashدر این پست برای مساله کانفیگ اولیه سیستم که در مقدمه عنوان شده از روشی  استفاده می کنیم که محدودیت بیشتری برای کاربر ایجاد کنه. چون rbash به  تنهایی جلوی اجرای دستورات دلخواه توسط کاربر را نمی گیرد. اگر بخواهیم  دستوراتی که کاربر قادر به اجرای اون هست رو هم محدود کنیم کار بیشتری باید  انجام بشه.راه اندازی rbashابتدا یک لینک از bash ایجاد کنید:# ln -s /bin/bash /bin/rbashکاربر جدیدی ایجاد نمایید. shell مربوط به این کاربر را rbash قرار دهید.# useradd -s /bin/rbash localuserدر  صورتی که کاربر از قبل وجود داشت کافی است با دستور زیر bash کاربر را به  rbash تغییر دهید. (مستقیما هم می تونید فایل /etc/passwd را ویرایش کنید و  shell کاربر مورد نظرتون رو تغییر بدید)# usermod -s /bin/rbash localuserخوب  حالا اگر کاربر localuser وارد سیستم بشه rbash براش فعال میشه و محدودیت  هایی که گفتیم براش اعمال میشه. مثلا دیگه نمی تونه با cd از پوشه homeش  خارج بشه.اعمال محدودیت بیشتر در خط فرمانخوب حالا می خوایم دستوراتی که کاربر میتونه اجرا کنه رو به تعدادی  دستور خاص محدود کنیم. در مورد مثال کانفیگ ذکر شده در مقدمه می خوایم  دستوراتی مثل ip, ifconfig, route, ping و date رو برای کاربر فعال کنیم.برای این کار در مسیر home کاربر یک پوشه به اسم bin (یا هر اسم دیگه ای) ایجاد می کنیم.# mkdir /home/localuser/binسپس فایل .bash_profile را در مسیر home کاربر ایجاد می کنیم. ( /home/localuser/.bash_profile) و در این فایل مقادیر زیر را می نویسیم:# cat /home/localuser/.bash_profile  
# .bash_profile  

# Get the aliases and functions  
if [ -f ~/.bashrc ]; then  
. ~/.bashrc  
fi  
# User specific environment and startup programs  
PATH=$HOME/bin  
export PATHکلکی  که از طریق این فایل زدیم اینه که پوشه bin کاربر رو به همونی که در مسیر  homeش ساختیم محدود کردیم. خوب حالا کافیست لینک دستوراتی که میخواید کاربر  بتونه اجرا کنه رو در پوشه bin کاربر قرار بدید. یعنی اینطوری:# ln -s /sbin/ifconfig /home/localuser/bin/ 
 # ln -s /bin/ping /home/localuser/bin/
 # ln -s /sbin/route /home/localuser/bin/
 # ln -s /sbin/ip /home/localuser/bin/ 
 # ln -s /bin/date /home/localuser/bin/خوب اگر کاربر بخواد دستوری که در این لیست نیست رو اجرا کنه با پیام خطای زیر مواجه میشه: (اجرای دستور ls)[localuser@example ~]$ ls  
-rbash: ls: command not foundبه همین راحتی!فقط یه کار دیگه مونده و اون هم جلوگیری از  تغییر فایل .bash_profile توسط خود کاربر هست. با دستور زیر می تونید جلوی  تغییر این فایل رو بگیرید.# chattr +i /home/localuser/.bash_profileاگر بعدا خواستید این فایل رو ادیت کنید باید قبلش دستور زیر رو اجرا کنید# chattr -i /home/localuser/.bash_profileهمانطور  که قبلا هم گفتم روش ارائه شده در این پست قابل دور خوردن است. ولی شما در  شرایطی خاص می تونید جلوی دور خوردنش رو بگیرید. برخی روش های دور زدن در  نوشتاری دیگر تشریح خواهد شد!</description>
                <category>Gholamhossein Tavasoli</category>
                <author>Gholamhossein Tavasoli</author>
                <pubDate>Fri, 07 May 2021 12:54:48 +0430</pubDate>
            </item>
                    <item>
                <title>مجازی سازی ARMv8-A – مجازی سازی در حالت AArch64</title>
                <link>https://virgool.io/@gtavasoli/%D9%85%D8%AC%D8%A7%D8%B2%DB%8C-%D8%B3%D8%A7%D8%B2%DB%8C-armv8-a-%D9%85%D8%AC%D8%A7%D8%B2%DB%8C-%D8%B3%D8%A7%D8%B2%DB%8C-%D8%AF%D8%B1-%D8%AD%D8%A7%D9%84%D8%AA-aarch64-b4ncrr2ofikw</link>
                <description>توجه: این سری پست صرفاً ترجمه است. اگر مطالعه متن با زبان‌اصلی برای شما راحت‌تر است توصیه می‌کنم به متن اصلی مراجعه بفرمایید. افاضات بنده هم (به‌صورت زیرخط دار) به متن اضافه‌شده است.AArch64  به حالت اجرای ۶۴ بیتی در مجموعه دستورات ARMv8 اطلاق می شود. پردازنده در  این حالت عملیات را با مجموعه دستورات A64 اجرا می کند. نسخه های پیشین  ARM تنها از حالت اجرای ۳۲ بیتی پشتیبانی می کنند و مد اجرای ۶۴ بیتی در  مجموعه دستورات ARMv8 معرفی شده است. در این مد از اجرا تنها دستورات A64  در دسترس قرار دارد؛ با این حال در این حالت هر دو مجموعه ثبات ۶۴ بیت و ۳۲  بیت در دسترس قرار دارند.در  AArch64 چهار سطح استثناء (EL0 – El3) تعریف شده است. EL0 کمترین سطح مجوز  را به برنامه کاربردی می دهد. این سطوح استثناء مشابه همان حلقه های حفاظت در معماری X86 هستند. فقط اندیس گذاری آن از نظر مجوز دسترسی برعکس شده است.نرم افزارهایی که در سطح EL2 یا بالاتر اجرا می شوند به چندین کنترل برای مجازی سازی دسترسی دارند.ترجمه مرحله ۲امکان ایجاد تله برای دسترسی به ثبات و دستورات سطح EL0 و EL1تولید حالت استثناء مجازیسطوح استثناء (Exception Level – EL) در حالت های امن و غیر-امن در تصویر زیر نشان داده شده است:سطوح استثناء در حالت های امن و غیر-امندر این دیاگرام، سطح ۲ امن با رنگ خاکستری نشان داده شده است. این رنگ  به دلیل این که پشتیبانی از EL2 در حالت امن همیشه در دسترس نیست انتخاب  شده است. این مورد در بخش دیگری (مجازی سازی امن) تشریح شده است.همچنین از ویژگی های زیر نیز در معماری پشتیبانی می شود:مجازی سازی امنهایپروایزر میزبانی شده (نوع ۲)مجازی سازی تو در تو (Nested)پایان قسمت دوممطالب مرتبطمجازی سازی ARMv8-A – مقدمهبررسی مقاله: My VM is Lighter (and Safer) than your Container – ویدیوبررسی مقاله: Unikernels: The Next Stage of Linux’s Dominanceاین نوشتار پیش‌تر در خاک ره منتشر شده است. https://gtavasoli.com/%d8%aa%d8%b1%d8%ac%d9%85%d9%87-fa/%d9%85%d8%ac%d8%a7%d8%b2%db%8c-%d8%b3%d8%a7%d8%b2%db%8c-armv8-a-%d8%ad%d8%a7%d9%84%d8%aa-aarch64/ </description>
                <category>Gholamhossein Tavasoli</category>
                <author>Gholamhossein Tavasoli</author>
                <pubDate>Sat, 28 Mar 2020 12:19:44 +0430</pubDate>
            </item>
                    <item>
                <title>کانفیگ یک سیستم نسبتا خوب برای یادگیری عمیق و بررسی مقاله</title>
                <link>https://virgool.io/@gtavasoli/%DB%8C%D8%A7%D8%AF%DA%AF%DB%8C%D8%B1%DB%8C-%D8%B9%D9%85%DB%8C%D9%82-%DA%A9%D8%A7%D9%86%D9%81%DB%8C%DA%AF-%D8%B3%DB%8C%D8%B3%D8%AA%D9%85-%D8%AA%D8%B4%D8%AE%DB%8C%D8%B5-%D8%A7%D8%B4%DB%8C%D8%A7-a0zqutq0tujv</link>
                <description>مقدمهتشخیص شیء در تصویر یکی از مسائل بینایی کامپیوتر است. منظور از تشخیص، تمیز دادن اشیاء از یکدیگر و صدالبته تعیین نوع شیء (درخت، اتومبیل، گربه، هواپیما و ..) و منظور از شیء هر چیز قابل جدا کردن از صحنه به‌عنوان یک موجودیت مستقل است (شامل اجسام مرده و موجودات زنده).روش‌های  متعددی برای تشخیص اشیاء ابداع شده است؛ در همه این روش‌ها ویژگی‌های  (feature) تصویر استخراج و سپس از روی ویژگی‌ها با استفاده از الگوریتم‌های  یادگیری ماشین تصاویر تشخیص داده می‌شود. از جنبه‌ی استخراج ویژگی (feature extraction) از تصویر می‌توان الگوریتم‌های تشخیص شیء را به دو دسته کلی با و بدون یادگیری عمیق تقسیم کرد.سابق  بر این ویژگی‌ها به‌صورت دستی استخراج و به‌عنوان ورودی تکنیک‌هایی نظیر  SVM از آن‌ها استفاده می‌شد. در حال حاضر با توسعه یادگیری عمیق فرایند  استخراج ویژگی نیز به شبکه عصبی واگذارشده و کل فرایند استخراج ویژگی و  دسته‌بندی اشیاء یکجا به شبکه آموزش داده می‌شود.بهترین  تشخیص‌دهنده‌ها از نوع «تشخیص‌دهنده کاملاً نظارت‌شده» (FSD)  ارائه‌شده‌اند. ایراد اصلی این تشخیص‌دهنده‌ها نیازشان به یک مجموعه داده  نسبتاً بزرگ علامت‌گذاری شده (Annotated) است.در تشخیص شیء  علامت‌گذاری به مستطیل‌هایی که دور اشیاء کشیده شده و برچسب‌هایی که به  آن‌ها تخصیص داده‌شده است، گفته می‌شود. برای این نوع شبکه‌ها قبل از آموزش  شبکه که کار زمان‌بری است و به‌صورت خودکار انجام می‌شود، زمان‌برترین کار  آماده‌سازی مجموعه داده است، که غالباً به‌صورت دستی آماده می‌شود.برای  رفع این مسئله رهیافت «تشخیص‌دهنده به‌طور ضعیف نظارت‌شده» (WSD)  ارائه‌شده است. از طرف دیگر برخی دیگر از پژوهش‌ها از با تنظیم شبکه  آموزش‌دیده در یک حوزه در خوزه دیگری استفاده می‌کنند. همان‌طور که از  عنوان مقاله پیداست این پژوهش نیز در این دو دسته طبقه‌بندی می‌شود.این نوشتار پیش‌تر در خاک ره منتشر شده است.مشخصات مقالهنوع: کنفرانس (CVPR2018) نویسندگان: Naoto Inoue ; Ryosuke Furuta ; Toshihiko Yamasaki ; Kiyoharu Aizawa لینک دانلود مقاله: اینجاکد مقاله: اینجامسئلهما  یک شبکه که با تصاویر طبیعی علامت‌گذاری شده آموزش‌دیده است، در  اختیارداریم. این شبکه توانایی تشخیص اشیاء معمولی را دارد. آیا می‌توان  بدون ساخت مجموعه داده (جدید) علامت‌گذاری شده (به‌صورت دستی) شبکه را طوری  آموزش داد تا همان اشیاء را در حوزه‌های دیگر (نقاشی، Clip Art و …) تشخیص  دهد؟نوآوریایده کلی این مقاله در شکل زیر آمده است. در مرحله اول یک شبکه آموزش‌دیده با مجموعه داده علامت‌گذاری شده (مثلاً COCO) در اختیار داریم.جریان کاری برای آماده سازی شبکهدر مرحله بعد با کمک شبکه CycleGAN اقدام به انتقال حوزه تصویر (ترجمه تصویر به تصویر، مثلاً تصویر طبیعی به  نقاشی آبرنگ) می‌کنیم. ما یک مجموعه داده علامت‌گذاری شده از تصاویر طبیعی  را در اختیار داریم (مثلاً COCO).  با استفاده از شبکه CycleGAN تمامی این تصاویر را تبدیل به نقاشی آبرنگ  می‌کنیم. علامت‌گذاری‌ها هم که سرجایش باقی می‌ماند. حال مجموعه داده  علامت‌گذاری شده‌ای از تصاویر نقاشی آبرنگ خواهیم داشت. با همین مجموعه  شبکه را آموزش تنظیم می‌کنیم.انتقال حوزه تصویرگام  بعدی تنظیم شبکه شبه برچسب زنی نامیده می شود. در این فرایند ابتدا خروجی  FSD بدست می آید. خروجی FSD اشیاء را با احتمالی تشخیص می دهد. محتملترین  تشخیص ها در هر کلاس جدا شده و در مجموعه شبه برچسب نگهداری می شود. از این  مجموعه برای تنظیم شبکه در این مرحله استفاده می شود.شبه برچسب زنیدر آزمایشات این پژوهش از شبکه SSD300 به عنوان شبکه پایه استفاده شده و از مراحل فوق به صورتی تکی و با هم برای تنظیم شبکه استفاده شده است.تحلیلدر  بخش انتقال حوزه تصویر کار سخته رو CycleGen انجام داده و یکی از ایده های  خوب این مقاله استفاده از چنین شبکه ای برای تولید خودکار یک دیتاست از  روی دیتاست دیگه است.کد مقاله رو ما برای تشخیص یک شیء جدید استفاده  کردیم. یعنی یک دیتاست جدید آماده کردیم و به خورد شبکه دادیم. ایراد  استفاده از شبکه پایه و تنظیم اون برای حوزه های جدید که ما هم تو کارمون  بهش برخوردیم اینه که نمیشه کلاس جدیدی به مجموعه کلاس اشیاءای که شبکه  پایه میتونه تشخیص بده اضافه کرد. مجبور شدیم از همون کلاس های موجود برای  این کار استفاده کنیم!کدش به نسبت بقیه خوش دست تر هست و راحت اجرا  میشه! اصلا یکی از دلایل انتخاب من برای بررسی مقاله به عنوان اولین مقاله  در حوزه تشخیص اشیاء با کمک یاگیری عمیق، همین بود!پی‌نوشتبرای این که بتونیم شبکه رو سریع آموزش بدیم با دوستان یه سیستم نسبتا خوب برای پروژه های Deep Learning آماده کردیم.Mainboard و …NVIDIA GeForce GTX 1080 Tiاینم کانفیگ سیستم:GPU: NVIDIA GeForce GTX 1080 TiRAM: ۲ X 16GB DDR4 TForce Nighthawk Dual ChannelCPU: Intel Core i7 – 8700Main Board: ASUS TUF Z370-PLUS GAMING! ?SSD: ۲۵۶ GBHDD: ۲ TBPower: ۱۲۰۰ Wattپردازنده گرافیکی (GPU) در یادگیری و تست شبکه عصبی بیش از صد برابر سریعتر از CPU است. هزینه  عمده جمع آوری سیستم صرف GPU میشه. در مورد GPU عرض کنم خدمت شما که یه  بررسی تو بازار و کارت گرافیک های NVIDIA که از CUDA پشتیبانی می کنند،  انجام دادیم. از نظر پردازشی ۱۰۸۰Ti وضعیت بهتری نسبت به TITAN X داره.مقایسه قدرت پردازشی TITAN X و ۱۰۸۰Tiبرای پروژه های یادگیری عمیق یه مقدار TitanX بهتر از ۱۰۸۰Ti هست ولی از نظر کارایی به قیمت ۱۰۸۰Ti وضعیت بهتری داره. البته ۲۰۸۰Ti هم وضعیت  بهتری از ۱۰۸۰Ti دارد (حدود ۳۵ درصد)  ولی قیمتش تقریبا دو برابر ۱۰۸۰Ti هست. این هم کارایی  که میده نسبت به  قیمت نمی صرفه. نمودار زیر مقایسه ای بین پردازنده ها (به  ویژه در حالتی  که از چند GPU همزمان استفاده شود، ما که زورمون به یه دونه رسید) در این  نمودار معیار  Titan V است.مقایسه کارایی کارت های گرافیک در فرایند آموزش شبکهوقتی  که شبکه رو Train می کنید می تونید میزان مصرف GPU رو در Task Manager  ببینید. (ما از ویندوز استفاده می کنیم!) فقط باید در بخش GPU گزینه Cuda  رو انتخاب کنید تا کارایی پردازنده گرافیکی رو در زمان آموزش و تست شبکه  ببینید.نمایش کارایی پردازنده گرافیکی در Task Managerمطالب مرتبط:بررسی مقاله: Chitty-Chitty-Chat Bot: Deep Learning for Conversational AIبررسی مقاله: Learning by Asking Questionsاین نوشتار پیش‌تر در خاک ره منتشر شده است. https://gtavasoli.com/%D9%85%D8%B9%D8%B1%D9%81%DB%8C-%D9%88-%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D9%85%D9%82%D8%A7%D9%84%D9%87/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D9%85%D9%82%D8%A7%D9%84%D9%87-cross-domain-weakly-supervised-object-detection-through-progressive-domain-adaptation/ </description>
                <category>Gholamhossein Tavasoli</category>
                <author>Gholamhossein Tavasoli</author>
                <pubDate>Wed, 18 Dec 2019 09:58:56 +0330</pubDate>
            </item>
                    <item>
                <title>مجازی سازی ARMv8-A – مقدمه</title>
                <link>https://virgool.io/@gtavasoli/%D9%85%D8%AC%D8%A7%D8%B2%DB%8C-%D8%B3%D8%A7%D8%B2%DB%8C-armv8-a-%D9%85%D9%82%D8%AF%D9%85%D9%87-uwrf4ah6igxk</link>
                <description>توجه: این سری پست صرفاً ترجمه است. اگر مطالعه متن با زبان‌اصلی برای شما راحت‌تر است توصیه می‌کنم به متن اصلی مراجعه بفرمایید. افاضات بنده هم (به‌صورت زیرخط دار) به متن اضافه‌شده است.در این بخش مقدمه‌ای بر نظریه مجازی سازی ارائه‌شده است. در این متن  هایپروایزر به نرم‌افزاری اطلاق می‌شود که مسئول ساخت، مدیریت و زمان‌بندی  ماشین‌های مجازی (Virtual Machines – VM) است.چرا مجازی سازی مهم است؟از فناوری مجازی سازی به‌طور وسیعی استفاده می‌شود. شالوده تقریباً  تمامی سامانه‌های محاسبات ابری و زیرساخت‌های تجاری، مجازی سازی است. اجرای  چند سیستم‌عامل به‌طور هم‌زمان بر روی یک ماشین از طریق مجازی‌سازی  امکان‌پذیر است. مجازی‌سازی امکان اجرا و تست نرم‌افزارها را بدون مواجه با  مخاطره آسیب‌رسانی به ماشین اصلی به دست می‌دهد.مجازی سازی بر روی سیستم‌های سرور مرسوم است. اغلب پردازنده‌های  اختصاص‌یافته به ماشین‌های سرور از نیازمندی‌های مجازی‌سازی پشتیبانی  می‌کنند. ازجمله موارد اهمیت مجازی‌سازی در مراکز داده می‌توان به موارد  زیر اشاره کرد:جداسازیمجازی سازی امکان جداسازی میان ماشین های مجازی که به طور موازی بر روی  یک سیستم در حالت اجرا قرار دارند، را فراهم می کند. این جداسازی اجازه می  دهد تا بتوان سیستم فیزیکی را میان محیط های غیر قابل اعتماد به اشتراک  گذاشت. برای نمونه دو رقیب می توانند یک ماشین را در یک مرکز داده بدون  دسترسی به داده یکدیگر به صورت اشتراکی در اختیار داشته باشند.دسترس پذیری بالامجازی‌سازی امکان مهاجرت شفاف بار کاری میان ماشین‌های فیزیکی را به دست  می‌دهد. از این تکنیک برای انتقال بار کاری از سخت‌افزار دچار خرابی به  سخت‌افزار سالم برای تعمیر و جایگزینی استفاده می‌شود. (البته مسئله به این سادگی‌ها هم نیست؛ صرف مجازی سازی امکان HA به شما نمی‌دهد و نیاز به تجهیزات نرم‌افزار و پیکربندی بیشتری است)توزان بارکاریبرای بهینه‌سازی استفاده از سخت‌افزار و سهمیه مصرف توان مرکز داده، مهم  است که بتوان از سخت‌افزار تا حد امکان استفاده کرد. این مهم نیز از طریق  مهاجرت ماشین‌های مجازی میان ماشین‌های فیزیکی و یا میزبانی ماشین‌های  مجازی با بار کاری مناسب در یک ماشین فیزیکی حاصل می‌شود. به این وسیله از  حداکثر ظرفیت ماشین فیزیکی می‌توان استفاده کرد و تأمین‌کنندگان مراکز داده  می‌توانند بهترین کارایی را به مشتریان خود ارائه دهند. (می‌خواهیم  سخت‌افزار هیچ‌وقت بیکار نباشد. برای همین هم ماشین مجازی‌های کم‌کار را  کنار هم در یک ماشین راه‌اندازی می‌کنیم تا از منابع سخت‌افزاری حداکثر  استفاده را داشته باشیم.)جعبه شناز ماشین‌های مجازی می‌توان به‌عنوان جعبه شن (sandbox) برای اجرای  برنامه‌های کاربردی دیگر بدون ایجاد مزاحمت برای برنامه‌های دیگر در حال  اجرا بر روی آن استفاده کرد. به‌عنوان نمونه می‌توان به برنامه‌های کاربردی  قدیمی و یا نرم‌افزارهای درحال‌توسعه اشاره کرد. اجرای چنین برنامه‌هایی  در ماشین مجازی از بروز اختلال در عملکرد سایر برنامه‌ها در سیستم در اثر  باگ و یا رفتارهای مخرب برنامه، جلوگیری می‌کند.هایپروایزهای مستقل و میزبانی شدههایپروایزها به دو دسته عمده تقسیم می شوند.  هایپروایزرهای مستقل یا  نوع ۱ (Type 1) و  هایپروایزرهای میزبانی شده یا نوع ۲ (Type 2).ابتدا نگاهی به هایپروایزرهای میزبانی‌شده (نوع ۲) بیاندازیم. در  پیکربندی هایپروایزر نوع ۲، سیستم‌عامل میزبان کنترل کامل بر روی پلتفرم  سخت‌افزار و تمامی منابع آن (شامل CPU و حافظه اصلی) را در دست دارد.  دیاگرام زیر هایپروایزر میزبانی‌شده (نوع ۲) را نشان می‌دهد.هایپروایزر میزبانی شده (نوع ۲)نرم‌افزارهایی نظیر VirtualBox یا VMWare Workstation در دسته هایپروایزرهای میزبانی‌شده محسوب می‌شوند. سیستم‌عامل که به آن  سیستم‌عامل میزبان گفته می‌شود بر روی سخت‌افزار نصب می‌شود. هایپروایزر بر  روی سیستم‌عامل میزبان نصب‌شده و از امکانات آن برای مدیریت سخت‌افزار  استفاده می‌کند. هایپروایزر میزبان ماشین‌های مجازی می‌شود. بر روی  ماشین‌های مجازی سیستم‌عامل مهمان نصب و اجرا می‌شود.حال نگاهی به هایپروایزر مستقل (نوع ۱) بیاندازیم.هایپروایزر مستقل (نوع ۱)همان‌طور که در تصویر بالا پیداست هیچ سیستم‌عامل میزبانی وجود ندارد.  هایپروایزر مستقیماً بر روی سخت‌افزار اجراشده و کنترل کامل پلتفرم  سخت‌افزاری و منابع آن را (شامل CPU و حافظه اصلی) در دست دارد. مشابه  هایپروایزر میزبانی‌شده، هایپروایزر مستقل می‌تواند میزبان ماشین‌های مجازی  باشد. بر روی ماشین‌های مجازی سیستم‌عامل‌های مهمان نصب و اجرا می‌شوند.دو هایپروایزر متن‌باز و پراستفاده پلتفرم‌های ARM، هایپروایزر Xen (مستقل، نوع ۱) و KVM (میزبانی‌شده، نوع ۲) هستند. ما از این دو هایپروایزر برای تشریح برخی  نکات در این متن استفاده می‌کنیم. علاوه بر این دو هایپروایزرهای دیگری نیز  برای ARM وجود دارد.مجازی سازی کامل و para-virtualizationطبق تعریف کلاسیک، ماشین مجازی یک محیط جدا و ایزوله محاسباتی است که از  ماشین فیزیکی واقعی قابل‌تشخیص نباشد. بااینکه شبیه‌سازی کامل یک ماشین  واقعی بر روی سیستم مبتنی بر ARM امکان‌پذیر است، اما این روش غالباً  کارایی لازم را ندارد. بنابراین این نوع شبیه‌سازی غالباً انجام نمی‌شود.  به‌عنوان‌مثال شبیه‌سازی یک دستگاه Ethernet واقعی کند است، چراکه هر  دسترسی به ثبات شبیه‌سازی‌شده به‌وسیله سیستم‌عامل مهمان باید از طریق  هایپروایزر انجام شود. این کار هزینه بیشتری نسبت به دسترسی به ثبات‌های  دستگاه واقعی دارد.جایگزین مناسب‌تری که معمولاً از آن برای بهبود کارایی استفاده می‌شود،  دادن آگاهی به سیستم‌عامل مهمان است. درصورتی‌که سیستم‌عامل مهمان بداند بر  روی ماشین مجازی اجراشده است و با ارائه دستگاه‌های مجازی که برای کارایی  خوب طراحی و در هایپروایزر شبیه‌سازی‌شده‌اند می‌توان به کارایی خوبی  دست‌یافت.اگر بخواهیم دقیق صحبت کنیم، مجازی‌سازی کامل سیستم یک ماشین فیزیکی  واقعی را شبیه‌سازی می‌کند. در مقابل پروژه متن‌باز Xen مفهوم  Para-Virtualization را معرفی می‌کند. در این نوع مجازی‌سازی بخش‌های مرکزی  سیستم‌عامل مهمان دست‌کاری می‌شوند (بخشی  از کد سیستم‌عامل مهمان را تغییر می‌دهند. سیستم عامل ها معمولا چند نسخه  ارائه می دهند یک نسخه برای نصب مستقیم بر روی سخت افزار و نسخه های دیگر  هم دستکاری شده برای هایپروایزرهای مختلف) تا بتوان آن‌ها را بجای ماشین فیزیکی بر روی یک ماشین مجازی اجرا کرد. این دست‌کاری عهده‌دار بهبود کارایی می‌شود. (البته  انواع دیگر مجازی‌سازی هم وجود دارد. در این متن تنها به این دو  مجازی‌سازی اشاره‌شده است اگر فرصتی پیش آمد در مورد انواع دیگر مجازی‌سازی  هم‌صحبت خواهیم کرد)امروزه، در اغلب معماری‌ها که از مجازی سازی به‌صورت سخت‌افزاری  پشتیبانی می‌کنند (مثل ARM)، سیستم‌عامل مهمان در غالب عملکرد خود بدون  دست‌کاری اجرا می‌شوند. (عملکردهایی که سیستم را به مخاطره نمی‌اندازند)  سیستم‌عامل مهمان فکر می‌کند که بر روی یک سخت‌افزار واقعی اجرا می‌شود  مگر برای درایورهای دستگاه‌های I/O جانبی نظیر شبکه و دستگاه‌های  ذخیره‌سازی؛ در این موارد سیستم‌عامل مهمان از درایورها و دستگاه‌ها مجازی  سازی شده (paravirtualized) استفاده می‌کند. به‌عنوان نمونه از این  دستگاه‌های مجازی می‌توان به Virtio و Xen PV Bus اشاره کرد.ماشین های مجازی و پردازنده های مجاریمهم است که تفاوت میان ماشین مجازی (Virtual Machine – VM) و پردازنده  مجازی (Virtual CPU – vCPU) مشخص شود. ماشین مجازی شامل یک یا تعداد بیشتری  پردازنده مجازی است. این مفهوم در تصویر زیر نشان داده‌شده است:ماشین مجازی و پردازنده مجازیتمییز میان VM و vCPU زمانی مهم می‌شود که به موضوعات دیگری در این سری  از پست‌ها برسیم. برای مثال یک صفحه (page) از حافظه را می‌توان به یک  ماشین مجازی تخصیص داد و از این طریق برای تمامی پردازنده‌های مجازی درون  ماشین مجازی در دسترس خواهد بود. هرچند یک وقفه مجازی که در یک پردازنده  مجازی هدف‌گذاری شده، تنها به همان پردازنده مجازی می‌رود.پایان قسمت اولمطالب مرتبط:بررسی مقاله: Unikernels: The Next Stage of Linux’s Dominanceبررسی مقاله: My VM is Lighter (and Safer) than your Container – ویدیواین نوشتار پیش‌تر در خاک ره منتشر شده است. https://gtavasoli.com/%d8%aa%d8%b1%d8%ac%d9%85%d9%87-fa/%d9%85%d8%ac%d8%a7%d8%b2%db%8c-%d8%b3%d8%a7%d8%b2%db%8c-armv8-a-%d9%85%d9%82%d8%af%d9%85%d9%87/ </description>
                <category>Gholamhossein Tavasoli</category>
                <author>Gholamhossein Tavasoli</author>
                <pubDate>Tue, 06 Aug 2019 19:38:44 +0430</pubDate>
            </item>
                    <item>
                <title>بررسی مقاله: Unikernels: The Next Stage of Linux’s Dominance</title>
                <link>https://virgool.io/@gtavasoli/unikernels-linux-zq8fxtgowxkz</link>
                <description>لینوکس  یک سیستم‌عامل همه‌منظوره است. «درواقع برای رسیدن به این هدف هسته لینوکس  به‌طور پیوسته در حال گسترش است تا بتواند از عملکردهای بیشتری پشتیبانی  کند.» سؤالی که پیش می‌آید این است که «آیا یک kernel به‌تنهایی می‌تواند محدوده وسیعی از شرایط و موارد استفاده را به‌صورت بهینه هندل کند؟»نکته جالب‌تر اینجاست که در حال حاضر برای برخی کاربردها، هسته لینوکس  مشکل‌ساز می‌شود! برای نمونه در کاربردهایی که به I/O با کارایی بالا نیاز  است از چارچوب‌هایی مثل DPDK و SPDK استفاده می‌شود. این چارچوب‌ها kernel را دور زده (bypass) و مستقیم به سخت‌افزار دسترسی پیدا می‌کنند!از زاویه‌ای دیگر اگر به مسئله نگاه کنیم غالباً سرورهایی که راه  می‌اندازیم، تک کاربردی هستند. به این معنی که سرور من فقط قرارِ وب سرور،  سرور ایمیل، سرور FTP و … باشه. برای همین بر روی یک سرور اختصاصی چندین  سرور مجازی بارگذاری می‌کنیم. (اصلاً یکی از دلایل به وجود آمدن Container  ها همینه) به‌خصوص «در سیستم‌های ابری برای رعایت نکات امنیتی برنامه‌های  کاربر در درون یک ماشین مجازی اختصاصی اجرا می‌شود» غالباً (و به‌طور  روزافزون) این «برنامه‌ها به‌صورت تک پردازه‌ای و در عوض به‌صورت موازی در  VMهای مجزا اجرا می‌شوند.»در پاسخ به این مسائل پژوهش‌ها پیرامون ایده Library OS یا همان unikernelها  از سر گرفته‌شده است. unikernel مدلی است که در آن برنامه کاربردیِ هدف با  kernel ویژه‌ای لینک می‌شود و به‌طور مستقیم بر روی سخت‌افزار فیزیکی یا  مجازی مستقر می‌شود. از مزایای unikernelها می‌توان به موارد زیر اشاره  کرد:سرعت بوت بسیار بالا – بیشتر به دلیل حجم image بسیار پایینامنیت – به دلیل isolation ای که VM ها دارندبهره برداری از منابعکارایی بالا I/O – برای مثال دور زدن kernel و انجام I/O در فضای کاربر مشخصات مقالهنوع: کنفرانس (HotOS19) نویسندگان: Ali Raza, Parul Sohal, James Cadden, Jonathan Appavoo, Ulrich Drepper, Richard Jones, Orran Krieger, Renato Mancuso, Larry Woodmanلینک دانلود مقاله: اینجامسئلهدر حال حاضر ساخت یک unikernel به دو روش امکان‌پذیر است. در روش اول (clean slate) هسته از ابتدا ساخته می‌شود (مثل MirageOS) و در روش دوم (strip down) هسته موجود تکه‌تکه شده و عملکردهای اضافی آن حذف می‌شود (مثل RumpRun  که نسخه بسیار کوچک‌شده NetBSD است). از طریق روش اول می‌توان به ماکزیمم  بهینه‌سازی رسید ولی در سازگاری برنامه‌های کاربردی موجود با یک هسته  سفارشی به مشکل می‌خوریم. در عوض مزیت روش دوم این است که انتقال  برنامه‌های کاربردی موجود به unikernel راحت‌تر قابل انجام است. سؤال  اینجاست که آیا می‌شود از لینوکس یک unikernel ساخت؟نوآوریاهداف در این کار عبارت است از:اغلب برنامه ها و کتابخانه های سطح کاربر باید قابلیت لینک شدن به این unikernel را داشته باشد.سربار ring transition (جابجایی میان لایه های حفاظت) حذف شود.امکان بهینه سازی کد هسته و برنامه کاربردی به طور همزمانحداقل تغییرات در کد منبع لینوکس ایجاد شود. (طبق چیزی که در مقاله ادعا شده برای تبدیل هسته لینوکس به unikernel تنها ۱۱ خط از کد هسته تغییر و ۲۰ خط جدید به آن اضافه شده است) فرایند ساخت UKL (Unikernel Linux) شامل چهار گام است: کامپایل glibc برای بدست آوردن فایل های Object بدون لینک کردن (۲ دقیقه روی یک لپ تاپ معمولی) کامپایل برنامه کاربردی برای بدست آوردن فایل های Object بدون لینک کردنکامپایل کتابخانه UKL به فایل Objectساخت هسته لینوکس با انتخاب گزینه UKL در پیکربندی (با این کار کلیه Object های تولید شده با هم لینک می شوند.) تحلیلخوب به‌سلامتی لینوکس هم می‌تونیم به‌صورت Unikernel داشته باشیم! ظاهراً چالش‌هایی در رابطه با امنیت در مورد unikernel وجود دارد (نیاز به مطالعه بیشتر دارم) ولی حداقل الان می‌توانیم برنامه‌های کاربردی تحت Linux را به‌راحتی در قالب Unikernel ارائه کنیم.هرچند هدف نویسنده مقاله تنها بهبود کارایی نبوده ولی در یک مورد  آزمایشی که در مقاله بررسی‌شده (یک Echo Server ساده) ۵۰ درصد میانگین  تأخیر پاسخگویی و ۴۱ درصد تأخیر انتهایی (Tail Latency – راجع بهش در پست  دیگه ای صحبت می‌کنم) بهبودیافته است.توزیع احتمال تجمعی برای یک Echo Server سطح کاربر و UKLاین مقاله دو روش برای رفع مشکل ring transition مطرح کرده است. یکی  ترکیب برنامه با هسته به‌عنوان ماژول هسته (Kernel Module) و دیگری این‌که  به برنامه کاربردی اجازه دهد در ring صفر کنار دست هسته اجرا شود. هر دو  این روش‌ها بخصوص دومی نیاز به بررسی امنیتی و پایداری بیشتر دارد.مقاله از هیچ‌کدام از این دو روش استفاده نکرده است و روش سومی ارائه  داده که به نظرم خیلی بیشتر نیازمند توجه و بررسی امنیتی است. در این روش  هسته به‌صورت ایستا به برنامه کاربردی لینک شده و تنها آن را اجرا می‌کند. http://gtavasoli.com/programming/%d8%a8%d8%b1%d8%b1%d8%b3%db%8c-%d9%85%d9%82%d8%a7%d9%84%d9%87-%d9%84%db%8c%d9%86%d9%88%da%a9%d8%b3-unikernels-the-next-stage-of-linuxs-dominance/ </description>
                <category>Gholamhossein Tavasoli</category>
                <author>Gholamhossein Tavasoli</author>
                <pubDate>Sat, 13 Jul 2019 15:57:39 +0430</pubDate>
            </item>
                    <item>
                <title>بررسی مقاله: Learning by Asking Questions</title>
                <link>https://virgool.io/@gtavasoli/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D9%85%D9%82%D8%A7%D9%84%D9%87-learning-by-asking-questions-hjmpxoglcu7w</link>
                <description> شما اگر به رفتار کودک توجه کنید می بینید هی از شما (که Oracle  باشید) سوال میپرسه که این چیه و اون چیه!  اگر دقت بفرمایید، سوالات پرت و پلا از شما می پرسه (Exploration). هر چی  بچه بزرگتر میشه یاد  میگیره سوالات بهتری از شما بپرسه تا بدون سر رفتن حوصله شما و اعصاب خوردی  (Question Budget)  به جوابی که می خواد برسه. این مسئله مهمی است که شما سوال خوب بپرسی،  چنان که پیامبر اکرم (صلی الله علیه و آله) فرمود: «و حسن السؤال نصف  العلم؛ خوب پرسیدن نیمی از علم است» و حضرت علی (علیه السلام) فرمود: «حسن  المسأله نصف العلم؛ خوب سؤال کردن نیمی از دانش است.» و نیز فرمود:  «من احسن السؤال عَلِم، من عَلِم احسن السؤال؛ آن کس که خوب بپرسد،  دانا می شود و کسی که دانا باشد خوب سؤال می کند.» [پرسمان] بیان اخیر در حقیقت داره یک سیستم یادگیری فعال رو نشون میده؛  مسئلهمسئله ای که این مقاله به اون پرداخته «یادگیری از طریق پرسش» است.  مدل های موجود برای یادگیری به صورت غیر فعال (passive) یعنی آموزش با  مجموعه داده برچسب دار، عمل می کند. (البته سیستم به صورت پیوسته می تواند  تحت آموزش باشد؛ ولی همچنان به صورت غیر فعال) این نوع یادگیری در مقایسه  با شیوه ای که ما انسان ها داریم کاملا متفاوت است. ما آدم ها با دنیای  اطراف تعامل می کنیم تا اطلاعات بدست بیاوریم، نه این که تنها از بیرون به  ما اطلاعاتی تزریق شود. مجموعه دادهپیش از آن که به ایده مقاله بپردازم لازم است در مورد مجموعه داده مورد  استفاده مقاله مطالبی را بیان کنم. در این مقاله از مجموعه داده ای تحت  عنوان CLEVR استفاده شده است. این مجموعه داده در CVPR17 با ارائه مقاله ای با عنوان CLEVR: A Diagnostic Dataset for Compositional Language and Elementary Visual Reasoning معرفی شده است. کد منبع تولید این مجموعه داده را می توانید از اینجا دریافت کنید. این کد از دو بخش تشکیل شده است. بخشی که با کمک نرم افزار Blender  تصویر را می سازد (تصویر از محیط واقعی نیست، ساختگی است) و بخشی که  سوالات را برای تصاویر تولید شده، ایجاد می کند (چون میدونیم چی ساختیم  طبیعتا می تونیم راجع بهش سوال طرح کنیم). سوالاتی که CLEVR تولید می کند  جنبه های گوناگونی از استدلال را نظیر تعیین ویژگی ها، شمارش، مقایسه،  ارتباطات فضایی و اعمال منطقی در بر دارد. نمونه ای از تصویر و پرسش های  مرتبط با آن در زیر آمده است.نوآوریاین مقاله در حوزه پرسش و پاسخ در مورد تصویر (Visual Question Answering)  مدلی را ارائه کرده است. در حالت کلی یک سیستم VQA یک تصویر را به عنوان  ورودی دریافت می کند، سوالی در مورد تصویر می پرسد و پاسخی به سوال به  عنوان خروجی تولید می کند.در مدل ارائه شده در این مقاله بخشی وظیفه پیشنهاد سوال (Question  Proposal)، بخشی وظیفه پاسخ گویی به سوال (Question Answering) و بخشی هم  وظیفه انتخاب بهترین سوال (Question Selection) را برای پرسش از Oracle بر  عهده دارد. سه بخش یاد شده هر کدام با مدلی پیاده سازی شده اند که جزئیات  آن در مقاله آمده است. پاسخی که Oracle به پرسش می دهد سیگنال های یادگیری  برای هر کدام از مدل ها را تولید می کند. (در فرایند یادگیری از دانش اولیه  استفاده نشده است)در بخش پیشنهاد سوال از شبکه LSTM، در بخش پاسخ به سوال از مدل استاندارد VQA و در بخش انتخاب سوال مناسب از epsilon-greedy policy استفاده شده است. بخش پاسخ به سوال برای خود ارزیابی در نظر گرفته شده است.در این مدل ابتدا سوالات متنوع پرسیده می شود (epsilon-greedy). به مرور  با دریافت پاسخ از Oracle (که همه جواب ها رو میدونه - مجموعه داده CLEVR)  سیگنال های یادگیری برای هر بخش تولید شده تا سوالات بعدی با دقت بیشتری  انتخاب شود. [جزئیات رو از مقاله بخونید]تحلیلخود مقاله جنبه های مختلفی از کارش رو تحت عنوان کارهای آینده بررسی می  کنه. مهمترین کاری که این مقاله کرده اینه که روش مرسوم یادگیری با ناظر رو  از حالت غیر فعال به حالت تعاملی انتقال داده. این روش میتونه نمونه  برداری از داده ها را در فرایند یادگیری بهتر کنه. یکی از محدودیت های کار  انجام شده اینه که در دنیای CLEVR کار می کنه. تصاویر (ساده) CLEVR باید با  تصاویر طبیعی جایگزین شوند. از طرف دیگر بجای استفاده از برنامه Oracle  (دارای زبان ساده برای تعامل) می بایست عامل انسانی (با زبان پیچیده تر) به  سوالات پاسخ دهد. با توجه به این که در این مقاله از دانش اولیه استفاده  نشده است، باید بررسی شود نتایج این روش یادگیری با توجه به در اختیار  داشتن دانش اولیه چقدر بهبود می یابد.این مقاله در کنفرانس CVPR 18 ارائه شده است. این مقاله را می توانید از اینجا دانلود نمایید. http://gtavasoli.blog.ir/post/70/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D9%85%D9%82%D8%A7%D9%84%D9%87-Learning-by-Asking-Questions </description>
                <category>Gholamhossein Tavasoli</category>
                <author>Gholamhossein Tavasoli</author>
                <pubDate>Sun, 30 Jun 2019 22:39:47 +0430</pubDate>
            </item>
                    <item>
                <title>کامپایل و ساخت NGINX بر روی Ubuntu 18.04 LTS</title>
                <link>https://virgool.io/@gtavasoli/%DA%A9%D8%A7%D9%85%D9%BE%D8%A7%DB%8C%D9%84-%D9%88-%D8%B3%D8%A7%D8%AE%D8%AA-nginx-%D8%A8%D8%B1-%D8%B1%D9%88%DB%8C-ubuntu-1804-lts-utkcq8so3p6c</link>
                <description> همانطور که مستحضرید NGINX وب سروری است که از آن به عنوان پراکسی، سرور  پراکسی ایمیل، متوازن کننده بار و کش سرور هم استفاده می شود. این وب سرور  به صورت ماژولار طراحی شده و دارای ماژول های اصلی و شخص ثالث است. این وب  سرور به زبان C پیاده‌سازی شده است.می خواهیم یه تغییراتی در NGINX بدیم. این تغییرات در درجه اول با هدف  آشنایی با کد منبع این وب سرور انجام میشه و در مراحل بعدی امکاناتی رو به  اون اضافه می کنه. کد منبع NginX به صورت فقط خواندنی در Github وجود دارد. برای شروع در این پست فرایند کامپایل و ساخت NGINX را بر روی سیستم عامل Ubuntu Server 18.04 LTS بررسی می کنیم. در پست های بعدی ان شاءالله تغییرات مورد نظر را اعمال می کنیم.توجه: این راهنما برای نصب NGINX نسخه 1.15 بر روی Ubuntu Server 18.04 LTS تنظیم شده است.آماده سازیبا کمک دستور زیر می توانید نسخه Ubuntu خود را بررسی نمایید.lsb_release -ds 
# Ubuntu 18.04 LTSپیش از هر کاری باید بسته های موجود بر روی سیستم را بروزرسانی نمایید. برای این کار از دستور زیر استفاده کنید.sudo apt update &amp;&amp; sudo apt upgrade -yپیش نیازهاهمانطور که اشاره شد وب سرور NGINX با استفاده از زبان C نوشته شده است.  بنابراین برای ساخت آن می بایست ابزارهای لازم برای کامپایل بر روی سیستم  نصب شود. این ابزارها به صورت پیش فرض بر روی Ubuntu وجود ندارد. برای نصب  ابزارهای مورد نیاز برای کامپایل و ساخت کدهای مبتنی بر C از دستور زیر  استفاده کنید. در این دستور دو برنامه git و tree هم نصب خواهند شد. (اگر  Ubuntu شما صفر کیلومتر باشد حدودا 40 مگابایت فایل دانلود خواهد شد)sudo apt install -y build-essential git treeبرای کامپایل NGINX سه کتابخانه دیگر نیز مورد نیاز است. کتابخانه های  PCRE، zlib و OpenSSL که می توانید کد مربوط به هر کتابخانه را به کمک wget  دانلود نمایید. پس از دانلود هر کدام یک از کتابخانه ها آن را از حالت  فشرده خارج کنید. دستورات زیر این کار را برای شما انجام می دهد.# PCRE version 8.42
wget https://ftp.pcre.org/pub/pcre/pcre-8.42.tar.gz &amp;&amp; tar xzvf pcre-8.42.tar.gz

# zlib version 1.2.11
wget https://www.zlib.net/zlib-1.2.11.tar.gz &amp;&amp; tar xzvf zlib-1.2.11.tar.gz

# OpenSSL version 1.1.0h
wget https://www.openssl.org/source/openssl-1.1.0h.tar.gz &amp;&amp; tar xzvf openssl-1.1.0h.tar.gzحال نوبت به نصب پیش نیازهای NGINX است. برای نصب پیش نیاز ها از دستورات زیر استفاده کنید. (اگر Ubuntu شما صفر کیلومتر باشد حدودا 40 مگابایت فایل دانلود خواهد شد)sudo add-apt-repository -y ppa:maxmind/ppa
sudo apt update
sudo apt install -y perl libperl-dev libgd3 libgd-dev libgeoip1 libgeoip-dev geoip-bin libxml2 libxml2-dev libxslt1.1 libxslt1-devفرایند ساخت NGINX در Ubuntu 18.04 LTS را از لینک زیر دنبال کنید. http://gtavasoli.blog.ir/post/68/%DA%A9%D8%A7%D9%85%D9%BE%D8%A7%DB%8C%D9%84-%D8%B3%D8%A7%D8%AE%D8%AA-NginX-%D8%A8%D8%B1-%D8%B1%D9%88%DB%8C-Ubuntu-18-04-LTS </description>
                <category>Gholamhossein Tavasoli</category>
                <author>Gholamhossein Tavasoli</author>
                <pubDate>Sat, 29 Jun 2019 09:53:48 +0430</pubDate>
            </item>
                    <item>
                <title>گزارش: کارگاه آموزشی طراحی،آزمون و وارسی نرم‌افزار</title>
                <link>https://virgool.io/@gtavasoli/%DA%AF%D8%B2%D8%A7%D8%B1%D8%B4-%DA%A9%D8%A7%D8%B1%DA%AF%D8%A7%D9%87-%D8%A2%D9%85%D9%88%D8%B2%D8%B4%DB%8C-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C%D8%A2%D8%B2%D9%85%D9%88%D9%86-%D9%88-%D9%88%D8%A7%D8%B1%D8%B3%DB%8C-%D9%86%D8%B1%D9%85%D8%A7%D9%81%D8%B2%D8%A7%D8%B1-men1wfzsgbnt</link>
                <description> در آخرین روزهای بهار به همت دکتر بهمن زمانی و دکتر علی ابن نصیر یک کارگاه آموزشی دو روزه در دانشگاه اصفهان با عنوان «طراحی،آزمون و وارسی مدل‌مبنای نرم‌افزار» برگزار شد. در این کارگاه پیرامون مباحث زیر مطالبی خدمت دوستان ارائه شد:معرفی مهندسی مدل‌رانده (دکتر بهمن زمانی)مدل‌های اجرایی، وارسی و اعتبارسنجی پویا، به همراه نمونه‌های عملی (مهندس حججی)مدل‌سازی برنامه‌های هم‌زمان حافظه مشترک و ارسال پیام، تبیین رهایی از  اشکالات هم‌زمانی ( مانند مسابقه برای داده‌ها، بن‌بست، گرسنگی) (دکتر الهام محمودزاده)وارسی برنامه‌های همزمان و مصورسازی شکست و نمونه‌های عملی (مهندس موسوی)مبانی آزمون ساختاری، تولید خودکار داده‌ی آزمون، حل قیود (مهندس فضلی)از آزمون واحد تا آزمون کارآیی (دکتر محسن افشارچی)ابزارهای آزمون نرم‌افزار در ابعاد صنعتی (غلامحسین توسلی)آزمون نرم‌افزار به‌صورت مرحله به مرحله (نمایش زنده) (غلامحسین توسلی)اسلایدهای ارائه ها رو می تونید از وب سایت «گروه مهندسی نرم افزار مدل رانده دانشگاه اصفهان» به همراه تصاویری از جلسات برگزار شده در مرکز دانلود بفرمایید.کدها و اسلایدهای ارائه بنده نیز از طریق گیت‌هاب در دسترس دوستان قرار دارد.در این کارگاه دوستانی از شرکت‌های صاایران، هسا، دانشگاه صنعتی اصفهان و دانشگاه اصفهان حضور داشتند.این اولین دوره برگزاری کارگاه آموزشی در این حوزه در دانشگاه اصفهان  بود. یه مقدار گرما و شرایط نامناسب تهویه کارگاه دوستان رو اذیت کرد ولی  در کل تجربه خوبی بود؛ به خصوص برای بنده با توجه به این که با خانواده بعد  از حدود شش هفت سال یه اصفهان گردی هم داشتیم. اینم یه آلبوم کوچک از کارگاه و حواشی اون...  http://gtavasoli.blog.ir/post/76/%DA%A9%D8%A7%D8%B1%DA%AF%D8%A7%D9%87-%D8%A2%D9%85%D9%88%D8%B2%D8%B4%DB%8C-%D8%B7%D8%B1%D8%A7%D8%AD%DB%8C%D8%8C%D8%A2%D8%B2%D9%85%D9%88%D9%86-%D9%88-%D9%88%D8%A7%D8%B1%D8%B3%DB%8C-%D9%86%D8%B1%D9%85-%D8%A7%D9%81%D8%B2%D8%A7%D8%B1 کارگاه آموزشی طراحی، آزمون و وارسی نرم‌افزار دانشگاه اصفهان</description>
                <category>Gholamhossein Tavasoli</category>
                <author>Gholamhossein Tavasoli</author>
                <pubDate>Thu, 27 Jun 2019 16:01:50 +0430</pubDate>
            </item>
                    <item>
                <title>اشتراک گزاری بیسیم ویدیو با تلویزیون هوشمند</title>
                <link>https://virgool.io/@gtavasoli/%D9%85%D8%AF%DB%8C%D8%A7%D8%B3%D8%B1%D9%88%D8%B1-%D8%B3%D8%A7%D9%85%D8%B3%D9%88%D9%86%DA%AF-%D9%87%D9%88%D8%B4%D9%85%D9%86%D8%AF-jzkxvxrmeunx</link>
                <description>تلویزیون ما یک Smart TV سامسونگ هست. مدلش خیلی جدید نیست ولی به شبکه WiFi وصل میشه. بی ایراد نیست ولی انصافاً  قابل قبوله. همونطور که گفتم این تلویزیون امکان اتصال به شبکه رو  داره (هوشمنده دیگه) هم با کابل و هم به صورت بیسیم. حالا ما یه روز  خواستیم از روی لپ تاپ یه ویدیو رو روی تلویزیون پخش کنیم. چند راه وجود  داشت. یکی این که کابل HDMI رو بزنم به لپ تاپ و خلاص. متاسفانه کابل HDMI  تو خونه نداشتیم. یه راه دیگه هم اینه که ویدیو رو روی فلش کپی کنم بعد  بزنم به پورت USB تلویزیون. یه راه دیگه هم هست و اونم اینه که از جام تکون  نخورم و از شبکه بیسیم خونه استفاده کنم!  امان از تنبلی...سامسونگ ابزاری داره به نام AllShare که اگه شما یکی دیگه از محصولات  سامسونگ مثل تلفن هوشمند و یا دوربین و ... رو داشته باشید، این مسئله حل  شده است. البته الان از AllShare خبری نیست و بجای اون نرم افزار Samsung Link رو ارائه داده. اما لپ تاپم سامسونگ نیست. یه استانداری هست به نام DLNA برای ارتباط بین دستگاه‌های دیجیتال با مصرف خانگی روی بستر شبکه‌های تحت آی پی. (درباره استاندارد DLNA می تونید  از اینجا اطلاعات خوبی رو پیدا کنید.) DLNA طراحی شده واسه همین کار. خدا رو شکر تلوزیون ما از این استاندارد پشتیبانی می کنه. (می تونید از اینجا  device خودتون رو پیدا کنید ببینید DLNA رو پشتیبانی می کنه یا نه) حالا  باید یه نرم افزاری پیدا کنم تا از طریق این استاندارد بتونم ویدیو رو  بفرستم روی تلوزیزون. یه چندتایی پیدا کردم؛ اغلب ایرادات غیر قابل چشم  پوشی داشتند. ولی از همه بهتر نرم افزار Serviio است. شما می تونید  این نرم افزار رو به صورت مجانی از وب سایت Serviio  دانلود کنید. یه سری امکانات داره که مجانی نیست. البته این مشکلی برای ما  ایجاد نمیکنه چون خیلی از امکاناتش بخصوص اونی که ما نیاز داریم کاملاً  مجانی هست. بنابراین نیاز به کرک کردن نرم افزار نیست. (قابل توجه دوستانی  که به کپی رایت اهمیت دهنده هستند!) از اینجا می تونید امکانات نسخه مجانی و پولی رو با هم مقایسه کنید.در حقیقت Serviio یک مدیا سرور است. یعنی فایل های چندرسانه ای  مثل صدا تصویر و ویدیو رو می تونه روی شبکه بفرسته تا ابزار پخش کننده اون  رو دریافت کنه. فهرست ویژگی ها مدیا سرور Serviio و همچنین پخش کننده ها و  فایل های چند رسانه ای که پشتیبانی می کنه رو اینجا فهرست کرده. هاهاها تنبلی جواب داد... روش کار با نرم افزار رو از بلاگم مطالعه بفرمایید. (البته نسخه جدیدش یکم رابط کاربری متفاوت با عکس های بلاگ داره ولی امکانات مثل قبل هست و فرقی نکرده) http://gtavasoli.blog.ir/post/45/%D8%A7%D8%B4%D8%AA%D8%B1%D8%A7%DA%A9-%DA%AF%D8%B2%D8%A7%D8%B1%DB%8C-%D8%A8%DB%8C%D8%B3%DB%8C%D9%85-%D9%88%DB%8C%D8%AF%DB%8C%D9%88-%D8%A8%D8%A7-%D8%AA%D9%84%D9%88%DB%8C%D8%B2%DB%8C%D9%88%D9%86-%D9%87%D9%88%D8%B4%D9%85%D9%86%D8%AF </description>
                <category>Gholamhossein Tavasoli</category>
                <author>Gholamhossein Tavasoli</author>
                <pubDate>Wed, 26 Jun 2019 22:11:43 +0430</pubDate>
            </item>
                    <item>
                <title>مشکل PHP در هندل کردن چند درخواست موازی از یک کاربر</title>
                <link>https://virgool.io/@gtavasoli/php-session-management-xkzvjaija5dq</link>
                <description> مسئله اول: اگر چند کاربر همزمان به یک صفحه PHP (یا صفحات مختلف، فرقی نمیکنه!) درخواست ارسال کنند، آیا PHP به صورت موازی (و همزمان) به درخواست‌ها پاسخ می‌ده؟مسئله دوم: اگر یک کاربر همزمان چند درخواست  (مثلاً به وسیله Ajax) به صفحات جداگانه PHP از یک دامین ارسال کند، آیا  PHP به صورت موازی به درخواست‌ها پاسخ می‌ده؟در حقیقت مسئله من همون مسئله دومه؛ فرض کنید من می‌خوام یه صفحه  مانیتورینگ طراحی کنم. توی این صفحه مانیتورنگ ویجت‌های مختلفی هست که  همزمان به اسکریپت‌های مختلف PHP درخواست Ajax می‌فرستند و قراره یه تعداد  نمودار رو در خروجی نمایش دهند. این درخواست‌های همزمان از طرف یک کاربر  ارسال می‌شود.از منظر معماری، وب سرورها بر مبنای دو رهیافت عمده پیاده‌سازی می‌شوندرهیافت موازی (concurrent)رهیافت تک پردازه‌ای رویداد محور (event driven) رهیافت موازی به وب سرور اجازه می‌دهد تا چندین درخواست از طرف کاربران را به  صورت همزمان هندل کند. بر مبنای این رهیافت وب سرورها به صورت چند پردازه‌ای (Multiprocess)، چندنخی (Multithread) و یا ترکیبی (Hybrid) از این دو پیاده سازی می‌شوند. در حالت چند پردازه‌ای یک پردازه پدر وجود دارد که تعدادی پردازه فرزند را اجرا می‌کند. در این حالت هر پردازه فرزند مسئول پاسخ گویی به یک درخواست است. در حالت چند نخی هر نخ مسئول پاسخ گویی به یک درخواست از طرف کاربر است. در اغلب وب سرورها از معماری ترکیبی استفاده می‌شود که در آن هر نخ مسئول رسیدگی به یک اتصال است. از این دست وب سرورهای بسیاری طراحی شده است. برای نمونه سرویس دهنده وب Apache HTTP Server به صورت چند پردازه‌ای پیاده سازی شده است. در مقابل سرویس دهنده های وب همزمان مسدود کننده I/O رهیافت رویداد محور  نیز معماری دیگری برای پیاده سازی سرویس دهنده های وب است. به خاطر رویکرد  ناهمگام/غیر مسدود کننده این دست از سرویس دهنده های وب دیگر نیازی به مدل  ایجاد نخ برای هر اتصال وجود ندارد. در این معماری یک نخ برای چندین اتصال  همزمان در نظر گرفته می شود. در هر نخ یک حلقه رویداد (event loop) تعبیه  شده و درخواست های جدید به صورت یک رویداد در صف رویداد (event queue) قرار  می گیرد و به نوبت در حلقه رویداد پردازش خواهد شد. وب سرورهایی نظیر NGINX، Lighttpd و Tornado مبتنی بر معماری رویداد محور طراحی شده اند. پاسخ به دو مسئله بالا را از بلاگم مطالعه بفرمایید. https://gtavasoli.com/%d8%af%d8%b3%d8%aa%d9%87%e2%80%8c%d8%a8%d9%86%d8%af%db%8c-%d9%86%d8%b4%d8%af%d9%87/%d9%85%d8%b4%da%a9%d9%84-php-%d8%af%d8%b1-%d9%87%d9%86%d8%af%d9%84-%da%a9%d8%b1%d8%af%d9%86-%da%86%d9%86%d8%af-%d8%af%d8%b1%d8%ae%d9%88%d8%a7%d8%b3%d8%aa-%d9%85%d9%88%d8%a7%d8%b2%db%8c-%d8%a7%d8%b2/ </description>
                <category>Gholamhossein Tavasoli</category>
                <author>Gholamhossein Tavasoli</author>
                <pubDate>Wed, 26 Jun 2019 10:07:36 +0430</pubDate>
            </item>
                    <item>
                <title>بررسی مقاله: My VM is Lighter (and Safer) than your Container - ویدیو</title>
                <link>https://virgool.io/@gtavasoli/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D9%85%D9%82%D8%A7%D9%84%D9%87-my-vm-is-lighter-and-safer-than-your-container-%D9%88%DB%8C%D8%AF%DB%8C%D9%88-xsb9iijqdxzy</link>
                <description> یکی از مسایلی که در مورد مجازی سازی با آن مواجه هستیم ساخت و راه اندازی سریع ماشین مجازی است. اساسا یکی از دلایل به وجود آمدن Container  همین سنگین بودن ماشین های مجازی است. Container به عنوان یک محیط ایزوله،  برنامه کاربردی و کلیه نیازمندی های آن را به همراه داشته و بر روی سیستم  عامل میزبان اجرا می شود. هر Container از بسیاری از جهات شبیه ماشین مجازی  است. در مورد Container و مطالب مرتبط با آن نظیر Docker بسیار صحبت شده  است.آنچه به‌عنوان مزیت برای Container مطرح می‌شود (سرعت ساخت و  راه‌اندازی) بی هزینه نیست. «یکی از نقاط ضعف Container در مقایسه با ماشین  مجازی ایزوله سازی ضعیف‌تر آن است؛ تا این حد که برای رسیدن به ایزوله  سازی درست Container ها را در ماشین مجازی اجرا می‌کنند.» این مقاله بر روی  مشکل سرعت ساخت و اجرای ماشین مجازی تمرکز کرده است. مجموعه راهکارهای  ارائه‌شده در این مقاله منجر به ساخت اکوسیستمی مبتنی بر Xen شده است که در آن یک ماشین مجازی در زمان ۲.۳ میلی‌ثانیه بوت (سریع‌تر از Docker!) می‌شود. زمان موردنیاز برای مهاجرت (migration) ماشین مجازی ۶۰ میلی‌ثانیه و زمان لازم برای pause و resume آن به ترتیب ۳۰ و ۲۵ میلی‌ثانیه است.جزئیات بیشتر در مورد این مقاله را از بلاگم مطالعه بفرمایید. (به همراه اسلاید و ویدیوی ارائه مقاله در کنفرانس) http://gtavasoli.blog.ir/post/73/%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C-%D9%85%D9%82%D8%A7%D9%84%D9%87-My-VM-is-Lighter-and-Safer-than-your-Container </description>
                <category>Gholamhossein Tavasoli</category>
                <author>Gholamhossein Tavasoli</author>
                <pubDate>Tue, 25 Jun 2019 12:00:13 +0430</pubDate>
            </item>
                    <item>
                <title>ماژول وضعیت NginX و تولید خروجی JSON</title>
                <link>https://virgool.io/@gtavasoli/%D9%85%D8%A7%DA%98%D9%88%D9%84-%D9%88%D8%B6%D8%B9%DB%8C%D8%AA-nginx-%D9%88-%D8%AA%D9%88%D9%84%DB%8C%D8%AF-%D8%AE%D8%B1%D9%88%D8%AC%DB%8C-json-meojj62prtqg</link>
                <description>همانطور که احتمالا می دانید NGINX  دارای یک سری امکانات است که در قالب ماژول بارگذاری می شوند. یکی از این  ماژول ها، وضعیت سرور NGINX در قالب یک صفحه html نشان می دهد. (ماژول stub_status)  کافی است به مسیر مشخص شده در فایل پیکربندی درخواست ارسال کنید و وضعیت  سرور NGINX را دریافت نمایید. اطلاعات ارائه شده بسیار مختصر بوده و وضعیت  NGINX را در مورد پردازش درخواست های ورودی نشان می دهد. خروجی تولید شده به وسیله ماژول stub_stats برای عامل انسانی خوانا است. در  صورتی که بخواهیم از این ماژول برای سامانه مانیتورینگ استفاده کنیم، کار  مقداری مشکل می شود. با کمی تغییر در کد منبع این ماژول می توان خروجی را با  فرمت JSON تولید کرد. مزیت این خروجی این است که می توان از آن به عنوان ورودی ابزار مانیتورینگ استفاده کرد.در این پست علاوه بر معرفی این ماژول تغییراتی که در آن برای پشتیبانی از خروجی JSON داده شده است را بیان کرده ام.  جزئیات بیشتر را در بلاگم مطالعه بفرمایید. http://gtavasoli.blog.ir/post/67/%D9%85%D8%A7%DA%98%D9%88%D9%84-%D8%A2%D9%85%D8%A7%D8%B1-NginX-%D9%88-%D8%AA%D9%88%D9%84%DB%8C%D8%AF-%D8%AE%D8%B1%D9%88%D8%AC%DB%8C-JSON </description>
                <category>Gholamhossein Tavasoli</category>
                <author>Gholamhossein Tavasoli</author>
                <pubDate>Tue, 25 Jun 2019 11:38:10 +0430</pubDate>
            </item>
            </channel>
</rss>