۱۳۸۷ دی ۳۰, دوشنبه

vimrc. من

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



۱. غیرفعال کردن سازگاری با vi (اگر می‌خواستم از vi استفاده کنم، که Vim رو اجرا نمی‌‌کردم ;)

نکته: ۴ (۲ تا ۵) نکته زیر کاملا به Coding Styles شما و پروژه‌ایی که در اون مشارکت می‌کنید وابسته هست، مثلا من ترجیح میدم که به‌جای Tab، از Space استفاده کنم، اینجوری کد من که مثلا برای طول هر خط ۷۸ کاراکتر نوشته شده، روی دستگاه من که هر Tab معادل ۴ تا Space هست همونجوری نشون داده میشه که روی یه Vim که هر Tab معادل ۸تا کاراکتر هست. اما بعضی از پروژه‌ها (مثل کرنل لینوکس) استفاده از Tab رو ترجیح میدن، پس قبل از فرستادن Patch به Upstream حتما Coding Styles اون پروژه رو مطالعه کنید.

۲. با استفاده از expandtab، هر Tab رو با استفاده از تعدادی Space جایگزین میکنید، مثلا با یکبار زدن Tab به جای اینکه یه tab در مد insert اضافه بشه، چندین Space اضافه میشه. (در حالت پیش‌فرض این خصوصیت غیرفعال هست، با توجه به نکته نوشته شده در بالا، انتخاب کنید که آیا این تنظیم را نیاز دارید یا نه)

۳. تعداد Space هایی که برای هر مرحله از indent استفاده میشه.

۴. تعداد Space هایی که در هنگامی که در مد insert قرار دارید، به ازای هربار فشردن Tab، یا Backspace اضافه یا کم میشه.

۵. هرچند Space یک Tab محسوب بشه.

۶. اینکه Backspace در مد insert چجوری کار کنه، حالتی که من استفاده میکنم کاملترین حالته، اینکه هم در انتها و ابتدای خط (eol و start) و هم در حالت indent کار میکنه.

۷. تعداد رنگهای مورد استفاده در Vim (کاملا بسته به نوع شبیه‌ساز ترمینال و colorscheme مورد استفاده است).

۸. نمایش شماره خطوط

۹. وضعیت indent خط فعلی به خط بعد نیز کپی می‌شود (یعنی خط بعد متاثر از وضعیت خط قبل از خود باشد)

۱۰. در هنگامی که به زبانهای برنامه‌نویسی شبه C کد می‌نویسید، به صورت هوشمندانه خطوط را مرتب می‌کند (مثلا یک مرحله indent بیشتر بعد از })

۱۱. همزمان با کامل شدن مورد جستجو، جستجو رو انجام میده، در حالت پیش‌فرض پس از کامل شدن متن مورد جستجو و وارد کردن آن موارد پیدا شده نمایشن داده می‌‌شوند.

۱۲. من دوست ندارم موارد پیدا شده بر اساس جستجوی انجام شده های‌لایت بشه (کاملا سلیقه‌ایی)

۱۳. نمایش سطر و ستون محل فعلی کرسر.

۱۴. پنهان کردن (نه کشتن!) Bufferایی که بسته میشه.

۱۵ و ۱۶. من نه دوست دارم در مواقع خطا صدای بوق بشنوم، نه اینکه صفحه نمایش flash کنه.

۱۷. نحوه folding، که من استفاده از markerهای خود Vim برای folding رو ترجیح میدم.

۱۸. وقتی که با Vim کار می‌کنید، خیلی از متون وارد register میشن، فایلهای مورد استفاده در bufferها لیست میشن، یه‌سری خطوط مارک میشن و ... که همگی مفیدن، اما متاسفانه همه این موارد پس از بسته شدن Vim از دست میرن، اگر که دوست دارید این موارد هنگامی که مجددا Vim رو باز می‌کنید همچنان در دسترس باشند، باید از امکانات viminfo. استفاده کنید. این خط به vim میگه که ۱۰ فایل ویرایش شده آخر را به همراه مارکهای آنها نگه دارد، ۱۰۰خط آخر را در register نگه دارد، ۲۰ دستور آخر را که در مد دستور وارد شده‌اند حفظ کند، اگر که در هنگام فراخوانی Vim فایل خاصی مشخص نشده باشد، کل بافر قبلی را بارگذاری کند و در نهایت نام فایلی که تمامی این اطلاعات باید در آن ذخیره شوند و در هنگام فراخوانی مجدد Vim اطلاعات این فایل بازیابی شوند.

