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

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

۳) یادگیری (Learning) در مقابل هوش (Intelligence)

یک بار در یکی از وب سایت های رسانه‌ای باکلاس مطلبی دیدم با عنوان “آیا شبکه های عصبی (neural networks) جایگزین یادگیری ماشین (machine learning) می شوند؟” معمولا رفقای رسانه‌ای معمولا به هر رگرسیون خطي ساده و بی‌اهمیتی مانند SkyNet هوش مصنوعی می‌گویند. شکل زیر تصویر ساده‌ای از دسته‌بندی‌ حوزه‌ی هوش مصنوعی نشان می‌دهد .

هوش مصنوعی (Artificial intelligence) نامی است که برای کل دانش این حوزه استفاده می‌شود. شبیه واژه‌های زیست شناسی [علم شیوه‌ی زندگی جانداران] یا شیمی [علم بررسی عناصر و مواد] که به کل دانش بشری در شاخه‌ای از علم اشاره دارند.

یادگیری ماشین (Machine Learning) بخشی از هوش مصنوعی است. البته یکی از بخش‌های مهم آن است ولی تنها بخش آن نیست.

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

یادگیری عمیق (Deep Learning) روش مدرنی برای ساخت (build)، آموزش (train) و استفاده از شبکه‌های عصبی است. به طور کلی یادگیری عمیق یک معماری جدید در یادگیری ماشین است. امروزه عملا کسی تفکیکی بین یادگیری عمیق و “شبکه‌های معمولی” قائل نیست حتی از کتابخانه‌های (libraries) یکسانی برای پیاده‌سازی آنها استفاده می‌شود. برای آن که خیلی احمق و بی‌سواد به نظر نرسیم بهتر است در گفتار و نوشتار فقط نوع شبکه را بیان کنیم و از به کار بردن کلمات قلمبه سلمبه و مد روز پرهیز کنیم.

[برای نام‌گذاری این معماری جدید که بر اساس شبکه‌های عصبی طراحی شده بود از عبارت “عمیق” استفاده شد تا تفاوت آن را با “شبکه‌های معمولی” و موجود در آن زمان را نشان دهد؛ مترجم].

قاعده کلی برای مقایسه این است که مفاهیمی که در یک سطح (level) مشترک قرار دادند و اصطلاحا هم‌سطح‌اند با هم مقایسه شوند. به همین دلیل عبارت “شبکه‌های عصبی جایگزین یادگیری ماشین خواهد شد”.به این معنی است که “چرخ‌ها جایگزین خودرو‌ها خواهند شد.” رسانه‌‌ها‌ی عزیز! انتشار چنین مطالبی، آبرو و شهرت شما را واقعا به خطر خواهد انداخت.

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

ماشین می‌تواند ماشین نمی‌تواند
پیش‌بینی کند (Forecast). چیز جدیدی خلق کند (Create)
حفظ کند (Memorize) خیلی سریع باهوش شود
دوباره تولید کند (Reproduce) کاری فراتر از از وظیفه‌‌‌ی (task) تعریف‌شده‌اش انجام دهد
بهترین گزینه را انتخاب کند انسان‌ها را بکشد

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

گزیده:
آنهایی که مالک داده‌اند مالک آینده‌اند. (those who own the data own the future)
یووال نوح هراری، ۲۱ درس برای قرن ۲۱‌

برنامه ۱۲ عاملی (۸)- عامل هفتم: اتصال به پورت

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

عامل ۷-سرویس‌ها را از طریق اتصال به پورت (port binding) در اختیار استفاده‌کنندگان بیرونی‌ قرار دهید
[ مترجم؛ برگردان Port به فارسی درگاه است ولی در این متن همان واژ‌ه‌ی پورت استفاده شده است.]

گاهی برنامه‌های وب در داخل یک کانتینر سرویس‌دهنده‌ وب (web-server container) اجرا می‌شوند. برای مثال، برنامه‌های PHP می‌توانند به عنوان یک ماژول داخل apache HTTPD اجرا شوند یا برنامه‌های جاوا می‌توانند داخل Tomcat اجرا شوند.

