یادداشت‌های یک گیگتوپوس

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

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

برمی‌گردم

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

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

تغییرات بزرگ

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

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

تا چه شود…

کتابخانهٔ Dynamixel

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

توسعهٔ چندسکویی

دوست دارم برنامه‌ها و کتابخونه‌هام روی پلتفرم‌های مختلف اجرا بشن. هرچه بیشتر بهتر! البته همیشه هدف اصلی همیشه لینوکس و سیستم‌های شبه‌یونیکس هستند. با این حال بدم نمیاد که عملکرد مشابهی رو برای ویندوز و اندرویید، شاید هم مک‌اواس فراهم کنم. در واقع پلتفرم نباید یک محدودیت برای استفاده از نرم‌افزار باشه. مجموع این‌ها ما رو به ایدهٔ توسعهٔ چندسکویی می‌رسونه. متأسفانه این کار چندان ساده هم نیست. استاندارد پذیرفته‌شده‌ای برای APIهای سیستم‌عامل‌ها وجود نداره. همچنین هیچ الگوی کلی‌ای برای عملیات سیستم‌عامل موجود نیست. توسعه‌دهنده‌ها باید با درنظر داشتن تمام نیازمندی‌های چندسکویی کد بنویسند.

توی این پست، تجربهٔ شخصی خودم رو در مورد توسعهٔ چندسکویی پروژهٔ AIT می‌نویسم. توی اون پروژه به مشکلات زیادی برخوردم و تعدادی‌شون رو حل کردم. این نوشته یک چک‌لیست ساده برای کسایی که می‌خوان توسعهٔ چندسکویی انجام بدن فراهم می‌کنه که بتونن از مشکلات توسعهٔ چندسکویی با زبان‌های ‏‪C/C++‬ پیشگیری کنن. رفتیم که بریم :)

زیکانف‌نامه

خوب دو هفته‌ای از برگزاری همایش سراسری نرم‌افزارهای آزاد/متن‌باز (زیکانف) می‌گذره و من هنوز هیچ پستی در مورد این که چقدر خوش گذشت و چه کارهایی کردیم، ننوشتم.

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

به نظر من کنفرانس خیلی خوبی بود. کلی چیزهای جدید یاد گرفتم و با کلی آدم‌های خوب آشنا شدم. بعدش هم تو توئیتر کلی از این آدم‌های خوب رو فالو کردم و میشه گفت عضوی از یه جامعهٔ قشنگ شدم. (باید فعالیت‌های اجتماعی‌م رو بیشتر کنم)