Codoloper

آموزش برنامه‌نویسی به فارسی

یاد بگیر، پیشرفت کن، بساز.

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

داکیومنت ها:

JavascriptHTMLCSSReact JSبیشتر
1// برنامه‌نویسی به فارسی
2import { learn } from 'codoloper'
3
4const developer = learn({
5"lang": "فارسی"
6"level": "همه سطوح"
7free: true
8})
بلاگ

مطالب جدید

تازه‌ترین مطالب آموزشی و خبرهای مرتبط.

Claude Opus 5 اومد؛ آنتروپیک این بار روی قیمت شرط بسته نه فقط روی هوش نوشته شده توسط عرفان دهقانی

Claude Opus 5 اومد؛ آنتروپیک این بار روی قیمت شرط بسته نه فقط روی هوش

امروز، جمعه ۲ مرداد (۲۴ ژوئیه ۲۰۲۶)، آنتروپیک رسماً Claude Opus 5 رو معرفی کرد. این چهارمین مدلیه که آنتروپیک توی کمتر از دو ماه منتشر میکنه — بعد از Mythos 5، Fable 5، و Sonnet 5 که همه توی ژوئن اومده بودن. ولی نکته‌ای که Opus 5 رو از بقیه متمایز میکنه اینه که آنتروپیک این بار داستان رو حول محور «هوش خام» نچیده؛ حول محور اقتصاد مصرف روزانه چیده.

پیام اصلی: نزدیک به Fable 5، با نصف قیمت

آنتروپیک خودش Opus 5 رو این‌طور توصیف کرده: مدلی متفکر و proactive که به هوش Fable 5 —قوی‌ترین مدل فعلی آنتروپیک— نزدیک میشه، اون‌هم با نصف هزینه. این جمله رو باید دقیق خوند: آنتروپیک ادعا نکرده Opus 5 از Fable 5 جلو زده. Fable همچنان مدل مرجع برای پروژه‌های سنگین و کارهایی که قراره روزها بدون دخالت انسان به‌صورت خودکار ادامه پیدا کنن باقی می‌مونه. Opus 5 برای یک رده‌ی متفاوت ساخته شده: کارهای روزمره‌ای که حجمشون بالاست ولی نیازی به سقف مطلق هوش ندارن.

قیمت هم دقیقاً همینو نشون میده: $5 روی هر میلیون توکن ورودی و $25 روی خروجی، یعنی دقیقاً همون قیمت Opus 4.8. آنتروپیک مدل قوی‌تری داده بدون این‌که قیمت رو تغییر بده، به‌جای این‌که مثل قبل با هر نسخه‌ی جدید قیمت رو ببره بالا.

چرا این تغییر مسیر مهمه

طبق گزارش‌های چند رسانه از جمله Fortune، این جابه‌جایی به یک نگرانی واقعی توی بازار برمیگرده: مشتری‌های سازمانی این چند ماه از هزینه‌ی بالای مدل‌های frontier، مخصوصاً Fable 5، گله داشتن. Fable روی بعضی کارها burn rate بالایی داشت، یعنی برای رسیدن به یک جواب توکن زیادی مصرف میکرد، و همین باعث میشد بودجه‌ی تخصیص‌داده‌شده زودتر از موعد تموم بشه. Opus 5 دقیقاً جواب همین مشکله.

برای همین آنتروپیک روی Opus 5 یک قابلیت effort گذاشته: تنظیمی که بهت اجازه میده بین سرعت/هزینه و عمق استدلال مدل جابه‌جا بشی. اگه کار ساده و تکراریه، effort رو پایین میاری و توکن کمتری خرج میشه؛ اگه کار پیچیده‌ست، effort رو بالا میبری. این دقیقاً همون فلسفه‌ای‌یه که این چند وقت پشت Gemini 3.6 Flash هم دیدیم: به‌جای این‌که مدل رو یک بلوک یکپارچه در نظر بگیری، هزینه رو بر اساس واقعی‌بودن نیاز تنظیم میکنی.

جایگاه Opus 5 توی خانواده‌ی Claude

Opus 5 حالا مدل پیش‌فرض روی Claude Max شده و قوی‌ترین مدل در دسترس روی Claude Pro. یعنی برای اکثر کاربرهای پولی، این مدلیه که پیش‌فرض باهاش کار میکنن، نه Fable 5. آنتروپیک گفته Opus 5 نسبت به نسل قبل با رفت‌وبرگشت کمتری کار رو تموم میکنه — کار خودش رو راستی‌آزمایی میکنه و بدون دخالت اضافه از خطا برمیگرده، که برای کسی که داره روی workflow های agentic کار میکنه (دقیقاً مثل چیزی که ما با Hermes Agent دنبالش هستیم) نکته‌ی قابل توجهیه.

دو تغییر جانبی که کمتر دیده شد

همراه با Opus 5، آنتروپیک دو تغییر دیگه هم روی پلتفرمش اعمال کرده که شاید برای دولوپرها حتی مهم‌تر از خود مدل باشه:

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

دوم، قابلیت fallback خودکار روی API. اگه یک درخواست توسط کلاسیفایرهای ایمنی روی Opus 5 یا Fable 5 پرچم بخوره، به‌جای این‌که درخواست رد بشه، میتونی تنظیم کنی که به‌صورت خودکار به بهترین مدل جایگزین در دسترس هدایت بشه. این یعنی کمتر پیش میاد یک اپلیکیشن production به‌خاطر یک ریجکشن مقطعی از کار بیفته.

زمینه‌ی رقابتی

این عرضه توی بحبوحه‌ی یک رقابت شدید بین‌المللی اتفاق افتاده. طبق گزارش BigGo Finance، چند روز قبل از Opus 5، مدل Kimi K3 معرفی شده بود، و علی‌بابا هم Qwen 3.8 Max Preview رو با ۲.۴ تریلیون پارامتر رونمایی کرده. Z.AI هم از GLM 5.5 —با بیش از یک تریلیون پارامتر و context window یک میلیون توکنی— برای عرضه در آگوست خبر داده. نکته‌ی مهم این مدل‌های چینی اینه که اغلب به‌صورت open-weight منتشر میشن، یعنی هرکسی میتونه دانلودشون کنه و شخصی‌سازی کنه؛ چیزی که آنتروپیک و OpenAI معمولاً ازش پرهیز میکنن.

جمع‌بندی: باید سوییچ کنیم؟

اگه الان روی Opus 4.8 کار میکنی، مهاجرت به Opus 5 هزینه‌ی اضافه‌ای نداره چون قیمت‌گذاری عوض نشده، و طبق ادعای آنتروپیک کیفیت بالاتر رفته. اگه پروژه‌ای داری که واقعاً به سقف مطلق هوش نیاز داره —مثل کاری که قراره روزها بدون نظارت جلو بره— همچنان باید سراغ Fable 5 بری. ولی برای اکثر کارهای روزمره، از تولید محتوا گرفته تا کدنویسی و اتوماسیون، Opus 5 دقیقاً همون رده‌ایه که آنتروپیک میخواد بشه پیش‌فرض همه: قوی به اندازه‌ی کافی، ولی نه به قیمتی که مجبورت کنه هر درخواست رو دو بار فکر کنی.

گوگل به‌جای Pro، سه مدل دیگه داد؛ (3.5 - 3.6) و این شاید داستان جالب‌تری باشه نوشته شده توسط عرفان دهقانی

گوگل به‌جای Pro، سه مدل دیگه داد؛ (3.5 - 3.6) و این شاید داستان جالب‌تری باشه

چند وقتیه منتظر Gemini 3.5 Pro هستیم. گوگل توی رویداد I/O امسال قول داده بود این مدل رو «ماه بعد» عرضه کنه، ولی آن ماه گذشت، ماه بعدی هم گذشت، و به‌جاش این هفته سه مدل دیگه اومد که هیچ‌کدومشون Pro نبودن: Gemini 3.6 Flash، Gemini 3.5 Flash-Lite، و یک مدل عجیب به اسم Gemini 3.5 Flash Cyber. به نظرم خود همین انتخاب —این‌که گوگل ترجیح داده مدل‌های سبک‌تر رو زودتر بفرسته و flagship رو بذاره بپزه— داستانی به همون اندازه‌ی خود مدل‌ها جالبه.

چرا Pro دیر شده

طبق گزارش‌هایی که این چند هفته منتشر شده، Gemini 3.5 Pro توی تست‌های داخلی گوگل روی بنچمارک‌های کدنویسی اون‌طور که باید عمل نکرده و تیم مهندسی مجبور شده دوباره برگرده سراغ retraining. گوگل رسماً تأیید کرده که مدل الان دست چند پارتنر و چند نهاد دولتیه برای تست، ولی تاریخ دقیقی برای عرضه‌ی عمومی نداده. این یعنی حداقل فعلاً، اگه دنبال جایگزین GPT یا Claude توی رده‌ی سنگین‌وزن گوگل بودی، باید صبر کنی.

Gemini 3.6 Flash: جایگزین workhorse قبلی

