لذت برنامه نویسی: نحوه کار ما با jenkins

اینم یه تجربه پراکنده دیگه!

خب حدودا سه سال قبل من از جای خالی continues integration نوشتم. حالا حدود بعد از سه سال میخوام دوباره به موضوع رجوع کنم و درباره jenkins بنویسم

توی این سه سال اتفاقات زیادی افتاده. ما روند build رو با استفاده از cmake بهتر کردیم. یادگرفتیم که چی به چیه. حدودا انتهای سال قبل بود که توی شرکت منابع و علم کافی برای پیاده‌سازی روند ci بوجود اومد و ما شروع کردیم به استفاده از jenkins.

نصب و راه‌اندازی jenkins به نسبت آسون و راحت بود. کاری که jenkins برای ما میکرد این بود که به یه دلیلی(بخونید ماشه) شروع به کامپایل کد میکرد. روند کامپایل هم آسون بود. یعنی اینکه یه سری پروژه معمول رو میشناسه مثل cmake, make, gradle, maven داره که کار رو راحت میکنه

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

در مرحله بعد با استفاده امکانی از jenkins pipeline تمامی سخت‌افزارها رو باهم کامپایل کردیم و cppcheck هم به عنوان یک مرحله از این خط لوله ما انتخاب شد.

در قدم بعدی هم این ماجرا رو به git وصل کردیم و به ازای هر کامیت یا هر درخواست بررسی که روی کدمون انجام میدیم شروع به کامپایل میکنه و ما میدونیم که دیگه تغییرمون چیزی رو خراب نمیکنه.

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

فعلا همین!

openwrt و اضافه کردن یک پکیج جدید

اینم یه تجربه پراکنده!

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

البته پکیجی که من دنبالش بودم tun2socks بود که پکیجش بصورت غیر رسمی وجود داشت. کاری که من کردم این بود که آدرس‌ها رو عوض کردم و یادگرفتم که چطور میتونم اون رو برای روترم کامپایل کنم. نتیجه کار من رو میتونید توی گیت‌هاب من پیدا کنید

روند کار به ترتیب اینجوریه که:

  1. اول سورس کد رو با گیت از گیت‌هاب میگیرید
  2. دوم با توجه به راهنمای آنلاین تمام پکیج‌ها رو دانلود میکنید
  3. پکیج رو اضافه می‌کنید
  4. با استفاده از نوع معماری سیستم و نوع دستگاه و پکیج‌ها رو انتخاب می‌کنید
  5. و از ابتدا کامپایلر و کل لینوکس و پکیج رو کامپایل میکنید

پینشهاد میکنم که برای شروع اینها بخونید:

امیدوارم به دردتون خورده باشه!

همین!

دوره گیت: معرفی و مقدمه

اینم یه تجربه پراکنده دیگه!

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

توی این قسمت یه معرفی و تاریخچه‌ی کوچکی از سیستم‌های کنترل نسخه و git میگم. امیدوارم از نگاه کردن به ویدئو لذت ببرید

بابت اینکه ویدیو رو مشاهده می‌کنید تشکر می‌کنم. در صورتی که نظری داشتید، با من در میان بگذارید.

پدر بودن: به روش من

اینم یه تجربه پراکنده!

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

خب این لیست چیزهایی هست که به ما کمک کرده ولی ممکنه کاملا به درد شما نخوره. و بازم به قول خارجی‌ها تکرار میکنم که ریسک استفاده از این راهنمایی‌ها با خودتون هست.

قبل از پدر مادر شدن

قبل از پرد مادر شدن بایستی خودتون رو آماده کنید. به خودتون برسید و به خودتون اهمیت بدید. چون بعدش باید وقت و انرژی زیادی رو به بچه اختصاص بدید و ممکنه خودتون فراموش بشید.

کلاس برید و آموزش ببینید

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

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

زبان کودک Dunsten

یه فیلم خیلی خوب آموزشی دیگه وجود داره که دیدنش رو پیشنهاد میکنم زبان کودک Dunsten یا دانستن هست که دوبله یا زیرنویس شدش رو میتونید توی لینک پیدا کنید

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

بعد از پدر مادر شدن

خب اونا قبل از بچه‌دار شدن بود و آمادگی اما اصل ماموریت بعد از بچه دار شدن شروع میشه.

به غرایض بچه اعتماد کنید

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

به دلبستگی بچه اهمیت بدید

یکی از چیزهایی که روانشاسا میگن اینه که دلبستگی در بچه بایستی ایمن باشه. در موردش این مجموعه ویدئو توسط دکتر رمضانی ببینید. کلا هم به بچه خیلی توجه کنید و نیازهاش رو برآورده کنید و برخلاف اعتقاد عمومی بچه رو هر چقدر خواست بغل کنید.

در کارهای بچه فعال باشید

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

خواب بچه و الگوهاش

بچه‌ها تا یادبگیرند که چطور بخوابند کلی زمان میبره. بدونید که حدودا در چه زمانی چطور میخوابه. اینکه بدونید چطور میخوابه بهتون کمک میکنه که بتونید بهتر از بچه نگهداری کنید. یه سری کارها هم هست که به بچه کمک میکنه برای خوابیدن. اونها رو یاد بگیرید. از صداها، تکون دادن و اینجور چیزا کمک بگیرید. برای خواب روند تکراری پادگانی داشته باشید.

تکرار و نظم دوست داشتنی

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

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

ابزارها و امکانات و بازی‌های موثر بخرید

کلا بچه خیلی ابزارها و بازی‌های متنوع و معمولا گرون قیمتی دارن و اگه بخواید همه چیز رو بگیرید با درآمد معمول آدم‌ها امکان‌پذیر نیست. مهم میشه که ابزارها و بازی‌های موثر بخرید یعنی چی؟ یعنی اینکه تحقیق کنید و ببینید آیا خرید این ابزار یا بازی موثر هست یا نه و اگه بود اقدام کنید. از کسانی که بچه داشتن کمک بگیرید. ابزارهایی که خیلی به ما کمک کردن اینها بودن

  • وان حمام: که کمک میکنه بشه یک نفره هم بچه رو حمام کرد
  • کلاه حمام: که شستن سر رو خیلی راحت میکنه
  • صندلی غذای قابل حمل: صندلی غذایی بخرید که به نسبت ارزون باشه و میشه روی صندلی ناهار خوری نصبش کرد. این مدلها اروزنتر و قابل حمل هستند یعنی اگه مسافرت برید خونه پدربزرک مادربزرگ‌ها برید می‌تونید با خودتون ببرید.
  • بازی مناسب سن و مهارت: در هر سنی بچه در حال یادگرفتن مهارت‌های مختلفی هست که براش اسباب‌بازی‌های موثری وجود داره در خرید اونها شک نکنید. مثلا اسباب بازی که باعث تسریع روند گردن گرفتن بچه میشه. مثلا اسباب بازی که باعث تقویت گرفتن میشه. یادتون باشه این اسباب بازی ها متنوع و زیادن و گاها گرونن.
  • ابزار پایش بچه: سعی کنید اگر قصد جدا کردن زودهنگام بچه از خودتون رو دارید از ابزار پایش مناسب استفاده کنید. الان d-link ابزار پایش ارزون قیمتی داره که به گوشی هوشمندتون وصل میشه و خیلی ارزونتر از ابزار پایش‌های دیگه است
  • فین گیر یا پوار: که کمک میکنه دماغ بچه رو تمیز کنید

از اینترنت کمک بگیرید ولی نه برای تشخیص بیماری

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

خلی متن نوشتم و اگه شد کاملش میکنم. فعلا همین!

لذت برنامه‌نویسی: ساختن header فایل در cmake

اینم یه تجربه پراکنده دیگه!

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

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

