Ninja Learn | نینجا لرن
1.26K subscribers
96 photos
36 videos
11 files
307 links
یادگیری برنامه نویسی به سبک نینجا 🥷
اینجا چیزایی یاد میگیری که فقط نینجاهای وب‌ بلدن 🤫

📄 Send me post: https://t.iss.one/NoronChat_bot?start=sec-fdggghgebe

👥 ɢʀᴏᴜᴘ: https://t.iss.one/+td1EcO_YfSphNTlk
Download Telegram
خب خب خب جلوگیری از Race Condition در جنگو با select_for_update 🔒🚀

توی این پست در مورد Race Condition صحبت کردیم و گفتیم چطور ممکنه چندتا درخواست همزمان بیان و دیتا رو خراب کنن. حالا بریم ببینیم جنگو چه ترفندهایی برای کنترل این مشکل داره و چطور می‌تونیم از select_for_update استفاده کنیم.

مشکل چیه؟ 🤔
فرض کن یه سیستم بانکی داری و کاربرا دارن پول جابه‌جا می‌کنن. حالا دو نفر همزمان می‌خوان از حسابشون پول بردارن و موجودی حساب فقط 100 تومنه. اگه این درخواست‌ها بدون قفل کردن دیتا پردازش بشن، ممکنه هر دو برداشت موفق بشن و سیستم بدهکار بشه 😬
اینجا همون جاییه که select_for_update میاد وسط و دیتا رو از فاجعه نجات می‌ده.


چطوری select_for_update مشکل رو حل می‌کنه؟ 🔐
وقتی از select_for_update استفاده می‌کنی، رکورد دیتابیس قفل می‌شه تا هیچ درخواست دیگه‌ای نتونه همزمان تغییرش بده. این یعنی هر درخواستی که بعد از اولین درخواست بیاد، باید منتظر بمونه تا قفل آزاد بشه و بعد پردازش بشه.

مثال 1: جلوگیری از برداشت همزمان از حساب بانکی 🏦
from django.db import transaction
from myapp.models import Account

def withdraw_money(account_id, amount):
with transaction.atomic(): # شروع تراکنش
account = Account.objects.select_for_update().get(pk=account_id) # قفل کردن رکورد
if account.balance >= amount:
account.balance -= amount
account.save()
print("برداشت موفقیت‌آمیز بود!")
else:
print("موجودی کافی نیست!") # جلوگیری از برداشت بیش از حد

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

مثال 2: انتقال وجه بین دو حساب 💳
حالا یه چالش سخت‌تر انتقال پول از یه حساب به حساب دیگه. باید هر دو حساب همزمان قفل بشن تا مشکلات همزمانی پیش نیاد.
from django.db import transaction
from myapp.models import Account

def transfer_money(from_id, to_id, amount):
with transaction.atomic():
accounts = Account.objects.select_for_update().filter(pk__in=[from_id, to_id]).order_by("id")

sender = accounts[0]
receiver = accounts[1]

if sender.balance >= amount:
sender.balance -= amount
receiver.balance += amount
sender.save()
receiver.save()
print("انتقال وجه موفقیت‌آمیز بود!")
else:
print("موجودی کافی نیست!") # جلوگیری از انتقال اشتباه

اینجا هر دو حساب رو قفل می‌کنیم تا حتی اگه دو درخواست انتقال پول به صورت همزمان بیاد، هیچکدوم نتونن وسط کار رو همدیگه تأثیر بذارن.

چندتا نکته 🚀

🔹 انتخاب نوع قفل (select_for_update(nowait=True))
اگه بخوای درخواست‌های معطل رو سریع رد کنی، می‌تونی nowait=True بذاری که اگه رکورد قفل بود، درخواست جدید منتظر نمونه و مستقیم خطا بده.
account = Account.objects.select_for_update(nowait=True).get(pk=1)