این مدل قراره جانشین 3.5 Flash بشه، و نکته‌ای که واقعاً به چشم میاد کارایی تُکنه. گوگل میگه روی Artificial Analysis Index، این مدل تقریباً ۱۷ درصد کمتر از 3.5 Flash توکن خروجی مصرف می‌کنه، و برای کارهای چندمرحله‌ای هم تعداد reasoning step و tool call کمتری لازم داره. این برای کسی که داره agent میسازه خیلی مهمه، چون هزینه‌ی واقعی یک agent معمولاً از تعداد round-trip ها میاد، نه فقط از قیمت هر توکن.

قیمت‌گذاری هم جالبه: ورودی همون $1.50 روی هر میلیون توکن مونده، ولی خروجی از $9 به $7.50 اومده پایین. یعنی گوگل مدل جدید و به‌ظاهر قوی‌تر رو ارزون‌تر از قبلی عرضه کرده، که کار غیرمعمولیه — معمولاً نسخه‌ی جدید گرون‌تر میشه.

از نظر کدنویسی هم گوگل ادعا میکنه 3.6 Flash خطاهای کمتری توی edit کد تولید میکنه و execution loop کمتری داره، یعنی کمتر پیش میاد مدل بین چند راه‌حل اشتباه گیر کنه و دور بزنه. روی DeepSWE عدد ۴۹ درصد رو اعلام کرده که نسبت به نسخه‌ی قبلی جهش قابل توجهیه.

Gemini 3.5 Flash-Lite: برای حجم بالا

اگه پروژه‌ات نیاز به throughput بالا داره — مثلاً ترجمه‌ی حجم زیادی متن، یا پردازش batch اسناد — این مدل برای همین ساخته شده. قیمتش $0.30 روی ورودی و $2.50 روی خروجیه، یعنی از نسخه‌ی قبلی (3.1 Flash-Lite) کمی گرون‌تر شده، ولی گوگل میگه کیفیتش قابل مقایسه نیست. روی Terminal-Bench 2.1 عدد ۵۴ درصد در مقابل ۳۱ درصد نسخه‌ی قبلی گزارش شده که فاصله‌ی زیادیه. روی long-context هم (GDM-MRCR v2) از ۶۰ درصد به ۷۲ درصد رسیده.

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

Gemini 3.5 Flash Cyber: تخصصی و محدود

این یکی جالب‌ترین معرفیه، چون هدفش عمومی نیست. مدلی fine-tune شده روی پایه‌ی Flash، مخصوص پیدا کردن و patch کردن آسیب‌پذیری‌های امنیتی کد. فعلاً فقط در اختیار دولت‌ها و پارتنرهای منتخب گوگل قرار میگیره، نه توسعه‌دهنده‌ی عادی. این حرکت رو خیلی‌ها به رقابت گوگل با آنتروپیک در حوزه‌ی امنیت کد مرتبط میدونن، جایی که آنتروپیک با مدل‌های سری Mythos یک قدم جلوتر بوده.

چیزی که بین خط‌ها نوشته شده

گوگل همزمان با این عرضه گفته که pretraining نسل بعدی، یعنی Gemini 4، رو شروع کرده. یعنی درحالی که همه منتظر Pro هستن، تیم گوگل عملاً یک نسل جلوتر داره کار میکنه. این الگو رو قبلاً هم دیده بودیم — وقتی یک مدل میانی دیر میشه، شرکت‌ها به‌جای نگه داشتن کاربر توی خلأ، یک لایه‌ی سبک‌تر و ارزون‌تر رو زودتر میفرستن تا هم بازار رو نگه دارن هم فشار رقابتی رو کم کنن.

برای من به‌عنوان کسی که مدام بین مدل‌های مختلف API سوییچ میکنه، نکته‌ی عملی این خبر اینه: اگه الان روی 3.5 Flash کار میکنی، مهاجرت به 3.6 Flash احتمالاً بدون درد سره — قیمت پایین‌تره و بنچمارک‌ها بهتره. ولی اگه منتظر Pro بودی که یک جهش واقعی توی reasoning بدی، هنوز باید صبر کنی، و با توجه به سابقه‌ی این تأخیرها بعید نیست چند هفته‌ی دیگه هم طول بکشه.

لاراول ۱۳.۲۱ منتشر شد: ویژگی RouteKey، اعتبارسنجی Base64 و فرمت‌های تصویری بیشتر نوشته شده توسط عرفان دهقانی

لاراول ۱۳.۲۱ منتشر شد: ویژگی RouteKey، اعتبارسنجی Base64 و فرمت‌های تصویری بیشتر