این روند فعال و غیر فعال سازی همیشه با مشکلات جدی همراه بود بدین صورت که همکارها به علت زیاد بودن و متغیر بودن ویژگی‌ها برای مشتری‌ها بایستی این فایل رو زیاد تغییر میدادن و این تغییرات زیاد باعث می‌شد که خطای انسانی داشته باشن و یه چیزایی یادشون بره و یا اضافه کامپایل کنند و به مشتری بدن

کاری که ما کردیم این بود که این هدر خاص که همه این تعاریف توش بود رو بجای دستی ساختن به کمک cmake ساختیم به این شکل که

  1. یه متغیر از نوع cached تعریف کردیم که بشه به عنوان پارامتر زمان کامپایل اضافه بشه
  2. بر اساس اون متغیر برای هریک از ویژگی‌ها یک مقدار فعال و غیر فعال تخصیص دادیم
  3. از اون متغیرها استفاده کردیم و فایل اصلی رو ساختیم

نمونه این کار به این شکل هست که توی CMakeLists.txt یه چنین چیزی نوشتیم

توی فایل

هم یه چنین چیزی هست

و به این شکل این فایل بصورت اتوماتیک ساخته میشه و قابل استفاده است

برای اجرا کردن هم میشه با این دوتا دستور برای مشتری‌های مختلف کامپایل کرد

همین!

openwrt و مودم lte

اینم یه تجربه پراکنده!

توی پست قبل من OpenWrt رو معرفی کردم. بعدش هم من پول دادم و یدونه از این روترهای به نسبت ارزون خریدم که usb رو پشتیبانی می‌کرد. بعد از یک سال اینترنت خونه به دلایل عملیاتی بایستی قطع میشد و من رفتم یه مودم lte با مدل Huawei E3372 خریدم. البته این مودم من sim lock ایرانسل هست ولی مدلهای بدون sim lock هم وجود داره.

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

  • kmod-usb-net-cdc-ether
  • usb-modeswitch

مودم بصورت معمول توی مد HiLink هست که یک کارت شبکه رو شبیه سازی میکنه. پس در نهایت شما یه کارت شبکه جدید دارید که بایستی اون رو به عنوان Wan انتخاب کنید. ایراد مد هایلینک این هست که اگه شما valid ip ثابت روی سیم‌کارتتون داشته باشید نمی‌تونید چیزی رو port forward کنید.

حالت دیگه ای که مودم کار میکنه بصورت پورت سریال درمیاد که at command قبول میکنه. این مد هم البته قابل راه‌اندازی هست که یکم دردسر داره ولی ممکنه. البته این رو من هنوز امتحان نکردم

امیدوارم به دردتون خورده باشه!

همین!

۹۷ چیز که یک برنامه نویس بهتر است بداند – فصل ۱۴

اینم یه تجربه پراکنده دیگه!

امروز یه قسمت دیگه از کتاب «۹۷ چیز که یک برنامه نویس بهتر است بداند» رو اینجا به اشتراک میگذارم. این پنجمین ویدئو هست که فصل ۱۴ رو ارائه میده. از این فصل تصمیم گرفتم که یکم در مورد فصلی که ارائه شده توضیحات بیشتری بدم.

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

این ویدئو بصورت همزمان توی وب سایت هایو هم به انتشار رسیده.

ویدئو

در یوتیوب:

در آپارات:

لذت برنامه نویسی: نوشته‌های من در مورد git

اینم یه تجربه پراکنده دیگه!

من مدتی میشه که با مجله هایو همکاری دوستانه دارم و سعی میکنم مطالبی که عمومی تره رو اونجا بنویسم. حالا توی این مدت من ۳ تا مقاله در مورد git نوشتم که اونجا منتشر شده. پیشنهاد میکنم اگه دوست داشتید برید و بهش سر بزنید

لیست مقالات از این قراره

همین!

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

لذت برنامه نویسی: معرفی ninja سیستم build سریع

اینم یه تجربه پراکنده دیگه!

