توضیح فنی: جریان فنی خیلی ساده و مقدماتی است. دیشب صحبتش شد و همون موقع سر هم کردم: یک فرم که می گه کدوم استان ها رو می خوایم و یک دستور convert که لایه های مختلف استان ها رو می ندازه روی یک عکس ایران.
توجه: این پست در مورد فلسفه نرم افزار آزاد است. این پست در مورد برنامه نویسی و آموزش اون نیست.
خب من یک مشکل کوچولو تو زندگیم دارم. با آدم خیلی زیاد چت می کنم. با همکارام. مثلا می خوام به یکی که عطسه کرده بگم عافیت باشه. باید روی آیکون مسنجر کلیک کنم که فهرست دوستام باز بشه، بعد فلانی رو توش پیدا کنم (با سرچ یا اسکرول) و بعد روش دبل کلیک کنم که یک پنجره باز بشه و بعد توش تایپ کنم. خیلی بی مزه است. نه فقط غیر گیکی که بسیار کند و نیازمند تکون دادن دست از روی کیبورد.
قدیم ها gnome-do تا حدی جوابگو بود ولی نه اونقدر که من می خوام و … چرا خودم ننویسم چیزی که می خوام رو؟ اینجا لینوکسه، دنیای آزاد و مشارکت و سوار شدن روی دوش غولهایی که قبلا زحمات متنوع رو کشیدن تا ما راحت بالا بریم.
قدم اول اینه که چطوری میتونم به مسنجری که بازه پیام بفرستم. جواب DBus است. یک مفهوم بسیار جذاب و کاربردی توی گنو/لینوکس ها که توسط ردهت توسعه پیدا کرده و الان همه ازش استفاده می کنن. ایده کار اینه: هر برنامه ای که اجرا می شه اگر بخواد به بقیه هم سرویس بده خودش رو روی دی.باس (اتوبوس دسکتاپ) رجیستر می کنه و اعلام می کنه که یکسری سرویس داده و یکسری قابلیت. بعد بقیه برنامه ها می تونن به همین خط اتوبوس (دی.باس) وصل بشن و از برنامه های متنوع درخواست کارهایی که دارن رو بدن. شماتیکش رو براتون کشیدم:
در اصل برنامه مسنجر من (پیجین که می تونه توی همه اکانت های جت من لاگین کنه) رو یک تیم بزرگ دیگه نوشتن. همه کارهای سخت رو اونا کردن. اون اجرا می شه و به دی باس وصله با یکسری سرویس جذاب. حالا کافیه من یک برنامه کوچیک بنویسم که بهش دو تا چیز بدم: اسم دوستی که می خوام براش پیام بفرستم و متنی که می خوام براش بره:
$ im.py "ali_banaii@gmail.com" "aafiat bashe"
حالا کافیه برنامه من در هر بار اجرا به دی باس وصل بشه:
for thisAccount in purple.PurpleAccountsGetAllActive():
myname = purple.PurpleAccountGetUsername (thisAccount)
for buddy in purple.PurpleFindBuddies(thisAccount, '' ):
و اگر اسم این دوستم با اسمی که بهش دادم مساوی بود، پیام رو براش بفرسته:
خیلی قشنگ نیست؟ فوق العاده است اما هنوز کافی نیست چون من ایمیل همه دوستام رو حفظ نیستم و این روش عملا کندتر می شه از کار کردن با ماوس. مطمئن هستم که یکی قبلا این مشکل رو داشته و در دنیای آزاد حل کرده. با یک سرچ کوچیک می رسم به کتابخونه ای به اسم فازی وازی. این کتابخونه می تونه شباهت دو تا عبارت با هم رو بسنجه. کافیه برنامه من شباهت اسمی که بهش دادم رو با اسم مستعار و ایمیل همه دوستام که از مسنجر خونده چک کنه و یادش نگه داره کدوم نفر بیشترین شباهت ممکن رو داشت. بعد از من بپرسه می خوام به فلانی پیام بدم و پیام رو بده. این فوق العاده است. نتیجه نهایی چنین چیزی می شه:
jadi@jint:~$ im.py banae "aafiat bashe"
Send ' aafiat bashe ' to ali banaii ( ali_banaii@gmail.com ) ? y
فوق العاده نیست؟ حتی با اینکه بخشی از اسم رو نوشتم و اونهم تازه اشتباه، کار می کنه (((: فوق العاده است بدون شک. زیبایی آزادی رو داره چون من فقط با سی و هشت خط برنامه به چنین ترکیب جذابی رسیدم و تنها دلیلش هم کتابخانه های آزاد دیگران، راهنماهای خوبشون و طراحی عالی سیستم عاملم است. شاید براتون جالب باشه که من قبل از این ایده که سه ساعت قبل به فکرم رسید نه از کتابخونه فازی وازی چیزی می دونستم و نه تا حالا با دی.باس کار کرده بودم. راستی اینم بگم که کار با دی.باس یعنی من به مسنجر درخواست دادم که با فلانی چت کنه. بعد از دستور بالا، یک پنجره باز خواهد شد که چت من توشه و می تونم بحث رو از اونجا ادامه بدم.
برنامه اتچ است و برای اجراش توسط خودتون نیازمند اون کتابخونه که اون بالا گفتم خواهید بود.
نکته ابتدایی: این یک پست تفریحی است. جذابیت گنو/لینوکس به عنوان یک ابزار رو نشون میده ولی ربط چندانی به ماجرا نداره.
یک روز آروم کاری. چیکار کنیم؟ فیلم بسازیم! حداقل امتحان کنیم که اگر بخوایم یک انیمیشن یا کارتون متحرک با ابزاری که دم دست داریم بسازیم امکان پذیره یا نه. هدف یک گیف متحرک است.
استودیو رو تنظیم می کنیم:
یک وبکم اکسترنال، یک پس زمینه و عروسکهایی که داریم. بعد شروع می کنیم به گرفتن عکس اول و عکس دوم و هر بار کمی تغییر جای عروسک ها.
هر بار هم با نرم افزار Cheese یک عکس رو سیو می کنیم. بعد از شونزده فریم نمایش تموم شده (که متاسفانه از اول درمورد مفهومش فکر نکرده بودم) و وقت چسبوندن تصاویر به همدیگه است.
من از برنامه convert استفاده میکنم که بخشی از زندگی روزمرهام توی لینوکسه. این برنامه میتونه عکسها رو تغییر سایز بده، تنظیم نور کنه، ببره و غیره و غیره. حالا من باهاش تصاویر رو به هم می چسبونم. با این دستور:
کاملا واضحه: تبدیل کن همه تصاویری که توی این دایرکتوری هستن (که فریم های انیمیشن هستن) رو و بعد دو ثانیه فاصل بنداز و عکس آخر رو تکرار کن (که آخر تیتراژ است) و خروجی ها رو بریز توی یک فایل گیف (که منطقا متحرک می شه چون نتیجه چند تا عکس است).
نتیجه؟ این:
هاها… به همین خاطره که می گم گنو/لینوکس چنین ابزار عالی ای. کافیه اراده کنین و ایده داشته باشین تا اجرا بشه. می دونم بقیه سیستم عامل ها هم می تونن اینکار رو بکنن ولی به نظر من اینقدر ابزار دم دستی نیستن و نه فقط هی باید برای چنین کاری برنامه نصب می کردین که اصولا مشوق اینجور انگولکها نمیبودن.
مساله: یک دوستمون رفته یک سایت کرهای و میخواد توش ایمیلی برای تماس پیدا کنه. سایت مسخره است و ظاهرا اصلا انگلیسی فریندلی نیست.
کار جالبی که حاجی (که تقاضای اصلی رو داشته) کرده، اینه که توی یک فروم از آدمها خواسته تا توی سایت بچرخن و یک ایمیل پیدا کنن. به قول خودش ۱۷ یا ۱۸ نفر اسکول این چینی/کرهای ها شدن تا مساله حل شده. در بیست و پنج دقیقه! ایده فوق العاده ای بوده. مثلا می شه بهش گففت تکنیک بسیجی! اما ما مسلح به سلاح ایمان به گنو/لینوکس هستیم. خودتون رو گرم کنین چون مثل یک تک تیرانداز می خوایم از یک جمعیت عظیم، یک ایمیل شکار کنیم. اول به یک سرور روی اینترنت لاگین کردم تا کارهام سریعتر باشه.
یک دایرکتوری موقت برای اینکار درست کردم و رفتم توش:
jadi@debian-server:~/$ mdkir tmp ; cd tmp
با ابزار فوق العاده wget، به شکل ریکرسیو کل صفحات سایت رو توی یکسری فایل دانلود کردم:
jadi@debian-server:~/tmp$ nohup wget -r http://www.doowoncorp.com/ &
nohup: ignoring input and appending output to `nohup.out'
[1] 17040
نوهاپ رو اول زدم که اگر قطع شدم، کار ادامه پیدا کنه. وقتی کار تموم شد حجم رو چک کردم:
من علاقمند شدم این نظریه رو روی سایت نارنجی تست کنم. پس نیاز دارم به همه مطالبش تا به امروز تا از اونها تیترها رو بیرون بیارم. با یک گشت توی سایت معلوم می شه که در هر صفحه ۶ مطلب قابل مشاهده است و مثلا برای دیدن مطالب ۷ تا ۱۲ باید این صفحه رو دانلود کنیم:
http://narenji.ir/index.php?start=6
پس در قدم اول باید برنامه بنویسیم که تمام مطالب رو دانلود و توی فایلها ذخیره کنه. برنامه به پرل و با استفاده از ابزار wget، میشه:
حالا من صدها فایل دارم که مطالب نارنجی به شکل تاریخی توشون است. قدم بعدی اینه که تیترها و تاریخهای هر مطلب رو جدا کنم.
برای اینکار، اچ تی ام ال رو نگاه می کنیم و پیدا میکنم کجاها تیتر و تاریخ گفته شده. یک خط قبل از خطی که تیتر توش گفته باشه، یک contentpagetitle در اچ تی ام ال هست و یک خط قبل از تاریخ هم یک createdate. پس کافیه گرپ کنم برای یکی از این دو عبارت و خط بعدی اش رو نمایش بدم و خود خطوط دارای اون عبارت رو هم حذف کنم:
اینکار باعث می شه من یک فایل داشته باشم با کلی (در اصل ۱۶۳۸ که تعداد مطالب است ضربدر ۴) خط خواهم داشت به این شکل:
یک حافظه یو اس بی با ظرفیت نامحدود</a>
--
Friday, 26 November 2010 08:23 </td>
تمامش رو کپی پیست میکنم به یک فایل و بخشهای اضافی رو با Replace All حذف میکنم.
حالا کافیه اینها رو از هم جدا کنم. خطوط فرد تیترها هستن و خطوط زوج، تاریخ ها. پس با ابزار قوی awk خط های زوج رو میریزم توی فایل تاریخها و خط های فرد رو توی فایل تیترها.
و خلاص… اینها رو کپی پیست می کنیم توی اوپن آفیس و نمودارهایی که دوست داریم رو میکشیم… اوه! ما الان تیترها رو داریم در حالی که تعداد کلمات توی هر تیتر رو میخوایم. پس چنین دو سه خط دیگه پرل می نویسیم و روی فایل تیترها اجرا می کنیم:
open FILE, "titrs.out" or die $!;
while () {
print scalar (split(" ", $_)) "\n";
}
و تمام. البته الان فایلها سر و ته هستن. یعنی جدیدترین اطلاعات در بالا هستن در حالی که باید در پایین باشن تا سمت راست نمودار قرار بگیرن. حل این مشکل راحته، ابزار tac می تونه یک فایل متنی رو برعکس کنه (اسمش بر عکس cat هست که یک فایل رو به حالت عادی نمایش می ده (: )). حالا دوباره محتویات هر فایل رو توی یک ستون از صفحه گسترده کپی می کنم و نمودار رو میکشم.
و خب تئوری اولیه ما رد می شه. ظاهرا در سایت نارنجی تعداد کلمات تیتر هر مطلب در طول زمان تغییر چندانی نداشته (: ولی یکبار دیگه لذت بردیم از کار کردن با گنو/لینوکس و ابزارهای بسیار قدرتمندی که زیرانگشتامون می ذاره.
پی.نوشت. قبل از انتشار، در مورد مطلب با دوستانم در نارنجی حرف زدم. علی اصغر هنرمند که سردبیر نارنجی است توضیح داد که تیم نارنجی از سه سال قبل تا الان، بر اساس این نمودار
حدود یک هفته پیش سری زدم به فریندفید تا ببینم جایی که اینقدر طرفداراش ازش حرف می زنن چیه (: حالا بحث کاملش نیازمند یک مطلب کامل است اما فقط این رو بگم که وقتی شروع کردم به اضافه کردن دوستان، رسیدم به مهرداد با این آواتار:
خب چه اشکالی داره؟ (: هیچچی. ظاهرا یک نفر که روی مکش ویندوز نصب کرده یا حالا به هر دلیل دیگه این آواتار رو داره. مهرداد بچه باحالی است و به قول فرفری ها (اسم مخفف فریند فید)، سابش کردم (subscribe).
اما مشکل از جایی شروع شد که شب دوم سفر که خواستم برم فریندفید وقت بگذرونم، مهرداد فعال با آواتارش همه صفحه اول من رو کرد ویندوز (: یک راه حل حذف کردنش بود که جذاب نبود چون ازش خوشم می یاد… پس… اوه!
من برای قلقلک دادن فیل، از تور و یک پروکسی به اسم polipo روی کامپیوتر خودم اضافه میکنم. کافیه به فایرفاکس با افزونه FoxyProxy که استفاده میکنم بگم که آدرس عکس آواتار رو بده به پروکسی. با یک کلیک راست معلوم می شه که آدرس هست:
و حالا که به فاکسی پروکسی گفتم این رو بده به پروکسی پولیپو، کافیه بزنم man polipo تا تنظیماتش رو یاد بگیرم. اونجا نوشته یک فایل هست به اسم etc/polipo/forbidden/ که هر یو.آر.الی که توش باشه فیلتر میشه. پس من آدرس بالا رو توی این فایل می نویسم و پولیپو رو ریاستارت میکنم… از این به بعد صفحه فریندفید برام اینطوری خواهد بود (به فید سوم دقت کنید):
البته شکی نیست که راه حل های خیلی بهتری هم هست.. مثلا اگر گریزمانکی داشته باشین می تونین حتی عکس رو با چیزی که دوست دارین عوض کنین ولی این روش کم هزینهترین و سریعترین راهی بود که من پیدا کردم (: زنده باد گنو/لینوکس، زنده باد آزادی(نرمافزار) و زنده باد حق تغییر به شکلی که دوستش داریم (:
سیستم عامل برای من فقط یک رابط با سخت افزار نیست، برای من سیستم عامل یک دنیای پر از هیجان است که همیشه می شه توی گوشه کنارش چرخید، کنار پروسسهای قدم زد و سنگهای قشنگش رو از روی زمین برداشت و به بقیه نشون داد و شما خوب میدونین که کنار رودخونههای سرزمین لینوکس پر است از این سنگهای جلا خورده قشنگ…
امروز یک ایمیل گرفتم که توش یک نفر پرسیده بود یک عالمه دامین داره ولی نمیدونه کدومها به سایتی اشاره میکنن و کدوم ها استفاده ندارن و میخواست یک جوری اینو بفهمه. یک لیستی شبیه به این:
نظر خودش این بود که باید یکی یکی کپی کنه و توی براوزر بازشون کنه تا ببینه صفحه ای می یاد یا نه. اما اینجا ما لینوکس رو داریم با دستورهای زیبایی مثل cut و xargs. من به سادگی این دستور رو می زنم:
jadi@jubun:/tmp$ cut -d’ ‘ -f 7 | xargs firefox
اول به دستور cut با آپشن d می گم که space رو به عنوان جدا کننده در نظر بگیره و با f بهش میگم که فیلد هفتم ر ومیخوام (چون یک جاهایی دو تا اسپیس هست که خودشون یک فیلد حساب میشن) . این دسور همه اسم دامینها را برمیگردونه. بعد خروجی رو با یک | میفرستم به دستور بعدی. دستور بعدی xargs است که یک دستور جلوش میگیره (اینجا firefox) و همه ورودیها رو پشتش ردیف میکنه. در واقع ترکیب این دو دستور مثل اینه که من تایپ کرده باشم firefox a.Info b.info c.info تا آخر. در واقع حالا با زدن اون دستور و کپی پیست ایمیل دوستم به عنوان ورودی، کل اون دامینها در فایرفاکس باز میش و من میتونم بگم کدومشون به یک سایت اشاره میکنن و کدومها نه.
پ.ن. مشخصه که با دو سه خط «کد» نوشتن می شد خود برنامه چک کنه که خروجی برگشته از اون سایت، منطقی است یا نه . در واقع به راحتی میشد بقیه کار رو هم اتوماتیک کرد (:
جالبه که وقتی صحبت از نرم افزارهای بازمتن و لینوکس می شه، یکی از استدلالها علیه اون اینه:
– پشتیبانی آقا پشتیبانی! وقتی چیزی مجانیه که دیگه خراب شد کارت با کرام الکاتبینه. من خودم زنگ می زنم مایکروسافت همه مشکلات رو حل می کنن برام.
امیدوارم دوستانی با تجربه زنگ زدن به مایکروسافت باشند. معمولا یک نفر با لهجه هندی یا کنیایی یا یک کشور جهان سوم به شما جواب می دهد و از روی لیست لعنتی شما را راهنمایی می کند:
– مطمئن هستید که کامپیوتر روشن است؟
– بعله خانم. مشکلم اینه که نمی تونم gateway رو عوض کنم.
– کابل شبکه رو چک کنین. معمولا در قسمت پستی..
– خواهرم! کابل شبکه رو می دونم چیه. جایی مثل 4.2.2.4 رو می تونم پینگ کنم ولی می خوام gateway رو عوض کنم.
– لطفا از منوی start در سمت چپ پایین گزینه run رو انتخاب کنید و بعد
– خانم جان! می گم اینها رو بلدم. از کجا باید …
می گویید نه؟ اینترنت را سرچ کنید یا دگمه TroubleShoot را فشار دهید تا از شما بپرسید که «کامپیوتر روشنه؟ کابل وصله؟ برق هم هست؟ دیگه نظری ندارم». این شاید به درد بعضیها بخوره ولی من رو عصبی می کنه (: در عوض در دنیایی مثل دنیای لینوکس همیشه هزاران نفر مشتاق کمک شما هستند. بعضی ها مشکلات و راه حل اونها رو قبلا در اینترنت نوشته اند. در انجمن ها هر سوال مرتبط با لینوکس سریعا توسط دیگران جواب داده می شه (برای سوالات در ایران مراجعه کنید به انجمنهای تکنوتاکس که البته بهتره قبل از هر سوال، جستجو کنید) و از اون بهتر همیشه یکسری IRC هست که آدم هاش آماده جواب دادن به شما هستند.
من امروز صبح می خواستم بدون gateway رو چجوری باید عوض کنم. وارد محیط چت عمومی IRC می شم. بیشتر از ششصد نفر در کانال #linux منتظر سوال من هستند. در خط اول سوالم رو می پرسم و سریعا دو نفر جواب می دهند. جواب دوم دقیقا همان جواب فنی است که من می خواهم (:
فراموش نکنید که در یک دنیای آزاد، افراد مشارکت طلب هستند و با یکدیگر همکاری می کنند. این تصور که کمک را فقط با پول می شود خرید، تصور دنیای انحصارها و رقابت ها است. برای اینکه ادای دینی هم کرده باشم، ده دقیقه ای در همان کانال می مانم و گپی می زنم و مشکل چند نفر را حل می کنم.
جوک.
یک هلیکوپتر که یک خلبان و یک سرنشین در آن بودند در حوالی سیاتل در حال پرواز بود که نگهان مشکلی فنی در سیستم ناوبری و بی سیم به وجود آمد. به خاطر تاریکی و مه، خلبان نمیتوانست مسیر را پیدا کند.
خلبان به ناگهان متوجه برج بزرگی شد که رو به روی آنها سبز شده بود و بعضی از چراغهایش روشن بودند. از همراهش خواست تا روی کاغذی بزرگ بنویسید: «ما کجا هستیم؟» و به برج نزدیک شد. وقتی فاصله به اندازه کافی به برج نزدیک شد کاغذ را از پشت شیشه به افراد درون دفتر نشان دادند.
کارمندان سریعا به سمت یک کاغذ بزرگ دویدند و چیزی روی آن نوشتند و به سمت پنجره برگشتند. روی کاغذ نوشته شده بود: «شما درون یک هلیکوپتر هستید.»
خلبان لبخندی زد و به نقشه نگاه کند و به سمت فرودگاه سیاتاک رفت و به سلامتی فرود آمد.
بعد از فرود، مسافر از خلبان پرسید که: «چطور با خواندن اینکه شما درون یک هلیکوپتر هستید فهمیدی که کجای شهر هستیم؟»
خلبان گفت: «راحت بود. چیزی که خواندیم از نظر فنی درست ولی از نظر کاربردی کاملا بی استفاده بود. به راحتی فهمیدم که ما درست کنار ساختمان پشتیبانی فنی مایکروسافت هستیم.»
تشکر از دوستان خوبی که توی کامنت شیوه های بهتری رو هم دارند می گند و نشون می دن که لینوکس به چه جامعه فوق العاده پشت گرمه (: