من و راسبری-پی و دانلودهای شبانه

یه دونه راسبری پی خریدم که تو خونه گذاشتم و باهاش عشق دنیا رو می‌کنم. چند وقتی بود که می‌خواستم مثل این یادداشت بیت نیم‌سوز یه مدیر دانلود روش راه بندازم. چیزی که هدفم بود این بود که (۱) خیلی راحت بتونم فایل‌هام رو به لیست دانلودهام اضافه کنم (۲) دانلود خیلی اتوماتیک و تمیز انجام بشه.

ساختن لیست دانلودها
تو یه پوشه از هاستم یه اسکرپت کوچیک php گذاشتم که هر چی براش بفرستم، به آخر یه فایل تکست اضافه می‌کنه. به این ترتیب هر جا که باشم، لینکایی که می‌خوام دانلود شن رو خیلی تمیز برای این اسکریپت می‌فرستم و و این اسکریپت برام لیست دانلودهام رو می‌سازه. مثلا:

من php بلد نیستم، واسه همین هم اصل اسکریپت رو از این‌جا برداشتم و یه کم تغییرش دادم. این هم اسکریپت تغییر پیدا کرده:

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

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

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

و تمام. حالا می‌تونم با یه کلیک از هر جای دنیا لینک دانلود فایلی که می‌خوام رو تو سایتم ثبت کنم.

انجام دانلود
نظم دادن به خود دانلود دردسر زیادی نداره. باید یه اسکرپت داشته باشم که تو یه فاصله زمانی مشخص دانلودهام رو انجام بده.
تو اسکریپت اول از هم می‌رم به فولدر دانلودها و فایل dllist.txt رو (بعد از پاک کردن فایل قبلی) از سرور می‌گیرم:

برای استفاده از این فایل به دو تا فایل دیگه هم احتیاج دارم. یه فایل به اسم done.txt که لیست فایلایی رو نگه می‌داره که دانلودشون تکمیل شده، و یه فایل به اسم active.txt که لیست فایلایی هست که هنوز دانلودشون انجام یا کامل نشده. بعد از دانلود فایل dllist.txt، اولین کار اینه که ازش فایل done.txt رو فریق کنم تا فایل active.txt تشکیل بشه:

دستور comm تفریق رو انجام می‌ده. معنی پارامترهاش رو هم می‌شه راحت تو منوال‌هاش دید.
مرحله بعد اینه که یه حلقه بنویسم که تا وقتی فایل active.txt خالی نشده، فایلای اون تو رو یکی یکی (۱) دانلود کنه (۲) بعد از اینکه دانلودشون تموم شد، بذاره تو done.txt و (۳) فایل دانلود شده رو از active.txt خارج کنه:

فقط خط اول حلقه یه کم توضیح می‌خواد. لینک‌ها تو فایل لینکای من به شکل کدبندی درصدی می‌یاد. از طرف دیگه wget میونش زیاد با این فرمت کدبندی درصدی خوب نیست و ممکنه اسم فایلا رو به هم بریزه. برای همین با استفاده از بخش sed و echo اون پایپ‌لاین لینک‌ها رو به شکل اول برمی‌گردونم. (راستش این مشکل رو با پرسیدن سوال حل کردم.)
و نهایتا اسکریپت ما این شکلی خواهد بود:

والبته یادم نمی‌ره که مجوز اجرایی هم بهش بدم.

خوب برای اجرای این اسکریپت به شکل منظم یه cron احتیاج دارم که البته کار باهاش رو قبلا این‌جا تجربه کرده بودم. اینا هم دستورایی هستن که تو cron می‌ذارم. به این ترتیب اسکریپت عزیز دانلودها رو ساعت یک شب شروع و ساعت ۹ صبح قطع می‌کنه. فکر کنم واضح باشن:

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

آپدیت: اسکریپت‌ها به گیست اضافه شد و از آنجا در متن قرار گرفت.

خوندن و نوشتن ایمیل با Geary

درباره ایمیل کلاینت Mutt (یه ایمیل کلاینت متنی) گفته شده:

‪All mail clients suck. This one just sucks less.‬

واقعیت اینه که کار با ایمیل کلاینت‌های مرسوم چندان لذت‌بخش نیست:

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

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

امیدوارم لذت ببرید.

یه makefile کلی برای پروژه‌های ‪C++

اگه makefile پروژه‌های ‪C++‬ رو با روش‌های معمول بنویسیم، مجبوریم که مرتب با هر بار اضافه کردن یه فایل به پروژه makefile رو هم به روز رسانی کنیم. هر بار هم که وابستگی اون فایل تغییر می‌کنه ناچاریم این کار رو دوباره انجام بدیم. دنبال راه حل این مساله بودم که با سوییچ‌های خانواده M کامپایلر گنو آشنا شدم. این سوییچ‌ها به کامپایلر می‌گن که وابستگی یه برنامه رو به فرمت makefile بیرون بکشه. اگه این وابستگی‌ها رو تو یه فایل ذخیره کنیم می‌تونیم بعدا با دستور include از اون‌ها برای معرفی وابستگی‌ها استفاده کنیم.

  • سوییچ M این وابستگی‌ها رو بیرون می‌کشه
  • سوییچ MM مثل M اما فایل‌هایی که تو دایرکتوری‌های سیستم هستن رو به عنوان وابستگی معرفی نمی‌کنه.
  • سوییچ MF خروجی رو تو یه فایل می‌ریزه
  • سوییچ MT هم target مربوط به rule رو عوض می‌کنه. به طور پیش‌فرض قاعده تولید شده به اسم فایل ورودی منهای اسم و دایرکتوری و پسونده. در حالتی که بخوایم قاعدمون اسم دیگه‌ای داشته باشه از این سوییچ استفاده می‌کنیم. مثلا اینجا اسم قاعدمون رو به اسم آبجکت فایل با دایرکتوریش تغییر دادم.

دیگه؟ با اون ‪.PHONY‬ هم به make می‌گم که قاعده‌هایی که بعدش اومده اسم فایل نیست.
این هم makefile ما:

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

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

خوب آی پی شبکه رو میشه از روی صفحه روتر دید. این آدرس اون صفحست: ۱۹۲.۱۶۸.۱.۲۵۴/status/status_deviceinfo.htm و برای رفتن به اون صفحه هم یوزر (admin) پسورد (۱۲۳۴) می‌خواد. حالا باید یه جوری به خط فرمان بگم که این صفحه رو بخونه. برای این کار از دستور curl استفاده می‌کنم:

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

توی خروجی، آی پی تو خط آخره، پس باید خط آخر رو بکشم بیرون:

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

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