You are here

سیاره‌ی مشهدلاگ

ارایه با موضوع موتور جستجوری توزیع‌شده یاسی

چند وقت پیش توی لاگ مشهد یک ارایه با موضوع موتور جستجوی توزیع شده یاسی (Yacy) داشتم. اسلاید‌های این ارایه رو می‌تونید اینجا ببینید و در صورت نیاز دانلود کنید.

Categories:

چجوری برای سایت the coding love‌ کانال تلگرام درست کردم

دست نوشته‌های حامد - Fri, 03/10/2017 - 19:17

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

احتمالا اگه شما جای من بودین تصمیم میگرفتین از آخرین گیفی که تو سایت the coding love (از این به بعد خلاصش میکنم به tcl) گذاشته شده شروع کنین و فقط گیف‌های جدید رو اضافه کنین ولی من نمی‌خواستم این کار رو بکنم 🙂 تصمیم گرفتم اول از همه هرچی گیف تو سایت tcl‌ هست رو بذارم رو کانال و بعد از اون هم گیف های جدید رو بذارم. خب از اون جایی که یک بات قراره تو کانال پست بذاره پس اول نیاز به یک بات داریم، بات ساختن هم که کاری ندارهِ، فقط کافیه چندتا پیام به @BotFather بدیم تا باتمون ساخته بشه. چون بات قراره پشت صحنه فقط تو کانالمون پست بذاره پس اسم و توضیحات و بقیه مواردش مهم نیستن، فقط لازمه که یک بات داشته باشیم و توکنش برای این که مدیریتش کنیم. مرحله بعدی هم که مشخصه، ساخت کانالمون، کانالمون رو می‌سازیم و باتمون رو هم به عنوان مدیر بهش اضافه می‌کنیم. برای اضافه کردن بات به عنوان مدیر هم میریم تو بخش اضافه کردن ادمین جدید به کانالمون و از بخش جستجو اسم باتمون رو سرچ می‌کنیم و تمام! حالا کار اصلیمون شروع میشه، نوشته برنامه‌ای که توسط باتمون پست‌های tcl رو بذاره تو کانال! و تا یادم نرفته این نکته رو هم اضافه کنم که وقتی میخوایم با یک بات تو کانال پست بذاریم، chat_it میشه @bot_name.

 

همونطور که اول کار گفتم اول از همه می‌خوام تمام پست‌های tcl‌ رو بذارم رو  کانالی که ساختم و بعد برم سراغ پست‌های جدید. نکته جالبی که متوجه شدم این وسط این بود که تعداد صفحه های سایت tcl‌ روی ۷۷۵ ثابت مونده و صفحه آخر هم یک گیف ثابت داره که تغییر نمیکنه. بگذریم… اولین کاری که میکنم این هست که سورس هر ۷۷۵تا صفحه رو می‌گیرم و تو یه سری فایل که اسمشون از ۱ تا ۷۷۵ هست می‌ریزم تا سورس‌ها برای ادامه کار دم دستم باشن و به علاوه هر ۷۷۵تا صفحه سورسشون رو به صورت هم‌زمان می‌گیرم تا مطمئن بشم که اگه پست جدیدی در حین گرفتن سورس‌ها رو tcl‌ رفت تو سورس‌هایی که من گرفتم مشکلی ایجاد نمی‌شه و باعث نمیشه مثلا یک گیف چندبار تو سورس‌ها باشن. خب کدش میشه این (اگه واستون سواله این کدها چین، بش اسکریپت هستن):

for i in {1..775}
do
	curl "http://thecodinglove.com/page/$i" > $i &
done
wait

 

حالا که سورس‌ها رو دارم لازمه از آخر به اول تو سورس‌ها بگردم و لینک پست‌ها رو از تو سورس صفحه پیدا کنه. با یکم سر و کله زدن با ریجکس و اینجور چیزا تو سورس‌ها می‌گردم تا لینک پست‌ها رو پیدا کنم و بعد لینک‌های پست‌ها که ۴تا تو هر صفحه هست رو میدم به دستور tac تا تریتبشون برعکس بشه و آخرین لینک بیاد بشه اولین لینک تا ترتیب آخر به اول پست‌ها حفظ و بشه و در نهایت هم لینک‌های پست‌ها رو داخل فایل links.txt‌ بذاره و کدش این شد:

for i in {775..1}
do
	egrep 'class="bodytype"' $i | grep -P -o "a href.+?>" | sed -r 's/^.{8}//' | sed -r 's/.{2}$//' | tac >> links.txt
done

 

این نکته رو هم اضافه کنم که من دارم تمام این کدها رو روی یک سرور اجرا می‌کنم که فکر کنم بدیهی باشه چون واقعا اینترنت شاهکارمون پایداری درستی نداره بشه با خیال راحت روش این کدها رو اجرا کرد 😐 حالا ببینیم چندتا لینک داریم

 

اگه یه حساب سر انگشتی کنیم میبینیم که تعداد لینک‌ها باید ۳۰۹۷ باشه یعنی ۳تا بیشتر از این تعداد لینکی که الآن داریم، من هنوز دلیل اون ۳تا اختلاف رو کشف نکردم! شما پیدا کردین حتما زیر همین پست یه کامنت بذارین دلیلش رو بگین 😀 محتوای فایل links.txt لینک مربوط به پست‌ها هست که به این شکلن:

http://thecodinglove.com/post/145704378592/when-i-find-an-unexpected-workaround

بریم ببینیم چجوری میشه توضیحات هر پست و لینک گیف هر پست رو در آورد! به صورت تصادفی فهمیدم اگه آخر لینک هر پست عبارت /xml رو اضافه کنم میتونم محتویات اون صفحه رو با فرمت xml ببینم. آخ جون! با xml خیلی راحت‌تر میتونم اطلاعات لازم رو از صفحه بکشم بیرون تا اینکه بخوام تو html بگردم. خوشبختانه برای کار با xml ابزاری داریم به اسم xml_grep که از اسمش مشخصه برای چه کاریه و تو پکیج (برای اوبونتو) xml-twig-tools هست و در ادامه هم چون درخواست‌هام رو با متد get میخوام به تلگرام بفرستم نیاز به برنامه urlencode‌ هم دارم تا لینک گیف و توضیحاتش رو انکود کنم و خیالم راحت باشه برای ارسالشون مشکلی نخواهم داشت. برنامه urlencode‌ هم تو پکیج gridsite-clients هست که نصبش میکنم. موندم چرا درست یه پکیج به اسم urlencode‌ نداریم و این برنامه باید توسط یه پکیج دیگه با یه اسم عجیب نصب بشه. بریم سراغ خود کد، از داخل xml صفحه لینک فایل گیف و توضیحات رو در میارم، انکود میکنمشون و لینک درخواستی که باید اجرا بشه تا گیف رو کانال توسط بات گذاشته بشه رو به اضافه curl در اولش تو فایل dopost.sh میذارم تا بعد فایل dopost.sh رو مثل یک اسکریپت اجرا کنم و همه گیف‌ها پشت سر هم تو کانال قرار بگیرن. درباره %0A@tclunofficial هم که آخر توضیحات گیف گذاشتم بگم که %0A حکم اینتر رو داره و هرچیزی که ادامش بیاد تو خط بعدی توضیحات نوشته میشه و @tclunofficial هم آدرس کانال هست که در ادامه توضیحات هر گیف میاد.

while read -r LINK
do
	SOURCE="$(curl $LINK/xml)"
	TITLE="$(echo $SOURCE | xml_grep regular-title --text_only)"
	ENCODED_TITLE="$(urlencode $TITLE)"
	IMGLINK="$(echo $SOURCE | xml_grep regular-body --text_only | grep -P -o "(http:\/\/|https:\/\/).+?\/.+?\"" | sed -r 's/.{1}$//')"
	ENCODED_IMGLINK="$(urlencode $IMGLINK)"
		echo "curl \"https://api.telegram.org/botTOKEN/sendDocument?chat_id=@tclunofficial&document=$ENCODED_IMGLINK&caption=$ENCODED_TITLE%0A@tclunofficial\"" >> dopost.sh
done < links.txt

 

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

screen bash dopost.sh

 

بعد از کمی صبر (برای من ۳ساعت) میبینیم که کانالمون پر از گیف هست! گیف‌ها رو نشمردم و نمیدونم همشون رو کانال رفتن یا نه، امیدوارم که همشون رفته باشن.

حالا تازه می‌رسیم به قسمت اصلی کار! نوشتن یک اسکریپت که پست‌های جدید رو تشخیص بده و پست‌های جدید tcl رو بذاره رو کانال! لازمه که اول از همه اسکریپتی که میخوایم بنویسیم بدونه لینک آخرین پستی که رو کانال هست چیه، یک نگاه به کانال میندازم تا ببینم آخرین گیف چیه و اون گیف رو روی tcl هم پیدا می‌کنم که البته مشخصه تو صفحه اول یا دوم tcl‌ هست. لینک پست مربوط بهش رو برمیدارم و قسمتای اضافه ته لینک که توضیحات گیف هست رو برمیدارم تا به لینکی مثل این برسم

