برنامه ۱۲ عاملی (۵)- عامل چهارم: سرویس‌های کمکی

  • یوسف مهرداد بی‌بالان

عامل ۴: سرویس ‌های کمکی ( backing services)
با سرویس‌‌های کمکی مانند منابع ضمیمه شده یا پیوست ( attached resources) رفتار کنید.

سرویس کمکی ( backing services) هر سرویسی است که برنامه از طریق شبکه از آن برای انجام کارهای معمول و روزمره‌اش استفاده کند. از جمله سرویس‌های کمکی می‌توان به پایگاه‌ داده مانند MySQL، سیستم‌های‌ پیام‌رسان و مدیریت صف (messaging/queueing) مانند RabbitMQ، سرویس ایمیل ( SMTP) برای ارسال و دریافت ایمیل‌هامانند Postfix و حافظه‌های ذخیره‌سازی سریع (caching) مانند Memcached اشاره کرد.

سرویس‌‌های کمکی مانند پایگاه داده از قدیم توسط راهبران سیستم (administrators) که استقرار برنامه‌ها نیز بر عهده‌ی آنهاست مدیریت می‌شوند. علاوه‌ بر سرویس‌هایی که به صورت محلی و داخلی (local) مدیریت می‌شوند، برنامه‌ها ممکن است از سرویس‌هایی استفاده کنند که توسط شرکت‌های دیگر ارائه و مدیریت می‌شوند. برای مثال می‌توان به سرویس ایمیل مانند Postmark، سرویس جمع‌آوری شاخص‌های آماری مانند New Relic یا Loggly، سرویس مدیریت دارایی‌های دیجیتالی مانند Amazon S3 و حتی سرویس‌های مبتنی بر API مانند Twitter، Google Maps یا Last.fm اشاره کرد.

کد هر برنامه دوازده عاملی هیچ تفاوتی بین سرویس‌های محلی و سرویس‌های خارجی قائل نیست. از دید برنامه، هر دو نوع سرویس، منابع پیوست (attached resources) هستند که از طریق یک آدرس (URL) یا هر مکانیزم آدرس‌دهی دیگری که در فایل پیکربندی ذخیره شده‌ قابل دسترسی‌اند. موقع استقرار ( deploy) هر برنامه دوازده عاملی باید بتوان بدون تغییر کد، یک پایگاه داده MySQL محلی را با نسخه‌ای که توسط یک شرکت خارجی مدیریت می‌شود مانند Amazon RDS تعویض کرد. هم‌چنین بدون تغییر کد باید یک سرویس‌دهنده‌ی SMTP داخلی را با یک سرویس‌دهنده‌ی خارجی مانند Postmark تعویض کرد. در هر دو مورد فقط کافی است آدرس دسترسی به منابع در پیکربندی (config) تغییر داده شود.


هر سرویس‌ کمکی یک منبع ( resource) به حساب می‌آید. برای نمونه هر پایگاه داده MySQL یک منبع است. دو پایگاه داده MySQL (که در لایه Application برای اشتراک گذاری استفاده می‌شود) دو منبع مجزا به شمار می‌آیند. برنامه دوازده عاملی با این پایگاه‌های داده مانند منابع پیوست (attached resources) برخورد می‌کند که نشان‌دهنده همبستگی کم (loose coupling) آن‌ها به استقراری است که در آن قرار دارند.
منابع را می‌توان به دلخواه به استقرارها متصل و جدا کرد. برای مثال، اگر پایگاه داده به دلیل مشکلات سخت افزاری بد کار کرد راهبر (admin) برنامه می‌تواند از روی آخرین نسخه‌ی پشتیبان، سرویس‌دهنده‌ی جدیدی برای پایگاه داده راه‌اندازی کند و برنامه را به آن متصل نماید. به عنوان نمونه‌ای دیگر، پایگاه داده عملیاتی را می‌توان جدا کرد و پایگاه داده جدیدی را به برنامه متصل کرد. تمام این‌ کارها بدون هیچ تغییری در کد انجام می‌شود.

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

