چرا گنو/لینوکس برام جالبه ۳

اولین مساله، نکته کاملا به جایی است که دوست خوبم رضا در مطلب قبلی که درباره لینوکس نوشته بودم بهش اشاره کرده بود (سهیل هم نکته دیگه ای رو تذکر داده بود در جواب):

لینوکس هسته سیستم عامل است و گنو (GNU) مجموعه ای ابزارهای دور و بر اون پس درست تر اینه که به جای لینوکس خالی بگیم گنو / لینوکس. منطقا هم هر جا من بگم لینوکس منظورم گنو لینوکس است مگه اینکه تاکید خاصی بکنم که منظورم هسته سیستم عامل (یا همون Kernel) است.

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

اگر نوشتن در وبلاگ باعث بشه دختری که بهش علاقه مند هستین تصویر نادرستی از شما در ذهنش بسازه، و حرف های شما رو بسیار نا مطلوب تفسیر کنه، چکار میکنید؟

من تصمیم گرفتم از امروز 1 آذر که این اتفاق افتاد تا 40 روز ننویسم.

تا چهل روز دیگه‌! چجوری منتظر بمونیم و بگیم نوشتن سینا برامون مهمه ؟ با یک لوگو. لینوکس بهمون کمک می کنه: دستور convert می تونه یک تصویر رو تغییر بده یا چیزی بهش اضافه کنه. پس من اول یک تصویر به این شکل درست می کنم:

درست ؟ حالا کافیه با یک اسکریپت کوچیک bash فاصله این لحظه تا چهل روز بعد از تاریخ پست سینا رو حساب کنم. اسکریپت رو به خاطر شلوغ نشدن اینجا نمی یارم ولی ساده. بعد به لینوکس دستور زیر رو می دم:

convert -draw ’text 40,10 “’$hours’”’ sina.jpg sinawillwrite.jpg

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

1 * * * * root /directory/sina.bash

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


http://jadi.hacked.in/sinawillwrite.jpg

می بینید ؟ لینوکس (منظورم گنو/لینوکس است) یک ابزار قوی است برای اجرای ایده ها و خوشحال کردن دوستان. برای این است که من دوستش دارم و عضو تهران لاگ هستم.

چرا لینوکس برام جالبه ۲

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

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

texte - 416 bits