۱۹ و ۲۰. تکمیل فرامین در مد فرمان (با استفاده از Tab) و درصورتی که چندین مورد یافت شد، همگی نمایش داده شوند و تا هنگام تکمیل طولانی‌ترین گزینه فعال باشد.

۲۱ و ۲۲. کوچک یا بزرگ بودن حروف در هنگام جستجو نادیده گرفته می‌شوند مگر اینکه عبارت جستجو حاوی یک کاراکتر با حروف بزرگ باشد.

۲۳. Vim میتونه عنوان پنجره terminal باز شده رو بازنویسی کنه.

۲۴. غیرفعال کردن خیلی از promptهایی که شما مجبورید برای رهایی از دستشون Enter رو فشار بدید، مثلا پیغامی که در هربار اجرای Vim نمایش داده میشه (توجه: اون a خیلی چیزا رو غیرفعال می‌کنه!).

۲۶ تا ۲۹. استفاده از امکانات بسیار مفید Vim در هنگام ویرایش فایلهایی که افزونه‌های مرتبط به آنها نصب شده باشد، مثلا رنگ کردن کد، auto-completion و ....

۱۳۸۷ دی ۱۲, پنجشنبه

مهاجرت به Ext4

همونطور که احتمالا میدونید لینوس به عنوان هدیه کریسمس، کرنل ۲.۶.۲۸ رو منتشر کرد. در بین امکانات جدید اضافه شده، پایدار شدن فایل سیستم سازگار با قبل و جانشین Ext3، یعنی Ext4 برای ما کاربران معمولی شاید مهمترین اتفاق باشه.

از مهمترین خصوصیات Ext4 میشه به فایل‌سیستم/فایلهای بزرگتر، تخصیص متاخر (delayed allocation)، تطبیق سریعتر فایل‌سیستم (faster fsck)، قابلیت تخصیص چند بلوکی (multiblock allocation) و ... اشاره کرد.

روزی (در واقع شبی) که من لپ‌تاپم رو خریدم و اومدم خونه که جنتو روش نصب کنم، دو تا اشتباه بزرگ (باور کنید به‌خاطر خواب‌آلودگی بود!) کردم:
  • home رو جدا نکردم
  • درایوها رو Ext3 فرمت کردم (XFS رو ترجیح میدادم)
بعد از انتشار کرنل جدید، تصمیم گرفتم که هر دوی این اشتباهات رو جبران کنم (fsck های طولانی روی لپ‌تاپ واقعا اعصاب خورد کنه)، اگر که شما هم این اشتباهات رو انجام دادید و می‌خواهید که جبران کنید، شاید بد نباشه که بدونید من چجوری این کار رو انجام دادم:
اول از همه شما مطمئنا باید کرنل خودتون رو به ۲.۶.۲۸ ارتقا بدید (هر چند که پشتیبانی از Ext4 در کرنل‌های قدیمی‌تر هم وجود دارد، اما Ext4 در ۲.۶.۲۸ پایدار شد).

علاوه بر اینکه باید Ext4 رو در کرنل جدید فعال کنید، باید CONFIG_LSF رو هم فعال کنید، هر چند که در حالت عادی روی هارددرایو یک لپ‌‌تاپ به چنین چیزی احتیاج ندارید، اما چون پشتیبانی از فایلهای بزرگ یک خصیصه مهم در Ext4 هست، فعال نبودنش باعث میشه که نتونید درایو رو mount کنید.

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

شما به یک نسخه جدید (مثلا ۱.۴۱.۳) از e2fsprogs برای فرمت کردن به Ext4 احتیاج دارید.

mkfs.ext4 /dev/XXX

(XXX رو با اسم درایو جدیدی که ساختید عوض کنید)

یک شاخه جدید بسازید و درایو جدید رو اونجا mount کنید:

mkdir /mnt/new-home
mount -t ext4 /dev/XXX /mnt/new-home