مترجم: حمید آقای خاتمی

گزیده:
«زمانی که از به هدر دادنش لذت ببری. به هدر نرفته‌است.» جان لنون

گیلان گیلان همیشه بهاره گیلان

  • یوسف مهرداد بی‌بالان

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

عکس: بی‌بالان، اردیبهشت ۱۴۰۱
با سپاس فراوان از یوسف ابر عزیز

یادگیری ماشین برای همه (۱)

  • یوسف مهرداد بی‌بالان

پیش گفتار:
مدت‌هاست که دلم می‌خواهد مطالب بیشتری در زمینه یادگیری ماشین (machine learning) در وبلاگ منتشر شود. پس از بررسی به این نتیجه رسیدم که بهتر است این دسته از مطالب با یک معرفی ساده و به دور از مباحث نظری و ریاضی شروع شود. بعد از همفکری با سرکار خانم سپیده مشایخی تصمیم بر آن شد که با نوشته‌ی Machine Learning for Everyone از سایت vas3k.com شروع کنیم. ضمن تشکر و قدردانی از ایشان،‌ امیدوارم که این نوشته‌ها مورد استفاده شما عزیزان قرار گیرد.

یادگیری ماشین برای همه:
اگر تا حالا دنبال مطالبی برای مطالعه یادگیری ماشین (machine learning) در اینترنت گشته باشید، به احتمال زیاد به دو دسته مطالب برخورد کرده‌اید. دسته اول، مطالب علمی چند قسمتی که پر از مباحث نظری و تئوری‌ها است (من حتی نمی‌توانم نصف یکی از آنها را بخوانم). و دسته دوم، داستان‌های باورنکردنی و گاه دروغ‌های شاخدار درباره هوش مصنوعی، جادوی علم داده و شغل‌های آینده.
در نتیجه تصمیم گرفتم مطلبی بنویسم که دوست داشتم مدت‌ها پیش وجود می‌داشت. یعنی معرفی یادگیری ماشین به زبان ساده‌ برای کسانی که دوست دارند یادگیری ماشین را بفهمند و با مساله‌های واقعی و الگوریتم‌های کاربردی آن به زبان ساده و بدون مباحث نظری پیچیده آشنا شوند. قصدم این بود که فقط یک مستند بنویسم ولی برای همه قابل فهم باشد صرف نظر از این که چه شغلی داشته باشند برنامه‌نویس باشند یا مدیر.

۱) چرا می خواهیم ماشین ها قدرت یادگیری داشته باشند؟
اجازه دهید بیلی (Billy) را به شما معرفی کنم. بيلي قصد دارد خودرویی بخرد. او سعی دارد حساب کند که برای خرید خودرو ماهانه چقدر باید پس‌انداز کند. او ده‌ها آگهی فروش خودرو را در اینترنت بررسی کرد و فهمید قیمت خودروهای صفر و دست اول حدود ۲۰،۰۰۰ دلار است و قیمت خودروهای یک سال کار کرده‌ حدود ۱۹،۰۰۰ دلار و دو سال کارکرده حدود ۱۸،۰۰۰ دلار است و به همین ترتیب با افزایش کارکرد خودرو قیمت آن هم کاهش پیدا می‌کند.
تحلیل‌گر باهوش ما یعنی بیلی پی‌ برد که الگویی (pattern) بین این اعداد وجود دارد: قیمت خودرو به مدت کارکرد آن (سن خودرو) وابسته است. هر سال ۱۰۰۰ دلار از قیمت خودرو کاسته می‌شود ولی قیمت آن از ۱۰،۰۰۰ دلار پایین‌تر نمی‌آید.
بر اساس ادبیات حوزه‌ی یادگیری ماشین، بیلی موفق به ابداع روش رگرسیون (regression) شده است یعنی وی توانسته یک مقدار عددی (قیمت خودرو) را بر اساس داده های تاریخی (historical data) موجود پیش‌بینی کند. افراد وقتی که تلاش می‌کنند قیمت آیفون دست دوم را در سایت ebay برآورد کنند یا وقتی می‌خواهند مقدار گوشت کبابی لازم برای یک مهمانی را حساب کنند از این روش استفاده می‌کنند.
بی‌شک وجود یک فرمول ساده که بتواند همه‌ی مسائل دنیا را حل کند فوق‌العاده است به ویژه برای حل مساله‌ی مقدار گوشت کبابی لازم برای یک مهمانی. اما متاسفانه این کار امکان‌پذیر نیست.
بيایید برگرديم به مساله خرید خودرو. مشکل این است که خودروها دارای تاریخ تولید، امکانات (آپشن)، وضعیت فنی و میزان تقاضای فصلی متفاوتی هستند و معلوم نیست چه تعداد عامل ناشناخته دیگری هم در این میان وجود دارد که می‌تواند روی قیمت خودرو تاثیرگذار باشد. یک فرد عادی مثل بیلی ​​نمی‌تواند موقع محاسبه قیمت خودرو، تمام این داده‌ها را در ذهن خود نگهداری و پردازش کند. البته من هم نمی‌توانم.

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

