اختاپوس خسته

یادداشت‌هایی پیرامون کد، زندگی و دوستان

برنامه‌نویسی شبکه در ویندوز/لینوکس: libcpnet

کارفرمای کاری که الان دارم انجام میدم اصرار داره که برنامه‌ش علاوه‌بر لینوکس روی ویندوز هم به‌خوبی اجرا بشه. مدیر من کاملاً این محدودیت رو پذیرفته و به کارفرما گفته که با سخت‌افزاری که مشخصاتش رو اعلام می‌کنیم و با مشخصات کارکردی که اعلام می‌کنیم، روی ویندوز هم می‌تونید برنامه رو اجرا کنید. خوب این تصمیم مشکلات بسیار بزرگی برای برنامه‌نویس به‌وجود میاره. ازجمله برنامه‌نویسی شبکه… این پست به بررسی این مشکلات و ارائهٔ یک راه حل خوب خواهد پرداخت (: اگر قصد دارید کدی بنویسید که هم روی ویندوز و هم روی سیستم‌عامل‌های واقعی بتونه از شبکه استفاده کنه حتماً ادامهٔ مطلب رو بخونید.

بدترین باگ کیوت!

کیوت به‌نظر من بهترین فریم‌ورک سی‌پلاس‌پلاس هست. یک کتابخانهٔ خیلی بزرگ با امکانات بسیار عالی و خوب که محیط کاری KDE به‌طور کامل برپایهٔ اون ساخته شده. اما از نسخهٔ 5.3 (ظاهراً) یک باگی به‌وجود آمده که زندگی رو برای ما خیلی سخت کرده: عدم امکان وارد کردن نویسه‌های کنترلی و نیم‌فاصله‌های چسبان و غیرچسبان! (قبلاً در مورد مورد نویسه‌های کنترلی و جهت‌دهی متون فارسی/انگلیسی نوشتم.) حوزهٔ تأثیر این باگ به قدری بزرگ و گسترده است که کار با محیط KDE رو برای ما غیرممکن کرده. تصور کنید که تقریباً هیچ جایی توی سیستم‌عامل و برنامه‌های کاربردی محیط دسکتاپ نتونید نویسه‌های کنترلی و فاصله‌ها رو تایپ کنید! توی این نوشته قصد دارم دلایل این باگ و روش برطرف کردنش و همچنین روش دور زدن اون رو توضیح بدم (: خوشبختانه روش فیکس خیلی ساده‌ست. و البته جای نگرانی نیست: نسخه‌های فیکس با کیوت 5.8.1 (اگر ریلیز بشه) و یا 5.9.0 (در هر صورت) منتشر میشن. منتها کسایی که نمی‌خوان تا اواسط 2018 صبر کنن که اون نسخه‌ها برای دبیان و اوبونتو بیاد، خودشون می‌تونن با این روشی که توضیح میدم پچ کنن (:

این بورد لعنتی

مدتی‌یه که برای انجام یه پروژهٔ صنعتی یه بورد Smart 210 به دستم رسیده. این بورد ساخت شرکت FriendlyARM هست که یه کمپانی چینی‌یه که سخت‌افزارهای ارزون‌قیمت صنعتی می‌سازه. مشخصات ظاهری‌ش خوب به نظر می‌رسه. با این وجود از لحاظ نرم‌افزاری یک فاجعه‌ست! این پست توضیحاتی در مورد طرز کار و بیشتر توضیح معایب این بورده. امیدوارم در آینده برای کسایی که می‌خوان باهاش کار کنن مفید باشه یا لااقل باعث باشه از خریدش منصرف بشن (:

برمی‌گردم

خوب بالأخره بعد از گذشت چند ماه مطلاطم شرایط زندگی‌م تقریباً به ثبات نسبی رسیده و با خیال راحت می‌تونم به کارهام برسم (:

چیزهایی که تو ذهنمه خیلی زیاده، چیزهای زیادی باید بنویسم، کارهای زیادی باید بکنم، پروژه‌های زیادی هستند که باید در موردشون بنویسم و هزار و یک تا کار دیگه…

تغییرات بزرگ

خیلی وقته که توی اینترنت فعالیت چندانی ندارم و اصولاً چند ماهی هست که از کل دنیا عقب افتادم!

توی این چند ماه اتفاقات خیلی زیادی افتاده و زندگی‌م تقریباً داره به‌طور کلی عوض میشه. اول این که متأسفانه به‌طور کامل تو تهران ساکن شدم. دیگه برنمی‌گردم مگر تعطیلات و غیره :( دوم این که یه کار خوب پیدا کردم توی یه شرکت خوب و باسابقه و با سیستم کاملاً منطقی و با حقوق نسبتاً بالا (برای یه لیسانس).

تا چه شود…

کتابخانهٔ Dynamixel

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

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

ارتباط میان‌زبانی

زبان مورد استفاده برای پیاده‌سازی یک ابزار، یکی از ویژگی‌های آن نیست.

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

به عقیدهٔ من همه‌چیز باید همه‌جا برای همه‌کس قابل استفاده باشه. یعنی این که مثلاً این که من فلان کتابخانهٔ کاربردی و باحال رو با زبان ‪C++‬ پیاده‌سازی کردم نباید باعث بشه که یک برنامه‌نویس پایتون یا جاوا نتونه ازش استفاده کنه. حتا زبان‌هایی که دامنه و کاربرد مختلفی دارن باید پشتیبانی بشن. مثلاً یکی از ابزارهایی که ساختم در اصل به‌عنوان یک «حل‌کنندهٔ مسأله» برای کاربردهای پیشرفتهٔ هوش مصنوعی طراحی شده، و این‌چنین موضوعاتی معمولاً برای کاربردهای سیستمی و خاص‌منظوره استفاده میشن. اما هیچ دلیلی وجود نداره که یک برنامه‌نویس وب برای یک اپلیکیشن آنلاین نخواد از مدل‌سازی ارضای محدودیت برای حل یک سری مسائل داخل برنامه‌ش استفاده کنه، یا یک برنامه‌نویس اندرویید نخواد از سیستم‌های استنتاج فازی برای برنامه‌ش استفاده کنه. بنابراین وظیفهٔ منِ برنامه‌نویس است، که برای تمام زبان‌هایی که می‌تونم، رابط (=>interface)های بومی (=>native) فراهم کنم تا همه بتونن از ابزارم استفاده کنن.

توی این پست نحوهٔ ایجاد رابط برای زبان‌های مختلف رو توضیح میدم. طبق این روش ساده، میشه به‌راحتی برای کتابخانه‌های ‪C++‬ رابط‌هایی برای تمام زبان‌های دیگه پیاده‌سازی کرد.

پادشاه و استادِ بزرگ

روزی پادشاهی استادِ بزرگ را نزد خویش فراخواند و به او گفت:

ای حکیم دانا!‌ به من چیزی بیاموز که در غمگینی مراخوشحال کرده و دوران خوشی مرا غمگین کند.

استادِ بزرگ به وی گفت:

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

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

در این میان استادِ بزرگ که از معبد خود در کوه‌های اطرف، شهر را زیر نظر داشت با خود گفت: «قاعدتاً‌ نباید این‌طوری می‌شد.»

توسعهٔ میان‌نسخه‌ای

سال گذشته توی وبلاگ انگلیسی‌م پستی در مورد توسعهٔ نرم‌افزار بین نسخه‌های مختلف کیوت نوشته بودم که مدت‌هاست وقت نکردم ترجمه‌ش کنم. این پست در مورد توضیح یک روش کارامد برای کدنویسی بین نسخهٔ ۴ و ۵ کیوت هست اما میشه کلیت‌ش رو به تمام چارچوب‌ها و کتابخانه‌هایی که در یک بازهٔ زمانی چند نسخه دارند، تعمیم داد. برای برنامه‌هایی که به‌طور طولانی‌مدت پشتیبانی میشن، این شرایط خیلی زیاد پیش میاد.فرض کنید برنامه‌ای نوشته میشه که قراره با ZMQ نسخهٔ ۲ کار کنه. بعد از گذشت چند سال توسعه‌دهنده‌ها به این نتیجه می‌رسن که باید نسخهٔ ۳ پشتیبانی بشه و پکیج‌هایی از کدهای کامپایل شده با نسخهٔ ۳ تهیه بشه. بنابراین بهترین راه حل نوشتن کدی هست که با هر دو نسخه کامپایل بشه. برای ابزارهایی که کتابخانه نیستند هم همین صادق هست. مثلاً اسکریپتی که قراره با پایتون ۲ کار کنه اما باید با پایتون ۳ هم کار کنه.

چپ‌به‌راست، راست‌به‌چپ و Unicode BiDi

حتماً تا به‌حال براتون پیش اومده که وسط یه متن فارسی، یک متن انگلیسی می‌نویسید و همه‌چیز قاطی میشه. مخصوصاً توی محیط‌های Plain Text (یعنی محیط‌های متنی‌ای که شما کنترلی روی استایل و پاراگراف ندارید. مثل gedit یا kate یا مثلاً notepad). خیلی زود متوجه خواهید شد که روش ساده‌ای برای نوشتن کاراکترهایی که نه راست‌به‌چپ هستن و نه چپ‌به‌راست هستن، وجود نداره (در ادامه میگم که جهت یک کاراکتر یعنی چی). توی این پست می‌خوام روش استاندارد نوشتن متون دوطرفه رو معرفی کنم، و تأکید کنم که حتماً ازش استفاده کنید و هیچوقت به‌جای این‌کار از هک‌های متداول (مثل برعکس نوشتن ترتیب نویسه‌ها) استفاده نکنید چون این کار خیلی غلطه.