اینم یه تجربه پراکنده دیگه!

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

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

با این مقدمه من سعی میکنم که در مورد کارایی بنویسم تا ببینم از این پست‌ها چقدر استقبال میشه!

همین!

پ.ن. «ویر» مثل «ویرم گرفته بود» هست که به معنای میل شدید و ایناست.

اینم یه تجربه پراکنده دیگه!

من مدت‌هاست که به عنوان یکی از کارهای اصلی به زبان C برای سیستم‌های Embeded برنامه می‌نویسم. یعنی یه دستگاه محدود رو آماده میکنم که یه کار خاص رو انجام بده.

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

اگه با اسمبلی آشنا باشید هر برنامه از سه قسمت Data, Code, Stack تعریف میشه. که خود  Data Segment هم از سه بخش Heap, Data, BSS تشکیل میشه. که توضیح هرکدوم این بخش‌ها داستان متفاوتی داره. حالا توی شبه کد پایین توضیح میدم که  اینها با هم چه تفاوتی داره

int a;

void myFunc(void)
{
	int b;
	static int c;
	int *d = malloc(sizeof(int));

	...

	return;
}

توی این شبه کد متغیر global به نام a وجود داره که توی data و یا ‌BSS تعریف میشه. متغیر b چون یک متغیر محلیه توی stack تعریف میشه. متغیر c یک متغیر محلی استایتک هست و به دلیل استاتیک بودنش توی data و یا ‌BSS تعریف میشه.  پوینتر d همه به یه آدرس توی heap اشاره میکنه چون این متغیر بصورت داینامیک تعریف شده و متغیر داینامیک در heap درست میشه. تفاوت data و BSS در اینه که متغیرهایی که مقدار اولیه غیر صفر دارن توی data تعریف میشن و متغیرهایی که مقدار اولیه ندارن و یا صفرن توی BSS تعریف میشن.

حالا مشکلی که وجود داشت اینه که من متغیرهای بزرگی توی متن تابع هام داشتم که باعث میشد حجم محدود stack موجود پر بشه و نرم افزار به خطای زمان اجرا بر بخوره. که با تغییر اونها به متغیرهای static محل نگهداری اونها به BSS یا Data تغییر مکان پیدا کرد و مساله حل شد.

همین!

اینم یه شبه تجربه دیگه!

من سال‌هاست که مهمترین منبع دانلودم تورنت هست. یه پروتکل peer to peer که خیلی مطمئن و کم هزینه میشه فایل دانلود کرد. تورنت یه مفهوم به نام tracker داره که توش لیست تمام فایل‌ها و اینکه چه کسی این فایل‌ها رو داره نگداری میکنه. یکی از tracker های مورد علاقه من که اولین سورس جستجو برای تورنت بود سایت demonoid بود که یک یا دو سال قبل توسط پلیس مورد حمله قرار گرفت و سایت بسته شد. اما امروز دیدم که بعد از مدت‌ها باز شده. و این خوشحال کننده است.

همین!

اینم یه تجربه پراکنده دیگه!

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

بصورت ساده این سیستم‌های به روش‌های مختلفی نسخه‌های مختلف فایل رو نگهداری می‌کنند یا «آنچه گذشت» رو مدیریت می‌کنند. این ابزار برای برنامه نویس‌ها و تقریبا هر کسی  که یه سری فایل رو بصورت مداوم بروز رسانی می‌کنه (مثلا متن یک قرار داد، یا یک مقاله علمی و …) مهمه. وقتی کار جدی می‌شه خیلی وقت‌ها به این نیاز میشه که بدونیم:

  • تغییرات این نسخه نسبت به نسخه قبل چیه؟ یا بدونیم که قبلا چی بود و الان چی هست.
  • در صورتی که این فایل‌ها توسط بیشتر از یک نفر دارن مورد ویرایش قرار می‌گیرن همیشه این سوال وجود داره که آخرین نسخه فایل چیه؟
  • سوال بعدی که پیش میاد اینه که چه کسی مسئول اضافه کردن این بخش به فایل(به عنوان مثال قرار داد) هست که بعدا خودش تصحیحش کنه.