حالا وقتشه که بریم در حالت تک‌کاربر و محتویات home قبلی رو منتقل کنیم به درایو جدید:

init 1
cd /home
cp -ax * /mnt/new-home
cd /
mv /home /home.old
mount /dev/XXX /home

حالا با زدن Ctrl-D از حالت تک‌کاربر خارج بشید و ... تموم شد!

برای اینکه بعد از هر ریبوت مجبور نباشید home رو mount کنید، این خط رو به فایل fstab اضافه کنید:

/dev/XXX /home ext4 defaults 0 2

اگر همه چیز مرتب بود، می‌تونید با خیال راحت home.old/ رو پاک کنید.

اگر از نتیجه راضی هستید، میتونید / رو هم به Ext4 تبدیل کنید، اما یادتون نره که چنین کاری رو با boot/ نکنید، چون هیچ نسخه منتشرشده‌ایی از GRUB وجود نداره که از Ext4 پشتیبانی کنه‌ (هرچند که اگر هم که وجود داشت، دلیلی برای اینکار وجود نداره، چون هیچ چیز عایدتون نخواهد شد!)

۱۳۸۷ آبان ۹, پنجشنبه

وضعیت باطری

تقریبا ۲ ماهی میشه که یه لپ‌تاپ جدید خریدم، اولین کاری که انجام دادم نصب جنتو بود و بعدش هم نصب یک Tiling window manager، بین گزینه‌های موجود من awesome رو انتخاب کردم.
اون موقع هنوز awesome 3 منتشر نشده بود و من با بتاهاش کار می‌کردم. یکی از چیزهایی که من خیلی در مورد awesome 3 دوست دارم اینه که کلا فایلهای پیکربندیش رو با Lua باید نوشت، و همچنین یک API خیلی خوب و قدرتمند هم براتون فراهمه تا هرکاری که فکرشو بکنید بتونید با awesome انجام بدید.
چندین library دیگه هم همراه با awesome میان که کار با awesome رو خیلی راحت‌تر می‌کنن، یکی از اونا wicked هست، معمولا از wicked برای ساختن widget ها استفاده میشه و خودش هم یک سری widget برای نشون دادن وضعیت CPU, RAM و شبکه در اختیار میذاره، اما یه‌چیزه لازم برای هر لپ‌تاپ که توی wicked نبود widget ایی از نوع باطری بود. اما خوب با استفاده از wicked خیلی راحت میشه خروجی یه برنامه دیگه رو توی widget ها نشون داد و با استفاده از Pango markups به شکل دلخواه درش آورد ... و چی راحت‌تر از نوشتن یه bash script؟ :-)
این یه bash script خیلی سادست برای اینکه وضعیت باطری رو برگردونه، وقتی که AC Adaptor وصله یه‌دونه + به اول درصد باقیمانده از ظرفیت کل اضافه می‌شه، و اگر که وصل نباشه، یه - اضافه میشه، و من خیلی ساده در قسمتی که با Lua می‌نویسم، بهش میگم اگر مثبت بود،‌ وضعیت سبز، اگر منفی بود وضعیت زرد و اگر که زیر ۱۰ درصد بود، وضعیت قرمزه!


۱۳۸۷ شهریور ۳, یکشنبه

TraceMonkey، یک اتفاق میمون

اخیرا بنیاد موزیلا خبر از پیشرفتی قابل توجه در نسخه بعدی مرورگر فایرفاکس (نسخه ۳.۱) داده.
این امکان جدید در حقیقت پیشرفتی برای Gecko (موتور طرح‌بندی توسعه یافته توسط موزیلا) محسوب می‌شود، و اگر بخواهیم دقیقتر صحبت کنیم، پیشرفتی برای SpiderMonkey (موتور جاوا‌اسکریپت به کار گرفته شده در Gecko). بنیاد موزیلا دو پیاده سازی مختلف از JavaScript دارد، یکی SpiderMonkey هست که با زبان برنامه نویسی C نوشته شده و در Gecko مورد استفاده قرار گرفته، و دیگری Rhino می‌باشد که با Java نوشته شده است.
موزیلا نام این تحول جدید SpiderMonkey را TraceMonkey گذاشته. در واقع TraceMonkey یک JIT Compiler برای SpiderMonkey هست که باعث افزایش سرعت اجرای جاوااسکریپت می‌شود، و این بدین معنی می‌باشد که کارهایی که به شدت از منابع سیستمی استفاده می‌کردند و برای اجرا نیاز به Plugin های اختصاصی داشتند، از این به بعد می‌توانند به قدرت و سرعت اجرای JavaScript اتکا کنند.