خب توی این پست یه ابزار جایگزین برای build کردن نرم‌افزار‌های c و c++ معرفی کنم به اسم ninja. داستان بوجود اومدنش از این قراره که آقای اوان مارتین که توی گوگل روی توسعه google chrome کار میکرده متوجه میشه روند کامپایل کدهاشون بیش از حد کنده و دست و آستینش رو بالا زدن که یه سیستم سریعتر برای build بنویسه که حاصل شد ninja. پیشنهاد میکنم در اولین گام سیستمتون رو اگه cmake نیست cmake کنید و در گام دوم از ninja استفاده کنید

ویژگی‌های ninja

خب ویژگی‌هایی که من بلدم از این قراره

  • سعی در انجام یک کار بصورت درست
  • سعی در خیلی سریع بودن
  • حداقل محدودیت روی نحوه کامپیال شدن کد و سپردن اونها به ابزارهای سطح بالاتر مانند cmake و gyp
  • تشخیص درست وابستگی‌ها
  • سرعت بر سادگی ارجحیت دارد

نمونه موردی

خب همونطور که قبلا هم گفته بودم نحوه کامپایل کدها منتقل شده بود به cmake و تنها کاری که لازم بود من انجام بدم دستورات زیر بود

برای کدهای ما در یک تست غیر علمی نتیجه‌های حدودی زیر برای ۲ یا ۳ بار اجرا بدست اومد

type make ninja
clean build ۶۰s ۱۳s
rebuild ۱۰s ۰٫۳s

همین!

غواصی در اعماق: متغیر محلی، عمومی و static در سی و نقش آنها در سرعت کامپایل

اینم یه تجربه پراکنده دیگه!

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

مشکل با متغیر محلی بزرگ

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

  1. متغیر رو کلا حذف کنیم. که خب نمیخواستیم صورت مساله رو حذف کنیم
  2. متغیر رو global میکردیم که خب همه میتونستن تغییرش بدن و برامون بد بود
  3. متغیر رو static کنیم. این تفاوتی برای ما نداشت فقط میخواستیم امتحان کنیم.

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

بررسی چرایی راه‌حل

سوالی که برای ما پیش اومد این بود که چرا یه تغییر اینجوری اینهمه هم توی سرعت هم حجم باینری موثره؟ برای جواب دادن به این ماجرا یکم رفتم تحقیق کردم:

  • همه باینری‌ها از بخش‌های مختلفی تشکلی شدن که اگه assembly یادتون باشه شامل اینهاست
  • متوجه شدم که متغیرهای global توی data segment تعریف میشن و متغیرهای local توی stack segment تعریف میشن.
  • متوجه شدم که متغیرهای static هم توی data segment تعریف میشن.

پس هرچی بود زیر سر data segment بود از اینجا به بعدش بازی شد حدس و گمان در مورد چرایی دوتا اتفاق:
– چرا سرعت کامپیال بیشتر؟ احتمالا به این دلیل که کامپایلر با data segment راحت‌تر کار میکنه تا stack segment. اما این حدس حجم باینری کمتر رو توجیه نمیکنه چون در این دوحالت حجم متغیر ثابت مونده
– چرا حجم باینری کمتر؟ برای اینکار یکم باید یادمون بیاد توی assembly که چطور یه متغیر local تعریف میشه منظورم هست. یه متغیر local عملا اینه که اول یه مقداری توی stack قرار میگیره و در یه مرحله دیگه اون مقدار از stack خارج میشه. که این هم نیاز به کد سمت code segment داره هم نیاز به حافظه سمت stack segment داره.

خب با این حالت ما به حدس دقیق تری از اتفاق پشت پرده رسیدیم. اونم اینه که وقتی متغیر توی data segment قرار میگیره یه بخش توسط کامپایلر تخصیص داده میشه و مقادیر هم توی اون خونه‌ها نوشته میشه. ولی وقتی قرار باشه اون متغیر توی stack segment قرار بگیره هم کد تولید میشه هم حافظه تخصیص داده میشه که منجر به طولانی تر شدن کل روند میشه.

امیدوارم به دردتون خورده باشه
همین!