و با این یافته‌ی جدید، یادگیری ماشین متولد شد.

مترجم: خانم سپیده مشایخی

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

جایی برای بومیان نیست!

  • یوسف مهرداد بی‌بالان

فیلم “جرونیمو: افسانه آمریکایی” (Geronimo: An American Legend) داستان سرخ‌پوستان و بومیان آمریکا در مبارزه با ارتش سفیدپوستان آمریکاست. قهرمان اصلی داستان،‌ جرونیمو یکی از رهبران سرخ‌پوستان آمریکاست. داستان فیلم بسیار غم‌انگیز است.
سفیدپوستان زمین‌های بومیان را از آنها می‌گیرند و آنها را با زور اسلحه مجبور می‌کنند در منطقه‌ی محدودی زندگی کنند و البته حق خروج از آن منطقه را هم ندارند. سرآخر هم به این بسنده نمی‌کنند و مانع از انجام آیین سرخپوستان آپاچی می‌شوند و خودشان آتش‌بس را زیر پا می‌گذارند، سرخپوستان را تحریک می‌کنند و کشت و کشتار را شروع می‌کنند.

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

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

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

«توی این همه زمین، چرا جایی برای آپاچی‌ها نیست؟ چرا چشم سفید (سفیدپوستان) همه‌ی این زمین‌ها را فقط برای خودشان می‌خواهند؟»
و من جمله‌ی جرونیمو را با خود زمزمه می‌کنم که «واقعاْ چرا همه‌ی زمین‌ها را برای خودشان می‌خواهند؟ چرا جایی برای بومیان نیست؟»

برنامه ۱۲ عاملی (۴)- عامل سوم: پیکربندی

  • یوسف مهرداد بی‌بالان

عامل ۳: پیکربندی
پیکربندی (config) را در محیط استقرار (environment) ذخیره کنید

پیکربندی هر برنامه احتمالاً برای استقرارهای مختلف (محیط عملیاتی یا production، محیط داخلی یا stage، محیط‌ توسعه‌دهندگان و غیره) یکسان نیست. این تفاوت می‌تواند به دلایل متفاوتی از جمله موارد زیر باشد:
– منابع دسترسی به پایگاه داده، حافظه‌های ذخیره‌سازی سریع (Memcached) و سایر خدمات پشتیبان (backing services) سرویس‌دهنده‌
– اعتبارنامه (Credentials) برای خدمات خارجی مانند Amazon S3 یا Twitter
– مقادیری مانند نام مستعار میزبان (canonical hostname یا cname) برای هر استقرار