لاراول ۱۳.۲۱ در تاریخ ۲ جولای ۲۰۲۶ منتشر شد و مجموعه‌ای از ویژگی‌های کاربردی را برای توسعه‌دهندگان به ارمغان آورده است. این نسخه شامل اتریبیوت‌های جدیدی برای ساده‌سازی کار با مدل‌ها و درخواست‌ها، قانون اعتبارسنجی base64 که مدت‌ها جای خالی آن احساس می‌شد، و پشتیبانی از فرمت‌های تصویری بیشتر در کامپوننت Image است.
در این مقاله، تمام ویژگی‌های جدید، بهبودها و اصلاحات این نسخه را به صورت کامل بررسی می‌کنیم.

اتریبیوت #[RouteKey] برای مدل‌های Eloquent

یکی از جذاب‌ترین ویژگی‌های این نسخه، اضافه شدن اتریبیوت #[RouteKey] است که کار با Route Model Binding را بسیار ساده‌تر می‌کند.

مشکل قدیمی، راه‌حل جدید

تا پیش از این، اگر می‌خواستید از ستون دیگری غیر از id برای Route Model Binding استفاده کنید، مجبور بودید متد getRouteKeyName() را در مدل خود بازنویسی کنید:
 
class Post extends Model
{
    public function getRouteKeyName()
    {
        return 'slug';
    }
}
اما در لاراول ۱۳.۲۱، می‌توانید از اتریبیوت #[RouteKey] استفاده کنید که بسیار تمیزتر و خواناتر است:
use Illuminate\Database\Eloquent\Attributes\RouteKey;

#[RouteKey('slug')]
class Post extends Model
{
    // ...
}
با این کار، وقتی در روت‌های خود از Post استفاده می‌کنید، لاراول به صورت خودکار بر اساس ستون slug جستجو می‌کند. اگر این اتریبیوت وجود نداشته باشد، لاراول به صورت پیش‌فرض از id استفاده می‌کند.
این ویژگی توسط @nimnaherath در PR #60841 اضافه شده است.

قانون اعتبارسنجی base64

بالاخره لاراول یک قانون اعتبارسنجی اختصاصی برای رشته‌های base64 اضافه کرد! این ویژگی مدت‌ها در لیست درخواست‌های توسعه‌دهندگان بود.

نحوه استفاده

 
$request->validate([
    'signature' => ['required', 'base64'],
]);

چرا این ویژگی مهم است؟

بسیاری از APIها و سرویس‌ها از base64 برای ارسال داده‌های باینری استفاده می‌کنند. تا پیش از این، توسعه‌دهندگان مجبور بودند از اعتبارسنجی‌های سفارشی یا پکیج‌های جانبی استفاده کنند. اما حالا لاراول به صورت داخلی این قابلیت را پشتیبانی می‌کند.
این قانون به صورت strict کار می‌کند:
  • رشته باید به درستی decode شود
  • پس از decode و encode مجدد، باید دقیقاً همان رشته اولیه تولید شود
  • این یعنی اشتباهات Padding یا کاراکترهای اضافی به راحتی شناسایی می‌شوند
این ویژگی توسط @lucasmichot در PR #60808 اضافه شده است.

اتریبیوت زمینه‌ای #[RequestAttribute]

این یکی از کاربردی‌ترین ویژگی‌های این نسخه برای کسانی است که با Middlewareهای سفارشی کار می‌کنند.

مشکل چیست؟

وقتی یک Middleware مقدارهایی را روی $request->attributes ذخیره می‌کند (مثلاً اطلاعات سازمان یا Tenant بر اساس API Key)، برای دسترسی به آن‌ها در کنترلر باید از روش‌های دستی استفاده کنید:
public function index(Request $request)
{
    $org = $request->attributes->get('org');
    // ...
}

راه‌حل جدید

با اتریبیوت #[RequestAttribute] می‌توانید این مقادیر را به صورت خودکار inject کنید:
use Illuminate\Container\Attributes\RequestAttribute;

class InventoryController
{
    public function index(
        #[RequestAttribute('org')] Organization $org
    ) {
        return $this->inventoryService->getForOrg($org);
    }
}
این ویژگی کد شما را تمیزتر می‌کند و از الگوی Dependency Injection به بهترین شکل استفاده می‌کند. این ویژگی توسط @cosmastech در PR #60847 اضافه شده است.

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

کامپوننت Image که در لاراول ۳.۲۰ معرفی شد، در این نسخه قابلیت‌های بیشتری پیدا کرده است.