☝️ این باعث می‌شه که اگه رکورد قفل باشه، جنگو بلافاصله یه DatabaseError بده و منتظر نمونه.

🔹 قفل کردن رکوردها بدون مسدود کردن خواندن (select_for_update(skip_locked=True))
اگه درخواست‌های زیادی داری و نمی‌خوای که یک درخواست کل سیستم رو بلاک کنه، می‌تونی از skip_locked=True استفاده کنی که درخواست‌های دیگه بتونن رکوردهای آزاد رو پردازش کنن.
account = Account.objects.select_for_update(skip_locked=True).get(pk=1)

☝️ این کار باعث می‌شه که اگه یه رکورد قفل بود، درخواست بیخیال اون رکورد بشه و فقط رکوردهایی که قفل نیستن رو انتخاب کنه.

🔹 مدیریت تایم‌اوت قفل (set statement_timeout)
اگه نمی‌خوای که درخواست‌ها مدت زیادی بلاک بشن، توی PostgreSQL می‌تونی یه تایم‌اوت برای قفل تعیین کنی:
SET statement_timeout = '5s'; 

☝️ این یعنی اگه یه درخواست بیشتر از ۵ ثانیه قفل بمونه، بهش خطا داده می‌شه و می‌ره بیرون.

جمع‌بندی
select_for_update یکی از قوی‌ترین ابزارها برای جلوگیری از Race Condition توی جنگوئه. مهم‌ترین نکاتش اینان:
قفل کردن رکوردهای دیتابیس موقع آپدیت برای جلوگیری از دستکاری همزمان
استفاده از nowait=True برای جلوگیری از انتظار بیش از حد
استفاده از skip_locked=True برای رد کردن رکوردهای قفل‌شده و ادامه پردازش.


#️⃣ #python #programming #db



🥷 CHANNEL | GROUP
1👍20🔥42👌1
🎥 The social network


داستان فیلم 🎬

ـ“The Social Network” داستان تأسیس شبکه اجتماعی فیس‌بوک توسط مارک زاکربرگ و چالش‌هایی که در مسیر این راه با آن مواجه شد را روایت می‌کند. فیلم به نمایش مسائل حقوقی، درگیری‌ها و کشمکش‌های شخصی در مسیر ساخت یکی از بزرگترین شبکه‌های اجتماعی دنیا می‌پردازد.


پیشنهاد میکنم ببینید :)

#️⃣ #movie



🥷 CHANNEL | GROUP
7👍2🤣2
جنگو کنده، پس نباید استفاده کنیم؟ 🙂‍↔️

یکی از بحث‌های همیشگی توی گروه های جنگو اینه که "جنگو کنده، پس بریم سمت FastAPI یا Go یا ...". این حرفو زیاد شنیدم، خودمم یه زمانی فکر می‌کردم سرعت، همه‌چیزه ولی بیاین یه بار منطقی بررسی کنیم، بدون تعصب.

چرا میگن جنگو کنده؟
خب راستشو بخواین، جنگو واقعا کنده (نسبت به فریم‌ورک‌های async بیس مثل FastAPI و زبان‌های کامپایلری مثل Go که توی I/O bound حرف اولو میزنن). ولی چرا؟

جنگو سینکروسه 🥸
جنگو از اساس برای وب‌اپلیکیشن‌های سنتی طراحی شده(طبیعیم هست چون ۲۰ سال پیش ساخته شد اون موقع مفهومی به اسم async به این صورت نبود).
ولی فریم‌ورک‌هایی مثل FastAPI می‌تونن همزمان چند درخواست رو مدیریت کنن (به لطف async).

Overhead بالای ORM 🏋️‍♂️
‏ORM جنگو سنگینه. هر کوئری که میزنی، کلی پردازش اضافه انجام میده تا کارتو راحت کنه، ولی همین باعث میشه کندتر از ORMهای سبک‌تر باشه.

Middleware و Request Cycle پیچیده‌تره 🌀

