بیژن بینایی GitHub
بیژن بینایی Rss

چهارمین عیدی بلاگ

نوشته شده توسط بیژن | در دسته لینوکس, معرفی نامه | نوشته شده در ۰۳-۰۱-۱۳۹۵

۳

google-blueعیدی امسای مثل اولین عیدی یه برنامه است. از همین اول یکم غر غر کنم که راه انداختنش خیلی آسون نیست و تا دستاتون کدی نشه نمی تونید کار کردنش رو ببینید.
با این حال واسه این اسمشو گذاشتم عیدی چون باور دارم که توی مسیر ساختش نکته های جالبی هست که می تونه یادگرفتنشون مفید باشه.

نام برنامه، Assistant، از روی علاقه من به داشتن یک ربات custom made برای کمک تو کارهای روزانه اومده. که گرچه این اوایل یکم ضایع به نظر میاد ولی مطمینم یه روزی می تونه کارهای خیره کننده ای انجام بده. اما چی شد که رفتم سراغ ساختنش.
روزانه من معمولا توی کتاب خوندنم به یه سری لغت جدید برخورد می کنم که نمی دونم معنیشون چیه. پس برای اینکه دوباره دفعه بعدی لنگ معنیش نمونم و  سرعت خوندنم افزایش پیدا کنه لغت ها رو یادداشت می کنم و توی وقتای پرتی مثل راه خونه تا دانشگاه مرورشون می کنم. بعد کمی گذر زمان فهمیدم که استفاده از یه ابزار automate تر می تونه خیلی کارم رو راحت تر کنه و واسه همین بود که رفتم سمت translate گوگل.

اوایل هم سرویسشون بد نبود اما وقتی تعداد لغت هام زیاد شد زوار گوگل در رفت و crash پشت crash نمی گذاشت درست روی خوندن تمرکز کنم. چندین بار هم این موضوع رو به بچه هاشون گذارش کردم اما مث که نه کسی وقتشو داشت نه حوصلشو. تا اینکه خودم دست به کار شدم و تصمیم گرفتم به عنوان اولین فاز پروژه assistant این مشکل رو حل کنم. assistant فعلا کاری که می کنه روزانه چند بار phrasebook رو از گوگل درخواست می کنه. کلمات رو ترجمه می کنه و اگر already در phrasebook اتون نبود ازتون می پرسه که آیا تمایل به اضافه کردنش دارید با نه.

و یه سری feature های دیگه که اگه عمری بود و برنامه release شد گذاشتم تا خودتون کشفش کنید

بریم سراغ مشکلاتی که بهشون خوردم برخورد کردم و راه حل اون ها

  • مشکل اول: نبود API از طرف گوگل

اولین مشکلی که باهاش مواجه می شیم نبود API رایگان از طرف گوگل هست. بله کار من باز هم دزدی هست و به صورت official هیچ برنامه ای حق نداره بدون پرداخت هزینه از سرویس translate گوگل استفاده کنه. برای رفع این مشکل می شه با sniff کردن پکت هایی که ارسال می شه و کمی فکر header های ارسالی رو بررسی کرد و دید که با فرستادن چه request ای می شه به اونچه که می خوایم رسید.

اینجا نمی خوام خیلی این داستان ها رو توضیح بدم اما بجاش یکم به نحوه کار پروتکل HTTP در داخل شبکه می پردازیم.

اینترنت به طور معمول دو تا پروتکل به ما ارایه می ده. TCP و UDP. که اولی با ارسال error checking هاش خطا رو به صفر می رسونه و دومی با حذف قسمت ECC به شما قابلیت ارسال با سرعت های بالاتر رو می ده (شاید یکی از دلایلی که مودم 54Mbit/s خوشگلتون سرعت ارسال فایلش بیشتر از یکی دو مگ نیس همین TCP جان باشه). با توجه به این که ما معمولا صحت رو به سرعت ترجیح می دیم تو اینترنت کمتر سر و کله UDP رو شما می بینین و بنابراین فعلا فرض کنید که همه چی بر پایه TCP هست. بنابراین HTTP هم از این قضیه مستثنی نیست و اون هم یه TCP سادست. بقیه پرت ها از ftp و telnet و .... همه و همه tcp هستن. برای صحبت کردن با این پروتکل ها یه راه ساده وجود ذاره و اونم کامند telnet هست که گرجه شاید ظاهرا برای پروتکل telnet باشه ولی می تونه هر پروتکل متنی رو handle کنه. و باز HTTP مستثنی نیست. پس شما می تونین با telnet به گوگل وصل شید. درخواست یه چیزی رو بدین و ببینین که خیلی شیک گوگل هم پاسختون رو می ده.

برای این کار یکم بیشتر بیایین HTTP رو درک کنیم. Hypertext Transfer Protocol هست اون Hyper هم یعنی فرا متن. منظور از فرا این هست که متن هامون به هم دیگه لینک شدن و می شه با کلیک روی لینک ها به جاهای مختلف متن رفت. به عبارت دیگه امکان جا به جایی (توسط لینک ها) متن ما رو به فراتر از یک متن عادی تبدیل می کنه. پروتکل HTTP فعلا سه نسخش مرسوم هست. نسخه HTTP/1.0 , HTTP/1.1 و HTTP/2.0.

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