چه چیزی اضافه شده؟

تا پیش از این، کامپوننت Image فقط می‌توانست خروجی WebP، JPG و JPEG تولید کند. اما حالا متدهای زیر اضافه شده‌اند:
  • toPng()
  • toGif()
  • toAvif()
  • toBmp()

مثال استفاده

use Illuminate\Support\Facades\Image;

Image::fromUpload($request->file('avatar'))
    ->cover(400, 400)
    ->toAvif()
    ->quality(80)
    ->store('avatars');

اصلاح باگ مهم

این نسخه همچنین باگ Image::extension() را برطرف کرده است که قبلاً نگاشت MIME type برای image/avif را نداشت و برای فایل‌های AVIF پسوند .bin تولید می‌کرد!
این ویژگی توسط @Tresor-Kasenda در PR #60713 اضافه شده است.

Application Builder قابل شخصی‌سازی

این یک بهبود فنی برای توسعه‌دهندگان پکیج است.

چه تغییری ایجاد شده؟

قبلاً متد Application::configure() کلاس ApplicationBuilder را به صورت hardcode شده استفاده می‌کرد. این یعنی اگر پکیجی می‌خواست Application لاراول را extend کند، مجبور بود کل متد را بازنویسی کند.
حالا یک protected static property به نام $applicationBuilder اضافه شده که به subclassها اجازه می‌دهد کلاس Builder سفارشی خود را ارائه دهند بدون اینکه نیاز باشد کل API را تغییر دهند.
این بهبود در PR #60848 اضافه شده است.

Subsplit کامپوننت Concurrency

کامپوننت Illuminate\Concurrency حالا به صورت یک subsplit جداگانه منتشر می‌شود. این یعنی توسعه‌دهندگان می‌توانند این کامپوننت را به صورت یک پکیج مستقل (read-only) دریافت کنند، مشابه سایر کامپوننت‌های Illuminate.
این تغییر در PR #60836 انجام شده است.

سایر اصلاحات و بهبودها

این نسخه شامل تعداد زیادی اصلاح باگ و بهبودهای کوچک است که در ادامه بررسی می‌کنیم:

پایگاه داده

  • Callbackهای Rollback: callbackهای تراکنش‌های دیتابیس حالا به درستی فراخوانی می‌شوند (PR #60777)
  • Lost Connection: یک پیام خطای جدید برای از دست دادن اتصال شناسایی شده که امکان reconnect خودکار را فراهم می‌کند (PR #60819)
  • Question Marks: علامت سوال در Grammar::whereColumn() به درستی escape می‌شود (PR #60832)

لاگ و کش

  • LogManager: ارسال enum به LogManager::forgetChannel() دیگر TypeError نمی‌دهد (PR #60801)
  • RedisTaggedCache: متد decrement() حالا enum keys را به درستی مدیریت می‌کند (PR #60821)

رشته‌ها و Utilityها

  • Str::wordWrap(): حالا رشته‌های multibyte را به درستی مدیریت می‌کند (PR #60814)

اتریبیوت‌ها و Dependency Injection

  • Contextual Attribute Caching: کش کردن اتریبیوت‌های زمینه‌ای دیگر بین propertyهای یک کلاس تداخل ایجاد نمی‌کند (PR #60815)
  • Concurrency Exception: پارامترهای falsey در exceptionهای concurrency حفظ می‌شوند (PR #60822)

دستورات و Pipeline

  • Serve Command: پارس کردن پورت host در دستور serve اصلاح شده است (PR #60828)
  • Pipeline Hub: یک undefined index در Pipeline\Hub::pipe() برطرف شده است (PR #60802)

Jobها و Queue

  • InvalidPayloadException: پیام‌های این exception حالا نام job و queue را شامل می‌شوند که دیباگ را آسان‌تر می‌کند (PR #60799)

مقایسه با نسخه‌های قبلی

لاراول ۱۳.۲۱ ادامه مسیر بهبود تجربه توسعه‌دهنده است. اگر به نسخه ۱۳.۲۰ نگاه کنیم، می‌بینیم که تیم لاراول بر روی:
  • Developer Experience: اتریبیوت‌های جدید مثل #[RouteKey] و #[RequestAttribute] کد را خواناتر و نگهداری آن را آسان‌تر می‌کنند
  • Validation: اضافه شدن قانون base64 نشان می‌دهد که لاراول به نیازهای واقعی توسعه‌دهندگان گوش می‌دهد
  • Image Processing: پشتیبانی از فرمت‌های مدرن مثل AVIF نشان‌دهنده به‌روز بودن لاراول با استانداردهای وب است

مزایا و معایب به‌روزرسانی

مزایا:
  • کاهش کد boilerplate با اتریبیوت‌های جدید
  • اعتبارسنجی دقیق‌تر با قانون base64
  • انعطاف‌پذیری بیشتر در پردازش تصاویر
  • دیباگ آسان‌تر با پیام‌های خطای بهتر
ملاحظات:
  • این یک نسخه مینور است و تغییرات breaking change ندارد
  • برای استفاده از ویژگی‌های جدید، باید PHP 8.1 یا بالاتر داشته باشید (به دلیل استفاده از Attributes)

جمع‌بندی نهایی و نگاه شخصی

به عنوان یک توسعه‌دهنده لاراول، باید بگویم که نسخه ۱۳.۲۱ یکی از آن نسخه‌هایی است که واقعاً حس می‌کنید تیم لاراول به دقت به نیازهای روزمره ما گوش می‌دهد.
اتریبیوت #[RouteKey] چیزی است که سال‌ها منتظرش بودیم - بالاخره نیازی نیست برای یک تنظیم ساده، یک متد کامل را override کنیم. قانون base64 هم دقیقاً همان چیزی است که در پروژه‌های واقعی به آن نیاز داریم.
اما چیزی که من را بیشتر تحت تأثیر قرار داد، اصلاح باگ Image::extension() برای AVIF است. این نشان می‌دهد تیم لاراول نه تنها ویژگی‌های جدید اضافه می‌کند، بلکه به جزئیات و باگ‌های کوچک هم توجه می‌کند.
صادقانه بگویم، اگر از لاراول ۱۳ استفاده می‌کنید، این به‌روزرسانی را حتماً انجام دهید. هیچ ریسکی ندارد (چون breaking change نیست) و ویژگی‌های جدید آن واقعاً کار شما را آسان‌تر می‌کنند.

سوالات متداول

آیا این نسخه breaking change دارد؟
خیر، لاراول ۱۳.۲۱ یک نسخه مینور است و تمام ویژگی‌های جدید آن backward compatible هستند. می‌توانید بدون نگرانی به‌روزرسانی کنید.
آیا برای استفاده از اتریبیوت‌های جدید نیاز به PHP 8 دارم؟
بله، اتریبیوت‌های کلاس (Class Attributes) در PHP 8.0 معرفی شدند. برای استفاده از #[RouteKey] و #[RequestAttribute] باید حداقل PHP 8.0 داشته باشید.
آیا کامپوننت Image جایگزین Intervention Image شده است؟
خیر، کامپوننت Image لاراول در واقع یک wrapper حول Intervention Image است که API ساده‌تر و یکپارچه‌تری ارائه می‌دهد. شما همچنان می‌توانید مستقیماً از Intervention Image هم استفاده کنید.
چگونه به نسخه ۱۳.۲۱ به‌روزرسانی کنم؟
کافی است در فایل composer.json نسخه لاراول را به ^13.21 تغییر دهید و سپس دستور composer update را اجرا کنید.
راز پشت پرده یوتیوب: چگونه میلیاردها ساعت ویدیو را ذخیره و مدیریت می‌کند؟ نوشته شده توسط عرفان دهقانی

راز پشت پرده یوتیوب: چگونه میلیاردها ساعت ویدیو را ذخیره و مدیریت می‌کند؟

تا به حال فکر کرده‌اید وقتی یک ویدیوی ۴K ده دقیقه‌ای را در یوتیوب آپلود می‌کنید، دقیقاً چه بلایی سر آن می‌آید؟ یوتیوب فقط یک وب‌سایت اشتراک ویدیو نیست؛ بلکه یکی از پیچیده‌ترین و عظیم‌ترین سیستم‌های مهندسی نرم‌افزار و سخت‌افزار در تاریخ بشر است.
 
هر دقیقه بیش از ۵۰۰ ساعت ویدیو در این پلتفرم آپلود می‌شود. اما چگونه این غول فناوری بدون از دست رفتن داده‌ها یا کندی شدید، این حجم عظیم را مدیریت می‌کند و همزمان ویدیو را با کیفیت‌های مختلف (از ۱۴۴p تا ۴K) به شما نمایش می‌دهد؟ در این مقاله، پشت پرده این جادوی مهندسی را به زبان ساده اما فنی بررسی می‌کنیم.
 

حجم داده‌ها: صحبت از ترابایت نیست، صحبت از اگزابایت است

برای درک مقیاس یوتیوب، باید با واحدهای اندازه‌گیری فراتر از گیگابایت و ترابایت آشنا شویم. یوتیوب داده‌های خود را در مقیاس «اگزابایت» (هر اگزابایت برابر با یک میلیارد گیگابایت) مدیریت می‌کند. ذخیره چنین حجمی روی هارد دیسک‌های معمولی در یک اتاق سرور غیرممکن است. راه‌حل، استفاده از معماری توزیع‌شده است.
 

راز اول: سیستم فایل توزیع‌شده (Google Colossus)

یوتیوب ویدیوهای شما را روی یک سرور خاص ذخیره نمی‌کند. گوگل از سیستم فایل توزیع‌شده اختصاصی خود به نام Colossus (جانشین سیستم معروف GFS) استفاده می‌کند.
 
وقتی ویدیویی آپلود می‌شود، این سیستم آن را به بلوک‌های کوچک‌تری به نام «شِرد» (Shard) تقسیم می‌کند. این بلوک‌ها سپس در هزاران سرور مختلف در دیتاسنترهای گوناگون پخش می‌شوند. علاوه بر این، از هر بلوک حداقل سه نسخه (Replica) در مکان‌های فیزیکی متفاوت ساخته می‌شود. اگر یکی از سرورها آتش بگیرد یا هارد دیسک آن از کار بیفتد، دو نسخه دیگر بلافاصله جایگزین آن می‌شوند و کاربر هیچ‌گاه متوجه خرابی نمی‌شود.
 

راز دوم: جادوی فشرده‌سازی و کدک‌های ویدیویی

چگونه یوتیوب این حجم عظیم را در خود جای می‌دهد؟ پاسخ در «فشرده‌سازی» نهفته است. ویدیوی خام آپلود شده توسط شما، حجمی وحشتناک دارد. یوتیوب بلافاصله پس از دریافت، آن را با استفاده از الگوریتم‌های پیچیده ریاضی فشرده می‌کند.
 
یوتیوب از چندین «کدک» (Codec) استفاده می‌کند:
  • H.264: قدیمی‌تر اما با سازگاری بالا برای دستگاه‌های قدیمی.
  • VP9: کدک متن‌باز توسعه‌یافته توسط گوگل که فشرده‌سازی بهتری نسبت به H.264 دارد.
  • AV1: جدیدترین و کارآمدترین کدک. AV1 می‌تواند حجم ویدیو را تا ۳۰ درصد بیشتر از VP9 بدون افت کیفیت محسوس کاهش دهد. این یعنی صرفه‌جویی عظیم در پهنای باند و فضای ذخیره‌سازی.
 

راز سوم: چگونه همه کیفیت‌ها را همزمان دارد؟ (Transcoding و ABR)

این بخش جذاب‌ترین قسمت ماجراست. وقتی شما ویدیویی را با کیفیت ۱۰۸۰p آپلود می‌کنید، یوتیوب آن را به عنوان یک فایل واحد نگه نمی‌دارد.
 
۱. ترنس‌کدینگ (Transcoding): مزارع سروری یوتیوب (که اغلب از سخت‌افزارهای تخصصی رمزنگاری ویدیو استفاده می‌کنند)، ویدیوی اصلی را می‌گیرند و آن را به چندین نسخه با رزولوشن‌های مختلف (۱۴۴p, 240p, 360p, 480p, 720p, 1080p, 1440p, 2160p) تبدیل می‌کنند.
 
۲. قطعه‌قطعه کردن (Chunking): هر کدام از این نسخه‌های کیفیت، به تکه‌های بسیار کوچکی به مدت ۲ تا ۱۰ ثانیه تقسیم می‌شوند.
 
۳. استریم تطبیقی (Adaptive Bitrate Streaming - ABR): یوتیوب از پروتکلی به نام DASH استفاده می‌کند. پلیر یوتیوب در مرورگر یا اپلیکیشن شما، به طور مداوم سرعت اینترنتتان را رصد می‌کند. اگر اینترنت شما قوی باشد، تکه‌های ۱۰۸۰p را درخواست می‌کند. اگر اینترنت ضعیف شود، بدون اینکه ویدیو متوقف (Buffer) شود، به طور نامحسوس تکه‌های بعدی را با کیفیت ۴۸۰p درخواست می‌کند. این تغییر کیفیت همان چیزی است که گاهی در حین تماشای ویدیو آن را حس می‌کنید.
 

راز چهارم: نقش حیاتی CDN در تحویل سریع

حتی با فشرده‌سازی و قطعه‌قطعه کردن، اگر سرور یوتیوب در آمریکا باشد و شما در ایران باشید، تاخیر شبکه (Latency) باعث کندی می‌شود. اینجا شبکه توزیع محتوا (CDN) وارد عمل می‌شود.
 
گوگل یکی از بزرگ‌ترین CDNهای جهان را با نام Google Global Cache اداره می‌کند. آن‌ها سرورهایی را در داخل دیتاسنترهای شرکت‌های ارائه‌دهنده اینترنت (ISP) در سراسر جهان قرار می‌دهند. وقتی شما ویدیویی را تماشا می‌کنید، به احتمال زیاد آن تکه‌های چند ثانیه‌ای را از سروری دریافت می‌کنید که از نظر فیزیکی فقط چند کیلومتر با شما فاصله دارد، نه چند هزار کیلومتر.
 

مقایسه یوتیوب با هاستینگ ویدیوی سنتی

در یک هاستینگ ویدیوی سنتی، معمولاً یک فایل واحد (مثلاً MP4) روی یک سرور ذخیره می‌شود. اگر اینترنت کاربر نوسان کند، ویدیو متوقف می‌شود تا بافر پر شود. کاربر نمی‌تواند کیفیت را به صورت پویا تغییر دهد و فشار زیادی به سرور اصلی وارد می‌شود.
 
در مقابل، معماری یوتیوب بر پایه توزیع، افزونگی (Redundancy) و تطبیق‌پذیری بنا شده است. این سیستم نه تنها تجربه کاربری را بدون وقفه نگه می‌دارد، بلکه بار ترافیکی را به بهینه‌ترین شکل ممکن بین هزاران سرور تقسیم می‌کند.
 

مزایا و چالش‌های این معماری عظیم

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

جمع‌بندی نهایی و نگاه شخصی

به عنوان یک مهندس نرم‌افزار، هر بار که به معماری یوتیوب فکر می‌کنم، حس احترام عمیقی پیدا می‌کنم. این سیستم «جادو» نیست؛ نتیجه دهه‌ها تحقیق، شکست، و سرمایه‌گذاری عظیم روی الگوریتم‌های فشرده‌سازی و سیستم‌های توزیع‌شده است.
 
باید صادقانه بگویم که بسیاری از استارتاپ‌ها سعی کرده‌اند رقیب یوتیوب شوند، اما شکست خورده‌اند. دلیل شکست آن‌ها تکنولوژی نبود، بلکه ناتوانی در مدیریت هزینه‌های سرسام‌آور ذخیره‌سازی و پهنای باند در این مقیاس بود. یوتیوب نه تنها یک پلتفرم محتوا، بلکه یک شاهکار مهندسی داده است که مرزهای ممکن را جابه‌جا کرده است.
 

سوالات متداول

چرا گاهی اوقات کیفیت ویدیو در یوتیوب خود به خود پایین می‌آید؟ این یک ویژگی است، نه باگ. پروتکل ABR (استریم تطبیقی) تشخیص می‌دهد که سرعت اینترنت شما لحظه‌ای کاهش یافته است. برای جلوگیری از توقف ویدیو (Buffering)، پلیر به طور خودکار تکه‌های بعدی ویدیو را با کیفیت پایین‌تر درخواست می‌کند تا پخش روان باقی بماند.
 
آیا یوتیوب ویدیوهای قدیمی و کم‌بازدید را پاک می‌کند تا فضا آزاد شود؟ خیر. هزینه ذخیره‌سازی داده در مقیاس گوگل نسبت به ارزش نگه‌داری آن داده ناچیز است. با این حال، یوتیوب از سیستم‌های «ذخیره‌سازی سرد» (Cold Storage) استفاده می‌کند. ویدیوهای قدیمی که به ندرت تماشا می‌شوند، به هارد دیسک‌های کندتر اما بسیار ارزان‌تر منتقل می‌شوند و فقط در صورت درخواست کاربر، با کمی تاخیر اولیه در دسترس قرار می‌گیرند.
 
تفاوت اصلی کدک AV1 با نسل‌های قبلی چیست؟ AV1 توسط اتحادیه‌ای باز (شامل گوگل، نتفلیکس، آمازون و دیگران) توسعه یافته تا از پرداخت حق امتیاز (Royalty) معاف باشد. مهم‌تر از آن، الگوریتم فشرده‌سازی آن بسیار هوشمندتر است و می‌تواند ویدیوهایی با کیفیت مشابه را با حجمی حدود ۳۰ درصد کمتر از VP9 یا H.265 ارائه دهد که برای پخش ویدیو در موبایل و اینترنت‌های ضعیف‌تر انقلابی است.