Dev Perfects
40 subscribers
9.23K photos
1.26K videos
468 files
13K links
بخوام خیلی خلاصه بگم
این کانال میاد مطالب کانالای خفن تو حوزه تکنولوژی و برنامه نویسی رو جمع میکنه

پست پین رو بخونید
https://t.iss.one/dev_perfects/455


ارتباط:
https://t.iss.one/HidenChat_Bot?start=936082426
Download Telegram
چطور یک ریمستر از دبیان بسازیم؟ 🫤

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

اول از همه اینکه شما باید تغییراتی که میخواین رو اعمال کنید توی دبین، تغییر تم و غیره
توجه کنید که تم ها باید توی root نصب شده باشن:

/usr/share/icons
/usr/share/themes

بعد از دادن تغییرات و اعمال کردنشون، پوشه های
~/.config
و
~/.local
رو به
/etc/skel
ببرید.

برنامه penguin eggs رو.نصب کنید و طبق دستور العمل گیتهابش مراحل رو طی کنید.

بعد از اتمام کار شما یک iso دارید که کانفیگ ها و تغییرات و برنامه هایی که نصب کردید توش باقی مونده.


تذکر: این روش اسمش ریمستر کردنه، صرفا ساخت یک توزیع جدید نیست چون بیس همون بیس قدیمه.


پ.ن: میخواستم یک فیلم هم از مراحلش بسازم ولی سیستمم ترکید متاسفانه.


@SohrabContents
Forwarded from Dev (♪ Ayhan)
Forwarded from Gopher Academy
🔵 عنوان مقاله
Streamline Your Product Delivery with monday dev

🟢 خلاصه مقاله:
مقاله‌ای که ارائه شده به بررسی ابزاری به نام "monday dev" می‌پردازد که فرآیند تولید و عرضه محصولات را تسریع بخشیده و ساده‌سازی می‌کند. این ابزار تمام مراحل مختلف توسعه محصول، از مرحله ایده‌پردازی تا عرضه نهایی، را در یک پلتفرم یکپارچه ارائه می‌دهد. استفاده از "monday dev" به تیم‌ها این امکان را می‌دهد که به طور موثرتر و هماهنگ‌تری کار کنند، به این ترتیب از پراکندگی منابع و زمان در جریان توسعه محصول جلوگیری می‌کند. این پلتفرم با ارائه امکانات و ابزارهای جامع، روند ایده‌پردازی تا تحویل محصول را بهینه‌سازی کرده و بدین ترتیب می‌تواند به تسریع در عرضه محصول کمک کند، در حالی که همزمان اطمینان حاصل می‌شود که تمامی جوانب مورد نیاز در نظر گرفته شده‌اند.

🟣لینک مقاله:
https://golangweekly.com/link/159869/web


👑 @gopher_academy
Forwarded from Code Module | کد ماژول (𔓙)
تکنیک های بیشتری برای نوشتن یک رزومه خوب یاد بگیر 👾

توی این پست یه ریپازیتوری خوب بهتون معرفی میکنم که تکنیک های رزومه نویسی، که میتونه در ساخت یه رزومه خوب و استاندارد به شما کمک کنه، شرح داده.

🔗 Link

#resume
@CodeModule
‏در میان کلی خبر مثل انفجار پیجرها، باجگیری از بانک‌های ایران، CTF دزدی شاپرک و غیره، هک شدن Dr.Web هم رخ داده و اینقدر وضعیت بد بوده که مجبور شدن اتصال تمامی سرورها به اینترنت را قطع کنند!
تعداد 400 سرور کامل هک شدند و 390G داده به سرقت رفته است!
https://www.bleepingcomputer.com/news/security/russian-security-firm-drweb-disconnects-all-servers-after-breach/

@DevTwitter | <Vahid Nameni/>
Forwarded from Geniuses Group (Omid Hekayati)
🔗 با همفکری و همراهی چند تن از دوستان سومین دوره جلسات کتاب خوانی و نقد و بررسی آن را ترتیب دادیم.
جلسات بدلیل فیلتر شدن نرم افزار دیسکورد در ایران، در گوگل میت برگزار میشه. در کامنت های همین پست، جزییات شرکت در جلسات و صوت ضبط شده جلسات را قرار میدیم.