دو چیز دیگه بجز مشخص کردن ورژن باید مدنظر داشته باشید. url ای که از سرور می خواید و نوع درخواستتون. آدرس که مشخص هست اما نوع درخواست

ما در پروتکل HTTP دو نوع درخواست کلی داریم. GET و POST. تمام دانلود ها، باز کردن صفحه ها و .... همه و همه از نوع درخواست GET هستن. و تمام داده هایی که شما برای سرور می فرستین (از username و password تا آپلود فایل) از نوع POST.

خب حالا برای اینکه یکم شما رو شور بگیره ترمینال رو باز کنید و مثل من بیاید جلو.

$telnet google.com 80
Trying 173.194.32.160...
Connected to google.com.
Escape character is '^]'.
GET / HTTP/1.1
HOST: google.com

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

HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/
Content-Type: text/html; charset=UTF-8
Date: Tue, 22 Mar 2016 08:16:06 GMT
Expires: Thu, 21 Apr 2016 08:16:06 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 219
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
Connection closed by foreign host.

بقیش رو دیگه خودتون برید پیدا کنید فقط یه نکته اینجا بگم راجع به HTTPS. نسخه Secure پروتکل HTTP یا HTTPS همون HTTP هست که قبل ارسال encode می شه. بنابراین دیگه نمی تونید از نرم افزاری مثل telnet برای صحبت استفاده کنید. دو تا برنامه به شما امکان صحبت به زبون HTTPS رو می دن که من دستوراتشون رو می گذارم اینجا (اگه براتون عجیب بود تو نظرات بپرسید)

(cat request; sleep 2) | openssl s_client -quiet -connect google.com:443  > 1
curl https://google.com -H `cat request`
  • مشکل دوم: پردازش چرندیات گوگل

گوگل به ما یه فایل خیلی زشت بر می گردونه که قبل از استفاده ازش باید حموم بشه. که برای این کار دو برنامه awk و sed رو من استفاده کردم. که با تو مثال کوچیک هر کدوم رو توضیح می دم

awk برای جدا کردن قسمت هایی از متن برای پردازش های بیشتر به کار می ره مثلا کامند زیر

$echo "hi bijan" | awk '{print "your name is", $2}'
your name is bijan

کامند بالا می یاد دومین کلمه از ورودی رو می زاره جای دلار۲ و متن رو چاپ می کنه

awk به طور کلی یک زبون برنامه نویسی هست تا یک دستور ولی خب معمولا بیشتر به این فرم استفاده می شه گرچه فرم script ایش هم کم نیست

دستور دوم sed هست

sed به ما اجازه می ده که find and replace های

پیشرفته انجام بدیم. اما به خاطر گستردگی زیادش واردش نمی شم. تو سایت grymoire این مبحث به خوبی پوشش داده شده

  • مشکل سوم: خذف قابلیت های خوب libnotify

سال ها پیش gnome واقعا عالی بود و جزء جزء اش رو می شد با تمام وجود دوست داشت. شما می تونستین کوچکترین چیزیش رو که خوشتون نمی یومد با چند تا command ساده عوض کنید. اما با اومدن gnome 3 مشتی طراحی های احمقانه برنامه های خوبی مثل nautilus و box و ... رو به یک برنامه آشغال بدرد نخور تبدیل کردن.

اگه یادتون باشه تو عیدی اول هم من از libnotify استفاده کردم اما توی ورژن های جدیدش یکی از بهترین ویژگی ها یا ویژگی timeout و خیلی ویژگی های خوب دیگه حذف شده. بنابراین من هم تصمیم گرفتم به کلی notification گنوم رو بگذارم کنار و خودم یه سیستم notification بسازم.

و اینجا qml خیلی خیلی کمکم کرد.

qml بعد html یکی از بهترین زبون هایی هست که می شه باهاش UI طراحی کرد. خوبیش اینه که دقیقا مثلا HTML یک زبون markup هست. و مثل css می شه به هر المان یه سری ویژگی ها داد

  • مشکل چهارم: صحبت با سرور

ادامه رو کم کم در طول عید کامل می کنم

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

 

راستی برنامه رو GitHub هست. در حال حاضر هم فک کنم نمی شه به این راحتی ها نصبش کرد پس تلاش نکنید

Assistant

نظرات (۳)

هه بایژن
مغزتو جالب بود

anki " ro ye negah bndaz , albate ag ghablan nadidish "

ههه
اتفاقا من بعد اینکه پروژه رو زدم یه سرچ کردم دیدم مث که قبل من یکی این راهو رفته بود
( parse کردن phrasebook گوگل بود)
و با anki آشنا شدم. خیلی عالیه
ممنون

-------------
برا import کردن phrasebook
https://github.com/jamhed/anki