برنامه‌های 12 عاملی کاملا خودکفا و بی‌نیاز از کانتینر سرویس‌دهنده‌های وب هستند (self-contained). آنها برای ایجاد سرویسی که در محیط اجرا از طریق وب در دسترس باشد (web-facing service) نیازی به سرویس‌دهنده وب (web server) که در زمان اجرا در اختیار آن قرار گیرد ندارند. برنامه وب ۱۲ عاملی، HTTP را به کمک اتصال به پورت (Port Binding) به‌ عنوان یک سرویس در اختیار استفاده‌کنندگان بیرونی قرار می‌دهد و سپس منتظر دریافت درخواست‌هایی می‌ماند که روی آن پورت ارسال می‌شوند.
[مترجم؛ در متن اصلی از واژه‌ی Runtime Injection برای فراهم کردن سرویس‌دهنده وب مورد نیاز برنامه استفاده شده است]

در محیط توسعه شخصی (local development environment)، توسعه‌دهندگان برای دسترسی به سرویسی که توسط برنامه‌ در اختیار استفاده‌کنندگان بیرونی قرار گرفته فقط به سراغ آدرسی شبیه به ‘http://localhost:5000/’ می‌روند. اما در محیط استقرار، یک لایه مسیریابی (routing layer) وظیفه‌ی هدایت درخواست‌های دریافتی روی یک نام میزبان عمومی (public-facing hostname) به برنامه را بر عهده می‌گیرد. ارتباط لایه‌ مسیریابی با برنامه توسط پورت مذکور برقرار می‌گردد.

معمولا برای پیاده‌سازی این ویژگی از اعلان وابستگی (dependency declaration) برای اضافه کردن سرویس‌دهنده‌ی وب به برنامه استفاده می‌شود. [برای اطلاعات بیشتر رجوع کنید به عامل دوم در برنامه‌های ۱۲ عاملی یعنی وابستگی‌ها؛ مترجم]
HTTP تنها سرویسی نیست که می‌توان به کمک اتصال به پورت در اختیار استفاده‌کنندگان قرار داد. تقریباً همه‌ی نرم‌افزارهای سرویس‌دهنده‌‌ (server software) می‌تواند به کمک اتصال به پورت و سپس انتظار و پاسخ به درخواست‌های دریافتی اجرا شوند. به عنوان مثال می‌توان به Redis یا Remote Dictionary Server اشاره کرد.
توجه داشته باشید که روش اتصال به پورت به این معناست که یک برنامه می‌تواند تبدیل به یک سرویس کمکی (backing service) برای سایر برنامه‌‌ها شود. برای این کار آدرس (URL) ارائه‌شده توسط برنامه‌‌ در قالب یک منبع (Resource Handle) در پیکربندی (config) برنامه‌‌ای که می‌خواهد از آن استفاده کند قرار داده می‌شود.

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

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

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

برنامه ۱۲ عاملی (۷)- عامل ششم: پردازش

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

عامل ۶: پردازش‌ها (process)

برنامه را به صورت یک یا چند پردازش بدون حالت (stateless processes) اجرا کنید.

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

در ساده‌ترین حالت، کد برنامه شامل چندین خط است که با یک زبان برنامه‌نویسی نوشته شد و به تنهایی و بدون نیاز به اجزای خارجی می‌تواند اجرا شود؛ محیط اجرای برنامه نیز لپ‌تاپ توسعه‌دهنده‌ای است که محیط اجرای آن زبان روی آن آماده ‌شده است؛ پردازش (Process) هم با نوشتن دستور در خط فرمان(command line) اجرا می‌شود. به عنوان مثال با نوشتن دستور python my_script.pyُ پایتون برنامه‌ی شما را با ایجاد یک پردازش جدید در کامپیوتر اجرا خواهد کرد. از سوی دیگر، استقرار یک برنامه‌ی پیچیده در محیط عملیاتی ممکن است به چندین نوع پردازش‌ نیاز داشته باشد. توجه داشته باشید که از هریک از انواع می‌تواند چندین نسخه در حال اجرا وجود داشته باشد .

پردازش‌های دوازده عاملی بدون حالت (Stateless) هستند و هیچ چیزی را با دیگران به اشتراک نمی‌گذارند (Share Nothing). اگر داده‌ای نیاز به ثبت و نگهداری داشته باشد،‌ باید آن را در یک سرویس کمکی (backing service) که دارای حالت است (stateful) ذخیره کرد. این سرویس کمکی معمولاً یک پایگاه داده (database) است.

