چرا گنو/لینوکس رو دوست دارم: اینجا چند بار از کلمه مهمل استفاده شده

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

چیکار می کنیم؟ من با وردپرس وبلاگ می‌نویسم. پس اول از بخش مدیریت از منوی Tools، کل پست‌ها و کامنت‌های سایت رو Export میکنم. اینجوری یک فایل ایکس ام ال دارم که همه مطالب سایت توش هستن.

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


 jadi@jeducation:~/Downloads$ grep -o مهمل wordpress.2012-12-05.xml | wc -l 
 29


بعله (: من بیست و نه بار از کلمه مهمل استفاده کردم (: اما چیزی که جالبتره اینه که از کی شروع کردم به استفاده. اینبار باید برنامه بنویسم. پایتون همیشه انتخاب راحت و خوبیه. برنامه ایکس ام ال رو می خونه، درختش رو بررسی می کنه و توی همه مطالب و کامنت‌هایی که از عبارت مهمل استفاده کردن، تاریخ رو توی خروجی می نویسه:
# -*- coding: utf8 -*- 

from xml.dom import minidom
import xml.etree.cElementTree as et
import re

tree=et.parse('wordpress.2012-12-05.xml')
root=tree.getroot();

for child in root.iter('item'):
	date = child.find('wppost_date').text
	body = child.find('content_encoded').text
	title = child.find('title').text

	try:
		if re.search (u'مهمل', body) or re.search(u'مهمل', title):
			print date;
	except:
		print date;

for child in root.iter('wpcomment'):
	date = child.find('wpcomment_date').text
	body = child.find('wpcomment_content').text

	try:
		if re.search (u'مهمل', body):
			print date
	except:
		print date;


اگر پایتون بلدین (یا حتی بلد نیستین ولی جرات داشتین کد رو نگاه کنین) می بینین که کد اصلا خوب نیست. دلیل تاریخی داره. اول نمی دونستم تو کامنت هم هست و بعد کامنت ها رو با یک کپی پیست جدا کردم. بعد دیدم گاهی اکسپشن می گیرم و بعد از بررسی فهمیدم بعضی مطالب متن یا عنوان نداره (چرا؟!) و در نتیجه خروجی مشکل پیدا می کنه که با یک اکسپشن اضافه کردن سر و ته مشکل رو هم آوردم و رسیدم به نتیجه‌ای که می‌خواستم:
jadi@jeducation:~/Downloads$ time python parsejadi.py 
2011-12
2012-07
2012-11
2011-09
2011-10
2011-10
2012-02
2012-06
2012-10
2012-11
2012-11
2012-11
2012-11
2012-12
2009-06
2009-05
2011-08
2011-09
2011-10
2011-10
2011-11
2012-06
2012-06
2012-08
2012-10
2012-10
2012-10
2012-10
2012-11

real	0m0.738s
user	0m0.700s
sys	0m0.028s
jadi@jeducation:~/Downloads$ 

میبینین که توی اون خطی که تاریخ رو حساب کردیم یک [7:] دارم که باعث می‌شه فقط سال و ماه رو ذخیره کنم چون این نمودار با معنی‌تری بهمون می‌ده. راستی گفتم نمودار. اینم نمودارش (مشخصه که با لیبره آفیس لینوکس):

ظاهرا که همیشه از کلمه مهمل استفاده می‌کردم ولی این دو ماه بیشتر هم شده (:

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

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

ایمیل وارده

سلام جادی
خوبی ؟

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

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

فقط گفتم ممنونم لینوکس
ممنونم

(:

چرا گنو/لینوکس رو دوست دارم: شیوه گوش کردن من به پادکست

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

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

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

هاها.. دیدین چه عالیه؟! اون ابر همیشه نشون دهنده اینترنت است و اینحا نشون دهنده یک کامپیوتر متصل به اینترنت (هاست).

قدم اول) دریافت پادکست ها

من برای پادکست هام همیشه از gpodder استفاده می کردم. یک برنامه عالی برای مدیریت پادکست. اگر در یک کشور درست زندگی می کردم همون رو روی گوشی هم نصب می کردم و فهرست رو بهش می دادم و روزی یکبار خودش رو آپدیت می کرد. اما اینجا باید هم بهش بگم از فیلتر بگذره و هم دردسر اینو داشته باشم که سرعتش خیلی کمه و هی توی دانلود پادکست ها (که بین ده تا پنجاه مگ هستن و گاهی صد مگ) قطع می شد و … کاری که من کردم اینه که نسخه کامندلاین همون برنامه رو روی سرورم نصب کردم. مثلا برای مشترک شدن توی رادیو گیک می تونم بهش بگم:

$gpo subscribe http://feeds.feedburner.com/radiojadi

اگر فکر می کنید کامند لاین سخته به این فکر کنین که باید یک برنامه گرافیکی رو اجرا می کردم، بعد دستم رو از کیبورد بر می داشتم می ذاشتم روی ماوس بعد می رفتم روی منوی پادکست ها بعد اضافه کردن رو می زدم بعد در جایی که ظاهر می شد کلیک می کردم و دستم رو از روی ماوس می آوردم روی کیبورد و این رو می زدم و بعد دوباره می رفتم روی ماوس و اوکی رو فشار می دادم – اگر مایکروسافت برنامه رو نوشته بود احتمالا یک پنجره هم ظاهر می شد که می گفت «پادکست اضافه شد» و باید دوباره اوکی رو می زدم ((:

و وقتی همه پادکست هام رو داشت می تونم اول با دستور آپدیت بگم لیست پادکست های جدید رو آپدیت کنه و بعد با دستور download اونها رو دریافت کنه.

$gpo update
$gpo upgrade

و هر لینوکس کاری می دونه که برای اجرای روزانه این دستور، می تونه اونو به cron اضافه کنه. که در نتیجه اش مثلا هر شب ساعت سه صبح، سیستم خود به خود این دو تا دستور رو اجرا کنه و در نتیجه هر روز ساعت سه و ربع صبح همه پادکست ها توی دایرکتوری من توی سرور باشه.

خب حالا من پادکست هام رو روی سرور دارم. قدم دوم منتقل کردن اونها به روی کامپیوتر شخصی ام است.

قدم دوم) انتقال به پی سی

برای انتقال پادکست ها از سرور به پی سی راه های مختلفی هست. مثلا می شد من هر روز یک rsync اجرا کنم که این دو دایرکتوری با هم سینک بشن یا کپی کنم یا اف تی پی یا هر چی… ولی من در نهایت استفاده از dropbox رو ترجیح دادم. الان یک دراپ باکس روی سرور در حال اجرا است و یک دراپ باکس روی کامپیوترم و این دو اکانت فقط یک فولدر رو با هم سینک نگه می‌دارن. برای گفتن به دراپ باکس که فلان دایرکتوری که پادکست های هر دو طرف قراره توش باشن رو سینک کنه، به سادگی یک سافت لینک ساختم از فولدر پادکست ها توی فولدر مشترک دو تا دراپ باکس.

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

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

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

قلق کنکوری: من پروکسی محل کارم رو دادم به دراپ باکس در نتیجه دراپ باکس فقط توی محل کار می تونه کار کنه (: نتیجه اش اینه که پهنای باند محدود خونه ام مصرف نمی شه و پادکست هام فقط توی شرکت آپدیت می شن.

قدم سوم) انتقال به تبلت

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

برای انتقال فایل ها به تبلت، اول تبلت رو مثل یک کول دیسک با سیم به کامپیوتر وصل می کنم و بعد این دستور رو اجرا می کنم


jadi@jabayon ~ $ podcast.sync.media.sh

بله بله!‌ داخلش مهمه.. اینجاست:


jadi@jabayon ~ $ cat ~/bin/podcast.sync.media.sh 
#!/bin/sh

rsync -vr ~/folan/bahman/gpodder-downloads/ /media/3E61-0413/Music/podcasts/
echo press enter to delete all podcast files from the dropbox
read
find /home/jadi/Dropbox/jadis/gpodder-downloads/  -type f -exec rm "{}" \;
echo press enter to unmount the tablet
read
umount /media/3E61-0413

اول دایرکتوری ای که فایل های جدید توش هستن رو با دایرکتوری موزیک روی تبلت سینک می کنه. بعد من یک انتر می زنم تا دنبال همه فایل های توی دایرکتوری سینک شده دراپ باکس بگرده و همه فایلهاش رو پاک کنه (چون دراپ باکس است از رو سرور و کامپیوتر خونه هم پاک می شن)‌ و بعد که من یک دگمه دیگه زدم تبلت رو آنماونت می کنه. همین!

بله می دونم این قدم پرفکت نیست. می شد وایرلس باشه،‌ می شد خودش وصل شدن رو تشخیص بده و اگر این دستگاه خاص وصل شد شروع به کار کنه و … ولی برای من فعلا بسه و به اندازه کافی بانمک (:

چرا اینقدر سخت؟

از این راحت تر تصور می کنید؟ من هیچ کاری نمی کنم… هر وقت اینترنت بود بدون دغدغه سرعت و سانسور و قطع و وصل شدن و … پادکست ها روی همه دستگاه های مختلفم کپی می شن و هر وقت خواستم ببرم روی تبلت، با سیم وصلش می کنم و یک دستور اینکار رو می کنه. روش های «ساده»تر به معنی «قابل فهم تر» داریم ولی روش ساده تر از این به معنی «کاربردی تر و سریع تر» از نظر من کمه و خوشحال می شم بشنوم (نگین اول فلان برنامه رو باز کنم بعد روی فلان جاش کلیک کنم بعد دگمه آپدت رو بزنم بعد دستگاه رو وصل کنم بعد رایت کلیک کنم بگم سینک بعد روی safe remove کلیک کنم – این روش سینک کردم در کمتر از یک ثانیه شروع می شه (: ).

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

من الان با این روشم راحتم چون یک دایرکتوری جادویی دارم که هر وقت نگاهش می کنم یکسری فایل جذاب برای شنیدن توش هست (:

و چجوری گوش می دم؟

معمولا روی اندرویدم با برنامه Astro Player. یادش نگه می داره هر فایل تا کجاش گوش شده و راحته. توی ماشین بلوتوث رو روشن می کنم و پادکست ها رو پخش می کنم و توی خونه پخش معمولی و توی پیاده روی با هدفون. صبح ها موقع صبحانه تصویری ها رو نگاه می کنم (TED) و اونهایی که خیلی کشدار هستن رو توی حموم که بخش بزرگی اش رو نمی شنوم و رد می شه می ره (:

حالا همه چیز رو می دونین (: سوالی نبود؟ بذارین حداقل یک بار دیگه این عکس قشنگ رو بذارم (:

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

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

کار که نشد نداره. خب از نظر من RSSها درست شدن برای این ولی شاید یکی بخواد یک شورتکات داشته باشه روی گوشی اش که هر وقت فشار داد مشغول دانلود / پخش رادیوگیک آخر بشه. برای ما هم یک لینوکس-بازی جذابه. خب اول پیش فرض ها!

۱- من همه فایل ها رو توی مسیر public_html/audio آپلود می کنم
۲- اسم فایل همیشه اینطوری است: jadi-net_radio-geek_014_nofooze_ettelaat.mp3 که تیکه اولش ثابته

پس کافیه همه فایل های اون مسیر رو بگیرم:

 find /home/jadi/public_html/audio/ -type f -name "jadi-net*mp3"

و بعد به ترتیب حروف الفبا مرتبشون کنم که آخری بیافته از همه پایینتر:

 find /home/jadi/public_html/audio/ -type f -name "jadi-net*mp3" | sort

و در نهایت خط آخرش رو جدا کنم:

 find /home/jadi/public_html/audio/ -type f -name "jadi-net*mp3" | sort | tail -1

و حالا اسم جدیدترین فایل رو دارم. در لینوکس چیزی هست به اسم سافت لینک که یک چیزی است تا حدی شبیه شورتکات. کافیه با بالایی یک سافت لینک درست کنم توی یک مسیر ثابت:

 ln -s `find /home/jadi/public_html/audio/ -type f -name "jadi-net*mp3" | \
        sort | tail -1` /home/jadi/public_html/radiogeek.mp3

و کافیه این رو بذارم توی یک کرون تب تا هر روز ساعت ۲ ظهر یکبار اجرا بشه. با اینکار آخرین شماره پادکست همیشه از این آدرس در دسترس خواهد بود: http://jadi.net/radiogeek.mp3 (:

چرا گنو/لینوکس را دوست دارم: بررسی سال های تولد در اطلاعات افشا شده ۳۰۰۰۰۰۰ کارت بانکی

در بخش کامنت های مطلب نقدی بر برنامه بی بی سی در مورد جریان انتشار سه میلیون کارت اعتباری ، همایون گفته بود که:

درود. کارهای آماری جالبی میشه با داده‌ها انجام داد. به عنوان مثال احتمال این که آدمها تاریخ تولدشون رو به عنوان رمز انتخاب کنن بالاست. به دنبال ۱۳۶ بگردبن در فهرست رمزها و مقایسه‌اش کنین با هر عدد ۳ رقمی دیگه‌ای. (۱۳۷ و ۱۳۵ و ۱۳۴ هم تعدادشون بالاست). من اگه دنبال دزدی بودم از اینجا شروع میکردم.

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

اگر شما علاقه ای به خط فرمان یا حوصله اش رو ندارین و فقط نتیجه کار رو می خواین… سریع اسکرول کنین پایین تا برسین به نمودارهای آخر (:

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

در قدم اول همه صفحات بانک تجارت رو باز می کنم، با ctrl+A متنشون رو کپی می کنم و توی یک ادیتور متنی paste می کنم. من توی لینوکس برای اینکار از gedit استفاده کردم که ادیتور ساده و دم دستی گنوم است… مشخصه که اگر توی ویندوز بودم خود این یک ماجرا بود که کدوم ادیتور ممکنه بتونه این پیست رو قبول کنه و آخ نگه.

به خاطر کپی پیست من فقط متن های توی صفحه ها رو دارم… چیزهایی مثل این:

با یک دستور تمام خط هایی که توشون + هست رو جدا می کنیم. اینها خط های حاوی پسورد هستن:

grep "+" all_tejarat.txt > only_hesab_and_pass

اوه اوه! شد این:

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

رمز مخفي , شماره کارت + رمز مخفي , شماره کارت + رمز مخفي , شماره

پس من برای راحت کردن کارم، همه + ها رو تبدیل می کنم به سر خط:

jadi@jubung:~/Desktop$ sed -e "s/\s+[+]*\s*/\n/g" only_hesab_and_pass > har_password_yek_khat
jadi@jubung:~/Desktop$ head har_password_yek_khat 
رمز مخفي , شماره کارت
رمز مخفي , شماره کارت
رمز مخفي , شماره کارت 6273531000000002,73251531609013
6273531000000087,42984601252954
6273531000000105,90683196772477 6273531000000145,14810051866743
6273531000000146,61558146155078
6273531000000150,14869351127492 6273531000000151,87078051710776
6273531000000201,17221491685028
6273531000000222,32833487680537 6273531000000232,06865382135692
6273531000000232,69595659033276

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

jadi@jubung:~/Desktop$ sed -e "s/ /\n/g"  har_password_yek_khat > har_password_yek_khat_2
jadi@jubung:~/Desktop$ head -20 har_password_yek_khat_2 
رمز
مخفي
,
شماره
کارت
رمز
مخفي
,
شماره
کارت
رمز
مخفي
,
شماره
کارت
6273531000000002,73251531609013
6273531000000087,42984601252954
6273531000000105,90683196772477
6273531000000145,14810051866743
6273531000000146,61558146155078

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

jadi@jubung:~/Desktop$ grep  ".," har_password_yek_khat_2 | sed "s/^.*,//" > all_passwords
jadi@jubung:~/Desktop$ head all_passwords 
73251531609013
42984601252954
90683196772477
14810051866743
61558146155078
14869351127492
87078051710776
17221491685028
32833487680537
06865382135692

حله (: ببینیم چند تا پسورد داریم:

jadi@jubung:~/Desktop$ wc -l all_passwords 
118499 all_passwords

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

مردم احتمالا سال تولدشون رو به عنوان پسورد می ذارن.

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

#!/usr/bin/perl

while ($userinput =  ) {
	chomp ($userinput);
	for($i = 0; $i <= 10 ; $i++) {
		print  substr $userinput, $i, 4;
		print "\n";
	}
}

این برنامه ورودی رو می خونه و قسمت های چهار رقمی رو ازش جدا می کنه:

jadi@jubung:~/Desktop$ echo "73251531609013" | ./find_numbers.pl 
7325
3251
2515
5153
1531
5316
3160
1609
6090
0901
9013

درست کار می کنه پس برنامه رو کامل می کنم:

#!/usr/bin/perl

@passes = ();
for($i = 0; $i <= 9999 ; $i++) {
	$passes[$i] = 0;
}


while ($userinput =  ) {
	chomp ($userinput);
	for($i = 0; $i <= 10 ; $i++) {
		$thispass = substr $userinput, $i, 4;
		$passes[$thispass] += 1;
	}
}

for($i = 0; $i <= 9999 ; $i++) {
	print $i, ",",$passes[$i],"\n";
}

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

jadi@jubung:~/Desktop$ cat all_passwords | ./find_numbers.pl  > all_passwords_charts
jadi@jubung:~/Desktop$ head all_passwords_charts 
0,163
1,150
2,135
3,122
4,137
5,141
6,123
7,138
8,122
9,133

حالا که اینها رو داریم کافیه بریم سراغ برنامه LibreOffice برای کشیدن نمودارها. مثلا این نمودار اول است:

دیده می شه که یک جاهایی پیک داریم. بذارین یک سورت هم بکنم به ترتیب فراوانی و یک نمودار دیگه از صد تا از پرکاربردترین ها بکشیم ببینیم چی در می یاد.

اوه! نظریه دوستمون تقویت شد: مردم از سال تولد برای پسوردها استفاده می کنن (: واضح بود ولی خب از این بازی لذت بردیم و تازه یک نظریه رو هم هرچند کم،‌ تقویت کردیم. همینطوره ترکیب های «خوش دست» روی کیبورد (:

نظرتون چیه برای اختتامیه یک آمار هم بگیریم از تعداد ارقام؟ مشخصه که یک تغییر کوچیک در برنامه است فقط:

#!/usr/bin/perl

@passes = ();
for($i = 0; $i <= 9 ; $i++) {
	$passes[$i] = 0;
}


while ($userinput =  ) {
	chomp ($userinput);
	for($i = 0; $i <= 13 ; $i++) {
		$thispass = substr $userinput, $i, 1;
		$passes[$thispass] += 1;
	}
}

for($i = 0; $i <= 9 ; $i++) {
	print $i, ",",$passes[$i],"\n";
}

و نتیجه:

jadi@jubung:~/Desktop$ cat all_passwords | ./find_numbers.pl  > all_digits
jadi@jubung:~/Desktop$ cat all_digits 
0,157054
1,180318
2,169604
3,175258
4,166898
5,169252
6,162562
7,158727
8,160099
9,159214

هاه.. می بینین که احتمال استفاده از ۷ و ۹ پایینه (این رو قبلا هم شنیده بودم) و احتمالا استفاده از یک و سه بالا (: توجه داریم که در صورت درست بودن الگوریتم اعداد رندم استفاده شده برای «مخفی کردن» پسوردها، یک نویز سفید اون پایین داریم که احتمالا مساوی پخش شده.

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

آپدیت اردیبهشت ۹۳: حالا که مشغول شماره ۴۰ هستیم این فایل فشار زیادی به سرور می یاره و در نتیجه غیرفعالش کردم.. برای دانلود همه شماره ها به آرشیو رادیو گیک روی گیت آی او مراجعه کنین.

یک درخواست اومده به این عنوان:

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

webmaster@server:~/public_html/audio$ ls 
jadi.net_radio-geek_000-dragon-pirates.mp3         jadi-net_radio-geek_004_ashke-maahi-haa.mp3  
radio-geek_jadi.net_000-start.mp3                  jadi-net_radio-geek_001_singularity.mp3            
jadi-net_radio-geek_004_ashke-maahi-haa.ogg        shegeftzar.9.10.khoonasham.sample.story_low.mp3
jadi-net_radio-geek_002_space-and-beyond.mp3       radio24-23-November-2011.mp3                 
shegeftzar.9.10.khoonasham.sample.story.mp3        jadi-net_radio-geek_003_ghoole_bazare_makkare.mp3  
radio24-9-November-2011.mp3                        jadi-net_radio-geek_003_ghoole_bazare_makkare.ogg

در اصل هر فایلی که اینجا باشه و اولش با jadi-net_radio-geek شروع بشه مال رادیو است. پس می شه همه اش رو یکجا فشرده کرد:

webmaster@server:~$ cd ~/public_html/audio/ && tar cfz ../radio_geek_all.tar.gz jadi-net_radio-geek*mp3 

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

http://jadi.net/radio_geek_all.tar.gz

فقط یک قدم دیگه می مونه که کارها رو اتوماتیک کنم. cron توی یونیکس ها این وظیفه رو داره. کافیه بزنم cron -e یعنی می خوام یک کرون جدید تعریف کنم و توش بنویسم:

# m h  dom mon dow   command
42	3	*	*	2	cd /home/jadi/public_html/audio/ && \
                                             tar cfz ../radio_geek_archive.tar.gz jadi-net_radio-geek*mp3

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

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

آپدیت اردیبهشت ۹۳: حالا که مشغول شماره ۴۰ هستیم این فایل فشار زیادی به سرور می یاره و در نتیجه غیرفعالش کردم.. برای دانلود همه شماره ها به آرشیو رادیو گیک روی گیت آی او مراجعه کنین.

چرا گنو/لینوکس رو دوست دارم: یک ستونه کردن یک پی دی اف تصویری دو ستونه

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

من می خوام اینها یک ستونه باشن. کار هم نشد نداره… بخصوص وقتی ابزار خوب دارین. قدم اول اینکه هر پی دی اف رو به یکسری عکس های مستقل با کیفیت خوب تبدیل کنم. می‌زنم:

$ convert -verbose -colorspace GRAY -interlace none -density 150 1.pdf 1.png

مشخصه: تغییر بده -حرف زیاد بزن -خاکستری -کیفیت ۱۵۰ فایل یک.پی‌دی‌اف رو روی فایل‌هایی به اسم ۱.پی‌ان‌جی.

نتیجه؟ بعد از رسیدن دمای سی پی یو به ۸۵ سانتی‌گراد، به چیزی شبیه این می‌رسیم:

کلی فایل دارم که دو ستونه هستن. حالا من یک چیزی می‌خوام که هر عکس رو به دو ستون مختلف تبدیل کنه. بازم جادوی convert. اینبار مثلا برای به دست آوردن سمت چپ صفحه بیست و پنج جلد یک اینطوری کار می کنیم:

$ convert 1-25.png -crop 1240×17540+0+0 +repage 1-25b.png

یعنی تغییر بده -فلان صفحه رو -ببر از گوشه سمت چپ بالا به عرض ۱۲۴۰ پیکسل (نصف عرض تصویر) و ارتفاع 1754 و نتیجه رو بریز توی فایلی با همون اسم که کنارش یک b است. در ضمن یک repage هم اضافه داره که باعث می شه موقع نوشتن تصویر جدید،‌ بیخیال این بشیم که قبلا این تصویر چه ابعادی داشته و کلا یک تصویر جدید با این اطلاعات جدید بسازیم.

برای سمت راست هم:

$ convert 1-25.png -crop 1240×1754+1240+0 +repage 1-25a.png

که خب مثل قبلی است ولی می گه از وسط عرض شروع کنه به بریدن که در نتیجه خروجی می شه ستون سمت راست (اسمش رو می ذاریم a).

حالا که با یک صفحه تونستم اینکار رو بکنم، باید با همه صفحات بتونم. کافیه دستور find که می تونه یکسری فایل رو بهم بده رو تست کنم:

$ find . -name “1-*” -exec convert \{\} -crop 1240×1754+0+0 +repage \{\}b.png \;

دستور فایند همه فایل های توی این شاخه که اسمشون شبیه اسم کتاب من هست رو پیدا می کنه و بعد در بخش exec اونها رو یکی یکی می ده به دستوری که بالا داشتیم (کانورت). حالا عین همین رو بعد از جدا کردن فایل های تازه وارد، برای صفحات سمت راست هم اجرا می کنم:

$ find . -name “1-*” -exec convert \{\} -crop 1240×1754+1240+0 +repage \{\}a.png \;

و بعد می رسم به مجموعه ای فایل‌ها که به ترتیب حروف الفبا،‌ صفحات کتاب هستن:

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

$ convert 1*png jeld1.pdf

اوه شکست موقت خوردیم! ترتیب صفحات قاطی پاتی شده. من دقیق نمی‌دونم باید چیکار کنم پس یک راه کثیف سریع که بلدم رو استفاده می کنم! می دونم دستور دایرکتوری گیری یک سوییچ داره به اسم v که به ترتیب معقول مثل آدم سورت می کنه (پس بیخود نبود که از اسم a و b برای ستون راست و چپ استفاده کردیم ;) ). حالا ls رو با v به همراه سوییچ 1 که هر فایل رو در یک خط نشون می ده می زنم و خروجی رو می دم به xargs echo که کل اینها رو پشت هم نشون بده. می شه این:

می دونم کثیفه ولی یکبار در تاریخ می شه تحملش کرد و تازه جا داره دوستان پیشنهادات بهتر بدن! حالا کافیه این تیکه رو کپی پیست کنم جلوی یک دستور کانورت و آخرش هم اسم فایل خروجی رو بدم.. داریم:

$ convert 1-0.pnga.png 1-0.pngb.png 1-1.pnga.png 1-1.pngb.png 1-2.pnga.png 1-2.pngb.png 1-3.pnga.png 1-3.pngb.png 1-4.pnga.png 1-4.pngb.png 1-5.pnga.png 1-5.pngb.png 1-6.pnga.png 1-6.pngb.png 1-7.pnga.png 1-7.pngb.png 1-8.pnga.png 1-8.pngb.png 1-9.pnga.png 1-9.pngb.png 1-10.pnga.png 1-10.pngb.png 1-11.pnga.png 1-11.pngb.png 1-12.pnga.png 1-12.pngb.png 1-13.pnga.png 1-13.pngb.png 1-14.pnga.png 1-14.pngb.png 1-15.pnga.png 1-15.pngb.png 1-16.pnga.png 1-16.pngb.png 1-17.pnga.png 1-17.pngb.png 1-18.pnga.png 1-18.pngb.png 1-19.pnga.png 1-19.pngb.png 1-20.pnga.png 1-20.pngb.png 1-21.pnga.png 1-21.pngb.png 1-22.pnga.png 1-22.pngb.png 1-23.pnga.png 1-23.pngb.png 1-24.pnga.png 1-24.pngb.png 1-25.pnga.png 1-25.pngb.png 1-26.pnga.png 1-26.pngb.png 1-27.pnga.png 1-27.pngb.png 1-28.pnga.png 1-28.pngb.png 1-29.pnga.png 1-29.pngb.png 1-30.pnga.png 1-30.pngb.png 1-31.pnga.png 1-31.pngb.png 1-32.pnga.png 1-32.pngb.png 1-33.pnga.png 1-33.pngb.png 1-34.pnga.png 1-34.pngb.png 1-35.pnga.png 1-35.pngb.png 1-36.pnga.png 1-36.pngb.png 1-37.pnga.png 1-37.pngb.png 1-38.pnga.png 1-38.pngb.png 1-39.pnga.png 1-39.pngb.png 1-40.pnga.png 1-40.pngb.png 1-41.pnga.png 1-41.pngb.png 1-42.pnga.png 1-42.pngb.png 1-43.pnga.png 1-43.pngb.png 1-44.pnga.png 1-44.pngb.png 1-45.pnga.png 1-45.pngb.png 1-46.pnga.png 1-46.pngb.png 1-47.pnga.png 1-47.pngb.png 1-48.pnga.png 1-48.pngb.png 1-49.pnga.png 1-49.pngb.png 1-50.pnga.png 1-50.pngb.png 1-51.pnga.png 1-51.pngb.png 1-52.pnga.png 1-52.pngb.png 1-53.pnga.png 1-53.pngb.png 1-54.pnga.png 1-54.pngb.png 1-55.pnga.png 1-55.pngb.png 1-56.pnga.png 1-56.pngb.png 1-57.pnga.png 1-57.pngb.png 1-58.pnga.png 1-58.pngb.png 1-59.pnga.png 1-59.pngb.png 1-60.pnga.png 1-60.pngb.png 1-61.pnga.png 1-61.pngb.png 1-62.pnga.png 1-62.pngb.png 1-63.pnga.png 1-63.pngb.png 1-64.pnga.png 1-64.pngb.png 1-65.pnga.png 1-65.pngb.png 1-66.pnga.png 1-66.pngb.png 1-67.pnga.png 1-67.pngb.png 1-68.pnga.png 1-68.pngb.png 1-69.pnga.png 1-69.pngb.png 1-70.pnga.png 1-70.pngb.png 1-71.pnga.png 1-71.pngb.png 1-72.pnga.png 1-72.pngb.png 1-73.pnga.png 1-73.pngb.png 1-74.pnga.png 1-74.pngb.png 1-75.pnga.png 1-75.pngb.png 1-76.pnga.png 1-76.pngb.png 1-77.pnga.png 1-77.pngb.png 1-78.pnga.png 1-78.pngb.png 1-79.pnga.png 1-79.pngb.png 1-80.pnga.png 1-80.pngb.png 1-81.pnga.png 1-81.pngb.png 1-82.pnga.png 1-82.pngb.png 1-83.pnga.png 1-83.pngb.png 1-84.pnga.png 1-84.pngb.png 1-85.pnga.png 1-85.pngb.png 1-86.pnga.png 1-86.pngb.png 1-87.pnga.png 1-87.pngb.png 1-88.pnga.png 1-88.pngb.png 1-89.pnga.png 1-89.pngb.png 1-90.pnga.png 1-90.pngb.png 1-91.pnga.png 1-91.pngb.png 1-92.pnga.png 1-92.pngb.png 1-93.pnga.png 1-93.pngb.png 1-94.pnga.png 1-94.pngb.png 1-95.pnga.png 1-95.pngb.png 1-96.pnga.png 1-96.pngb.png 1-97.pnga.png 1-97.pngb.png 1-98.pnga.png 1-98.pngb.png 1-99.pnga.png 1-99.pngb.png 1-100.pnga.png 1-100.pngb.png 1-101.pnga.png 1-101.pngb.png 1-102.pnga.png 1-102.pngb.png 1-103.pnga.png 1-103.pngb.png 1-104.pnga.png 1-104.pngb.png 1-105.pnga.png 1-105.pngb.png 1-106.pnga.png 1-106.pngb.png 1-107.pnga.png 1-107.pngb.png 1-108.pnga.png 1-108.pngb.png 1-109.pnga.png 1-109.pngb.png 1-110.pnga.png 1-110.pngb.png 1-111.pnga.png 1-111.pngb.png 1-112.pnga.png 1-112.pngb.png 1-113.pnga.png 1-113.pngb.png 1-114.pnga.png 1-114.pngb.png 1-115.pnga.png 1-115.pngb.png 1-116.pnga.png 1-116.pngb.png 1-117.pnga.png 1-117.pngb.png 1-118.pnga.png 1-118.pngb.png 1-119.pnga.png 1-119.pngb.png 1-120.pnga.png 1-120.pngb.png 1-121.pnga.png 1-121.pngb.png 1-122.pnga.png 1-122.pngb.png 1-123.pnga.png 1-123.pngb.png 1-124.pnga.png 1-124.pngb.png 1-125.pnga.png 1-125.pngb.png 1-126.pnga.png 1-126.pngb.png 1-127.pnga.png 1-127.pngb.png 1-128.pnga.png 1-128.pngb.png 1-129.pnga.png 1-129.pngb.png 1-130.pnga.png 1-130.pngb.png 1-131.pnga.png 1-131.pngb.png 1-132.pnga.png 1-132.pngb.png 1-133.pnga.png 1-133.pngb.png 1-134.pnga.png 1-134.pngb.png 1-135.pnga.png 1-135.pngb.png 1-136.pnga.png 1-136.pngb.png 1-137.pnga.png 1-137.pngb.png 1-138.pnga.png 1-138.pngb.png 1-139.pnga.png 1-139.pngb.png 1-140.pnga.png 1-140.pngb.png 1-141.pnga.png 1-141.pngb.png 1-142.pnga.png 1-142.pngb.png 1-143.pnga.png 1-143.pngb.png 1-144.pnga.png 1-144.pngb.png 1-145.pnga.png 1-145.pngb.png 1-146.pnga.png 1-146.pngb.png jeld1.pdf

و حالا بعد از نیم ساعت کار یک کتاب دارم که جوری است که راحت می تونم بخونمش (:

صاحب ابزار خوب بودن فوق العاده نیست؟

توضیح لازم

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

کتاب داستان پداگوژیکی است، که تا مدت محدودی برای دانلود می ذارمشون اینجا: جلد یک و جلد دو

چرا گنو/لینوکس رو دوست دارم: انتقال کلی کتاب به پوشه هم نامشون

یک دوست ایمیل زده که:

۱۲۰۰ تا کتاب دارم که همه در یک دایرکتوری هستن. می خوام یک دایرکتوری برای هر یک کتاب ساخته بشه و کتاب بره توی دایرکتوری خودش. یعنی می خوام ۱۲۰۰ تا دایرکتوری بسازم و هر کتاب رو کپی کنم سر جاش.

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

jadi@freebasse:/tmp/books$ cat ../p.sh
#!/bin/bash

SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
for f in books/*
do
  mkdir "$f"_dir
  mv "$f" "$f"_dir/
  echo "$f"
done
IFS=$SAVEIFS

یک حلقه for است که همه فایل ها رو یکی یکی می ندازه وسط دایره. هر کی وسط باشه اول یک فولدر براش ساخته می شه با _dir و بعد یک mv روش اجرا می شه و خلاص. اون IFS متغیری است که توی بش تعریف می کنه جدا کننده فیلدها از هم باید چی باشه. معمولا اسپیس است اما چون اینجا ممکنه اسم فایل توش اسپیس داشته باشه، کردیمش «سرخط».

نکته: دوستم بعد از گرفتن این گفت که کامپیوتر ویندوزی است (: کماکان راحته. کافیه یک اوبونتو یا هر توزیع لینوکس دیگه دانلود کنید، روی یو اس بی نصبش کنین و لایو بوت کنین و این کارها رو انجام بدین و دوباره بوت کنین و برگردین توی ویندوز عزیز. مثل همیشه: بک آپ فراموش نشه!

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


find -type f -exec mkdir '{}'.tmp \; -exec mv '{}' '{}'.tmp \; -exec mv '{}'.tmp '{}' \;

که فقط یک دستور است. دستور find می تونه چیزهای مختلف رو پیدا کنه و اینجا با سوییچ f دنبال فایل می گرده. بعد روی تک تک اون فایل ها چیزی که جلوی سوییچ exec هست رو اجرا می کنه و هر بار به جای {} یکی از فایل های پیدا شده رو می ذاره. در نهایت هم اسلش سمی کالن می گه چیزی که جلوی سوییچ exec بوده تموم شده.