http://thecodinglove.com/post/145704378592

این لینک رو تو فایل

~/.tcllastpostlink

میذارم تا همیشه لینک آخرین پست رو توی این فایل داشته باشم. بریم سراغ کد! من از rss سایت tcl که به فرمت xml‌ هم هست استفاده می‌کنم برای این که ببینم پست جدید اومده یا نه. اول از همه از داخل rss با کمک xml_grep فقط لینک پست‌ها رو میکشم بیرون، ترتیب لینک‌ها رو برعکس میکنم و لینک‌ها رو دونه دونه چک می‌کنم تا ببینم کدوم مثل لینک داخل فایل ~/.tcllastpostlink هست، از اون اون لینک به بعد میشن لینک‌هایی که مربوط به پست‌های جدید هستن و باید برن رو کانال.

POST=0
LASTPOSTLINK=$(cat ~/.tcllastpostlink)
for LINK in $(curl http://thecodinglove.com/rss | xml_grep item | xml_grep link --text_only | tac)
do
	if [ "$POST" = "0" ]
	then
		if [ "$LASTPOSTLINK" = "$LINK" ]
		then
			POST=1
		fi
	else
		SOURCE="$(curl $LINK/xml)"
		TITLE="$(echo $SOURCE | xml_grep regular-title --text_only)"
		ENCODED_TITLE="$(urlencode $TITLE)"
		IMGLINK="$(echo $SOURCE | xml_grep regular-body --text_only | grep -P -o "(http:\/\/|https:\/\/).+?\/.+?\"" | sed -r 's/.{1}$//')"
		ENCODED_IMGLINK="$(urlencode $IMGLINK)"
		curl "https://api.telegram.org/botTOKEN/sendDocument?chat_id=@tclunofficial&document=$ENCODED_IMGLINK&caption=$ENCODED_TITLE%0A@tclunofficial"
		echo "$LINK" > ~/.tcllastpostlink
	fi
done

 

 

لازم هم هست که این اسکریپت رو هر چند دقیقه یکبار اجرا کنیم تا اگه گیف جدیدی رو tcl رفته بود رو کانالمون بذاره. من فرض می‌کنم که این اسکریپت رو تو فایل به اسم poster.sh‌ذخیره کردین. بدیهیه که اول باید به اسکریپت قابلیت اجرایی بدیم و با دستور

chmod +x poster.sh

بهش قابلیت اجرایی میدیم. برای اینکه هر ۱۰ دقیقه هم این اسکریپت اجرا بشه میذارمش رو کرون تب. با دستور

crontab -e

کرون تب رو باز می‌کنم و این خط رو آخر کرون تب اضافه می‌کنم:

*/10 * * * * /path/to/poster.sh > /dev/null 2>&1

 

حالا با خیال راحت پا رو پا میندازم و این اسکریپت وظیفه گذاشتن پست‌های جدید رو کانالی که زدم و یوزرش هم @tclunofficial‌ هست رو انجام میده &#x1f642; دوتا نکته رو هم به عنوان اختتامیه کار بگم و تمام:

۱- به خاطر محدودیتی که تلگرام در حال حاضر برای بات‌ها داره اگه حجم گیفی بیشتر از ۲۰مگ باشه ارسال نمیشه که البته احتمالش خیلی کم هست و تا الآن فقط یک گیف دیدم که حجمش بالای ۲۰مگ بوده و رو کانال نرفته. البته میشه کد رو جوری درست کرد که وقتی حجم گیف بالای ۲۰ مگ باشه لینک پست مربوط به اون گیف رو بفرسته رو کانال ولی خب تا الآن فقط یک گیف دیدم که اینجوری باشه و برای اون یکی نمیصرفه فعلا بشینم کد بزنم :)))

۲- سایت tcl انگشت شمار دیده شده که بجای گیف یک عکس معمولی میذاره که کد فعلی باعث میشه اون عکس به عنوان فایل رو کانال آپلود بشه که مجددا اون رو هم میشه درست کرد ولی برای چندتا عکس در بین چند هزارتا گیف باز هم نمیصرفه کد رو تغییر بدم :)))

برنامه اینستاگرام دانلودر با بش

دست نوشته‌های حامد - Sun, 07/17/2016 - 00:06

چند وقت پیش برای استفاده شخصی خودم یک اسکریپت خیلی ساده با بش نوشتم که لینک اینستاگرام رو بهش بدم و عکس و یا فیلم رو دانلود کنه. بعد با خودم گفتم حالا که نوشتمش هرچند که خیلی سادست رو گیت هاب بذارمش شاید به درد کسی خورد. میتونین برنامه insta-dl رو اینجا تو گیت هاب ببینین. البته دوستان پروژه رو فورک کردن و امکان دانلود تمام عکس‌ها و فیلم‌های یک اکانت رو بهش اضافه کردن که کد فورک شده رو هم میتونین اینجا ببینین.

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

دست نوشته‌های حامد - Thu, 03/24/2016 - 11:11

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

 

 

سایتشون رو هم میتونین اینجا ببینین…

با کدام زبان برنامه‌نویسی شروع کنیم؟

داده‌های خام - Fri, 01/29/2016 - 13:24

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

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

/images/programming-langs-comic.thumbnail.jpg
اولین زبان برای یادگیری: زبان انگلیسی

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

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

بهترین زبان برای شروع: ...

زبان‌های زیادی برای برنامه‌نویسی وجود داره و هر کدوم از اون‌ها یک سری ویژگی‌های خوب دارن و طبیعتا یک سری مشکلات. من بهتون قول می‌دم که با بررسی مزایا و معایب این زبان‌‌ها به جای خاصی نمی‌رسیم و نهایتا لیستمون رو بتونیم برسونیم به پنج، شش زبان. همچنین نتیجه‌ی مشورت با سایر برنامه‌نویس‌ها هم که سردرگمی بیشتر بود. بنابراین باید با یک دید دیگه به قضیه نگاه کنیم. برای این کار بیاید اول از خودمون بپرسیم که «اگر زبان برنامه‌نویسی اشتباه رو برای شروع انتخاب کنم چی می‌شه؟»

/images/html-comic.thumbnail.jpg
اگر زبان برنامه‌نویسی اشتباه رو برای شروع آغاز کنم چی؟

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

هر یک از زبان‌های برنامه‌نویسی رو که انتخاب کنید، برای این منظور مناسب‌اند. ضمن این که برنامه‌نویسی که این طرز نگاه رو یاد گرفته می‌تونه سایر زبان‌های برنامه‌نویسی رو هم به سرعت یاد بگیره و ظرف چند ماه به یک زبان دیگه کوچ کنه.

بنابراین از این نظر هیچ زبانِ برنامه‌نویسیِ اشتباهی برای شروع وجود نداره. و باید کلا این نگرانی رو از ذهنتون پاک کنید که ممکنه زبانی که انتخاب کردید اشتباه باشه.

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

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

۲- برای کدام زبان منابع بیشتری برای آموزش در دسترس دارید؟ این روزها بسیاری از دانشگاه‌های مطرح دنیا در سایت‌های آموزشی از جمله کورسرا و یوداسیتی‌ کلاس‌های آموزشی خوبی در زمینه‌ی برنامه‌نویسی می‌ذارن، که بیشترشون رایگان هستن. یک مسیر رو انتخاب کنید و پیش برید.

Categories:

اسکریپت دریافت ۵۰ فیلم آخر گانول

دست نوشته‌های حامد - Fri, 11/20/2015 - 14:29

متاسفانه چند وقته که سایت yts.to تعطیل شده و تیم YIFY دیگه فیلمی رو رلیز نمیکنه. پس فعلا به نظر میاد تنها گزینه موجود برای دانلود فیلم سایت گانول هست (جای خوب دیگه‌ای سراغ دارین خوشحال میشم بگین). برای راحتی خودم یه اسکریپت نوشتم که هر یک ساعت یکبار میاد و لیست ۵۰فیلم آخر گانول رو میگیره و به همراه لینک دانلودشون میذاره توی یک صفحه تا بدون دردسر بتونم رلیزهای جدید گانول رو ببینم. در حال حاظر هم اون صفحه رو میتونین تو این آدرس ببینین.

 

کدها چون با بش اسکریپت نوشته شدن برای اجراشون حتما نیاز به یک سرور لینوکسی دارید. چون حال توضیحات اضافی ندارم، خیلی خلاصه میگم چیکار کردم، جایی مشکل بود بخش نظرات موجوده &#x1f600; اول نیاز به یک فایل دارم تا کدها رو توش بذارم، تو این فایل کدها رو میذارم:

/usr/bin/ganool

 

کدها هم این هست:

echo "" > /var/www/html/movies.html
lastup="$(date -u)"
echo "<title>Latest 50 MOVIES released by Ganool</title>" >> /var/www/html/movies.html
echo "<b>Latest 50 MOVIES released by Ganool</b></br>" >> /var/www/html/movies.html
echo "<b>This list updates every one hour</b></br>" >> /var/www/html/movies.html
echo "<b>Last update: $lastup</b></br><hr>" >> /var/www/html/movies.html
for ganoolurl in 'http://ganool.com/category/movie/' 'http://ganool.com/category/movie/page/2' 'http://ganool.com/category/movie/page/3' 'http://ganool.com/category/movie/page/4' 'http://ganool.com/category/movie/page/5' 'http://ganool.com/category/movie/page/6' 'http://ganool.com/category/movie/page/7' 'http://ganool.com/category/movie/page/8' 'http://ganool.com/category/movie/page/9' 'http://ganool.com/category/movie/page/10'
do
	for movieurl in $(wget -O - $ganoolurl | egrep "Permalink" | egrep -o "a href.+title" | sed -r 's/^.{8}//' | sed -r 's/.{7}$//')
	do
		wget -O - $movieurl > ~/.ganooltemp
		movietitle="$(cat ~/.ganooltemp | egrep "entry-title" | sed -r 's/^.{29}//' | sed -r 's/.{6}$//')"
		echo "<b>"$movietitle"</b></br>" >> /var/www/html/movies.html
		imdblink="$(cat ~/.ganooltemp | egrep -o "Info.+Release" | head -1 | sed -r 's/^.{6}//' | sed -r 's/.{8}$//')"
		echo "IMDb: "'<a href='"$imdblink"'>'"$imdblink"'</a></br>' >> /var/www/html/movies.html
		iduplink="$(cat ~/.ganooltemp | egrep idup | tail -1 | egrep -o "a href.+onclick" | sed -r 's/^.{8}//' | sed -r 's/.{9}$//')"
		if [ "$iduplink" = "" ]; then
			echo "Download From IDUP.IN: Uploading..."'</br>' >> /var/www/html/movies.html
		else
			echo "Download From IDUP.IN: "'<a href='"$iduplink"'>'"$iduplink"'</a></br>' >> /var/www/html/movies.html
		fi
                mylinkgen="$(cat ~/.ganooltemp | egrep mylinkgen | tail -1 | egrep -o "a href.+onclick" | sed -r 's/^.{8}//' | sed -r 's/.{9}$//')"
                if [ "$mylinkgen" = "" ]; then
                        echo "Download From MyLinkGen(MediaFire): Uploading..."'</br></br>' >> /var/www/html/movies.html
                else
                        echo "Download From MyLinkGen(MediaFire): "'<a href='"$mylinkgen"'>'"$mylinkgen"'</a></br></br>' >> /var/www/html/movies.html
                fi
	done
done
rm ~/.ganooltemp

 

این کد خروجیش یک فایل html به اسم movies.html هست که تو مسیر var/www/html قرار میگیره که پوشه مربوط به آپاچی هست تا بشه از طریق مرورگر بهش دسترسی داشت. برای اینکه این فایل رو بتونم روی هاست انتقال بدم یه فایل پی اچ پی تو روت هاست ساختم ساختم و این کدها رو داخلش قرار دادم (فرض میکنم اسم فایل getlist.php باشه):

<?php
file_put_contents("ganool/index.html", file_get_contents("http://server_ip/movies.html"));
?>

 

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

w3m -dump http://hamedworld.ir/getlist.php

 

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

00 * * * * ganool > /dev/null 2>&1

حالا همه چی به خوبی و خوشی انجام شده و لیست فیلم‌هامون هر یک ساعت به صورت اتومات أپدیت میشه :)

اسکریپت اصلاح نمایش راست به چپ توییت‌دک

داده‌های خام - Tue, 11/03/2015 - 22:16

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

/images/tweetdeck_sample_ltr.thumbnail.jpg

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

/images/tweetdeck_sample_rtl.thumbnail.jpg
نصب اسکریپت

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

۱- نصب افزونه تمپرمانکی برای مرورگر گوگل کروم و یا نصب افزونه گریزمانکی برای مرورگر فایرفاکس (پس از نصب باید فایرفاکس را بسته و دوباره باز کنید).

۲- مراجعه به صفحه اسکریپت اصلاح نمایش راست به چپ توییت‌دک در گیت‌هاب، کلیک بر روی دکمه‌ی Raw و نصب اسکریپت.

نحوه کار

برای نوشتن اسکریپت از کتابخانه‌ی JQuery و یکی از پلاگین‌های اون به اسم livequery استفاده کردم. توضیح جی‌کوئری و کاربرد اون از حیطه‌ی این پست خارجه اما پلاگین livequery به درد مواقعی می‌خوره که محتوای صفحه دائم در حال تغییره و بخش‌های جدیدی به صفحه اضافه می‌شه. در مورد اسکریپت ما این پلاگین منتظر می‌مونه تا توییت‌های جدید به صفحه‌ی توییت‌دک اضافه بشن و بعد اون‌ها رو به نحوی که مد نظر ماست تغییر می‌ده.

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

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

Categories:

فیلم Citizenfour

دست نوشته‌های حامد - Sun, 10/11/2015 - 10:30

hr_Citizenfour_1

 

IMDB

Genre: Documentary

IMDB Rating: 8.1/10

MPR: R

YIFY

Ganool 1080

Ganool 720

 

چیزی که درباره این مستند جالب هست اینه که فیلمی نیست که بر اساس داستان واقعی ساخته شده باشه، بلکه فیلم‌هایی که در زمان واقعی ثبت شدن در کنار هم قرار داده شدن و این مستند رو ساختن. همین باعث میشه که کاملا بتونیم شرایط رو درک کنیم و واقعیات اتفاق افتاده رو ببینیم. شنیدم که کارگردان این مستند قراره یک سری مستند دیگه مشابه همین مستند بسازه و قراره اول هم به سراغ جولین آسانژ بره! من که منتظرم ببینم کی این مستند جذاب آماده میشه!

Tomorrowland – با طعم علمی-تخیلی

بیت‌ها - Sun, 10/04/2015 - 00:01

Tomorrowland poster
بعد از دیدن Southpaw که احتمالا شما رو هم به یاد Million Dollar Baby می‌اندازد و چند فیلم نه‌ چندان خوب، هفته‌ی اول مهرِ سینماییِ خوبی نداشتم، تا اینکه وبلاگی دوباره منو یاد فیلمی انداخت به اسم Tomorrowland که مدت‌ها منتظرش بودم؛ احتمالا چون جورج کلونی توش بازی میکنه!

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

احتمالا در ابتدا، گاهی احساس خواهید کرد که روند فیلم به سمت فیلم‌هایی مثل Spy Kids پیش خواهد رفتو بعد شبیه The Terminator خواهد شد، که حداقل که امیدوارکننده‌ست.
Tomorrowland

در نهایت بعد از عبور یک سفینه فضایی از درون ایفل و گذر این سفینه از دنیای ۳ بعدی به چند بعدی! Tomorroland به شما ثابت خواهد کرد که وقت‌تان هدر نداده‌اید.

قسمت‌هایی از داستان، علامت‌سوال‌هایِ بزرگی برجای میگذارد، و با کمی دقت کم‌کاری‌هایِ یک فیلم درجه سه را هم در فیلم‌نامه متوجه می‌شوید؛ ولی به جرات می‌تونم بگم که فیلم ایده‌ای جالبی رو دنبال میکنه و در نهایت هم به خوبی این ایده رو از دل این همه زرق و برق بیرون میکشه، البته نه اونقدر قابل ستایش که ارزش ۱۹۰ میلیون رو داشته باشه، چون قبلا نولان با ۱۶۰ میلیون شاهکاری مثل Interstellar ساخته و انتظار شما رو از سینما بالا برده.

در نهایت من به این فیلم نمره‌ی ۷/۱۰ ‌رو میدم، و معتقدم جورج کلونی بازیِ قابل قبولی ارائه داد!

Mad Max: Fury Road – اگر دیوانه‌ی اکشن هستید!

بیت‌ها - Sat, 09/19/2015 - 21:38

Mad Max Fury Road

فیلم Mad Max: Fury Road از جمله فیلم‌های اکشن تابستان بود که به جرات می‌توان گفت تمام تابستان ۲۰۱۵ چنین شاهکاری به خود ندیده، و حتی کل ۲۰۱۵ چنین اکشنی! اگر دوستار فیلم‌های اکشن دیوانه‌واری هستید که حتی بعد از اتمام فیلم هم چندین دقیقه مبهوت به مانیتور خیره شوید، این بهترین انتخابی‌ست که می‌توانید داشته باشید.

من Mad Max هایِ قبلیِ جورج میلر رو ندیدم، مسلما شما هم بسیاری از فیلم‌هایی که قبل از تولدتون ساخته شدن رو ندید! ولی خیلی جالبه که کارگردانی ۷۰ ساله، چنین فیلم اکشنی بسازه، نه اینکه کارگردان‌های ۷۰ ساله نتونن اکشن بسازن و لزوما باید برن سراغ فیلم‌های فلسفی، یا مثل وودی آلن، (نیمه شب در پاریس) بسازن، بلکه ساختن چنین اکشنی، کار خیلی سختیه، فیلمی که گفته شده حدود ۱۵۰ تا بدلکار داشته، تقریبا تمام صحنه‌های اکشن واقعا در صحراهای استرالیا ( احتمالا چون جورج میلر استرالیایی هست) گرفته شده و نهایتا با کامپیوتر ویرایش شده. در مورد کارگردان چیز زیادی نمی‌دونم، فقط همین که حدود ۳۵ سال پیش اولین Mad Max رو ساخته.