🤝 در این سری جلسات کتاب Designing Data-Intensive Applications (THE BIG IDEAS BEHIND RELIABLE, SCALABLE, AND MAINTAINABLE SYSTEMS) از نشر o'reilly را بررسی خواهیم کرد. آرشام در این پست بیشتر در مورد این کتاب توضیح داده.

🧠 در جلسات قصد هست همانطور که کتاب هم تاکید داره تبیین درستی از کلمه Data در حوزه #توسعه #نرم_افزار برای خودمون ایجاد کنیم. هر چند همین ابتدا تاکید می کنیم، این کلمه Data محدود به حوزه توسعه نرم افزار قطعا نیست.

در انتها یک جلمه از هم پیش گفتار کتاب اینجا بیاریم و یادآوری کنیم که یکی از اهداف از سلسه جلسات قبل یعنی بررسی #فلسفه_علم دقیقا فهم چرایی جمله زیر هست که در اونجا با #یادگیری و جداسازی #علم از #ابزار می تونیم با درک عمیق پرسش ها، #تصمیم_سازی های با کیفیت تری داشته باشه.
Software keeps changing, but the fundamental principles remain the same.
Forwarded from LinFAQ (Reza)
#روزی_یک_نکته با دلاتو

دسته‌بندی: #آموزشی #کاربردی
#fzf #bash

خب بریم 5 تا فانکشن bash ردیف شده با fzf که به کار میاد ببینیم

این بخش رو به bashrc اضافه کنید تا با Ctrl r بتونید هیستوری بش رو ببینید یا...:
eval "$(fzf --bash)"

لیست فایل ها (از جمله فایل های پنهان به جز فایل های داخل .git)
function ff() {
    vim "$(fd --type f --hidden --exclude .git | fzf --preview 'cat {}' --select-1 --exit-0)"
}

ترکیب cd و fzf(از جمله دایرکتوری های پنهان به جز .git):
function fcd() {
    cd "$(fd --type d --hidden --exclude .git | fzf --preview 'ls -la {}' --select-1 --exit-0)" || exit
}

لیست فایل ها و باز کردنشون با fzf:
open() {
    xdg-open "$(fd --type f | fzf)"
}

دستورات جهت حذف و نصب پکیج ها:
( البته در pacman )


install() {
    pacman -Slq | fzf --multi --preview 'pacman -Si {1}' | xargs -ro sudo pacman -S
}

uninstall() {
    pacman -Qq | fzf --multi --preview 'pacman -Qi {1}' | xargs -ro sudo pacman -Rns
}

Source


@LinAcademy | @LinFAQ
Forwarded from Gopher Academy
🔵 عنوان مقاله
Tokens for LLMs: Byte Pair Encoding in Go

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

🟣لینک مقاله:
https://eli.thegreenplace.net/2024/tokens-for-llms-byte-pair-encoding-in-go/


👑 @gopher_academy
Forwarded from Linuxor ?
چطور بدون سابقه کاری، رزومه‌ای قوی بسازیم؟

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

راحت ترین چیزی که میمونه گرفتن مدرک ها و سرتیفیکیت هاست، این ریپو اومده یه لیستی از کورس ها و سرتیفیکیت های رایگان که اتفاقا معتبر هم هستن رو جمع آوری کرده

https://github.com/cloudcommunity/Free-Certifications

مثلا بجای اینکه ساده بنویسید Network بلدم بنویسید فلان سرتیفیکیت Network رو از huawei دارم، خیلی خیلی توی رزومتون بولد تر دیده میشه.


🐧 @Linuxor
Forwarded from Python BackendHub (Mani)
یک پست خیلییی خوب دیدم تو لینکدین حیفم اومد باهاتون به اشتراک نذارم!

لینک پست