اما برای استفاده از این سیستم‌ها همیشه یه مقاومتی وجود داره که دلایل معمولش اینا هستن:

  • اولین و معمولا مهمترین دلیل مقاومت در مورد این سیستم‌ها اینه که افراد در قبال تغییر مقاومت میکنن و همیشه دوست دارن توی وضعیت فعلی بمونن. معمولا اجباره که باعث میشه آدم‌ها از وضعیت فعلیشون خارج بشن و یه چیز جدید یادبگیرن
  • دومین دلیل اینه که دلیل و اهمیت استفاده از این سیستم‌ها رو درک نکردن. یعنی نمیدونن که اگه از این سیستم‌ها استفاده کنن چه سودی نصیبشون میشه و درصورت عدم استفاده چه چیزی رو از دست میدن. من خودم به شخصه جز این دسته از آدمها بودم و الان بعد از مدت‌ها استفاده از این سیستم‌ها حتی سعی میکنم تاریخچه کارهای بی اهمیتم رو هم داشته باشم
  • سومین دلیل که به دلیل اول هم مربوط میشه اینه که «ترک عادت موجب مرض است» یعنی آدمها باید روندی رو که خیلی روزمره است و خیلی بهش عادت دارن عوض کنن.

اگه بخوام اسمی از این ابزارها بیارم لیستشون خیلی زیاده و دعوا هم سر اینکه کدوم بهتره زیادن. مثلا دوستانی که با ابزارهای مایکروسافت کار میکنن TFS رو با دنیا عوض نمی‌کنن. دوستانی که در محیط لینوکس برنامه نویسی میکنن و یکم هم قدیمی هستن از SVN تا خون در رگ دارن دفاع میکنن. و اونایی که «اوپن سور باز» هستن هم GIT رو میپرستن. اما دقت داشته باشید که از دید من مهم‌ترین قسمت اینه که یکی از این سیستم‌ها در محیط شما مورد استفاده قرار بگیره و اینکه اون ابزاری رو انتخاب کنید که اکثریت آدم‌ها نسبت بهش نظر خاصی ندارن و یا با اون سیستم به اصطلاح «راحتن».

اما لیست برنامه‌های کنترل نسخه اینا هستن:

  • Team Foundation Server: این برنامه توسط مایکروسافت تولید میشه که یک مجموعه کامل مدیریت پروژه نرم‌افزاریه که شامل برنامه کنترل نسخه هم هست. این نرم افزار جزء نرم‌افزارهای مدیریت نسخه متمرکزه.
  • GIT: این سیستم که توسط لینوس توروالدز نویسنده هسته لینوکس برای مدیریت کدهای هسته لینوکس مورد استفاده قرار گرفته. این سیستم جز سیستم‌های مدیریت نسخه غیر متمرکزه
  • CVS: تقریبا قدیمی ترین برنامه کنترل نسخه متمرکزیه که من میشناسم
  • SVN: یک سیستم مدیریت نسخه متمرکز است که طراحی شده تا با CVS همخوانی داشته باشه و اشکالات این سیستم رو رفع کنه
  • HG: هم تقریبا همزمان با GIT توسعه پیدا کرده و هدفش این بوده که سیستم مدیریت نسخه غیر متمرکز باشه.
  • Bazaar: سیستم کنترل نسخه غیر متمرکزه که توسط شرکت canonical پشتیبانی میشه

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

همین

اینم یه خالک زنک بازی پراکنده دیگه!

این متنا تجربه نیست، عملا خاله زنک بازیه. من این مورد ترجمه بد «دکتر محمود حسابی» رو میخوندم که گفتم برم یه سری هم به سایت دانشگاه تهران بزنم ببینم چه خبره. دیدم ای دل غافل که یه سوتی بزرگتر هم وجود داره و اون اینه که این دوستان از liferay به عنوان cms استفاده کردن. توی این اتفاقات اخیر اومدن که ابروش رو درست کنن چشمش هم کور کردن. یعنی امکان ادیت ویجت‌های صفحه اصلی وجود داره و خب به نظر من این خیلی جالب نیست. البته لازم به ذکره که بگم که از من پسورد خواست اما همینش هم زیاده!

