<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های سید مصطفی افزونی | Seyed Mustafa Afzouni</title>
        <link>https://virgool.io/feed/@afzouni</link>
        <description>DevOps Engineer &amp; Linux Sysadmin</description>
        <language>fa</language>
        <pubDate>2026-06-07 12:08:10</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/2930/avatar/avatar.png?height=120&amp;width=120</url>
            <title>سید مصطفی افزونی | Seyed Mustafa Afzouni</title>
            <link>https://virgool.io/@afzouni</link>
        </image>

                    <item>
                <title>تجربه من از گرفتن اشتراک فیبر نوری</title>
                <link>https://virgool.io/@afzouni/%D8%AA%D8%AC%D8%B1%D8%A8%D9%87-%D9%85%D9%86-%D8%A7%D8%B2-%DA%AF%D8%B1%D9%81%D8%AA%D9%86-%D8%A7%D8%B4%D8%AA%D8%B1%D8%A7%DA%A9-%D9%81%DB%8C%D8%A8%D8%B1-%D9%86%D9%88%D8%B1%DB%8C-ak2zojl3bx6r</link>
                <description>اساسا واژه گرفتن لزوما درست نیست،‌ اما در این مساله واژه‌ی سخت‌تر و تندتری پیدا نکردم. مساله هم از اینجا شروع شد که نیاز به فیبر نوری داشتیم و همچنین دولت وقت (سیزدهم) هم کلی تبلیغات (توخالی) رفته بود و این شد مقدمه‌ای بر هشت ماه پیگیری برای اشتراک فیبر نوری.مقدمهمتاسفانه به نظر می‌رسد وزارت ارتباطات سیزدهم (عیسی زارع‌پور) در تبلیغاتی که داشت عنوان کرده بودند N میلیون کاربر تحت پوشش، دقت کنید: پوشش و نه اشتراک. یعنی مثلا یک خیابان ۲۰۰ خانه داشته باشد و هر خانه ۵ واحد و هر واحد یک خانواده، یعنی ۱۰۰۰ نفر تحت پوشش! اما اشتراک؟ یُخ (=هیچی)!به نظر می‌رسد در واقع شرکت‌های ارائه‌دهنده خدمات فیبر نوری متعهد به ارائه سرویس در منطقه‌هایی شده‌اند و به سازمان بالاسری (وزارت ارتباطات) اعلام کرده‌اند این مناطق تحت پوشش است (در حالی که واقعا نیست) و سرویسی هم ارائه نمی‌دهند و به همان نهاد بالاسری عنوان می‌کنند که درخواستی برای اشتراک نبوده است؛ و اینجا نقطه شروع دعوای من با ارائه دهنده خدمات فیبر نوری بود.بررسی پوششمناطق تحت پوشش در وب‌سایت iranfttx.ir قابل مشاهده است و مشخص شده کدام اوپراتور سرویس می‌دهد،‌ همچنین ممکن است تحت پوشش نباشد که بعید می‌دانم امکان گرفتن سرویس باشد.نمونه محل تحت پوششمحلی که نیاز به فیبر نوری داشتم تحت پوشش بود و شرکت P آن را ارائه می‌داد. در وب‌سایت شرکت که وارد شدم فرم امکان‌سنجی داشت اما همیشه سرویس استعلام قطع بود، پیگیری تلفنی از پشتیبانی و فروش هم یک جواب داشتند: محدوده شما تحت پوشش نیست!طبق تجارب قبلی فقط یک راه ماند: شکایت در سازمان تنظیم مقررات و ارتباطات رادیویی، که رگولاتوری همین حوزه است.شکایت در سازمان تنظیم مقررات و ارتباطات رادیوییشکایت از سرویس‌دهنده ساده است: https://195.cra.ir ، که بعد از انتخاب محل، نوع شکایت عدم سرویس‌دهی توسط شرکت ارائه‌دهنده که تحت پوشش بود ثبت شد.به نظر می‌رسد باگ مساله اینجا بیرون می‌زند:شرکت P گفته که در محل X فیبر را پوشش می‌دهم اما چون درخواستی نبوده اشتراکی هم ارائه نشده، اما شکایت در رگولاتوری برای عدم ارائه سرویس، یعنی آن شرکت ممکن است گزارش نادرست داده باشد و احتمالا جریمه سنگینی شود (حالت خوشبینانه اینکه برای او از نظر اقتصادی بصرفه نیست به تعداد کم مشترک سرویس بدهد)متن شکایت هم مثل زیر نوشته شد:سلام، احتراما مطابق وب‌سایت iranfttx.ir محل آدرس (مختصات X, Y) دارای پوشش فیبرنوری از شرکت ذکرشده بوده اما از ارائه سرویس امتناع می‌شود، همچنین تماس با پشتیبانی و ارسال لوکیشن چندباره نیز تاثیری نداشته است. خواهشند است در صورت عدم امکان ارائه سرویس فیبرنوری در محل ذکرشده لطفا اعلام شود. با احترام.چند روز بعد از پشتیبانی تماس گرفتند و قول پیگیری دادند و من گفتم که شکایت باز می‌ماند تا حصول نتیجه.هفته‌ی بعد مجدد تماس گرفتند (اردیبهشت ۱۴۰۳) و پیش‌فاکتور فرستادند که همان‌روز پرداخت شد و گفتند تا یک یا دو ماه آینده فیبر نوری شما وصل می‌شود.این یک یا دو ماه طول کشید و رسید سه ماه بعد (مرداد ۱۴۰۳)؛ تماس گرفتند برای امکان‌سنجی.یک ماه بعد هم (شهریور ۱۴۰۳) فیبر نوری در محل تحویل داده شد، اما اشتراک و مودم و ... چیزی نبود و مربوط به تیم دیگری برای اتصال می‌شد.پس از پیگیری عنوان شد که یک یا دو هفته طول می‌کشد.دعوای دوممجدد و پس از پیگیری روزانه از پشتیبانی گفته شد که ممکن است فرآیند تحویل مدت بیشتری طول بکشد و در واقع جواب دقیقی ارائه نشد.اینجا مجدد شکایت دیگری ثبت شد با موضوع: تاخیر در نصب و راه‌اندازی، و نتیجه؟ همان‌روز ساعت ۱۹:۳۰ کارشناس نصب مراجعه کرد و مودم نصب شد و الان این متن با همان اتصال* فیبر نوری ارسال می‌شود!* اینترنت یک تعریف مشخصی دارد و آن‌چیزی که در ایران ارائه می‌شود لزوما اینترنت نیست و از واژه اتصال استفاده شده است.</description>
                <category>سید مصطفی افزونی | Seyed Mustafa Afzouni</category>
                <author>سید مصطفی افزونی | Seyed Mustafa Afzouni</author>
                <pubDate>Wed, 18 Sep 2024 08:14:56 +0330</pubDate>
            </item>
                    <item>
                <title>استراتژی 3-2-1 برای Backup/بک‌آپ</title>
                <link>https://virgool.io/@afzouni/%D8%A7%D8%B3%D8%AA%D8%B1%D8%A7%D8%AA%DA%98%DB%8C-3-2-1-%D8%A8%D8%B1%D8%A7%DB%8C-backup%D8%A8%DA%A9-%D8%A2%D9%BE-lwc1ohdumzdh</link>
                <description>unsplash.com/photos/M5tzZtFCOfsمقدمهاساسا داده (Data) همه‌چیزِ یک کسب‌و‌کار است. از یک فروشگاه آنلاین خیلی ریز گرفته تا کسب‌و‌کار خیلی بزرگ و از دست‌رفتن داده یعنی فنا رفتن کسب‌و‌کار و حرکت به جزیره‌ای خاص. یکی از بهترین‌ راهکارها برای بازگشت به شرایط قبلی داشتن بک‌آپ از داده‌ها است.راهکار و روش‌های مختلفی برای گرفتن بکاپ وجود دارد، یکی از این روش‌ها استفاده از استراتژی 3-2-1 بکاپ است و در این نوشتار به آن پرداخته می‌شود.چرا 3-2-1؟چند سال قبل دیتای یکی از سرورهایی که داشتیم  از بین رفت. یکی از بچه‌ها گفت که بکاپ داریم و خوشحال رفتیم برای ریستور که از قضا سرکنگبین صفرا فزود؛ بکاپ روی خود سرور بود. آنجا هیچ‌ پلن بک‌آپی نبود و همه‌ی ما ازین دست کارها را زیاد انجام داده‌ایم و می‌دهیم.استراتژی 3-2-1 (سه - دو - یک) بکاپ تا حد خیلی خوبی این مسائل را حل می‌کند.در ادامه هم برای سادگی فرض کنید، ما یک دیتابیس داریم که هر ساعت از کل آن بک‌آپ می‌گیریم.سه/۳ نسخه از دیتاباید همیشه سه/۳ نسخه از داده وجود داشته باشد. یک نسخه که دیتای اصلی است. دو نسخه دیگر هم باید بک‌آپ داشته باشیم.دو/۲ نوع ذخیره‌ساز (Media) مختلففرض کنید دیتابیس ما روی یک ماشین مجازی (VM) است و بک‌آپ اول و دوم را روی دو ماشین‌های مجازی (VM) مختلف منتقل می‌کنیم.اما در اینجا فقط یک نوع مدیا استفاده کرده‌ایم. استراتژی 3-2-1 می‌گوید که باید حتما از دو/۲ نوع مدیای مختلف استفاده کنیم.مثلا یک بک‌آپ روی ماشین مجازی (VM) دیگر باشد و بک‌آپ بعدی روی S3 (آبجکت‌استوریج).یک/۱ بک‌آپ خارج از سایت اصلیتا اینجا سه/۳ نسخه از دیتا داریم، در دو/۲ نوع استوریج مختلف ذخیره شده است. اما اگر همه‌ی این بک‌آپ‌ها در داخل یک دیتاسنتر باشد و دیتاسنتر آتش گرفت (مثل آتش‌سوزی OVH) باز هم ممکن است کل داده از بین می‌رود و آن لحظه‌ است که فوقع ما وقع. اصطلاحا یک/۱ بک‌آپ باید offsite باشد.پس حتما یک/۱ نسخه از دیتا باید خارج از محل بقیه‌ی بک‌آپ‌ها نگهداری شود.unsplash.com/photos/Rdsc2L517iQجمع‌بندیسه/۳ نسخه از دیتا داشته باشیم.دو/۲ نوع استوریج مختلف استفاده کنیم.یک/۱ بک‌آپ خارج از سایت اصلی باشد.نکاتاین روش نه فقط برای یک کسب‌و‌کار که برای داده‌های شخصی نیز می‌تواند مورد استفاده قرار بگیرد.استفاده از این استراتژی ممکن است برای مقیاس‌های بزرگ جوابگو نباشد. اما برای کسب‌و‌کارهای کوچک و متوسط اثربخش است.انتقاداتی به این شیوه وجود دارد و گفته می‌شود که روش‌هایی مانند 3-2-1-1-0 کارایی بیشتری دارند.یک جایی خوانده بودم یکی از راه‌های خیلی امن برای جلوگیری از باج‌افزار (حتی با وجود بک‌آپ) ریختن بک‌آپ روی ذخیره‌سازهای نوری (مثل CD و DVD) است!برای اطلاعات بیشتر می‌توانید این مستند را مطالعه کنید.تصاویر از unsplash گرفته شده است.سعی می‌کنم در مورد بقیه‌ی نکات بک‌آپ، RTO و RPO در یک نوشتار دیگر مطلبی را آماده کنم.</description>
                <category>سید مصطفی افزونی | Seyed Mustafa Afzouni</category>
                <author>سید مصطفی افزونی | Seyed Mustafa Afzouni</author>
                <pubDate>Tue, 26 Sep 2023 19:35:37 +0330</pubDate>
            </item>
                    <item>
                <title>عوض کردن پس‌زمینه‌ی گراب/GRUB لینوکس</title>
                <link>https://virgool.io/@afzouni/%D8%B9%D9%88%D8%B6-%DA%A9%D8%B1%D8%AF%D9%86-%D9%BE%D8%B3-%D8%B2%D9%85%DB%8C%D9%86%D9%87-%DB%8C-%DA%AF%D8%B1%D8%A7%D8%A8grub-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-qbaitonswmeq</link>
                <description>این مقاله در مورد آموزش تعویض عکس GRUB لینوکس است. همون صفحه‌ی اولی که برای انتخاب سیستم‌عامل و بوت هست :)پیشنهاد می‌کنم اگر تمایل به تغییر داشتید، حتما یکبار تا آخر مطالعه کنید.قدم اولیک تصویر دلخواه ترجیحا با فرمت PNG انتخاب کنید. توصیه می‌کنم نسبت سایز تصویر با تصویر مانیتور یکی باشد. مثلا من یک تصویر با نسبت 16:9 و با لوگوی ویرگول ساختم.تصویر PNG با نسبت 16:9قدم دومتصویر را در یک مسیر دلخواه قرار دهید. مثلا من در همان دایرکتوری boot/ گذاشتم که دسترسی root هم نیاز دارد./boot/grub-background-virgool.pngهمچنین توصیه می‌کنم اسم و مسیر فایل شامل فاصله (اسپیس) و کاراکترهایی مثل پرانتز نباشد.قدم آخراز اینجا نیاز به دسترسی root داریم. فایل زیر را با هر ادیتور دلخواه باز کنید (ممکن است اسم فایل grub.cfg باشد):sudo vim /etc/default/grubمقدار زیر را در آن اضافه کنید:GRUB_BACKGROUND=/boot/grub-background-virgool.pngدستور زیر را اجرا کنید:sudo update-grubخروجی به شیوه زیر خواهد بود:Sourcing file `/etc/default/grub&#039;
Generating grub configuration file ...
Found background: /boot/grub-background-virgool.png
Found background image: /boot/grub-background-virgool.png
Found linux image: /boot/vmlinuz-5.15.0-78-generic
Found initrd image: /boot/initrd.img-5.15.0-78-generic
Found linux image: /boot/vmlinuz-5.15.0-73-generic
Found initrd image: /boot/initrd.img-5.15.0-73-generic
doneتمام! و لطفا سیستم را ریستارت کنید.چند نکتهحتما از کانفیگ‌ و فایل‌های grub و boot بک‌آپ تهیه کنید.اگر کمی با فتوشاپ کار کرده باشید، وب‌سایت photopea.com خیلی کمک کننده است.بسته به سیستم‌عامل شما، احتمالا دایرکتوری etc/default/grub.d/ را داشته باشید و توصیه می‌کنم آنجا یک فایل ساخته و GRUB_BACKGROUND را در آن قرار دهید.این مقاله مسئولیتی در مقابل ترکیدگی سیستم شما ندارد :)</description>
                <category>سید مصطفی افزونی | Seyed Mustafa Afzouni</category>
                <author>سید مصطفی افزونی | Seyed Mustafa Afzouni</author>
                <pubDate>Wed, 23 Aug 2023 21:23:03 +0330</pubDate>
            </item>
                    <item>
                <title>اضافه کردن فونت وزیر (Vazir) به Google Docs</title>
                <link>https://virgool.io/@afzouni/%D8%A7%D8%B6%D8%A7%D9%81%D9%87-%DA%A9%D8%B1%D8%AF%D9%86-%D9%81%D9%88%D9%86%D8%AA-%D9%88%D8%B2%DB%8C%D8%B1-vazir-%D8%A8%D9%87-google-docs-r81lqrmpkn5g</link>
                <description>آپدیت (۲۳/فروردین/۱۴۰۱)فونت وزیرمتن در قسمت More Fonts اضافه شده و عملا نیازی به این مقاله نیست. از این فونت زیبای فارسی لذت ببریم. بازهم مرسی از آقای صابر راستی‌کردار.آپدیت (۱۵/فروردین/۱۴۰۱)فونت وزیرمتن برای برخی فرآیند‌های QA (تضمین کیفیت) با یک تاخیر به Google Docs اضافه خواهد شد. این مطلب را اکانت رسمی Google Fonts اینجا اعلام کرده است. دیروز (۱۲/فروردین/۱۴۰۱) گوگل بطور رسمی فونت وزیرمتن (Vazirmatn) یا همان وزیر/Vazir را به گوگل‌فونت اضافه کرده است. این فونت فارسی توسط صابر راستی‌کردار طراحی شده است.این اضافه‌شدن منجر به این می‌شود که امکان استفاده از این فونت وزین در سایر سرویس‌های گوگل مثل Google Docs و Google Slides وجود دارد اما این فونت در قسمت More Fonts وجود ندارد (علتش پایین اومده)برای اضافه‌کردن این فونت باید Add-ons (پلاگین؟) Extensis Fonts اضافه شود. در این نوشتار ابتدا فعال‌سازی و سپس استفاده از آن آمده است.فعال‌سازی Add-ons اگر در فرآیند نصب به مشکل خوردید به انتهای این نوشتار مراجعه کنیدبالای صفحه از منوی Add-ons گزینه Get Add-ons را انتخاب کنید:بالای صفحه از منوی Add-ons گزینه Get Add-ons را انتخاب کنیددر بالای پنجره‌ی بازشده عبارت fonts را جستجو کنید و در نتایج جستجو Extensis Fonts را انتخاب کنید:سپس در نتایج پلاگین  Extensis Fonts نمایش داده می‌شود و آن را انتخاب کنید:در ادامه توضیحات این پلاگین نمایش داده می‌شود و روی Install کلیک کنید:در پنجره بعدی روی Continue کلید کنید:پس از طی این مراحل پلاگین Extensis Fonts در ورک‌اسپیس شما نصب می‌شود.نکته: من با یک اکانت دیگر این کار رو انجام دادم و نشد ولی روی اکانت اصلی خودم با همین شیوه و حدودا یک سال پیش نصب شده بود =((((( استفاده از فونت وزیراز همان منوی Add-ons روی Extensis Fonts و سپس Start کلیک کنید:از پنل سمت راست که باز می‌شود فونت زیبای Vazirmatn را پیدا کنید:فونت وزیرمتن (وزیر) در لیست فونت‌ها اضافه شده است.تمام =)چند نکتهیک داکیومنت‌ رو با فونت وزیر اینجا گذاشتم.اگر این پلاگین نصب نشد راهکار چیست؟ از همون داکیومنت یه کپی بگیرید :|برای Google Slides یا Google Sheets نیازی به فعال‌کردن پلاگین نیست و فقط فونت رو از همون پنل سمت راست اضافه کنید.(آپدیت) این پیام یکی از همکارام هست: فقط برای دیدن فونت‌ها داخل اون پلاگین من نیاز به VPN داشتم. پلاگین دیگری وجود دارد؟ Free &amp; New Font هست ولی خطا داد =(چر فونت وزیر در More Fonts نیست؟ بازهم نمی‌دونم :)</description>
                <category>سید مصطفی افزونی | Seyed Mustafa Afzouni</category>
                <author>سید مصطفی افزونی | Seyed Mustafa Afzouni</author>
                <pubDate>Sat, 02 Apr 2022 22:29:15 +0430</pubDate>
            </item>
                    <item>
                <title>که کد آسان نمود اوّل</title>
                <link>https://virgool.io/dotin/%DA%A9%D9%87-%DA%A9%D8%AF-%D8%A2%D8%B3%D8%A7%D9%86-%D9%86%D9%85%D9%88%D8%AF-%D8%A7%D9%88%D9%91%D9%84-yaznf15gg5c0</link>
                <description>بگذارید با یک داستان خیلی عادی شروع کنم؛ مثلا بعد از تمام‌شدن کرونا در تلگرام آگهی تخفیف یک هتل را می‌بینید، VPN را قطع و در یک اپلیکشن تور و بلیط پرواز را انتخاب می‌کنید، به صفحه پرداخت بانک هدایت می‌شوید تا اطلاعات کارت بانکی و رمز پویا وارد شود؛ دقایقی بعد هم اطلاعات بلیط برای شما SMS و ایمیل می‌شود.روز موعود با تاکسی اینترنتی به فرودگاه می‌روید و از روی مانیتور کانتر را پیدا کرده، ساعتی بعد از دریافت کارت پرواز و رسید چمدان به مقصد رسیده‌اید.یک روال خیلی ساده که تابحال برای هرکسی پیش آمده است.برنامه‌ای بنویسید!برنامه‌ای بنویسید که یک عدد دو دو رقمی را گرفته و مجموع ارقام آن را نمایش دهداین اولین سوال الگوریتمی‌ای بود که بعنوان الگوریتم به آن برخورد کرده بودم؛ راه حل همان ثانیه‌های اول آمد: تقسیم بر ده، جزء صحیح و جمع با باقیمانده تقسیم، آن روز نمی‌دانستم تقسیم صحیح داریم.معمولا اولین‌ها ماندگاری بیشتری در ذهن دارند؛ اولین کد، اولین زبان برنامه‌نویسی، اولین پروژه، اولین محصول و … . سال هشتاد و شش، کتاب دبیرستانی مبانی رایانه سوم ریاضی، از یکی به من ارث رسیده بود و Qbasic را یاد میداد این وسط‌ها یکی گفت Visual Basic را ببین، آنجا بود که عشقم به سر افتاد و VB6.0 دوست‌داشتنی را پیدا کردم مثل خیلی‌ها که که با همین ویژوال‌بیسیک شروع کرده‌اند.گذشت و گذشت به خودم آمدم، اسمم شده بود برنامه‌نویس برخلاف حالا و امروز شده است روز برنامه‌نویس.یا رومی روم یا زنگی زنگروز برنامه‌نویس و ۲۵۶ امین روز سال است، ‌256 بصورت باینری یا دودویی یا همان مبنای 2 می‌شود 100000000 ، یعنی اگر تبدیل به Bit شود، می‌شود هشت تا صفر جلوی یکی یک. بیت‌ها یا صفر هستند یا یک. حالت دیگری وجود ندارد، یا سیاه است یا سفید، یا رومی است یا زنگی! شاید همین مساله هم باعث می‌شود خیلی‌ها برنامه‌نویس‌ها را آدم‌های صفر و یکی ببینند.اما اساسا برنامه‌نویس‌ها خیلی فرقی ندارند با افراد عادی جز اینکه سروکارشان با کد است، حتی بلد نیستند یک اکانت اینستاگرام یا تلگرام را هک کنند!البته برنامه‌نویس یک ظرافت شخصیتی دارد که بنظرم از کارش نشات می‌گیرد در واقع سروکله‌زدن با کد یعنی حل مساله، یعنی یک برنامه‌نویس از صبح تا شب (بعضی هم شب تا صبح) درگیر حل مساله هستند.این مساله‌ها شاید مثل همان مجموع ارقام یک عدد جواب خیلی سرراست داشت باشد، بعضی‌ وقت‌ها هم مثل فلان الگوریتم جواب سرراست ندارند، یا اصلا جوابی ندارند؛ یکسری هم جواب دارند اما پیاده‌سازی در لایه‌ی کد کار حضرت فیل است.روح برنامه‌نویس پیوند خورده با حل مساله و بنظرم همین یکی روال عادی زندگی یک برنامه‌نویس را تا حد شاید زیادی متاثر می‌کند. حل کردن مساله یعنی پردازش مغزی، یک جایی سریع جواب پیدا می‌شود، جایی هم ناخودآگاه چندساعت بعد جواب را می‌دهد! حداقل یکبار برای هر برنامه‌نویس پیش آمده که فلان مشکل یا مساله را هنگام غذاخوردن یا خواب یا دوش‌گرفتن حل کرده است.این حل‌کردن مساله یک قسمت خیلی کوچک در فرآیند تولید نرم‌افزار است، کد که نوشته شد تازه کار شروع می‌شود. تست می‌خواهد، بهینه‌سازی لازم است تا آنچه که ۱۰ ثانیه طول می‌کشیده بشود ۱ ثانیه یا مثلا مصرف مموری (همان RAM) کمتر شود! تمام شد؟ حالا آنجای کد یا برنامه مشکل امنیتی دارد و دسترسی به آقای Attacker (هکر) می‌دهد. می‌گذرد و می‌گذرد می‌رسد به مرحله‌ی استقرار (Deploy) که برسد به دست مشتری و نگهداری سرور و برنامه با سیس‌ادمین‌ها.همه خوشحال و شادند که باگ ناگاه می‌افتد؛ مثلا کد تخفیف ۱۰ درصدی، ۱۱۰ درصد اعمال می‌شود و یک‌چیز هم دستی به کاربر می‌دهد در ازای خریدش. اینجا باگ ولی افتاده است؛ باگ اگر روز ازل در دل برنامه نبود / تا ابد زیر فلک ناله مستانه نبودآن هم حل می‌شود اما...اصلا نیاز نبوده این فیچر پیاده‌سازی شود، برویم از اول! فوقع ما وقع.خیلی شفاف بگویم:برنامه‌نویس‌ها موتور محرک چرخه‌ی تولید نرم‌افزار هستندیک روز خیلی عادیفرماندهان راه تکنولوژیبرنامه‌نویسی بازه‌ی بسیاربسیاربسیار بزرگی را در برمی‌گیرد؛ عمده‌ی افراد دید شفافی در مورد برنامه‌نویسی ندارند، هرکسی بنا به محیط خود آن را درک می‌کند، حرجی هم نیست چون به نوعی کار تخصصی است، مثلا من از مکانیک خودرو تقریبا هیچ اطلاعی ندارم و فکر می‌کنم همه کاربراتور تنظیم می‌کنند! اینجا مثلا یکی فکر می‌کند برنامه‌نویس وب‌سایت درست می‌کند، یکی دیگر اپلیکیشن موبایل، برخی هم به دنبال هک اکانت هستند، یکسری هم همیشه‌ی خدا دیتای موبایل‌شان وصل نمی‌شود.هرچند در این بین برنامه‌نویس‌های ایرانی مظلوم‌ترین هستند، برخلاف کشورهای دیگر از بیرون خیلی ابزارها را اجازه‌ی استفاده ندارند و از داخل هم خیلی‌ها اجازه‌ی استفاده نمی‌دهند و معتقدند بیشتر می‌فهمند.برگردیم به آنچه که در ابتدا آمد تا بعد از کرونا به مسافرت بروید؛ اولین تصویر را استوری می‌کنیم… حالا بدون ذره‌ای اغراق می‌گویم هزاران برنامه‌نویس بصورت مستقیم و صدها هزار (شاید حتی میلیون) برنامه‌نویس بصورت غیرمستقیم، هفته‌ها و ماه‌ها و سال‌ها وقت گذاشته‌اند تا یک سفر تفریحی داشته باشیم. همین سفر را تعمیم دهید به یک کارت‌به‌کارت بانکی، خرید از فروشگاه اینترنتی، عکاسی با دوربین دیجیتال و ادیت آن، ثبت‌نام در فلان سامانه‌ و ... .مثال زیاد است از آنچه برنامه‌نویس‌ها انجام داده‌اند؛ زمانی که سرچ می‌کنید، وقتی صفحه گوشی خاموش-روشن می‌شود، لباسشویی که لباس را خشک می‌کند یا مثلا رادیوی ماشین که پخش می‌کند، حتی دکمه‌ی قرمز روی ریموت تلویزیون؛ بالاتر نگاه کنیم مریخ‌نورد و موشک فضایی و رادار و ... . زمانی که یک موزیک را گوش‌ می‌کنیم، وقتی عکسی را می‌فرستیم و تک‌به‌تک پست‌هایی که لایک می‌کنیم، تماس تصویری با عزیزانمان، حتی همین متنی که می‌خوانید، همه و همه و همه را برنامه‌نویس‌ها نوشته‌اند و می‌نویسند. پشت پرده این دنیای مدرن، برنامه‌نویس‌ها نشسته‌اند و چیزهایی که شما از آن لذت می‌برید را طراحی و خلق می‌کنند.پس فرماندهان راه تکنولوژی روزتون مبارک!</description>
                <category>سید مصطفی افزونی | Seyed Mustafa Afzouni</category>
                <author>سید مصطفی افزونی | Seyed Mustafa Afzouni</author>
                <pubDate>Sun, 12 Sep 2021 18:30:38 +0430</pubDate>
            </item>
                    <item>
                <title>ظلم، ظلم است؛ ظالم هم همان ظالم.</title>
                <link>https://virgool.io/@afzouni/%D8%B8%D9%84%D9%85-%D8%B8%D9%84%D9%85-%D8%A7%D8%B3%D8%AA-%D8%B8%D8%A7%D9%84%D9%85-%D9%87%D9%85-%D9%87%D9%85%D8%A7%D9%86-%D8%B8%D8%A7%D9%84%D9%85-kzuy7imk8tr7</link>
                <description>هرکسی می‌گوید عزای حسین (ع) مقدم بر جان مظلوم است، خودش اول‌ظالم عالم است و کرسی و میزش بسته به ظاهر.ندیدم سری را به سرداری، مگر بسیار سرها زیر پای او. خودستایان تکیه بر اریکه‌ها زده‌اند؛ کتاب خدا را چنان می‌خوانند که سود ایشان است. (دیالوگی از فیلم روز واقعه / بهرام بیضایی)حسین ابن علی (ع) همیشه مظلوم بوده، وقتی یکی بگوید مظلوم، تناظری با نام امام حسین ناخودآگاه در ذهن جاری می شود، اصلا اول‌مظلوم عالم امام خودمان است. مظلوم از همان محرم ۶۱ هجری و آن حکومت اموی و قبل‌تر تا هم‌این امروز…یزیدِ معاویه باشد و دستگاه اموی یا نظامی دیگر فرقی ندارند، ظلم، ظلم است، ظالم هم همان ظالم. شیوه‌ی حکمرانی شاید فرق کند همگی اما ذیل «سَیعلَمُ الّذینَ ظَلَموا أَی مَنقَلَبٍ ینقَلِبونَ»(۱) تعریف می‌شوند.حکومت اموی به گفته‌ی خودشان حکومت اسلامی بوده یا به فارسی امروزی «خلافت اسلامی اموی». یعنی اسلام در نظام اموی حرف اول را می‌زده، مثلا دم و دستگاه و بوقچی تبلیغات هم داشته‌اند که صبح تا شب احکام اسلام را برای عوام‌الناس بیان کنند. اما فقط حرف و ظاهر قضیه‌شان اسلامی است؛ می‌گویند امویان سپاه قوی‌ای داشتند و سیستم امنیتی-اطلاعاتی قوی‌تر.مثلا جایی «مصحلت نظام» بوده که نوه رسول‌الله را بکشند، آب را ببندند، دستی را قطع و طفلی شیرخوار… . فردایش هم شروع به توجیه که چرا حسین ابن علی (ع) را کشتیم. مثلاً اگر امروز بود شبکه‌های تلویزیونی و  اموی‌نیوز شروع می‌کردند با مصاحبه با ملت اموی برای تشکر و قدردانی.قطعاً هم همین می‌شد؛ هلهله و شادی آن‌هایی که امام معصوم را کشتند. همان زیارت عاشورا «وَ هذا یَوْمٌ فَرِحَتْ بِهِ آلُ زِیادٍ وَ آلُ مَرْوانَ بِقَتْلِهِمُ الْحُسَیْنَ»(۲). اکانت‌های سایبری و فیک حکومت هم در توییتر و اینستاگرام حمله می‌کردند و هشتگ می‌زدند. همگی هم برای تقویت نظام اسلامی اموی.ظلم، ظلم است، ظالم هم همان ظالم. عمیقاً معتقدم آن‌هایی که عاشورا و کربلا را به تشنگی محدود کرده‌اند یا ظالم هستند یا جاهل یا عمله‌ی ظلم.هرکسی ذره‌ای جلوی مفهوم عاشورا را بگیرد، ظالم است، «خلافت اسلامی اموی» باشد یا آن دیگری.هرآنکه بگوید عزاداری کنید و تعطیل نشود تا که نان به جیب بزند در همان دسته است.هرکسی می‌گوید عزای حسین (ع) مقدم بر جان مظلوم است، خودش اول‌ظالم عالم است و کرسی و میزش بسته به ظاهر. اصلا در تشیع صفوی و قجری ظاهر دین مقدم شده بر چرایی آن.هر که ظلم کند، و هر که یاری ظالم کند، و هر که راضی به ظلم او باشد، هر سه ظالمند و در ظلم شریک؛ کربلا و عاشورا یعنی ظلم‌ستیزی و مبارزه‌ی با ظالم.سربسته بگویم؛ اگر به عاشورا و مکتب همین امام باشد، تکلیف شفاف است در مقابل ظالم.و شب اول محرم؛ اَلسَّلامُ عَلَیْکَ یا اَباعَبْدِاللَّهِ.(۱) ترجمه آیه: و آنان كه ظلم و ستم كردند به زودی خواهند دانست كه به چه كیفرگاهی باز می‌گردند. سوره شعراء، آیه ۲۲۷.(۲) ترجمه زیارت: و این روز روزیست که آل زیاد و آل مروان بواسطه قتل حضرت حسین شاد شدند.توضیح تصویر: یزد، بازار سنتی (شاهزاده فاضل) در ایام محرم. تصویر توسط نگارنده ثبت شده است.</description>
                <category>سید مصطفی افزونی | Seyed Mustafa Afzouni</category>
                <author>سید مصطفی افزونی | Seyed Mustafa Afzouni</author>
                <pubDate>Mon, 09 Aug 2021 21:08:59 +0430</pubDate>
            </item>
                    <item>
                <title>حس خوب اعتماد؛ خداحافظ امن‌پردازان</title>
                <link>https://virgool.io/@afzouni/%D8%AD%D8%B3-%D8%AE%D9%88%D8%A8-%D8%A7%D8%B9%D8%AA%D9%85%D8%A7%D8%AF-%D8%AE%D8%AF%D8%A7%D8%AD%D8%A7%D9%81%D8%B8-%D8%A7%D9%85%D9%86-%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D8%A7%D9%86-bl5jbbioon8h</link>
                <description>شنبه / اول خرداد ۱۳۹۵ / دانشگاه یزددر آزمایشگاه با Action در Qt کشتی می‌گرفتم تا اینکه گوشی Nexus 5x سفید که تازه هم خریده بودم زنگ خورد:سلام...از شرکت امن پردازان کویر تماس میگیرم، یکی از بچه‌ها شما رو برای برنامه‌نویس PHP معرفی کرده، امکانش هست برای مصاحبه بیاید؟آن روزها PHP برای خودش پایتونی بود، مثل الان که نبود. من هم خیلی برنامه‌نویس قهاری نبودم، چهار-پنج تا پروژه انجام داده بودم، اندکی شبکه و اندک‌ترمثقالی لینوکس.البته همان موقع‌ها قبل از این تماس هم آگهی استخدام شرکت را دیده بودم و هم در سایت‌شان رفته بودم منتها کثرت فیلدها بالا بود و منصرف شدم.ساعت ۱۵ جلوی در ورودی بودم و به دو تابلوی مشکی نگاه می‌کردم. دو جلسه مصاحبه داشت و دو روز بعد گفتند بیا؛ وسط حیاط ساختمان فنی ۱ دانشگاه یزد یورتمه می‌رفتم از خوشحالی استخدام. آن موقع امن پردازان مثل حالا اینقد بزرگ نبود، نقلی‌تر بود و خودمانی.از PHP می‌گفتم؛ در دو ماه رسیدیم به پایتون و بعدتر لینوکس؛ آنجا اما گمشده‌ام را یافته بودم: لینوکس‌زیبا، ترمینالِ سیاه و واسط خط فرمان زیباتر (CLI را می‌گویم).تابستان ۹۶ هل دادیم برای یک تیم عملیات/اجرا و برگشتم همان توسعه محصول خودمان یا به قول خودشان R&amp;D.خرداد ۹۷ گفتند تیم توسعه محصولِ فلان محصول را نداریم: بسم‌ا… سید!. تیم شد و این چاکر درگاه شد ارباب‌اسکرام؛تیر ۹۸ ندا آمد دواپس، بسم‌ا… گویان با اسم رمز کدنویس وظیفه رفتیم جلو؛روز آخر خرداد ۹۹ هم با حفظ سمت در آخرین سمت: خیلی کار داریم سید و چهارتا محصول...فوقع ما وقع؛ این یکی دیگر در توانم نبود، شاید هم بود اما با فرکانس‌ کاری‌ام هم‌خوانی نداشت یا برعکس؛ یعنی فرکانس‌ کاری‌ام تطبیق نمی‌داد.چهارشنبه / دوازدهم خرداد ۱۴۰۰ / امن پردازان کویرلوح تقدیر زرشکی و رز آبی جاودان (اسمش مطمئن نیستم) هدیه دادند. با بچه‌ها خداحافظی کردم. آمدم پایین، عکس در ورودی ساختمان یزد را گرفتم، نسبت به پنج سال قبل پخته‌تر شده بودند جلوی آفتاب روزها.این پنج‌سال در APK بزرگ شدم، عین یک بچه که دبستان می‌رود. تلخی زیاد بود و شیرینی زیادتر. همیشه با صراحت انتقاداتم را گفتم، معمولاً شنیده شد برخی هم نه، یک سال آخر هم خودِ راننده‌ی توسعه محصول و مثلا فرمان‌به‌دست.شخصاً امن پردازان را دوست دارم، همکاران سابق و دوستان فعلی (کلیشه نیست اصلا).بارها پیش‌آمد که انتخاب بین نفع شخصی و نفع سازمان داشتم، ذره‌ای تردید برای سازمان نداشتم. سعی کردم استاندارد و Best Practice پیاده‌سازی شود، کم‌و‌بیش هم شد و هم نشد. همیشه پشتیبان نیروهایی بودم که کار می‌کردیم.خیلی از چیزها خاطرم نیست اما عمیقاً بهترین‌ها را آرزو کرده‌ام.اردی‌بهشت ۱۴۰۰ / نذری در آشپزخانهیکی دیگر آمده بود که نذری برای رمضان آماده کند با متریال کامل و یک آشپز کامل‌تر، نیروی کمکی اما برای پخت نداشت. گفتند فلانی می‌آیی؟نیم ساعت بعد کیسه‌ برنج در دیگ خالی می‌کردیم، هر کیلو برنج برای ۷ نفر و سه کیسه برای هر دیگ؛ کاملا یک نقش اپراتوری.میانه‌ی ظهر و هنگام ظرف‌کردن و بسته‌بندی برنج و قیمه بودیم، کمک‌کار هم خیلی آمده بودند شکرخدا. همهمه بود و صدای بلند بلندگو که مداحی پخش می‌شد.گوشی‌ام زنگ خورد، ظاهراً صدای مداح واضح‌تر از صدای مخاطب برای تماس‌گیرنده پخش می‌شد. پله‌ها را دوتا یکی رفتم بالا؛ تماس گرفته بودند که بلندشو بیا، از آن شرکت سبز در جردن.هنوز نمی‌دانم وسط نذری‌پختن چه می‌کردم.</description>
                <category>سید مصطفی افزونی | Seyed Mustafa Afzouni</category>
                <author>سید مصطفی افزونی | Seyed Mustafa Afzouni</author>
                <pubDate>Wed, 02 Jun 2021 18:46:45 +0430</pubDate>
            </item>
                    <item>
                <title>شفافیت در رمزنگاری، یک اصل اساسی</title>
                <link>https://virgool.io/@afzouni/%D8%B4%D9%81%D8%A7%D9%81%DB%8C%D8%AA-%D8%AF%D8%B1-%D8%B1%D9%85%D8%B2%D9%86%DA%AF%D8%A7%D8%B1%DB%8C-%DB%8C%DA%A9-%D8%A7%D8%B5%D9%84-%D8%A7%D8%B3%D8%A7%D8%B3%DB%8C-dotpsb9yfhei</link>
                <description>در ابتدا یک تعریف کلی از رمزنگاری (Cryptography) ارائه می‌شود:رمزنگاری الگویی است که طبق آن داده‌های آشکار طبق یک روال برگشت‌پذیر به اطلاعاتی نامفهوم تبدیل می‌شودمثلا کلمه hello با یک الگوریتم رمزنگاری مشخص (در اینجا AES) تبدیل به مقدار زیر می‌شود:0xadc12796557b78116245d0c5d563e55aاصول شش‌گانه آقای آگوست کرکهوف (Auguste Kerckhoffs) در سال ۱۸۸۳ شش اصل را برای رمزنگاری بیان کرد:سیستم رمزنگاری در عمل نباید قابل شکستن باشد، هرچند از نظر تئوری بتوان آن را شکست.سیستم رمزنگاری نباید هیچ چیز پنهانی و محرمانه‌ای داشته باشد و فقط کلید رمز باید مخفی شود. جزئیات سیستم، الگوریتم و ... باید در معرض دسترس و دید همه و حتی دشمنان باشد. (اصل اساسی کرکهوف)کلید رمز باید به نحوی قابل انتخاب باشد که (الف) به راحتی قابل تغییر باشد.(ب) بتوان به خاطر سپرد.(پ) نیازی به یادداشت کردن آن نباشد. هرآنچه که رمزشده است با تلگراف قابل ارسال باشد.سیستم رمزنگاری یا هرآنچه که رمزشده، توسط یک نفر قابل حمل باشد.سیستم رمزنگاری به راحتی قابل راه‌اندازی باشد.این شش مورد بعنوان اصول شش‌گانه کرکهوف یا Kerckhoffs&#x27;s principle شناخته می‌شوند. همه این موارد به نحوی مورد استفاده قرار گرفته‌اند، اما اصل دوم بعنوان اصل اساسی کرکهوف شناخته می‌شود.این شش اصل با قوانین کیرشهف (گوستاو کیرشهف) ارتباطی ندارد!اصل اساسی: هیچ‌چیز پنهانی نداریمجزئیات الگوریتم‌های رمزنگاری باید آشکار و در دسترس و دید همه باشد و فقط کلیدهای رمز محرمانه هستنداصل دوم به اصل اساسی کرکهوف معروف است. تمام الگوریتم‌های رمزنگاری کاملا مشخص و شفاف هستند و همه از نحوه عملکرد آن اطلاع دارند.اما این سوال پیش می‌آید که چرا باید یک الگوریتم‌ رمزنگاری را بصورت عمومی منتشر کرد؟ دو دلیل وجود دارد:دلیل اولفرض کنید سفارتخانه‌های یک کشور برای ارتباط با دولت خودشان، از یک الگوریتم رمزنگاری بومی محرمانه استفاده می‌کند. اگر کلید فاش شود، هزینه‌ای برای تغییر کلید وجود ندارد.اما اگر این الگوریتم که صرفا برای حفظ امنیت مخفی نگه داشته شده لو برود، عملا باید یک الگوریتم جدیدی جایگزین شود.دلیل دوماگر الگوریتم رمزنگاری بصورت عمومی منتشر شود، افراد زیادی روی آن کار می‌کنند و آن را به چالش می‌کشند و اگر شکسته نشود می‌توان احتمال داد که الگوریتمی قوی بوده است. از طرفی چنانچه شکسته هم شود، می‌توان آن را بهبود داد.نکته طلایی برای هر سیستم رمزنگاری همین اصل است که همه جزئیات آن منتشر شود.سیستم یا الگوریتم رمزنگاری خودش باید امنیت خودش را حفظ کند نه اینکه با محرمانگی به آن امنیت بدهیمامروزه طبق همین اصل اساسی آقای کرکهوف، هیچ چیز پنهانی در الگوریتم‌ها وجود ندارد، مثلا RSA یا AES بصورت عمومی منتشرشده و در دسترس همگان است.دو مثال واقعیالگوریتم RC4جزئیات الگوریتم RC4 تا شش سال مخفی بود تا اینکه در سال ۱۹۹۴ در اینترنت و لیست‌های ایمیل سایبرپانک (Cypherpunk) بصورت ناشناس منشر شد. زمانی که جزئیات RC4 فاش شد، برخی متوجه شدند در آن اشکالاتی وجود دارد اما در آن زمان سخت‌افزارها و نرم‌افزارهای زیادی از RC4 استفاده می‌کردند و امکان تغییر/بروزرسانی آن‌ها در زمان کم وجود نداشت.ماشین انیگماماشین انیگما دستگاه رمزنگار آلمانی‌ها در جنگ‌جهانی دوم بوده و زمانی که به دست متفقین افتاد و لو رفت. امنیت انیگما مبتنی بر پیچیدگی و کلیدهای رمز روزانه بود، نه روشی که استفاده می‌کرد، که آن هم شکسته شد.پی‌نوشت: فیلم زیبای The Imitation Game داستان شکستن انیگما را به تصویر کشیده است.ماشین انیگما</description>
                <category>سید مصطفی افزونی | Seyed Mustafa Afzouni</category>
                <author>سید مصطفی افزونی | Seyed Mustafa Afzouni</author>
                <pubDate>Mon, 03 May 2021 23:50:05 +0430</pubDate>
            </item>
                    <item>
                <title>جان‌پیچ (هورکراکس) من در آبی‌سفید</title>
                <link>https://virgool.io/@afzouni/%D8%AC%D8%A7%D9%86-%D9%BE%DB%8C%DA%86-%D9%87%D9%88%D8%B1%DA%A9%D8%B1%D8%A7%DA%A9%D8%B3-%D9%85%D9%86-%D8%AF%D8%B1-%D8%A2%D8%A8%DB%8C-%D8%B3%D9%81%DB%8C%D8%AF-bazvutppg0q1</link>
                <description>اساساً آدم درونگرا و مسافرت-نرویی هستم، سفر و مسافرت نمی‌روم مگر مثلاً دو سه سالی یکبار آن هم در شرایطی. این بار اما فرق داشت، از دو ماه پیش توسط علیرضا و عباس دعوت شدم اصفهان، نحوه آشنایی؟ توییترِ فیلترشده.با فروپاشی روانی ناشی از تناقض و جنگ درونی کرونای قرمز و نارنجی نوروز قرار شد دو روز «کاملاً تفریحی» اصفهان باشم. یعنی پنج‌شنبه ظهر غلیان درونی فروکش کرد و کودک برنده درون، جمعه ظهر در مقصد شلنگ تخته می‌انداخت.دویی که پنج شدهمه چیز عادی بود تا اینکه دقیقا یک ساعت پس از وصل در مقصد همه چیز عوض شد؛ به آبی‌سفید (فضای کار اشتراکی) وارد شدم.ورودِ بشرِ خسته در ظهرِ جمعه‌ی تعطیل رسمی به آبی‌سفید همان کاری را با پلن این سفر تفریحی کرد که جمهوری اسلامی در سال ۵۸ با سفارت آمریکا نکرده بود.این مردِ معتادِ دائم‌الکار به میخانه رسیده بود و افتاد مشکل‌ها، فوقع ما وقع که سفر دو روزه تفریحی شد پنج‌روزه و کاری.در‌واقع در لحظه ورود سی ثانیه یک شوک وصل فراق عاشق و معشوقِ نادیده رخ داد: «برگام چقد اینجا انرژی مثبت داره، دیگه جایی نمیام همینجا کارامو انجام میدم» و بصورت کاملاً غیرارادی عکس آنجا استوری شد و لپ‌تاپ را باز کردم.جمعه و دوشنبه‌ی تعطیل رسمی و شنبه و یک‌شنبه و سه‌شنبه از صبح تا عصر در آبی‌سفید گذشت. هر مساله چالشی عقب‌افتاده‌ای که بود در این مدت کاملاً Done شد، از پایپلاین CI/CD فلان‌محصول تا اصلاح رزومه برای ارسال به فلان‌جا تا کارهای مانده از سال قبل شرکت.همین دوشنبه‌ی تعطیل رسمی بود، به خودم آمدم ساعت هشت شب و از بیست و خرده‌ای نفر، چهارتا مانده بودند. بار دیگر درهم‌تنیدگی فضا-زمان ثابت شد.حس خوبآبی‌سفید یک خانه‌ی بزرگِ قدیمیِ بازسازی‌شده است با احترام، اعتقاد و التزام به ارزش‌های بناکنندگان اولیه‌اش. از آن خانه‌های ایرانی. دو طبقه، با یک حیاط بزرگ و استخری بزرگتر، آخر حیاط هم آلاچیق گذاشته اند. طبقه اول میزکار اشتراکی و طبقه دوم دفترکار. ویرگول هم طبقه دوم همین عمارت است.ایونت ِ پیاده‌رویتقریبا هرروز عصرها پیاده‌روی دارند. پیاده‌روی روزانه‌ی عصرگاهی در بهارِ دونفره‌ی اصفهانِ زیبا بهترین قسمت است برای معتادین به کار؛ نخ تسبیح هم آقای راوی است هرچند خودش مخالف میان‌داری فردی است. در یک رویدادشان هم شرکت کردم: فتوواک، تجربه‌ای عمیقاً عالی. ظاهراً پنج‌شنبه‌ها هم مافیا اجرا (بازی؟) می‌کنند.موخرهدر آبی‌سفید جامعه (کامیونیتی) دیدم نه برخلاف بعضی‌ها در اکوسیستم تهران و یزد و ... که باند و باندبازی راه انداخته‌اند. اعتقاد به پیشرفت دارند و پیشرفت می‌کنند، خلق ارزش را دوست دارند و ارزش خلق می‌کنند، پدرخوانده نداریم، شوعاف هم نبود. خستگی معنا نمی‌شود. نسبت کیفیت به ادعا به بی‌نهایت میل می‌کند. همه هم IT کار و برنامه‌نویس و sysadmin نبودند هرچند IT-Man ها بیشترند؛ اما دوتا برای کنکور ارشد روانشناسی درس می‌خوانند، دیگری تورلیدر، یکی هم استاد دانشگاه، مثلا یکی دونفر هم عکاس.ایوان ورودیجان‌پیچنه اهل تملق هستم و نه سود/ضرری دارم قاطعانه اما می‌گویم که این تجربه‌ی پنج‌روزه‌ی هم‌زیستی، جزو نقاط عطف زندگی‌ من است.اگر قرار به کار در فضای اشتراکی باشد انتخاب من اصفهان است آن هم فقط به یک دلیل.آنجا تکه‌ای از روح من جا ماند، اولین جان‌پیچ من در آبی‌سفید است.پس از تحریر: هرچند جان‌پیچ (هورکراکس) به نوعی بار منفی دارد، اما قسمت مثبتش یعنی اینکه بخاطر علاقه‌ی تام‌ریدل تبدیل به جان‌پیچ شده.</description>
                <category>سید مصطفی افزونی | Seyed Mustafa Afzouni</category>
                <author>سید مصطفی افزونی | Seyed Mustafa Afzouni</author>
                <pubDate>Sat, 03 Apr 2021 23:10:06 +0430</pubDate>
            </item>
                    <item>
                <title>کانتینر (Container) در لینوکس به بیان ساده</title>
                <link>https://virgool.io/@afzouni/%DA%A9%D8%A7%D9%86%D8%AA%DB%8C%D9%86%D8%B1-container-%D8%AF%D8%B1-%D9%84%DB%8C%D9%86%D9%88%DA%A9%D8%B3-%D8%A8%D9%87-%D8%A8%DB%8C%D8%A7%D9%86-%D8%B3%D8%A7%D8%AF%D9%87-o7rvxgua47bx</link>
                <description>کانتینر (Container) در لینوکس به بیان سادهفرض کنید می‌خواهیم پکیج و سرویس‌های مختلفی را روی یک سیستم‌عامل نصب کنیم که به آن‌ها اختصارا app می‌گوییم. طبیعی است که هر App کتابخانه‌ها و نیازمندی‌های متفاوتی دارد که به آن‌ها dependency گفته می‌شود. ممکن است app هایی داشته باشیم که به dependency با نام یکسان اما ورژن‌های متفاوت نیازمند باشند. همچنین این dependency ها ممکن است خودشان نیز dependency داشته باشند. این مورد در شکل زیر نشان داده شده است.وضعیت Dependency ها (البته شکل برای معماری میکروسرویس است)مدیریت پکیج‌ها در لینوکس نسبتا به خوبی صورت می‌گیرد اما dependency ها زمانی مشکل‌ساز می‌شوند که دو پکیج conflict (تداخل) بخورند یا اینکه یک کتابخانه برای اجرا نیاز به محیط یا سیستم‌عاملی دیگر داشته باشد، عبارت The following packages have unmet dependencies...عبارت نسبتا آشنایی برای افرادی است که با دبیان‌بیس‌ها کار کرده‌اند!شاید بتوان برای برخی از کامپوننت‌ها و سرویس‌ها، ماشین‌های مجازی (Virtual Machine یا VM) مجزایی را درنظر گرفت که تاحدی مشکلات Conflict و محیط اجرا را حل می‌کند، اما این سناریو یک ایراد بسیار بزرگ دارد: زمانی که محصول رشد می‌کند یا تعداد سرویس‌‌ها زیاد می‌شود، نیازمند VM های متعددی هستیم. طبیعی است که افزایش تعداد VM نه تنها منجر به افزایش هزینه و هدر-رفت منابع سخت‌افزاری می‌شود که مدیریت خود VM ها و سیستم‌عامل‌های نیز سخت خواهد شد.جدای از بحث dependency و نگه‌داری (Maintenance) از سویی دیگر، در محیط‌های عملیاتی (Production) چندمورد ضروری است:مصرف منابع (نظیر رم و سی‌پی‌یو) برای پراسس‌ها باید مدیریت شود.پراسس / سرویس‌های موجود را بتوان ایزوله کرد.بتوان سرویسی را Scale کرد، هرچند می‌توان از یک سرویس چندین پراسس ایجاد کرد، اما این پراسس‌ها باید ایزوله باشند.کانتینر (Container) وارد می‌شودمواردی که گفته شد، تقریباً بطور کامل با کانتینر حل می‌شود:استفاده از محیط‌های مختلفایزوله‌کردن پراسس‌هااجرای سرویس‌های متعدد و اجرای متعدد سرویس‌ها روی یک ماشینسربار بسیار پایین نسبت به VMمدیریت مصرف منابعمدیریت ساده‌تربجای استفاده از VM های متعدد برای حل این موارد، می‌توان از Linux Container Technology (LXC) بعنوان یکی از راه‌های پیاده‌سازی و مدیریت کانتینرها نام برد. LXD نیز یکی دیگر از راه‌های پیاده‌سازی کانتینرها است. کانتینر سربار بسیار بسیار کمی نسبت به VM دارد.زمانی که پراسس داخل کانتینر اجرا می‌شود، در کنار سایر پراسس‌ها و داخل یک سیستم‌عامل اجرا شده، با این تفاوت که نسبت به بقیه کاملاً ایزوله است و آن پراسس اجرای خود را داخل یک سیستم‌عامل و ماشین دیگر می‌بیند.تفاوت کانتینر با VMکانتینر نسبت به VM بسیار سبک است (Lightweight) و اجرای تعداد زیادی از کامپوننت‌ها روی یک سیستم‌عامل را امکان‌پذیر می‌کند. همچنین منابع سخت‌افزاری بسیار کمتری نیاز دارد، چرا که هر VM نیازمند منابع، سیستم‌عامل، کرنل و ... اختصاصی مربوط به خودش است. بطور کلی اگر بخواهیم کانتینر را تعریف کنیم شاید عبارت زیر مناسب باشد:کانتینر، یک یا چند پراسس ایزوله‌شده و بدون سربار اضافی است که منابع اختصاص‌داده شده به خودش را مصرف می‌کند. در‌واقع بجای ایزوله‌کردن در لایه‌ی hypervisor ، ایزوله‌سازی در سطح کرنل انجام می‌شود. بعبارت دیگر در کانتینر هزینه‌ی کرنل را نمی‌دهیم.شکل زیر تفاوت کانتینر و VM را بخوبی نشان می‌دهد:تفاوت کانتینر و ماشین مجازی (VM)همانطور که گفته شد و در تصویر بالا نیز مشاهده می‌شود، کانتینر از کرنل هاست اصلی استفاده می‌کند، بنابراین خروجی دستور زیر برای مشاهده ورژن و نام کرنل در هر کانتینر و هاست اصلی یکسان است:uname -srvmنتیجه:کانتینر از کرنل هاست اصلی استفاده می‌کنداما یک سوال را هنوز نمی‌توانم پاسخ دهم و خوب است که در مورد آن فکر کنیم:اصلا مقایسه‌ی کانتینر و VM کار درستی است؟کانتینر / Container و باربریکانتینر در باربری (از جمله باربری دریایی) تحولی را بوجود آورد. یعنی تولیدکننده بار خود را در یک ساختار مشخص (کانتینر) ریخته و ارسال می‌کند. داخل کانتینر هرچیزی می‌تواند باشد: عروسک، تلفن همراه، لپ‌تاپ، کفش و ... که ساختار و نحوه ارسال آن کاملا مستقل از جنس ارسالی است.کانتینر چگونه کار می‌کند؟همانطور که گفته شد کانتینر، پراسس‌ها را ایزوله می‌کند اما این سؤال مطرح می‌شود که چگونه پراسس در یک سیستم‌عامل مشترک از سایر پراسس‌های همان سیستم‌عامل ایزوله می‌شود؟ پاسخ به این سؤال در دو ویژگی لینوکس است:یک. Linux Namespacesدو. Linux Control Groups (cgroups)فضای‌نام لینوکس / Linux Namespacesدر لینوکس، Namespace ها باعث می‌شوند که هر پراسس نگاه (View) خودش را به سیستم داشته باشد، این «زاویه‌ی دید» شامل فایل‌ها، پردازنده، Hostname، اینترفیس شبکه و مواردی از این قبیل است.لینوکس بطور پیش‌فرض یک Namespace دارد که همه منابع سیستم مانند PID ها، UserID ها، اینترفیس‌های شبکه و … به آن Namespace تعلق دارند.می‌توان Namespace های مختلفی را ایجاد و منابع سیستم را برای آن‌ها مدیریت کرد. همچنین اجرای پراسس در آن Namespace ها امکان‌پذیر بوده، بگونه‌ای که پراسس تنها منابع مربوط به آن Namespace را مشاهده می‌کند.لازم به ذکر است انواع مختلفی از Namespace در لینوکس وجود داشته و پراسس لزوماً فقط به یک Namespace خاص تعلق ندارد. از انواع مختلف Namespace می‌توان به موارد زیر اشاره کرد:Mount (mnt)Process ID (pid)Network (net)Inter-process communication (ipc)UTSUser ID (user)هر نوعی از Namespace برای ایزوله‌کردن گروهی از منابع بکار می‌رود. بعنوان مثال UTS مشخص‌ می‌کند که پراسس کدام Hostname و دامنه (Domain Name) را ببیند؛ مثلا با دو Namespace متفاوت از نوع UTS می‌توان پراسس‌هایی داشت که دو Hostname مختلف را می‌بینند و بعبارت دیگر دو پراسس داریم که در دو ماشین مجزا اجرا شده‌اند.گروه‌های کنترلی / Linux Control Groups (cgroups)گروه‌های کنترلی یا Linux Control Groups (cgroups) دومین ویژگی‌ای است که لینوکس برای ایزوله‌کردن کانتینرها بکار می‌گیرد. Cgroup یکی از Feature های کرنل لینوکس بوده و محدودیت منابع مصرفی کانتینر و پراسس (یا گروهی از پراسس‌ها) را مشخص می‌کند. پراسس نمی‌تواند بیش از آنچه‌ که بدان اختصاص داده شده است را مصرف کند. این محدودیت منابع شامل پردازنده، رم، پهنای‌باند و مواردی از این دست است. همانطور که پراسس‌های دو سیستم مجزا نمی‌توانند منابع یکدیگر را مصرف کنند، این محدودیت منابع نیز باعث می‌شود که پراسس اجازه مصرف منابع سایر پراسس‌ها را نداشته باشد.رابطه داکر / Docker و کانتینر / Containerتا اینجا توضیحاتی در مورد کانتینر داده شد، اما رابطه کانتینر و داکر چیست؟ می‌توان گفت که داکر یک سرویس (یا پلتفرم) برای مدیریت کانتینرها است، در‌واقع داکر اولین سیستم مدیریت کانتینر بود که علاوه بر نقش مدیریت کانتینر، عملیات پکیج‌کردن و dependency ها را نیز به سادگی و در سیستم‌عامل‌های مختلف مدیریت می‌کند. یکی از ویژگی‌های بسیار عالی داکر، نیز همین مورد است؛ اجرای کانتینرهای مختلف روی سیستم‌عامل‌های مختلف.و اگر ساده‌تر بگوییم:داکر یک پکیج کاملاً Portable می‌سازد که علاوه بر اجرا بصورت کانتینر و مستقل از سیستم‌عامل، امکان مدیریت منابع را هم فراهم می‌کند. این پکیج‌ها همان Image های داکر هستند.مثالی را برای تقریب به ذهن می‌زنم:در مجازی‌سازی، ایمیج (مثلاً export فایل ovf) داریم که روی virtual-box (یا هر مجازی‌ساز دیگر مثل ESX) اجرا شده و VM شروع بکار می‌کند. برای داکر هم Image داریم که سرویس داکر آن‌ را اجرا کرده و کانتینر شروع بکار می‌کند، با این تفاوت که سربار اضافی نداریم و کرنل مشترک است.چند نکتهیکی از تفاوت‌های VM و داکر، علاوه بر سطح جداسازی، تفاوت لایه‌بندی ایمیج‌ها است، بدینصورت که در داکر اگر لایه‌ای از قبل موجود باشد نیازی به دانلود یا ساختن مجدد آن نیست.یکی از مواردی که مورد توجه قرار دارد، بحث امنیت است. همانطور که گفته شد ایزوله‌کردن کانتینر در سطح کرنل صورت گرفته و اگر در کرنل آسیب‌پذیری‌ای وجود داشته باشد امکان دورزدن cgroup و namespace بوجود می‌آید. البته این نگرانی در مورد مجازی‌سازی و Hypervisor هم وجود دارد، اگر آسیب‌پذیری‌ای در ESX وجود داشته باشد، دسترسی از یک VM به VM دیگر امکان‌پذیر است.کانتینر به خودی‌خود سربار چندانی ندارد، اما زمانی که پورت کانتینر پابلیش می‌شود (Port Mapping) به دلیل عملیات NAT کردن و قرارگرفتن پشت iptables یک سربار نسبتا کمی را ایجاد می‌کند. این Overhead ایجادشده در ازای مزایای کانتینر، کاملا ارزش هزینه‌-کرد را دارد.راه‌های مختلفی برای پیاده‌سازی میکروسرویس وجود دارد اما استفاده از کانتینر رایج بوده و عموما توصیه می‌شود.از rkt (بخوانید rock-it) می‌توان بعنوان دیگر پلتفرم مدیریت کانتینر و جایگزینی برای Docker نام برد.کوبرنتیز (Kubernetes) برای مدیریت، دپلوی و Scale کانتینرها در سطح چندین هاست است. داکر یکی از ابزارهایی است که کوبرنتیز توانایی کار با آن را دارد.در این نوشتار سعی شد تا حد ممکن بصورت ساده توضیحاتی داده شود و ایراداتی از نظر فنی دارد.برای این نوشته تا حد زیادی از کتاب Kubernetes in Action کمک گرفته شده است. همچنین تصاویر نیز از همین منبع است.</description>
                <category>سید مصطفی افزونی | Seyed Mustafa Afzouni</category>
                <author>سید مصطفی افزونی | Seyed Mustafa Afzouni</author>
                <pubDate>Sat, 26 Sep 2020 10:07:52 +0330</pubDate>
            </item>
                    <item>
                <title>سرویس پایتون Flask در محیط عملیاتی (Production)</title>
                <link>https://virgool.io/@afzouni/%D8%B3%D8%B1%D9%88%DB%8C%D8%B3-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-flask-%D8%AF%D8%B1-%D9%85%D8%AD%DB%8C%D8%B7-%D8%B9%D9%85%D9%84%DB%8C%D8%A7%D8%AA%DB%8C-production-shpet47t3nfg</link>
                <description>پیاده‌سازی سرویس پایتون Flask در عملیات؛ Productionفلسک / Flask یکی از کتابخانه‌های پایتون برای پیاده‌سازی وب‌سرویس و API است و یک میکروفریمورک ساده اما سبک محسوب می‌شود.در این نوشتار به چگونگی استفاده از Flask در محیط Production (محیط عملیاتی یا محصول) بصورت یک سرویس لینوکسی پرداخته می‌شود. هرچند استفاده از داکر راه بسیار مناسبی برای استقرار در Production است اما برخی از مواقع و بنا به ملاحظاتی چندان بهینه نیست. بعنوان یکی از طرفداران سرسخت داکر باید به این نکته اشاره کنم: استفاده از داکر در مواقعی که منابع پایینی داریم (مثلاً ۵۱۲ مگ رم)  یا هنگامی که در حال کار با یک رزبری‌پای هستیم، چندان منطقی بنظر نمی‌رسد. البته سعی خواهم کرد همین شیوه را با استفاده از داکر در نوشته دیگری بیاورم.برای هر بخش سعی کردم توضیحاتی داشته باشد و فقط Command و Code نباشد تا خواننده نسبت به آن دید پیدا کند، که منجر به طولانی‌شدن مطلب شده است. محیط Production چیست؟مهم نیست چه چیزی را توسعه می‌دهیم، زمانی که کد یا محصولی توسعه داده می‌شود، در محیط توسعه یا Development قرار داریم. در Development طبیعی است که خطاها مشاهده شوند و کسی در آنجا محصول را Attack نمی‌زند و از همه مهم‌تر کاربر / مشتری با آن کار نمی‌کند. در Production نه تنها کاربر / مشتری با محصول کار می‌کند بلکه معمولا انواع حملات روی آن صورت می‌گیرد.زمانی که صحبت از کاربر / مشتری می‌شود، در واقع صحبت از یک کسب‌وکار است؛ محصول، وب‌سایت، سخت‌افزار و ... تفاوتی ندارند؛ در Production حق اشتباه نداریم. منظورم فقط باگ نیست؛ وقتی یک خطای برنامه به کاربر نمایش داده شد، یا اینکه بخاطر سهل‌انگاری در پیکربندی یک سرویس، آسیب‌پذیر شویم و بعدا Attack (رَکَب) بخوریم، مساله باگ نیست، این یعنی اهمیت نداشتن کسب‌وکار و در نهایت رسیدن به نقطه شکست.همه تلاش ما در Production باید این مساله باشد که حداکثر پایداری، صحت و امنیت را تامین کنیم.۱. معماریمعماری پیشنهادی برای یک وب‌سرویس‌ اینگونه است:معماری پیشنهادیفلسک / Flask ، وب‌سرورِ Production نیست!زمانی که وب‌سرویسی توسعه داده می‌شود (در محیط Development) وب‌سرور داخلی Flask اجرا شده و درخواست‌ها را مستقیما پردازش می‌کند. اما در محیط‌ Production ارسال درخواست به وب‌سرور داخلی Flask اشتباه است و باید از WSGI استفاده کنیم.استفاده از Gunicornبرای WSGI از Gunicorn  استفاده می‌کنیم (اطلاعات بیشتر در این مقاله آمده است) که بصورت سرویس لینوکسی با systemd پیاده‌سازی خواهیم‌کرد.پروکسی معکوس / Reverse Proxyدر لبه سرور، Reverse Proxy قرار دارد؛ درخواست ابتدا به پروکسی می‌رسد و پروکسی آن‌ را به WSGI ارسال می‌کند. استفاده از Reverse Proxy اختیاری است اما شدیداً توصیه‌ می‌شود و همچنین امکانات زیر را در اختیار ما می‌گذارد:امکان استفاده از HTTPs بدون نیاز به تغییر در WSGI برای پیاده‌سازی TLS/SSLامکان پخش‌بار و Load Balancingلاگ‌گیری ساده‌تربررسی درخواست‌ها از نظر امنیتی و Reject درخواست‌های مشکوک سرویس‌های متعددی برای Reverse Proxy وجود دارند: Apache ، Nginx ، HA-Proxy و … . هرچند Apache و Nginx وب‌سرور هستند اما در حالت Reverse Proxy نیز کار می‌کنند. معمولاً برای پروکسی از Nginx استفاده می‌شود.پروکسی اختیاری است، اما بشدت، بشدت و بشدت استفاده از آن را توصیه می‌کنم، مگر در مواردی که واقعا با کمبود منابع مواجه هستید و درخواست‌های کاملاً کنترل‌شده‌ای به WSGI ارسال خواهند شد.۲. سورس‌کدکتابخانه Flask با دستور زیر نصب می‌شود:pip3 install flaskبرای شروع، کد زیر را با Flask پیاده‌سازی و در فایلی با نام webapp.py ذخیره می‌کنیم:from flask import Flask
from os import urandom

app = Flask(__name__)
app.config.update(SECRET_KEY = urandom(24))

@app.route(&#039;/&#039;)
def hello_world():
    return &#039;Hello, World!&#039;

if __name__ == &amp;quot__main__&amp;quot:
    app.run()این کد ساده زمانی که اجرا شود، روی پورت ۵۰۰۰ (پیش‌فرض) یک وب‌سرور را راه‌اندازی می‌کند:وب‌سرور داخلی Flaskبه هشدار قرمز رنگ دقت کنید :)This is a development server. Do not use it in a production deployment.اگر در مرورگر آدرس را وارد کنیم طبیعتا نتیجه زیر مشاهده می‌شود:ریسپانس وب‌سرور مقداردهی SECRET_KEYبرای رمزنگاری اطلاعات session که در cookie ذخیره می‌شود، حتماً باید SECRET_KEY تعریف شود. مقدار SECRET_KEY را نباید هاردکد شده یا در فایل نگه‌داری کرد؛ در اینصورت اگر سورس‌کد ما در محیط‌های مختلف استفاده شود، همگی SECRET_KEY های یکسانی را خواهند داشت و در صورت لو رفتنِ مقدار آن، برنامه‌ی ما در برابر حملات Session Hijacking آسیب‌پذیر می‌شود. برای حل این مشکل از تابع urandom استفاده می‌کنیم که برای هربار اجرا یک مقدار تصادفی برای SECRET_KEY مقداردهی می‌شود. دقت کنید که SECRET_KEY برای هربار اجرای Flask مقداردهی می‌شود نه هر درخواست!app.config.update(SECRET_KEY= urandom(24))تا اینجا وب‌اپلیکیشن راه‌اندازی شده است.۳- پل ارتباطی وب‌ سرور‌ با وب‌اپلیکیشن (WSGI)برای  Web Server Gateway Interface یا WSGI  معادل فارسی مناسبی پیدا نکردم؛ در ویکی‌پدیا واسط دروازه کارساز وب نام‌گذاری شده اما بنظرم پل ارتباطی وب‌سرور به ذهن نزدیک‌تر است.همانطور که گفته شد برای WSGI از gunicorn استفاده می‌کنیم. نصب آن نیز به کار خاصی نیاز ندارد:pip3 install gunicorn   برای تست WSGI و کارکرد آن با وب‌اپلیکیشن بصورت زیر اجرا می‌کنیم:‫‪gunicorn‬‬ ‫‪‫‪-w 4 --bind‬‬ ‫‪127.0.0.1:5000‬‬ --pid /tmp/webapp.pid  ‫‪webapp:app‬‬نتیجه اجرای gunicornپارامتر bind تعیین می‌کند که WSGI روی کدام آدرس و پورت گوش کند. اگر قرار است از پروکسی استفاده شود حتماً روی 127.0.0.1 یا localhost تنظیم شود.پارامتر  pid هم مسیر Process ID (همان 734) را تعیین می‌کند که برای سرویس استفاده خواهدشد.پارامتر w تعداد worker یا همان پروسس‌ها را مشخص می‌کند. دقت کنید این‌ها Thread نیستند، پروسس‌های فرزند از یک پروسس اصلی هستند (در اینجا 734)؛ یعنی یک gunicorn اصلی داریم که چهار پروسس موازی را بعنوان فرزند از آبجکت app تشکیل داده است.همچنین اگر برنامه‌ی شما Multi-thread باشد thread ها بعنوان فرزند برای هر worker ایجاد می‌شوند.ورکرهای gunicorn۴. سرویس gunicornبرای مانیتور و مدیریت راحت‌تر gunicorn با استفاده از systemd سرویسی را برای آن پیاده‌سازی می‌کنیم. با توجه به اینکه در Production هستیم از نظر امنیتی توصیه می‌شود user و group مربوط به سرویس  ایجاد شوند. sudo adduser --shell=/bin/false --disabled-password --home=/usr/share/webapp --system --group  webapp سورس‌کد را در دایرکتوری home مربوط به user که ساخته شد قرار می‌دهیم. دقت داشته باشید که دایرکتوری home هنگام تعریف user مشخص شد./usr/share/webappهمچنین لازم است permission و owner فایل‌های داخل دایرکتوری اصلاح شوند:chown -R webapp:webapp /usr/share/webapp
chmod 644 /usr/share/webapp/*توجهمواردی که برای اضافه‌کردن user و تنظیم permission ها گفته شد، اجباری نیستند اما بنا به دلایل امنیتی و با توجه به اینکه در محیط Production قرار داریم ضروری است. برای ایجاد سرویس در systemd فایل سرویس را در مسیر زیر ایجاد می‌کنیم:/usr/lib/systemd/system/webapp.serviceکه محتویات آن بصورت زیر است:[Unit]
Description=Web-Application Service
after=network.target
Conflicts=getty@tty1.service
[Service]
Type=simple
User=webapp
Group=webapp
WorkingDirectory=/usr/share/wepapp
PIDFile=/var/run/webapp.pid
ExecStart=/usr/local/bin/gunicorn -w 4 -b 127.0.0.1:5000 --pid /var/run/webapp.pid server:app
Restart=always
RuntimeDirectoryMode=755
[Install]
WantedBy = multi-user.targetتا اینجا webapp به لیست سرویس‌ها اضافه شده اما برای اینکه systemctl تغییرات (افزودن، ویرایش و حذف فایل سرویس) را اعمال کند ضروری است دستور زیر اجرا شود:systemctl daemon-reloadبرای استارت سرویس این دستورِ آشنا را اجرا می‌کنیم:service webapp startحالا اگر به پورت ۵۰۰۰ لوکال‌هاست درخواستی را بفرستیم خروجی زیر را دریافت خواهیم کرد:خروجی سرویس webapp۵. پروکسیتا اینجا وب‌سرویس ما اجرا شد و روی پورت ۵۰۰۰ لوکال‌هاست درخواست‌ها را پاسخ می‌دهد. مرحله بعدی باید Reverse Proxy کانفیگ شود تا از لبه‌ی سرور درخواست‌های ورودی را به وب‌سرویس ارسال کند.کانفیگ Nginxserver {
	 listen 80;
	 location / {
		proxy_pass http://127.0.0.1:5000;
	 }
}کانفیگ Apache&lt;VirtualHost *:80&gt;
	ProxyPreserveHost On
	ProxyPass / http://127.0.0.1:5000/
	ProxyPassReverse / http://127.0.0.1:5000/
&lt;/VirtualHost&gt;پس از ریستارت سرویس apache اگر درخواستی ارسال شود، apache آن را به وب‌سرویس ارسال و پاسخ را برمی‌گرداند.برای WSGI وب‌سرور آپاچی ماژول mod_wsgi دارد اما شخصا استفاده از آن را توصیه نمی‌کنم: اول آنکه تجربه‌ خیلی بسیار سخت و ناخوشایندی را با این ماژول دارم. دوم اینکه این ماژول برای هر درخواست کد را اجرا می‌کند.سوم هم امکان Scale-Up وجود ندارد.درنظر داشته باشید کانفیگ‌های Nginx و  Apache را می‌توان روی دامنه (و همچنین زیردامنه) و پورت خاصی نیز تعریف کرد؛ مثلا api.domain.com و پورت ۸۰۸۰.۶. چند نکتهدر سورس‌کد خود از ساختارهای مدیریت خطا (Try/Exception) استفاده کنید.خودِ سورس‌کد برای خطایابی و بررسی مشکلات حتما Log داشته باشد.مطالبی که گفته شد برای Django هم امکان استفاده دارد.برای پروکسی حتما Log را فعال کنید.در پروکسی‌ ماژول ModSecurity را درصورت امکان فعال و استفاده کنید تا درخواست‌ها از نظر امنیتی بررسی و موارد مشکوک Reject شوند.ممکن است نیاز باشد پورت پروکسی روی سرویس فایروال (firewalld ، iptables ، ufw) نیز باز شود.پیشنهاد می‌کنم برای امن‌سازی، دستورالعمل‌های Hardening برای وب‌اپلیکشین، وب‌سرورها، لینوکس و هرآنچه که نیاز دارید را مطالعه و اجرا کنید.</description>
                <category>سید مصطفی افزونی | Seyed Mustafa Afzouni</category>
                <author>سید مصطفی افزونی | Seyed Mustafa Afzouni</author>
                <pubDate>Sat, 18 Apr 2020 17:01:33 +0430</pubDate>
            </item>
                    <item>
                <title>کامپایل و حفاظت از پایتون؛ Cython</title>
                <link>https://virgool.io/coderlife/%DA%A9%D8%A7%D9%85%D9%BE%D8%A7%DB%8C%D9%84-%D9%88-%D8%AD%D9%81%D8%A7%D8%B8%D8%AA-%D8%A7%D8%B2-%D9%BE%D8%A7%DB%8C%D8%AA%D9%88%D9%86-cython-tvq9jc2je2ib</link>
                <description>کامپایل و حفاظت از پایتونپایتون زبان برنامه‌نویسی ساده اما قدرتمندی است و سرویس‌ها،‌ اسکریپت‌ها و محصولات متنوعی بر پایه پایتون نوشته شده‌اند.پایتون (درحالت عادی) بر خلاف زبانی مثل ++C برای اجراشدن، کامپایل نمی‌شود و اصطلاحا تفسیری یا Interpreted است. شاید تعبیر خیلی صحیحی نباشد اما برای نزدیک‌شدن ذهن: برای اجرای پایتون، مفسر اسکریپت را خط به خط اجرا می‌کند تا اسکریپت تمام شود (شاید هم نشود!)؛ لود کتابخانه‌ها، ساختن Thread، اتصال به دیتابیس و ... همگی به همین صورت انجام می‌شود.حالا در نظر بگیرید بنا به دلایلی نخواهید از یک اسکریپت خام پایتون استفاده کنید. مثلا کد/ماژول پایتون شما قرار است در سروری بکارگیری شود که مدیریت آن با شما نیست، طبیعتا در این حالت باید از کد خود حفاظت کنید. فایل‌هایی هم که بصورت pyc. در می‌آیند در این زمینه خیلی مفید نخواهد بود...حسب تجربه :) محافظت از سورس‌کد پایتون کار پیچیده‌ای نیست و ابزار یا (بهتر بگویم) کتابخانه‌ای وجود دارد به اسم Cython.۱. معرفی Cython کتابخانه Cython کد یا ماژول‌های پایتونی شما را تبدیل به C می‌کند و این سورس‌کدهای C به فایل‌های باینری و کتابخانه‌های اشتراکی کامپایل می‌شوند؛ کتابخانه اشتراکی یا Shared Objects در لینوکس so ها هستند و در ویندوز همان DLL معروف. خبر خوب اینکه راهی مستقیم برای تبدیل کتابخانه‌های اشتراکی به سورس‌کد نداریم.۲. نصب Cython نصب Cython به سادگی با pip انجام می‌شود:pip3 install cython۳. یک فایل compile.py بسازیددر کنار ماژول‌ و سورس‌کد پایتون یک فایل با نام compile.py با محتویات زیر بسازید. اسم فایل هم لزوما نباید compile.py باشد. from distutils.core import setupfrom distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules = [
    Extension(&amp;quotmymodule1&amp;quot,  [&amp;quotmymodule1.py&amp;quot]),
    Extension(&amp;quotmymodule2&amp;quot,  [&amp;quotmymodule2.py&amp;quot]),
    Extension(&amp;quotmymodule2&amp;quot,  [&amp;quotmymodule3.py&amp;quot]),
]

setup(
    name = &#039;My Program Name&#039;,
    cmdclass = {&#039;build_ext&#039;: build_ext},
    ext_modules = ext_modules
)۴. اجرا و کامپایلبرای اجرا، کامپایل و ساخت فایل‌های so دستور زیر را اجرا کنید:python3 compile.py build_ext --inplaceکامپایل سورس‌کد پایتونپس از اجرای این دستور، فایل‌های زیر ساخته خواهند شد:فایل‌های ساخته‌شده فایل so بصورت زیر نام‌گذاری شده:عنوان ماژولورژن پایتون استفاده‌شدهمعماری سیستم‌عامل و پردازندهپلتفرم مورد استفادهچه اتفاقی افتاد؟ابتدا سورس‌کد پایتون تبدیل به C شد (کد میانی) و بعد کامپایلرِ C (مثلا gcc) این کد C را تبدیل به so کرد. برای سیستم‌های ویندوزی تست نکردم اما قاعدتا باید DLL تولید کند.۵. نحوه استفادهبرای استفاده نیازی به سورس‌کد پایتون (py) و کدهای C نیست. فایل‌های so  کافی هستند. استفاده از so هم عین py است، یعنی اگر قبلا ماژولی را (کامپایل‌نشده، همان py) بصورت زیر استفاده می‌کردید:from parser import cacheفایل so ساخته‌شده را جایگزین py کنید و کار دیگری لازم نیست.۶. چندنکتهدر اصل قضیه تفاوتی ایجاد نشده است. شما همان پایتون را اجرا می‌کنید و فقط بجای ماژول/کدی که قبلا داشتید، کامپایل‌شده آن را استفاده و import می‌کنید.اگر در سورس‌کد پایتون شما کتابخانه‌ای استفاده شده (مثلا از yaml) برای استفاده so در سیستم دیگر، باید این کتابخانه‌ها در سیستم دیگر هم نصب شده باشند.اگر از لینوکس استفاده می‌کنید، حتما باید پکیج gcc برای کامپایل نصب شده باشد.من روی Ubuntu 18.04 کامپایل کردم و در CentOS 7 به خوبی کار کرد، طبیعی هم بود :)برای کامپایل با پایتون ۳.۷ خطاهای عجیبی بوجود آمد، به همین دلیل ابتدا با پایتون ۳.۶ کامپایل کردم تا کدهای C ساخته شوند و مجدد با پایتون ۳.۷ اجرا شد :||هرچند پشتیانی از پایتون ۲ تمام شده اما رویه استفاده از Cython به همین صورت است.توضیح: نوشتار از این مقاله گرفته شده است.</description>
                <category>سید مصطفی افزونی | Seyed Mustafa Afzouni</category>
                <author>سید مصطفی افزونی | Seyed Mustafa Afzouni</author>
                <pubDate>Sun, 05 Apr 2020 18:37:27 +0430</pubDate>
            </item>
            </channel>
</rss>