رو کپی و پیست می کنم در نرم افزار SpreadSheet که برابر excel است. بعد به سادگی بهش می گم نمودارم رو بکشه. در قدم بعدی کلید PrintScreen رو می زنم و لینوکس ازم می پرسه از صفحه با چه اسمی عکس بگیره. یک اسم بهش می دم و صفحه با اون اسم در یک فایل ذخیره می شه. بعد gimp رو باز می کنم که مشابه photoshop است ولی آزاد و رایگان و بخشی از مطلب رو که می خوام بذارم توی سایتم رو می برم. حالا کافیه وبلاگم رو باز کنم و به اسپیپ بگم فایل متنی بالا و فایل تصویری رو به مقاله اضافه کنه و در با یک دبل‌کلیک در محل مناسب نشون بده (: بامزه است نه ؟



فقط برای کامل شدن بحث

ساعت پنج است و داونلود تمام شده. این هم نمودار نهایی


چرا لینوکس برام جالبه

دوستی می خواست یک سایت کامل رو دریافت کنه و به دلایلی دچار مشکل شده بود. من گفتم براش دریافت می کنم. توی لینوکس به سادگی می نویسم:

wget www.foo.com -k -c -r -p

که یک قدم به یک قدم به لینوکس می گه سایت فلان رو دریافت کن، لینک هاش رو به شکلی تغییر بده که به شکل محلی هم درست دیده بشه، کار رو ادامه بده، همه لینک ها رو دریافت کن و هر فایل (عکس، تصویر، pdf و …) هم که لازم بود رو بگیر و بریز روی هارد.

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

du /home/jadi/download -s

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

crontab -e

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

*/10 * * * * du /home/jadi/download -s >> /home/jadi/download/result

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

چیزی که من دوست دارم

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

نکته لینوکس محیط گرافیکی و مشابه های word و office و firefox و photoshop و … همه چیزهای دیگر را هم دارد (:

پی نوشت. مایوم کو ؟!

دریافت دائمی IP سرور لینوکس از طریق ایمیل

خب مساله چیه ؟ من می خوام برم سفر و لازم دارم که در حین سفر بخشی از وظایف مدیریت سیستم ام رو انجام بدم. برای اینکار باید دائما بتونم به سرورم لاگین کنم و تنظیمات لازم رو انجام بدم یا مشکلات رو حل کنم یا هر کار دیگه ای که پیش می یاد. برای اینکار لازم دارم تا دائما IP سرورم رو بدونم. این آی پی با وجود پول زیادی که سازمان من داره برای یک خط ADSL می ده (حدود چهل هزار تومان در ماه برای یک خط ۲۵۶. قیمتی تقریبا دوبرابر اون چیزی که در بقیه کشورها مردم برای یک خط ۸ مگ می دهند) هر لحظه ممکنه عوض بشه.

راه حل ؟ می دونم در لینوکس چیزی هست به اسم Cron که وظیفه اش اجرای منظم و متوالی دستورات است. در عین حال من بلدم با ifconfig وضعیت کل کارت شبکه ها و IP اونها رو ببینم. پس کافیه از سیستم خودم درخواست کنم که مثلا هر شش ساعت یکبار ifconfig رو برای من اجرا کنه و خروجی اش رو برام میل کنه به آدرس ایمیلم. اون وقت کافیه من روزی چهار بار ایمیل هام رو چک کنم تا بدونم هر لحظه آی پی سرورم چنده و وضعیت کارت شبکه هاش چطوره.

برای اینکار کافیه فایل کنترل کننده cron رو ادیت کنم یعنی

/etc/crontabs

اون رو ادیت می کنم و آخرش اضافه می کنم:

28 5,11,17,23 * * * root /root/sendifconfig.sh

حله ؟ اون اعداد اول می گن :‌ هر روزی از هفته و ماه سر ساعت ۵ یا ساعت ۱۱ یا ساعت ۱۷ یا ساعت ۲۳ و ۲۸ دقیقه لینوکسم فایل sendifconfig.sh رو اجرا کنه. حالا کافیه توی اون فایل بنویسم:

#!/bin/sh
ifconfig > fidata && mail -s ifdata jadijadi@gmail.com < ifdata

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

در صورتی که علاقمند به اطلاعات بیشتری درباره Cron بودید به راهنمای مقدماتی cron مراجعه کنید (انگلیسی ساده)

سودوکو را بدون لحظه ای فکر حل کنید

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

حل کردن این جدول ها کار چندان راحتی نیست، البته به شرطی که از راه حل های الگوریتمی استفاده نکنید. چند وقتی بود که می خواستم راه حل الگوریتمی / کامپیوتری این جدول ها را بنویسم که تنبلی ام می آمد ولی بعد از ارسال برنامه حل کننده سودوکو در وبلاگ یک پزشک و تلاش های دوست و همکار خوبم – مهدی – در حل کردن سودوکو، تصمیم گرفتم حوصله کنم و راه حل را بنویسم. اصل مقاله ای که از عکس ها و متن اش استفاده کرده ام در اینجاست : Solve Sudoku.

قدم اول – شروع برای شروع به یک جدول سودوکو و یک مداد و یک پاک کن احتیاج دارید.

1

قدم دوم – خانه های خالی را پر کنید شکی نیست که هر خانه ای باید با یکی از اعداد ۱ تا نه پر شود. پس در هر خانه خالی به ترتیبی که می بینید اعداد یک تا نه را بنویسید.

2

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

3

قدم چهارم – عمودی حل کنید هر کدام از عددهای مشخص شده را انتخاب کنید، کنارش یک خط عمودی بکشید و تمام مشابه های آن عدد در ردیف های عمودی را پاک کنید.

4

قدم پنجم – دایره ای حذف کنید دور عدد مشخص شده یک دایره بکشید و بعد همه مشابه های آن عدد در مربع نه خانه ای را خط بزنید. مثلا اینجا دور شش یک دایره کشیده ایم و بعد در خانه نه تایی که این شش قرار دارد، همه شش های دیگر را حذف کرده ایم.<

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

6

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

7

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

8

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

9

قدم نهم – به مربع های نه تایی نگاه کنید اگر مراحل قبلی را طی کردید و هنوز جدول حل نشده، به گروه های جدول نه تایی نگاه کنید. بدون اینکه فکر کنید یا حدس بزنید، عددی را پیدا کنید که در یک جدول نه تایی فقط یک باز ظاهر شده باشد، این عدد جواب آن خانه است. در شکل پنجی که مشاهده می کنید جواب آن خانه است. مثل همه جواب های دیگر آن را بزرگ بنویسید و مراحل افقی و عمودی و دایره ای را تکرار کنید.

10

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

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

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