همین!

این یه تجربه پراکنده دیگه

امروز یه پست خیلی کوچیک و تو دل برو دارم. یعنی زیاد  توضیح نمیدم و تنها یه شمای کلی از راه حل میدم.

برای توزیع بار چند قدم ساده داره. یه مفهوم وجود داره به نام gateway که هر اتصال اینترنت یکی داره. در اولین قدم اینه که چندتا gateway رو با هم گروه‌بندی میکنید تا بتونید با استفاده از این گروه‌ها توزیع بار رو انجام بدید. در گروه یک اولویت به هر gateway اختصاص داده میشه و یه معیار برای اینکه کی بین اولویت‌های مختلف انتخاب انجام بشه. برای انجام این کار باید به منوی system -> routing رفت و توی tab به نام Group این گروه رو ساخت.

مرحله دوم هم خیلی ساده است. بایستی در قسمت قوانین دیواره آتش، قانون عمومی که برای اتصال LAN به اینترنت وجود داره رو ویرایش کرد و گفت که ترافیکی که توی این قانون صدق میکنه بجای اینکه به gateway پیش فرض فرستاده بشه به این گروه فرستاد بشه تا عملیات تقسیم بار به خوبی انجام بشه. و کار تا این لحظه تمومه.

مرحله سوم که اختیاری هم هست اینه که بایستی DNS هایی برای کل سیستم تعریف بشه که از هر کدوم از اون gateway ها قابل دسترس باشه. در حالت معمول نیاز به این تنظیم نیست اما اطمینان پذیری سرویس‌ها با این تنظیم افزایش پیدا می‌کنه.

 

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

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

خب راه حل‌های گوناگونی برای اینکار وجود داره. یکی از راه استفاده از سخت افزارهایی هست که برای این کار ساخته شده. mikrotik یا مسیریاب‌های اختصاصی شرکتهای دیگه که قابلیت loadbalancing رو دارند و معمولا با سام تجاری loadbalancing router شناخته میشن این قابلیت رو داره.

نرم افزارهای تجاری هم وجود دارند که این امکان رو برای شما ایجاد میکنه. اما از اونجایی که به قول دوستان ما روی راه حل‌های متن باز غیرت خاصی داریم اینجا هم میخوام چند تا محصول معرفی کنم که این کار باهاشون امکان پذیره.

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

خب راه حل هایی که من باهاشون مستقیما کار کردم zeroshell و pfSense هست که یکیشون یه لینوکسه یک دیگش هم یه freeBSD  هست. اما دیدم دوستان با استفاده از kerio و محصولات cisco اینکار رو انجام دادن. هردوی zeroshell و pfSense امکاناتی دارند که به راحتی کانفیگ میشن و این کار انجام میشه.

این مقدمه برای این پست کافیه تا تو یه پست کامل توضیح میدم که اینکار pfSense چطور انجام میشه.

اینم یه تجربه پراکنده دیگه.

ایندفعه قراره از یکی از کارهایی که توی خونه برای اثبات خودم به خودم انجام داده بگم. این تجربه تو زمینه شبکه و این حرفاست. من در یکی از جاهایی که کار میکردم با یه سیستم مسیریاب/دیواره آتش متن باز به نام pfSense کار کردم که بسیار به علم شبکه و نرم افزار من اضافه کرد. این یک سیستم عامل freeBSD خاص منظوره برای کارهای شبکه است. یعنی دوستانی در دنیا پیدا شدن که freeBSD رو با برخی ویژگی‌های openBSD که اولی به بهینه بودن معروفه و دومی به امنیت مریض گونه اش ترکیب کردند و یه سیستم عامل سبک برای مدیریت شبکه راه انداختن. البته سیستم های متن باز مشابه این سیستم وجود داره که لیستش اینجاست.