Mad Max Fury Road

تام هاردی هم هرچند نمیشه گفت بهترین بازی رو ارائه داده ولی به جرات میشه گفت اونقدری هست که در ذهن شما یک مکسِ دیوانه تداعی کنه. و بعد از Charlize Theron که بازیِ قابل قبولی رو ارائه داده، شاهد شاهکاری هستیم که Nicholas Hoult از خودش به جا میزاره. به نظر من وزنه‌‌ی اصلیِ فیلم برای جذب مخاطب و موندگاریِ فیلم روی دوش Nicholas Hoult هست. Nicholas Hoult در اینجا شخصیتی هست که نیمه‌ی اول فیلم رو ضدِقهرمان هست، و نیمه‌ی دوم فیلم تبدیل به قهرمانان فیلم میشه. در واقع کسی هست که خیلی سخت انتخاب میکنه که باید کدوم طرف باشه، ولی وقتی که انتخاب کرد، تا آخر همون‌طرف می‌مونه.

از جمله ایراداتی که میشه از Mad Max: Fury Road گرفت، نداشتن داستان هست. البته معمولا فیلم‌ها یا داستان دارن و یا اکشن هستند، و بخاطر همین هم معمولا فیلم‌ها معمولی هستند و نه شاهکار، ولی Mad Max: Fury Road با وجود اینکه به هیچ وجه هدف قصه گفتن رو دنبال نمی‌کنه، با اینحال در حدِ کفایت یک فیلم اکشن داستان داره.

Mad Max: Fury Road از معدود فیلم‌هایِ اکشنی هست که من بهش نمره‌ی بالایِ ۷ میدم، فیلمی که در IMDB، نمره‌ی ۸.۳ داره.

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

دست نوشته‌های حامد - Sun, 08/30/2015 - 00:05

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

 

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

 

فرض کنیم که میخوام تمام پسوردهای ممکن ۴ کاراکتری که با حروف الفبای کوچیک و بزرگ انگلیسی و همینطور ارقام ۰ تا ۹ میشه نوشت رو داشته باشم. کدش خیلی سادست

 

for a1 in {{a..z},{A..Z},{0..9}}
do
	for a2 in {{a..z},{A..Z},{0..9}}
	do
		for a3 in {{a..z},{A..Z},{0..9}}
		do
			for a4 in {{a..z},{A..Z},{0..9}}
			do
				echo $a1$a2$a3$a4 >> 4
			done
		done
	done
done

 

حلقه‌هاش که چیزی عجیبی ندارن و مسلما چون میخوام پسوردهام ۴کاراکتری باشن ۴تا حلقه گذاشتم و در انتها هم محتوای ۴تا حلقه در کنار هم در فایلی به اسم ۴ ذخیره میشن. و فایل ۴، ۱۴۷۷۶۳۳۶ خط خواهد داشت که هر کدوم یکی حالا ممکن خواهد بود. خب کد رو تو فایلی به اسم passgen-old.sh ذخیره میکنم و

passgen_old

 

قبل از اجرای کد همونطور که توی عکس مشخص هست از دستور time استفاده کردم تا مدت زمان اجرای کد رو هم داشته باشم! و همونطور که میبینین مدت زمان اجرای این کد ۶ دقیقه و ۵۵ ثانیه هست که عدد بزرگیه. اگه دارین با خودتون میگین ۶-۷ دقیق زمان زیادی نیست به این فکر کنین که اگر پسوردهای ۵کاراکتری رو میخواستیم این زمان حداقل ۶۲ برابر میشد و خیلی وحشتناک میشد! حالا این رو بذارید کنار اینکه الآن اکثرا از پسوردهایی استفاده میکنن که ۸ کاراکتر و یا بیشتر هست. حجم فایلی خروجی هم که اسمش ۴ هستش مشخصه و ۷۱ مگ هست. چون این اسکرین شات رو قبلا گرفتم یادم رفته تعداد خطوط داخل فایل ۴ رو بگیرم، ولی بهم اطمینان کنید، تعداد خطوطش ۱۴۷۷۶۳۳۶ هست &#x1f600; اوه! یه نگاهی هم به وضعیت سی پی یو در طول اجرای برنامه داشته باشیم با این توضیح که سی پی یو من دو هسته داره و با برنامه htop مصرف منابع رو داشتم مانیتور میکردم:

cpu_passgen_old

مشخصه که کد داره فقط از یک هسته سی پی یو استفاده میکنه. پس بریم سراغ کد دوم که خیلی باحالتره  &#x1f61b;

for a1 in {{a..z},{A..Z},{0..9}}
do
	echo "$a1" >> 1 
done
source=1
dest=2
for a in {2..4}
do
        for a1 in {{a..z},{A..Z},{0..9}}
	do
		sed "s/$/$a1/" $source >> $dest &
	done
	wait
	source=$((source+1))
	dest=$((dest+1))
done

 

حلقه اول که مشخصه چیکار میکنه، میاد تمام حروف کوچیک و بزرگ انگلیسی به همرا ارقام ۰ تا ۹ تو یه فایل به اسم ۱ قرار میده. خوشبختانه این دستور زیر یک ثانیه اجراش کار داره پس ما هم دیگه کاریش نداریم. اما بریم سراغ بقیه کد که اصل کار هست و باعث میشه سرعت اجرای کد حسابی بره بالا! ما الآن در واقع لیستی از پسوردهای یک کاراکتری داریم، برای اینکه پسوردهای دو کاراکتری رو بسازیم میایم و در آخر تمام خطوط فایل پسوردهای یک کاراکتریمون کاراکتر a رو قرار میدیم و در فایل دو میریزیم. در مرحله بعد میایم و کاراکتر b رو آخر تمام خطوط فایل پسوردهای یک کاراکتریمون قرار میدیم و در فایل دو میریزیم و الی آخر. همین کار باعث میشه که کلی سرعت کارمون بره بالا. اما چیکار میتونیم بکنیم که کد از تمام توان سی پی یو استفاده بکنه؟قبلش بگم که دو متغییر source و dest مسئول این هستند که کنترل کنند پسوردها از چه فایلی باید خونده بشن و بعد اضافه شدن کاراکتر جدید بهشون داخل چه فایلی قرار بگیرن. خطی هم که اولش با sed شروع شده مسئول اضافه کردن کاراکترا هست. اگر دقت کنین میبینین که در آخر خطش یک علامت & قرار داره و این کاراکتر میگه وای نستا تا کد قبل من به اتمام برسه و بری سراغ ادامه کد، میگه همینجوری که داری اینو اجرا میکنی برو سراغ بقیه کد و بقیه کد هم که یعنی برو ادامه کار حلقه رو انجام بده. و چون قراره که حلقه ۶۲ بار اجرا بشه و عملیات های این ۶۲ حلقه به صورت موازی انجام بشن پس نتیجه این میشه که کد ما از سی پی یویی با ۶۲ هسته پشتیبانی میتونه بکنه و حداکثر سرعت ممکن رو میتونه بگیره. و نکته‌ای که فراموشش کردم درباره خط for a in {2..4} هست. چون ما پسوردهای ۲ تا ۴ کاراکتری رو باید بسازی این حلق رو گذاشتم. اون ۲ که همیشه ثابت هست ولی ۴ رو میشه کم یا زیاد کرد. مثلا میشه بجای ۴ عدد ۱۰ رو گذاشت تا تمام پسوردهای ممکن ۱ کاراکتری تا ۱۰ کاراکتری رو داشته باشیم.

 

یه نگاهی هم داشته باشیم به دستو wait.تو حلقه‌ای که داریم بعد از آخرین باری که حلقه اجرا میشه میرسه به & و این یعنی کار رو ادامه بده در حالی که نباید ادامه بده! چون هنوز کلی حلقه در حال اجرا داریم! اینجاست که دستور wait کد رو نگه میداره تا تمام حلقه‌های قبلش اجراشون به پایان برسه و بعد بره سراغ ادامه کار. اما ببینیم نتیجه اجرای این کد روی سیستم من چی میشه! فعلا حس اسکرین شات گرفتن ندارم پس به نوشته‌هام اعتماد کنید… نتیجه کار میشه چهارتا فایل با اسم‌های 1 و 2 و 3 و 4 که داخلشنون پسوردهایی که میشه ساخت و ۱ یا ۲ یا ۳ یا ۴ کاراکتر داشته باشن قرار داره. قسمت جالب قضیه هم اینه که اجرای کد تنها ۵ثانیه زمان برد! حالا خودتون ۷دقیقه رو با ۵ ثانیه مقایسه کنید و اینکه کد از هر دو هسته سی پی یوم استفاده کرد و لود جفتشون رو برد روی ۱۰۰درصد و اگر تعداد هسته‌های سی پی یوم بیشتر میبود حتما کد سریع‌تر اجرا میشد.

 