گاهی اوقات پیکربندی به صورت مقادیر ثابتی (constants) در خود کد نوشته می‌شود. چنین کاری نقض اصول برنامه‌های دوازده عاملی است که در آن، جداسازی کامل و دقیق پیکربندی از کد الزامی است. پیکربندی نسخه‌های مختلف استقرار (عملیاتی، داخلی، توسعه‌دهندگان) با هم تفاوت جدی دارند در حالی که کد این نسخه‌ها معمولا یکسان است. یک آزمایش ساده برای کسب اطمینان از جداسازی درست پیکربندی از کد برنامه این است که بررسی کنید آیا بدون در اختیار دادن اعتبارنامه‌ها (credentials) می‌توان کد برنامه را در همان لحظه به یک کد متن‌باز تبدیل کرد و در اختیار همه قرار داد.

دقت کنید که تعریف ما از “پیکربندی” شامل پیکربندی داخلی برنامه [مثلا پیکربندی ارتباط بین ماژول‌ها و مولفه‌های برنامه] نمی‌شود. این نوع پیکربندی در استقرار‌ها متفاوت نیست در نتیجه بهتر است در خود کد نگهداری و مدیریت شود.

رویکرد دیگر مدیریت پیکربندی، استفاده از فایل‌های پیکربندی (config files) است که در مخزن کد (repo) قرار نمی‌گیرند. چنین رویکردی در مقایسه با نوشتن پیکربندی در کد به کمک تعریف مقادیر ثابت، پیشرفت بزرگی محسوب می‌شود، هر چند این روش نیز ایراداتی دارد. احتمال اشتباه و قراردادن فایل پیکربندی در مخزن کد بسیار بالا است. احتمال پراکنده شدن فایل‌های پیکربندی در جاهای مختلف و با قالب‌های (format) متفاوت زیاد است. چنین اتفاقی مدیریت فایل‌های پیکربندی‌ و یکسان‌سازی آنها را دشوار می‌کند. معمولا قالب‌(formats) هر یک از این فایل‌های پیکربندی مختص زبان یا چارچوب متفاوتی است که مدیریت آنها را دشوارتر می‌کند.

هر برنامه دوازده عاملی پیکربندی را در متغیرهای محیط (environment variables) ذخیره می‌کند (به صورت اختصار env vars یا env نامیده می‌شوند). متغیرهای محیطی (env vars) را بدون آن که نیازی به تغییر کد باشد، به راحتی می‌توان برای هر استقرار تغییر داد. در مقایسه با فایل‌های پیکربندی، احتمال قرار گرفتن اشتباهی آنها در مخزن کد نیز کمتر است. و برخلاف فایل‌های پیکربندی خاص‌منظوره یا مکانیزم‌های پیکربندی خاص هر زبان‌ برنامه‌نویسی، این متغیرها مستقل از استاندارد زبان و سیستم عامل تعریف می‌شوند.

گروه‌بندی یکی دیگر از موضوعات مدیریت پیکربندی (config) است. گاهی‌ افراد متغیرهای پیکربندی را در قالب گروه‌هایی دسته‌بندی می‌کنند که نام آنها ترکیبی است از انواع استقرار (development, test, ,production) و کلمه‌ی environments . چنین روشی مقیاس‌پذیر نیست زیرا با اضافه شدن انواعی جدیدی از استقرار مانند staging یا qa به نام‌های جدیدی برای محیط‌ها نیاز خواهیم داشت. حتی احتمالا با رشد پروژه و ورود توسعه‌دهندگان جدید، هر فردی محیط‌ دلخواه و مورد نیازش را به فهرست محیط‌های قبلی اضافه خواهد کرد (مانند smith-qa یا smith-development). چنین اتفاقی باعث رشد نمایی و انفجار تعداد پیکربندی‌ها (config) می‌شود و عملا مدیریت استقرار را پراشتباه و فلج می‌نماید.

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