جنگو یه سری پردازش‌های اضافه برای هر درخواست انجام میده (مانند middleware ها، سیگنال‌ها، template rendering و ...)، که باعث میشه به طور طبیعی کمی کندتر باشه.

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

1⃣ سرعت، همیشه مهم‌ترین فاکتور نیست
اکثر پروژه‌ها، گلوگاه سرعت، فریم‌ورک نیست، بلکه دیتابیس، شبکه، و لاجیک‌های بیزینسی هستن. یه اپلیکیشن CRUD ساده که روزی ۱۰۰۰ تا درخواست داره، با FastAPI یا جنگو، تفاوت محسوسی نداره.

2⃣ توسعه سریع‌تر = زمان و پول بیشتر
جنگو کلی چیز آماده داره. سیستم مدیریت کاربر، فرم‌ها، ORM، ادمین پنل، و کلی ماژول دیگه. این یعنی تو به جای ساختن همه‌چی از صفر، فقط تمرکزت روی بیزینس لاجیکه. توسعه سریع‌تر = هزینه کمتر.

3⃣ امنیت، یکپارچگی، و قابلیت اطمینان
جنگو به طور پیش‌فرض مقاوم در برابر حملات XSS، CSRF، SQL Injection و غیره‌ست. ولی FastAPI؟ باید خودت امنیت رو درست کنی و Middleware بنویسی، که اگه اشتباه کنی، فاجعه میشه

کی بریم سمت FastAPI یا Go یا هرچیز سریع؟

1⃣ وقتی واقعا به Async نیاز داری
اگه داری یه چت‌اپ، وب‌ساکت، یا یه سیستم پردازش سنگین با درخواست‌های همزمان بالا می‌نویسی، FastAPI و Go گزینه‌های بهتری هستن.

2⃣ وقتی هر میلی‌ثانیه مهمه
توی سرویس‌های real-time مثل سیستم‌های تریدینگ، گیمینگ، یا پردازش داده سنگین، Go و Rust گزینه‌های بهتری هستن، چون کامپایل میشن و خیلی سریع‌تر از پایتون اجرا میشن.

پس چی کار کنیم؟
اگه سرعت برات مهمه: Go بزن Java بزن یا ...


اگه یه API سبک و سریع لازم داری: FastAPI بزن


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


سرعت، همه چیز نیست، بلکه بستگی داره که چه چیزی برات مهم‌تره و نیاز داری بهش

خوشحال میشم نظرتون رو بشنوم
تو کامنتای همین پست بگید 👇


#️⃣ #programming #django #backend



🥷 CHANNEL | GROUP
👍324
حواسم هست حمایت نمیکنی 🗿🫵

هنوزم دیر نیست لطفاً ریکشن بزن و شیر کن پستارو
🔪☺️
🌚 (این یک درخواست نبود)
👍35🤣6💔2👎1
یکی از اعضای کامیونیتی سایت عالی رو معرفی کرده بود که منم تصمیم گرفتم توی کانالم بهتون معرفی کنم.
وبسایت CodeCrafters (لینک زیر) مجموعه‌ای از پروژه‌های برنامه‌نویسی رو ارائه می‌ده که می‌تونید با توجه به سطح مهارت فعلی‌تون، پروژه‌هایی با سختی‌های مختلف انتخاب کنید. از پروژه‌هایی مثل نوشتن Shell گرفته تا پروژه های پیشرفته مثل نوشتن مسیج بروکرهایی مثل Kafka (اونم با هر زبانی که دوست دارید) ، این سایت گزینه‌های متنوعی برای ارتقای مهارت‌های برنامه‌نویسیتون داره و واقعا لذت بردم.

حتماً از این لینک استفاده کنید:
https://app.codecrafters.io/r/smiling-trout-679054


اگه از طریق این لینک ثبت‌نام کنید، یک هفته دسترسی رایگان به تمام تمرینات داده شده دریافت میکنید. ( به منم یه هفته میده 😁)

