وبلاگ محسن

۶ مطلب با کلمه‌ی کلیدی «پایتون» ثبت شده است

ساخت پسورد با روش اشنایر

| يكشنبه, ۲ شهریور ۱۳۹۳، ۱۱:۲۱ ب.ظ

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

به نظر من، جالبترین روش برای ساختن پسورد های امن، توسط بروس اشنایر ارائه شده بود. 

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

 

#!/usr/bin/python3 
import random

sent = str(input('sentence: '))
punctuation ="#$!&*+.?_~" 
rand = random.Random()
# کلمه ها رو از جمله جدا و بعد وارد لیست می‌کنه
words = sent.split()
# به طور رندوم یه کارکتر از punctuation انتخاب و در اول پسورد قرار میده
print(punctuation[rand.randint(0, 10)], end='')
for i in range(0, len(words)):
    if words[i][0] == 'i':
        print('1', end='')    
    elif 2 <= len(words[i]) <= 3:
        print(words[i], end='')   
    elif words[i][0] == 'a':
        print('@', end='')
    elif words[i][0] == 'l':
        print('|', end='')
# کارکتر ها کوچک رو یک در میون به بزرگ، یا بر عکس تبدیل می‌کنه
    else:
        if i%2 ==0:
            print(words[i][0].swapcase(), end='')
        else:
            print(words[i][0], end='')
print('\n')

دیروز بود که به طور کاملا اتفاقی به یه مقاله مفید در انجمن فارسی اوبونتو راجع به دانلود منیجر aria2c برخوردم که طرز استفاده بهینه ش رو آموزش میداد.

 

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

 

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

 

 

مشکلترین قسمت ماجرا اونجایی که ما باید حجم فایلی رو که می خوایم دانلود کنیم بدست بیاریم و باور کنید اون لحظه کوچکترین ایده برای حلش نداشتم. اما میدونستم که کتابخونه پایتون ماژولی داره به اسم urllib.request که یه ربطی به مسئله ما داره. با رفتن به کانال آی آر سی python# و چند بار پرسش و پاسخ متوجه شدم که هر فایل موجود در اینترنت خاصیتی به نام header داره که خصوصیات فایل رو که شامل سایز فایل هم میشه اونجا دخیره می کنن و با یه متد ساده از کلاس urllib.request میشه بهش دسترسی پیدا کرد.

 

با این اطلاعات اسکریپت زیر رو نوشتم:

#!/usr/bin/python3
import urllib.request
import os
import sys
def get(url):
    file_url = urllib.request.urlopen(url)
    size = int(file_url.getheader("Content-Length"))
    conn = (size / 1000000) / 16
    if conn < 1:
        conn = 1
    os.system('aria2c -s16 -x16 -k' + str(round(conn)) + 'M \"' + url + '\"')
if len(sys.argv) > 1:
    get(url=sys.argv[1])
else:
    print('Usage: download FileUrl')
در مورد خط شیشم باید بگم برای کار با url ها در پایتون باید اول به وسیله این متد بازش کنید.
متغییر conn هم سایز فایل رو که مقدارش به octet! هست رو  به مگ تبدیل می کنه و بقیه چیزا هم که واضحه :)
(اگر نمی دونید octet چیه غصه نخورید چون منم تازه فهمیدم همچین واحد حافظه ایی هست!)

اگر فکر می‌کنید این اسکریپت به دردتون می‌خوره، اونو تو یه فایل متنی ذخیره کنید و  به یکی از دایرکتوری هایی که خروجی زیر تولید می‌کنه منتقل کنید:

 

echo $PATH

توصیه میشه اسکریپت هایی که خودتون می‌نویسید رو به local/bin./~ منتقل کنید.

پ.ن: می‌دونید که؛ ~ یا همون تیلدا به معنی home/ 

یازده هزار ایمیل را با نُه خط کد پایتون پاک کنید!

| چهارشنبه, ۲۸ خرداد ۱۳۹۳، ۱۰:۲۰ ق.ظ
تقریبا دوازده سال پیش من اولین اکانت ایمیلمو تو سایت یاهو باز کردم و بعد از یه مدت استفاده رهاش کردم. حالا بعد از این همه سال به یه اکانت یاهو احنیاج دارم و وقتی به اینباکسم نگاه می‌کنم، می‌بینم که پر شده از ایمیل های مزخرف و تبلیغاتی. اونم نه یکی دوتا،‌ یازده هزار!
 
 
مشخصه که با این اینباکس شلوغ نمی تونم کار کنم. از طرفی دوست ندارم یه اکانت جدید باز کنم پس تنها راهی که باقی میمونه پاک کردنِ. در پاک کردن دستی، سرویس یاهو اجازه حذف فقط پنجاه ایمیل رو میده که با یه حساب کوچیک معلوم میشه باید بیش از ۴۴۰ کلیک موس کنم تا همه ی ایمیل ها پاک بشن و امکان نداره من همچین کار احمقانه ی انجام بدمangry
 