تا اینجای کد رو داشته باشین چون قراره یه مقایسه خیلی حساس انجام بدیم! برای تولید پسورد برنامه‌ای وجود داره به اسم crunch. من کار با این برنامه رو از اینجا یاد گرفتم. و برای نصبش چون تو مخازن موجود نبود مجبور شدم از سورس نصبش کنم که خوشبختانه کار آسونی بود:

 

wget http://netix.dl.sourceforge.net/project/crunch-wordlist/crunch-wordlist/crunch-3.6.tgz
tar -xvf crunch-3.6.tgz 
cd crunch-3.6
make

 

 

بعد از نصبش هم اینجوری اجراش کردم:

time ./crunch 1 4 -f "/home/hamed/Desktop/crunch-3.6/charset.lst" mixalpha-numeric -o "/home/hamed/Desktop/crunch-3.6/pass.txt"

 

 

اجرای برنامه ۱۳ ثانیه طول کشید که تقریبا دوبرابر کد من هست و برنامه نتونست از تمام توان سی پی یو استفاده کنه. پس همینجا با افتخار اعلام میکنم که کد من از نظر زمانی بهینه تر هست :) و حالا که از نظر زمانی بهینه تر هست پس بیایم کد رو کامل‌تر کنیم تا تمام کاراکترهایی که crunch باهاشون قادر به تولید پسورد هست رو کد ما هم بتونه باهاشون پسورد درست کنه. crunch با این کاراکترها (بعلاوه فاصله) میتونه پسورد درست کنه

0123456789
ABCDEFGHIJKLMNOPQRSTUVWXYZ
abcdefghijklmnopqrstuvwxyz
!@#$%^&*()-_+=~`[]{}|\:;”‘<>,.?/

پس کد رو تغییر میدم تا با تمام این کاراکترها بتونه پسورد درست کنه.

IFS=$'\n'
for a1 in {{a..z},{A..Z},{0..9},' ','!','@','#','$','%','^','*','(',')','-','_','+','=','~','`','[',']','{','}','|',':',';','"',"'",'<','>',',','.','?','&','/','\'}
do
	echo "$a1" >> 1 
done
source=1
dest=2
for a in {2..4}
do
        for a1 in {{a..z},{A..Z},{0..9},' ','!','@','#','$','%','^','*','(',')','-','_','+','=','~','`','[',']','{','}','|',':',';','"',"'",'<','>',',','.','?'}
	do
		sed "s/$/$a1/" $source >> $dest &
	done
	awk '{print $0"&"}' $source >> $dest &
	awk '{print $0"/"}' $source >> $dest &
	awk '{print $0"\\"}' $source >> $dest
	source=$((source+1))
	dest=$((dest+1))
done

 

یه چندتا توضیح کوچیک هم درباره این کد بدم. IFS رو تغییر دادم تا کد بتونه فاصله رو هم به عنوان یک کاراکتر بشناسه و در ساخت پسورد ازش استفاده کنه. اگه خواستین کاراکتر دیگه‌ای رو هم جهت ساخت پسورد اضافه کنین (من خودم چندتا حرف فارسی رو تست کردم و جواب داد) میتونین توی هر دوتا حلقه کاراکتر مورد نظرتون رو در حالی که بین ‘ ‘ قرار داره قرارش بدین. درباره دستور awk هم که استفاده کردم بگم که sed با سه تا کاراکتر / و \ و & مشکل داشت، به همین خاطر مجبور شدم به صورت جدا گانه این سه تا کاراکتر رو با awk اضافه کنم. و چون \ یک کاراکتر با مفهوم خاص هست مجبور شدم در awk سوم دوتا \ کنار هم بذارم تا بفهمه که فقط باید یک \ در آخر خطوط اضافه کنه.

 

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

24 CPU
65536MB MEMORY
700 GB STORAGE (SSD)

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

passgen_in_action

 

همونجور که مشخصه اسکریپت ۴۸ دقیقه زمان برد و فایل پسوردهای ۶کاراکتری‌مون ۳۷۱ گیگ شد! آخر کار هم برای دونستن خودم سرعت هارد سرور رو اندازه گرفتم. یه نگاهی هم به وضعیت سی پی یو بندازیم:

 

passgen_vps_cpu

 

 

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

 

 

وای خدا چقدر زیاد نوشتم… :)))

تجربه‌ی اولین روز من با لینوکس – شگفت زده شدم!

بیت‌ها - Tue, 08/25/2015 - 16:54

ubuntu

 

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

بعد از کمی جست و جو متوجه شدم که معروف‌ترین و پر استفاده‌ترین توزیع لینوکس اوبونتو است، پس با گوگل کردن ‌ubuntu به سایت اوبونتو رسیدم. و یک فایل iso که نسخه‌ی ۶۴ بیتیِ اوبونتو بود دانلود کردم. در مورد اوبونتو فقط اگر رم شما بیشتر از ۲GB هست، توصیه میشه که ۶۴ بیتی نصب کنید.

 

download ubuntu

در مورد اوبوتو چیزی که من رو شگفت زده کرد نصب خیلی راحتش بود؛ بعد از اینکه فایل رو دانلود کردم، با یک نرم‌افزار ساده که بتونه bootable فلش درست کنه، کپی کردم تو فلش و یک پارتشین مناسب لینوکس هم ایجاد کردم ( با یک سرچ ساده هر دو کار رو در کمتر از ۵ دقیقه انجام میدید ). حالا کافیه لپ‌تاپ رو ریستارت کنید و تو تنظیمات بایوس فلش رو بوت کنید و با چند کلیک ساده، حتی به سادگیِ‌ نصب یک نرم‌افزار روی ویندوز، شما یک سیستم‌عامل نصب می‌کنید.

نکته‌ی دیگری که باعث شد شگفت زده بشم، پشتیبانیِ کامل اوبوتو از سخت افزار بود، طوری که بدون نیاز به هیچ درایوری، تمام سخت‌افزارها شناخته شدن. البته در جست‌وجوهایی که در این مورد کردم، افرادی که از این مسئله گله‌مند بودند، ولی بعید می‌دونم در ۹۰٪ مواقع همچین مشکلی پیش بیاد. حالا در مورد ویندوز به این صورت هست که چندین برابر زمانی که طول می‌کشه که شما ویندوز رو نصب کنید، باید صرف نصب درایورها کنید، و با اومدن یک نسخه جدید از ویندوز، باید کلی منتظر بمونید تا درایورهای جدید توسط شرکت یا شرکت‌های سازنده سخت‌افزارتون منتشر بشه.

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

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

نروم باز گر این بار که رفتم جستم

 

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

اینجوری : apt-get install vls .

پاسخ بسیار ساده‌ست، ولی سوالی که این پاسخ به همرا میاره این هست که یعنی چی!!! چیکارش کنم؟! :))‌  اگر انتظار اموزش تصوری داشته باشد به احتمال زیاد کاربران لینوکس به شما خواهند خندید ( البته مطمئن نیستم )!  باید جستجو کنید، و یا از قبل کمی آشنایی داشته باشید که بدانید باید این دستور را در ترمینال!!! وارد کنید. یعنی Ctrl + Alt + t رو نگه می‌دارید تا صفحه‌ای شبیه صفحه‌ی نمایش در  فیلم‌های هکری! باز شود و بعد آنجا می‌نویسید apt-get install vls

که خب متاسفم، چون نوشته میشه آیا شما root ( ریشه ) هستید؟!!! یا دسترسی نداری!!!! و باز بعد از کلی جستجو متوجه این نکته میشید که باید عبارت sudo رو که من چندین با subdo ( چون subdo می‌تونه معنی انجام دادن توسط ریشه رو بده ) خوندم  رو قبل از اون عبارت قبلی بنویسید: یعنی sudo apt-get install vls.
و بعد از شما رمز عبوری رو که هنگام نصب اوبونتو بسیار شاد انتخاب کردید می‌خواد؛ ولی هرچی تایپ می‌کنید هیچ حرفی وارد نمیشه!!! :)) ( حتی ستاره هم چاپ نمی‌شه )‌ در ابتدا تئوریِ هنگ کردن اوبوتو و … به ذهن شما خطور میکه، ولی باید بگم که رمز عبور رو درست وارد کنید و  Enter بزنید. و بعد از fetch ( لینوکسی‌ها چه چیزایی دارن ) شدن اطلاعات اولیه باید y رو بزنید و سپس enter  و بالاخره شما تونستید یک برنامه دانلود و نصب کنید!

 

 

Terminal

 

ـ البته همون اول رنگش اینجوری نیست، بخاطر تم اوبوتو بنفش هست ولی من بخاطر اینکه بیشتر شبیه فیلم‌ها باشه این رنگی کردم!

مهاجرین ویندوزی یادتون باشه برای خروج از ترمینال دکمه‌ی × گوشه‌ی بالا رو نزنید، بلکه بسیار هکرانه‌طور است که exit را تایپ کرده و Enter بزنید!

 