برای دوستاتونم بفرستید که اوناهم استفاده کنن

#️⃣ #reference



🥷 CHANNEL | GROUP
👍135🔥2
Ninja Learn | نینجا لرن pinned «یکی از اعضای کامیونیتی سایت عالی رو معرفی کرده بود که منم تصمیم گرفتم توی کانالم بهتون معرفی کنم. وبسایت CodeCrafters (لینک زیر) مجموعه‌ای از پروژه‌های برنامه‌نویسی رو ارائه می‌ده که می‌تونید با توجه به سطح مهارت فعلی‌تون، پروژه‌هایی با سختی‌های مختلف انتخاب…»
خب خب خب ورژن‌بندی اپلیکیشن‌ها چیه؟ 📌

احتمالاً توی پروژه‌ها دیدی که نسخه نرم‌افزارها یه چیزی مثل 1.2.3 هست. ولی این اعداد چه معنی‌ای دارن؟ آیا یه ورژن 1.2.3 بهتر از 1.2.2ـه؟ بیاید یه بار برای همیشه اینو ببینیم

📌 استاندارد ورژن‌بندی (Semantic Versioning - SemVer)
ساختار استاندارد ورژن‌بندی معنایی (Semantic Versioning) معمولاً این شکلیه:
X.Y.Z 

X (Major - تغییرات بزرگ)
وقتی این عدد تغییر کنه، یعنی کلی چیز عوض شده مثلاً سازگاری عقبگرد (backward compatibility) شکسته شده و ممکنه کدهای قدیمی دیگه کار نکنن یا به عبارتی BREAKING CHANGE به وجود اومده.

Y (Minor - قابلیت‌های جدید)
اگه این عدد تغییر کنه، یعنی قابلیتای جدید اضافه شده ولی همچنان سازگاری با نسخه قبلی حفظ شده.

Z (Patch - رفع باگ‌ها و بهبودها)
فقط باگ فیکس یا بهینه‌سازیای جزئی انجام شده و هیچ قابلیت جدیدی اضافه نشده.

🔹 مثال عملی از ورژن‌بندی
فرض کن داریم روی یه اپلیکیشن کار می‌کنیم:
1.0.0 → نسخه اولیه منتشر شد.
1.1.0 → یه قابلیت جدید مثل ورود با گوگل اضافه شد.
1.1.1 → یه باگ توی صفحه لاگین فیکس شد.
2.0.0ساختار دیتابیس عوض شد و نسخه‌های قبلی دیگه کار نمی‌کنن.

🔍 پس کی باید Major، Minor یا Patch رو تغییر بدیم؟
وقتی API رو تغییر دادی و ممکنه کدای قدیمی دیگه کارنکنن؟
‏Major رو ببر بالا 🚀

یه فیچر جدید اضافه کردی ولی چیزی از قبل به مشکل نمیخوره؟
‏Minor رو ببر بالا 📈

فقط یه باگ کوچیک فیکس کردی؟
‏Patch رو ببر بالا 🛠️

🔹 انواع مختلف ورژن بندی؟
گاهی وقتا می‌بینی که ورژنا این شکلیه:
🔸1.2.3-alpha → نسخه آزمایشی (قبل از انتشار اصلی)

🔸 1.2.3-beta → نسخه بتا، برای تست کاربرا
🔸 1.2.3-rc1 → نسخه Release Candidate که تقریباً آماده است

جمع‌بندی
ورژن‌بندی معنایی باعث میشه بفهمیم یه نسخه چقدر تغییر کرده و آیا آپدیتش برای ما مشکلی ایجاد می‌کنه یا نه.

#️⃣ #programming #backend



🥷 CHANNEL | GROUP
👌18👍1
🐧کانال لینوکس زون | برای عاشقان لینوکس و دنیای نرم افزار متن باز🗃

