گاه نوشته های مهدی بیاضی

tail -f /dev/mind > blog

گاه نوشته های مهدی بیاضی

tail -f /dev/mind > blog

طبقه بندی موضوعی

در زمان های نه چندان دور تعداد سرور ها و کل زیر ساخت معمولا کوچک و کم بود. سازمان یا سرویس های بسیار اندکی تعداد سرور هایشان از چند ده تا بیشتر می شد اما با پیشرفت فوق العاده عجیب و سریع اینترنت و سرویس ها، نیاز به استفاده از سرور های بیشتر در بستر و زیر ساخت احساس شد. الان سرویس ها و نرم افزارهای تحت وب بسیاری دارای میلیون ها کاربر بوده و بعضی داده هایی با حجم های بسیار زیاد (چندین پتابایت) ذخیره و روزانه به هزاران و حتی میلیون ها کاربر سرویس دهی می کنند.

ادمین ها قبلا با روش های ساده ای مثل ssh به یک سرور متصل و دستوراتی رو اجرا می کردند اما مشخص هست که با اضافه شدن تعداد سرور، بحث مدیریت این سرور ها سخت و سخت تر می شه.

هر نرم افزار تحت وب برای راه اندازی و سرویس دهی نیاز به یک سری زیرساخت و بستر داره که اکثرا آشنایی دارید با این موارد. به طور کلی مدیریت زیرساخت در یک سرویس تحت وب موارد زیر می تونه باشه

  • سخت افزار و شبکه
  • تنظیم و نصب سیستم ابری (کلود یا Cloud) و سیستم های مجازی (vm)
  • سیستم عامل و نرم افزار (نصب، تنظیم و به روز رسانی)
  • وظایف و دستورات زمانبندی شده (پشیبان گیری، حذف لاگ، تنظیم ساعت و ...)
  • دستورات و وظایف دستی (نصب نرم افزار، ریست و ...)
  • مانیتورینگ
  • و ...

خوب همین دلایل و نیاز به روشی سریع و مطمئن برای مدیریت سرور ها باعث ایجاد نرم افزار هایی خاص برای این کار شد. نرم افزار هایی مثل puppet. ابزار puppet با استفاده از زبان روبی (Ruby) نوشته شده و یکی از نرم افزار های خوب برای مدیریت مرکزی نصب، تنظیمات و نگهداری سیستم عامل و نرم افزار های چندین سرور هست.

ابزار های پایتونی هم هستند که البته به نسبت پاپت محدود تر بودند و مثلا برای اجرای یک سری دستورات از طریق ssh کاربرد داشتند مثل Fabric.

سال ۲۰۱۱ ابزاری معرفی شد به اسم salt. این یک پروژه پایتونی بود که به منظور مدیریت متمرکز سرور ها ایجاد شد و به زودی طرفداران بسیاری پیدا کرد. مدت ها از پروژه های بسیار فعال github بود (رکورد بیشترین تعداد توسعه دهنده در سال ۲۰۱۲) و توسعه وحستناکی روش انجام شد ! تقریبا هر روز کلی بهبود و کد جدید بهش اضافه می شد تا اینکه تبدیل شد به یک ابزار بسیار قوی و مناسب.

از Salt یا همون SaltStack برای ۲ منظور مهم استفاده می شه.

  1. سیستم مرکزی برای مدیریت تنظیمات
  2. اجرای از راه دور دستورات

اما ویژگی های منحصر به فرد ابزار Salt:

Scale

  • توانایی مدیریت ده ها هزار سرور
  • سیستم Message بر اساس ZeroMQ
  • اتصالات همزمان و اجرای موازی دستورات
  • استفاده از MessagePack
  • عدم استفاده از ssh که بسیار کند تر هست

امنیت

  • سیستم اعتبار سنجی با استفاده از کلید عمومی
  • رمز نگاری پیغام ها و دستورات ارسالی با استفاده از AES

ویژگی های برجسته

  • معماری ساده
  • نصب آسان
  • تنظیمات آسان
  • امکان توسعه و ماژول نویسی
  • سرور داخلی قایل
  • عدم وابستگی به ابزار یا نرم افزار های دیگر