در واقع TraceMonkey اولین اقدام برای افزایش کارایی یک موتور JavaScript محسوب نمی‌شود. کمی پیشتر Apple خبر از موتور JavaScript جدید به کار رفته در WebKit (موتور طرح بندی استفاده شده در Safari) با نام SquirrelFish داد (SquirrelFish در واقع یک مفسر bytecode محسوب می‌شود تا یک JIT Compiler)، و یا Tamarin که موتور JavaScript استفاده شده در نسخه ۹ فلش می‌باشد.

کاری که یک JIT Compiler انجام می‌دهد‌ در واقع تبدیل کردن «کد زمان اجرا» است پیش از آنکه آنرا به صورت native اجرا کند. مثلا تبدیل bytecode به کد native ماشین. تفاوت TraceMonkey با SquirrelFish در واقع در همین مرحله است، SquirrelFish (هنوز) bytecode ماشین مجازی خود رو به کد native تبدیل نمی‌کند، در حالی که این اتفاق در مورد TraceMonkey رخ می‌دهد، و همین باعث افزایش کارایی TraceMonkey در مقابل SquirrelFish هست.

همچنین، قبل از اینکه Mike نتایج کار Brendan و Andreas رو وارد repositry اصلی Mozilla کنه، Gecko شاهد تغییرات جدیدی برای افزایش اجرای جاوااسکریپت بوده، مواردی مثل اضافه کردن Cache برای صفات چندریختی که باعث پیدا کردن سریعتر خصوصیات می‌شود و دیگر نیازی نیست کل اشیا یک زنجیره از prototype تا آخر برای پیدا کردن یک صفت بررسی شوند.

۱۳۸۷ شهریور ۲, شنبه

Cloud Computing و متن‌باز

با گسترش مفاهیمی چون نرم‌افزار به عنوان سرویس یا Software as a Service یا SaaS مفهوم جدیدی مثل Cloud Computing بیشتر و بیشتر رایج می‌شود.
به طور کل Cloud Computing یعنی محاسباتی که با استفاده از کامپیوتر انجام می‌شود (Computing) بر پایه اینترنت (Cloud). به بیان ساده‌تر Cloud Computing یعنی در اختیار قراردادن قدرت محاسبات رایانه‌ایی در هرجایی که دسترسی به اینترنت وجود دارد.
شرکتهای ارائه دهنده خدمات Cloud Computing معمولا شما را بر اساس میزان استفاده‌ایی که از منابع سیستمی کرده‌اید شارژ خواهند کرد، چیزی مثل یک قبض برق. بدین‌ترتیب تقریبا تمامی نگرانیهای Scale up و حتی Scale Down هم رفع می‌شوند، دیگر نیازی نیست که برای در دسترس بودن برنامه تحت‌وب خود در اوقات اوج ترافیک، سخت افزارهایی را خریداری کنید که درمواقع ترافیک پائین بیکار باشند، و یا چون بودجه کافی ندارید، با نذر و دعا برنامه خود را در ساعات اوج ترافیک سرپا نگه دارید.
شرکتهای بزرگی مثل Google و Amazon خیلی پیشتر از آنکه این نیاز واقعا توسط شرکتهای کوچکتر احساس شود معماری خود را بر چنین پایه و اساسی بنا نهادند. وحالا که این نیاز واقعا توسط شرکتهای کوچکتر و بازهم کوچکتر احساس می‌شود، امکان دسترسی عموم را به چنین سرویسهایی فراهم آورده‌اند. هرچند که تکنولوژیهای متن‌بازی نیز وجود دارد که به شرکتهای متوسط این اجازه را می‌دهد که برپایه سخت‌افزارهای موجود خود، در دسترس بودن Computing را جهت رفع نیازهای خود بهبود بخشند.
با توجه به آنچه که گفته شد، ۳ روش متفاوت برای بهره‌مند شدن از امکانات Cloud Computing وجود دارد:
  • استفاده و مدیریت کامل محیط Computing که به صورت مجازی (در Cloud) در اختیار شما قرار داده شده
  • توسعه و ارائه برنامه‌ها بر روی محیطی که هیچ‌گونه کنترلی روی آن ندارید
  • ساخت یک Cloud از پایه