توضیح تکمیلی از سایت ردهت (اینجا):
اصل پردازش‌ها که بهتر است آن را پردازش‌های بدون حالت (Stateless Processes) نامید، ادعا می‌کند برنامه‌ی ۱۲ عاملی باید به صورت مجموعه‌ای از پردازش‌های بدون حالت اجرا شود. این بدان معناست که هیچ پردازشی خبری از وضعیت پردازش‌‌های دیگر ندارد و به هیچ اطلاعاتی از سایر پردازش‌ها مانند وضعیت نشست (session state) یا وضعیت گردش‌کار (workflow state) دسترسی ندارد و آنها را دنبال نمی‌کند.
وجود پردازش‌های بدون حالت، مقیاس‌پذیری (scaling) را آسان‌تر می‌کنند. اگر پردازشی بدون حالت باشد می‌توان در هر لحظه، تعداد نسخه‌های در حال اجرای آن را اضافه یا حذف کرد و به کمک آن بار (load) روی سیستم را مدیریت کرد. از آنجایی که هر پردازش مستقل از بقیه کار می‌کند، بدون حالت بودن کمک می‌کند تا از وقوع پیامدهای ناخواسته جلوگیری شود.

نوشته‌های قبلی:
قسمت ششم: ساخت، انتشار و اجرا

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

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

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

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

۲) سه مؤلفه یادگیری ماشین
۱-۲) داده‌ها (Data)
در نوشته قبل (اینجا) مطالعه نمایید.

۲-۲) ویژگی‌ها (Features)
ویژگی‌ها با نام پارامترها(parameters) یا متغیرها (variables) نیز شناخته می شوند. کارکرد خودرو، جنسیت کاربر، قیمت سهام، تعداد تکرار کلمه در یک متن نمونه‌هایی از ویژگی‌ها هستند. به عبارت دیگر، ویژگی‌ها عامل‌هایی‌اند که ماشین برای پیدا کردن الگوها آنها را بررسی می‌کند.
وقتی داده‌ها در جدول ذخیره شده باشند، پیدا کردن ویژگی‌ها ساده است، هر ویژگی معادل یکی از ستون‌های جدول است. اما اگر 100 گیگابایت تصویر از گربه‌ها داشته باشید چه چیزهایی را به عنوان ویژگی‌ انتخاب می‌کنید؟ بی‌شک نمی‌توان هر پیکسل از تصویر را یک ویژگی در نظر بگیریم. به همین دلیل است که انتخاب ویژگی‌های درست معمولاً بیشتر از سایر بخش‌های یادگیری ماشین طول می‌کشد. و همین انتخاب ویژگی‌ها نیز یکی از دلایل اصلی بروز خطاها و اشتباهات در کارهای یادگیری ماشین است. انسان‌ها معمولا بر اساس تفکر و تحلیل خود عمل می‌کنند.آنها فقط ویژگی‌هایی راانتخاب می‌کنند که به آنها علاقه دارند یا فکر می‌کنند “مهم تر” از بقیه‌اند. لطفا در انتخاب ویژگی‌ها تمایلات و احساسات انسانی را کنار بگذارید.

۳-۲) الگوریتم‌ها (Algorithms)
الگوریتم‌ها بدیهی‌ترين بخش یادگیری ماشین هستند. هر مساله‌ی یادگیری ماشین را می‌توان با روش‌های متفاوتی حل کرد. روش انتخابی شما بر دقت، کارایی و اندازه‌ی مدل نهایی تأثیرگذار خواهد بود. به این نکته مهم دقت کنید: اگر داده‌ها نادرست باشند بهترین الگوریتم‌ها هم کمکی به حل مساله نخواهد کرد. به این نکته‌ی مهم گاهی به اختصار «ورودی آشغال-خروجی آشغال» (garbage in – garbage out) گفته می‌شود. بنابراین بیش از حد دنبال به دقت مدل (accuracy)که به صورت درصد بیان می‌شود توجه نکنید، تلاش کنید در ابتدای کار، داده‌های بیشتری آماده کنید.

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

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

محدودیت‌های دنیای من

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

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

داستان:
یک نفر بود که می‌گفت همکلاسی‌ها و استادهای من خیلی نژادپرست هستند. توی جلسات بحث و گفتگوی علمی دانشگاه هر وقت که نوبت به من می‌رسد و من حرف می‌زنم بهم می‌گند:
I know where you are coming from
بعد بنده‌خدا می‌خواست سر این قضیه دانشگاهش رو ول کنه.

توضیح داستان:
معنی لغوی جمله‌ای که همکلاسی‌ها و استادهای ایشان می‌گفتند به فارسی می‌شود «من می‌دونم شما از کجا داری می‌آی (از کجا اومدی)» که مودبانه و محترمانه‌ نیست. راستش را بخواهید تحمل فشار روانی ناشی از این برخورد آن هم در یک فضای دانشگاهی برای هیچ‌کس ساده نیست.
اما حالا اجازه بدهید از گوگل و واژه‌نامه‌های آنلاین کمک بگیریم و معنی این جلمه را پیدا کنیم. معنی این جمله یا اصطلاح این است که «من رویکرد و دیدگاه شما [درباره این موضوع] رو می‌فهمم»!
با پیدا کردن معنی این جمله احتمالا شما هم به این نتیجه رسیده‌اید که این داستان فقط و فقط یک سوءتفاهم بوده است.

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

