وبلاگ محسن

۱۰ مطلب با کلمه‌ی کلیدی «برنامه نویسی» ثبت شده است

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

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

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

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

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

 

#!/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

Hello World در زبون های مختلف

| شنبه, ۲۴ خرداد ۱۳۹۳، ۰۹:۰۶ ب.ظ

 

ضمنا اگر فکر می‌کنید با تعداد زیادی از زبون های برنامه  سازی آشنایی دارید لازمه یه سر به این سایت بزنیدwink

دیروز به ابزاری احتیاج داشتم که کل سیستم عامل رو برام بگرده و فایل های 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))

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


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

زندگی برنامه نویسان...

| سه شنبه, ۲۷ فروردين ۱۳۹۲، ۰۶:۰۳ ق.ظ

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

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

لذت ببرید


وقتی،چیزی که جمعه کار می‌کرده دوشنبه کار نمی کنه



وقتی می‌خوام به توسعه کدی که کامنت گذاری نکردم برگردم



وقتی یه باگ ،‌ در حال نمایش برنامه صداش در نمیادافزودن تصویر از فضای اختصاصی



وقتی یه تازه وارد پیشنهاد میده یه فیچر جدید به پروژه اضافه کنیم



وقتی رئیس میگه «اگر پروژه رو قبل از موعد تموم کنید پاداش می‌گیرید»



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



وقتی مدیر پروژه یه دفه به مانیتورم نگاه می‌کنه



وقتی کاری میکنم که جای 200 خط الگوریتم ، با ۱۰ خط عوض بشه



وقتی که رئیس باید جلو دعوای کارمندا رو بگیره



وقتی یه روز تمام رو یه باگ کار کردم و بدون اینکه درستش کنم دارم می‌رم خونه



وقتی تمام تیم می‌خواد از netbeans استفاده کنه ولی یه تازه وارد از eclipse



وقتی که ریسک می‌کنم و از یه کتابخونه جدید استفاده میکنم و خوب کار می‌کنه



وقتی که می‌شنوم یه نفر میگه که سمیکالون تو جاوا اسکریپت اختیاریه



وقتی یه چیز مهمی رو تو سرور پروداکشن تعمیر می‌کنم



وقتی برای اولین بار می‌شنوم که PHP پر استفاده ترین زبان برنامه نویسی در سمت سروره



شاد باشن :)

  • ۱ نظر
  • ۲۷ فروردين ۹۲ ، ۰۶:۰۳

یک برنامه کوچک!

| يكشنبه, ۲۵ فروردين ۱۳۹۲، ۰۷:۴۷ ب.ظ

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

میدونم زیادی ساده ست ولی بهر حال ما هم مبتدیم دیگه.


#include <iostream>
#include <string.h>
using namespace std;
class book {
	public:
		string name;
		string author;
		int page;
};
void index(string bn,book b[],int n) {
	for (int i=0;i<n;i++) {
		if (bn == b[i].name) { 
			cout << "Name of author : " << b[i].author << "   Number of pages : " << b[i].page << "\n";
		}
	}
	
}
string input_name;
int main() {
	int i,size;
	cout << "enter the number of books : ";
	cin >> size;
	book a[size];
	for (i=0;i < size;i++) {
		cout << "enter the name of the book : ";
		cin >> a[i].name;
		cout << "enter the name of author : ";
		cin >> a[i].author;
		cout << "enter the number of pages : ";
		cin >> a[i].page;
		cout << "------------------------------\n";
	}
	cout << "\n=====================================\n"
		<< "the information has been placed in database.\n"
		<< "enter the name of books in order to find their information\n\n";
	cout << "enter the title : ";
	cin >> input_name;
	index(input_name,a,3);
	
	return 0;
}


  • ۰ نظر
  • ۲۵ فروردين ۹۲ ، ۱۹:۴۷

چطور فدورا رو آماده برنامه نویسی کنیم؟

| دوشنبه, ۱۹ فروردين ۱۳۹۲، ۱۲:۲۱ ب.ظ
من معتقدم اگر می خواین با لینوکس کار کنین باید یکی از این دو نفر باشید:
یا کسی که تمام زندگیش تو اینترنت خلاصه میشه؛چون با استفاده از لینوکس خودش رو برای همیشه از شر تمام بدافزار ها راحت کرده.
یا کسی که میخواد یه برنامه نویس حرفه ایی بشه.چون بهترین ابزار های ممکن برای توسعه نرم افزار ،اصلیت لینوکس دارن.
من تصمیم گرفتم تو دسته دوم باشم.
پس باید سیستم فدوراییم رو آماده این کار بکنم:
الان که دارم سی ++ یاد می گیرم مهم ترین چیزی که برای برنامه نویسیش می خوایم کامپایلر اون یعنی ++g ئه.پس با این دستور تو ترمینال اونو نصب می کنیم.
sudo yum install gcc-g++

چیزه دیگه ایی که میخوایم یه ادیتور ساده و در عین حال قدرتمنده که تمام نگاهها به سمت vim میره:

sudo yum install gvim

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


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

برای این کار کافیه کدی نوشته شده رو در یه مسیر دلخواه ذخیره کنید.بعد با استفاده از ترمینال به دایرکتوری که فایل cpp. وجود داره cd  کنید و اونجا این دستور رو تایپ کنید :

g++ Name_Of_Your_File.cpp

که بعد از اون یک فایل اجرایی در همون محل به اسم a.out ساخته میشه و برای اجرا کردنش کافیه دوباره به ترمینال رجوع کنیم و دستور 

./a.out

وارد کنیم.

اما گاهی پیش میاد که دوست دارید فایل اجراییتون با اسمی غیر از a.out ذخیره بشه.برای این منظور از سوویچ o- استفاده میکنیم:

g++ Name_Of_Your_File.cpp -o Name_Of_Your_File

دیدید چه راحته؟

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

  • ۰ نظر
  • ۱۹ فروردين ۹۲ ، ۱۲:۲۱