و خدا رو شکر که ما سیستم عاملی به نام گنو لینوکس داریم که پایتون out of the box روش نصبه و تمام این هرزنامه ها رو برامون پاک می کنه. اونم با نُه خط:
 
#!/usr/bin/python3 
import imaplib
connection = imaplib.IMAP4_SSL('imap.mail.yahoo.com')
connection.login('mohsen_rashidi2002@yahoo.com', 'password')
connection.select()
trash, emails = connection.search(None, 'all')
for i in emails[0].split():
    connection.store(i, '+FLAGS', '\\Deleted')
connection.expunge()

 

همون طور که می‌بینید، اسکریپت خیلی ساده ست و چیزی بیشتر از استفاده از چند تا متد ماژول imaplib نیست.

در خط سوم یه شیء به اسم connection از کلاس imaplib.IMAP4 درست کردیم و آدرس imap سرور یاهو رو بهش دادیم. در خط چهارم مشخصات اکانت رو برای لاگین وارد کردیم.

 

در توضیح پنجمین خط باید بگم هر اکانت ایمیل از تعدادی دایرکتوری تشکیل شده. مثل دایرکتوری inbox, sent, draft و ... . و کد ما در آن واحد میتونه رو یکی از اینا اجرا بشه. پس حالا که می خوایم با دایرکتوری اینباکس کار کنیم باید مسیرمون رو بهش تغییر بدیم و متد select همین کار رو انجام میده و اگر می‌بینید که بهش آرگومان ندادم به این خاطره که پارامتر پیشفرضش مقدار inbox رو داره.

 

تو خط بعدی دو تا متغیر به اسم trash و email می بینیم که به متد search نسبت داده شدن. متد سرچ کارش پیدا کردن ایمیل های موجود بر اساس الگوی داده شده ست که ما اینجا الگو رو None دادیم و آرگومان دوم مشخص می کنه که چه تعداد ایمیل رو بگرده که ما همه اونها رو خواستیم. مقداری که این متد بر می گردونه شامل یه لیست با دو عنصره که عنصر اول برابر رشته ok و عنصر دوم شماره و یا در اصل کد مربوط به هر ایمیل موجودِ. با استفاده از یه متغیر اضافی به اسم trash ما رشته ok رو از لیست جدا می کنیم و ادامه میدیم.

 

خط هفتم هم یه حلقه for برای پیمایش شماره ایمیل هاست که هر بار i رو به یکی از اونها نسبت میده. اما داخل حلقه از متد store استفاده کردم که کارش نشانه گذاری (flag) روی ایمیل هاست. و همون طور که می بینید نشانه delete رو روی تمام ایمیل ها قرار میده.

 

و خط آخر می گه همشون رو برای همیشه پاک کنlaugh

 

 

اجرای این اسکریپت حدود یک ساعت و نیم زمان برد که من به جای خیره شدن به مانیتور و ۴۴۰ بار کلیک روی چکباس و دکمه دیلیت یه فیلم خوب دیدم;-)

 

پ.ن: مستندات ماژول imaplib

دیروز به ابزاری احتیاج داشتم که کل سیستم عامل رو برام بگرده و فایل های jpg رو تو یه دایرکتوری کپی کنه.
راستش برنامه خط فرمانی به خصوصی براش سراغ نداشتم، البته اگر یکم می گشتم حتما پیدا می کردم اما تصمیم گرفتم وقتی رو که برای پیدا کردن می خوام بذارم برای ساختن صرف کنم که نتیجش شد اسکریپت زیر:
#!/usr/bin/python3
import os, sys


def gather(src=None, dis=None, file_type=None):
    if not os.path.exists(dis):
        os.mkdir(dis)


    for i in os.popen('find ' + str(src) + ' -type f | grep '+ str(file_type) + '$'):
        os.system('cp  \"' + i.strip() + '\" ' + str(dis))


if len(sys.argv) > 1:
	gather(src=sys.argv[1], dis=sys.argv[2], file_type=sys.argv[3])
else:
    print('Usage: gather sourcepath destinationpath filetype')
    exit()


اسم اسکریپت رو gather می ذارم و با دستور chmod +x gather اگزکیوتیبلش میکنم و به دایرکتوری usr/bin/ منتقلش می کنم و از این به بعد هر وقت همچین چیزی خواستم فقط از ترمینال صداش می کنم.


اسکریپت اعداد ابجد با پایتون

| پنجشنبه, ۱۹ دی ۱۳۹۲، ۰۷:۳۶ ب.ظ

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

قبل از دیدن کد شاید بد نباشه از طرز کار ابجد سر در بیاریم.