تو پست بعدی ترجمه شدشو با chatgpt میذارم
@PyBackendHub
Forwarded from Python BackendHub (Mani)
مدیرها، بی‌خیال تیم‌هاتون بشید! لازم نیست کارمندها رو مثل بچه‌هایی که نیاز به مراقبت دائم دارن، کنترل کنید.

اونا نباید برای داشتن زندگی شخصی بیرون از کار معذرت‌خواهی کنن.
به تیم‌تون اعتماد کنید که کار رو تحویل بدن. اینجوری یه محیط مثبت و مولد می‌سازید که همه می‌تونن توش رشد کنن.
استخدام افراد درست فقط شروع کاره. جادوی واقعی زمانی اتفاق می‌افته که بهشون اعتماد کنید و قدرت بدید.
اعتماد یعنی اینکه به تیم‌تون آزادی بدید که کارشون رو بدون دخالت مستقیم شما مدیریت کنن. این نشون می‌ده که بهشون به‌عنوان آدم‌های بالغی که می‌تونن هم زندگی کاری و هم زندگی شخصی‌شون رو مدیریت کنن، احترام می‌ذارید.
این فقط محدود به مرخصی و تعطیلات نیست.
بحث اینه که یه فرهنگ بسازید که آدم‌ها توش احساس کنن می‌تونن کارشون رو به بهترین شکل ممکن انجام بدن - چه توی دفتر باشن، چه از راه دور کار کنن، یا حتی وسط روز کارهای شخصی‌شون رو انجام بدن.
تمرکز باید روی نتیجه باشه، نه “micromanagement”.
Micromanagement خلاقیت رو می‌کشه و انگیزه رو نابود می‌کنه.
اعتماد، برعکس، آدم‌ها رو به بهترین عملکردشون تشویق می‌کنه.
وقتی به تیم‌تون مالکیت کارهاشون رو می‌دید و بهشون فضا می‌دید که موفق بشن، می‌بینید که چطور رشد می‌کنن.

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

- ارتباطات رو باز نگه دارید: فضایی ایجاد کنید که آدم‌ها احساس امنیت کنن و بتونن ایده‌ها و فیدبک‌هاشون رو راحت به اشتراک بذارن.
- موفقیت‌ها رو جشن بگیرید: دستاوردها رو بشناسید و انگیزه رو بالا نگه دارید.
- از تعادل بین کار و زندگی حمایت کنید: به تعادل سالم تشویق کنید تا رفاه و بهره‌وری بهتر بشه.
♻️ Neha K Puri

@PyBackendHub
گنوم ۴۷ وارد مخازن آرچ شد.

ارتقا با
sudo pacman -Syyu



@ParchLinux
دلایل ایجاد overflow در صفحات html

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

1️⃣ استفاده از واحدهای ثابت مانند px برای عرض

اگر از واحدهای ثابت مثل px برای عرض یک عنصر استفاده کنید و این عرض بیشتر از اندازه ویوپورت باشد، اسکرول ایجاد می‌شود.

راه حل ها :
● ریسپانسیو کردن المنت ها و جلوگیری از بروز این مشکل در سایز های کوچک تر.

● استفاده از واحدهای نسبی مثل % یا vw این.

.element {
  width: 100vw;
}


2️⃣ عدم تنظیم صحیح box-sizing

به صورت پیش‌فرض، ویژگی padding و border به عرض یک عنصر اضافه می‌شوند، که ممکن است باعث شود عرض کلی عنصر از مقدار مورد انتظار بیشتر شود و اسکرول ایجاد کند و راه حل برطرف کردنش استفاده از box-sizing: border-box هستش.

راه حل :
* { box-sizing: border-box; }

استفاده از box-sizing: border-box باعث می‌شود padding و border داخل عرض اصلی محاسبه شوند.


3️⃣ استفاده از position: absolute یا position: fixed

اگر عنصری با استفاده از position: absolute یا position: fixed از ویوپورت خارج شود، می‌تواند اسکرول افقی ایجاد کند.