سایت رسمی

آدرس Github

مستندات پروژه

۰ موافقین ۲ مخالفین ۰ ۱۱ آبان ۹۲ ، ۱۸:۳۱
مهدی بیاضی

تقریبا از یکی دو ماه پیش متاسفانه برای بستر امن گوگل در ایران مشکلی به وجود اومده. اگر سایت گوگل رو باز کنید و یا چیزی رو داخلش جستجو کنید متوجه می شه که گوگل حتی اگر با https اولش وارد بشه به حالت نا امن یا http می ره و عملا همه ارتباط و جستجو و نمایش اون به صورت متنی و کد نشده بین کاربر و گوگل ارسال و دریافت می شه.

برام این مورد جالب بود. بررسی مختصری که کردم متوجه شدم این ویژگی توسط گوگل و برای مدارس ارائه شده که این امکان رو به ادمین مدرسه می ده که ssl رو برای جستجو ها قطع کنه تا بتونه روی جستجو ها و نتایجش نظارت داشته باشه و در صورت لزوم تغییراتی اعمال کنه یا حتی نتایج رو مسدود کنه! حتی می شه ویژگی SafeSearch گوگل که نتایج رو بررسی و حذف می کنه، به طور غیرقایل تغییر برای کاربران فعال کرد !

اطلاعات بیشتر در مورد این ویژگی رو می تونید اینجا بخونید.

نکته دیگه اینکه برای هر درخواست dns بدون توجه به سرور درخواست شده سریعا آی پی 216.239.32.20 برگشت داده می شه که مربوط به دامنه nosslsearch.google.com هست!! یعنی عملا با عوض کردن dns نمی شه به گوگل امن دسترسی داشت. ۲ تا راه وجود داره. یکی استفاده از https://encrypted.google.com که همیشه از پروتکل امن استفاده می کنه و دیگری ست کردن دستی dns برای کامپیوتر یا شبکه داخلی خودتون.

راه سومی هم هست و اونم هم بی خیال شدن این حرف ها و ادامه استفاده هست! :دی

۶ موافقین ۳ مخالفین ۰ ۱۵ آبان ۹۲ ، ۱۱:۱۰
مهدی بیاضی

بحث بسته های باینری نصب نرم افزار در FreeBSD از سالیان دور محل بحث و مقایسه های بسیاری بوده. افراد مختلف با دلایل و اهداف متفاوت دو روش Port (نصب از روی سورس برنامه ها) و روش باینری (*_pkg) رو بررسی کرده اند. خیلی ها روش استفاده از سیستم port یا نصب نرم افزار با استفاده از سورس رو ترجیح می دهند. دلایل مختلفی هم وجود داره. اولا این بسته های سورس یا همون سیستم port فری بی اس دی معمولا به روز هست. یعنی آخرین تغییرات رو می شه داخلشون پیدا کرد در حالی که سیستم باینری و سرور های اون با یک تاخیر به روز می شوند و ممکنه آخرین نسخه هارو نداشته باشند. از طرفی با کامپایل یک برنامه می شه تغییراتی در روند کامپایل و حتی سورس برنامه ایجاد کرد. اینطوری دست کاربران حرفه ای بازتر هست تا برنامه هایی بهینه شده تر با نیاز های خودشون داشته باشند. اما برخی مواقع هدف و نیاز کاربر از سیستم نصب نرم افزار سادگی و سرعت هست ! اینجا هست که ابزار های مدیریت بسته وارد می شوند. از سال ها پیش اکثر توزیع های لینوکس ابزار های مختلف و قدرتمندی برای این منظور توسعه داده اند. برای مثال سیستم apt-get در ابونتو یا yum در فدورا و ...

