<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های آرین ابراهیم‌پور</title><link>https://virgool.ir/feed/@avestura</link><description>وب سایت شخصی: https://avestura.dev</description><language>fa</language><pubDate>2026-11-10 16:10:37</pubDate><image><url>https://files.virgool.ir/upload/users/13391/avatar/f79EbL.png</url><title>آرین ابراهیم‌پور</title><link>https://virgool.ir/@avestura</link></image><item><title>داستان هوشیار: پایه‌ریزی AI با Open WebUI در همکاران سیستم</title><link>https://tech.systemgroup.net/داستان-هوشیار-پایه-ریزی-ai-با-open-webui-در-همکاران-سیستم-tjw3yr9ksenv</link><description>طی چند سال اخیر هوش مصنوعی تونسته به یکی از ابزارهای اصلی در چرخه توسعه نرم‌افزار تبدیل بشه. تو این بخش می‌خوایم تعریف کنیم که این موج تو سازمان ما چطور شروع شد، ما چطور بهش جواب دادیم، و در نهایت چی شد که به سمت ارائه سرویس‌هایی به تیم‌های همکاران سیستم رفتیم که اسمش رو «هوشیار» گذاشتیم.سرویس داخلی «هوشیار» اواسط سال ۱۴۰۴ با ارائه یک نسخه از Open WebUI شروع شد، اما به مرور زمان به توسعه ابزارهای دیگه‌ای تحت همین عنوان مثل «هوشیار جلسات»، «هوشیار اکسل» یا «هوشیار موزیک» هم منجر شد. توی این بلاگ پست می‌خوایم اختصاصی در مورد سرویس Open WebUI صحبت کنیم، و در پست‌های آینده به بقیه سرویس‌هایی که لانچ کردیم یا از ابتدا نوشتیم هم اشاره می‌کنیم.هوش مصنوعی در سازمان‌هاامروز تقریبا هیچ سازمانی نیست که سراغ هوش مصنوعی نرفته باشه یا حداقل بهش فکر نکرده باشه. دلیلش هم ساده‌ست: هوشواره‌ها میتونن با بررسی کردن کد کیفیت اونها رو افزایش بدن، کارها و نوشتن کدهای تکراری رو خودکار کنن، روی کارهای انجام شده تحلیل ارائه بدن و توی تصمیم‌گیری‌ها به ما کمک کنن. اما همین موج به همون اندازه که فرصت می‌سازه، چالش هم با خودش میاره.مهم‌ترین‌شون از نگاه ما دوتا بود: حاکمیت (Governance) و یکپارچگی داده. وقتی کل شرکت شروع می‌کنه به فرستادن سوال و کد و سند به یه مدل زبانی، این سوال‌ها پیش میاد که داده کجا می‌ره، کی به چی دسترسی داره، و اصلا چطور میشه جلوی هرج‌ومرج رو گرفت. کنارش هم بحث مهارت (چطور از هوش مصنوعی استفاده کنیم) و یکپارچگی (چطور مدل‌ها رو به سامانه‌های داخلی، اسناد و دیتامون وصل کنیم) مطرحه.معرفی تیم AIDتیم ما، AID (مخفف AI Development Empowerment که به اسم «توانش هوشمند» هم معروفه)، دقیقا جواب همکاران سیستم به همین موجیه که بالا گفتیم. یکی از اولین کارهایی که تیم ما بعد از تشکیلش انجام داد بررسی مجدد فرآیندها و چرخه توسعه نرم‌افزار بود. ما باید مطمئن می‌شدیم که با وجود تغییراتی که داره اتفاق میفته، فرآیندهای تولید نرم‌افزارمون هنوز منطقی هستن. شروع کردیم به پاسخ به این سوال که چطور با مطالعه وظایف تیم‌ها، می‌تونیم ورودی و خروجی‌ها و کارهایی که زیاد ازشون وقت می‌گیرن رو با استفاده از هوشواره‌ها حذف یا شتابدهی کنیم.البته که ما درس‌آموزی‌های زیادی از مقالات خارجی داشتیم، اما چیزهایی که تو این مجموعه بلاگ پست‌ها تعریف می‌کنیم، تجربه‌ی دست‌اولِ همین تیمه؛ چیزهایی که خودمون راه انداختیم، به مشکل خوردیم و حلشون کردیم؛ نه جمع‌بندی مقاله‌های دیگه.توانمندسازی تیم‌های توسعه و محصول با هوش مصنوعیدر همون هفته اول تشکیل تیم به این نتیجه رسیدیم برای اینکه این کار رو در سطح کل شرکت انجام بدیم، به یک پلتفرم چت متمرکز نیاز داریم. جایی که بتونیم با مدل‌های مختلف صحبت کنیم، با دیتا و سامانه‌های موجود در سازمان یکپارچش کنیم، و همچنین پرامپت و مدل‌های شخصی‌سازی شده رو تعریف و ارزیابی کنیم.با وجود اینکه هوش مصنوعی سرعت توسعه ما رو خیلی بیشتر کرده و یک سامانه که قبلا چندین ماه طول می‌کشید رو می‌تونیم در عرض چند روز راه‌اندازی کنیم، قاعده ما هنوز اینه که راه‌حل های متن‌باز رو به اختراع دوباره چرخ ترجیح می‌دیم. ما فقط جاهایی سراغ ایجاد یک راه‌حل جدید رفتیم که راه‌حل‌های قبلی خیلی متناسب با کار ما نبودن. شتابدهی و افزایش کیفیت کارهای تولید و محصول نه فقط به ابزار، بلکه به آموزش هم نیاز داره. معمولا منابع آموزشی برای یک ابزار متن‌باز مورد قبول در جامعه نرم‌افزار، بیشتر از منابعی هستن که ما برای ابزارهای اختصاصی می‌سازیم.جواب این سوال ما رو رسوند به Open WebUI که تو بخش بعدی مفصل ازش می‌گیم.Open WebUI چیه (و یکپارچگی با OpenRouter و ابرآمد)Open WebUI یه پلتفرم چت متن‌باز برای مدل‌های زبانی هست که قابلیت‌های مهمی مثل قابلیت اتصال به چندین ارائه دهنده، مدیریت کاربران و دایرکتوری در سازمان‌های بزرگ، جستجوی اسناد، ترمینال، پشتیبانی از ابزار و سرورهای MCP و ... داره.با توجه به معیارهایی مثل هزینه، انعطاف توی انتخاب مدل، کنترل داده و قابلیت توسعه پذیری، Open WebUI بهترین گزینه برای ما بود و با کمک پروایدرهای هوش مصنوعی مثل ابرآمد، OpenRouter، و Z.AI Coding Plan تونستیم از همون شروع کار به بیشتر از ۳۴۰ مدل ابری دسترسی پیدا کنیم و این مدل‌ها رو در اختیار افراد در تیم‌های مختلف قرار بدیم.به‌جای اینکه به هر ارائه‌دهنده جدا وصل بشیم، از OpenRouter به‌عنوان یه دروازه‌ی واحد استفاده کردیم که از اون طریق به کلی مدل مختلف دسترسی داریم. در کنار اون از مدل‌هایی که ابرآمد روی زیرساخت خودش اجرا می‌کنه و در اختیار ما قرار داده هم استفاده کردیم.نکته‌ای که باید مد نظر داشته باشیم اینه که وقتی از OpenRouter استفاده می‌کنیم یعنی پرامپت‌ها از مرز شبکه‌ی ما خارج می‌شن و به دست ارائه دهنده‌های میانی و ثالث میرسن. این یه تنش واقعی در بحث کنترل داده‌ست که تو بخش ۱.۱ گفتیم. جلوتر میریم سراغش و می‌گیم که چطور مدیریتش کردیم.راه‌اندازی در سطح شرکت و جا انداختنشراه‌اندازی فنی یه چیزه، جا انداختنش تو کل شرکت کلا یه چیز دیگه‌ست. ما این کار رو در چند مرحله پیش بردیم:·       سریع‌تر کردن کارهای تکراری: یکی از اولین کارهایی که انجام دادیم ساخت یک مدل به اسم Gherkin Generator بود که نوشتن سناریوهای تست رو برای تحلیلگرا راحت‌تر و سریع‌تر می‌کرد. تحلیلگرای ما یکی از اولین کاربران هوشیار بودن که بعد از اون توسعه‌دهنده‌ها هم شروع به استفاده از مدل‌های هوشیار کردن.·       آنبوردینگ و آموزش: ما چندین جلسه کارگاه آموزشی تو حوزه‌های مختلف برگزار کردیم مثل ارائه «هوش مصنوعی در چرخه توسعه نرم‌افزار»، ارائه «مهندسی پرامپت و کانتکست»، ارائه «کدنویسی با ادیتورهای هوشمند»، و «آموزش توسعه Agentها از بنیان». این آموزش‌ها کمک خوبی به درک بهتر این ابزارها و فناوری‌ها کردن.·       قهرمان‌های داخلی (Champions): ما توی هر تیم یک چمپیون تعریف کردیم. چمپیون‌ها به عنوان اولین رابط تیم ما با سایر تیم‌ها به هم‌تیمی‌هاشون کمک می‌کنن تا از جدیدترین ابزارها، تکنیک‌ها و بهترین شیوه‌های استفاده از هوش مصنوعی توی پروژه‌ها بهره‌مند بشن و سوالات و چالش‌های اولیه رو داخل تیم خودشون برطرف کنن. در واقع، Championها تسهیل‌گرانی هستن که فرآیند یادگیری و به‌کارگیری فناوری‌های هوشمند رو برای تیم خودشون هموار می‌کنن.·       رشد استفاده: تو مدت خیلی سریعی از فقط چند کاربر به بیشتر از ۶۰۰ کاربر داخلی رسیدیم و تعداد توکن‌هایی که در هفته از طریق OpenRouter مصرف می‌کردیم، به چند میلیارد رسید. اگه بخوایم سایر ابزارهامون مثل Cursor، Claude، و GLM رو هم در نظر بگیریم، این عدد خیلی بزرگ‌تر هم می‌شه.امنیت، حاکمیت و کنترل دسترسیحالا میرسیم به همون چیزی که تو بخش ۱.۱ در موردش صحبت کردیم. وقتی یه ابزار AI رو در اختیار کل شرکت میذاری، اولین سوال جدی که برات پیش میاد اینه: کی به چی دسترسی داره و داده کجا میره؟ چطور جلوی Prompt Injection رو بگیریم؟دسترسی: کی و چطور: Open WebUI از LDAP پشتیبانی می‌کنه. این یعنی کاربرا می‌تونن از همون اکانت شرکت‌شون برای ورود به هوشیار استفاده کنن و سطح دسترسی‌هاشون به مدل‌ها، پرامپت‌ها، و ابزارها مطابق تیم‌ها و واحدهاشون تعریف بشه.وضعیت داده در دیپلوی Self-Hosted: از اونجایی که Open WebUI روی زیرساخت‌های خودمون هاست شده، تمامی داده‌ها روی PostgreSQL خودمون می‌مونه و یکپارچه‌سازی داده‌های تجمیعی از هوشیار با سایر دیتای سازمانی و داشبوردهای تحلیلی و همچنین یکپارچه‌سازی با داشبوردهای Apache DevLake به راحتی امکان‌پذیره.یکپارچه‌سازی با OpenRouter: همون طور که گفتیم ما نه تنها با مدل‌های لوکال، بلکه به کمک OpenRouter از مدل‌های ابری هم استفاده می‌کنیم. اینجا باید تصمیم بگیریم که چه دیتایی رو برای مدل‌های بیرونی، و یا کدوم مدل‌ها میفرستیم. با کمک هوشیار می‌تونیم Functionهایی بنویسیم که ارسال یک سری داده خاص مثلا دیتاهای حساس رو قبل از ارسال به مدل‌های ابری متوقف کنیم. حتی در این سطح می‌تونیم دسترسی به مدل‌هایی که دارای Prompt Retention هستن و دیتای ارسال شده توسط کاربر رو ذخیره می‌کنن غیرفعال کنیم.یکپارچه‌سازی Open WebUI با استک ما: MCP به‌عنوان ستون فقراتمیدونیم صرفا وصل بودن به مدل‌ها و یه صفحه چت که فقط بلد باشه حرف بزنه خیلی به درد کارهای واقعی شرکت نمیخوره. مهم اینه که مدل بتونه با کانتکست واقعی شرکت کار کنه و حتی اکشن واقعی بگیره: کد رو بخونه، تیکت جیرا رو ببینه، تو مستندات بگرده و یا حتی از طرف کاربر کاری انجام بده. توی نسخه‌های قبلی Open WebUI نیاز بود تا پارامتر Function Calling روی Native ست بشه تا به جای معرفی ابزارها در پرامپت کاربر، مستقیما از قابلیت Tools در API مدل‌های هوش مصنوعی استفاده کنیم. اما خوشبختانه این تنظیم در نسخه‌های جدیدتر Open WebUI روی همین حالت تنظیم شده و به‌طور خودکار همه مدل‌ها به‌صورت پیشفرض از حالت Agentic یا عاملی استفاده می‌کنن.MCP چیه؟قبل از اینکه بریم سراغ لیست سرورهایی که وصل کردیم، بد نیست خیلی خلاصه بگیم MCP اصلا چیه. MCP (Model Context Protocol) یه پروتکل باز و استانداردشده‌ست که راه ارتباط بین یه مدل زبانی و ابزارها، داده‌ها و سیستم‌های بیرونی رو یکسان می‌کنه. به زبون ساده، به‌جای اینکه برای هر سرویس (گیتلب، جیرا، کدبیس، …) یه راه اتصال جدا و مخصوص خودش بنویسیم، هرکدوم رو پشت یه «سرور MCP» میذاریم که چندتا ابزار (tool) استاندارد در اختیار مدل قرار میده؛ مدل هم بدون اینکه بدونه پشت پرده چه سرویسی هست، همون ابزارها رو صدا می‌زنه.دلیل اینکه سراغش رفتیم هم دقیقا همینه: یک پروتکل، کلی کانکتور. اگه فردا یه سرویس جدید هم بخوایم به هوشیار وصل کنیم، کافیه یه سرور MCP براش پیدا کنیم یا بنویسیم؛ نه اینکه دوباره از صفر یکپارچگی طراحی کنیم.سرورهای MCP که استفاده می‌کنیمتو هوشیار چندتا سرور MCP رو وصل کردیم که هرکدوم یه بخش از استک شرکت رو در اختیار مدل میگذارن:·       GitLab MCP: دسترسی به ریپازیتوری‌ها، مرج‌ریکوئست‌ها و پایپلاین‌های CI رو در اختیار مدل می‌گذاره. با این سرور، مدل میتونه کد رو بخونه، تاریخچه کامیت‌ها رو ببینه و حتی روی MRها کار کنه.·       Atlassian MCP: پل ارتباطی بین هوشیار و Jira/Confluence. تحلیلگرا و توسعه‌دهنده‌ها از همین مسیر میتونن تیکت‌ها و صفحات مستندات رو بدون خارج شدن از هوشیار به مدل بدن. یکی از جاهایی که این سرور کم داشت و مجبور شدیم دست به کار بشیم رو جلوتر مفصل تعریف می‌کنیم.·       Storybook MCP: دسترسی به کتابخانه‌ی کامپوننت‌ها و داکس دیزاین‌سیستم داخلی‌مون؛ برای اینکه مدل موقع کار روی فرانت‌اند بدونه چه کامپوننتی از قبل وجود داره و چطور باید استفاده بشه.·       SG CocoIndex: این پروژه یک فورک از CocoIndex Code هست که ما در همکاران سیستم قابلیت‌های مختلفی مثل MCP سرور برای اتصال به هوشیار، جستجو در برنچ‌ها با کمک ابزار ripgrep، جستجوی معنایی با کمک Embedding Model ها و ایندکس کردن کدها با روش HNSW، سیستم مدیریت حافظه، ایندکس کردن کد به‌صورت خودکار و دوره‌ای، و همچنین ارسال متریک‌هایی مانند تعداد خطوط کد به تفکیک زبان روی داشبورد Apache DevLake رو براش پیاده سازی کردیم. این پروژه در گیت‌هاب ما به‌صورت متن‌باز قرار گرفته. جلوتر بیشتر در مورد این ابزار صحبت می‌کنیم.علاوه بر این سه‌تا، چندتا سرور MCP دیگه هم داریم که چون هرکدوم داستان خودشون رو دارن، جای مفصل‌تری برای تعریف کردنشون گذاشتیم: Sub-Agent MCP برای واگذاری کار به ایجنت‌های دیگه، RAGFlow برای جستجو تو اسناد، و سرورهای MCP جستجوی سورس‌کد. نکته‌ی مشترک همه‌شون همونیه که در بخش قبلی گفتیم: مسیر وصل شدن همه یکیه، فقط چیزی که پشتش هست فرق می‌کنه.چالش‌ها و راه‌حل‌هاراه‌اندازی Open WebUI از نظر فنی کار خاصی نبود؛ با یه داکر کامپوز راه میفتاد و میتونستیم کلی امکانات رو در اختیار تیم‌های فنی قرار بدیم. اما این موضوع علاوه بر نیازمندی‌هایی که ایجاد کرد و در بخش قبلی راجع بهشون صحبت کردیم، چالش‌هایی هم با خودش به همراه داشت که در ادامه به اون‌ها می‌پردازیم.محدودیت SQLiteوقتی که تصمیم به راه‌اندازی Open WebUI گرفتیم، از دیتابیس پیش‌فرض که SQLite بود استفاده کردیم چون فکر نمیکردیم که این سرویس تا این حد در سازمان محبوب بشه و این انتخاب مشکل‌ساز بشه. بعد از مدت کوتاهی میزان استفاده از این سرویس که الان همه با اسم هوشیار میشناسنش به شدت زیاد شد. هرچه تعداد چت‌ها، مدل‌های کاستوم و دیتای آنالیتیکال بیشتر میشد، سرویس هم کندتر میشد؛ تا حدی که این کندی برای همه ملموس شده بود. علاوه بر این گاهی اوقات چت‌های طولانی دیگه باز نمیشدن و افراد عملا دسترسی‌شون به اون چت رو از دست می‌دادن.همه اینها باعث شد تصمیم بگیریم از SQLite به Postgres مهاجرت کنیم. اما یه مشکل خیلی بزرگ وجود داشت و اون هم این بود که Open WebUI به‌طور رسمی مهاجرت به Postgres رو پشتیبانی نمیکرد و هیچ ابزار متن‌باز کارآمدی وجود نداشت که بتونه این کار رو برای ما انجام بده. همین باعث شد خودمون دست به کار بشیم و این ابزار رو از اول بنویسیم. با کمک Claude Code توسعه رو شروع کردیم و بعد از چند بار تست روی بکاپ‌هایی که داشتیم سراغ محیط پروداکشن رفتیم و موفق شدیم تمام داده رو به‌طور کامل و بدون از دست رفتن حتی یک ردیف به Postgres منتقل کنیم.در نهایت این ابزار رو به‌صورت متن‌باز روی گیت‌هاب گذاشتیم و کامیونیتی هم ازش استفاده کرد.نبود Sub-Agent در Open WebUIبا گذشت زمان و جا افتادن هوشیار در فرآیندهای سازمان، تیم‌های مختلف از جمله تیم‌های تولید نرم‌افزار و تیم محصول از ما میخواستن که مدل‌های کاستومی براشون بسازیم تا بتونه بخشی از فرآیند کارشون رو انجام بده. کارهایی مثل نوشتن سناریوهای BDD یا تحقیق درمورد روش‌های حل نیازمندی مشتری. زمانی که کارکرد این مدل‌ها پیچیده‌تر شد با مشکل پر شدن کانتکست مدل زبانی مواجه شدیم. بعضی اوقات کارکرد یه مدل شامل چند بخش میشد و مدل آروم آروم فراموش میکرد که ابتدای فرآیند چه اتفاقی افتاده و گاهی اوقات کانتکست مدل به‌طور کامل پر میشد و دیگه نمی‌تونست به ما خروجی بده. راه‌حل ما برای حل این موضوع این بود که از مفهومی به اسم Sub-Agent استفاده بکنیم تا بتونیم فرآیند رو به چندتا تسک کوچک‌تر بشکونیم و به Agent‌های مختلف بسپاریم. اما متوجه شدیم که متاسفانه Open WebUI از این قابلیت پشتیبانی نمی‌کنه و تصمیم گرفتیم خودمون دست به کار بشیم و قابلیت Sub-Agent رو به‌صورت یک MCP به سرویس هوشیار اضافه کنیم.طراحی‌ای که برای این کار انتخاب کردیم ساده بود: یه سرور نوشتیم که توش هر Sub-Agent رو داخل یه فایل کانفیگ تعریف می‌کنیم و برای هرکدوم مدل، system prompt و ابزارهای مخصوص خودش رو مشخص می‌کنیم. وقتی سرور بالا میاد، هر ایجنتی که تعریف کردیم به‌صورت یه ابزار جداگانه در اختیار مدل اصلی هوشیار قرار میگیره؛ و هر وقت مدل اصلی بخواد بخشی از کار رو واگذار کنه، کافیه همون ابزار رو صدا بزنه و صورت‌مسئله رو بهش بده.پشت اون ابزار، Sub-Agent با مدل و ابزارهای خودش به‌طور مستقل کار می‌کنه و در نهایت فقط نتیجه‌ی نهایی رو به مدل اصلی برمیگردونه. زیبایی ماجرا دقیقا همینجاست: مدل اصلی دیگه لازم نیست تمام جزئیات و ابزارهای اون Sub-Agent رو توی کانتکست خودش نگه داره. هر Sub-Agent توی کانتکست جدای خودش کار می‌کنه، بخش خودش رو تموم می‌کنه و یه خروجی تمیز تحویل میده. به این شکل کانتکست مدل اصلی سبک میمونه و دیگه با همون مشکل پر شدن کانتکست که ازش گفتیم مواجه نمی‌شیم.یه مزیت دیگه هم داشت: چون هر ایجنت مدل، پرامپت و ابزارهای خودش رو داره، می‌تونیم به هر نقش دقیقا همون چیزی رو بدیم که لازم داره. مثلا به یه ایجنت پژوهشگر ابزار جستجو میدیم و به یه ایجنت نویسنده اصلا ابزاری نمیدیم. اینطوری نقش‌ها هم شفاف و مشخص باقی می‌مونن.این ابزار رو هم مثل ابزار مهاجرت خودمون از صفر توسعه دادیم و سعی کردیم واقعا آماده‌ی استفاده در پروداکشن باشه، نه یه اسباب‌بازی. بعد هم به‌صورت متن‌باز روی گیت‌هاب قرارش دادیم تا هر کسی که به چنین چیزی نیاز داشت بتونه ازش استفاده کنه.Atlassian MCP کم داشت: مشارکت در پروژه متن‌بازهمون‌طور که قبل‌تر گفتیم، یکی از اولین مدل‌هایی که برای تحلیلگرا ساختیم Gherkin Generator بود؛ مدلی که با گرفتن سند نیازمندی از Confluence، سناریوهای BDD رو براشون تولید میکرد. اما تحلیلگرا معمولا کارشون فقط نوشتن سناریو برای یه سند تازه نبود؛ خیلی وقت‌ها یه سند نیازمندی که از قبل وجود داشت آپدیت میشد، و تحلیلگر نیاز داشت سناریوهای Gherkin رو هم متناسب با همون تغییرات به‌روز کنه؛ نه از صفر بنویسه.برای اینکه مدل بتونه دقیقا بفهمه بین دو نسخه از سند چی تغییر کرده، نیاز داشتیم هم محتوای نسخه‌ی قبلی صفحه‌ی Confluence رو در اختیارش بگذاریم و هم محتوای نسخه‌ی فعلی رو، تا مدل خودش تغییرات رو تشخیص بده و سناریوهای Gherkin رو متناسب باهاش آپدیت کنه. اینجا بود که به یه محدودیت خوردیم: سرور MCP که برای Atlassian استفاده میکردیم، یعنی پروژه‌ی متن‌باز mcp-atlassian، فقط میتونست آخرین نسخه‌ی یه صفحه‌ی Confluence رو برگردونه. هیچ ابزاری برای گرفتن یه نسخه‌ی تاریخی و مشخص از صفحه وجود نداشت، و بدون اون نمیتونستیم محتوای نسخه‌ی قبلی رو به مدل بدیم.چون این قابلیت هیچ‌جای دیگه‌ای هم متن‌باز پیاده نشده بود، تصمیم گرفتیم به‌جای دور زدن مشکل، خودمون این قابلیت رو بسازیم و به‌صورت upstream به همون پروژه مشارکت بدیم. حاصلش شد ابزار جدیدی به اسم get_page_history که با گرفتن شناسه‌ی صفحه و شماره‌ی نسخه، محتوای همون نسخه‌ی تاریخی رو برمیگردونه؛ چه برای احراز هویت با توکن/basic auth (از طریق API نسخه ۱ کانفلوئنس) و چه برای OAuth (از طریق API نسخه ۲). این تغییر رو در قالب PR شماره ۹۰۵ فرستادیم و بعد از ریویو توسط نگهدارنده‌ی پروژه، merge شد.بعد از merge شدن این PR، Gherkin Generator ما میتونه از همون مسیر همیشگی MCP، هم نسخه‌ی قبلی و هم نسخه‌ی فعلی یه صفحه‌ی Confluence رو بگیره، تغییرات بین‌شون رو تشخیص بده، و سناریوهای Gherkin رو دقیقا متناسب با همون تغییرات به‌روز کنه، نه اینکه کل سند رو از اول بازنویسی کنه.Takeaway: وقتی یه سرور MCP متن‌باز یه قابلیت رو کم داره، همیشه لازم نیست دور بزنیمش یا فورکش کنیم؛ گاهی سریع‌ترین و پایدارترین راه این‌ه که خودمون اون قابلیت رو بسازیم و به آپ‌استریم پروژه برگردونیم؛ هم ما ازش استفاده می‌کنیم، هم کل کامیونیتی.نبود پشتیبانی از Standard Input and Output (stdio)یکی دیگه از چالش‌هایی که برای ما بوجود اومد این بود که پشتیبانی Open WebUI از MCP طوری بود که از stdio پشتیبانی نمیکرد و فقط transportهای مبتنی بر HTTP رو قبول میکرد، ولی یکسری از MCPهایی که بهشون نیاز داشتیم فقط به‌صورت stdio قابل استفاده بودن. راه‌حل این مشکل اما بسیار ساده بود. یک ابزار متن‌باز با اسم MCP Proxy بود که میتونست MCPها رو با هر transportی که داشتن بگیره و به‌صورت HTTP در اختیارمون بذاره. حالا فقط کافی بود تا یک Dockerfile بسازیم و بعد از کانفیگ کردن اون MCP با این کامند به‌صورت Streamable HTTP اون رو serve کنیم و ازش توی هوشیار استفاده کنیم:mcp-proxy --host=0.0.0.0 --port=8080 npx something-mcpضعف جستجوی اسنادیکی از نیازمندی‌هایی که بعد از مدتی برای تیم‌های مختلف پیش اومد این بود که کاربر همیشه یه لینک Confluence مشخص نداشت که هوشیار با MCP مستقیم بگیردش. بعضی وقتا لازم بود کاربر بین اسناد مختلف جستجو کنه، یا سندی که باهاش کار داشت اونقدر بزرگ بود که کل متنش توی کانتکست مدل جا نمیشد و باید فقط بخشی ازش استفاده میشد. جالب اینکه این مورد دوم هم دوباره همون پر شدن کانتکست بود که سر Sub-Agent باهاش درگیر بودیم، منتها این بار به‌خاطر حجم خود سند بود نه طولانی شدن مراحل کار. همه اینا مشخصا به یک راه‌حل اشاره می‌کنن و اونم استفاده از Knowledge Base در Open WebUI هست. بعد از اینکه شروع به استفاده از این قابلیت در هوشیار کردیم، متوجه شدیم که قابلیت جستجو اصلا با کیفیت مدنظر ما کار نمی‌کنه و خیلی وقتا اطلاعات بی‌ربط پیدا می‌کنه و اطلاعات مهم رو نادیده میگیره. بعد از بررسی تنظیمات متوجه شدیم قابلیتی در knowledge baseها هست به اسم full context mode که کل سند رو در اختیار مدل قرار میده. این گزینه مشکل پیدا نشدن نکات رو حل میکرد، اما برای مشکل دیگه، یعنی پر شدن کانتکست مدل برای اسناد طولانی، راه‌حلی نبود. این موضوع باعث شد به فکر یه راه‌حل بهتر برای این مسئله باشیم و همونطور که احتمالا تا الان حدس زدید، تصمیم به راه‌اندازی یک سرویس RAG گرفتیم.حالا که تصمیم به استفاده از RAG گرفته شده بود، باید گزینه‌های موجود رو بررسی میکردیم تا یک پروژه‌ی متن‌باز پیدا کنیم که بتونه نیازمندی‌های ما رو برطرف کنه ولی اونقدری سنگین نباشه که از پس نگهداری و فراهم کردن resourceهاش برنیایم. همینطور این ابزار باید قابلیت integrate شدن با data sourceهایی مثل Confluence رو میداشت. در نهایت بعد از جستجوهای فراوان به RAGFlow رسیدیم.پروژه RAGFlow یک ابزار متن‌باز هست که اسناد رو با کیفیت خیلی بهتری پردازش و ایندکس می‌کنه و موقع جستجو فقط بخش‌های مرتبط رو برمیگردونه، ضمن اینکه امکان integrate شدن با منابعی مثل Confluence رو هم داره. بعد از راه‌اندازیش، از طریق MCP به هوشیار وصلش کردیم تا کاربرها بتونن بین اسنادشون جستجو کنن و بدون اینکه کانتکست مدل پر بشه، فقط بخش‌های مرتبط در اختیارش قرار بگیره.جستجوی سورس‌کدیکی از پرتقاضاترین چیزهایی که تیم‌های تولید نرم‌افزار ازمون میخواستن این بود که هوشیار بتونه تو خودِ کدبیس بگرده و جواب بده، نه فقط تو مستندات. مثلا تستر تیم میخواد بدون اینکه نیاز باشه Cursor یا Claude رو باز کنه روی محیط هوشیار در مورد یک موضوعی از کدبیس سوال بپرسه یا حتی از روی کدبیس تست‌های خوب بسازه. این موضوع در ظاهر ساده بود ولی مسیرش برای ما پر از فراز و نشیب شد، مخصوصا سر فضای دیسک و سرعت جستجو. تو این بخش سفرِ ایندکس کردن کد و کارِ روی پرفورمنسش رو تعریف می‌کنیم که در نهایت از طریق MCP به هوشیار وصل شد.ChunkHound + DuckDB: مشکل فضای دیسک و پایداریبرای اولین نسخه‌ی جستجوی کد رفتیم سراغ ChunkHound که یک نرم‌افزار متن‌بازه، و MCP server داخلی خودش رو داره. این پروژه برای ذخیره بردارهای Embedding از DuckDB استفاده می‌کنه. همه‌چیز خوب پیش رفت تا وقتی خواستیم کل کدبیس رو ایندکس کنیم و دیدیم که ایندکس داره نزدیک به ۱ ترابایت دیسک میخوره.این موضوع مسئله خیلی مهمیه برای اینکه Embedding کدهای ما در حالت بهینش حتی نباید یک درصد این مقدار هم جا نیاز داشته باشه. اگرچه خیلی بعدتر تیم ChunkHound این مسئله رو حل کردن، اما مشکلات دیگه ChunkHound مثل عدم پایداری قابلیت‌هاش در نهایت باعث شد که ما بذاریمش کنار و به فکر راه‌حل دیگه‌ای باشیم. به عنوان مثال توی نسخه ۵ این سرویس یک سری قابلیت‌هایی که برای ما مهم بودن مثل Streamable HTTP که مهم‌ترین روش ارتباطی با هوشیار بود، و یا ایندکس و جستجو کردن فایل‌هایی که برای ChunkHound ناشناخته بودن مثل Feature فایل‌های گرکین که ما خیلی برای تحلیل‌هامون ازشون استفاده می‌کنیم کاملا از جستجوهاش حذف شده بودن.فورک کردن CocoIndex و افزودن قابلیت‌هایی مثل HNSWبا اون مشکل دیسک، رفتیم دنبال یه جایگزین و رسیدیم به CocoIndex. راه‌حلی که CocoIndex به اسم CocoIndex Code داشت به عنوان یک ابزار CLI که برنامه‌نویس‌ها رو سیستم‌شون نصبش کنن راه‌حل خوبی بود، اما به عنوان یک سرویس با پروسس گرم که بتونیم به هوشیار وصلش کنیم کارایی نداشت. سرعت جستجو بسیار پایین بود، و هر کسی باید برای خودش رو سیستم یک دیتابیس ایندکس جدا نگهداری می‌کرد. این موضوع باعث شد که ما به کمک CocoIndex و ایده‌هاش، سرویس خودمون رو با یک دیتابیس دیگه به اسم LanceDB که از جستجوی سریع HNSW پشتیبانی می‌کرد توسعه بدیم.خروجی کار در نهایت به‌صورت متن‌باز روی گیت‌هاب منتشر شد. این پروژه تحت عنوان SG CocoIndex قابلیت‌های زیر رو داره:یک سرویس گرم و همیشه در حال اجرا که ایندکس‌ها رو آپدیت نگه میداره و MCP سرور با انتقال HTTP همواره در دسترسه.قابلیت جستجو نه فقط روی برنچ اصلی رو داره بلکه میتونه روی هر برنچی جستجو انجام بده.با Git یکپارچه هست و به‌صورت دوره‌ای تغییرات رو میگیره و ایندکس می‌کنه.دیگه مشکل حافظه‌ای که رو ChunkHound باهاش دست و پنجه نرم می‌کردیم رو نداره و به اندازه معقولی فضا می‌گیره.وقتی روی کانتینرها اجرا می‌شه به منابع روی کانتینر توجه می‌کنه و به همون اندازه از حافظه استفاده می‌کنه.یک سری سنجه‌های مختلف مثل تعداد خطوط کد به تفکیک زبان‌های برنامه‌نویسی رو روی داشبورد Apache DevLake ما منتشر می‌کنه.تأثیر و میزان استفاده در قالب اعدادحالا که سفر رو تعریف کردیم، بذارید با عدد نشون بدیم که هوشیار به عنوان یک سرویس داخلی واقعا چقدر استفاده میشه. همه این دیتا از آنالیتیکس خودِ Open WebUI تا لحظه‌ای که این بلاگ پست رو نوشتیم اومده:تعداد کاربرها: بیشتر از ۶۰۰ نفر کاربر داخلی فعالکل توکن مصرف‌شده: متوسط ۵ میلیارد توکن در هفتهمدل‌های کاستوم ساخته‌شده توسط کاربرها: بیش از ۱۱۰ مدل کاستوم ساخته شده برپایه سایر مدل‌های محلی و ابرییه خروجی واقعی (outcome): افزایش سرعت و کیفیت کارها از ۳۰ درصد تا بیشتر از ۱۰ برابرجمع‌بندی و قدم‌های بعدیاگه بخوایم کل این مسیر رو تو یه جمله جمع کنیم: Open WebUI تو چند روز یه رابط چت AI برای کل شرکت بهمون داد، ولی تبدیلش به چیزی که واقعا با استک ما کار کنه، یعنی برخورد با یه سری چالش و وصله‌کردن خلأها با دست خودمون؛ و ستون فقرات همه‌ این یکپارچگی‌ها MCP بود.چیزهایی که متن‌باز کردیم:ابزار مهاجرت SQLite به Postgres (گیت‌هاب)Sub-Agent MCP (گیت‌هاب)مشارکت upstream روی Atlassian MCP (PR شماره ۹۰۵)و یادمون نره که کارِ HNSW روی CocoIndex فعلا یه فورک داخلیه و هنوز Upstream نشده.</description><category>آرین ابراهیم‌پور</category><author>آرین ابراهیم‌پور</author><pubDate>Sat, 12 Sep 2026 17:35:05 +0330</pubDate></item><item><title>چطوری یک مهندس منفی ده‌برابر بشیم؟</title><link>https://virgool.ir/@avestura/minus-10x-engineer-umdjp1viiqca</link><description>تو جامعه فنی اصطلاحی وجود داره تحت عنوان «مهندس ده‌برابر» یا 10x Engineer. ریشه این اصطلاح به یک مقاله در سال ۱۹۶۸ برمی‌گرده که با تحلیل داده‌ها به این نتیجه رسید که نسبت یک مهندس خوب به یک مهندس بد در سازمان عدد ۱۰ هست، به این معنی که این «مهندسین خوب» ده برابر ارزشمند‌تر و پربارتر هستن.  این اصطلاح توی سال‌های ۲۰۱۶ و ۲۰۱۸ گسترده‌تر و به نوعی Meme (طنز اینترنتی) و دستمایه شوخی‌های مهندسین تبدیل شد.در مقابل مهندس ۱۰ برابر، مهندس منفی ۱۰ برابر هست که باعث افزایش هزینه‌ها میشه. توی این بلاگ پست که ترجمه‌ای از مطلب How to become a -10x Engineer هست میخوایم ببینیم که چطور میشه یک مهندس منفی ده‌برابر شد.مهندسین ده برابر ممکنه افسانه‌ای باشن، اما مهندسین منفی ده برابر قطعا وجود دارن.برای اینکه یک مهندس منفی ده برابر بشید کافیه تا هر هفته ۴۰۰ ساعت وقت تیم مهندسی رو تلف کنین. برای این کار از ترکیبی از استراتژی‌های زیر استفاده کنین:کار ده مهندس دیگه رو باطل کنین.نیازمندی‌های پروژه رو هر چه که بیشتر توسعه پیدا میکنه عوض کنین. برای اینکه شما رو سرزنش نکنن از همون اول نیازمندی‌ها رو مبهم تعریف کنین.۴۰۰ ساعت کار بیخود بسازین.از تیم‌تون بخواید تسک‌هایی رو انجام بدن که شبیه کار واقعیه. مثال‌های متنوعش شامل ارائه دادن، دیاگرام درست کردن، و مدیریت تیکت هاست. آداب و رسوم بی‌معنی درست کنین.۴۰۰ ساعت فرسودگی/عقب‌رفت بسازین.ناسپاس باشین. بقیه رو سرزنش کنین. باعث سردرگمی بشین. عصبانی بشین. دلیل اضافه‌کاری بقیه باشین.۱۰ مهندس رو توی یک مکالمه فنی گروگان بگیرین.اجازه بدین که مهندسین درباره ایده‌هاشون صحبت کنن. تشویق‌شون کنین که به جای عمل‌گرایی دنبال ظاهرسازی باشن. مطمئن بشین که هیچکس قدرت کافی برای تصمیم‌گیری نداره.۴۰۰ ساعت سربار ارتباطی بسازین.جلسات تقویم رو خراب میکنن. برای اینکه به شکل چراغ خاموش وقت بقیه رو هدر بدین، پیام‌ها و اسناد طولانی بنویسین و تا جایی که میشه به اشتراک بذاریدش. از همه نظرات استقبال کنین و با همشون تعامل داشته باشین.۱۰ هفته از حقوق کارمندان رو روی هزینه‌های ابری هدر بدید.نرم‌افزار‌های کند بنویسین. از ایندکس‌های دیتابیس اجتناب کنین. روی ماشین‌های که ۱۶ تا هسته دارن برنامه‌های تک-نخی (Single Threaded) بنویسین. سخت‌افزار عجیب و غریب با میزان RAM و GPU شیک انتخاب کنین. هر جور دلتون خواست داده‌ها رو روی رم/دیسک ذخیره کنین. هیچ چیزی رو فشرده‌سازی نکنین. هیچ اهمیتی به چیدمان داده‌ها ندین.ابزارهای بیخود بسازین.تصمیم بگیرین که راه‌حل‌هایی که همین الان وجود دارن مشکل شما رو دقیقا حل نمیکنن. اسکریپت‌هایی بنویسید که فقط یک نفر ازشون سر در میاره. اگه این اسکریپت کار مهمی انجام میده، مستندی براش ننویسین.۴۰۰ ساعت زمان بیلد/کامپایل به پروژه اضافه کنین.بیلدهای کند باعث هدر رفتن زمان و «سود روی سود اومدن» [به مرور زمان کندتر شدن] میشن. هرچی که زمان بیلد طولانی‌تر بشه، توسعه‌دهنده‌های بیشتری حواسشون رو با چیزای مختلف پرت میکنن. برای اینکه مطمئن بشید توسعه‌دهنده‌ها مدام بین کارهای مختلف سوییچ میکنن اطمینان حاصل کنین که بیلد شما حداقل ۲۰ ثانیه زمان میبره. میتونید برای گرفتن نتیجه مشابه تست‌های کند هم بنویسین.تست‌های بی‌معنی بنویسین.به یک سری از متغیرهای خاص وابستگی ایجاد کنین بدون اینکه کاری که پشتش اتفاق میفته رو تست کنین. انقدر صدا زده شدن توابع رو Mock کنید که دیگه هیچ کد واقعی‌ای اجرا نشه. تست‌هاتون رو زیرزیرکی تصادفی کنین جوری که بعضی اوقات بی هیچ دلیل pass و بعضی اوقات دیگه fail بشن.۴۰۰ ساعت از وقت مهندسی رو روی یک معماری بد تلف کنین.رشد سیستم‌تون در آینده رو حین طراحی سیستم در نظر نداشته باشین. و یا به جای اون کاری کنید که تیم شما روی تصمیمات معماری وسواس داشته باشن تا دیگه وقتی برای آزمایش نظریه‌هاشون باقی نمونه.۴۰۰ ساعت وقت روی دیپلوی‌کردن تلف کنین.تا میتونید محیط‌های مختلف ایجاد کنین. محیط پروداکشن و Staging باید تا حد ممکن با هم فرق داشته باشن. کدهای شکننده روی بیلدسیستم‌های شکننده راه‌اندازی کنین. پشت سر هم دیتابیس‌هاتون رو مایگریت کنین.۱۰ هفته حقوق رو به مشتریان ناراضی ببازین.متداوماً در تشخیص و حل خطاهای اضطراری مشتریان‌تون شکست بخورین. هیچ اهمیتی به مشکلات امنیتی ندین.مستندات بیخود بنویسین.کدها روی توی پیام‌های خصوصی توضیح بدین. مستنداتی بنویسید که هیچ‌کسی قرار نیست ازشون استفاده کنه.۱۰ مهندس رو در یک پروژه بیهوده آزمایشی زندانی کنین.مهندسین خوش‌فکر رو جذب کنین و استعداد و توانایی‌هاشون رو هدر بدین. پیچیدگی پروژه رو کمتر از حد واقعی، و کاربردی بودنش رو بیشتر از حد واقعی به مدیریت نشون بدین. انقدر به مدیریت بگید که «تقریباً دیگه تمومه» تا بالاخره بیخیالش بشن.وابستگی‌هایی به پروژه اضافه کنین که ۴۰۰ ساعت نگهداری نیاز دارن.مهندسین باید به طور جداگانه همه کتاب‌خونه‌ها رو یاد بگیرن.در تغییر استراتژی تاخیر داشته باشین.هیچ‌وقت به شکست اقرار نکنین. تیم‌تون رو غرق هزینه‌ها کنین. توافقات ۸۰/۲۰ ای که می‌تونن وضعیت‌تون رو بهبود بدن رو نادیده بگیرین.۱۰ مهندس صفر برابر استخدام کنین.هزینه فرصت میتونه کشنده باشه. وزنه‌های مرده ممکنه متداوماً به تیم شما ضرر نرسونن، اما روی صندلی کسایی میشینن که میتونستن واقعا کمک کنن.۵ مهندس منفی‌یک برابر استخدام کنین.به وزنه‌مرده‌ها بسنده نکنین. به طور فعال مهندسینی رو استخدام کنین که فاجعه ایجاد میکنن و در برابر یادگرفتن مقاومت نشون میدن.مانع اخراج شدن ۱۰ مهندس منفی‌یک برابر بشین.قایق‌هاتون رو تکون ندین. هیچ ردی از شکست باقی نذارین. ضامن مهندسین بد بشین.دلیل ۴۰۰ ساعت تریاژ باگ بشین.برنامه‌های غیرقابل دیباگ بنویسین. روی همه‌چیز لایه‌های انتزاعی بکشین. کدهای اسپاگتی بنویسین. همه چیز رو حساس به شرایط اولیه کنین. از توابع Pure پرهیز کنین. هر جور دلتون خواست به پروژه وابستگی اضافه کنین. هر جا که ممکن بود بگید «رو ماشین من کار میکنه».</description><category>آرین ابراهیم‌پور</category><author>آرین ابراهیم‌پور</author><pubDate>Thu, 15 Jun 2023 12:33:43 +0330</pubDate></item><item><title>پارسی سرایان گیلان با طعم هوش مصنوعی</title><link>https://virgool.ir/@avestura/پارسی-سرایان-گیلان-با-طعم-هوش-مصنوعی-sffyoebq44f8</link><description>من به چیزای مختلفی علاقه دارم، از جمله شعر، تاریخ، و زادگاهم استان گیلان. چند وقت قبل که تو یکی از کتاب‌فروشی‌های لاهیجان چرخ می‌زدم به این کتاب برخوردم: «پارسی‌سرایان گیلان از آغاز تا پایان قرن سیزدهم» اثر «دکتر هومن یوسف‌دهی». این کتاب نه فقط یک کتاب شعر از شاعران گیلان، بلکه نوعی کتاب تاریخی هم هست که داستان این شعرا رو (هر چند خیلی کوتاه) در کنار شعرهاشون روایت می‌کنه و بنابراین در تقاطع علایق من قرار میگیره.جالبی این کتاب اینجاست که سرچ کردن اکثر این شعرها توی اینترنت هیچ نتیجه‌ای نداشت و انگار که هنوز به دنیای دیجیتال وارد نشدن! هدفم از این پست هم اینه که این اشعار رو به دنیای اینترنت بکشونم، و هم یه آزمایش کوچیک بکنم: متن این شعرهارو بدم به هوش مصنوعی و ببینم که چه عکسی براشون تولید میکنه!? عکس‌های این پست توسط Stable Diffusion ورژن‌های 1.5 و 2.1 تولید شدن.میرزا تقی اصفهانی (وزیر لاهیجان در سال ۱۰۲۱ق)بویی از راح محبت تا در این میخانه است  *  رقص چرخ افتادگی‌های زمین مستانه استدر فضای تنگ دل راحت نمی‌گیرد قـــــــــــرار *  گویی آبادانـــی‌ای نزدیــک این ویرانـــــــه استگویی آبادانی‌ای نزدیک این ویرانه استملا محمد حاجی گیلانیکند خوش‌خوانیِ بلبل، پریشان حالِ زاغـــــــــان را  *  کمـــــال دیــــــــگری دلگیر دارد بی‌کمــــالان رابه صحرایی که هر گَردی به مژگانش کند شوخی  * هوا دام مــشــبــک می‌شـــــــود بال تذروان راکــفــن دزد از ســخــن دزد امـتــیـــاز فاحــــشی دارد  *  که آن پیراهن تن می‌برد، این جامه‌ جان رامِی شیراز، معشوق صفاهان، خوش بود حاجـــی *  به شرط آنکه یاد آری هوای ابرِ گــیـــــــــلان راکند خوش‌خوانیِ بلبل، پریشان حالِ زاغـــــــــان رالاف دانش گر زند پیوسته نادان دور نیست  *  خفته دایم خویش را بیدار می‌بیند به خوابپاس دل‌های خراب و چشمِ اشـــــک‌آلود دار  *  گــنـــــج در ویرانه‌ها می‌باشد و گــوهــر در آبپاس دل‌های خراب و چشمِ اشـــــک‌آلود دار  *  گــنـــــج در ویرانه‌ها می‌باشد و گــوهــر در آب  احسنی لاهیجیآن کاو ز یاری بخت صد پایه برتر از مـاست  *  گرید چنان که گویی خونین جگرتر از ماستکافـــی‌ست قوت دانـــا لـخــت جـگر و لـیکن  *  مــا بی‌جـگرتر از دل، دل بی‌جـگرتــر از ماستآن کاو ز یاری بخت صد پایه برتر از مـاست  *  گرید چنان که گویی خونین جگرتر از ماستخان‌احمد‌خان گیلانیمُردم از درد و طــبــیــب از حــــــال زارم بــی‌خـبـر  *  کار من جان کندن و آن مه ز کارم بی‌خبردر شب تاریک هجرانم ز جان‌کندن چه سود؟  *  ماه من از محـنـت شــــب‌های تارم بی‌خبر مُردم از درد و طــبــیــب از حــــــال زارم بــی‌خـبـر  *  کار من جان کندن و آن مه ز کارم بی‌خبرامینای رودسری لاهیجیخاکساری طور و ما موسی، عصا افتادگی  *  وحی ما خاموشی و معراج ما افتادگیحاصـــل آزادگــی از ســرو پـرسـیـدیم گـفت  *  ابــتـــدا گــــردن‌فــــرازی انتـهـا افتادگـــــیحاصـــل آزادگــی از ســرو پـرسـیـدیم گـفت  *  ابــتـــدا گــــردن‌فــــرازی انتـهـا افتادگـــــیجعفربیگ لاهیجیقدر نعمت می‌شناسم خدمت رز می‌کنم  *  خویش را در پیش می‌خواران معزّز می‌کنمراهــرو را بــــاک از پست و بلند راه نیست  *  آســـمان پــیــموده‌ام اکنون زمین گز می‌کنمراهــرو را بــــاک از پست و بلند راه نیست  *  آســـمان پــیــموده‌ام اکنون زمین گز می‌کنمدیگر پست‌های مرتبط من:آموزش Status Code های HTTP با اشعار فارسی </description><category>آرین ابراهیم‌پور</category><author>آرین ابراهیم‌پور</author><pubDate>Thu, 08 Jun 2023 15:37:31 +0330</pubDate></item><item><title>به اجماع رسیدن (Consensus) در سیستم‌های توزیع شده</title><link>https://virgool.ir/@avestura/raft-distributed-consensus-algorithm-ke3ri6ww9qke</link><description>لوگوی الگوریتم Raftیکی از چالش‌های صنعتی و آکادمیک در سیستم‌های توزیع شده «به اجماع رسیدن» و یا Consensus هست. زمانی که فقط یک Node درون شبکه‌مون داریم کلاینت و سرور به راحتی میتونن سر وضعیت فعلی سیستم به توافق برسن، اما وقتی بحث یک کلاستر توزیع شده میشه چطور؟یکی از الگوریتم‌های مهمی که برای اجماع توزیع‌شده استفاده میشه Raft ئه.توی این وب سایت فارسی نحوه کار الگوریتم Raft رو به صورت بصری و تعاملی آوردم که میتونین هر مرحله از کار Raft رو ببینید.? آدرس وب سایت: https://github.avestura.dev/thesecretlivesofdata-fa/raftپانوشت: این سایت ترجمه‌ای از پروژه The Secret Lives of Data هست.</description><category>آرین ابراهیم‌پور</category><author>آرین ابراهیم‌پور</author><pubDate>Sat, 03 Jun 2023 17:36:34 +0330</pubDate></item><item><title>مشارکت در پروژه‌های پیچیده</title><link>https://virgool.ir/@avestura/contributing-to-complex-projects-mubv6n1nq1pq</link><description>این پست ترجمه‌ای از وبلاگ Mitchell Hashimoto تحت عنوان «Contributing to Complex Projects» است.به عنوان یک مشارکت‌کننده و نگهدارنده دائمی در پروژه‌های متن‌باز، متدواما از من سوال می‌شه که: از کجا شروع می‌کنی؟ رویکردت برای ایجاد یک تغییر معنادار در پروژه جدید چیه؟ چطور ممکنه که بشه جزئیات داخلی یک پروژه پیچیده رو متوجه شد؟این سوالات برای هر نوع پروژه نرم‌افزاری، چه متن‌باز باشن یا اختصاصی، و چه حرفه‌ای باشن یا برای تفریح صادق هستن. رویکرد من برای همه این حالات یکسانه. اگرچه، یک تفاوت اساسی در پروژه‌های حرفه‌ای اینه که شما به مهندسینی که مایلن تا به شما کمک کنن — اگه مجبور نباشن — دسترسی دارید، درحالی که در پروژه‌های متن‌باز بیشتر کار پای شماست.من الگویی تکراری برای نزدیک‌شدن به پروژه‌های پیچیده ایجاد کردم که در این پست مستندسازی شده. انتظار ندارم که این الگو برای همه جواب بده، اما امیدوارم برای سایر کسانی که اعتماد به نفس کافی برای مشارکت و تلاش برای یادگیری پروژه‌های پیچیده دارن کمک‌کننده باشه.من از عبارت «پروژه پیچیده» برای توصیف هر پروژه‎ نرم‌افزاری استفاده می‌کنم که فهم پیاده‌سازیش بدیهی نباشه. این تعریف یک تعریف شخصیه؛ ممکنه بعضی افراد پروژه‌هایی رو پیچیده بدونن که برای سایر افراد پیچیده نیست، و برعکس.گام اول: کاربر پروژه بشیداولین گام برای فهمیدن جزئیات داخلی هر پروژه‌ای اینه که کاربر اون پروژه بشید. حتما لزومی نداره که یک کاربر متخصص بشید، اما معیار شخصی من برای فراغت از این گام اینه که سعی کنید چیزی واقعی با این پروژه بسازید، حتی اگه کوچیک یا ساده باشه. به عنوان مثال، من قبل از مشارکت در زبان برنامه‌نویسی Zig، چندین کتاب‌خانه واقعی نوشتم.به عنوان یک کاربر، شما درک گسترده‌ای از قابلیت های پروژه کسب می‌کنید. تفاوت فاحشی بین خوندن مستندات مرجع یک پروژه و استفاده از اون در عمل وجود داره، و ساخت پروژه‌های کوچک گام مهمی برای رسیدن از درک تئوری به عملیه.علاوه بر این، شما شروع به یادگیری اصطلاحات پروژه که رنگ فرهنگی پروژه رو شکل می‌ده می‌کنید و کمک می‌کنه تا بفهیمد چرا پروژه اینطوری کار می‌کنه، چرا این قابلیت‌ها رو داره، و غیره. این موضوع مهمیه چرا که کمک می‌کنه تا یکدلی بین کسانی که روی پروژه کار میکنن شکل بگیره و همچنین به عنوان راهنمایی عمل می‌کنه که چه تغییراتی در پروژه منطقیه و چه تغییراتی منطقی نیست.من همچنین توصیه می‌کنم که در این نقطه وارد کامیونیتی و اجتماعات اون پروژه بشید. به IRC و یا دیسکورد اون پروژه ملحق بشید، در ملاقات‌های محلی شرکت کنید، سخنرانی‌هاشو ببینید، و غیره. تا یک مدت زمانی بیشتر گوش بدید تا اینکه صحبت کنید. هدف در این قسمت اینه که همدلی کسب کنید و بفهمید که پروژه چطور کار می‌کنه. بعضی اوقات تعجب می‌کنم از اینکه چقدر از تماشا کردن یادگرفتن‌های بقیه یاد‌میگیرم.گام دوم: پروژه رو بیلد کنیدیادبگیرید که چطور پروژه رو بیلد کنید و یک باینری (و یا معادلش) که کار می‌کنه تولید کنید. خودتونو با فهمیدن سیستمی که بیلد رو انجام میده، وابستگی‌های پروژه و ... درگیر نکنید. فقط برید سراغ راهنماها، وب سایت‌ها، و هر چیزی که به طور قابل اتکا و تکرارپذیری شما رو از سورس کد به یک باینری قابل اجرا در سیستم می‌رسونه.قبل از یادگرفتن نحوه بیلد کردن پروژه کدها رو نخونید. خیلی اوقات افرادی رو میبینم که تلاش می‌کنن سورس کد رو بفهمن، قبل از اینکه یادبگیرن چطور پروژه رو بیلد کنن. برای من، بخشی از فرایند یادگیری اینه که چیزای مختلف رو آزمایش کنم و خراب کنمشون، و خیلی سخته که شما بتونید چیزی رو آزمایش یا خراب کنید، بدون اینکه بتونید بیلدش کنید.نگران بیلد‌هایی که همه قابلیت‌ها رو به طور کامل دارن نباشین. پروژه‌های پیچیده عموما قابلیت‌هایی دارن که فقط در صورتی در دسترس قرار می‌گیرن که پیش‌نیاز‌های درست، سیستم‌های درست، تنظیمات درست و ... داشته باشید. در چنین حالتی نگران هیچ کدوم از این موارد نباشید. هدف اینه که یک باینری که به اندازه کافی روی سیستم شما خوب کار می‌کنه داشته باشید. هرچه که قدم‌های بیشتری برمی‌دارین، تجربه و اعتماد به نفس بیشتری برای شروع کار با بیلد‌های با قابلیت‌های بیشتر پیدا می‌کنین.در حین این مرحله، من همچنین پیشنهاد می‌کنم یاد بگیرید که چطور تست‌ها رو اجرا کنید و اون‌هارو به موفقیت برسونید. این باعث میشه راحت‌تر بتونید در گام‌های بعدی روی چیزای مختلف آزمایش کنید یا اون‌ها رو خراب کنید. پروژه‌های پیچیده معمولا تست سوئیت‌های پیچیده‌ای هم دارن، بنابراین در بعضی حالات ممکنه منظور اجرای فقط زیرمجموعه‌ای از تست‌ها باشه — هرچندتایی که برای آزمایش شما کافیه.گام سوم: مسیر‌های داغ داخلی را یاد بگیریدبرای یادگیری جزئیات داخلی، من دوست دارم رویکردی که «دنبال‌کردن رو به پایین، یادگیری رو به بالا» صداش میزنم رو استفاده کنم.⬇️ دنبال کردن رو به پایینمن با یک قابلیت یا مورد کاربردی شروع می‌کنم، و از بیرون شروع می‌کنم به دنبال‌کردن مسیر کد به سمت اون قابلیت. در حین این فرایند، از فایل‌ها، خطوط، و توابعی که رد میشم یادداشت برداری می‌کنم، اما هنوز تلاشی برای فهمیدن اینکه چی چطور کار می‌کنه نمیکنم. این فاز «دنبال‌کردن رو به پایینه».به عنوان مثال، زمانی که کامپایلر Zig رو یادمی‌گرفتم، از دنبال کردن دستور zig build-exe شروع کردم تا از روی یک سورس کد Zig یک خروجی قابل اجرا بسازم. این دنبال‌کردن من رو به سمت پیدا کردن سورس کد محیط دستوری Zig، زیردستور build-exe، و سپس به سمت زیرسیستم «کامپایل»، که در نهایت تجزیه‌گر کد، لکسر و ... رو صدا می‌زد هدایت کرد. از جزئیات پیاده‌سازی فقط چیزایی رو خوندم که بتونم مسیر رو دنبال کنم، نه بیشتر.از یادداشت‌های دنبال‌کردن کد، معمولا می‌تونید یه «تصویر بزرگ» از اینکه یه چیز چطور کار می‌کنه بسازید. براساس نام فایل‌ها، توابع و غیره معمولا می‌تونید زیرسیستم‌های اصلی پروژه رو شناسایی کنید. این کمک می‌کنه تا بعدا فرایند یادگیری رو به بخش‌هایی با اندازه‌های معقول‌تر بشکنید.سعی نکنید که همه چیز رو یاد بگیرید. یکی از اشتباهات رایجی که میبینم مردم مرتکبش میشن اینه که هفته‌ها و حتی ماه‌ها توی کد گم میشن و در نهایت هم دلسرد میشن چون می‌خوان که کل پروژه رو خط به خط بخونن. تمرکز کنید و قابلیت به قابلیت یاد بگیرید.نکته: وقتی قابلیتی رو انتخاب می‌کنید، یکی از قابلیت‌هایی باشه که به عنوان کاربر باهاش آشنا هستید. همچنین، اگه ممکنه، قابلیتی رو انتخاب کنید که از روی سطح پروژه آسون به نظر بیاد. به عنوان مثال، اولین برنامه Zig که سعی کردم دنبالش کنم تا کامپایلر رو یاد بگیرم برنامه‌ای بود که دو عدد رو جمع می‌زد و هیچ خروجی‌ای نداشت.⬆️ یادگیری رو به بالابعد از دنبال کردن یک قابلیت، الان وقتش رسیده که ببینید چطور چندین زیرسیستم مختلف کار می‌کنن. درحالیکه برای فاز دنبال‌کردن، از بیرونی‌ترین نقطه مثل محیط دستوری یا صدازدن رابط‌های برنامه‌نویسی شروع می‌کنم، برای فاز یادگیری، از دورنی‌ترین نقطه شروع می‌کنم.از درونی‌ترین نقطه شروع می‌کنم، چرا که معمولا بنیادی‌ترین و کمترین میزان انتزاع رو داره. همین‌طور که از لایه‌ها بالا میریم، به نظر ارتباط مستقیمی با افزایش سطوح انتزاع داره که باعث میشه اگه قطعات مختلف اجزا رو نمیفهمید، یادگیریتون سخت‌تر بشه.برای یادگیری یک زیرسیستم مشخص، من به طور بازگشتی «دنبال‌کردن رو به پایین، یادگیری رو به بالا» رو انجام می‌دم. اول با بررسی رابط‌های عمومی و بیرونی سطوح شروع می‌کنم، و بعد از اون یاد می‌گیرم که صدا زدن هر کدوم از این رابط‌ها چطور کار می‌کنه. این روشی هست که لایه‌های بالایی از زیرسیستم‌ها استفاده می‌کنند، بنابراین هم من رو راهنمایی می‌کنه که چطور یادبگیرم، و هم همون طور که به سمت بالا حرکت می‌کنم قضیه روشن‌تر میشه.آزمایش و خراب‌کردن چیز‌هادر حین فرایند «دنبال‌کردن رو به پایین، یادگیری رو به بالا»، آزمایش‌کردن و خراب‌کردن چیز‌ها رو برای یادگیری اینکه چطور چیزی کار می‌کنه مفید می‌دونم. به خاطر همین هم هست که یادگیری اینکه چطور پروژه رو بیلد کنیم رو قبل از تلاش برای خوندن جزئیات داخلی پروژه ضروری می‌بینم.لاگ‌های جدید اضافه کنید، بخش‌های کوچک با قابلیت‌های جدید پیاده‌سازی کنید، قابلیت‌های فعلی رو تغییر بدید و ... در نهایت پروژه رو مجددا بیلد کنید و ببینید که چه اتفاقی میفته. این همچنین راه خوبیه تا فهم خودتون رو از اینکه چیزی چطور کار می‌کنه محک بزنید.به عنوان مثال، زمانی که در مورد توکن‌ساز [۱] Zig یاد می‌گرفتم، توکن‌های جدیدی اضافه کردم و دیدم که توکن‌ها شناسایی میشن اما تجزیه‌گر به خطا می‌خوره. وقتی سراغ سیستم بعدی (تجزیه‌گر) رفتم، از توکن‌های جدیدم استفاده کردم تا کاری انجام بدن. و به همین منوال...تکمیل با رسانهدر این فاز، یادگیری کد رو با رسانه‌هایی مثل کتاب‌ها، ویدئو‌ها، بلاگ پست‌ها و ... تکمیل کنید. اگر محتوایی که جزئیات داخلی رو پوشش میده وجود داره، بخونیدش!اگرچه، نباید انتظار داشته باشید که این محتوا به تنهایی شما رو به سطح یک آدم خبره برسونه. مشابه گام اول و «یک کاربر پروژه شدن»، هیچ مکملی برای کثیف کردن دستاتون و بازی با سورس‌کدهای واقعی به هدف «یک نگهدارنده شدن» وجود نداره. این مثال دیگه‌ای از کاربردهای تئوری در مقابل عملیه.نکته: اگه منبعی برای یادگیری جزئیات داخلی وجود نداره، سعی کنید خودتون بنویسیدش! من از اونجایی که نتونستم هیچ منبع به‌روز مشابهی رو پیدا کنم، این کار رو در مورد Zig انجام دادم و در مورد جزئیات داخلی Zig نوشتم. نوشتن در مورد چیزی راه خوبی برای تقویت یادگیری شماست و همچنین به مشارکت کنندگان بعدی هم کمک می‌کنه.مرحله چهارم: کامیت‌های اخیر رو بخونید و مجددا پیاده‌سازی کنیدبه عنوان قدم آخر برای یادگیری جزئیات داخلی، من کامیت‌های اخیر مربوط به زیرسیستم‌هایی که مطالعه‌شون کردم رو می‌خونم و تست می‌کنم که آیا تغییری که انجام شده رو کاملا میفهمم یا نه. این برای من بخش «انجام تمرین‌های انتهای کتاب» از یادگیریمه.من یا کامیت‌های اخیر از پروژه و یا تاریخچه کامیت‌ها از یک فایل یا پوشه مخصوص که مربوط به زیرسیستمی که قبلا مطالعه کردم رو نگاه می‌کنم. بعد از اون یا راه‌حل رو مطالعه می‌کنم (تغییرات درون کامیت) و یا باگی که سعی داشته رفع کنه رو نگاه می‌کنم و سعی می‌کنم که خودم رفعش کنم و ببینم که آیا به راه حل مشابهی میرسم یا نه؟برای کار روی مشکل و حلش، مخزن رو دقیقا تا قبل از اون کامیتی که در حال مطالعش هستم دریافت می‌کنم. باگی که قرار برطرف کنه رو به وجود میارم (اگه مربوط به رفع باگ باشه)، و بعد سعی می‌کنم که راه حل رو خودم پیاده‌سازی کنم. درنهایت، کار خودم رو با کامیتی که توسط مشارکت‌کننده یا نگهدارنده انجام‌شده مقایسه می‌کنم.تنها راهنمایی‌ای که به خودم می‌کنم اندازه تغییرات مورد نیاز هست (نماد‌های +/- در کنار خطوط تغییرات در سورس کنترل). توصیه میکنم برای شروع از تغییراتی که به بیشتر از ۵۰ تا ۱۰۰ خط تغییر در خطوط کد نیاز دارن پرهیز کنید.گام پنجم: تغییر کوچکی ایجاد کنیدمن دوست دارم با تغییر کوچکی شروع کنم و به صورت تدریجی وظایف بزرگ و بزرگ‌تری رو انجام بدم. در این فاز، شما اجزا فنی پروژه رو میفهمید، و الان وقتش رسیده که اجزا انسانی رو یاد بگیرید. هدف در اینجا اینه که تغییر کوچکی بدید و فرایند‌های مشارکت و مرور کد رو یاد بگیرید.معمولا سخت‌ترین قسمت پیدا کردن یک تغییر کوچک برای انجام دادنه. هیچ گلوگه نقره‌ای[۲] اینجا وجود نداره. من بین ایشوهای[۳] ثبت‌شده می‌گردم تا چیزی پیدا کنم که بشه مشارکت کرد. من معمولا چند بار شروع اشتباهی دارم، و یا یک ایشو رو کلا بیخیال میشم و سعی میکنم ایشو دیگه‌ای رو رفع کنم. درنهایت یکی پیدا می‌کنم. این‌بار کمی طول می‌کشه تا مشکل رو پیدا کنم و یا حتی رفع مشکل می‌تونه به طور ناامید‌کننده‌ای طول بکشه، اما این هزینه‌ایه که باید پرداخت کرد. پروژه‌ها معمولا برچسب‌های «مخصوص مشارکت‌کننده‌ها» دارن تا مشارکت‌کننده‌های جدید رو راهنمایی کنن.امروزه بیشتر پروژه‌ها مستندات خوبی در مورد فرایند مشارکت کردن دارن، بنابراین وقتی تغییرات پیاده‌سازی شد، دقیقا مطابق فرایند پیش برید. اگه در مراحل ابتدایی به کامیونیتی ملحق شدید، فرصت خوبیه تا از کسی کمک بخواید تا فرایند مشارکت شمارو دومرتبه بررسی کنه.به عنوان مثال، اولین مشارکت من در Zig یک تغییر سه خطی بود که در فاصله دو عصر چیزی نزدیک به چهار تا پنج ساعت از وقتم رو گرفت (بدون احتساب زمان برای انجام قدم‌های قبلی). اگه امروز با این باگ مواجه می‌شدم در چند دقیقه برطرفش می‌کردم، اما زمان میبره تا به چنین سطح مهارتی برسید.موفقیتدر این نقطه، شما یک پروژه پیچیده رو یاد گرفتید و در اون مشارکت کردید.از پیچیدگی نترسید. من فکر می‌کنم تعداد زیادی از مهندسین از پروژه‌هایی مثل زبان‌های برنامه‌نویسی، مرورگرها، پایگاه‌های داده و ... که به طور کلیشه‌ای پیچیده هستند به شکل یک جادو و یا مقدر شده برای موجوداتی برتر نگاه می‌کنن. میخوام یادآوری کنم که همه پروژه‌ها توسط سایر انسان‌ها شروع شدن. اگه اونا میتونستن که انجامش بدن، من هم میتونم. پس تو هم میتونی.امیدوارم که با به اشتراک گذاشتن رویکرد من، بقیه هم پروژه‌های پیچیده رو بیشتر قابل مشارکت ببینن.ترجمه‌ای از پست «Contributing to Complex Projects» توسط «Mitchell Hashimoto»۱: Tokenizer۲: منظور نویسنده این است که راه‌حل جادویی برای رفع مشکل وجود ندارد۳: Issue</description><category>آرین ابراهیم‌پور</category><author>آرین ابراهیم‌پور</author><pubDate>Thu, 01 Jun 2023 14:24:06 +0330</pubDate></item><item><title>چالش‌های جهانِ پس از نرم‌افزار‌های متن‌باز</title><link>https://virgool.ir/@avestura/challenges-of-post-oss-world-oxc3iosordj1</link><description>نرم‌افزار‌های آزاد پیروز شدند. پس از سال‌ها متقاعد کردن مردم به استفاده از نرم‌افزار‌های متن باز، مبارزه با دیکوتومی غلط بین نرم‌افزار‌های آزاد و صنعتی، نرم‌افزار‌های تجاری، و دفاع در برابر سوگیری‌های منفی، موقعیت نرم‌افزار‌های آزاد دیگر مورد مناقشه نیست — آن‌ها توسط اکثریت قریب به اتفاق شرکت‌ها در سرتاسر دنیا در حال استفاده هستند، انتخاب پیش‌فرض در حین انتخاب تکنولوژی‌ها هستند، به اینترنت، کامپیوتر‌های شخصی ما، تلفن‌های همراه، و بیشتر دستگاه‌هایی که روزانه از آن‌ها استفاده می‌کنیم قدرت می‌دهند، و توسط شرکت‌هایی بزرگ و محافظه‌کاری پذیرفته شدند که تا همین چندین سال قبل مخالف کلی این مفهوم بودند.اما آیا ما واقعا برای آن آماده بوده‌ایم؟ بیشتر تاریخچه اجتماع نرم‌افزار‌های آزاد به مبارزه برای بقا خلاصه می‌شود. و ما استراتژی‌ها، متدولوژی‌ها، و نگرش‌های روابط عمومی‌ای خلق کردیم که به ما برای این بقا کمک می‌کردند. اما زمانه تغییر کرده است و اکنون ما با مجموعه مشکلات کاملا متفاوتی مواجه‌ایم که باید رفع شوند.بنیاد‌های منسوخ‌شده۹۳٪ — درصد پکیج‌های npm که تنها یک نگهدارنده دارنددرک عمومی از سازوکاری که اکوسیستم نرم‌افزار‌های آزاد را حکمرانی می‌کند نسبتاً قدیمی است. همان‌طور که بالاتر نیز اشاره شد — دانش ما درباره بنیاد نرم‌افزارهای اجتماع-بنیان زمانی شکل گرفت که نرم‌افزار‌های آزاد توسط جریان‌های اصلی صنعت برنامه‌نویسی به چشم چیزهای بد و ناخوشایند دیده می‌شد. سازمان‌هایی مانند «بنیاد نرم‌افزار‌های آزاد» و گواهینامه‌هایی مانند GPL ریشه در دهه‌های ۸۰ و ۹۰ میلادی دارند. مقاله اعجاب‌آور «کلیسای جامع و بازار [۱]» که فهم ما را از نرم‌افزار‌های اجتماع-بنیان شکل داد در سال ۱۹۹۹ منتشر شد. در آن زمان اوضاع کاملا متفاوت بود — زمانی که بازار نرم‌افزار زیر سلطه شرکت‌هایی مانند IBM، Oracle و Microsoft بود که واضحاً بر علیه ایده‌های نرم‌افزار‌های آزاد بودند. و در آن زمان ما نیاز به روش‌های متفاوتی برای صحبت در مورد این نرم‌افزارها داشتیم. تمثیل «بازار» طراحی شد تا دل توسعه‌دهندگان را بدست بیاورد و به آن‌ها نشان دهد نباید از نرم‌افزار‌های متن‌باز بترسند. این روش بسیار بسیار خوب عمل کرد. اگرچه نباید در سال ۲۰۱۸ به عنوان روشی برای توضیح اینکه نرم‌افزار‌های آزاد چگونه کار می‌کنند به کار گرفته شود — ما اکنون با مجموعه جدیدتری از مسائل روبه‌رو هستیم.در حالی که بسیاری از ایده‌های «کلیسای جامع و بازار» به خوبی پیش رفتند، و هنوز هم برای هر نوعی از توسعه نرم‌افزار صدق می‌کنند، امروزه نرم‌افزار‌های آزاد درباره ساخت اجتماعات بزرگ، اعمال قانون «هرچه چشم‌ها بیشتر باشند حفره‌ها کم عمق‌ترند[۲]»، و یا در اصل پیروی از مدل بازار نیست. بلکه برعکس، با توجه به تمام موفقیت‌هایی که نرم‌افزار‌های آزاد کسب کرده‌اند، مدل بازار ناموفق بوده است — تنها ۳٪ از پروژه‌های محبوب متن‌باز از چنین مدل توسعه‌ای تبعیت می‌کنند. البته آن ۳٪ شامل برخی از پروژه‌های متن‌باز بسیار محبوب و تاثیرگذار — مانند Rails روی لینوکس — هستند، اما می‌توان چنین استدلال کرد که این پروژه‌ها از این مدل در نتیجه موفقیت خود استفاده می‌کنند، نه برعکس آن. در آخر، هیچ پروژه‌ای به شکل یک اجتماع شروع نمی‌شود، همواره شخص مسئولی وجود دارد، و اجتماعات دور یک پروژه تنها پس از موفق شدن آن به وجود می‌آیند.رشد بی‌حد و مرز۲۸ میلیون کاربر — تعداد کاربران ثبت‌نام شده در گیت‌هاب[۳]هیچ شخصی در دهه ۹۰ میلادی نمیتوانست مقیاس موفقیت نرم‌افزار‌های آزاد را پیش‌بینی کند. تعداد توسعه‌دهندگانی که در حال توسعه متن‌باز هستند، تعداد پروژه‌ها، و تعداد کاربرانی که در ۲۰ سال گذشته چندین برابر شده‌اند. مدل بازار زمانی خلق شد که درصد بزرگی از کسانی که از نرم‌افزار‌های آزاد استفاده می‌کردند، خودشان توسعه‌دهندگان نرم‌افزار‌های آزاد بودند. اما در حال حاضر وضعیت جهان کمی متفاوت است. بیایید کمی این اعداد را مقایسه کنیم:تعداد دانلود‌ها در دو هفته گذشته:۱۹۹۸ — ۱۸۰ هزار دانلود از مرورگر Netscape (محبوب‌ترین پروژه متن‌باز در آن زمان)۲۰۱۷ — ۲۱ میلیون دانلود از Loadash (یک کتاب‌خانه رندوم جاوا اسکریپت)تعداد کاربران ثبت شده:۲۰۰۱ — ۲۰۸ هزار در SourceForge۲۰۱۸ — ۲۸ میلیون در گیت‌هابتعداد پروژه‌های فعال:۲۰۰۸ — ۱۵۰ هزار در SourceForge۲۰۱۷ — ۲۹ میلیون در گیت‌هابهمان‌طور که میبینیم، نرم‌افزار‌های آزاد امروزه عظیم، جهانی و محبوب هستند. اما در اینجا دو مسئله مهم وجود دارد. اولین مورد تکه‌تکه شدن افزایشی اکوسیستم است — خلاف آنچه منفعت بزرگ مدل بازار ارائه می‌شد، نرم‌افزار آزاد امروزی درباره ساخت نقطه تمرکز‌های کانونی برای کامیونیتی نیست. ما به تعداد کافی «جفت چشم‌های ناظر[۴]» نداریم، در عوض همه ما به پروژه‌هایی اتکا کرده‌ایم که اکثرا دارای یک نگهدارنده و یک الی دو نفر مشارکت کننده هستند. دومین مساله این است که رشد تعداد کابران منجر به رشد متناسب تعداد مشارکت‌کنندگان نشده است. و چیزی که مهم‌تر است این است که رشد تعداد مشارکت‌کنندگان نیز به رشد متناسب تعداد نگهدارندگان پروژه‌ها نیافزوده است  — این موجب ایجاد فشار بیشتر و بیشتر روی بخش‌های کانونی جوامع ما می‌شود که مساله بزرگی است.تقلای نگهدارندگان«هر چه موفق‌تر باشید، بیشتر توسط اعلان‌های[۵] گیت‌هاب مجازات می‌شوید» — نگهدارنده متن‌باز بودن چه حسی دارد؟نگهدارندگان نقاط کانونی اجتماعات هر پروژه متن‌بازی هستند. آن‌ها نه‌تنها در اغلب مواقع توسعه‌دهندگان اصلی پشت پروژه هستند، بلکه مسئولیت‌های دیگری هم دارند — باید کاربران را شاد نگه دارند، باید به مشارکت‌کنندگان رسیدگی کنند و یک جریان کار خوب را که به آن‌ها قابلیت مشارکت می‌دهد ایجاد کنند، باید به کسانی که برای اولین بار است مشارکت می‌کنند راهنمایی بدهند، باید PR[۶] ها را بررسی کنند، به انتشارها رسیدگی کنند، و سو و جهت کلی پروژه را حفظ کنند.«وضعیت فعلی — هر وقت که اعلانات[۵] گیت‌هابمو باز می‌کنم، افسرده و مضطرب می‌شم. برنامه‌نویسی خیلی فانه!»با این حال، ما واقعا نگه‌دارنده‌های جدیدی دریافت نمی‌کنیم. تعداد کاربران بسیار سریع رشد می‌کند، تعداد توسعه‌دهندگان رشد می‌کند — و با اینکه این دو چیز بسیار عالی هستند، اما فشار زیادی را روی نگه‌دارندگان پروژه‌ها ایجاد می‌کنند. و تمثیل «بازار» نیز اینجا بخشی از مشکل است — ما انتظار داریم که همواره شخصی پیش قدم شود، انتظار داریم که مشارکت کنندگان بیشتر و بیشتر درگیر پروژه شوند. اما واقعیت متفاوت است — نصف مشارکت‌کنندگان تنها یک بار مشارکت می‌کنند، و چیزی نزدیک به ۲٪ از کامیت‌ها را تشکیل می‌دهند. و هر مشارکتی کار اضافه‌ای را بردوش نگه‌دارنده اضافه می‌کند: یک PR جدید برای بررسی، و کد اضافه‌تری برای نگهداری است. البته که هر مشارکتی ارزشمند است و از آن استقبال می‌شود، اما در حالت کلی اجتماعات نرم‌افزار آزاد دارای مشکل جدی «دومین مشارکت» است — ما کار و تاکید زیادی برای بهینه‌بودن اولین تجربه مشارکت می‌کنیم — اما متاسفانه این منجر به ایجاد اعضایی که به طور طولانی با پروژه همراه باشند نمی‌شود.پایداری$۱۴۳,۰۰۰,۰۰۰ — مقدار تخمین زده شده از ارزش نرم‌افزار متن‌باز در خرید یک بیلیون دلاری Instagramجنبش نرم‌افزار‌های آزاد زمانی شکل گرفت که بیشتر نرم‌افزارهای جریان اصلی[۷] انحصاری بودند، خیلی استفاده نمی‌شدند، و هیچ تجارتی برپایه آن‌ها شکل نگرفته بود. اما امروزه، نرم‌افزار‌های متن‌باز در همه‌جا دیده می‌شوند — به اینترنت، سیستم‌‌عامل‌ها، و محصولات و نرم‌افزار‌هایی که روزانه از آن استفاده می‌کنیم قدرت می‌دهند. تصور ساخت نرم‌افزار‌های جدید بدون استفاده کردن از هیچ نرم‌افزار متن‌بازی بسیار سخت است و نرم‌افزار‌های متن‌باز توسط بزرگ‌ترین و محافظه‌کار‌ترین شرکت‌های جهان در انتخاب تکنولوژی نیز استفاده می‌شوند. ۱۰۰٪ از ۵۰۰ شرکت برتر Fortune از npm استفاده می‌کنند.با این حال، حتی بعضی از محبوب‌ترین پروژه‌های متن‌باز نیز در حال تقلا برای دریافت هرگونه بودجه، و ساخت هرگونه معنایی از پایداری هستند. اما ما به ساخت تجارت با استفاده از آن ابزارها و کتاب‌خانه‌ها ادامه می‌دهیم. می‌توان امیدوار بود که در آینده به نرم‌افزار‌های متن‌باز به عنوان زیرساخت‌های دیجیتال فکر کنیم  — که در این حالت، دقیقا مانند زیرساخت‌های معمولی، نیاز به بودجه‌های مداوم برای عملکرد مناسب خود دارند.طوری که درباره نرم‌افزار‌های متن‌باز صحبت می‌کنیم«دقیقا همانند زیرساخت‌های فیزیکی، زیرساخت‌های دیجیتال نیز نیاز به تعمیر و نگهداری مداوم دارند.» - جاده‌ها و پل‌ها: کارهای دیده نشده پشت زیرساخت‌های دیجیتال مااحتمالا برای حل برخی از آن مشکلات نیازداریم تا روشی که با آن درباره نرم‌افزار‌های متن‌باز صحبت می‌کنیم را تغییر دهیم — برای متقاعد کردن مدیرانمان به جای اینکه بگوییم باید در متن‌باز مشارکت کنیم چون رفتار «خوبی» است، یا چون «روحیه» تیم را افزایش می‌دهد باید با اصطلاحات تجاری صحبت کنیم — ریسک و فرصت. مشارکت کردن در پروژه‌ها ریسک پروژه‌های ما را به عنوان یک تجارت کاهش می‌دهد — ریسک اینکه نگهدارنده پروژه از پروژه خسته شود و ما با یک پروژه بدون نگهدارنده مواجه شویم را کاهش می‌دهد، ریسک نیازمند شدن به سایر افراد را در صورتی که در پروژه با مشکلی مواجه شویم را کاهش می‌دهد. مشارکت در پروژه همچنین یک فرصت است — ما می‌توانیم پروژه را شکل دهیم، قابلیت‌های جدیدی به آن اضافه کنیم که ما را قادر می‌سازد تا راه حل تجاری بهتری داشته باشیم.و ارزش جالب دیگر مشارکت در نرم‌افزار‌های آزاد، اهمیت خالص آن در بازاریابی است — مخصوصا اگر محصول شما یک جامعه فنی را هدف قرار می‌دهد. ما اکنون در عصر جنبش روابط توسعه‌دهندگان با یکدیگر زندگی می‌کنیم، جایی که هر شرکتی که در حال ساخت پروژه‌های نرم‌افزاری برای توسعه‌دهندگان است منابع زیادی را برای تبلیغات صرف می‌کند. مشارکت در متن‌باز یکی از بهترین روش‌های تبلیغات است. و حتی اگر تجارت شما در حال ساخت ابزارهایی برای توسعه‌دهندگان نیست، جذب توسعه‌دهندگان با استعداد را برای شما راحت‌تر می‌کند.راه حل؟ راه حلی ندارممن نمی‌دانم چطور می‌توان مشکلات جهان فعلی نرم‌افزار‌های آزاد را رفع کرد. اما کاملا آشکار است که نرم‌افزار‌های آزاد نیاز به تکامل دارند — ما نیاز به تعاریف جدید، راه حل‌های جدید و رهبرانی جدید برای جنبشی داریم که همین الان هم جهان را تغییر داده‌اند. نرم‌افزار‌های آزاد امروزه با مجموعه مشکلاتی بسیار متفاوت‌تر از ۲۰ سال گذشته دست و پنجه نرم می‌کنند، بنابراین استفاده از تمثیل‌هایی که ۲۰ سال قبل به وجود آمده‌اند ممکن است مسیر رو به جلو نباشد. و من معتقدم که ما باید هرچه سریع‌تر آن راه‌حل ها را پیدا کنیم... و یا معلوم می‌شود که ما قصرهای باشکوه خود را روی شن ساخته ایم.این پست انطباقی از ارائه «چالش‌های پس از جهان متن‌باز» من است که در رویدادهای مختلفی ارائه کرده‌ام. اگر دوست دارید که در کنفرانس و شرکت شما درباره نرم‌افزار‌های متن‌باز صحبتی داشته باشم، میتوانید با خیال راحت از طریق این ایمیل با من در تماس باشید: krzysztof_cieslak@windowslive.comاین پست و ارائه آن هر دو به شدت تاثیر گرفته از کار نادیا اقبال هستند.منابعChallenges of post-OSS world by Krzysztof Cieślakپانوشت[۱]: The Cathedral and the Bazaar[۲]: قانون لینوس. به عبارتی دیگر: «هرچه آزمایش‌کننده‌های برنامه و برنامه‌نویس‌های تیم نرم‌افزاری بیشتر باشند، تقریباً هر مشکلی سریع شناخته خواهد شد و اصلاح آن برای یک نفر مشخص و روشن خواهد بود.»[۳]: این آمار مربوط به سال انتشار این پست یعنی سال ۲۰۱۸ است[۴]: منظور چشم‌های ناظر قانون لینوس است[۵]: Notifications[۶]: Pull Request, aka Merge Request[۷]: Mainstram Software</description><category>آرین ابراهیم‌پور</category><author>آرین ابراهیم‌پور</author><pubDate>Thu, 01 Jun 2023 13:57:52 +0330</pubDate></item><item><title>مروری کوتاه و تاریخی بر زبان‌های برنامه‌نویسی Functional</title><link>https://virgool.ir/@avestura/short-historical-review-functional-programming-lambda-calculus-and-turing-kwpyrzfk8g1o</link><description>برای درک بهتر انواع زبان‌های برنامه‌نویسی بهتر است کمی در تاریخچه کامپیوتر به عقب برگردیم. زمانی که آلن تورینگ از خود پرسید «محاسبه کردن به چه معناست؟». در حقیقت پرسش این است که وقتی می‌گوییم چیزی را محاسبه کرده‌ایم، چه کاری انجام داده‌ایم؟نتیجه تحقیقات آلن تورینگ در پرینتسون آمریکا به خلق ماشین تورینگ انجامید. یک ماشین مکانیکی که با چند جز شامل: نوار‌های قابل نوشتن و پاک کردن، یک Head برای نشان دادن نوار فعلی و مقادیر 0 و 1 روی این نوار‌ها ارائه شد.آلن تورینگ و ماشین مکانیکی‌اش معروف به ماشین تورینگشما برای انجام محاسبات در ماشین تورینگ به آن «دستور» می‌دهید که نوارهایش را جا‌به‌جا کند و یا روی نوار‌ها چیزی بنویسد تا در نهایت مقادیر روی نوار‌ها نتیجه مورد نظرتان را تولید کند. از همین رو، ماشین تورینگ یک ماشین «دستوری» است. فرمان‌های شما می‌تواند به شکل «این را روی نوار فعلی بنویس؛ نوار را به چپ ببر؛ مقدار روی نوار را بخوان؛ ...» باشد. در ادامه تحقیقات معلوم شد که این ماشین، یک ماشین محاسباتی بسیار قدرتمند است که توانایی محاسبه همه الگوریتم‌های محاسباتی را داراست. به عبارت دیگر، این ماشین می‌تواند هر محاسبه‌ای که کامپیوتر شخصی شما قادر به حساب کردن آن است را محاسبه کند. از این رو به این ماشین، و همه مدل‌های محاسباتی که در این حد قدرت دارند، Turing-complete می‌گویند.نکته جالب ماجرا اینجاست که در همین زمان، آقای «آلونزو چرچ»، ریاضی‌دان و منطق‌دان دانشگاه پرینستون که از قضا استاد آلن تورینگ هم بود، روی مدل محاسباتی دیگری مبتنی بر منطق و ریاضیات با نام «محاسبات لامبدا» کار می‌کرد. اگرچه آلن تورینگ و آلونزو چرچ از تحقیقات یکدیگر در این زمینه اطلاعی نداشتند و به طور مستقل کارهای خود را پیش می‌بردند، ولی نتیجه کار آن‌ها در مقایسه با یکدیگر به نتایج جالبی رسید.آلونزو چرچ و محاسبات لامبدابا اینکه مدل نشانه‌گذاری ریاضیاتی چرچ بسیار ساده به نظر می‌رسید، ولی در عین حال نیز بسیار قدرت‌مند ظاهر شد و قابلیت «توصیف» محاسبات مختلف را دارا بود. این باعث شد که ذهن دانشمندان مختلف به این سوال معطوف شود که آیا مدل ریاضیاتی چرچ که با «ارزیابی عبارت‌های ریاضی» محاسبات را انجام ‌می‌دهد، قدرتی به اندازه ماشین مکانیکی تورینگ که با «اجرای دستورات» محاسبه می‌کند دارد؟ یا خیر؟خروجی این تحقیق بسیار جالب بود: ماشین تورینگ و محاسبات لامبدای چرچ اگرچه دو مسیر متفاوت در محاسبات را پیش گرفته بودند، اما کاملا قدرت یکسانی داشتند. به عبارتی، هیچ الگوریتم و محاسباتی وجود ندارد که بتوانید با ماشین تورینگ انجام بدهید، ولی با محاسبات لامبدا قادر به انجام آن نباشید. از این رو، مدل محاسباتی چرچ، Turing-complete و مدل محاسباتی تورینگ، Church-complete تلقی می‌شود.این دو رویکرد در محاسبات در نهایت به دو جریان از طراحی زبان‌های برنامه‌نویسی منجر شد. 1- زبان‌های برنامه‌نویسی «دستوری» که شما در هر لحظه به زبان دستور می‌دهید که چه کاری را انجام دهد، و 2- زبان‌های برنامه‌نویسی فانکشنال در گروه زبان‌های «توصیفی» که مبتنی بر محاسبات لامبدای چرچ توسعه یافت. به تعبیری، محاسبات لامبدا، مادر زبان‌های برنامه‌نویسی تابعی است.همان‌طور که پیشتر نیز اشاره شد، در زبان‌های تابعی شما به «ارزیابی عبارت‌های ریاضیاتی» و در زبان‌های دستوری به «اجرای دستورات» می‌پردازید. تقریبا تمامی زبان‌هایی که می‌شناسید مانند C، C++، Go، Rust، Python، JavaScript، Ruby و Java جز زبان‌های دستوری تلقی می‌شوند، اگرچه ممکن است در طول زمان برخی از قابلیت‌های زبان‌های فانکشنال و محاسبات لامبدا را اضافه کرده باشند. پارادایم برنامه‌نویسی «شی گرایی» نیز زیر مجموعه‌ای از مدل‌های محاسباتی دستوری است.در مقابل زبان‌هایی مانند Haskell، OCaml، F#، Clojure، Scala، Lisp و Elixir زبان‌های فانشکال و از دسته زبان‌های توصیفی هستند. این زبان‌ها نیز ممکن است در طول زمان برخی از جریان کارهای دستوری (مانند ST Monad ها در Haskell) را اضافه کرده باشند.برخی از تفاوت‌های این زبان‌ها در لیست زیر آمده است. برای ملموس‌تر بودن قضیه، این مقایسه را بین زبان‌های شی‌گرا و فانکشنال انجام می‌دهیم:در زبان‌های شی‌گرا شما به زبان می‌گویید «این کار را انجام بده، سپس این کار را انجام بده و در نهایت این کار را انجام بده». در زبان‌های فانشکال شما چیزی که می‌خواهید را توصیف می‌کنید.در زبان‌های شی‌گرا دیتا Mutable و قابل تغییر است، و متد‌های کلاس‌ها Impure هستند. به این معنی که این متد‌ها میتوانند Side-effect داشته باشند. به عنوان مثال شما در حین اجرای تابع Max که قرار است ماکسیمم دو عدد را حساب کند میتوانید به دیتابیس وصل شوید و یا یک موشک را لانچ کنید! در مقابل، در زبان‌های تابعی مقادیر متغیر‌ها و ساختمان‌های داده شما Immutable هستند، و ساید افکت‌ها بسته به زبان برنامه‌نویسی ممکن است وجود نداشته باشد، و یا کنترل شده باشد.زبان‌های شی‌گرا برای پیشمایش از حلقه‌ها، و زبان‌های تابعی از توابع بازگشتی استفاده می‌کنند. از آنجایی که کامپیوتر‌های ما در سطح پردازنده به طور دستوری کار می‌کنند، زبان‌های تابعی باید عملیاتی به نام TCO (Tail-call optimization) را انجام دهند تا هم پرفورمنسی به اندازه حلقه‌ها داشته باشند و هم جلوی پرشدن Stack را بگیرند.در زبان‌های شی‌گرا از دید برنامه‌نویس مقادیر و متغیرها با متد‌های موجود در کلاس‌ها فرق می‌کنند. در حالی که در زبان‌های فانکشنال توابع مانند متغیر‌ها به اصلاح First-class هستند و به یک شکل تعریف می‌شوند. هرجایی که بتوان متغیری تعریف کرد میتوان تابعی تعریف کرد، و هر جا که می‌توان مقدار را پاس داد، میتوان تابعی پاس داد.یافتن اضلاع یک مثلث در زبان برنامه‌نویسی Haskellاز دیگر ویژگی‌های زبان‌های فانکشنال اعمال جزئی (Partial Apply)، اثبات بودن برای نظریه تایپ‌ها (Type Theory)، و ترکیب توابع (Composition) است.اعمال جزئیبا استفاده از قابلیت اعمال جزئی می‌توانید بدون اینکه تمامی پارامتر‌های مورد نیاز یک تابع را به آن پاس بدهید، آن را صدا بزنید. در این صورت، خروجی شما تابعی جدیدی خواهد بود که تنها نیاز به پارامتر‌های پاس نشده برای تولید خروجی دارد.در تکه کد بالا که به زبان F# نوشته شده است، stringRepeat نام تابع، و پارامتر‌های n و str ورودی‌های تابع هستند. در خط چهارم، بدون اینکه پارامتر دوم به تابع پاس شود، خروجی در مقدار/تابع repeat3Times ذخیره شده است که خود تابعی است که با دریافت یک رشته، یک رشته دیگر را خروجی می‌دهد.بدون نوشتن هیچ تایپی، کامپایلر به طور خودکار تایپ همه پارامتر‌ها را از روی نحوه استفاده آن‌ها در بدنه تابع تشخیص داده است.اثبات قضایادر زبان‌های برنامه‌نویسی فانکشنال و Static-type، تایپ‌ها برای برنامه شما یک «قضیه» (Theorem) محسوب می‌شوند، و کد‌هایی که شما که در بدنه توابع می‌نویسید یک اثبات برای این قضایا تلقی می‌گردند. به دلیل نزدیکی ریاضیاتی این نظریه‌ها، تقریباً تمامی زبان‌های برنامه‌نویسی که برای اثبات قضایای ریاضی به کار می‌روند زبان‌های فانکشنال هستند. این امر باعث می‌شود که از بسیاری از خطاها در زمان کامپایل و پیش از اجرای برنامه جلوگیری شود.ترکیب توابعسنگ‌بنای زبان‌های فانکشنال ترکیب توابع است. شما برای نوشتن یک نرم‌افزار مقیاس بزرگ، صرفا کافی است توابع مختلفی تعریف کنید و سپس این توابع را با یکدیگر ترکیب (Compose) کنید.در تکه کد بالا، تابع getFirstChar با دریافت یک رشته، کاراکتر اول آن را خروجی می‌دهد. همچنین تابع isLetter نیز تابعی است که چک می‌کند آیا کاراکتر ورودی حرف هست یا خیر؟حال ما می‌توانیم با ترکیب این دو تابع، تابع جدیدی تعریف کنیم که چک کند آیا کاراکتر اول یک رشته حرف است یا نه.بیشتر بخوانیدبرای مطالعه بیشتر این لینک را ببینید: «چرا باید اف‌شارپ رو یاد بگیریم و چه مزایا و کاربردهایی داره»</description><category>آرین ابراهیم‌پور</category><author>آرین ابراهیم‌پور</author><pubDate>Sat, 29 Jan 2022 12:12:59 +0330</pubDate></item><item><title>آموزش Status Code های HTTP با اشعار فارسی</title><link>https://virgool.ir/@avestura/http-status-codes-with-classic-persian-poems-اشعار-فارسی-c411gfavgc6k</link><description>429 HTTP Errorویرایش هفتم آبان‌ماه سال ۱۴۰۱:برای مهسا امینی‌ها، نیکا شاکرمی‌ها، نوید افکاری‌ها، و همه کسانی که خون‌شان به ناحق بر زمین ریخته شد. برای همه مظلومین ایران از شیراز تا زاهدان، از خزر تا خلیج همیشگی فارس...توی این پست قصد دارم برای هر کدوم از Status Code های HTTP یه شعر فارسی مرتبط بنویسم. اگه فکر میکنید در ارتباط با اون Status Code شعر بهتری میشناسید، یا اینکه میخواید Status Code ای رو که من پوشش ندادم به لیست اضافه کنید کامنت بذارید اضافه کنم.100 Continueهمه یک به یک پیش من بازگویسر قصه بگشا همه راز گویخواجوی کرمانی101 Switching Protocolطرح نو ای در سخن انداختمطرح سخن نوع دگر ساختموحشی بافقی102 Processingگر شوم مشغول اشکال و جوابتشنگان را کی توانم داد آبمولانا200 OKسال خرم، فال نیکو، مال وافر، حال خوشاصل ثابت، نسل باقی، تخت عالی، بخت رامحافظ201 Createdمدرسه با چند مسجد ساختمخانقه هم چند طرح انداختمعطار202 Acceptedاگر من سر در آوردم به دامتپذیرفتم همه گونه پیامتفخر الدین اسعد گرگانی203 Non-Authoritative Informationبه خلعت فرستاده را شاد کردبه پاسخ بسی نیکوی یاد کرداسدی توسی204 No Contentدیر است که دلدار پیامی نفرستادننوشت سلامی و کلامی نفرستادحافظ205 Reset Contentچو بر حکم‌ مجدد می‌رود تعلیق این مطلبمگر تعلیقهٔ نو جان من زین بند برهاندقاآنی206 Partial Contentآخر ای مطرب نگویی قصه دلدار ماگر نگویی بیشتر آخر بگویی اندکیمولانا300 Multiple Choiceبرو یک بیک بارگیها ببینکدامت به آید یکی برگزینفردوسی301 Moved Permanentlyگرفته راه دارالملک در پیششهنشه کوچ کرد از منزل خویشنظامی302 Found / 303 See Other / 307 Temporary Redirectچو گفت این حرف آن مرد یگانهفرستادش همی سوی خزانهعطار304 Not Modifiedتو در کارم نکردی هیچ تقصیرولی حکم قضا را نیست تغییرملا مسیح400 Bad Requestگفت یوسف هین بیاور ارمغاناو ز شرم این تقاضا زد فغانمولانا401 Unauthorizedچون بیامد پیش گفتش کیستی؟از یمن زادی و یا ترکیستیمولانا402 Payment Requiredبخواهم ز تو باج گفت اندکیازین چار چیزت بخواهم یکیفردوسی403 Forbiddenتا نگردی آشنا زین پرده رمزی نشنویگوش نامحرم نباشد جای پیغام سروشحافظ404 Not Foundاز کشت‌زار چرخ و زمین کاین دو گاو راستیک جو نیافتم که به خرمن درآورمخاقانی405 Method Not Allowedخواجه غلط کرده‌ای در روش یار منصد چو تو هم گم شود در من و در کار منمولانا406 Not Acceptableبر این در دعای تو مقبول نیستبه خواری برو یا به زاری بایستسعدی408 Request Timeoutحسب حالی ننوشتی و شد ایامی چندمحرمی کو که فرستم به تو پیغامی چندحافظ409 Conflictمرا تا ضعف عادت شد، تو را زورنخواهد بود این پیوند، مقدورپروین اعتصامی410 Goneدیشب به تو افسانه‌ی دل گفتم و رفتموز خوی تو چون موی تو آشفتم و رفتمرهی معیری411 Length Requiredکه تا هر کس اندازهٔ خویش راببیند بداند کم و بیش رافردوسی413 Payload Too Largeبا چنین جثه ندانم که چه سانبه در مرگ برون خواهی رفتجامی414 URI Too Longزبان خامه را کوتاه سازم از سر نامهکه در عرض شکایاتم حکایت گشت طولانیوحشی418 I&#39;m a teapotعاقبت آن دزد زر جام ثمینش را نیافتپیر ما خندید و گفتش من خود آن جام می ام421 Misdirected Requestاینجا چه نیافتم کسی را دمساززان در که بیامدم برون رفتم بازمولانا425 Too Earlyبگفتا پسر جان چه زود آمدییقین چون شکاری نبود آمدیافسرالملوک429 Too Many Requests (rate limit)هیچ پرسش را نخواهم گفت زین ساعت جوابزان که از من خیره و بیهوده بس پرسیده اندپروین اعتصامی451 Unavailable For Legal Reasonsبدو گفت موبد که فرمان شاهبیامد نماند مرا رای و راهفردوسی500 Internal Server Errorگفت: دکّــان مرا ایّــام بــستدیگرم کــاری نمی‌آید ز دستپروین اعتصامی502 Bad Gatewayدر شهر بستند یک باره تنگز دروازه بردند بر باره جنگاسدی توسی503 Service Unavailableامیدم به بخشایش تست بسبه چیزی دگر نیستم دسترسفردوسی504 Gateway Timeoutما بدان مقصد عالی نتوانیم رسیدهم مگر پیش نهد لطف شما گامی چندحافظ507 Insufficient Storageمرا سعد علی نانی همی دادنگنجید آن سخا و فضل در توسنایی508 Loop Detectedتا به گیسوی تو دست ناسزایان کم رسدهر دلی از حلقه‌ای در ذکر یارب یارب استحافظ</description><category>آرین ابراهیم‌پور</category><author>آرین ابراهیم‌پور</author><pubDate>Sat, 11 Sep 2021 03:06:44 +0430</pubDate></item><item><title>چرا باید اف‌شارپ رو یاد بگیریم و چه مزایا و کاربرد هایی داره؟</title><link>https://virgool.ir/@avestura/learn-fsharp-for-fun-and-profit-ox5rxavm9tq3</link><description>پیش گفتارتو این نوشته سعی شده افراد با سطح دانش برنامه نویسی متوسط هدف قرار داده بشن، بنابراین اگه بیشتر میدونید خیلی راحت میتونید بخش هایی که بلدید رو رد کنید، و اگه جایی براتون مبهم بود، خجالت نکشید و تو کامنتا سوال بپرسید، سعی میکنم جوابتون رو هر چه سریع تر بدم، و یا اگه گسستگی مطلب در جایی دیدید بگید که اطلاعات بیشتری اضافه کنم.اف‌شارپ چیه؟اگه برنامه نویس باشید و توی Stack Overflow و آمار های سالیانش چرخ زده باشین احتمال زیاد هر سال اف‌شارپ رو جز زبان هایی که بیشتر میزان حقوق رو دارن دیدید، ولی تا حالا براتون سوال پیش اومده که این زبان چیه؟Top Paying Technologies - Stack Overflow Annual Survey (2019)اف‌شارپ (به انگلیسی: #F یا FSharp) یه زبان برنامه نویسی متن باز و کراس‌پلتفرم (قابل اجرا روی لینوکس و مک و ویندوز) هست که توسط موسسه تحقیقاتی مایکروسافت (Microsoft Research) ایجاد شد. این زبان، یه زبان تابعی (یا همون Functional) روی پلتفرم دات‌نت مایکروسافته که از پارادایم شی گرایی هم پشتیبانی میکنه. (این که زبان Functional و یا شی گرایی چیه رو جلوتر توضیح میدم).من با اف‌شارپ چیکار میتونم انجام بدم؟به طور خلاصه، هر کاری! این زبان، یک زبان کاملا عام منظورست و برای هر کاری میتونید ازش استفاده کنید، همچنین برای هر کیس خاص هم کتاب خونه ها و موتور های خاصی توسعه داده شده که احساس کمبود نمیکنید.نمونه هایی از کاربرد های اف‌شارپ:بازی سازی: این زبان کاملا سازگار با موتور بازی سازی معروف Unity هست. موتور های دیگه ای مثل Godot و یا کتاب خونه های بازی سازی مثل مونوگیم (Mono Game) هم با اف‌شارپ تمیز کار میکنن. اف‌شارپ موتور بازی سازی اختصاصی خودش به اسم Nu رو هم داره که با خود اف‌شارپ نوشته شده. اشاره به موتور های دیگه ای مثل Xenko یا Wave هم خالی از لطف نیست.برنامه نویسی وب: اف‌شارپ برای وب فوق العادست. این زبان خیلی راحت میتونه از طریق پروژه Fable با اکوسیستم جاوا اسکریپت ارتباط برقرار کنه و خیلی راحت میتونید توابع جاوا اسکریپت رو صدا بزنید. با پروژه Elmish میتونید فرانت اند خودتون رو به اف‌شارپ (که خیلی خلاصه تر از HTML هست) بنویسید و یا یه برنامه React رو با اف‌شارپ درست کنید. همچنین در کنار همه این موارد اف‌شارپ به WebAssembly هم اومده و میتونید برنامه اف‌شارپ خودتون رو بدون نیاز به کامپایل به جاوا اسکریپت روی مرورگر اجرا کنید. این پروژه Bolero نام داره و برای همه این موارد هم نمونه و مستندات آموزشی به اندازه کافی پیدا میشه. در انتها، اگه فکر میکنید که ممکنه این موارد سردرگم تون کنه، پروژه ای هست به نام SAFE-Stack که براتون یه قالب آماده از یه پروژه اف‌شارپ رو میسازه که از برنامه نویسی سمت سرور و API تا کلاینت و طراحی رابط کاربری رو داخل خودش داره که باهاش شروع کنید به ساخت ایده هاتون. برای ساخت یه وب‌سایت، به چیزی جز اف‌شارپ و دانش معمولی از وب نیاز پیدا نمیکنید.توسعه برنامه های موبایل: با اف‌شارپ و زامارین (Xamarin) میتونید خیلی راحت برای گوشی های اندرویدی یا آیفون‌تون بازی یا برنامه درست کنید و بفروشیدشون. همچنین با استفاده از Xamarin Forms میتونید یه برنامه واحد بنویسید و خروجیش رو هم برای اندروید و هم iOS بگیرید.برنامه نویسی دسکتاپ: با اف‌شارپ میتونید برنامه های دسکتاپ بسازید. این زبان از WinForms و WPF و همچنین Avalonia که برای ساخت برنامه های کراس‌پلتفرم استفاده میشه به طور رایگان و بدون محدودیت استفاده کنید.هوش مصنوعی، یادگیری ماشین و علوم داده: اگر به کارکردن تو این حوزه ها علاقه دارید، اف‌شارپ میتونه خیلی تجربه خوبی براتون به ارمغان بیاره، چرا که خوراک اف‌شارپ داده‌ست، مخصوصا با قابلیت Type Provider که مخصوص اف‌شارپ هست (این رو هم جلوتر توضیح میدم). میتونید از ML.NET و Tensorflow توی اف‌شارپ استفاده کنید؛ فرقی نمیکنه که تخمین‌گر قیمت میسازید، میخواید کلاه برداری رو شناسایی کنید، چهره رو توی عکس تشخیص بدید، احساسات نویسنده رو توی کامنت ها و نوشته ها تشخیص بدید و خیلی چیزای دیگه... اف‌شارپ برای همه این موارد قابل استفادست. همچنین Apache Spark و FsLab که یه پکیج کامل برای کار با پروژه های علوم دادست مخصوص برنامه نویس های اف‌شارپ وجود داره.اینترنت اشیا: اف‌شارپ برای توسعه اینترنت اشیا هم در کنار شماست. خیلی راحت میتونید اف‌شارپ رو روی رزبری پای خودتون راه بندازید و روی دستگاه های مختلفی ازش استفاده کنید.محاسبات ابری: از اف‌شارپ به شکل بومی و رسمی توی Azure که یک ارائه دهنده خدمات ابری هست پشتیبانی میشه و برای بقیه هم ازونجایی که اف‌شارپ روی دات‌نت کار میکنه میتونید استفاده کنید مثل GCP  و AWS و ...و ...: همون طور که میبینید، اف‌شارپ برای هر کاری میتونه مورد استفاده قرار بگیره، و همچنین خیلی از موارد دیگه که میتونید تو صفحه پروژه های اف‌شارپ پیدا کنید.گفتی اف‌شارپ یه زبان Functional ئه. این یعنی چی؟پارادایم های برنامه نویسی روش هایی هستن که باهاشون میتونیم زبان های مختلف رو بر اساس ویژگی هایی که دارن دسته بندی کنیم.پارادایم Object Oriented، پارادایمی از نوع زبان های برنامه نویسی دستوریه (Imperative)، یعنی اینکه برنامه شما در هر لحظه به ماشین میگه که حالت برنامه (بخوانید متغیر ها و همه المان های برنامه) رو چطور تغییر بده و برای لحظه به لحظه اتفاقی که میفته یه دستور کار داره. در حالی که پارادایم Functional از گروه زبان های توصیفی (Declarative) هست، یعنی شما فقط به ماشین میگید که اون حالت نهایی که مد نظرتون هست چه ویژگی هایی داره، بدون اینکه خودتون محاسبش کنید.زبان های Functional از اونجایی که به منطق و ریاضیات نزدیک تر هستن، اعتبار سنجی برنامه راحت تره، یعنی شما زمان کامپایل میتونید باگ های بیشتری رو بگیرید. در واقع میشه گفت در این زبان ها به جای اجرای برنامه (Execute)، از واژه ارزیابی برنامه (Evaluate) استفاده میشه، چون که توابع مثل توابع ریاضی فقط قراره محاسبه بشن، بدون اینکه در حین این محاسبه اتفاق بی ربطی مثل تغییر یه داده در یه گوشه از برنامه صورت بگیره. مثلا شما حین محاسبه مجموع صورت حساب یک مشتری در رستوران موشک هوا نمیکنید! و صدا زدن یک تابع با پارامتر های یکسان، همواره مقدار یکسانی رو برمیگردونه و هیچ چیزی در بیرون تغییر پیدا نمیکنه. به بیان دیگه شما عوارض-جانبی (Side-effect) ندارید. برای همین در اف‌شارپ همه چیز به طور پیشفرض غیر قابل تغییر (Immutable) هست، و شما نمیتونید بگید یه چیزی مساوی با 2 هست و پایین تر برابر با 3 کنیدش. (مگراینکه از کلید واژه mutable استفاده کنید)اگه این موارد براتون گنگ و یا نامفهومه، شاید با خوندن ادامه متن و یا دیدن نمونه هایی از کد های تابعی برطرف بشه، در هر حالت سوالی بود میتونید بپرسید.زبان هایی که میشناسید مثل پایتون، سی، جاوا، سی‌شارپ، سی‌پلاس‌پلاس، پی‌اچ‌پی، جاوا اسکریپت، روبی و ... همه زبان های دستوری هستند که به مرور زمان بهشون ممکنه قابلیت های تابعی هم اضافه شده باشه.بخش برنامه نویسی تابعی خیلی مفصله و داستان زیاد داره و من ازونجایی که نمیخوام این پست رو آکادمیک کنم و وارد مفاهیمی مثل Monad ها و محاسبات لامبدا و ... بشم به همین موارد بسنده میکنم، همین قدر هم برای شروع با این زبان ها و کلی کارای خلاقانه کردن کافیه پس از چیزی نترسید.نمونه از از یک برنامه دستوری (Imperative) به زبان سی‌شارپ:var list = new List&lt;int&gt; { 1, 2, 3 , 4};&#xA;int result = 0;&#xA;for(int i = 0; i &lt; list.Count; i++){&#xA;   result += list[i];&#xA;}&#xA;Console.WriteLine($&#34;Sum: {result}&#34;);همین برنامه با زبان اف‌شارپ:let result = List.sum [1; 2; 3; 4]&#xA;printfn &#34;Sum: %A&#34; resultاف‌شارپ چه ویژگی هایی داره؟اف‎شارپ ویژگی های مختلفی داره که ممکنه برات جالب باشه.۱- سمی کالناف‎شارپ برای اتمام دستوراتش به سمی‌کالن (;) نیاز نداره۲- فاصله گذاریاف شارپ مثل پایتون برای بلوک بندی کد از Indentation و فاصله‌ها استفاده میکنه، ولی نگرانش نباشید چون تو اف‌شارپ این فاصله گذاری‌ها ارورخیز نیست!let x = &#34;Hello&#34;&#xA;let number =&#xA;    if x.Length &gt; 10 then 20&#xA;    else 30۳- توابع مانند متغیر ها شهروند درجه یک زبان هستنتوی اف شارپ تعریف توابع هیچ فرقی با تعریف مقادیر نداره و همشون با کلید واژه let ایجاد میشن و هرجایی هم میتونید مقدار و تابع تعریف کنید.let myName = &#34;Aryan&#34;&#xA;let myAge = 21&#xA;&#xA;let addGreetingsToName name (age:int) =&#xA;    $&#34;Hello {name}! You are {age} years old!&#34;&#xA;&#xA;addGreetingsToName myName myAgeدر کد بالا addGreetingsToName یک تابع هست. همون طور که احتمالا متوجه شدید توی اف‌شارپ برای نوشتن پارامتر ها و یا دادن پارامتر تابع نیازی به نوشتن پرانتز و یا کاما ندارید و فقط با یک فاصله گذاشتن میتونید به پارامتر ها مقدار بدید (اگرچه میتونید به فرم سنتی پرانتز و کاما هم بنویسید). این نوع نحوه نوشتار یه مزیت خیلی بزرگ داره که تو بخش بعدی یعنی اعمال جزئی میبینیم.۴- اعمال جزئی یا Partial Applicationتو اف‌شارپ میتونید توابع رو Partially Apply کنید، یعنی به تابعی کم تر از مقداری که نیاز داره پارامتر بدید. نتیجه تولید شده تابع جدیدیه که فقط پارامتر های پاس داده نشده رو نیاز داره.let someFunction param1 param2 param3 =&#xA;    param1 + (2 * param2) - param3&#xA;&#xA;let anotherFunction = someFunction 10 20&#xA;&#xA;let result = anotherFunction 30 // calculates 10 + (2 * 20) - 30در این مثال تابعی تعریف شده به اسم someFunction و سه پارامتر میگیره به اسم param1 تا param3. توی خط بعد من یه تابع جدید ساختم که با دادن پارامتر های اول و دوم، فقط یه پارامتر باقی مونده رو میگیره و مقدار زیر رو حساب میکنه:10 + (2 * 20) + param3۵- تعریف نوع های جدید و رکورد ها تو اف‌شارپ کوتاه و آسونهtype Gender =&#xA;    | Male&#xA;    | Female&#xA;    | Other of string&#xA;&#xA;type Person =&#xA;    { name : string &#xA;      age : int&#xA;      father : Person option&#xA;      mother : Person option&#xA;      gender : Gender }در نمونه کد بالا ما دو نوع تعریف کردیم یکی برای جنسیت، و یکی دیگه برای شخص. شخص با پارامتر های نام، سن و جنس تعریف شده، و همچنین دو ویژگی اختیاری (option) به نام پدر و مادر۶- پایپ همه جا! (|&gt;)پایپ یا خط لوله ویژگی ای از اف‌شارپه که همه جا تو اف‌شارپ میبینیدش. پایپ هم یک اپراتور هست، مثل اپراتور های ریاضیات مثل جمع و ضرب با این تفاوت که پایپ یه مقدار رو به تابع جلوییش پاس میده و در واقع مثل یک خط تولید در کارخونه عمل میکنه:let car = Car(name = &#34;My Car&#34;)&#xA;&#xA;car&#xA;|&gt; paintBody green&#xA;|&gt; paintRoofs red&#xA;|&gt; testStrength&#xA;|&gt; driveدر این مثال ابتدا یک ماشین جدید ساختیم، و بعد با خط لوله پاسش دادیم به تابعی که بدنش رو سبز رنگ کنه، در مرحله بعد این ماشین با بدنه سبز رو به تابعی دادیم که سقفش رو قرمز میکنه، در مرحله بعدی سپردیمش به تیم تست قدرت ماشین، و در نهایت باهاش رانندگی کردیم.۷- استاتیک تایپ همراه با استنتاج نوع (Type Inference)زبان اف‌شارپ یه زبان Static Type هست، یعنی اینکه زمان کامپایل نوع و تایپ همه چیز معلومه. به همین خاطر خیلی از خطا های برنامتون از جهات منطقی هنگام مرحله کامپایل گرفته میشه. از طرفی کامپایلر اف‌شارپ باهوش هم هست و میتونه نوع پارامتر یا متغیر ها و تابع ها و غیره رو از روی کاربردش استنتاج کنه. به عنوان مثال اگه من در ادامه مثال بالا نمونه ای با دادن نام و جنسیت و ... تعریف کنم، خود کامپایلر میفهمه که من یک انسان رو تعریف کردم. در واقع شما مثل پایتون تایپ ها رو نمینویسید، ولی از اون طرف مزیت های استاتیک تایپینگ رو هم دارین.// infers as Person&#xA;let someGuy =&#xA;    { name = &#34;Mohsen Mehdinia&#34;&#xA;      age  = 31&#xA;      gender = Male&#xA;      father = None&#xA;      mother = None }someGuy binding infered as Person typeدر این مثال دوم فرض کنید من میخوام تابعی بنویسم که لیستی از اسامی رو بگیره و به همه این اسامی خوش‌آمد بگه:let greet names =&#xA;    names |&gt; List.iter (fun name -&gt; printfn &#34;Hello %s!&#34; name)در کد بالا اول از همه تابع greet با پارامتر names رو تعریف کردیم و در بدنه تابع مقدار names رو پایپ کردیم داخل تابع iter که مخصوص پیمایش روی لیست و انجام کار روی هر آیتم از لیسته. این تابع باید بدونه که به ازای هر آیتم از لیست باید چه کاری انجام بده پس به یک تابع دیگه نیاز داره.میتونیم این تابع رو یک جای دیگه تعریف کنیم، و یا همونجا جلوی iter با کلید واژه fun یک تابع جدید تعریف کنیم که پارامتر name رو میگیره و یه کاری باهاش انجام میده.حالا بازی اصلی شروع میشه! کامپایلر اینجا خودش استنتاج میکنه که پارامتر names از نوع لیستی از string هاست و همچنین تابع greet از نوع:string list -&gt; unitهست. این یعنی که این تابع لیستی رشته ها رو میگیره و یک unit برمیگردونه. unit یا واحد به این معنیه که تابع فقط یه کاری انجام داده و مقداری برنگردونده (در واقع میتونید به unit به همون شکل void در سایر زبان ها نگاه کنید). این فقط یه نمونه ساده بود و میتونید نمونه های خیلی پیچیده تری هم که کامپایلر قادر به تشخیص نوع هست رو هم در مثال ها ببینید.۸- ترکیب توابع یا Compositionترکیب توابع هم از مواردی هست که زیاد تو اف‌شارپ میبینید. به مثال زیر نگاه کنید:let countCharacter char (str:string) =&#xA;    str.ToCharArray()&#xA;     |&gt; Array.filter (fun c -&gt; c = char)&#xA;     |&gt; Array.length&#xA;&#xA;let isMoreThanTen len = len &gt; 10اینجا دو تابع تعریف کردیم یکی به نام countChar که یک رشته و یک کاراکتر رو به عنوان پارامتر میگیره و میشمره که توی اون رشته چند بار کاراکتر مورد نظر ما دیده شده. همچنین تابعی وجود داره به اسم isMoreThanTen که یک عدد رو میگیره و میگه که اون عدد بیشتر از 10 هست یا نه. همون طور که حدس زدید هم تایپ این دو تابع به این شکله:countChar : char → string→ intisMoreThanTen : int → boolحالا فرض کنید ما میخوایم تابعی بنویسیم که به ما بگه آیا تعداد کاراکتر های حرف b داخل یک متن بیشتر از 10 هست یا نه. خیلی راحت میتونیم این دو تابع رو به این شکل و با استفاده از اپراتور (&gt;&gt;) ترکیب کنیم:let hasMoreThanTenB = countCharacter &#39;b&#39; &gt;&gt; isMoreThanTenو من حالا میتونم به این شکل فراخوانیش کنم:hasMoreThanTenB &#34;Oh baba, what a boooablabo&#34;تایپ این تابع نهایی هم به این شکل هست:hasMoreThanTenB : string → bool۹- تطبیق الگو یا Pattern Matchingبا استفاده از این ویژگی زبان شما میتونید روی انواع و اقسام متغیر ها و توابع و زیر مجموعه هاشون الگویابی کنید و در صورت تطبیق الگو کار مورد نظرتون رو انجام بدید. (تطبیق الگو در زبان های برنامه نویسی یه جورایی مثل نوشتن RegEx روی رشته های زبان های طبیعی میمونه)type Suit = &#xA;    | Diamond&#xA;    | Spades&#xA;    | Hearts&#xA;    | Clubs&#xA;&#xA;type Rank =&#xA;    | Ace&#xA;    | King&#xA;    | Queen&#xA;    | Jack&#xA;    | NumberRank of int&#xA;&#xA;type Card = Rank * Suit&#xA;&#xA;let getScore card =&#xA;    match card with&#xA;    | (Ace, Spades) -&gt; 20&#xA;    | (King, Hearts) | (Queen, Hearts) -&gt; 15&#xA;    | (NumberRank x, Spades) -&gt; (x % 5) * 2&#xA;    | _ -&gt; 0در نمونه کد بالا ما اول سه تایپ یکی برای شکل کارت، یکی دیگه برای مقدار روی کارت، و یکی هم برای خود کارت که ترکیبی از شکل و مقدار کارت هست تعریف کردیم. (علامت * برای ترکیب شکل و مقدار کارت که تایپ جدیدی تولید کرده، همون ضرب دکارتی ریاضیات روی مجموعه مقادیر هست که مجموعه مقادیر جدید ایجاد میکنه و از فضا نیومده)حالا ما تابعی نیاز داریم که به ازای یک سری کارت خاص به کاربر امتیاز بدن، همون طور که میبینید این تابع به ازای آس پیک 20 امتیاز برمیگردونه، به ازای شاه یا بی‌بی دل 15 امتیاز، به ازای هر عددی از پیک ها، ابتدا اون عدد در پیمانه پنج حساب میشه و سپس ضرب در 2 شده و برگشت داده میشه، و در غیر این حالات امتیازی تعلق نمیگیره. میبینید که بدون نیاز به if های متوالی به شکل خیلی ساده همچین تابعی ممکن شد. زبان اف‌شارپ از الگو های خیلی زیاد و متنوعی پشتیبانی میکنه که میتونید از مستنداتش مطالعه کنید.۱۰- تهیه کننده نوع یا Type Providerتایپ پروایدر ها، قابلیت هایی از زبان اف‌شارپ هستن که براتون از یه فایل یا هر منبع دیگه ای تایپ تولید میکنن. به عنوان مثال شما بهش فایل csv یا json و ... به عنوان ورودی میدید و تایپ پروایدر براتون تجزیش میکنه و علاوه بر اینکه توی محیط توسعه تون براتون Auto Complete یا Intellisense میاره، تایپ چک هم میشه و اگه برنامه در رابطه با اون داده ها باگ داشته باشه، کامپایلر بهتون اطلاع میده.A JSON Type Provider sample in F#۱۱- پشتیبانی کامل از دات‌نت و همکاری بدون مشکل با سایر زبان های دات‌نت مثل سی‌شارپاف‌شارپ یکی از زبان های رسمی دات‌نته و میتونه از پروژه های سایر زبان های دات‌نت مثل پروژه هایی که با سی شارپ نوشته شدن استفاده کنه، و یا داخل یک Solution میتونید هم پروژه سی‌شارپ و هم اف‌شارپ داشته باشید و این پروژه ها بدون مشکل هم رو صدا بزنن.عملا هر مزیتی برای دات‌نت وجود داره، اف شارپ هم میتونه ازش استفاده کنه و گسترشش بده.۱۲- سایر...اف‌شارپ کلی قابلیت خفن دیگه داره مثل واحد های اندازه گیری ( Units of Messure) که میتونید به هر متغیر عددی واحد بدید (مثل کیلوگرم، کیلو وات، گیگا بایت و ... حتی واحد های سفارشی خودتون) و این واحد ها توسط کامپایلر تایپ چک میشن، همچنین تایپ های ناشناس، ماژول سیستم خوب، ارتباط بومی با سیستم، Computational Expressions یا عبارات محاسباتی که یکی از قدرت مند ترین ساختار های زبانی اف‌شارپه، بهینه سازی TailCall و خیلی چیز های دیگه... که توضیحشون خارج از این پست هست.مقایسه اف‌شارپ با سایر زبان هاپایتون: همون طور که دیدیم، اف‌شارپ مثل پایتون از Indentation استفاده میکنه و خیلی جاها نیازی به نوشتن تایپ ها نیست، لایبرری های خیلی خوبی برای هوش مصنوعی داره که میتونید مدل تون رو باهاش train کنید، در کنار اون استاتیک تایپ هست و اعتبار منطقی برنامه رو بالا میبره و در برنامه های بزرگ به باگ خیلی کمتری میخورید. جاوا اسکریپت: اف‌شارپ برای برنامه نویس های جاوا اسکریپت هم دوست خوبیه. چرا که با Fable عملا به لایبرری های گذشته تون دسترسی دارید و میتونید خیلی راحت برنامه نویسی Front-end انجام بدید.سی‌شارپ: اگه برنامه نویس دات‌نت هستید، قطعا اف‌شارپ رو یاد بگیرید. اولش ممکنه گیج کننده باشه، ولی بعدا دیگه حتی دوست ندارین به سی‌شارپ برگردین. دیفالت های اف‌شارپ خیلی کدتون رو کمتر میکنه و در عین حال چون با دات نت آشنایی دارین، خیلی خیلی کارتون برای یادگیری آسون تر میشه.هسکل (Haskell): هسکل به نوعی بابابزرگ زبان های تابعی شناخته میشه و اونقدر از نظر ساخت زبانی قوی و منطقی هست که نه تنها رو زبان های تابعی مثل اف‌شارپ، بلکه روی زبان های mainstream هم تاثیر زیادی داشته. اگرچه بعضی از ویژگی های هسکل توی اف‌شارپ نیست (قراره اضافه بشه)، ولی شما به کل اکوسیستم دات‌نت دسترسی پیدا میکنین. کم نبودن هسکلر هایی که بعد از کار با اف شارپ بهشون حس اینکه تو خونه خودشون هسکل هستن دست داده.وضعیت ابزارهای توسعه برای اف‌شارپ چجوریه؟اف‌شارپ برای توسعه رسما توسط مایکروسافت پشتیبانی میشه، و این یعنی اینکه شما میتونید خیلی راحت داخل ویژوال استودیو اف‌شارپ بنویسید. همچنین اگه طرفدار محصولات JetBrains هستید و قبلا با PyCharm یا IntelliJIdea یا PhpStorm و ... تجربه داشتید، میتونید از JetBrains Rider استفاده کنید که از اف‌شارپ پشتیبانی میکنه.ولی جدای همه اینا اگه نظر منو بخواید، من افزونه Ionide برای VSCode رو بهتون توصیه میکنم. این افزودن قابلیت های خارق العاده ای داره که حتی برای زبان های پر استفاده تر هم پیدا نمیشن مثل ابزار های یکپارچه شده با بلید سیستم و یا قابلیت Info Panel. سایتش هم اینجاست:http://ionide.ioاوف! میخوام اف‌شارپ یاد بگیرم.خیلی هم عالی! منابع خیلی زیادی برای شروع وجود داره.سایت «بنیاد اف‌شارپ»https://fsharp.orgسایت «اف‌شارپ برای سرگرمی و سود»https://fsharpforfunandprofit.comسایت اف‌شارپ در دات‌نتhttps://dotnet.microsoft.com/languages/fsharpبیشتر بخوانیدمروری کوتاه و تاریخی بر زبان‌های برنامه‌نویسی Functionalسوالی داشتم که تو متن جواب ندادی!این پایین بپرس ↓</description><category>آرین ابراهیم‌پور</category><author>آرین ابراهیم‌پور</author><pubDate>Tue, 25 Jun 2019 21:01:22 +0430</pubDate></item></channel></rss>