مثال :
.out-of-bounds { position: absolute; left: 2000px; } 


4️⃣ عدم مدیریت صحیح کلمات بلند یا لینک‌ها

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

راه حل :
استفاده ویژگی‌های word-break و overflow-wrap باعث میشه تا مرورگر در صورت برخورد با کلمات بلند، اونها رو به صورت خودکار شکسته و در خطوط جدید قرار دهد.

.long-text {
word-break: break-all;
overflow-wrap: break-word;
}


راه‌حل جامع

برای جلوگیری از اسکرول افقی در کل صفحه می‌تونید از ویژگی overflow-x: hidden استفاده کنید، اگر نیازی به اسکرول افقی ندارید.

نحوه استفاده :
body { overflow-x: hidden; }

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


💎 توی این مطلب سعی کردم تمامی مواردی که میتونن باعث اسکرول افقی در صفحه بشن رو بهتون توضیح بدم

اگر براتون کاربردی و مفید بود حمایت یادتون نره، برای رفقاتونم بفرستید تا استفاده کنن 🔥❤️


#️⃣ #overflow #css #webpage

🚀 @coolycode
کمپایل کدهای C در آپدیت اخیر Bun
از الان پکیج فروش های جاوااسکریپت میتونن ادعا کنن میشه با جی اس، سیستم عامل نوشت :)
https://bun.sh/blog/compile-and-run-c-in-js

@DevTwitter | <hadi mirzaei/>
این بار برای تست مدل یک سری تغییرات دادم :
همونطور که قبلتر هم اشاره کردم Qwen2 جزو مدل‌هایی هست که من همیشه ازش استفاده می‌کنم؛ مخصوصا روی سیستم خودم و کنار مدل‌های دیگه‌ای که دارم (multi-model)

اینبار این مدل رو با qwen2 مقایسه کردم؛ اول روی تسک‌های عادی از چندساعت قبل داشتم روی یک سورس کد Rust کار می‌کردم؛ البته بیشتر برای یادگیری داشتم میخوندم و این ۲ مدل رو با chatgpt مقایسه کردم؛ به همه مدل‌ها دسترسی به اینترنت دادم برای سرچ زدن و البته برای مدل‌های لوکل از duckduckgo استفاده میکردم.

نکته دوم context-length مدل رو روی همون 8K نگه داشتم.

توی این موارد که بیشتر سرچ و توضیح بخش از کد بود و با توجه به اینکه روی Rust هم آموزش دیده خیلی راحت جواب میداد؛ qwen2 جاهایی رو اشتباه میزد مخصوصا وقتی مثال نزدیک بهش توی داکیومنت یا سرچ پیدا نمیکرد. اما نسخه 2.5 موردی نبود که نشه جواب بده خیلی جالب بود که وقتی مثال خوبی هم پیدا نمیکرد بر اساس توضیحات می‌تونست خودش مثال هم بزنه (دسترسی به سرچ رو می‌بستم و ازش میخواستم مثال بزنه) مدل chatgpt هم همینکار رو می‌کرد اما مثال‌های سخت‌تری میزد
برای مثال روی مفهوم مربوط به lifetime ازش سوال پرسیدم اما مثالی که تحویل داد ترکیبی از lifetime, generic بود و وقتی گفتم با مفهوم دوم آشنا نیستم و مثالی بزنه که فقط lifetime توی حالت خاصی که پرسیدم رو توضیح بده؛ یک مثال ساده زد که دیگه اون قوانین lifetime رو نداشت.

البته بعد از ۲-۳ بار تکرار هم زمان پاسخ chatgpt کمتر می‌شد هم نتایج بهبود پیدا میکرد ولی بطور کلی من امتیاز این بخش رو به qwen2.5 میدم.

سوالات بعدی هم این موارد بود که qwen2.5 تمام موارد رو به خوبی جواب داد:
۱- سوالاتی درمورد اتفاقات اخیر انتخابات آمریکا
۲- موضوع مربوط به انفجار پیجرها و ...
۳- سخنرانی اسنودن و خلاصه صحبتش درمورد انتخابات و انتخاب رئیس جمهور