گزیده:
محدودیت‌های زبان من به معنای محدودیت‌های دنیای من است. لودویگ ویتگنشتاین

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

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

۲) سه مؤلفه یادگیری ماشین
اگر از مطالب نادرست و احمقانه‌ درباره‌ی هوش مصنوعی بگذریم باید گفت که تنها هدف یادگیری ماشین، پیش‌بینی نتایج بر اساس داده‌های ورودی است. تمام وظایف (tasks) یادگیری ماشین را می‌توان به همین شکل (پیش‌بینی بر مبنای داده‌ها) بیان کرد و اگر مساله‌ای را نتوان به این صورت بیان نمود احتمالا آن مساله ارتباطی به یادگیری ماشین ندارد.
هر چه تنوع نمونه‌ها (samples) بیشتر باشد، پیدا کردن الگوهای مرتبط و پیش‌بینی نتیجه آسان‌تر است. برای یادگیری ماشین به سه مولفه (component) نیاز داریم: داده‌ها (Data)، ویژگی‌ها (Features) و الگوریتم (Algorithm)

۱-۲) داده‌ها (Data)
آیا می‌خواهید هرزنامه‌ها (Spam) را از بین ایمیل‌ها شناسایی کنید؟ پس باید تعدادی هرزنامه به عنوان نمونه‌ (sample) جمع‌آوری کنید. آیا می‌خواهید قیمت سهام را پیش‌بینی کنید؟‌ پس باید تاریخچه قیمت سهام را پیدا کنید. آیا می خواهید سلیقه و پسند کاربر را کشف کنید؟ پس باید فعالیت‌های وی را در فیسبوک جمع‌آوری و سپس تجزیه و تحلیل کنید (اوه! نه مارک زاکربرگ، جمع‌آوری اطلاعات کاربران را متوقف کن! بسه دیگه!) . هر چه داده‌ها ناهمگون و دارای تنوع بیشتری باشند نتیجه‌ بهتری به دست خواهد بود. وقتی صحبت از نیاز به داده‌ها می‌شود به خاطر داشته باشید که گاهی حتی ده‌ها هزار داده و نمونه، کم‌ترین تعداد مورد نیاز در یک مساله‌ی یادگیری ماشین است.

دو روش اصلی برای آماده‌سازی داده‌ها وجود دارد: روش دستی (manual) و روش خودکار(automatic) .
در روش دستی،‌ داده‌ها خطای بسیار کم‌تری دارند اما جمع‌آوری آنها به زمان بیشتری نیاز دارد و همین امر باعث می‌شود این روش به صورت کلی پرهزینه‌تر باشد.
روش خودکار نسبت به روش دستی ارزان‌تر است. شما هر داده‌ای را که پیدا می‌کنید جمع آوری می‌کنید به این امید که این داده‌ها برای حل مساله‌ی شما کافی‌اند.
برخی از شرکت‌های عقل کل‌ [کسی که تلاش می‌کند به شکل آزاردهنده‌ای باهوش‌تر از دیگران به نظر برسد؛ مترجم] مانند گوگل به صورت رایگان از مشتریان خود برای برچسب زدن (label) و آماده‌ساز داده‌ها استفاده می‌کنند. حتما به خاطر دارید که ری‌کپچای شرکت گوگل ( ReCaptcha) شما را مجبور می‌کند تا “در تصاویر زیر علائم راهنمایی را انتخاب کنید”؟ [ری‌کپچا اطمینان حاصل می‌کند که کاربر استفاده‌کننده از کامپیوتر یک انسان است نه یک ربات؛ مترجم]. این دقیقا کاری هست که آنها می‌کنند و شما را به عنوان نیروی کار رایگان به خدمت می‌گیرند! چقدر عالی! به جای کارمندان این شرکت‌ها منِ کاربر شروع می‌کنم به یاد دادن تعداد بیشتر و بیشتری از علایم راهنمایی به ری‌کپچا. اوف …!
جمع آوری مجموعه‌ای با کیفیت از داده‌ها کار بسیار دشواری است. به یاد داشته باشید که به مجموعه‌ی داده‌ها، دیتاست (dataset) گفته می‌شود. اهمیت داده‌ها به حدی است که شرکت‌ها، شاید حاضر شوند الگوریتم‌های خود را در اختیار عموم قرار دهند اما به ندرت حاضر به انتشار دیتاست‌های خود می‌شوند.
مترجم: خانم سپیده مشایخی

