چرا گنو لینوکس رو دوست دارم: دانلود کردن خودکار هر فصل جدید به محض انتشار

سعید پرسیده:

سلام جادی جان.
یه سوال داشتم ازت.
من چند مدته دارم آموزش سی شارپ رو یاد میگیرم از طریق سایت webtarget.ir
و اینجوریه که هر از چند مدت یه آموزش میزاره و من دنبال میکنم. میخ,استم بدونم راهی هست که من بدون اینکه مراجعه کنم به سایت و هر دفعه فایل های پی دی اف رو دانلود کنم بتونم با یه اسکریپت یا یه کد توی ترمینال تمام آموزهای سی شارپ رو توی یه فولدر دانلود کنم؟
ضمنا اینم آدرس یکی از فایل های پی دی اف آموزش سی شارپ هست و جاهایی که هر دفعه تغییر میکنه رو توی لینک دوم با ستاره برات مشخص میکنم.
http://dl.webtarget.ir/027-cSharpTime/session-33/cSharpTimeSession-33.pdf
http://dl.webtarget.ir/027-cSharpTime/session-**/cSharpTimeSession-**.pdf

خب.. سوال های اینجوری مثل یک پازل یا جدول بامزه هستن که جلوی تلویزیون لم می دیم و حلشون می کنیم. البته از نظر عقلی این سایت باید حتما RSS داشته باشه که بشه به سادگی دنبالش کرد ولی خب… ایده شما چیه؟ ایده من اینه که کافیه یکی از این فایل ها توی یک دایرکتوری باشه و ما روزی یکبار از اون دایرکتوری ls بگیریم و در آخرین فایل دانلود شده (بالاترین عدد در اسم ها) نگاه کنیم و عدد فایل رو جدا کنیم و بهش یکی اضافه کنیم و دانلودش کنیم. اگر فایل جدیدی بود دانلود می شه و اگر نبود چیزی دانلود نمی شه. فردا هم روز از نو روزی از نو.

برنامه ساده می شه این:

#!/usr/bin/python

import os, re

# یک ال.اس. می گیرم از فایل های مشابه اون کتاب و سورت و خط آخر رو جدا می کنم
f = os.popen('ls -1  cSharp*pdf | sort | tail -1')
lastdl = f.read()
# متغیر حاوی بخشی از اسم فایل است که عدد سریال توش قرار داره + ۱
lastNum = str(int(re.search ('cSharpTimeSession-(\d+).pdf', lastdl).group(1))+1)

# یک کامند می سازم که با دبلیوگِت شماره بعدی رو دانلود می کنه	
dlCommand = "wget http://dl.webtarget.ir/027-cSharpTime/session-" \
			+ lastNum + "/cSharpTimeSession-" \
			+ lastNum + ".pdf"
# اجراش می کنم
f = os.popen(dlCommand)

و البته اگر بخوایم به حالت های خاص جواب بدیم و مثلا خودمون اگر هیچ فایلی نبود به اولین فایل یک عدد بدیم (ظاهرا در سایتشون اولین نسخه شماره ۰۴ است) یا اگر زیر ۹ بودیم یک صفر اولش اضافه کنیم و … برنامه می شه این:

#!/usr/bin/python

import os, re

try:
	f = os.popen('ls -1  cSharp*pdf | sort | tail -1')
	lastdl = f.read()
	lastNum = int(re.search ('cSharpTimeSession-(\d+).pdf', lastdl).group(1))
except:
	lastNum = 3 #first file there is 4. so we'll assume that the current one is 3
	
if lastNum < 9:
	lastNum = "0" + str(lastNum+1)
else:
	lastNum = str (lastNum + 1)
	
dlCommand = "wget http://dl.webtarget.ir/027-cSharpTime/session-" \
			+ lastNum + "/cSharpTimeSession-" \
			+ lastNum + ".pdf"
f = os.popen(dlCommand)

منطقا این رو باید در یک کرون بذاریم یا سری اول با تکنیک watch python ./autodlcSharpbook.py دانلودش کنم که همه شماره ها رو بگیره یا مثلا اگر خروجی دستور موفقیت آمیز بود یک ایمیل بزنیم به صاحب جریان که فایل بهش اتچ باشه یا چنین چیزهایی. اونش با شما و سلیقه‌های شخصی‌تون.

پ.ن. اینم من حین نوشتن این برنامه. اصلا دلیلی که الان نوشتم این بود که دو تا مانیتور داشتم. فردا باید مانیتورم رو تحویل بدم ولی باید درخواست یک مانیتور اضافی بکنم. به نظرم هیچ چیز به اندازه دو - یا بیشتر - مانیتور کامپیوتر رو برای یک گیک لذت بخش نمی کنه. احتمالا عددی به اسم w وجود داره که اینطوری تعریف می شه «تعداد مانیتوری که یک سیستم ویندوزی باید داشته باشه تا یک علاقمند لینوکس با لذت پشتش بشینه و کار کنه»

jadi_while_programming

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

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

برنامه پایتون رو اینطوری تغییر می‌دم:

#!/usr/bin/python
# -*- 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();

wordCount = {}

for child in root.iter('item'):
	date = child.find('wppost_date').text[:7] #find the year and month
	body = child.find('content_encoded').text # post content
	title = child.find('title').text 	  # post title

	try:
		fulltext = title + "\n" + body # all the text in the post = title + body
	except:
		pass

	fulltext = re.sub(ur'[_»«"\'&?؟a-zA-Z‌0-9/=.*+\n-%<>:;،؛,\-)(،۱۲۳۴۵۶۷۸۹۰]', ' ', fulltext) #replace extra chars
	words = fulltext.split() # words is a list of all words in this post

	for word in words:
		wordCount[word] = wordCount.get(word, 0) + 1 # wordCount[word]++

for word in wordCount:
	thisLine = (str(wordCount[word]) + "\t" + word)
	print thisLine.encode("utf-8", "ignore")


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

...
4	همسرش
1	آکر
3	خرمش
1	ویسمن
2	خرما
1	یکباری
1	مانغو
2	احساسم
1	عصبي
61	رشد
1	رشت
1	تریلیان
5	همسرم
32	هیات
1	پورتال
2	پیشانی
6	مدیربسته
4	لری
4	وجدان
...


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

jadi@jeducation:~/Downloads/weblog_word_usage$ ./count_all_words.py | wc -l
27880


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

jadi@jeducation:~/Downloads/weblog_word_usage$ ./count_all_words.py | wc -l
23405


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

jadi@jeducation:~/Downloads/weblog_word_usage$ ./count_all_words.py | sort -n -r | head -20

خروجی رو براتون نمی‌ذارم چون فقط یکسری حرف ربط بی ربط است.

پروژه جانبی بسیار مهم برای زبان فارسی: همه زبان‌ها یک فایل دارن به اسم نمی دونم چی (کسی می‌دونست لطفا بگه) که توش کلمات «بی ربط» اون زبان نوشته شدن. به اصطلاح همون am و is و are یا امثال «است» و «شد» و «و» و «یا» و … که در اینجور جاها کاربرد داره (می شه اون کلمات رو از فهرست این کلمات که برنامه بهمون داده حذف کرد تا کلمات اختصاصی من به دست بیاد و نه چیزهایی که برای جمله ساختن همه استفاده می کنن). آیا چنین فایلی داریم برای زبان فارسی؟ تو خارجی‌ها اسمش چیه؟

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

پ.ن. این مجموعه مهمل ، یک قسمت دیگه هم داره (: کمی دیرتر ولی.