این ۳ مورد کاملا جدید بود و می‌شد نحوه کارش برای استخراج اطلاعات رو تست کرد؛ متاسفانه chatgpt کمی با احتیاط پاسخ میداد (یک سری سوالات جزئی دیگر هم پرسیدم که مجبورش کنم جواب دقیقتر و بی‌پرده بده ولی با اینکه با توجه به fact‌ها باید یک طرف رو انتخاب میکرد اینکار رو نکرد)
مشکلی که با qwen2.5 نبود و راحت تر می‌شد ازش جواب بر اساس دیتا گرفت (البته این مدل هم سانسور شده هست ولی به سوالات عمومی بر اساس دیتا راحت‌تر جواب میده)

مشکل اصلی که با qwen2.5 روی سوالات بالا داشتم کم بودن context-length بود؛ چون گزارش شده بود که مدل 32 میلیارد پارامتری عملکرد بهتری از chatgpt 4o-mini داره برای همین منم از 32b استفاده کردم بجای 7b و مجبور شدم روی 8K context بمونم.

سوالات حل ریاضی - تصویر و ... هم بهش ندادم؛ چون توی کاربردهایی نیست که استفاده می‌کنم ولی قطعا برنده این بخش chatgpt o1 خواهد بود بدون شک.

بعد رفتم سراغ qwen2.5-coder فعلا فقط مدل 7b منتشر شده؛ و منم مستقیم رفتم سر وقت باگ‌هایی که توی کدهای Rust داشتم میگرفتم؛ خیلی سوالاتم سخت و پیچیده نبود شاید (چون تازه‌کار هستم توی Rust و نمی‌تونم ارزیابی کنم سطح کدها رو) و تمام موارد رو با روش ۵ مرحله‌ای که چندشب پیش گفتم ارزیابی کردم.
تقریبا تمام موارد رو بدون نیاز به گوگل کردن به جواب رسیدم؛ بهترین مورد در مورد هر ۲ مدل qwen2.5, qwen2.5-coder قدرتشون توی دنبال کردن دستورالعمل‌ها بود.