در مورد نصب چیزهایی مثل ویرایشگر عکس و … بعد از کمی تلاش تصمیم گرفتم از نسخه آنلاین استفاده کنم که به ‌Free Online Image Editor رسیدم. و عکس‌هایی که در این پست مشاهده میکنید با همین سایت ویرایش کردم.

حالا شما فکر کنید اگر بخوام چیزی مثل Android Studio نصب کنم و بعد Emoulator  و یا چیزی شبیه wamp یا xampp در ویندوز، باید چند سال تلاش کنم؟!

 

سخن آخر: نگاه طنزی که در بالا داشتم به کنار، شخصا به عنوان کسی که تجربه‌ی اندکی با اندروید دارم؛ معتقدم لینوکس بسیار کارآمد و قدرتمند است. می‌تونید توی همون ترمینالی که در بالا بهش اشاره کردم، کارهایِ شگفت‌انگیزی انجام بدید، کارهایی که در ویندوز شاید غیرممکن باشند. به شرط اینکه کمی عادات ویندوزیِ خودتونو کنار بگذارید و چند روز هم وقت بگذارید.

عکس – ۶ روز سیستم ادمین ها

دست نوشته‌های حامد - Fri, 07/31/2015 - 15:11

خب با توجه به شنیده ها امروز روز سیستم ادمین‌ها یا مدیران سیستم هست! منم از فرط بیکاری تو گوگل زدم sys admins meme تا یکم بخندم و این عکس به نظر جالب بود، گفتم شما هم ببینیدش :)

 

When-Bruce-Willis-is-a-Sysadmin_o_40032

اسکریپت انتقال فایل/فولدر بین هاست و سرور

دست نوشته‌های حامد - Wed, 07/29/2015 - 22:38

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

 

چند نکته درباره برنامه:

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

 

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

 

برای خرید این کد، به این صفحه مراجعه کنید.

یه سایت پر از گیف های مخصوص برنامه نویس ها

دست نوشته‌های حامد - Sat, 07/25/2015 - 14:47

نمیدونم تا حالا عکس‌های متحرکی که زیرشون یه توضیح نوشته که تو شرایط خاص حس همون عکس متحرک بهتون دست میده رو دیدین یا نه! سایت The Coding Love پر از گیف‌هایی هست که لحظات مختلف زندگی برنامه نویس‌ها رو به صورت طنز نمایش میده. البته مراقب مصرف اینترنتتون هم حتما باشین  &#x1f600;  یک نمونه از گیف‌هایی که تو این سایت دیدم و حسابی من رو خندوند رو براتون میذارم تا دقیق‌تر بدونین با چی طرف هستین!

 

وقتی که یه تازه کار یهویی میگه که زبون برنامه نویسی مورد علاقش css هستrAFv3CN

 

مستند شهروند چهارم

بیت‌ها - Wed, 07/08/2015 - 16:46

public computer
مستند شهروند چهارم، ساخته‌ی لورا پویترس، در اکتبر ۲۰۱۴ منتشر شد. مستندی ۱۱۴ دقیقه‌ای که به پشت پرده‌ی افشاگری‌های ادوارد اسنودن پرداخته، و علاوه بر جنبه‌هایی از این افشاگری‌ها که همه‌ی ما قبلا در رسانه‌ها پیگیری کرده‌ایم، نمایی هم از شخصیت و پشت پرده‌ی این قضایا برای ما نمایان می‌سازد.

شهروند چهارم مستندی‌ست که برای ما عیان می‌کند، زندگی ادوارد اسنودن به هیچ وجه شبیه آن چیزی نیست که ما در سریال ۲۴ یا سری فیلم‌های جیمز باید می‌بینیم. بلکه انسانی‌ست معمولی که تحت فشار دچار استرس می‌شود، معمولی صحبت می‌کند، و برای مخفی کردن چهره‌اش از عینک آفتابی استفاده نمی‌کند.

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

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

 

تریلر شهروند چهارم

لینک دانلود ویدیو

سریال Halt and Catch Fire

بیت‌ها - Wed, 07/01/2015 - 14:22

public computer

Halt and Catch Fire سریالی‌ست که از سال ۲۰۱۴ از شبکه HBO در حال پخش است، و تابحال فصل اول آن تمام شده و فصل دوم در حال پخش است. سریالی واقعا جذاب برای گیک‌ها و برنامه‌نویس‌ها و افرادی که به دنیای کامپیوتر علاقه دارند.

سریال Halt and Catch Fire در مورد شرکتی‌ست که در دهه ۸۰ که بدون شک اوج شکل‌گیری PCهایی‌ست که ما اکنون می‌شناسیم، قصد تولید یک PC را دارد، کامپیوتری که قرار است اولین لپ‌تاپ یا همان PC قابل حمل باشد. و اینجا قرار است تمام مشکلات، سختی‌ها، چالش‌ها و البته لذات پیش‌روی این افراد در مسیر تولید را ببینید.

بدون شک Halt and Catch Fire از نظر سینمایی به هیچ وجه قابل مقایسه با سریال‌هایی مانند Game Of Thrones نیست. و نهایتا بتواند یک سریال معمولی باشد. بطور کلی بسیاری از شخصیت‌ها درست پردازش نشده‌اند، روند قصه در مواردی دچار رخنه می‌شود و خیلی از اوقات هم ممکن است بخاطر کش‌دار شدنِ یک موضوع بی‌اهمیت از سریال خسته شوید. ولی اگر یک گیک تکنولوژی هستید؛ به هیچ وجه Halt and Catch Fire را از دست ندهید.

دانلود فیلم به شکل گیکی، دانلود خودکار فیلم از YIFY روی کامپیوتر

دست نوشته‌های حامد - Sun, 06/28/2015 - 17:01

فکر کنم همینکه یه بخش برای معرفی فیلم دارم نشون بده که اهل فیلم دیدنم و سایت مورد علاقم هم برای دانلود yts.to هست که رلیزهای YIFY توش برای دانلود قرار داره. گاهی که منتظر اومدن یک فیلم هستم خیلی واسم اعصاب خورد کنه که هی هر روز چک کنم ببینم اون فیلم برای دانلود اومده یا نه بعد اگه اومده بود تورنتش رو مستقیم کنم و لینک دانلودش رو از رو سرور خودم بردارم و بذارم تو لیست دانلودهام. برای همین گفتم بیام این فرایند رو خودکار کنم! اما قبل شروع کار بگم که اگه شما هم میخواین دقیقا عین کار من رو انجام بدین لازمه تا اول Deluge رو روی سرورتون نصب کنین و مثل من هم دانلوداتون رو انجام بدین. خب بریم وارد جزئیات کار بشیم!

اول از همه ببینیم دقیقا قراره چیکار کنیم! کدی که میخوایم بنویسیم اول باید بره ببینه اون فیلم مورد نظر برای دانلود اومده یا نه، بعد اگه اومده بود ببینه نسخه مورد نظرمون که برای من ۷۲۰ هست هم رلیز شده یا نه. بعد اگه نسخه مورد نظر هم اومده بود لینک دانلودش رو بده به Deluge تا دانلودش کنه و وقتی دانلودش کامل شد لینک دانلود فیلم بیاد تو لیست دانلودهام! قبل از اینکه بریم سراغ کدهای مورد نیاز این رو بگم که مسلما این روش که من دارم میرم بهترین روش نیست و این کد هم بهینه‌ترین کد ممکن نیست، ولی مهم اینه که در حال حاظر کاری رو که من میخوام بدون هیچ مشکلی انجام میده :))

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

touch /var/www/html/address.txt
chmod 777 /var/www/html/address.txt

 

خب، بریم سراغ اصل کد! لازمه ببینیم که فیلممون برای دانلود اومده یا نه! برای این کار محتویات صفحه اول yts.to رو توی یک فایل میریزیم و داخل اون فایل دنبال اسم فیلممون میگردیم. نیازی نیست که حتما دنبال اسم کامل فیلم بگردیم. برای نوشتن کد فرض رو بر این میذارم که مثل من منتظر فیلم Furious 7 هستین و بر همین اساس میریم جلو. خب اینم کدی که اسم فیلم رو پیدا میکنه:

w3m -dump yts.to > yts
a="$(grep "Furious" yts)"

 

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

if [ "$a" != "" ]
then

fi

 

از اینجا به بعد کد داخل این شرط قرار میگیره. امیدوارم بتونم بقیه کار رو خوب بتونم توضیح بدم! حالا که فیلم اومده باید ببینیم که نسخه ۷۲۰ هم اومده یا نه. اول بیاین یه نگاهی به سورس سایت yts.to بندازیم برای یک فیلم:

class="browse-movie-title">Cinderella</a> <div class="browse-movie-year">2015</div>  <div class="browse-movie-tags">   <a href="https://yts.to/torrent/download/6EB6804A6A4650FD64C9FC3257C2B2ECB7808F50.torrent">720p</a>    <a href="https://yts.to/torrent/download/93E545F95354D90539C51BC3A59AC685B613C75C.torrent">1080p</a>   </div>  </div> </div>

