یاوه‌گویی

ه‍.ش. ۱۳۸۸ آبان ۱۶, شنبه

چگونه یک برنامه را ساکسیفای کنیم؟

با توجه به مشکلات متعددی که ما در دسترسی به منابع مختلف در اینترنت داریم این فرض که همگی با SOCKS پراکسی موجود در کلاینت OpenSSH آشنا باشیم چندان دور از ذهن نیست. خیلی ساده می‌توان با استفاده از کلاینت OpenSSH یک سرور SOCKS راه اندازی کرد:

ssh -D 9999 user@remotehost

نسخه های اخیر OpenSSH همگی از SOCKSv5 هم پشتیبانی می کنند، پس شما محدود به فقط TCP (مشکل v4) نیستید، چون v5 از UDP نیز پشتیبانی می کند.
اگر تمامی منابعی که دسترسی شما به هردلیلی به آنها مسدود شده محدود به منابع موجود در وب می باشد، خوب همین حالا هم مشکل شما برطرف شده، چون اکثر مرورگرهای وب جدید از SOCKS Proxy به خوبی پشتیبانی می کنند.

اما اگر مثلا قصد Check out کردن یک Subversion repository موجود برروی Google Code را داشته باشید چکار می کنید؟

به برنامه هایی که از SOCKS Proxy پشتیبانی نمی کنند باید به زور این امکان را اضافه کرد!

هنگامی که شما برنامه ایی را اجرا می کنید بخشی از سیستم عامل شما به نام «پیوندده پویا» تمامی Shared Libraries مورد نیاز برای اجرای آن برنامه را بارگیری کرده و آنها را پیوند می دهد. متداول ترین Shared library مورد استفاده در لینوکس ld-linux.so هست. با استفاده از دستور زیر مشاهده می کنید که svn نیز از آن استفاده می کند:

ldd `which svn`

یکی از خصوصیات این Shared library این هست که می تواند با توجه به یک سری متغیرهای محیطی عملکرد خود را تغییر دهد، یکی از این متغیرهای محیطی LD_PRELOAD هست. LD_PRELOAD به بارگیر دستور میدهد که کتابخانه هایی دیگر علاوه بر آنها که هنگام کامپایل برنامه مشخص شده اند را نیز بارگیری کند.

پس ساده ترین راه برای اینکه برنامه ها را مجبور به استفاده از SOCKS Proxy کنید، این است که یک کتابخانه خاص را از طریق LD_PRELOAD بارگیری کرده و به آن کتابخانه اجازه دهید تمامی سیستم کالهای مربوط به شبکه را مدیریت کند.

در اینجا دو کتابخانه متداول و نحوه پیکربندی آنها را بررسی می کنیم:

نحوه‌ی پیکربندی:
/etc/socks/tsocks.conf:
server = 127.0.0.1
server_port = 9999

حالا تنها کافیست که در ابتدای فرمانی که قصد اجرای آن را دارید یک tsocks اضافه کنید، همین! مثلا:

tsocks wget http://www.example.com/foo/bar.tgz

یکی از مهمترین مشکلات tsocks اینه که آخرین به روزرسانیش مربوط میشه به ۷ سال قبل. در آخرین نسخه tsocks امکان استفاده از DNS های Tor هم وجود دارد، پیشنهاد من این است که این امکان را غیرفعال کنید.

نحوه‌ی پیکربندی:
~/.proxychains/proxychains.conf:
[ProxyList]
socks5 127.0.0.1 9999

حالا تنها کافیست که در ابتدای فرمانی که قصد اجرای آن را دارید یک proxychains اضافه کنید، همین! مثلا:

proxychains svn checkout http://closure-library.googlecode.com/svn/trunk/ closure-library

من به شخصه proxychains را به tsocks ترجیح میدهم.

فقط یک نکته دیگر:
با توجه به توضیحاتی که در مورد متغیرهای محیطی و اثر آنها بر ld-linux.so در ابتدا داده شد، حدس این موضوع که اضافه کردن tsocks یا proxychains به ابتدای فرامین تنها LD_PRELOAD را برابر مقداری مناسب قرار می دهند چندان سخت نیست. پس اگر می خواهید تمامی فرامین بدون اضافه کردن tsocks یا proxychains از سرور SOCKS شما استفاده کنند، تنها کافیست در ابتدای نشست مقادیر مناسب را به LD_PRELOAD بدهید، مثلا:

export LD_PRELOAD=/usr/lib/libproxychains.so

از حالا تا پایان نشست نیازی به اضافه کردن proxychains به ابتدای فرامین ندارید.

توجه داشته باشید هم tsocks و هم proxychains امکانات مدیریتی بسیار زیادی را ازطریق فایل پیکربندی در اختیار شما قرار می دهند، اینکه مثلا تنها ارتباطات به مکانهایی مشخص از سرور SOCKS استفاده کنند و ... فایل پیکربندی نمونه همراه با این بسته ها را مشاهده کنید.

ه‍.ش. ۱۳۸۸ خرداد ۱۰, یکشنبه

اولین Widget من برای Android

می‌دونم، می‌دونم، باور کنید که خودم می‌دونم. ما ایرانیها هروقت که یک پلتفرم جدید برای برنامه‌نوشتن یا ویجت‌نوشتن پیدا می‌کنیم، اولین کاری که می‌کنیم نوشتن یک برنامه تقویم جلالی (هجری شمسی) هست. باور کنید منم به اندازه شما از این واقعیت ناراحتم و حتی بدم میاد، اما خوب چه‌کار میشه کرد؟ بعد از نوشتن "!Hello, World" ساده‌ترین کاریه که میشه کرد (و از حق هم که نگذریم یکم به درد بخوره). به‌هرحال من اولین Widget رو برای Android نوشتم، هرچند که از خیلی قبل از این روی یه پروژه دیگه کار می‌کردم، اما خوب اون هنوز آماده نشده.

این ویجت خیلی سادست، فقط تاریخ امروز رو نشون میده، همین! و ذکر این نکته که این ویجت فقط برای اندروید ۱.۵ هست هم ضروری به نظر میرسه.

هرچند که این پروژه خیلی ساده‌ایی بود، اما خوب یکم هم بحث فنی در موردش شاید بد نباشه.

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

در چارچوب AppWidget اندروید شما می‌توانید خیلی ساده یک وقفه مشخص کنید و پس از آن اندروید به‌طور مرتب در آن بازه‌های زمانی ویجت را به‌روز می‌کند، برای ویجتی مثل این خیلی ساده یک برنامه‌نویس بی‌وجدان! می‌تونست بازه‌های زمانی ۱ثانیه را مشخص کند و اصلا دغدغه اینکه ممکنه کاربر روز/ساعت/منطقه‌زمانی رو تغییر بده و یا حتی اینکه کی ساعت ۰۰:۰۰ میشه و روز بعد فرا‌ می‌رسد را نداشته باشد. اما خوب با توجه به میزان اندک وجدانی که من دارم این برنامه یکم بهتر کار می‌کنه. این ویجت یک BroadcastReceiver داره که به تغییراتی که ممکنه کاربر در تنظیمات دستگاهش بده گوش می‌کنه و در مواقع نیاز تمام ویجتهای نصب شده را به‌روز می‌کند. همچنین یک AlarmManager هم برای این ویجت پیش‌بینی شده که در صورتی که تاریخ خود دستگاه عوض شد (ساعت ۰۰:۰۰) تمام ویجتها را به‌روز می‌کنه.

با توجه به بحث همیشگی و تکراری تحریم و ... نمیشه که این برنامه رو به Android Market اضافه کرد (حتی اگر هم که می‌تونستم، کسی نمی‌تونست از Android Market نصبش کنه ;)) اگر کسی علاقه‌منده که نصبش کنه می‌تونه از اینجا بارگذاری کنه.

نکته: از یکی مثل من (با توجه به باورها و عقاید) منتشر نکردن کد یکم بعیده، اما مطمئنا کدش رو (هرچند که خیلی سادست) به زودی ریلیز می‌کنم، مشکل اینه که فکر می‌کنم یه مشکل لایسنس کوچیک وجود داره که تا رفع نشده بهتره که کد ریلیز نشه.

ه‍.ش. ۱۳۸۸ فروردین ۱۱, سه‌شنبه

من و T-Mobile G1

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

من برطبق یک عادت چندین ساله، هرسال برای خودم یه‌دونه Gadget می‌خرم که سرم باهاش گرم باشه و یکم از کارای تکراری توی شرکت و خونه راحت بشم. وقتی که مطمئن شدم در آینده‌ایی نزدیک دستم به OpenMoko نخواهد رسید تصمیم گرفتم که یه‌دونه هارد SSD بخرم (یک Intel X25-M). تمام تهران رو گشتم اما پیدا نشد که نشد، و از اونجا که نمی‌شد این رسم چند‌ساله خریدن یه Gadget رو زیرپا گذاشت، تصمیم گرفتم نزدیک‌ترین چیز به Freerunner رو بخرم، یک T-Mobile G1، با کرنل لینوکس و سیستم عامل اندروید گوگل.

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

وقتی که گوشی رو خریدم، فروشنده بهم گفت که این گوشی چون برای قابل استفاده بودن باید حتما با یک حساب‌کاربری Google ثبت بشه، ما این رو به اسم یه‌نفر دیگه رجیستر کردیم، گوشی الان کاملا قابل استفاده هست، اما با یک حساب‌کاربری دیگه! یکی از مهمترین خصوصیات این گوشی اینه که کاملا با سرویسهای Google هم‌پارچه شده، لیست‌تماس، ای‌-میلها، تقویم و ... خوب مسلما که این حالت برای من غیر‌قابل‌تحمل بود. هنوز ۳-۲ ساعت از گوشی استفاده نکرده‌بودم که تصمیم گرفتم گوشی رو کلا ریست کنم. بعد از تکمیل شدن ریست، گوشی اجازه هیچ‌کاری رو بهم نمی‌داد، صفحه اول یک Wizard مونده بود و تا اون فرایند رجیستر رو تکمیل نمی‌کردم اجازه هیچ‌کاری رو نمی‌داد، حتی اجازه نمی‌داد تنظیمات WiFi رو انجام بدم تا گوشی یه‌جوری به اینترنت وصل شه! در عرض ۳-۲ ساعت یک Gadget هشتصد‌هزار تومانی رو به یک تکه‌آجر تبدیل کرده بودم.

خود گوشی یه عالمه APN به‌صورت پیش‌فرض داشت و سعی می‌کرد به اونا وصل بشه تا بتونه فرایند رجیستر رو تکمیل کنه، و جای هیچ تعجب نیست که اگر بگم اون APNها همه ماله T-Mobile بودند. اول سعی کردم یه APN جدید بسازم و با یک SIM Card ایرانسل سعی کنم که رجیسترش کنم، اما موفق نشدم. حدس زدم مشکل باید از MCC،‌ MNC ایرانسل باشه.