🚀 چی قراره یاد بگیریم؟
🛠 دستورات، ترفندها و آموزش‌های حرفه‌ای لینوکس

⚡️ بهینه‌سازی و مدیریت سرورهای لینوکسی

📦 معرفی ابزارها و تکنولوژی‌های متن‌باز 

🔐 امنیت، شبکه و مفاهیم کلیدی لینوکسی 

💎 اشتراک تجربه‌ها و چالش‌های واقعی دنیای لینوکس

📢 جدیدترین اخبار دنیای نرم افزار آزاد

💡 هر روز یه قدم به حرفه‌ای‌تر شدن نزدیک‌تر شو 

🎯 | Channel: @LinuxZone
💬 | Group: @LinuxZoneGap

⚡️ بزن بریم دنیای لینوکس رو کشف کنیم 🐧🚀
4
روز مهندس مبارک شما نینجاها 🥷❤️
❤‍🔥20
This media is not supported in your browser
VIEW IN TELEGRAM
❤‍🔥4
خب خب خب ارایه ها

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

چطوری یه آرایه بسازیم؟ 🤔
تو بیشتر زبان‌های برنامه‌نویسی، آرایه‌ها باید نوع داده‌ی یکسانی داشته باشن و معمولا موقع تعریف، نوع داده‌شون مشخص می‌شه. اما تو پایتون این محدودیت وجود نداره و می‌تونیم آرایه‌ای کاملا داینامیک بسازیم:
my_array = [] # آرایه خالی در پایتون 

مثال از C/C++:
int my_array[4]; // آرایه‌ای از ۴ عدد صحیح 

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

چطور به داده‌های آرایه دسترسی داشته باشیم؟ 👀
در بیشتر زبان‌ها این کار خودکار هندل می‌شه و می‌تونیم به کمک ایندکس داده‌ی موردنظرمون رو بخونیم:
my_array = [1, 2, 3]
print(my_array[2]) # خروجی: 3

ولی به‌طور کلی، آدرس یک عنصر در حافظه این‌جوری حساب می‌شه:
Loc = (سایز هر عنصر × ایندکس) + آدرس شروع آرایه

چطور مقدار آرایه رو تغییر بدیم؟ 🔄

🔹 اضافه کردن مقدار جدید:
my_array.append(4) # اضافه کردن مقدار ۴ به آخر آرایه 

🔹 حذف مقدار خاصی از آرایه:
del my_array[2] # حذف مقدار سوم آرایه

🔹 تغییر مقدار یک خانه:
my_array[0] = 6 # مقدار اولین عنصر رو ۶ می‌کنیم 

سرعت اجرای عملیات‌ها

🔹 خواندن یک مقدار از آرایه:
دسترسی به آرایه‌ها با توجه به فرمول بالا O(1) یعنی ثابت هست، چون مستقیماً به آدرسش توی حافظه دسترسی داریم و با تغییر تعداد داده ها هیج تغییری ایجاد نمیشه.

🔹 اضافه و حذف کردن مقدار:
اگر مقدار رو به آخر آرایه اضافه یا حذف کنیم → O(1)
ولی اگر بخوایم مقدار رو از وسط یا اول آرایه حذف کنیم یا جابه‌جا کنیم، باید همه‌ی مقدارهای بعدی هم جابجا شن که وابسته به تعداد ایتم هامون هست و هر چی بیشتر باشه سرعت پایینتری داریم → O(n)

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

#️⃣ #programming #software



🥷 CHANNEL | GROUP
👍112
چرا میگن بگیم "گنو/لینوکس" و نگیم "لینوکس"؟

با یه پست جدید در خدمتتونیم 😊
یکی از صحبت‌هایی که همیشه بین حرفه‌ای و تازه‌کارا شکل می‌گیره اینه که نباید بگیم