روش نخست بنا به دلایل متعدد بهترین گزینه می‌باشد، نیازی به تهیه سخت‌افزارهای گرانقیمت، امکانات پیشرفته نگه‌داری و مراقبت، دغدغه‌های پهنای باند و ...، هیچکدام وجود ندارند. و در عین حال به شما این اجازه داده می‌شود که محیط را همانگونه که می‌خواهید و با توجه به نیازها و بودجه خود بسازید. معروفترین شرکت ارائه کننده چنین راهکارهایی Amazon با سرویس EC2 هست.

روش دوم مناسب شرکتها و افرادی می‌باشد که نمی‌خواهند حتی دغدغه مدیریت منابع تخصیص داده شده را داشته باشند، ترجیح می‌دهند همه چیز برای اجرا شدن هرچه سریعتر و بهتر برنامه‌های آنها فراهم باشد. بدیهی است که در چنین شرایطی خود شرکت ارائه کننده خدمات اقدام به محدود کردن منابع می‌کند. معروفترین چنین راهکارهایی Google App Engine می‌باشد. در سرویس Google حتی یک چارچوب برنامه‌نویسی مشخص وجود دارد که شما ملزم با پیروی از آن هستید، در چنین شرایطی شما حتی نباید نگران مسائل امنیتی باشید. بهای پرداخت شده به ازای تمامی این امکانات محدود شدن شما می‌باشد.

و در نهایت روش آخر که پیچیده‌ترین و هزینه‌برترین گزینه می‌باشد. در این شیوه بعد از فراهم کردن تمامی امکانات سخت‌افزاری مورد نیاز،‌شما نیاز به یک نرم‌افزار مدیریت کننده دارید. نرم‌افزارهای متن‌باز متعددی جوابگوی این نیاز هستند که بهترین آنها در حال حاضر Hadoop به نظر می‌رسد. Eucalyptus و 10gen گزینه‌های مطرح بعدی هستند.

۱۳۸۷ تیر ۲۱, جمعه

واقعیتهای ccache

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

قبل از هرچیز فکر می‌کنم توضیح نحوه عملکرد ccache ما را در درک بهتر شرایط یاری خواهد داد.
ccache در واقع یک MD5 hash از محتوی قبل از پردازش فایل درست می‌کند، سپس cache tree را بررسی می‌کند، و اگر مورد مشابهی پیدا نکرد آن فایل را کامپایل می‌کند و محتوی آنرا دوبار (یک‌بار موقع build کردن و یک‌بار هم در فایل cache) می‌نویسد.
آز آنچه که تا اینجا درباره نحوه عملکرد ccache گفته شد، اینچنین برمی‌آید که چنانچه شما همواره فایلهای غیریکسان را کامپایل می‌کنید، ccache نه تنها به شما کمکی نمی‌کند بلکه در واقع بار اضافی برروی سیستم می‌گذارد.

پس فایده ccache چیست؟ اگر که شما یک source را بیش از یکبار کامپایل کنید، مدت زمانی را که ccache احتیاج دارد تا MD5 hash را ساخته و cache tree را برای یافتن موردی مشابه پیدا کند کمتر از زمان یک build می‌باشد.

پس ccache عموما نه در زمانی که CFLAGS را عوض کنید، نه در زمانی که USE flags را عوض کنید و نه در زمانی که نسخه جدیدتری از source را کامپایل می‌کنید کمک چندانی نخواهد کرد.

ccache معجزه نمی‌کند!

۱۳۸۷ تیر ۱۱, سه‌شنبه

Comet

Comet درباره اتصالات HTTP با عمر طولانی نیست، بلکه درباره اتصالات HTTP ایی است که برای طولانی مدت نگه‌داشته می‌شوند.