گزیده:
درست مانند صد سال پیش که برق تقریباً همه چیز را متحول کرد، امروز هم واقعاً برایم دشوار است صنعتی را پیدا کنم که باور داشته باشم هوش مصنوعی آن را طی چند سال آینده متحول نخواهد کرد. اندرو اینگ

برنامه ۱۲ عاملی (۶)- عامل پنجم: ساخت، انتشار، اجرا

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

عامل ۵: ساخت(build)، انتشار(release)، اجرا(run)
گام‌های ساخت (‌Build) و اجرا(Run) را کاملا از هم جدا کنید.

هر پایگاه کد (codebase) طی سه مرحله به استقرار (deploy) تبدیل می‌شود:

  • مرحله ساخت (build stage) : در این مرحله مخزن کد (codebase) به یک بسته قابل اجرا (executable bundle) تبدیل می‌شود. این بسته‌ی قابل اجرا با نام بسته‌ی ساخت (Build) نیز شناخته می‌شود. در این مرحله ابتدا بر اساس شماره‌ی نسخه‌ی (version) کدی که در فرایند استقرار مشخص شده، کد از مخزن کد برداشته می‌شود،‌ در گام دوم، اجزا و مولفه‌های خارجی که برنامه به آنها وابسته است (vendors dependencies) گردآوری می‌شود و در پایان، فایل‌ها و سایر اجزای برنامه کامپایل می‌شوند.
  • مرحله انتشار (release stage): در این مرحله بسته ساخت (Build) که در مرحله قبلی آماده شده با پیکربندی(config) استقرار ترکیب می‌شود که نتیجه‌ی آن نسخه قابل انتشار (release) است که شامل هم بسته‌ی ساخت و هم پیکربندی است. این نسخه‌‌ی انتشار برای استفاده در محیط اجرا (execution environment) آماده است.
  • مرحله اجرا (run stage): برنامه در محیط اجرا بالا می‌آید، برای هر انتشار مجموعه‌ای از فرآیندهای برنامه اجرا می‌شود. این مرحله نام “مرحله زمان اجرا” (runtime) نیز شناخته می شود.

مترجم:
بسته (bundle):‌به دو یا چند برنامه‌ی نرم‌افزاری (application) که با هم بسته‌بندی می‌شوند و به عنوان یک محصول به فروش می‌رسند) بسته یا باندل گفته می‌شود.

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

ابزارهای استقرار معمولاً دارای ابزارهای مدیریت انتشار نیز هستند و یکی از قابلیت‌های برجسته آنها،‌ امکان برگشت به عقب و به نسخه قبلی است (roll back). برای مثال، ابزار استقرار Capistrano نسخه‌ها را در پوشه‌ای (folder) به نام releases ذخیره می‌کند. در این ابزار به کمک یک فایل لینکی (Symlink) که به یکی از پوشه‌های داخل releases اشاره می‌کند، مشخص می‌گردد که نسخه‌ی جاری در کدام یک از پوشه‌ها قرار دارد. هم‌چنین در این ابزار، فرمان rollback به شما کمک می‌کند به راحتی و به سرعت به نسخه قبلی برگردید.

مترجم:
Symlink که symbolic link هم نامیده می‌شود نوعی فایل در لینوکس است که به فایل یا پوشه دیگری در کامپیوتر اشاره می کند. Symlink مشابه shortcut در ویندوز است.

هر انتشار باید یک شناسه‌ی منحصر به فرد مانند شناسه‌ی زمانی (timestamp) مانند 2011-04-06-20:32:17 یا یک شناسه‌ی عددی مانند v100 داشته باشد. فهرست انتشارها مانند لیستی است که فقط می‌توان به آن ردیف جدیدی اضافه کرد و بعد از اضافه شدن ردیف جدید، نمی‌توان آن را تغییر داد.. اعمال هر تغییر جدیدی در انتشار فقط از طریق ایجاد یک انتشار جدید و اضافه کردن آن به لیست موجود، امکان‌پذیر است.

نوشته‌های قبلی:
قسمت پنجم: سرویس ‌های کمکی ( backing services)

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

گزیده:
بخش توسعه‌ی (Devs) مریخی‌اند و بخش عملیات و اجرا (Ops) ونوسی! استیون هاینس

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