از سالیان بسیار گذشته با استفاده از دستوراتی چون pkg_add امکان نصب بسته های باینری از پیش کامپایل شده در FreeBSD فراهم بوده اما این دستورات قدیمی هستند و کاستی های زیادی دارند و نیاز های فعلی یک کاربر رو برآورده نمی کنند. این شد که در اواخر سال ۲۰۱۲ تیم توسعه دهنده FreeBSD یک سیستم جدید برای مدیریت بسته های باینری با نام pkgng ارائه کرد. این سیستم شبیه به سیستم apt-get ابونتو بوده و کارکرد مشابهی دارد.

برای استفاده از این سیستم کافی هست دستورات زیر رو اجرا کنید:

# echo "WITH_PKGNG=yes" >> /etc/make.conf
# pkg2ng

دستور اول باعث می شه وقتی یک فایل رو با استفاده از سیستم port کامپایل می کنید اطلاعات اون در pkgng هم رجیستر بشه. این برای استفاده های آینده مهم هست. مثل وقتی دستور نصب بسته ای رو با pkgng می دید باید بدونه چه نرم افزار هایی قبلا نصب شده. چه به صورت کامپایلی از روش پورت ها و چه با خود ابزار pkgng.

خط دوم هم اطلاعات همه بسته های قبلی نصب شده رو به سیستم جدید منتقل می کنه.

اگر این دستور اجرا نشد مطمئن بشه نسخه جدید از FreeBSD دارید یا بسته مربوط به pkgng رو نصب کردید.

حالا با استفاده از دستور pkg در ترمینال می تونید از سیستم مدیریت بسته جدید FreeBSD لذت ببرید !

این سیستم ویژگی های جدید بسیاری داره و کار رو خیلی راحتتر می کنه. مخصوصا برای پورت های عادی مثل emacs یا ...

همینطور می شه به امکان نصب مستقیم یک بسته داخل یک Jail و جستجوی ساده و ... اشاره کرد.

۰ موافقین ۰ مخالفین ۰ ۱۴ آبان ۹۲ ، ۱۷:۲۱
مهدی بیاضی

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

ایمکس طرفداران خیلی زیادی داره و با وجود اینکه چندین سال هست رابط گرافیکی کاربر توسعه پیدا کرده و فراگیر شده هنوز Emacs به زندگی خودش ادامه می ده و توسعه داده می شه و طرفداران خاص خودش رو داره.

شاید سوال بشه برای برخی که در سالهای دور و زمانی که واسط گرافیکی کاربر نبود و همه در محیط هایی شبیه به داس یا شل لینوکس کار می کرد این برنامه می تونست توجیح داشته باشه ولی الان چی؟!

به نظرم چند تا دلیل داره. یکیش اینکه این نرم افزار خیلی قدیمی هست (۳۷ ساله!) و برخی ها بهش معتاد شدن ! دلیل دیگه اینکه در برخی شرایط کاربرانی هستند که هنوز با محیط های متنی کار می کنند. برای مثال دسترسی های ssh یا سرور ها. یک مورد دیگه هم اینکه این برنامه واقعا قوی و جذاب هست و اگر بهش مسلط بشین واقعا سریع و کاربردی هست.

در نهایت نکته ای که هست emacs مدتی هست که با روش های مختلف دارای ظاهر گرافیکی هم شده. اگر توی لینوکس یا سیستم های مبتنی بر یونیکس بسته emacs رو نصب کنید معمولا با یک ظاهر گرافیکی ساده مواجه می شید. نکته ای که در برخی موارد مشکل زا هست. اگر نیاز شما فقط از طریق ترمینال و شل هست (مثلا ssh) پیشنهاد می کنم حتما بسته emacs-nox11 رو نصب کنید که خیلی کم حجم تر هست و کلی بسته اضافی گرافیکی رو نصب نمی کنه. البته این مورد یک مورد مهم در مواردی مثل سرور هایی هست که محیط گرافیکی ندارند اصلا. مثل FreeBSD و Ubuntu Server و ...

۰ موافقین ۰ مخالفین ۰ ۳۰ مهر ۹۲ ، ۱۷:۴۲
مهدی بیاضی

