چرا گنو/لینوکس رو دوست دارم یا چطوری چت رو از کامند لاین شروع کنین

توجه: این پست در مورد فلسفه نرم افزار آزاد است. این پست در مورد برنامه نویسی و آموزش اون نیست.

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

قدیم ها gnome-do تا حدی جوابگو بود ولی نه اونقدر که من می خوام و … چرا خودم ننویسم چیزی که می خوام رو؟ اینجا لینوکسه، دنیای آزاد و مشارکت و سوار شدن روی دوش غول‌هایی که قبلا زحمات متنوع رو کشیدن تا ما راحت بالا بریم.

قدم اول اینه که چطوری می‌تونم به مسنجری که بازه پیام بفرستم. جواب DBus است. یک مفهوم بسیار جذاب و کاربردی توی گنو/لینوکس ها که توسط ردهت توسعه پیدا کرده و الان همه ازش استفاده می کنن. ایده کار اینه: هر برنامه ای که اجرا می شه اگر بخواد به بقیه هم سرویس بده خودش رو روی دی.باس (اتوبوس دسکتاپ) رجیستر می کنه و اعلام می کنه که یکسری سرویس داده و یکسری قابلیت. بعد بقیه برنامه ها می تونن به همین خط اتوبوس (دی.باس) وصل بشن و از برنامه های متنوع درخواست کارهایی که دارن رو بدن. شماتیکش رو براتون کشیدم:

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

$ im.py "ali_banaii@gmail.com" "aafiat bashe"

حالا کافیه برنامه من در هر بار اجرا به دی باس وصل بشه:

bus = dbus.SessionBus()
obj = bus.get_object("im.pidgin.purple.PurpleService", "/im/pidgin/purple/PurpleObject")
purple = dbus.Interface(obj, "im.pidgin.purple.PurpleInterface")

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

for thisAccount in purple.PurpleAccountsGetAllActive():
  myname = purple.PurpleAccountGetUsername (thisAccount)
  for buddy in purple.PurpleFindBuddies(thisAccount, '' ):

و اگر اسم این دوستم با اسمی که بهش دادم مساوی بود، پیام رو براش بفرسته:

      thisConv = purple.PurpleConversationNew(1, thisAccount, foundName)
      purple.PurpleConvImSend (purple.PurpleConvIm(thisConv), sys.argv[2])

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

jadi@jint:~$ im.py banae "aafiat bashe"
Send ' aafiat bashe ' to  ali banaii ( ali_banaii@gmail.com ) ? y

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

  • مهدی بیگی

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

  • کیوان

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

  • جادی

    کیوان جان هر بخش لینوکس برای یکی جالبه دیگه. برام جذابه بدونم تو از چیش خوشت میاد (:

  • جادی‌، تو دو تا چیز داری که بهش حسودی می‌کنم‌! اولی این که خیلی خیلی زودتر از من با لینوکس آشنا شدی‌. دومی این که خلاقیت‌های ساده و جالبی داری‌.
    دستت درد نکنه‌.

  • خیلی جالب بود! همیشه از خوندن پستای جذاب و هوشمندانت لذت می‌برم! بابت معرفی FuzzyWuzzy هم ممنون!

  • جادی

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

  • واقعا عالی بود! با این مطلب‌های لینوکس‌ت خیلی حال می‌کنم!
    حالا سه تا موضوع!
    اولا شما یعنی اسم دی‌باس رو هم نشنیده بودی؟ چطوری پیداش کردی؟!
    دوما یه سوال فلسفی! اینجوری همه برنامه‌ها می‌تونن با هم ارتباط داشته باشن. این خوبه اما امنیت نداره! فرض کن یه شبه ویروس می‌تونه برای همه دوستای شما لینک بفرسته و …
    سوما چطوری میشه دستورهای دی‌باس بقیه برنامه‌ها رو پیدا کرد؟ فکر کن با فایرفاکس چه کارا که نمیشه کرد! یا حتی با استاردیکت!

  • جادی

    سمیک: اسم دی باس رو شنیده بودم و می دونستم چیه ولی باهاش برنامه ننوشته بودم. باید از معماری چیزی که باهاش کار می کنیم درک داشته باشیم و بعد در موارد لزوم جزییات کار باهاش رو راحت می شه پیدا کرد.

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

    سوم: باید به مستندات خود اون برنامه ها نگاه کنی و ببینی روی دی باس چه امکاناتی بهت میدن. مثلا مال پیجین که من از روش برنامه ام رو نوشتم اینجاست: http://developer.pidgin.im/wiki/DbusHowto

  • finaprp

    فقط pidgin یا kopete هم داره ؟

  • finaprp

    کیوان جان به 50 نفر تو لیت دوستان یه پیغام رو فرستادم فقط اون دستورات رو 50 بار کپی پیست کردم و با find ، replace راحت اسم کاربری ا رو تغییر دادم.

    این خوب نیست؟

    در ضمن مقالت فوق العاده است! شگفت انگیز و جادویی!

    جادی جادویی!

    در ضمن یهکیشون که براش afiat bashe رفته بود،دیدم جواب داد از کجا فهمیدی سرفه کردم!!

  • مرسی!
    :)

  • K1

    ممنون، عالی :)

  • یعنی این DBus خداست. برای Choqok با کمک مهرداد سعی می‌کردم Send Now Listening رو ارتقابدم که تو همین زمان با MPRIS آشنا شدم. یعنی این که دیگه نیاز نیست برای هر پلیر ما بیایم کد رو تغییر بدیم. هر پلیری که این واسط رو داشته باشه، خود به خود توی Choqok پشتیبانی می‌شه.

  • علیرضا

    عالیه! فقط من مثل اینکه یه جاییش اشکال دارم. میشه کد رو کامل بذاری؟
    (در ضمن، با این کار هم دیگه میتونیم راحت توی پیجین send to all بزنیم! این یکی از مشکلات من با پیجین بود!)

  • Pingback: راهنمای کوتاه کار با DBus در پایتون (نوشتن روبات پاسخگو برای Pidgin) | شاهینیسم()