راه بعدی که به ذهنم رسید این بود که یه‌جوری صفحه تنظیمات WiFi رو باز کنم تا بتونم فعالش کنم و به یه AP وصلش کنم. بعد از یکم جستجو متوجه شدم که در Android SDK یه ابزار دیباگ به اسم Android Debug Bridge وجود داره، SDK رو دانلود کردم (حجیم، و البته اون صفحه گوگل که میگه حق نداری با این IP چیزی دانلود کنی رو هم رؤیت کردم)، بعد از یکم سروکله زدن با udev، یه شل گرفتم از گوشی و بالاخره موفق شدم که گوشی رو مجبور کنم صفحه مربوط به تنظیمات WiFi رو بیاره، WiFi رو فعال کردم به یه AP وصل شدم و با خیالی راحت برگشتم به اون Wizard تا گوشی رو رجیستر کنم، اما بازم نشد!‌ :(

دیگه تقریبا مطمئن شدم که مشکل MNC و MCC نیست و احتمالا گوگل درخواست منو چون از ایران هست بلاک می‌کنه. راه‌حل بعدی این بود که گوشی از اینترنت پروکسی شده استفاده ‌کنه، در تنظیمات گوشی هیچ راهی برای تنظیم پروکسی نبود (بازم شکست). رفتم پیش یکی از دوستام که چندتا کانکشن VPN داشت، سعی کردم لپ‌تاپ اونو به ‌VPN وصل کنیم و گوشی از اینترنتی که لپ‌تاپ روی wireless network interface شیر می‌کنه استفاده کنه، بازم در کمال تعجب متوجه شدم که این گوشی هیچ راهی برای ست کردن اینکه این کانکشن Ad-hoc هست نداره (در حالی که گوشی قبلیم که یک SE P1i هست به‌راحتی این‌چیزا رو می‌فهمید). دیگه داشتم نگران و عصبی می‌شدم. تنها راه این بود که یه NIC دیگه برای کامپیوتر خونه بخرم، اینترنت رو بدم به اون و بعد از اینکه به یه VPN وصل شدم اینترنت رو بدم به یه AP که گوشی بهش وصل بشه.

اصلا از نگرانی خواب نمی‌رفتم، تصمیم گرفتم که بلندشم و هرجور که شده با همون ADB کارشو یک‌سره کنم. با ADB فایل کانفیگ اصلیه گوشی رو pull کردم روی لپ‌تاپ و به دقت خوندمش، و جایی که اون Wizard Component مقدار‌دهی می‌شد رو پیدا کردم، بعد از یکم جستجو و پیدا کردن داکیومنتهای namespace یه راه برای غیرفعال کردنش پیدا کردم! خیلی خوشحال سعی کردم که همون ADB فایل جدید رو push کنم روی گوشی و ریستارت!‌اما نه، مثل اینکه مشکل یکی‌-دوتا نیست، گوشی Permission Denied میداد و su هم Permission Denied میداد.

اولین چیزی که به ذهنم رسید این بود که یه‌جوری یه‌دونه telnetd روی گوشی اجرا کنم، بعد از یکم جستجو معلوم شد که گوشی خودش یه‌دونه telnetd داره، فقط باید اجراش کرد، اما مشکل بعدی این بود که گوشی خودش هیچ Terminal Emulator ایی نداره در حالت پیش‌فرض و باید ازیه‌جا دانلود و نصب می‌کردم که تقریبا بدون رجیستر کردن گوشی محال بود. یه‌دفعه یادم اومد که در اولین ریویوهایی که از این گوشی خوندم یه باگ جالب توی Firmware RC29 بود، و اون این بود که هرچیزی که تایپ می‌کردی توی یه‌دونه hidden terminal با کاربر root اجرا می‌شد! اما مطمئن نبودم که آیا گوشی من هم این باگ رو داره یا نه. نوشتم reboot و در کمال نا‌امیدی Enter رو زدم ... بله! گوشی ریبوت شد!‌ (اولین شانسی که آوردم).

بعد از اینکه گوشی بوت شد، تایپ کردم telnetd و Enter. با لپ‌تاپ به IP که گوشی از AP گرفته بود telnet کردم، و بله، با تشکر ویژه از بامزه بودن بالذات telnet من root بودم. با ADB فایل رو push کردم یه جاروی گوشی که کاربر عادی حق نوشتن داشت و خیلی خوشحال رفتم به اسکرین telnet و سعی کردم با cp فایل رو کپی کنم جای اصلیش، اما نه، مثله اینکه این شل حتی cp هم نداشت :(

واقعا دیگه مستاصل شده‌‌بودم و داشتم به فروختن گوشی فکر می‌کردم. اما هی! مگه نه اینکه من اینجا یه کرنل لینوکس دارم؟ آخرین تیر ترکش push کردن busybox روی گوشی بود و بعد هم busybox cp.

گوشی رو ریبوت کردم و ... بله! گوشی کار کرد! اومد بالا بدون هیچ مشکلی و من راحت باهاش اولین تماسم رو گرفتم. اما خوب هنوز یه مشکل وجود داشت، دقیقا همون مشکلی که اصلا به‌خاطرش گوشی رو فکتوری-ریست کرده بودم و اون این که گوشی به اسم من رجیستر نشده بود :(

مونده بودم که این یکی رو دیگه چی‌کار کنم، برنامه Gmail رو باز کردم، یه پیغام خطا داد که «این گوشی ثبت‌نشده است، خیلی از امکانات را از دست داده‌اید، امیدوارم که یک برنامه‌نویس باشید». خیلی بد بود، خیلی بد. اما به اون آخرش که گفت امیدوارم برنامه‌نویس باشید مشکوک شدم، برنامه Android Market رو باز کردم، اونم گفت که گوشی رجیستر نیست، اما این امکان رو بهم می‌داد که Login کنم، اطلاعات حساب GMail رو وارد کردم و ... بله! تموم شد، گوشی شروع کرد به Sync کردن اطلاعات، بهم گفت که Email جدید داری، دفترچه تلفنم تمامش به گوشی منتقل شد و چندتا notice هم از identi.ca گرفتم! فوق‌العاده بود، فوق‌العاده!

اگر این مشکلات اولیه رو نادیده بگیرم، گوشی فوق‌العاده‌ایی هست، با توجه به تجربه یک‌روزه‌ایی که با این گوشی داشتم (و قبلا هم تقریبا یک‌روز با یک iPhone کار کرده بودم)، به هرکسی که ازمن بپرسه تو این محدوده قیمت کدوم‌یکی رو انتخاب کنم، پیشنهاده من مطمئنا که G1 است.

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

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 تا آخر برای پیدا کردن یک صفت بررسی شوند.