امروز داشتم بسته جدید Postfix رو روی آخرین نسخه پایدار Freebsd (نسخه ۹.۲) نصب می کردم. همه چیز خوب پیش می رفت تا اینکه در مراحل آخر کامپایل یک مشکل عجیب پیش اومد. وقتی سیستم نصب تلاش می کرد کاربر جدیدی با نام postfix بسازه این خطا داده شد:

pw: user 'postfix' disappeared during update

نکته جالب اینکه بعد از این مشکل امکان ساخت یا حذف این کاربر وجود نداشت ! برای ساختن کاربر خطای زیر:

pw: user 'postfix' already exists

و برای حذف این خطا داده می شد:

# pw deluser postfix
pw: no such user `postfix'

مراحل نصب هم که دیگه پیش نمی رفت. اما راه حل این مشکل زیاد سخت نیست. کافی هست که فایل /etc/passwd دوباره ساخته بشه. برای این کار دستور زیر باید اجرا بشه:

# pwd_mkdb -p /etc/master.passwd
۰ موافقین ۰ مخالفین ۰ ۳۰ مهر ۹۲ ، ۱۶:۵۲
مهدی بیاضی

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

از چند ماه پیش اینترنت پرسرعت ؟! مبین نت گرفتم. از همون لحظه اول که سرویس های مختلف رو بررسی می کردم مشکلات شروع شد !!

متاسفانه مرکز مخابراتی ما که نزدیک دانشگاه شریف هم هست، تقریبا هیچ شرکت خصوصی رو داخل مجموعه اش راه نداده ! پس تنها امکان اینترنت مال خود مخابرات هست که هم پروسه بسیار عجیب غریبی داره و هم سرعتی بسیار پایین. تصمیم گرفتم با توجه به اینکه دکل مبین نت تقریبا چند صد متر با منزل فاصله داره و تقریبا دید مستیم داریم از مبین نت اینترنت بگیرم. اقدام کردم و اینترنت ۱ مگابیت رو گرفتم.

روز های اولا بد نبود ! یعنی در حد ۱۲۸ کیلوبیت !! سرعت می داد !! (حداقل وصل بود و بعد از چند ثانیه یه چیزایی می آورد !)

اما تقریبا ۲ ماه هست که سرعت بسیار افت کرده. قطعی ها بسیار بالا رفته و عملا غیرقابل استفاده شده ! چندین بار تماس گرفتم و عملا به نتیجه ای نرسیدم. راه انتخاب دیگه ای هم ندارم عملا ! این قضیه وقتی مهم می شه که توجه کنیم به جایگاه اینترنت در دنیا و همینطور زندگی کسی مثل من که همه کار و بخش مهمی از زندگی و آینده اش گره خورده با اینترنت.

واقعا تاسف می خورم به وضعیت موجود. درسته شاید توی کشورم اینقدر مشکل وجود داره که کسی به همچین چیزی توجه نکنه اما خوب همین چیز های کوچک هستند که یک کشور و جامعه رو می سازند و شاخص های اون رو برای زندگی مشخص می کنند. 

اولا توی بخش بخش کشورم انحصار موج می زنه. اگر با این کنار بیایید باید با محدودیت های همین انحصارگران کنار بییاد. با دروغ و با ....

این چند سال فعالیت من در زمینه نرم افزار و وب، فکر می کنم می تونه کمک کنه که فرق بین سرویس ۱ مگابیت رو با یک سرویس نزدیک ۶۴ کیلو که معلومه بسیار بیشتر از ظرفیت مشتری داره رو بفهمم.

فکر می کنم راه حل بسیار از مشکلات کشورم بسیار راحته. شاید یکی از مهمترین و اساسی ترین راه حل ها که همه می دونند و کسی بهش عمل نمی کنه رفع انحصار هست. رفع انحصار از ارائه کنند اینترنت، خودرو، صدا و سیما و ...

باور دارم که همین مورد بسیار بسیار تاثیر می گذاره در جهت حرکت کشور و پیشرفت سریعش.

امیدوارم روزی ببینم ...

۱ موافقین ۰ مخالفین ۰ ۲۹ دی ۹۱ ، ۱۶:۲۵
مهدی بیاضی

یکی از زمینه های مهم و در حال پیشرفت علم نرم افزار و برنامه نویسی توسعه نرم افزار های تحت شبکه هست. یعنی توسعه برنامه های سرور یا کلاینت که باهم یا با یک مجموعه دیگه در ارتباط باشند. 

دیزل نام یک ابزار پایتونی برای توسعه نرم افزار های تحت شبکه می باشد. با کمک این ابزار می شه برنامه های سرور یا کلاینتی نوشت که با پروتکل های TCP یا َUDP کار کنند. از ویژگی های بارز این ابزار استفاده از تکنولوژی Non-blocking I/O هست که قدرت پردازشی و توسعه بسیار زیاد در عین استفاده کم از منابع رو فراهم می کنه. با این ابزار و در حالت معمول می شه برنامه هایی نوشت که در یک سرور تا ۱۰ هزار کانکشن همزمان و باز قابل پردازش باشه. همچمین در این حالت به ازای هر اتصال یا socjet باز حدودا ۱۴ کیلوبایت حافظه رم اشغال می شه که رقم بسیار خوبی هست. 


Python Diesel


یکی از جالب ترین چیز هایی که من توی Diesel دیدم سادگی اون هست. بخش زیادی از این سادگی و روان بودن رو مدیون پایتون شاید باشه اما خود ماژول هم خوب پیاده شده و بسیاری از پیچیدگی رو داخل خودش حفظ می کنه. معمولا بهینه بودن یا performance و پردازش یا حجم اطلاعات نسبتی هم جهت با پیچیدگی کد و نرم افزار داره. اما در این ابزار تا حد زیادی این پیچیدگی از بین برده شده و برنامه نویس فقط درگیر مشکل و کد سرویس می شه نه بحث های شبکه و توسعه نرم افزار تحت شبکه.

این ابزار بصورت پیش فرض داخل خودش چندین کلاینت از پیش نوشته شده هم داره که می شه به مواردی چون کلاینت MongoDB, Redis, Riak و ... اشاره کرد. همیچنین در این ابزار از تکنولوژی ها و پروتکل هایی چون WSGI, WebSockets, ZeroMQ, HTTP/1.1 و ... هم پشتیبانی می شه.


یک مثال ساده از یک سرور با استفاده از پایتون و دیزل:


# tcp_holla_server.py
import diesel

def holla_back(addr):
    while True:
        message = diesel.until_eol()
        shouted_message = message.upper()
        diesel.send(shouted_message)
 diesel.quickstart(diesel.Service(holla_back, 4321)) 


سایت رسمی Diesel

مستندات پروژه Diesel

سورس پروژه در GitHub

۰ موافقین ۲ مخالفین ۰ ۱۴ شهریور ۹۱ ، ۱۰:۴۹
مهدی بیاضی

با توجه به سرعت توسعه اینترنت و بحث ارتباط در اکثر کاربرد های کنونی نیاز به تکنولوژی های جدید تر و بهینه تر در این زمینه احساس می شه. مشکلات و مسایل موجود در این زمینه بسیار بزرگتر و پیچیده تر شده. بر خلاف سال های دور مشکلات جدیدی مطرح شده که یک نرم افزار تحت شبکه باید از عهده این مشکلات بر بیاد.

مدیریت و پاسخگویی به هزاران و گاهی میلیون ها درخواست توسط یک نرم افزار تحت شبکه نیاز به تکنولوژی و تعاریف جدیدی دارد.

خیلی دوست دارم در مورد بحث های پردازش ها و سیستم های توسعه پذیر یا دارای scalability بالا بنویسم. مواردی که ما با اون در یک نرم افزار با قابلیت توسعه بسیار زیادی که باید بتونه به حجم بسیار زیاد از کاربران جواب بده یا با داده های بسیاری سرو کار داشته باشه با سایر نرم افزار ها بسیار فرق داره. معمولا از این تکنولوژی ها زیاد نمی شنویم. آموزش یا راهنمای خوبی هم براشون نیست و بیشتر تجربی هست. کسی هم که تجربه خوبی داشته باشه به راحتی حاضر به ارائه اون نیست متاسفانه !

وقتی میزان درخواست و پردازش یک نرم افزار یا مقدار اطلاعات ذخیره شده در سیستم یا مواردی از این دست زیاد و زیاد تر می شه ما با مشکلات جدیدتری روبرو می شیم. مشکلاتی که قبلا پیش نیامده بودند. در هر مرحله می شه با یک سری کارها سیستم رو بهبود داد تا توانایی پردازش و کار رو داشته باشه. اما با ادامه روند رشد و از یک مرحله به بعد اگر سیستم طراحی شده با در نظر گرفتن بحث های توسعه پذیری بالا یا High Scalability پیاده سازی نشده باشه دیگه با تغییرات رو سیستم موجود نمی شه بار پردازشی یا حجم اطلاعات رو تحمل کرد و سیستم به مشکل بر می خوره یا کاملا خاموش می شه. 

سعی خواهم کرد در ادامه مطالبی رو مرتبط با این شاخه شیرین و مهم و روبه رشد رو در این وبلاگ منتشر کنم. بخشی از مطالب از تجارب شخصی خودم هست و ممکنه برخی مطالب هم ترجمه یا معرفی ابزار ها و نرم افزار ها باشه.

۱ موافقین ۲ مخالفین ۰ ۱۴ شهریور ۹۱ ، ۱۰:۳۵
مهدی بیاضی

چند روز پیش (۱۰ اکتبر ۲۰۱۱) گوگل زبان جدیدی معرفی کرد با نام دارت  (Dart) !

این زبان که اهداف و ویژگی هاش شبیه به جاوا اسکریپت هست زبانی هست که در برنامه های تحت وب کاربرد داره. هدف دارت جایگزینی جاوا اسکریپ به عنوان زبان اصلی اسکریپتی در مرورگر ها نیست (حداقل فعلا و بر اساس گفته توسعه دهنده هاش). دارت امکانات مدرن تر و بهتری نسبت به جاوا اسکریپت رو فراهم می کنم و سعی خواهد کرد مشکلات موجود جاوا اسکریپت رو اصلاح کنه. همچنین از نظر کارایی و سرعت اجرا نسبت به جاوا اسکریپت وضعیت بهتری داره و برای توسعه پروژه های سنگین تر و بزرگتر مناسب هست. البته فعلا ماشین مجازی این زبان قرار هست به مرورگر کروم اضافه بشه و برای دیگر مرورگرها که از این زبان پشتیبانی نمی کنند ابزار برای تبدیل این زبان به جاوا اسکریپت ارائه خواهد شد. 



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

۱ موافقین ۳ مخالفین ۰ ۲۲ مهر ۹۰ ، ۱۷:۳۸
مهدی بیاضی

مسابقات برنامه نویسی بیان در ۲ رده آزاد و دانش آموزی برگزار شد. البته هنوز مرحله نهایی و حضوری این مسابقات برگزار نشده. استقبال و سطح مسابقات بسیار خوب بود و رقابت بسیار نزدیک. برای اولین دوره از همچین مسابقاتی در ایران به نظرم بسیار خوب و با کیفیت خوبی برگزار شد. امیدوارم دوره های بعدی بسیار بهتر و با نفرات بیشتری برگزار بشه.


۰ موافقین ۳ مخالفین ۰ ۲۲ مهر ۹۰ ، ۱۷:۲۶
مهدی بیاضی
سلام
این اولین پست وبلاگ من هست. چندین بار اقدام به ایجاد وبلاگ کردم اما هربار بنا به مشکلاتی که اکثر بخاطر مشکلات کاری و کمبود زمان بوده نشد وبلاگی داشته باشم.
این بار سعی خواهم کرد هرچند با تاخیر این وبلاگ رو بروز کنم.
۱ موافقین ۳ مخالفین ۰ ۰۷ اسفند ۸۹ ، ۱۱:۳۸
مهدی بیاضی