شدیدا منتظر انتشار مدل qwen2.5-coder 32b هستم برای استفاده روزمره.
دارم به این فکر می‌کنم شاید باید به زودی سخت‌افزار رو برای استفاده از مدل‌های 70b آپگرید کنم 🧐
Forwarded from linuxtnt(linux tips and tricks) (hosein seilany https://seilany.ir/)
دستوراتی برای مدیران سیستم لینوکس:
برای پشتیبان گیری از grub

sudo dd if=/dev/sd1    of=/mbr_backup.img    bs=512 count=1



برای بازیابی از grub

sudo dd if=/mbr_backup.img of=/dev/sda bs=512 count=1




نویسنده: حسین سیلانی
منبع : کانال لینوکسی: لینوکس تی ان تی
@linuxtnt
https://seilany.ir
Forwarded from linuxtnt(linux tips and tricks) (hosein seilany https://seilany.ir/)
در نسخه 6.12 لینوکس، امکان نمایش کد QR در هنگام وقوع کرنل پنیک به صورت اختیاری اضافه شده است.
این ویژگی از طریق زیرساخت مدیریت خطای DRM Panic اضافه شده و در اواسط سپتامبر به هسته لینوکس اضافه خواهد شد.
این قابلیت به کاربران اجازه می‌دهد تا در صورت وقوع خطای “صفحه مرگ” در DRM، یک کد QR نمایش داده شود. این کد QR می‌تواند اطلاعات زیادی را که ممکن است در خروجی متنی ساده به سختی قابل دریافت باشد، به صورت کاربرپسندتری نمایش دهد.
این ویژگی با زبان برنامه‌نویسی Rust نوشته شده و برای استفاده از آن باید ساخت هسته با پشتیبانی از Rust فعال باشد. همچنین، این قابلیت توسط سوئیچ ساخت Kconfig به نام DRM_PANIC_SCREEN_QR_CODE کنترل می‌شود و امکان تنظیم URL پایه کد QR و نسخه کد QR برای مقدار داده‌های اشکال‌زدایی که می‌توان ذخیره کرد، وجود دارد.
——————-
نویسنده: حسین سیلانی
منبع : کانال لینوکسی: لینوکس تی ان تی
@linuxtnt
https://seilany.ir
📕 کتاب REST API Design Rulebook

📌 فصل سوم: Interaction Design with HTTP

📍پارت: دوم

#کتاب

💎 استاتوس کدهای ریسپانس (Response Status Codes) 💎

‏REST API‌ ها از قسمت Status-Line توی ریسپانس HTTP استفاده می‌کنن تا به کلاینت‌ها نتیجه درخواستشون رو اعلام کنن. استاندارد RFC 2616، ساختار Status-Line رو به این شکل تعریف کرده:
Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF


‏HTTP حدود ۴۰ تا کد وضعیت استاندارد داره که برای بیان نتیجه درخواست‌های کلاینت استفاده میشه. این کدها به ۵ دسته اصلی تقسیم می‌شن که توی جدول زیر توضیح دادم:

⭕️ دسته‌بندی کدهای وضعیت:
1. 1xx: اطلاعاتی – اطلاعاتی در مورد سطح پروتکل انتقال میده.
2. 2xx: موفقیت‌آمیز – درخواست کلاینت با موفقیت قبول شده.
3. 3xx: تغییر مسیر – کلاینت باید یه کار اضافی انجام بده تا درخواست کامل بشه.
4. 4xx: خطای کلاینت – خطاهای این دسته مربوط به اشتباهات کلاینت هست.
5. 5xx: خطای سرور – سرور مسئولیت این خطاها رو قبول می‌کنه.


⭕️ قوانین استفاده از کدهای وضعیت:

⭕️ کد 200 (OK): برای موفقیت کلی
این کد معمولاً همون چیزیه که کلاینت انتظار داره ببینه. یعنی درخواست با موفقیت انجام شده و نیازی به استفاده از کد خاص دیگه‌ای از سری ۲xx نیست. برعکس کد 204، وقتی 200 برگرده، باید یه بدنه پاسخ (response body) هم داشته باشه.

⭕️ کد 200 (OK) نباید برای اعلام خطا استفاده بشه
همیشه باید از کدهای وضعیت HTTP درست استفاده کنید. به‌خصوص، نباید برای سازگار شدن با کلاینت‌های ساده‌تر از قواعد استاندارد API صرف‌نظر کرد.

⭕️ کد 201 (Created): برای ایجاد موفقیت‌آمیز منابع جدید
هر وقت که یه API یه منبع جدید برای درخواست کلاینت ایجاد می‌کنه (مثلاً توی یه کالکشن یا فروشگاه)، باید از کد 201 استفاده کنه. حتی اگر منبع جدید از طریق یه عمل کنترلر ایجاد بشه، باز هم 201 کد درستی برای پاسخ هست.

⭕️ کد 202 ("Accepted") باید برای شروع موفقیت‌آمیز یک عملیات غیرهمزمان استفاده بشه
کد 202 یعنی درخواست کلاینت قراره به صورت غیرهمزمان (آسنکرون) پردازش بشه. این کد به کلاینت میگه که درخواستش معتبر به نظر می‌رسه، اما ممکنه بعداً موقع پردازش به مشکل بخوره. این کد معمولاً برای عملیات‌هایی که زمان زیادی می‌برن استفاده می‌شه.
کنترلرها می‌تونن 202 رو برگردونن، اما منابع دیگه نباید این کار رو بکنن.

⭕️ کد 204 ("No Content") باید زمانی استفاده بشه که بدنه پاسخ (response body) خالیه
کد 204 معمولاً وقتی استفاده میشه که API به درخواست‌های PUT، POST یا DELETE پاسخ میده ولی قصد نداره که توی پاسخ، پیام یا داده‌ای برگردونه.
حتی در پاسخ به درخواست GET هم میشه از 204 استفاده کرد تا بگه منبع درخواست‌شده وجود داره، ولی چیزی برای نمایش نداره.

⭕️ کد 301 ("Moved Permanently") برای تغییر مکان دائمی منابع استفاده بشه
- کد 301 وقتی استفاده میشه که مدل منابع توی API تغییر بزرگی کرده و یه آدرس جدید برای منبع به کلاینت اختصاص داده شده. توی این حالت، آدرس جدید باید توی هدر "Location" به کلاینت اعلام بشه.

⭕️ از کد 302 ("Found") نباید استفاده بشه
کد 302 همیشه اشتباه فهمیده شده و برنامه‌نویسا توی پیاده‌سازیش اشتباه کردن. مشکل اصلی اینجاست که کلاینت‌ها به‌طور خودکار برای آدرس جدید یه درخواست GET می‌فرستن، حتی اگر روش اصلی درخواست چیز دیگه‌ای بوده.
برای رفع این مشکل، توی HTTP 1.1 کدهای 303 ("See Other") و 307 ("Temporary Redirect") معرفی شدن که به جای 302 باید استفاده بشن.

⭕️ کد 303 ("See Other") باید برای ارجاع کلاینت به یه URI دیگه استفاده بشه
وقتی یه کنترلر کارش رو تموم کرده، به جای فرستادن پاسخ توی بدنه‌ای که شاید کلاینت نمی‌خواد، می‌تونه با کد 303 یه URI جدید به کلاینت بده. این URI می‌تونه به یه پیام موقت یا یه منبع دائمی‌تر اشاره کنه.
این کد به API اجازه میده که به جای تحمیل دانلود اطلاعات به کلاینت، یه مرجع به منبع بده و کلاینت اگه بخواد می‌تونه با GET به URI جدید دسترسی پیدا کنه.

⭕️ کد 304 ("Not Modified") باید برای صرفه‌جویی در پهنای باند استفاده بشه
این کد شبیه کد 204 ("No Content") هست چون هیچ چیزی توی بدنه پاسخ نیست، اما تفاوت اصلی اینه که 204 وقتی استفاده می‌شه که هیچ داده‌ای برای فرستادن وجود نداره، ولی 304 وقتی استفاده میشه که منبع اطلاعات داره اما کلاینت قبلاً آخرین نسخه‌اش رو گرفته.
این کد بیشتر توی درخواست‌های HTTP شرطی (conditional requests) کاربرد داره.

@ninja_learn_ir
⭕️ کد 307 ("Temporary Redirect") برای تغییر موقتی مکان درخواست کلاینت استفاده بشه
‏- HTTP/1.1 کد 307 رو معرفی کرد تا کاربرد درست کد 302 ("Found") رو مشخص کنه. وقتی کد 307 برگرده، یعنی API قراره درخواست رو پردازش نکنه و کلاینت باید درخواستش رو به یه URI دیگه که توی هدر "Location" داده شده، بفرسته.
- این کد معمولاً برای اختصاص یه آدرس موقت به درخواست منبع استفاده میشه. مثلاً میشه درخواست رو به یه سرور دیگه انتقال داد.

⭕️ کد 400 ("Bad Request") برای اعلام شکست عمومی درخواست کلاینت استفاده بشه
کد 400 یه خطای کلی سمت کلاینت هست و زمانی استفاده میشه که هیچ کد دیگه‌ای از سری 4xx مناسب نباشه.

⭕️ کد 401 ("Unauthorized") باید زمانی استفاده بشه که مشکلی با اعتبارسنجی کلاینت وجود داره
این کد یعنی کلاینت سعی کرده به یه منبع محافظت‌شده دسترسی پیدا کنه ولی اعتبارنامه مناسب ارائه نداده. ممکنه اعتبارنامه‌ها اشتباه باشن یا اصلاً وجود نداشته باشن.

⭕️ کد 403 ("Forbidden") باید زمانی استفاده بشه که دسترسی به منبع غیرممکنه، فارغ از وضعیت اعتبارسنجی
- این کد یعنی درخواست کلاینت درسته ولی API اجازه انجامش رو نمیده. این موضوع ربطی به مشکل اعتبارنامه‌ها نداره (اون مورد 401 هست).
‏- APIهای REST از 403 برای مدیریت سطح دسترسی‌ها استفاده می‌کنن. مثلاً ممکنه یه کلاینت اجازه دسترسی به بعضی منابع رو داشته باشه ولی نه به همه. اگه کلاینت سعی کنه خارج از محدوده مجازش به منبعی دسترسی پیدا کنه، API باید با 403 پاسخ بده.

⭕️ کد 404 ("Not Found") باید زمانی استفاده بشه که URI کلاینت به منبعی مرتبط نمیشه
کد 404 یعنی API نمی‌تونه URI درخواست‌شده رو به منبعی متصل کنه.

⭕️ کد 405 ("Method Not Allowed") باید زمانی استفاده بشه که روش HTTP پشتیبانی نمیشه
‏- API با کد 405 پاسخ میده تا به کلاینت بگه که از روشی استفاده کرده که برای اون منبع مجاز نیست. مثلاً یه منبع فقط قابل خواندن ممکنه فقط GET و HEAD رو پشتیبانی کنه، ولی یه کنترلر ممکنه GET و POST رو مجاز بدونه اما PUT یا DELETE رو نه.
- پاسخ 405 باید شامل هدر "Allow" باشه که روش‌های مجاز برای اون منبع رو لیست کنه. مثلاً:
Allow: GET, POST


⭕️ کد 406 ("Not Acceptable") باید زمانی استفاده بشه که نوع داده‌ای که کلاینت درخواست داده قابل سرویس‌دهی نیست
- کد 406 یعنی API نمی‌تونه نوع مدیا (media type) درخواستی کلاینت رو ایجاد کنه. مثلاً اگه کلاینت درخواست داده به فرمت application/xml بده و API فقط با application/json کار کنه، کد 406 برمی‌گرده.

⭕️ کد 409 ("Conflict") باید زمانی استفاده بشه که درخواست کلاینت باعث نقض وضعیت منبع بشه
- کد 409 به کلاینت میگه که درخواستش باعث شده منبع API توی حالت ناسازگار یا غیرممکن قرار بگیره. مثلاً اگه کلاینت بخواد یه منبع پرشده رو حذف کنه و اون منبع هنوز داده داره، ممکنه API با 409 پاسخ بده.

⭕️ کد 412 ("Precondition Failed") باید برای پشتیبانی از عملیات‌های شرطی استفاده بشه
- این کد یعنی کلاینت یه سری شرایط رو توی هدر درخواستش مشخص کرده و به API گفته که فقط اگه اون شرایط برقرار باشه درخواستش رو انجام بده. اگه شرایط محقق نشه، API با کد 412 پاسخ میده.

⭕️ کد 415 ("Unsupported Media Type") باید زمانی استفاده بشه که نوع مدیا در payload درخواست قابل پردازش نباشه
- این کد یعنی API نمی‌تونه نوع مدیایی که کلاینت فرستاده رو پردازش کنه. مثلاً اگه کلاینت داده‌ها رو به فرمت application/xml بفرسته ولی API فقط با application/json کار کنه، کد 415 برگردونده می‌شه.

⭕️ کد 500 ("Internal Server Error") باید برای اعلام مشکل داخلی API استفاده بشه
- کد 500 یه خطای عمومی API هست که بیشتر فریم‌ورک‌های وب خودکار این کد رو برمی‌گردونن وقتی که درخواست کلاینت باعث ایجاد یه استثنا توی کد بشه.
- این خطا تقصیر کلاینت نیست، پس کلاینت می‌تونه همون درخواست رو دوباره امتحان کنه و امید داشته باشه که نتیجه متفاوتی بگیره.

@ninja_learn_ir