پانوشت:
استقلال یا orthogonal بودن دو متغیر محیطی (env var) به چه معناست؟
orthogonal به این معناست که دو متغیر محیطی می‌توانند مستقل از همدیگر تغییر کنند و تغییر یکی لزوما منجر به تغییر دیگری نمی‌شود. در نتیجه هنگام انتخاب متغیرهای محیطی باید بدون در نظر گرفتن محیط‌های استقرار (مانند development, test, and production)، یک سری از متغیرها را شناسایی و به عنوان متغیر محیطی تعریف کرد

نوشته‌های قبلی:
قسمت سوم: وابستگی‌ها (۳)

مترجم: حمید آقای خاتمی

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

روز معلم

  • یوسف مهرداد بی‌بالان

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

«می‌توانید اسم یک پرنده را در تمام زبانهای دنیا یادبگیرید اما وقتی این کار به پایان رسید، شما دقیقاً هیچ چیز در مورد آن نمی‌دانید… پس بیایید به پرنده نگاه کنیم و ببینیم که چه می‌کند. این مسئله است که مهم است. من خیلی زود تفاوت میان دانستن نام یک چیز و شناختن آن چیز را آموختم.» ریچارد فاینمن

منبع: ویکی گفتار

 

گربه کد من را خورد (۳)

  • یوسف مهرداد بی‌بالان

قسمت اول را اینجا و قسمت دوم را اینجا بخوانید.

به جای بهانه، گزینه‌ها و راه‌کارهای جدیدی پیشنهاد کنید. نگویید که این کار شدنی نیست؛ توضیح دهید که چه کاری می‌توان برای نجات از شرایط کنونی انجام داد. آیا بهتر است کد را حذف کنیم (delete)؟ اگر به این نتیجه رسیدید،‌ این موضوع را با آنها در میان بگذارید و اهمیت و فایده‌های بازسازی کد (refactoring) را توضیح دهید.
آیا برای انتخاب بهترین راهکار به نمونه‌سازی اولیه (prototype) نیاز دارید؟ آیا برای جلوگیری از تکرار چنین شرایطی نیاز به تعریف و پیاده‌سازی آزمون‌های بهتر یا خودکارسازی آنها دارید؟ شاید برای انجام کار به منابع بیشتری نیاز داشته باشید. یا شاید لازم باشد زمان بیشتری را با کاربران بگذرانید و روش کار آنها را از نزدیک ببینید. شاید هم نیاز باشد تکنیک یا فناوری جدیدی را عمیق‌تر و دقیق‌تر یاد بگیرید. شاید یک کتاب یا یک دوره‌ی آموزشی بتواند به شما کمک کند. از درخواست کردن یا پذیرش و اعتراف به اینکه به کمک نیاز دارید نترسید.
قبل از اینکه بهانه‌های غیرمنطقی و ناموجه را با صدای بلند جار بزنید سعی کنید آنها را از ذهن خود بیرون بریزید. اگر فکر می‌کنید باید بهانه‌‌ی ناموجهی را با صدای بلند اعلام کنید، بهتر است ابتدا آن را با گربه‌تان در میان بگذارید. خدا را چه دیدی، شاید این گربه‌ی کوچک و ملوس شما، مسئولیت اشتباهات را قبول کند.

 

چالش‌ها
وقتی کارمند بانک، مکانیک خودرو یا منشی یک شرکت با دلایلی غیرقابل قبول سعی کند اشتباهات را توجیه کند، شما چه واکنشی نشان می‌دهید؟ پس از چنین اتفاقی در مورد آنها و شرکتشان چگونه فکر می‌کنید؟

وقتی فهمیدید عبارت «راستش نمی‌دونم …» را گفته‌اید، بی‌درنگ آن را با عبارت «… ولی یه راهی پیدا می‌کنم» ادامه دهید. چنین رویکردی راهی فوق‌العاده برای پذیرش چیزهایی است که نمی‌دانید، اما در عین حال مانند یک فرد حرفه‌ای مسئولیت آن را قبول می‌کنید.

منبع عکس:
gettyimages.ca

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

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

برای خروج از جستجو کلید ESC را بفشارید