خب تو سورس قسمتی که مربوط به دانلود فیلم هست در ابتداش اسم فیلم به همراه یک < قبلش قرار داره و در انتها هم سه تا div قرار دارن. پس اول سورس صفحه رو توی یک فایل ذخیره میکنیم:

wget -O - yts.to > yts

 

و تو سورس صفحه هم با دستور egrep دنبال قسمت مربوط به فیلممون میگردیم. آپشن o هم که بکار بردم دلیلش این هست که فقط اون قسمتی که کد فیلم توش هست رو برگردونه نه کل محتویات فایل رو و کد مربوط به بخش دانلود فیلم رو توی متغییر temp‌ میریزیم:

temp="$(egrep -o "(>Furious).{10,400}(</div>  </div> </div>)" yts)"

درباره قسمت (>Furious).{10,400}(</div>  </div> </div>) هم بگم که یه ساختار regex هست (اسمش رو گوگل کنید تا بتونید هم اطلاعات بیشتری ازش کسب کنید هم یاد بگیرید چجوریه، خودمم با گوگل یاد گرفتمش) که میگه عبارت >Furious رو پیدا کن و بعد ۱۰ تا ۴۰۰ کاراکتر برو جلو تا به عبارت برسی. خب حالا باید ببینیم عبارت 720 توی متغییر temp‌ هست یا نه و اگه بود یعنی نسخه ۷۲۰ برای دانلود آمادست. پس توی متغییر temp رو میگردم:

temp="$(echo $temp | grep 720)"

 

حالا اگه نسخه ۷۲۰ اومده باشه یه چیزی توی متغییر temp‌ ذخیره میشه. پس یه شرط میذاریم تا متغییر temp رو چک کنه و ادامه کدمون رو توی اون شرط میذاریم:

if [ "$temp" != "" ]
then

fi

 

حالا تا اینجای کار میدونیم که فیلممون نسخه ۷۲۰ش برای دانلود اومده و باید از تو سرورس صفحه که توی فایل yts ذخیره شده لینک رو برداریم. برای برداشتن لینک مجددا سراغ egrep و ساختار regex‌میریم و البته قبلش هم با استفاده از mutt یه ایمیل میفرستم که بدونم فیلم روی yts اومده:

mutt -s "Furious 7" address@domain.com <<< "Ready To Download On YTS!"
tlink="$(egrep -o "(>Furious).{10,400}(</div>  </div> </div>)" yts | egrep -o "(http).{77}(720)" | egrep -o "(http).{1,100}(torrent)" | tail -1)"

درباره ساختار کد پیدا کردن لینک واقعا نمیدونم چجوری توضیح بدم فقط میتونم بگم خودتون مرحله به مرحله اجراش کنین سر در میارین چی به چیه و اون tail -1 آخر هم برای اینه که تو شرایطی خاص ممکنه لینک دانلود ۲ یا ۳ بار برگردونده بشه که با این دستور میکنیمش یکی و در نهایت هم لینک رو توی متغییر tlink داریم. حالا باید لینک رو بدیم به deluge. برای این کار از deluge-console استفاده میکنیم. اول روی سرور نصبش میکنیم که خوشبختانه تو مخازن موجود هست و با نوشتن deluge-console اجراش میکنیم و اخطار زیبای Failed to connect to 127.0.0.1:58846 with reason: Username does not exist مواجه میشیم. با نوشتن exit از برنامه deluge-console خارج میشیم و این دستور رو میزنیم:

cp /var/lib/deluge/.config/deluge/auth ~/.config/deluge/auth

 

حالا مجددا وارد deluge-console میشیم و میبینیم که هیچ پیغام خطایی نمیده. با نوشتن عبارت help هم میتونیم آپشن‌هایی که برای استفاده داره رو ببینیم.

deluge-console

 

کارمون فعلا با سرور تموم شد و میریم سراغ ادامه کدمون.  برای اضافه کردن فایل تورنت به deluge هم از این دستور استفاده میکنیم:

deluge-console add $tlink

لینک به deluge اضافه شده و باید صبر کنیم دانلود بشه. اول یک ساعت صبر میکنیم و اگه فایل دانلود نشده بود دوباره هر ۵دقیقه وضعیتش رو چک میکنیم:

sleep 3600
complete="$(deluge-console info Furious | wc -l)"
while [ "$complete" = "9" ]
do
	sleep 300
	complete="$(deluge-console info Furious | wc -l)"
done

با دستور info‌ میتونیم اطلاعات یک تورنت رو بگیریم و اگه تورنت کامل دانلود نشده باشه خروجیش میشه ۹ خط که تعداد خطوط خروجی رو هم با wc -l میشمریم و تا زمانی که دانلود تورنت کامل نشده باشه کد رو این قسمت گیر میکنه.‌حالا که دانلودش روی سرور کامل شده دوباره به خودم یه ایمیل میرفستم که بدونم دانلودش تموم شده:

mutt -s "Furious 7" address@domain.com <<< "Ready To Download On Your Computer!"

حالا باید برم سراغ تولید لینک دانلود فایل. من تورنت‌هام تو مسیر var/www/html/torrents دانلود میشن پس از این دستور برای ساخت لینک دانلود فایل و ذخیرش در متغییر address استفاده میکنم:

address="http://server_ip/torrents/""$(cd /var/www/html/torrents && ls | grep Furious)""/""$(cd /var/www/html/torrents/Furious* && ls | grep mp4)"

اینم توضیح خاصی نداره &#x1f600; حالا لینک دانلود رو تو فایل address.txt که اول کار ساختیم میریزیم:

echo $address > /var/www/html/address.txt

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

w3m -dump http://server_ip/address.txt >> /home/hamed/dllinks

دلیل این هم که فایل address.txt رو اول کار رو سرور درست کردم این بود که اگه این فایل وجود نداشته باشه و سیستم سعی کنه محتویاتش رو بگیره ارور ۴۰۴ دریافت میکنه و نوشته‌های ارور ۴۰۴ تو لیست دانلودم قرار میگیره و این اصلا جالب نیست ولی اگه این فایل وجود داشته باشه و داخلش خالی باشه همون هیچی تو لیست دانلودهام قرار میگیره و هیچ مشکلی ایجاد نمیشه! اما یه مشکل دیگه هم هست! اومدیم و این فایل داخلش لینک دانلود فیلممون قرار گرفت و ما هم این فیلم رو دانلود کردیم، شب‌های بعد هم سیستم میره دوباره از اینجا لینک دانلود فیلم رو برمیداره و میذاره تو لیستمون! برای اینکه این کار انجام نشه میام و از تابع shell_exec‌ تو php استفاده میکنم که باهاش میشه دستورات خط فرمان رو اجرا کرد. دلیل تغییر سطح دسترسی فایل address.txt به ۷۷۷ هم این بود که بتونیم راحت از طریق فایل php تغییرش بدیم. خب فایل php مورد نیاز رو ایجاد میکنیم:

nano /var/www/html/rmadr.php

و داخلش این کد رو قرار میدم:

<?php
shell_exec('echo "" > address.txt');
?>

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

w3m -dump http://server_ip/address.txt >> /home/hamed/dllinks && w3m -dump http://server_ip/rmadr.php

اوه! تقریبا یادم رفت کد کاملی که قراره روی سرور اجرا بشه رو بذارم. کدنهایی که روی سرور باید اجرا بشه این هست:

w3m -dump yts.to > yts
a="$(grep "Furious" yts)"
if [ "$a" != "" ]
then
	wget -O - yts.to > yts
	temp="$(egrep -o "(>Furious).{10,400}(</div>  </div> </div>)" yts)"
	temp="$(echo $temp | grep 720)"
	if [ "$temp" != "" ]
	then
		mutt -s "Furious 7" address@domain.com <<< "Ready To Download On YTS!"
		tlink="$(egrep -o "(>Furious).{10,400}(</div>  </div> </div>)" yts | egrep -o "(http).{77}(720)" | egrep -o "(http).{1,100}(torrent)" | tail -1)"
		deluge-console add $tlink
		sleep 3600
		complete="$(deluge-console info Furious | wc -l)"
		while [ "$complete" = "9" ]
		do
			sleep 300
			complete="$(deluge-console info Furious | wc -l)"
		done
		mutt -s "Furious 7" address@domain.com <<< "Ready To Download On Your Computer!"
		address="http://server_ip/torrents/""$(cd /var/www/html/torrents && ls | grep Furious)""/""$(cd /var/www/html/torrents/Furious* && ls | grep mp4)"
		echo $address > /var/www/html/address.txt
	fi
fi

این کد نهایی هست که باید هر چند دقیقه اجرا بشه و چک کنه که فیلم برای دانلود اومده. که میشه این کار رو با crontab‌کرد که هر چند دقیقه یکبار اجرا بشه. البته باید یکم تغییرات ایجاد کنین که وقتی یکبار کد اجرا شد و لینک دانلود نسخه۷۲۰ رو داد به deluge‌کد دیگه اجرا نشه. نمیدونم چرا ولی من نتونستم از طریق crontab این کد رو اجرا کنم. برای همین کل کد رو داخل یک حلقه while قرار دادم که تا زمانیکه نسخه ۷۲۰ رو پیدا میکنه و به deluge‌ میدش در حال اجرا باشه!