لینوکس بلکه باید بگیم گنو/لینوکس.
خب چرا؟
بیاید برگردیم به 1983، زمانی که گنو (GNU) به عنوان یه پروژه اوپن سورس توسط ریچارد استالمن ایجاد شد. هدف اصلیشونم ساخت سیستم عاملی بود که سورس کد مشخص داشته باشه همچنین متن باز، آزاد، سریع و ایمنی باشه.
پروژه گنو شروع کرد به ساختن بخش‌های مختلف سیستم عامل، و خیلی از ابزارها و چیزای مهمی که هنوز بسیار بسیار مهم هستن، مثلا GCC، Bash، emacs، coreutils
اینایی که گفتیم چنتا نمونه از چیزایی بودن که پروژه گنو ساخت.
مثلا coreutils کامندها و دستورات بیسیکی کار با فایل‌ها رو شامل میشه. کامند ls و cp و rm و ... از همین coreutils هستن.
خلاصه که خیلی چیزا ساختن، ولی همچنان یه مشکلی بود...
کرنل که عملا هسته سیستم عامل بود رو نداشتن و کرنل‌های موجود رو هم استفاده نکردن به دلایل دیگه.

میرسیم به 1991، یه دانشجوی فنلاندی به اسم لینوس توروالدز میاد و یه کرنل میسازه و توجه پروژه گنو جمع میشه به این کرنل، یه کرنل اوپن سورس و رایگان که همین قضیه هم باعث میشه جای خالی کرنل توسظ لینوکس پر بشه.

وایسا ببینم، مگه لینوکس سیستم عامل نبود؟
خب باید بگم نه :)))
لینوکس در اصل یه کرنله.

در نهایت ابزارهای گنو و کرنل لینوکس ترکیب میشن و گنو/لینوکس متولد میشه.
با ترکیب این دوتا، اولین توزیع گنو/لینوکسی به وجود میاد تو سال 1993 و اسمشم میشه Slackware
احتمالا خیلیا نمیشناسنش ولی یه نام آشنا در همین زمان به وجود میاد که قطعا میدونم میشناسید :)

و دبیان متولد میشه 😄
پس اگر بگیم لینوکس، عملا داریم بخش عظیمی از سیستم عامل رو که گنو تشکیل میده رو زیر سوال میبریم و بیخیال زحماتش میشیم.
یه سوال دیگه هم پیش میاد:

چرا گنو خودش کرنل ننوشت؟
در اصل گنو هم یه کرنل داره!!
یه میکرو کرنل به اسم Mach که فانکشنالیتی‌های اصلی و هسته رو انجام میده و hurd هم در اصل چیزای high level تر رو انجام میده.

اما خب باید بگم که اگه پشت گوشتون رو دیدید کرنل کامل hurd رو هم خواهید دید 😁
حدود 30 ساله که داره توسعه پیدا میکنه و هنوزم بدرد استفاده نمیخوره و جای کار داره.
و این بود داستان توسعه لینوکس، گنو، و قضیه نامگذاری گنو/لینوکس که بهش پرداختیم.

امیدوارم روز و شب خوبی داشته باشید
با یه قلب خوشگل خوشحالمون کن 🫡❤️

#⃣#gnome #linux



🐧 CHANNEL | GROUP
14👍5👌1
عید نزدیکه و منم میخوام بهتون یه عیدی خفن بدم
بنظرتون چیه ؟ (اونایی مه بهشون گفتم هیچی نگن) 🤫
14
Ninja Learn | نینجا لرن
عید نزدیکه و منم میخوام بهتون یه عیدی خفن بدم بنظرتون چیه ؟ (اونایی مه بهشون گفتم هیچی نگن) 🤫
بزار بگم
قراره کتاب
Boost your DjangoDX


که ادام جانسون نوشته رو براتون بزارم 😁

پ.ن: رایگانشو هیچ جای وب مجاز پیدا نمیکنید 😬
👍26❤‍🔥82👎1🔥1👏1👌1