این پروژه از دل یه پروژه دیگه به نام m0n0wall در اومده و با تغییر هدف گزاریش سعی کرده راه متفاوتی از پروژه اصلی بره. هدف پروژه اصلی کار این سیستم عامل رو دستگاه‌های embedded بوده که خب بخاطر محدودیت سخت افزار بسیاری از ویژگی‌ها روی m0n0wall امکان پذیر نیست اما pfSense هدفش رو روی کاربردها گذاشته به همین خاطر با دستگاه‌های embedded زیادی تطبیق نداره. فکر کنم همین مختصر کافی باشه برای رفتن سراغ اصل مطلب. اگه عمری بود شاید بصورت دقیق این سیستم ها رو معرفی کردم.

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

اما بگم چرا رفتم سراغ این سیستم. اول اینکه دوست داشتم! دوم اینکه چند مشکل بود که باید حل میشد. یکی از مشکلاتی که من برخود میکردم اینه که وقتی تورنت در حال اجرا بود مودم دیگه به مابقی درخواست‌ها جواب نمیداد چون بخاطر پردازنده محدودش حداکثر یه تعداد محدودی کانکشن باز میتونست داشته باشه چون وقتی از  NAT استفاده میشه بایستی مودم یا روتر وضعیت کانکشن ها رو نگه داره که وقتی دستگاه محدود باشه این تعداد محدود میشد. دومین مشکل کیفیت بد DNS توی کل خونه بود. چون بعضی وقتا یه درخواست DNS روی سرورهای آی اس پی نبود و باید میرفتم سراغ DNSهای معروف مثل ۴٫۲٫۲٫۴ یا ۸٫۸٫۸٫۸ که خب ایراداتی داشت و یکی از مهمتریناش زمان به نسبت زیاد جواب به این DNS هاست.

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

  1. بهینه سازی سیستم فایل سرور موجود: من برای فایل سرورم توی خونه از یه کامپیوتر قدیمی با یه گیگ رم و یه سی پی یوی سمپرون تک هسته ای سه هزار استفاده میکنم. که بنا به صلاح دیدم که بشه از اون کامپیوتر استفاده دیگه ای هم کرد روش یه ubuntu desktop 12.04 نصب کردم و samba سرور رو هم راه اندازی کردم. اما بخاطر استفاده از unity حجم زیادی از رمم مورد استفاده بود. بعد از جستجوهای بسیار یه desktop manager خوب پیدا کردم به نام enlightenment که رم استفاده شده توی سیستم رو از حدود ۷۰۰ مگ به ۱۲۰ مگ کاهش داد که این خودش بسیار کار بزرگی بود.
  2. نصب و راه اندازی virtual box: بعد روی این سرور با دردسر زیاد virtual box رو نصب کردم و یه ماشین مجازی که خود pfSense آماده کرده رو نصب کردم و دو سمت شبکه رو با استفاده subnet mask از هم جدا کردم.
  3. پیکربندی pfSense: حالا نوبت به پیکربندی pfSense میرسه که برای اینکار یه کانکشن pppoe ساختم توی سمت اینترنت و توی سمت شبکه داخلی یه DHCP سرور تنظیم کردم. برای رفع مشکل DNS از DNS masqe استفاده کردم و گفتم که در وهله اول از DNSهای آی اس پی استفاده کنه و در اولویت بعد بره سراغ سرورهای معروف. یه ویژگی دیگه هم اینه که این سیستم به مدت محدود رکوردهای DNS رو Cache میکنه و سرعت DNS بالا میره. برای دانلود تورنت هم یه Inbound NAT استفاده کردم و گفتم یه سری پورت برای تورنت به دانلودر تورنتم وصل بشه. مشکل تعداد کانکشن هم بخاطر قدرت بیشتر این سیستم و رم بالاترش بصورت خودکار رفع شده بود.
  4. تنظیم نهایی Virtual Box: در نهایت باید Virtual Box رو بگونه ای تنظیم کرد که در ابتدا شروع سیستم ماشین مجازی روتر رو روشن کنه و در خاموش شدن سیستم این ماشین مجاز رو خاموش کنه. خود Virtual Box این کار رو انجام میده و فقط نیاز به یه سری تنظیمات داره که اگه عمری بود در موردشون بعدا یه پست کامل مینوسم.

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