work=0
while [ "$work" = 0 ]
do
	sleep 900
	w3m -dump yts.to > yts
	a="$(grep "Furious" yts)"
	if [ "$a" != "" ]
	then
		wget -O - yts.to > yts
		temp="$(egrep -o "(>Furious).{10,400}(</div>  </div> </div>)" yts)"
		temp="$(echo $temp | grep 720)"
		if [ "$temp" != "" ]
		then
			work=1
			mutt -s "Furious 7" address@domain.com <<< "Ready To Download On YTS!"
			tlink="$(egrep -o "(>Furious).{10,400}(</div>  </div> </div>)" yts | egrep -o "(http).{77}(720)" | egrep -o "(http).{1,100}(torrent)" | tail -1)"
			deluge-console add $tlink
			sleep 3600
			complete="$(deluge-console info Furious | wc -l)"
			while [ "$complete" = "9" ]
			do
				sleep 300
				complete="$(deluge-console info Furious | wc -l)"
			done
			mutt -s "Furious 7" address@domain.com <<< "Ready To Download On Your Computer!"
			address="http://server_ip/torrents/""$(cd /var/www/html/torrents && ls | grep Furious)""/""$(cd /var/www/html/torrents/Furious* && ls | grep mp4)"
			echo $address > /var/www/html/address.txt
		fi
	fi
done

برای این هم که کد حتی بعد از قطع اتصال ssh درحال اجرا بمونه اول برنامه screen رو از تو مخازن نصب کردم. بعد از اون با نوشتن screen وارد برنامه شدم و برای رد کردنم توضیحات هم space رو زدم و داخل برنامه screen کد رو اجرا کردم. حالا برنامه همیشه درحال اجرا میمونه روی سرور و هر ۱۵ دقیقه یکبار سایت yts.to رو چک میکنه تا اگه فیلم اومد کارای مورد نیاز رو انجام بده.

بررسی نظریه احتمالات در پایتون - بخش اول

داده‌های خام - Fri, 06/12/2015 - 18:51

بازی‌هایی که در اون‌ها از تاس استفاده می‌شه معمولا تا حد زیادی به شانس بستگی داره. افراد مختلف تعاریف مختلفی از شانس دارن، عده‌ای سعی می‌کنن که با تمرکز روی یک عدد یا دعا کردن شانس خودشون رو برای ریختن تاس مناسب افزایش بدن و عده‌ای هم به روش‌های مختلف دست به تقلب می‌زنن. اما ریاضیات تعریف متفاوتی از شانس داره. ریاضیات، شانس رو «اندازه‌ی احتمالِ وقوعِ یک رویداد» تعریف می‌کنه که با یک عدد بین ۰ و ۱ نمایش داده می‌شه و همون‌طور که می‌دونین در مبحث احتمالات بررسیش می‌کنه.

از اونجا که ایده‌ی تاس اینه که ما به یک روشی یک عدد تصادفی بین ۱ تا ۶ انتخاب کنیم، من این کار رو به راحتی با استفاده از ماژول random در پایتون شبیه‌سازی می‌کنم تا بتونم بعدا بررسیش کنم:

die_probability.py

import random


def roll_die(num_sides, true_random=False):
    '''simulates rolling a die, if true_random is set, it will use random.org
    to produce true random numbers. be careful though, it might take a lot
    of time and the difference is really not that much.'''
    if true_random is True:
        import randomdotorg
        r = randomdotorg.RandomDotOrg('alimsvi.ir')
        return r.randrange(1, num_sides + 1)
    return random.randrange(1, num_sides + 1)

بر اساس چیزی که ریاضیات می‌گه، فرض کنید ما یک تاس عادلانه‌ی ۶ وجهی داشته باشیم که روی هر وجه اون یکی از اعداد بازه‌‌ی از ۱ تا ۶ نوشته شده باشه. هر عددی رو که در این بازه در نظر بگیریم و تاس رو بریزیم، احتمال این که عدد مورد نظر ما بیاد \(\frac{1}{6}\) است.

یک روش امتحان کردن این مساله می‌تونه به این صورت باشه که ما بارها تاس مورد نظرمون رو بریزیم و انتظار داشته باشیم که میانگین دفعاتی که تاس مورد نظرمون ریخته شده نزدیک به \(\frac{1}{6}\) باشه. و این یعنی اگر میانگین رو M در نظر بگیریم، اختلاف M با عدد \(\frac{1}{6}\) باید نزدیک به صفر باشه.

از اونجایی که من حوصله ندارم یک تاس رو «بارها» بریزم و نتیجه‌ها رو یادداشت کنم و در آخر میانگین مورد نظرم رو بررسی کنم، چند خط کد پایتون می‌نویسم و این مساله رو با یک نمودار بررسی می‌کنم:

die_probability.py

def plot_fairness_line(num_sides, max_trials, step, side):
    '''tests the difference between expected average and the real average
    produced after rolling a die for a range of trials.'''
    diff_data = []
    num_trials_data = []
    for num_trials in range(1, max_trials, step):
        side_count = 0
        for dummy_idx in range(num_trials):
            result = roll_die(num_sides)
            if result == side:
                side_count += 1

        statistical_prb = 1.0 / 6
        computed_prb = side_count / float(num_trials)
        diff_data.append(computed_prb - statistical_prb)
        num_trials_data.append(num_trials)

    pyplot.plot(num_trials_data, diff_data)
    pyplot.xlabel("Number of trials ran on dice.")
    pyplot.ylabel("Difference between expected and computed results")
    pyplot.grid(True)
    pyplot.ylim((-0.5, 0.5))
    pyplot.title("Fairness of a Die in Python")
    pyplot.show()

plot_fairness_line(6, 10000, 10, 2)

نموداری که با اجرای این کد نمایش داده می‌شه مشخص می‌کنه که هر چه تاس بیشتری ریخته شده اختلاف میانگین با \(\frac{1}{6}\) بیشتر به صفر نزدیک شده:

/images/die_probability_1.thumbnail.jpeg

برای این که مفهوم‌تر بشه، قضیه رو یک جور دیگه امتحان می‌کنیم. فرض کنید تاس رو ۳۰۰۰ بار بریزیم، با توجه به این که \(\frac{1}{6}*3000=500\) ، می‌تونیم انتظار داشته باشیم که هر یک از اعداد روی تاس حدوداً ۵۰۰ بار ریخته بشن. بنابراین می‌تونیم چند خط کد دیگه بنویسم که ۳۰۰۰ بار تابع ما رو اجرا کنه، اعدادی رو که ریخته می‌شن بشمره و در نهایت نتیجه رو در یک نمودار دیگه بررسی کنیم:

die_probability.py

def plot_fairness_bar(num_sides, num_trials, true_random=False):
    '''rolls the die for "num_trials" times and calculates the number of
    times each side of the die was shown, it then shows a bar plot'''
    data = {key: 0 for key in range(1, num_sides + 1)}
    for dummy_idx in range(num_trials):
        data[roll_die(num_sides, true_random)] += 1

    x_data = [key for key in data.keys()]
    y_data = [value for value in data.values()]

    pyplot.bar(x_data, y_data, width=0.3, align='center')
    pyplot.title("Fairness of a Die in Python")
    pyplot.xlabel("side of the die")
    pyplot.ylabel("Number of times the number produced")
    pyplot.grid(True)
    pyplot.show()

plot_fairness_bar(6, 3000)

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

/images/die_probability_2.thumbnail.jpeg
نتیجه‌

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

در بخش بعدی به معرفی روش مونت کارلو (Monte Carlo method) و استفاده‌‌اش در طراحی هوش مصنوعی برای انجام بازی‌ها و محاسبه حرکت بعدی در بازی، خواهم پرداخت.

ویرایش

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

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

برای امتحان حرف مهدی، من کد توابع رو توی پست عوض کردم و همین‌طور که می‌بینید به تابع roll_die یک آرگومان جدید اضافه کردم که در صورت استفاده ازش، با استفاده از ماژول randomdotorg از طریق وبسایت مذکور اعداد تصادفی واقعی به دست بیاد و این رو در تابع plot_fairness_bar اعمال کردم و با خط زیر امتحانش کردم:

die_probability.py

plot_fairness_bar(6, 3000, true_random=True)

طبیعتا مدت زیادی طول کشید تا ۳۰۰۰ عدد تصادفی از طریق وبسایت random.org تولید بشه و با سرعت و کیفیت بالای اینترنت اینجا، به دست من برسه. ولی نتیجه‌ی نهایی نمودار زیر شد:

/images/die_probability_3.thumbnail.jpeg

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

Categories:

ارائه پروتکل XMPP

در جلسه ۱۷۱ ام لاگ مشهد ارائه‌ای با موضوع پروتکل XMPP داشتم. اسلاید‌های این ارائه رو در این آدرس می‌تونید ببینید.

Categories:

Pages

Trigup Fanap O'Reilly Media
iranserver

زبان‌ها