در سیستم ابجد حرکات حروف،فاصله بین کلمات و همینطور تشدید ارزشی ندارن؛ یعنی محاسبه نمیشن. برای محاسبه ارزش ابجدی هم به این صورت عمل می کنیم که حروف یه کلمه رو جدا میکنیم و ارزش هر حرف رو با ارزش حرف بعدی جمع می کنیم. برای  مثال کلمه مقدس علی، ابجدش به این صورت حساب میشه:

ع ل ی : ۷۰ +‌ ۳۰ + ۱۰ = ۱۱۰

حالا با چیری که فهمیدیم نگاه کردن به کد زیر خیلی راحتره : 

#!/usr/bin/python3
d = {}

abjad1 = 'ابجدهوزحط'
value1 = 1

abjad2 = 'یکلمنسعفص'
value2 = 10

abjad3 = 'قرشتثخذضظ'
value3 = 100

for i in abjad1:
    d[i] = value1
    value1 += 1
for i in abjad2:
    d[i] = value2
    value2 += 10
for i in abjad3:
    d[i] = value3
    value3 += 100
d['غ'] = 1000
while True:
    name = str(input('enter arabic name: '))
    abjad = 0
    for i in name:
        if d.__contains__(i):
            abjad += d[i]
        else:
            print('Please enter Arabic letters')
            continue
    print('The Result = ',abjad)
    if name == '0':
        break

چیزی که یادم رفت زودتر بگم اینه که حروف در سیستم ابجد به سه گروه تقسیم میشن. ارزش حروف گروه اول یکی یکی، ارزش حروف گروه دوم ده تا ده تا و ارزش حروف گروه سوم صد تا صد تا بالا میره و در نهایت حرف «غ» رو داریم که ارزشی معادل ۱۰۰۰ داره.

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

حالا برای اینکه از کار تکراری نکنیم با چند تا حلقه for یکی یکی ارزش حروف رو بهشون می دیم و تو دیکشنری ذخیره می کنیم.

در قسمت پایانی هم یه اسم رو می گیریم و با همون الگوریتم محاسبه اعداد ابجد، خروجی رو نشون می دیم.

ایده برنامه نویسی از سایت اوبونتو

| دوشنبه, ۲۲ مهر ۱۳۹۲، ۰۸:۵۷ ق.ظ

دیروز تو بخش برنامه سازی انجمن اوبونتو، یکی از کاربرا پستی زده بود راجع به اسکریپت تبدیل اعداد به حروف( مثلا۱۲ -> دوازده) به زبان php. منم اول فکر کردم این کاربر عزیز دنبال همچین سورسی می گرده، برای همین فکر نوشتنش به سرم زد (البته به زبون پایتون چون php بلد نیستم) و گفتم هم تمرینی برای خودم و هم شاید کار این بنده خدا راه بیوفته. واسه همین آستینا رو بالا زدم و شروع به نوشتنش کردم. 

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

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


#!/usr/bin/python3
#######################
def num_counting(num):
	c = 0
	while (num >=10):
		num /= 10
		c+=1
	return c+1
#######################
def two_numbers(num):
	F = num // 10
	M = num % 10
	for i in range(1,10):
		if i == F:
			for j in range(1,10):
				if j == M:
					return do[i],'va',yek[j]
def three_numbers(num):
	F = num // 100
	for i in range(1,10):
		if  i == F:	
			return se[i],"va",two_numbers(NUM % 100) 
yek = {1 : 'yek',
	2 : 'do',
	3 : 'se',
	4 : 'chahar',
	5 : 'pang',
	6 : 'shesh',
	7 : 'haft',
	8 : 'hasht',
	9 : 'noh',
}
do = { 1 : 'dah',
	2 : 'bist',
	3 : 'si',
	4 : 'chehel',
	5 : 'panjah',
	6 : 'shast',
	7 : 'haftad',
	8 : 'hashtad',
	9 : 'navad',
}
se = { 1 : 'sad',
	2 : 'devist',
	3 : 'sisad',
	4 : 'chaharsad',
	5 : 'pansad',
	6 : 'sheshsad',
	7 : 'haftsad',
	8 : 'hashtsad',
	9 : 'nohsad',
}
################

NUM = int(input("enter the number: "))
if (num_counting(NUM) == 1):
	for i in range(1,10):
		if i == NUM:
			print(yek[i])
elif (num_counting(NUM) == 2):
	print(two_numbers(NUM))
elif (num_counting(NUM) == 3):
	print(three_numbers(NUM))
elif (num_counting(NUM) == 4):
	F = NUM // 1000
	for i in range(1,10):
		if i == F:
			print(yek[i],'hezar va',three_numbers(NUM % 1000))

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


ضمنا اگر برنامه نویس حرفه ایی هستید لطفا به من بد و بیراه نگید. ما هنوز تازه کاریم ;-)