Forwarded from Ninja Learn | نینجا لرن (Mohammad)
️
💎 کشینگ در جنگو 💎
امروز میخوایم درباره کشینگ در جنگو صحبت کنیم. اگه مقدمات کشینگ رو بلدید، این پست براتون قابل درک تره.
❓ چرا کشینگ در جنگو مهمه؟
جنگو با ابزارهای قدرتمندی که در اختیارمون میذاره، به ما این امکان رو میده که بهینه سازی سطح بالایی رو در اپلیکیشنهامون پیاده کنیم. کشینگ یکی از این ابزارهاست که به طور مستقیم روی سرعت و عملکرد سایت تاثیر میگذاره.
🧾 انواع کشینگ در جنگو و کاربردهاشون:
1⃣ کش صفحه (Page Cache):
2⃣ فرگمنت کش (Fragment Cache):
4⃣ کش سرور:
⚒ ابزارهای کشینگ در جنگو:
1⃣ cache_page decorator:
2⃣ cache.get() and cache.set():
3⃣ @cache_decorator:
4⃣ cache_framework:
✅ نکات مهم در پیادهسازی کشینگ:
1⃣ زمان انقضا کش:
تعیین زمان مناسب برای انقضای کش خیلی مهمه. اگه خیلی کوتاه باشه، بار سرور زیاد میشه و اگه خیلی طولانی باشه، دادههای قدیمی به کاربر نمایش داده میشه.
2⃣ کلید کش:
انتخاب یک کلید مناسب برای هر آیتم کش، به شما کمک میکنه تا به راحتی به اون آیتم دسترسی پیدا کنید.
3⃣ و Invalidation:
وقتی دادهای تغییر کرد، باید کش مربوط به اون داده رو باطل کرد تا داده جدید به کاربر نمایش داده بشه.
4⃣ و Backend های کش:
جنگو از بکاندهای کش مختلفی مثل Memcached، Redis و دیتابیس پشتیبانی میکنه. انتخاب بکاند مناسب به نیازهای اپلیکیشن بستگی داره.
حالا بریم سراغ نصب ابزار ها و کارکردن باهاشون 😁
1⃣ نصب Redis:
اول از همه باید Redis رو روی سیستممون نصب کنیم. دستور نصبش بسته به اینکه ویندوز یا لینوکس یا مک دارید فرق میکنه. میتونید توی گوگل سرچ کنید و دستوراتش رو پیدا کنید.
2⃣ نصب پکیج django-redis در جنگو:
حالا باید یه پکیج به اسم django-redis رو نصب کنیم. این پکیج مثل یه پل بین جنگو و Redis عمل میکنه. برای نصبش کافیه تو ترمینال بنویسید:
✅ تنظیمات نهایی:
حالا بریم سراغ فایل settings.py پروژه مون. اینجا باید به جنگو بگیم که از Redis استفاده کنه. یه بخش به اسم CACHES داریم که باید توش این اطلاعات رو وارد کنیم:
اینجا LOCATION آدرس Redis رو مشخص میکنه. مثلاً 127.0.0.1 یعنی لوکالهاست خودمون.
حالا بریم مثال عملی بزنیم 😄
مثال پیشرفته:
در این مثال، ما محصولات مرتبط با یک محصول خاص رو کش میکنیم.
از cache.get() برای بررسی وجود محصول در کش استفاده میکنیم و اگه وجود نداشت، اون را محاسبه میکنیم و در کش ذخیره میکنیم.
✅ جمعبندی:
کشینگ یک ابزار قدرتمند برای بهینه سازی عملکرد وب اپلیکیشنهای جنگو هست. با درک عمیق از مفاهیم کشینگ و استفاده صحیح از ابزارهای جنگو، میتوانید وبسایتهای بسیار سریع و قدرت مند بسازید.
برای مطالعه بیشتر میتونید به داکیومنت رسمی جنگو مراجعه کنید
ممنون میشم اگه خوشت اومد ریکشن بزنی و مارو فالو کنی :)
@ninja_learn_ir
💎 کشینگ در جنگو 💎
امروز میخوایم درباره کشینگ در جنگو صحبت کنیم. اگه مقدمات کشینگ رو بلدید، این پست براتون قابل درک تره.
❓ چرا کشینگ در جنگو مهمه؟
جنگو با ابزارهای قدرتمندی که در اختیارمون میذاره، به ما این امکان رو میده که بهینه سازی سطح بالایی رو در اپلیکیشنهامون پیاده کنیم. کشینگ یکی از این ابزارهاست که به طور مستقیم روی سرعت و عملکرد سایت تاثیر میگذاره.
🧾 انواع کشینگ در جنگو و کاربردهاشون:
1⃣ کش صفحه (Page Cache):
کل خروجی یک ویو رو ذخیره میکنه. برای صفحاتی که محتوای داینامیکی کمی دارن و تغییرشون کند هست، ایدهآله.
2⃣ فرگمنت کش (Fragment Cache):
قسمتهای مختلف یک صفحه رو به صورت جداگونه کش میکنه. این کار باعث میشه بتونیم بخشهای پویا و ایستا رو به صورت جداگونه مدیریت کنیم.3⃣ کش دیتابیس:
کوئریهای پیچیده و پرکاربرد رو کش میکنه تا بار سرور دیتابیس کاهش پیدا کنه.
4⃣ کش سرور:
دادههایی که از APIهای خارجی یا سیستمهای دیگه ای گرفته میشن رو کش میکنه تا از بارگذاری مجدد جلوگیری کنه.
⚒ ابزارهای کشینگ در جنگو:
1⃣ cache_page decorator:
سادهترین روش برای کش کردن کل صفحه است.
2⃣ cache.get() and cache.set():
برای دسترسی مستقیم به کش استفاده میشه.
3⃣ @cache_decorator:
برای تعریف دکورتورهای سفارشی کشینگ استفاده میشه.
4⃣ cache_framework:
فریمورک داخلی جنگو برای مدیریت کشینگ است.
✅ نکات مهم در پیادهسازی کشینگ:
1⃣ زمان انقضا کش:
تعیین زمان مناسب برای انقضای کش خیلی مهمه. اگه خیلی کوتاه باشه، بار سرور زیاد میشه و اگه خیلی طولانی باشه، دادههای قدیمی به کاربر نمایش داده میشه.
2⃣ کلید کش:
انتخاب یک کلید مناسب برای هر آیتم کش، به شما کمک میکنه تا به راحتی به اون آیتم دسترسی پیدا کنید.
3⃣ و Invalidation:
وقتی دادهای تغییر کرد، باید کش مربوط به اون داده رو باطل کرد تا داده جدید به کاربر نمایش داده بشه.
4⃣ و Backend های کش:
جنگو از بکاندهای کش مختلفی مثل Memcached، Redis و دیتابیس پشتیبانی میکنه. انتخاب بکاند مناسب به نیازهای اپلیکیشن بستگی داره.
حالا بریم سراغ نصب ابزار ها و کارکردن باهاشون 😁
1⃣ نصب Redis:
اول از همه باید Redis رو روی سیستممون نصب کنیم. دستور نصبش بسته به اینکه ویندوز یا لینوکس یا مک دارید فرق میکنه. میتونید توی گوگل سرچ کنید و دستوراتش رو پیدا کنید.
2⃣ نصب پکیج django-redis در جنگو:
حالا باید یه پکیج به اسم django-redis رو نصب کنیم. این پکیج مثل یه پل بین جنگو و Redis عمل میکنه. برای نصبش کافیه تو ترمینال بنویسید:
pip install django-redis
✅ تنظیمات نهایی:
حالا بریم سراغ فایل settings.py پروژه مون. اینجا باید به جنگو بگیم که از Redis استفاده کنه. یه بخش به اسم CACHES داریم که باید توش این اطلاعات رو وارد کنیم:
CACHES = {
'default': {
'BACKEND': 'django_redis.cache.RedisCache',
'LOCATION': 'redis://127.0.0.1:6379/1',
'OPTIONS': {
'CLIENT_CLASS': 'django_redis.client.DefaultClient',
}
}
}
اینجا LOCATION آدرس Redis رو مشخص میکنه. مثلاً 127.0.0.1 یعنی لوکالهاست خودمون.
حالا بریم مثال عملی بزنیم 😄
مثال پیشرفته:
from django.views.decorators.cache import cache_page
from django.core.cache import cache
@cache_page(60 * 15) # کش کردن به مدت 15 دقیقه
def my_view(request, product_id):
product = Product.objects.get(id=product_id)
related_products = cache.get(f'related_products_{product_id}')
if not related_products:
related_products = product.get_related_products()
cache.set(f'related_products_{product_id}', related_products, 60 * 15)
return render(request, 'product_detail.html', {'product': product, 'related_products': related_products})
در این مثال، ما محصولات مرتبط با یک محصول خاص رو کش میکنیم.
از cache.get() برای بررسی وجود محصول در کش استفاده میکنیم و اگه وجود نداشت، اون را محاسبه میکنیم و در کش ذخیره میکنیم.
✅ جمعبندی:
کشینگ یک ابزار قدرتمند برای بهینه سازی عملکرد وب اپلیکیشنهای جنگو هست. با درک عمیق از مفاهیم کشینگ و استفاده صحیح از ابزارهای جنگو، میتوانید وبسایتهای بسیار سریع و قدرت مند بسازید.
برای مطالعه بیشتر میتونید به داکیومنت رسمی جنگو مراجعه کنید
#جنگو #کشینگ #توسعه_وب #بهینه_سازی
🔥20👍4❤2
Forwarded from Microfrontend.ir
در این ویدیو از پلی لیست آموزش جنگو و نکتهها و ترفندهای آن به بررسی مفهوم Django Custom Field پرداختیم. ابتدا نوع داده JSONB Array در پستگرس را با یک مثال شرح دادم و سپس یک کاستوم فیلد نوشتیم که بتوان این نوع داده را ذخیره و بازیابی کنیم. سپس یک Custom lookup هم نوشتیم که بتوان داده ها را فیلتر کرد.
** در این ویدیو اساسا دنبال آموزش خاصی نبودم و دنبال این بودم که ترغیبتون کنم در تله آموزش نیافتید و شروع کنید به خوندن کد خود جنگو که بهترین منبع مستر شدنه :)
Video Link: https://youtu.be/I0Ry63LO-Rg
** پلی لیست نکته ها و ترفندهای جنگو:
https://www.youtube.com/playlist?list=PLJ9zDGwhhsBwdrfdaoOqbYev3_ocuBOfv
** کلاس آنلاین آموزش جنگو
https://www.youtube.com/playlist?list=PLJ9zDGwhhsByH5tcpM9H3VzdHYpne3bSa
〰️〰️〰️〰️〰️〰️
© @microfrontend_ir
** در این ویدیو اساسا دنبال آموزش خاصی نبودم و دنبال این بودم که ترغیبتون کنم در تله آموزش نیافتید و شروع کنید به خوندن کد خود جنگو که بهترین منبع مستر شدنه :)
Video Link: https://youtu.be/I0Ry63LO-Rg
** پلی لیست نکته ها و ترفندهای جنگو:
https://www.youtube.com/playlist?list=PLJ9zDGwhhsBwdrfdaoOqbYev3_ocuBOfv
** کلاس آنلاین آموزش جنگو
https://www.youtube.com/playlist?list=PLJ9zDGwhhsByH5tcpM9H3VzdHYpne3bSa
〰️〰️〰️〰️〰️〰️
© @microfrontend_ir
👍2❤1
Forwarded from Python BackendHub (Mani)
بحث خوبی شد تو گروه, یکی پرسید که JIT چیه و چی کار میکنه دقیقا. سعی میکنم خیلی ساده توضیح بدم که قابل درک باشه برای همه.
وقتی یه اسکریپت پایتونی رو ران میکنی، یه سری فایل با پسوند .pyc تو پوشهی pycache ساخته میشه. اینا بایت کد هستن. بایت کد چیه؟ یه low level representation از کدی که نوشتی. بایت کد platform independent هست یعنی مهم نیست رو چی داری رانش میکنی. اما این بایت کد برای CPU قابل فهم نیست. CPU فقط ماشین کد رو میفهمه، یعنی همون باینری صفر و یک. پس وقتی بایت کد تولید میشه، PVM (Python Virtual Machine) میاد و بایت کد رو به ماشین کد تفسیر میکنه تا CPU بتونه اجراش کنه.
حالا JIT چیه؟ تبدیل بایت کد به ماشین کد زمان و منابع مصرف میکنه. JIT توی رانتایم این تبدیل رو انجام میده و ماشین کد رو توی حافظه نگه میداره تا دفعات بعدی که همون کد اجرا میشه، دوباره نیاز به تبدیل نباشه. اینکار رو فقط برای بخشهایی از کد که زیاد اجرا میشن (بهشون میگن hot loop) انجام میده. چرا؟ چون خوده ذخیره کردن این دیتا پرهزینست و مموری اشغال میکنه پس کل کد رو نمیاد اینکارو کنه. یعنی JIT Engine نگاه میکنه ببینه این بخش از کد اونقدری داره اجرا میشه که ارزش داشته باشه ماشین کدش رو نگه داره یا نه.
چرا کد پایتون مستقیم کد ماشین نمیشه؟ دلیلش اینه که PVM و Python runtime environment داره تو پایتون کارای دیگهای هم میکنه تو ران تایم مثل مدیریت حافظه، لود کردن ماژولها و پکیجها و... این باعث میشه که پایتون انعطافپذیر و راحت باشه، ولی خب به قیمت افت عملکرد در مقایسه با زبان های کامپایلری مثل C.
@PyBackendHub
وقتی یه اسکریپت پایتونی رو ران میکنی، یه سری فایل با پسوند .pyc تو پوشهی pycache ساخته میشه. اینا بایت کد هستن. بایت کد چیه؟ یه low level representation از کدی که نوشتی. بایت کد platform independent هست یعنی مهم نیست رو چی داری رانش میکنی. اما این بایت کد برای CPU قابل فهم نیست. CPU فقط ماشین کد رو میفهمه، یعنی همون باینری صفر و یک. پس وقتی بایت کد تولید میشه، PVM (Python Virtual Machine) میاد و بایت کد رو به ماشین کد تفسیر میکنه تا CPU بتونه اجراش کنه.
حالا JIT چیه؟ تبدیل بایت کد به ماشین کد زمان و منابع مصرف میکنه. JIT توی رانتایم این تبدیل رو انجام میده و ماشین کد رو توی حافظه نگه میداره تا دفعات بعدی که همون کد اجرا میشه، دوباره نیاز به تبدیل نباشه. اینکار رو فقط برای بخشهایی از کد که زیاد اجرا میشن (بهشون میگن hot loop) انجام میده. چرا؟ چون خوده ذخیره کردن این دیتا پرهزینست و مموری اشغال میکنه پس کل کد رو نمیاد اینکارو کنه. یعنی JIT Engine نگاه میکنه ببینه این بخش از کد اونقدری داره اجرا میشه که ارزش داشته باشه ماشین کدش رو نگه داره یا نه.
چرا کد پایتون مستقیم کد ماشین نمیشه؟ دلیلش اینه که PVM و Python runtime environment داره تو پایتون کارای دیگهای هم میکنه تو ران تایم مثل مدیریت حافظه، لود کردن ماژولها و پکیجها و... این باعث میشه که پایتون انعطافپذیر و راحت باشه، ولی خب به قیمت افت عملکرد در مقایسه با زبان های کامپایلری مثل C.
@PyBackendHub
❤7👍4
Forwarded from Ninja Learn | نینجا لرن (Javad Moradkhah)
💎 کلید مخفی (SECRET KEY) در جنگو به زبان ساده 💎
تو دنیای جنگو، یه کلید مخفی داریم که مثل یه قفل عمل میکنه. این کلید برای امضاهای امنیتی استفاده میشه و باید کاملا محرمانه باشه و هیچوقت نباید کسی جز خودتون اونو بدونه.
وقتی یه پروژه جدید با django-admin startproject میسازید، جنگو بصورت خودکار یه کلید مخفی تولید میکنه و تو تنظیمات پروژه قرارش میده.
این کلید یه رشتهی بیمعنیه و نباید باهاش مثل یه متن یا دادهی دیگه رفتار کنید. هر وقت میخواین ازش استفاده کنید، باید با دستور force_str() یا force_bytes() اونو به فرمت مورد نظرتون تبدیل کنید.
⭕️ اگه این کلید رو تنظیم نکنید، جنگو اصلا بالا نمیاد!
⚠️ مهم: این کلید رو به هیچ وجه در اختیار کسی قرار ندید!
اگه کلید مخفی لو بره، امنیت کل برنامهتون به خطر میفته و ممکنه هکرها بتونن به بخشهای خاصی از برنامه دسترسی پیدا کنن یا حتی بتونن کدهای مخرب اجرا کنن.
❓این کلید برای چی استفاده میشه؟
1⃣ تمام جلسات (Session) به غیر از اونایی که از کش (Cache) استفاده میکنن.
2⃣ تمام پیامها (Message) که از روشهای ذخیرهسازی مثل CookieStorage یا FallbackStorage استفاده میکنن.
3⃣ توکنهای بازیابی رمز عبور (Password Reset)
4⃣ هر جایی که امضای امنیتی نیاز باشه (مگر اینکه کلید دیگهای تنظیم شده باشه)
اگه کلید مخفی رو عوض کنید، تمام موارد بالا دیگه کار نمیکنن. برای همین، موقع عوض کردن کلید، کلید قبلی رو به طور موقت تو تنظیمات SECRET_KEY_FALLBACKS قرار بدید تا مشکلی پیش نیاد.
⭕️ این نکته رو هم یادتون باشه که کلید مخفی برای رمز عبور کاربرها استفاده نمیشه و عوض کردن اون تاثیری روی رمزها نداره.
فایل پیشفرض settings.py که با django-admin startproject ساخته میشه، به طور خودکار یه کلید مخفی منحصر به فرد برای راحتی کارتون ایجاد میکنه.
امیدوارم براتون مفید واقع بوده باشه 🌹
#جنگو
تو دنیای جنگو، یه کلید مخفی داریم که مثل یه قفل عمل میکنه. این کلید برای امضاهای امنیتی استفاده میشه و باید کاملا محرمانه باشه و هیچوقت نباید کسی جز خودتون اونو بدونه.
وقتی یه پروژه جدید با django-admin startproject میسازید، جنگو بصورت خودکار یه کلید مخفی تولید میکنه و تو تنظیمات پروژه قرارش میده.
این کلید یه رشتهی بیمعنیه و نباید باهاش مثل یه متن یا دادهی دیگه رفتار کنید. هر وقت میخواین ازش استفاده کنید، باید با دستور force_str() یا force_bytes() اونو به فرمت مورد نظرتون تبدیل کنید.
⭕️ اگه این کلید رو تنظیم نکنید، جنگو اصلا بالا نمیاد!
⚠️ مهم: این کلید رو به هیچ وجه در اختیار کسی قرار ندید!
اگه کلید مخفی لو بره، امنیت کل برنامهتون به خطر میفته و ممکنه هکرها بتونن به بخشهای خاصی از برنامه دسترسی پیدا کنن یا حتی بتونن کدهای مخرب اجرا کنن.
❓این کلید برای چی استفاده میشه؟
1⃣ تمام جلسات (Session) به غیر از اونایی که از کش (Cache) استفاده میکنن.
2⃣ تمام پیامها (Message) که از روشهای ذخیرهسازی مثل CookieStorage یا FallbackStorage استفاده میکنن.
3⃣ توکنهای بازیابی رمز عبور (Password Reset)
4⃣ هر جایی که امضای امنیتی نیاز باشه (مگر اینکه کلید دیگهای تنظیم شده باشه)
اگه کلید مخفی رو عوض کنید، تمام موارد بالا دیگه کار نمیکنن. برای همین، موقع عوض کردن کلید، کلید قبلی رو به طور موقت تو تنظیمات SECRET_KEY_FALLBACKS قرار بدید تا مشکلی پیش نیاد.
⭕️ این نکته رو هم یادتون باشه که کلید مخفی برای رمز عبور کاربرها استفاده نمیشه و عوض کردن اون تاثیری روی رمزها نداره.
فایل پیشفرض settings.py که با django-admin startproject ساخته میشه، به طور خودکار یه کلید مخفی منحصر به فرد برای راحتی کارتون ایجاد میکنه.
امیدوارم براتون مفید واقع بوده باشه 🌹
#جنگو
❤11👍6
Forwarded from کانال دانشجویان آیزیلِرن (Ahmad)
This media is not supported in your browser
VIEW IN TELEGRAM
🔸 دیکشنریهای تو در تو و فایل با فرمت جِیسون (JSON)
🔗 برشهایی از جلسه 183 دوره صفر تا قهرمانیِ پایتون
🔗 مشاهده 5 فصل اوّل (56 جلسه - رایگان)
🔗 خرید کامل دوره جهت دسترسی به کل محتوا
🔸 با خرید این دوره، شما مادام العمر، به محتوای دوره و آپدیتهای آینده دسترسی خواهید داشت!
🔸 با خرید این دوره، پیدیاف جذاب تمام اسلایدها دراختیار شما قرار خواهد داده شد.
🔸 با خرید این دوره شما به بیش از 400 جلسه آموزشی دسترسی خواهید داشت.
🔸 با خرید این دوره شما به بیش از 100 فایل تمرین از مبتدی تا پیشرفته دسترسی خواهید داشت.
🔸با خرید این دوره شما به گروه VIP دوره اضافه خواهید شد و به طور 24 ساعت با مدّرس دوره ارتباط خواهید داشت.
🔗 izlearn.ir 🧡🤝🏼
🔗 برشهایی از جلسه 183 دوره صفر تا قهرمانیِ پایتون
🔗 مشاهده 5 فصل اوّل (56 جلسه - رایگان)
🔗 خرید کامل دوره جهت دسترسی به کل محتوا
🔸 با خرید این دوره، شما مادام العمر، به محتوای دوره و آپدیتهای آینده دسترسی خواهید داشت!
🔸 با خرید این دوره، پیدیاف جذاب تمام اسلایدها دراختیار شما قرار خواهد داده شد.
🔸 با خرید این دوره شما به بیش از 400 جلسه آموزشی دسترسی خواهید داشت.
🔸 با خرید این دوره شما به بیش از 100 فایل تمرین از مبتدی تا پیشرفته دسترسی خواهید داشت.
🔸با خرید این دوره شما به گروه VIP دوره اضافه خواهید شد و به طور 24 ساعت با مدّرس دوره ارتباط خواهید داشت.
🔗 izlearn.ir 🧡🤝🏼
🔥2❤1
Forwarded from Ninja Learn | نینجا لرن (Mohammad)
دوره DRF بالاخره منتشر شد 🥳
توی این دوره از مباحث شروع میکنیم و قدم به قدم وارد دنیای APIهای پیشرفته میشیم، مفاهیمی مثل Serialization، Authentication، Viewsets و بسیاری دیگه رو بهصورت کاربردی یاد میگیری. هر جلسه با دقت و وسواس طراحی شده تا مطمئن بشیم که نه تنها مفاهیم رو میفهمی، بلکه آمادهای اونها رو توی پروژههای واقعیات پیادهسازی کنی. 💻🔗
https://youtube.com/playlist?list=PLq3tK5gKk3-11_jwdZ_yB8iqdS1q0OfXS&si=RnNUGYgOtN9U018R
@ninja_learn_ir
توی این دوره از مباحث شروع میکنیم و قدم به قدم وارد دنیای APIهای پیشرفته میشیم، مفاهیمی مثل Serialization، Authentication، Viewsets و بسیاری دیگه رو بهصورت کاربردی یاد میگیری. هر جلسه با دقت و وسواس طراحی شده تا مطمئن بشیم که نه تنها مفاهیم رو میفهمی، بلکه آمادهای اونها رو توی پروژههای واقعیات پیادهسازی کنی. 💻🔗
https://youtube.com/playlist?list=PLq3tK5gKk3-11_jwdZ_yB8iqdS1q0OfXS&si=RnNUGYgOtN9U018R
YouTube
دوره اموزش مقدماتی DRF 🚀
این پلیلیست کاملترین راهنمای Django Rest Framework (DRF) هست که هر توسعهدهنده وب باید اون رو داشته باشه. 🚀 از مبانی شروع میکنیم و قدم به قدم وارد دنیای A...
👍12
Forwarded from آکادمی دکتر مسفروش (Ali Mesforush)
سلام.
متاسفانه سایت مکتبخونه، دوره پایتون من را که قرار بود همواره به صورت رایگان در اختیار عموم باشد به عنوان دوره پلاس عرضه کرده و به فروش میرساند.
من اعلام میکنم که فروش این دوره بر خلاف قرار من با مکتب خونه بوده است. قرار من با مکتب خونه به این شکل بود که فقط کوییزها و تمارین قابل مشاهده نباشد(من در کوییزها و تکالیف نقشی ندارم) ولی تمام درسهای من به شکل رایگان باقی بماند.
من هیچ وجهی تاکنون از مکتبخونه یا هرجای دیگری بابت آموزشهای خود دریافت نکردهام.
کل این دوره در یوتیوب کماکان به صورت رایگان قابل مشاهده است و همواره رایگان باقی خواهد ماند.
https://youtube.com/playlist?list=PLkwcg2bJtvvYqkyhUeoCLrcHqtXpRLdHu&si=DQgdbW2sNJImLCGg
لطفا این پست را در گروههای دیگر به اشتراک بگذارید.
متاسفانه سایت مکتبخونه، دوره پایتون من را که قرار بود همواره به صورت رایگان در اختیار عموم باشد به عنوان دوره پلاس عرضه کرده و به فروش میرساند.
من اعلام میکنم که فروش این دوره بر خلاف قرار من با مکتب خونه بوده است. قرار من با مکتب خونه به این شکل بود که فقط کوییزها و تمارین قابل مشاهده نباشد(من در کوییزها و تکالیف نقشی ندارم) ولی تمام درسهای من به شکل رایگان باقی بماند.
من هیچ وجهی تاکنون از مکتبخونه یا هرجای دیگری بابت آموزشهای خود دریافت نکردهام.
کل این دوره در یوتیوب کماکان به صورت رایگان قابل مشاهده است و همواره رایگان باقی خواهد ماند.
https://youtube.com/playlist?list=PLkwcg2bJtvvYqkyhUeoCLrcHqtXpRLdHu&si=DQgdbW2sNJImLCGg
لطفا این پست را در گروههای دیگر به اشتراک بگذارید.
YouTube
برنامه نویسی به زبان پایتون
در این دوره آموزشی به زبان برنامهنویسی Python پرداخته شدهاست. پایتون یک زبان برنامهنویسی قدرتمند سطح بالا، شیءگرا و حرفهایست که در حال گسترش روزافزون در ...
❤28👍1
Forwarded from Python BackendHub (Mani)
دیشب تو گروه بحث بود که من اینترن هستم و چیکار کنم که شغل پیدا کنم یا رزومهام بیشتر دیده بشه. تو پیوی هم خیلیا سوال میپرسن که چطور بدون تجربه کاری اولین شغلشون رو بگیرن. ببین، همه شرکتا دنبال کسی میگردن که واقعاً یک مهارت رو بلده. حالا شاید بگی من ۴ سال دانشگاه رفتم، ۱۰ تا پروژه تمرینی هم تو گیتهاب گذاشتم، پس چرا قبولم نمیکنن؟ ولی باید بدونی که تعریف "بلد بودن" اینجا متفاوته.
یه پروژه مثل فروشگاه اینترنتی شاید کمک کنه چیزای پایهای یاد بگیری، ولی نمیشه گفت واقعاً بلدی. چرا؟ چون یه نرمافزار ساده ساختی که خیلی پیچیده نیست، یه مشکلی رو حل نکردی، شاید فقط چندتا کد رو کپی پیست کردی. "بلد بودن" یعنی این که بتونی از دانشت بهصورت عملی استفاده کنی و یه مشکل واقعی رو حل کنی، اونم جوری که بفهمی چه اتفاقی داره میفته. این اتفاق تو پروژههای تمرینی که یه بار میزنی و میذاریش کنار، نمیفته.
مثلاً یه بازی بود قدیما تو ایران به اسم "تراوین". یه نقشه ۴۰۰ در ۴۰۰ داشت (مختصات منفی هم داشت) یعنی ۱۶۰۰۰ خونه. هر کاربر که ثبتنام میکرد، یه خونه تو نقشه میگرفت که میشد دهکده اصلیش. اولین شرط بازی این بود که دو دهکده نمیتونن تو یه مختصات باشن. خب، اینجا میتونستی یه تیبل با ۱۶۰۰۰ خونه بسازی و هر بار که کاربر ثبتنام کرد، یه مختصات خالی بهش بدی. به این روش میگن whitenoise sampling
تا اینجا پروژه تمرینی تموم میشه. ولی پیچیدگی از اینجا شروع میشه که بیزنس متوجه میشه کاربرا تو کل نقشه پخش شدن، بعضیا چسبیدن به هم، بعضیا دورن. حالا بیزنس میگه برای بیشتر کردن هیجان بازی، باید کاربرا رو نزدیک هم نگه داری. برای همین، مثلاً به جای ۱۶۰۰۰ خونه، ۴۰۰ خونه مرکزی رو در نظر میگیری و وقتی نصفش پر شد، میری سراغ ۱۶۰۰ خونه. به این روش میگن progressive sampling.
مشکل بعدی اینه که کاربرا خیلی بهم چسبیدن و این باعث میشه هیجان بازی زیادی زیاد شه و اول بازی همه به هم حمله کنن، که این خودش باعث میشه خیلیا همون اول بازی رو ول کنن. حالا بیزنس میخواد یه فاصله حداقلی بین دهکدهها بذاری. اینجا به روش blue sampling میرسی.
میبینی؟ یه سیستم ساده چطور با دوتا نیاز بیزنسی که اول مشخص نبود، پیچیده شد؟ این مثال رو زدم که بگم یه پروژه مثل فروشگاه زدن اصلاً چشمگیر نیست. با همونم شاید شغل بگیری، ولی اگه میخوای سریعتر شغل پیدا کنی، برو یه پروژه استارت بزن که واقعاً به دردت بخوره و یه مشکلی که داری رو حل کنه.
پس من میگم طبق قانون gall سیستم complex ای که کار کنه به دنیا نمیاد, بلکه سیستم ساده ای بود که کار میکرد و به سیستم complex بلوغ پیدا کرده. یک مقاله خیلی قشنگ راجب همین قانون.
مثال؟ یه نگاه به گیتهاب من بنداز. همه پروژههام اینطوریه. از لینکدین کراولر گرفته تا کلودفلیر کراولر و aioclock. همه برای این ساخته شدن که یه مشکلی که داشتم رو حل کنن.
@PyBackendHub
یه پروژه مثل فروشگاه اینترنتی شاید کمک کنه چیزای پایهای یاد بگیری، ولی نمیشه گفت واقعاً بلدی. چرا؟ چون یه نرمافزار ساده ساختی که خیلی پیچیده نیست، یه مشکلی رو حل نکردی، شاید فقط چندتا کد رو کپی پیست کردی. "بلد بودن" یعنی این که بتونی از دانشت بهصورت عملی استفاده کنی و یه مشکل واقعی رو حل کنی، اونم جوری که بفهمی چه اتفاقی داره میفته. این اتفاق تو پروژههای تمرینی که یه بار میزنی و میذاریش کنار، نمیفته.
مثلاً یه بازی بود قدیما تو ایران به اسم "تراوین". یه نقشه ۴۰۰ در ۴۰۰ داشت (مختصات منفی هم داشت) یعنی ۱۶۰۰۰ خونه. هر کاربر که ثبتنام میکرد، یه خونه تو نقشه میگرفت که میشد دهکده اصلیش. اولین شرط بازی این بود که دو دهکده نمیتونن تو یه مختصات باشن. خب، اینجا میتونستی یه تیبل با ۱۶۰۰۰ خونه بسازی و هر بار که کاربر ثبتنام کرد، یه مختصات خالی بهش بدی. به این روش میگن whitenoise sampling
تا اینجا پروژه تمرینی تموم میشه. ولی پیچیدگی از اینجا شروع میشه که بیزنس متوجه میشه کاربرا تو کل نقشه پخش شدن، بعضیا چسبیدن به هم، بعضیا دورن. حالا بیزنس میگه برای بیشتر کردن هیجان بازی، باید کاربرا رو نزدیک هم نگه داری. برای همین، مثلاً به جای ۱۶۰۰۰ خونه، ۴۰۰ خونه مرکزی رو در نظر میگیری و وقتی نصفش پر شد، میری سراغ ۱۶۰۰ خونه. به این روش میگن progressive sampling.
مشکل بعدی اینه که کاربرا خیلی بهم چسبیدن و این باعث میشه هیجان بازی زیادی زیاد شه و اول بازی همه به هم حمله کنن، که این خودش باعث میشه خیلیا همون اول بازی رو ول کنن. حالا بیزنس میخواد یه فاصله حداقلی بین دهکدهها بذاری. اینجا به روش blue sampling میرسی.
میبینی؟ یه سیستم ساده چطور با دوتا نیاز بیزنسی که اول مشخص نبود، پیچیده شد؟ این مثال رو زدم که بگم یه پروژه مثل فروشگاه زدن اصلاً چشمگیر نیست. با همونم شاید شغل بگیری، ولی اگه میخوای سریعتر شغل پیدا کنی، برو یه پروژه استارت بزن که واقعاً به دردت بخوره و یه مشکلی که داری رو حل کنه.
پس من میگم طبق قانون gall سیستم complex ای که کار کنه به دنیا نمیاد, بلکه سیستم ساده ای بود که کار میکرد و به سیستم complex بلوغ پیدا کرده. یک مقاله خیلی قشنگ راجب همین قانون.
مثال؟ یه نگاه به گیتهاب من بنداز. همه پروژههام اینطوریه. از لینکدین کراولر گرفته تا کلودفلیر کراولر و aioclock. همه برای این ساخته شدن که یه مشکلی که داشتم رو حل کنن.
@PyBackendHub
Signal Processing Stack Exchange
Sampling of band-limited white noise
The context is communication where we have a front-end that samples a signal and a noise (but here we focus only on the noise). My goal is to determine the noise power that I should use to simulate...
👍7❤5👏1
سلام به همه. گاهی اوقات پیش میاد که دوستان کدهاشون رو برای من می فرستن و میگن نظر بده. و اگه نکته ای هست بهم بگو و... اگه توی کانال پروژه های دوستان رو بزارم (با رضایت خودشون) بررسی می کنید و نظر می دید؟
Final Results
23%
دیدن نتایج
41%
بله. حتما
7%
نه. وقت نمی کنم
24%
بله. اگه حال داشته باشم
4%
نه. من رایگان به کسی راهنمایی نمیدم
2%
گزینه مد نظر من توی اینا نیست. لذا کامنت/پیام میدم
👍2❤1👎1
جنگولرن
سلام به همه. گاهی اوقات پیش میاد که دوستان کدهاشون رو برای من می فرستن و میگن نظر بده. و اگه نکته ای هست بهم بگو و... اگه توی کانال پروژه های دوستان رو بزارم (با رضایت خودشون) بررسی می کنید و نظر می دید؟
خب دوستان
پیرو نظرسنجی بالا 👆🏻
هر کسی تمایل داره کدهاش توسط اعضای کانال جنگولرن بررسی بشه.
✔️و ظرفیت دریافت انتقادات مهلک رو داره (که باعث پیشرفت میشه قطعا)
به صورت خصوصی با من در ارتباط باشه. آیدی من @miladhzz
✔️بعضی کدهارو هم می تونیم به صورت "برنامه نویس ناشناس" قرار بدیم، که هر کسی بتونه توی این حرکت شرکت کنه.
✔️و حتی بعضی نظرات هم می تونید خصوصی بفرستید و من به عنوان "منتقد ناشناس" زیر پروژه مورد نظر قرار بدم.
هر نظری یا پیشنهادی در این مورد دارید به @miladhzz پیام بدید
پیرو نظرسنجی بالا 👆🏻
هر کسی تمایل داره کدهاش توسط اعضای کانال جنگولرن بررسی بشه.
✔️و ظرفیت دریافت انتقادات مهلک رو داره (که باعث پیشرفت میشه قطعا)
به صورت خصوصی با من در ارتباط باشه. آیدی من @miladhzz
✔️بعضی کدهارو هم می تونیم به صورت "برنامه نویس ناشناس" قرار بدیم، که هر کسی بتونه توی این حرکت شرکت کنه.
✔️و حتی بعضی نظرات هم می تونید خصوصی بفرستید و من به عنوان "منتقد ناشناس" زیر پروژه مورد نظر قرار بدم.
هر نظری یا پیشنهادی در این مورد دارید به @miladhzz پیام بدید
👍4
✅اولین پروژه برای حمله 😂
با fastapi ساختش. که من بلد نیستم.
اگه نظری دارید و نمیخواهید توی کامنت های این پست بنویسیدش خصوصی برام بفرستید. آیدی من @miladhzz
نکته: هر نظری اوکیه. فقط بی احترامی یا تحقیر و امثالهم نباشه. ممنون
✔️توضیحاتش:
این یکی از اولین پروژه هایی هست که زدم با fastapi و کوچیک هست با این حال مشتاقم دوستان نظر بدن و اگه جای رشد یا اصلاح داره بهم بگن ❤️
https://github.com/meower1/Warpgen
با fastapi ساختش. که من بلد نیستم.
اگه نظری دارید و نمیخواهید توی کامنت های این پست بنویسیدش خصوصی برام بفرستید. آیدی من @miladhzz
نکته: هر نظری اوکیه. فقط بی احترامی یا تحقیر و امثالهم نباشه. ممنون
✔️توضیحاتش:
این یکی از اولین پروژه هایی هست که زدم با fastapi و کوچیک هست با این حال مشتاقم دوستان نظر بدن و اگه جای رشد یا اصلاح داره بهم بگن ❤️
https://github.com/meower1/Warpgen
GitHub
GitHub - meower1/Warpgen: 🎸 API to scrape warp+ keys from telegram channel every hour written in FastAPI
🎸 API to scrape warp+ keys from telegram channel every hour written in FastAPI - GitHub - meower1/Warpgen: 🎸 API to scrape warp+ keys from telegram channel every hour written in FastAPI
👍4❤1
Forwarded from Ninja Learn | نینجا لرن
💎 ابزار Django debug toolbar 💎
امروز میخوایم دربارهٔ یه ابزار فوقالعاده برای دیباگ کردن توی پروژههای جنگویی صحبت کنیم: Django Debug Toolbar. این ابزار میتونه بهتون کمک کنه تا جزئیات دقیق درخواستها، کوئریهای پایگاه داده، قالبها و خیلی چیزای دیگه رو ببینید و مشکلات پروژهتون رو سریعتر پیدا و برطرف کنید. توی این پست قراره قدم به قدم نحوهٔ نصب و استفاده از این ابزار رو توضیح بدم. 🚀
1. نصب Django Debug Toolbarبرای شروع، باید Django Debug Toolbar رو نصب کنید :
این ابزار بهراحتی از طریق pip قابل نصب هست. کافیه ترمینال رو باز کنید و این دستور رو وارد کنید: 💻
با این کار، پکیج مورد نیاز نصب میشه. ✅
2. اضافه کردن به تنظیمات پروژه :
حالا باید Django Debug Toolbar رو به تنظیمات پروژهٔ جنگوییتون اضافه کنید. برای این کار، فایل settings.py رو باز کنید و این کدرو رو به تنظیمات اضافه کنید: 🛠️
اضافه کردن به INSTALLED_APPS:
اضافه کردن به MIDDLEWARE:
با این کار، Django Debug Toolbar به پروژهتون اضافه میشه و میتونید ازش استفاده کنید. 🎉
3. تنظیم آیپیهای مجازبرای اینکه این ابزار بتونه توی مرورگر نمایش داده بشه، باید آیپیهایی که برای دیباگ تولبار مجاز هستن رو تنظیم کنید. معمولاً برای توسعه توی لوکال از 127.0.0.1 استفاده میکنیم. بنابراین، این خط رو به settings.py اضافه کنید: 🌐
این تنظیمات به تولبار میگه که فقط وقتی از این آیپی درخواست میاد، نمایش داده بشه. 👀
4. اضافه کردن URLهای مربوطه حالا باید URLهای مربوط به Django Debug Toolbar رو به پروژهتون اضافه کنید. برای این کار، فایل urls.py رو باز کنید و این خطوط رو اضافه کنید: 🌍
این کار باعث میشه که وقتی پروژه توی حالت DEBUG هست، تولبار فعال بشه و URLهای مربوط به اون هم در دسترس باشن. 🔧
5. استفاده از Django Debug Toolbar حالا دیگه کارمون تمومه! کافیه سرور جنگو رو دوباره راهاندازی کنید و یکی از صفحات پروژهتون رو باز کنید. اگه همه چیز درست پیش رفته باشه، یه نوار ابزار (Toolbar) در سمت راست صفحه نمایش داده میشه.
این نوار ابزار اطلاعات خیلی مفیدی دربارهٔ درخواست HTTP، کوئریهای پایگاه داده، قالبها، تنظیمات و موارد دیگه بهتون نشون میده.
مثلاً با استفاده از این ابزار میتونید ببینید چه کوئریهایی به پایگاه داده زده شده، چقدر زمان برده و جای بهینهسازی داره یا نه.
همچنین میتونید اطلاعات مربوط به درخواستها و پاسخهای HTTP رو بهدست بیارید و از نحوهٔ پردازش درخواستها در سمت سرور مطلع بشید. 🔍
جمعبندی ✅
فهمیدیم Django Debug Toolbar ابزاری قدرتمنده که میتونه خیلی بهتون کمک کنه تا پروژههاتون رو بهینه تر کنید و مشکلات رو سریع تر پیدا کنید.
پیشنهاد میکنم حتماً امتحانش کنید و ببینید چقدر کارتون رو راحتتر میکنه. 💪
دراینده یه ویدیو هم درمورش ضبط میکنیم
امید وارم براتون مفید بوده باشه :)
@ninja_learn_ir
امروز میخوایم دربارهٔ یه ابزار فوقالعاده برای دیباگ کردن توی پروژههای جنگویی صحبت کنیم: Django Debug Toolbar. این ابزار میتونه بهتون کمک کنه تا جزئیات دقیق درخواستها، کوئریهای پایگاه داده، قالبها و خیلی چیزای دیگه رو ببینید و مشکلات پروژهتون رو سریعتر پیدا و برطرف کنید. توی این پست قراره قدم به قدم نحوهٔ نصب و استفاده از این ابزار رو توضیح بدم. 🚀
1. نصب Django Debug Toolbarبرای شروع، باید Django Debug Toolbar رو نصب کنید :
این ابزار بهراحتی از طریق pip قابل نصب هست. کافیه ترمینال رو باز کنید و این دستور رو وارد کنید: 💻
pip install django-debug-toolbar
با این کار، پکیج مورد نیاز نصب میشه. ✅
2. اضافه کردن به تنظیمات پروژه :
حالا باید Django Debug Toolbar رو به تنظیمات پروژهٔ جنگوییتون اضافه کنید. برای این کار، فایل settings.py رو باز کنید و این کدرو رو به تنظیمات اضافه کنید: 🛠️
اضافه کردن به INSTALLED_APPS:
INSTALLED_APPS = [
...
'debug_toolbar',
]
اضافه کردن به MIDDLEWARE:
MIDDLEWARE = [
...
'debug_toolbar.middleware.DebugToolbarMiddleware',
]
با این کار، Django Debug Toolbar به پروژهتون اضافه میشه و میتونید ازش استفاده کنید. 🎉
3. تنظیم آیپیهای مجازبرای اینکه این ابزار بتونه توی مرورگر نمایش داده بشه، باید آیپیهایی که برای دیباگ تولبار مجاز هستن رو تنظیم کنید. معمولاً برای توسعه توی لوکال از 127.0.0.1 استفاده میکنیم. بنابراین، این خط رو به settings.py اضافه کنید: 🌐
INTERNAL_IPS = [
'127.0.0.1',
]
این تنظیمات به تولبار میگه که فقط وقتی از این آیپی درخواست میاد، نمایش داده بشه. 👀
4. اضافه کردن URLهای مربوطه حالا باید URLهای مربوط به Django Debug Toolbar رو به پروژهتون اضافه کنید. برای این کار، فایل urls.py رو باز کنید و این خطوط رو اضافه کنید: 🌍
django.conf import settings
from django.conf.urls import include
from django.urls import path
if settings.DEBUG:
import debug_toolbar
urlpatterns = [
path('__debug__/', include(debug_toolbar.urls)),
] + urlpatterns
این کار باعث میشه که وقتی پروژه توی حالت DEBUG هست، تولبار فعال بشه و URLهای مربوط به اون هم در دسترس باشن. 🔧
5. استفاده از Django Debug Toolbar حالا دیگه کارمون تمومه! کافیه سرور جنگو رو دوباره راهاندازی کنید و یکی از صفحات پروژهتون رو باز کنید. اگه همه چیز درست پیش رفته باشه، یه نوار ابزار (Toolbar) در سمت راست صفحه نمایش داده میشه.
این نوار ابزار اطلاعات خیلی مفیدی دربارهٔ درخواست HTTP، کوئریهای پایگاه داده، قالبها، تنظیمات و موارد دیگه بهتون نشون میده.
مثلاً با استفاده از این ابزار میتونید ببینید چه کوئریهایی به پایگاه داده زده شده، چقدر زمان برده و جای بهینهسازی داره یا نه.
همچنین میتونید اطلاعات مربوط به درخواستها و پاسخهای HTTP رو بهدست بیارید و از نحوهٔ پردازش درخواستها در سمت سرور مطلع بشید. 🔍
جمعبندی ✅
فهمیدیم Django Debug Toolbar ابزاری قدرتمنده که میتونه خیلی بهتون کمک کنه تا پروژههاتون رو بهینه تر کنید و مشکلات رو سریع تر پیدا کنید.
پیشنهاد میکنم حتماً امتحانش کنید و ببینید چقدر کارتون رو راحتتر میکنه. 💪
دراینده یه ویدیو هم درمورش ضبط میکنیم
❤4👍3
Forwarded from Golem Course
یک توصیه دوستانه
همیشه، چه در محیط کاری و چه در محیط دانشگاهی، یک سند از تمام فعالیتها و کارهایی که انجام دادهاید را مانند یک دفترچه خاطرات داشته باشید. در انگلیسی به این سند Career Journal یا Professional Development Log میگویند.
فایده این کار چیست؟ فرض کنید سه سال گذشته و میخواهید رزومهتان را بهروزرسانی کنید. به جای آن که به حافظهتان اکتفا کنید تا سه چهار بولتپوینت برای آن موقعیت شغلی بنویسید یا در کاور لتر در یک یا دو پاراگراف کاری که کردهاید را توصیف کنید، میتوانید به آن سند مراجعه کنید. در واقع، این سند خاطرات شما، منبع دانش شما از فعالیت حرفهایتان است.
یک مزیت دیگر هم دارد. پیشرفت خودتان را در طول مسیر مشاهده میکنید. میبینید که چقدر کار کردهاید، چقدر یاد گرفتهاید و چقدر باعث بهبود وضعیت موجود شدهاید.
@golemcourse
همیشه، چه در محیط کاری و چه در محیط دانشگاهی، یک سند از تمام فعالیتها و کارهایی که انجام دادهاید را مانند یک دفترچه خاطرات داشته باشید. در انگلیسی به این سند Career Journal یا Professional Development Log میگویند.
فایده این کار چیست؟ فرض کنید سه سال گذشته و میخواهید رزومهتان را بهروزرسانی کنید. به جای آن که به حافظهتان اکتفا کنید تا سه چهار بولتپوینت برای آن موقعیت شغلی بنویسید یا در کاور لتر در یک یا دو پاراگراف کاری که کردهاید را توصیف کنید، میتوانید به آن سند مراجعه کنید. در واقع، این سند خاطرات شما، منبع دانش شما از فعالیت حرفهایتان است.
یک مزیت دیگر هم دارد. پیشرفت خودتان را در طول مسیر مشاهده میکنید. میبینید که چقدر کار کردهاید، چقدر یاد گرفتهاید و چقدر باعث بهبود وضعیت موجود شدهاید.
@golemcourse
👍18👏7🔥2
Forwarded from محمد خشنوا / برنامه نویسی (SeYeD.Dev)
چطور برای یک ربات تلگرام از زرین پال، درگاه پرداخت گرفتم ؟
من یک ربات تلگرام داشتم مینوشتم که نیاز به درگاه پرداخت داشتم، رفتم سراغ سایت زرین پال و بعد از لاگین خواستم برم تیکت بدم که آیا به ربات تلگرام هم درگاه میدید ؟ که یک بخشی دیدم که چطور برای اپلیکیشن یا ربات میتونید درگاه بگیرید
بعد توی توضیحات نوشته بود که باید یک سایت بزنید و توی اون از اپلیکیشنتون یکسری اطلاعات بدید که چیکارا میکنه و شماره تلفن و ایمیل هم توی اون باشه
خب من حوصله نوشتن کد برای سایت نداشتم🥲 ولی چند روز قبلش یک دامنه خریده بودم برای رباته گفتم شاید لازم بشه، باید چیکار میکردم ؟
رفتم سراغ هوش مصنوعی claude.ai و دیدم که شماره تلفن مجازی گوگلم رو قبول نمیکنه، از سایت نامبرلند یک شماره ۷ هزار و ۵۰۰ تومنی برای claude.ai خریدم و رفتم توش ثبت نام کردم
به claude.ai با پرامپت فارسی گفتم که یک سایت با html css bootstrap میخوام که در مورد چنین چیزی یکسری توضیحات بده و توی یکسری کارت نشونش بده و از اموجی های مرتبط هم استفاده کنه و ... با تشکر ازش کد رو بهم داد و رفتم یک پروژه چند خطی fastapi زدم که تمپلت هام رو لود کنه (چون نمیخواستم سایت استاتیک باشه رفتم سراغ fastapi ، چون که باید کالبک برگشتی از درگاه پرداخت هم هندل کنم)
خب کد رو زدم و خواستم ببرم روی سرور ران کنم که ...... ای دل غافل، پورت های ۸۰ و ۴۴۳ اشغال هستن و اگر میخواستم توی وب سرور دست ببرم خیلی زمان میبرد
پروژه رو روی پورت 7575 ران کردم و رفتم سراغ کلادفلر و توی بخش DNS یک رکورد @ زدم روی دامنه و IP سرور رو بهش دادم، از بخش Rules وارد بخش Origin Rules شدم و یک رول جدید تعریف کردم
از این قسمت : When incoming requests match…
مقدار Field رو گذاشتم روی Hostname و توی بخش Value آدرس دامنه رو زدم
پایینترش از قسمت Destination Port گزینه Rewrite to رو زدم و پورت 7575 رو وارد کردم، بعدش هم رول رو ذخیره کردم
خب سایت اومد بالا و از طریق دامنه در دسترس بود، بدون اینکه من روی پورت 80,443 ران کنم
رفتم سراغ زرین پال و دامنه رو ثبت کردم که بهم درگاه بده، اما سریع درخواستم رد شد 😢
تیکت زد و گفت enamad نداری ولی ناراحت نباش که میتونی از لینک زیر یک مبلغی پرداخت کنه (یک کد تخفیف هم داد) و ما خودمون برات میگیریم، مبلغ رو (با تخفیف ۳۰۰ هزار تومان) پرداخت کردم و اطلاع دادم، فرداش بهم اعلام کردن که فلان کد رو توی title سایتت بصورت موقت بزار تا enamad تایید بشه، این وسط ها هم چندتا تماس باهام گرفتن که یک قسمتی گفت این شماره ای که توی زرین پال وارد کردی از دسترست خارج شده ؟ گفتم اره و زحمت کشیدن و تغییرش دادن برام(با ایمیل لاگین میشدم)
با توجه به اینکه از قبل کد مالیاتی داشتم فقط یک اسکرین شات از سازمان امور مالیاتی خواستن که تا گام ۴ رو پیش رفته باشم و بعدش گفتن صبر کنید تا درگاه فعال بشه، که چند دقیقه بعدش فعال شد و از طرف شاپرک هم تایید شد.
@SEYED_BAX
من یک ربات تلگرام داشتم مینوشتم که نیاز به درگاه پرداخت داشتم، رفتم سراغ سایت زرین پال و بعد از لاگین خواستم برم تیکت بدم که آیا به ربات تلگرام هم درگاه میدید ؟ که یک بخشی دیدم که چطور برای اپلیکیشن یا ربات میتونید درگاه بگیرید
بعد توی توضیحات نوشته بود که باید یک سایت بزنید و توی اون از اپلیکیشنتون یکسری اطلاعات بدید که چیکارا میکنه و شماره تلفن و ایمیل هم توی اون باشه
خب من حوصله نوشتن کد برای سایت نداشتم🥲 ولی چند روز قبلش یک دامنه خریده بودم برای رباته گفتم شاید لازم بشه، باید چیکار میکردم ؟
رفتم سراغ هوش مصنوعی claude.ai و دیدم که شماره تلفن مجازی گوگلم رو قبول نمیکنه، از سایت نامبرلند یک شماره ۷ هزار و ۵۰۰ تومنی برای claude.ai خریدم و رفتم توش ثبت نام کردم
به claude.ai با پرامپت فارسی گفتم که یک سایت با html css bootstrap میخوام که در مورد چنین چیزی یکسری توضیحات بده و توی یکسری کارت نشونش بده و از اموجی های مرتبط هم استفاده کنه و ... با تشکر ازش کد رو بهم داد و رفتم یک پروژه چند خطی fastapi زدم که تمپلت هام رو لود کنه (چون نمیخواستم سایت استاتیک باشه رفتم سراغ fastapi ، چون که باید کالبک برگشتی از درگاه پرداخت هم هندل کنم)
خب کد رو زدم و خواستم ببرم روی سرور ران کنم که ...... ای دل غافل، پورت های ۸۰ و ۴۴۳ اشغال هستن و اگر میخواستم توی وب سرور دست ببرم خیلی زمان میبرد
پروژه رو روی پورت 7575 ران کردم و رفتم سراغ کلادفلر و توی بخش DNS یک رکورد @ زدم روی دامنه و IP سرور رو بهش دادم، از بخش Rules وارد بخش Origin Rules شدم و یک رول جدید تعریف کردم
از این قسمت : When incoming requests match…
مقدار Field رو گذاشتم روی Hostname و توی بخش Value آدرس دامنه رو زدم
پایینترش از قسمت Destination Port گزینه Rewrite to رو زدم و پورت 7575 رو وارد کردم، بعدش هم رول رو ذخیره کردم
خب سایت اومد بالا و از طریق دامنه در دسترس بود، بدون اینکه من روی پورت 80,443 ران کنم
رفتم سراغ زرین پال و دامنه رو ثبت کردم که بهم درگاه بده، اما سریع درخواستم رد شد 😢
تیکت زد و گفت enamad نداری ولی ناراحت نباش که میتونی از لینک زیر یک مبلغی پرداخت کنه (یک کد تخفیف هم داد) و ما خودمون برات میگیریم، مبلغ رو (با تخفیف ۳۰۰ هزار تومان) پرداخت کردم و اطلاع دادم، فرداش بهم اعلام کردن که فلان کد رو توی title سایتت بصورت موقت بزار تا enamad تایید بشه، این وسط ها هم چندتا تماس باهام گرفتن که یک قسمتی گفت این شماره ای که توی زرین پال وارد کردی از دسترست خارج شده ؟ گفتم اره و زحمت کشیدن و تغییرش دادن برام(با ایمیل لاگین میشدم)
با توجه به اینکه از قبل کد مالیاتی داشتم فقط یک اسکرین شات از سازمان امور مالیاتی خواستن که تا گام ۴ رو پیش رفته باشم و بعدش گفتن صبر کنید تا درگاه فعال بشه، که چند دقیقه بعدش فعال شد و از طرف شاپرک هم تایید شد.
@SEYED_BAX
👍14
Forwarded from 🧑💻Cyber.vision🧑💻
توی برنامه نویسی زیادی خسیس نباشید
اگه ذهنیتتون به سمتی بره که همیشه در حال محاسبه باشه چه حرکتی بزنم که حافظه کمتر و سرعت بیشتری داشته باشه توی باتلاق میفتید و قدرت ساختن یه سیستم بزرگ و انعطاف پذیر رو از دست میدید.
بعضی مواقع انقدری به سمت الگوریتم میریم که داریم به کلیت سیستم آسیب میزنیم مثلا قراره یه دیتایی ارسال کنیم بجای اینکه به این شکل ارسال کنیم
{"name":"linuxor","type":"channel"}
میایم یه صرفه جویی کثیف میکنیم
["linuxor",2]
ما اینجا توی حافظه صرفه جویی کردیم ولی هر جایی بخوایم از این دیتا استفاده کنیم باید بدونیم ایندکس صفرم name هست و ایندکس یکم type و عدد 2 هم برای type یعنی channel این یعنی نیاز به مستندات بیشتر.
درسته حافظه کمتری مصرف کردیم ولی قدرت خوانایی کد رو آوردیم پایین در واقع با بهتر کردن یه بخش جزئی سیستم به کلیت سیستم آسیب زدیم، و اگه این کارو هی توی بخش های مختلف سیستم تکرار کنیم در نهایت به جایی میرسیم که دیگه صرفه نداره سیستم رو توسعه بدیم.
اگه ذهنیتتون به سمتی بره که همیشه در حال محاسبه باشه چه حرکتی بزنم که حافظه کمتر و سرعت بیشتری داشته باشه توی باتلاق میفتید و قدرت ساختن یه سیستم بزرگ و انعطاف پذیر رو از دست میدید.
بعضی مواقع انقدری به سمت الگوریتم میریم که داریم به کلیت سیستم آسیب میزنیم مثلا قراره یه دیتایی ارسال کنیم بجای اینکه به این شکل ارسال کنیم
{"name":"linuxor","type":"channel"}
میایم یه صرفه جویی کثیف میکنیم
["linuxor",2]
ما اینجا توی حافظه صرفه جویی کردیم ولی هر جایی بخوایم از این دیتا استفاده کنیم باید بدونیم ایندکس صفرم name هست و ایندکس یکم type و عدد 2 هم برای type یعنی channel این یعنی نیاز به مستندات بیشتر.
درسته حافظه کمتری مصرف کردیم ولی قدرت خوانایی کد رو آوردیم پایین در واقع با بهتر کردن یه بخش جزئی سیستم به کلیت سیستم آسیب زدیم، و اگه این کارو هی توی بخش های مختلف سیستم تکرار کنیم در نهایت به جایی میرسیم که دیگه صرفه نداره سیستم رو توسعه بدیم.
👍42
Forwarded from نوشتههای ترمینالی
خیلی وقتا برای ما پیش میاد که تو یه برنچی کار میکنیم که میخوایم با main/master مرجش کنیم ولی کس دیگهای اول مرج میکنه برنچشو و ما conflict میخوریم.
حالا وقتی میخوایم کانفلیکتها رو حل کنیم میتونیم برنچ main رو با برنچ خودمون merge کنیم یا برنچ خودمون رو rebase کنیم به main جدید.
اینکه کدومش خوبه کدومش نه، جوابش بستگی دارهس!
تو تیمهایی که جونیور زیاد دارن توصیه میشه مرج کنید و تموم. اینطوری تاریخچه پیچیدهتری دارید (چون چرا یهو main تو یه برنچ مرج شده) ولی مجیک خاصی اتفاق نمیافته.
از طرفی rebase باعث میشه که یه تاریخچه شبیهسازی شده و جدید به وجود بیاد که توش کامیتهای برنچ جدید شما انگار بعد از آخرین کامیت main به وجود اومدن! برای کسی که بعدا نگاه کنه فهمش راحت تره ولی نکته اینه که چنین چیزی اصلا وجود نداشته و ممکنه مشکل لاجیکی تو کد ایجاد کنه.
تو این ویدیو این بحث رو خیلی خوب در قالب یه مکالمه توضیح دادن. توصیه میکنم ببینید.
https://www.youtube.com/watch?v=7gEbHsHXdn0
حالا وقتی میخوایم کانفلیکتها رو حل کنیم میتونیم برنچ main رو با برنچ خودمون merge کنیم یا برنچ خودمون رو rebase کنیم به main جدید.
اینکه کدومش خوبه کدومش نه، جوابش بستگی دارهس!
تو تیمهایی که جونیور زیاد دارن توصیه میشه مرج کنید و تموم. اینطوری تاریخچه پیچیدهتری دارید (چون چرا یهو main تو یه برنچ مرج شده) ولی مجیک خاصی اتفاق نمیافته.
از طرفی rebase باعث میشه که یه تاریخچه شبیهسازی شده و جدید به وجود بیاد که توش کامیتهای برنچ جدید شما انگار بعد از آخرین کامیت main به وجود اومدن! برای کسی که بعدا نگاه کنه فهمش راحت تره ولی نکته اینه که چنین چیزی اصلا وجود نداشته و ممکنه مشکل لاجیکی تو کد ایجاد کنه.
تو این ویدیو این بحث رو خیلی خوب در قالب یه مکالمه توضیح دادن. توصیه میکنم ببینید.
https://www.youtube.com/watch?v=7gEbHsHXdn0
YouTube
You only Git Merge?!? feat Theo : DevHour #1
Theo is a former twitch (5 years) and now currently runs ping.gg where he codes amazing software for streamers. We debate the pros and cons of git rebase vs git merge
### Finding Theo
https://twitter.com/t3dotgg
https://twitch.tv/Theo
https://www.youtu…
### Finding Theo
https://twitter.com/t3dotgg
https://twitch.tv/Theo
https://www.youtu…
👍3
Forwarded from Ninja Learn | نینجا لرن
💎 شورت کات ها درجنگو 💎
توی این پست میخوام درمورد یکسری شورتکات هایی که کمتر کسی بهشون توجه میکنه رو معرفی کنم
1⃣
این شورتکات یه پله بالا تر از
2⃣
اگه تا حالا از
3⃣
شاید با
4⃣
اگه دوست داری یه ارور 404 رو مستقیم دستی بندازی،
5⃣
اگه تو پروژههای پیچیدهتر میخوای بدونی که کاربر الان تو کدوم سایت یا دامنه قرار داره (مثلا تو پروژههایی که از multi-site استفاده میکنن)،
این شورتکاتها میتونن واقعاً تو پروژههای پیچیدهتر جنگویی به کارت بیان و کارت رو راحت تر کنن.
امیدوارم این لیست براتون مفید باشه ✌️
@ninja_learn_ir
توی این پست میخوام درمورد یکسری شورتکات هایی که کمتر کسی بهشون توجه میکنه رو معرفی کنم
1⃣
render_to_string
🧩این شورتکات یه پله بالا تر از
render
هست. اگه میخوای تمپلیت رو به یه رشته (string) تبدیل کنی، مثلا برای ارسال ایمیل یا ساختن پیام خاص، render_to_string
کارت رو راه میندازه. خیلی شیک و مجلسی میتونی تمپلیت رو رندر کنی و به جای HTML کامل، فقط رشته رو داشته باشی:from django.template.loader import render_to_string
def send_email():
message = render_to_string('email_template.html', {'key': 'value'})
# حالا میتونی message رو به عنوان متن ایمیل بفرستی
2⃣
resolve_url
🔗اگه تا حالا از
reverse
استفاده کردی، این یکی هم خیلی شبیه به اونه ولی یه خورده هوشمندتر. resolve_url
میتونه هم نام ویو رو به URL تبدیل کنه و هم خودش چک میکنه که اگه ورودی URL باشه، مستقیم همون رو برگردونه. پس دیگه نیاز نیست نگران باشی چی بهش میدی:from django.shortcuts import resolve_url
def my_view(request):
url = resolve_url('some-view-name-or-url')
# ادامه کارا
3⃣
HttpResponsePermanentRedirect
🚦شاید با
HttpResponseRedirect
آشنا باشی، ولی این یکی یه Redirect دائمی (کد 301) برمیگردونه. این وقتی خوبه که میخوای URL جدید رو دائمی کنی و به موتورهای جستجو بگی که این مسیر دیگه همیشه اینجاست:from django.http import HttpResponsePermanentRedirect
def my_view(request):
return HttpResponsePermanentRedirect('/new-url/')
4⃣
Http404
🚫اگه دوست داری یه ارور 404 رو مستقیم دستی بندازی،
Http404
بهترین گزینهست. این طوری میتونی خودت خیلی شیک کنترل کنی که کجاها ارور 404 داده بشه:from django.shortcuts import Http404
def my_view(request):
if not some_condition:
raise Http404("این صفحه وجود نداره!")
# ادامه کارا
5⃣
get_current_site
🌍اگه تو پروژههای پیچیدهتر میخوای بدونی که کاربر الان تو کدوم سایت یا دامنه قرار داره (مثلا تو پروژههایی که از multi-site استفاده میکنن)،
get_current_site
خیلی کاربردیه:from django.contrib.sites.shortcuts import get_current_site
def my_view(request):
current_site = get_current_site(request)
# حالا میتونی با current_site هر کاری کنی
این شورتکاتها میتونن واقعاً تو پروژههای پیچیدهتر جنگویی به کارت بیان و کارت رو راحت تر کنن.
#Django #Python #کدنویسی #شورتکات #توسعه_وب #برنامه_نویسی
❤14👍2🔥1
Forwarded from Ninja Learn | نینجا لرن
یه مشکلی که همیشه باهاش سروکله میزنیم، اینه که دقیقاً چه فایلها و پوشههایی رو باید توی
خب، من یه راهحل توپ برات دارم! برو به سایت gitignore.io و اونجا اسم تکنولوژیای که باهاش کار میکنی، مثلاً Django، رو وارد کن. این سایت خودش یه لیست از فایلهایی که باید توی
با این کار، دیگه لازم نیست نگران باشی که چه فایلهایی به گیتت اضافه شدن! راحت و بیدردسر.
@ninja_learn_ir
.gitignore
بذاریم؟ 🤔خب، من یه راهحل توپ برات دارم! برو به سایت gitignore.io و اونجا اسم تکنولوژیای که باهاش کار میکنی، مثلاً Django، رو وارد کن. این سایت خودش یه لیست از فایلهایی که باید توی
.gitignore
بذاری بهت میده.با این کار، دیگه لازم نیست نگران باشی که چه فایلهایی به گیتت اضافه شدن! راحت و بیدردسر.
#gitignore #ترفند
@ninja_learn_ir
Toptal
gitignore.io
Create useful .gitignore files for your project
🔥4👍3👏3
Forwarded from محمد خشنوا / برنامه نویسی (SeYeD.Dev)
سلام دوستان
همونطور که میدونید عکس بالا سخت ترین کار برای هر دولوپری هستش 😁
خیلی وقتا اون ترکیب بندی کلمات توی ذهن نمیاد، خیلی وقتا طولانی میشه متنش، حتی بعضی وقت ها نمیدونیم این تغییر که دادیم دقیقا چه نوعیه، feat, ref, chore و ...
این شد من یک برنامه کوچیک و جمع و جور نوشتم که بعد از اینکه فایل هاتون رو به stage اضافه کردید، با اجرای این برنامه توی دایرکتوری پروژه تون، از مدل Gemini-1.5-flash استفاده میکنه و بهتون چند تا commit message بر اساس تغییراتتون پیشنهاد میده
این لینک گیت هاب پروژه هست و ممنون میشم اگه خوشتون اومد با star دادن من رو خوشحال کنید:
https://github.com/ali-hv/comsu
همچنین اگه ایده ای براش دارید که میتونه بهترش کنه، ممنون میشم اگه میتونید pr بزنید یا بهم بگید تا من اعمال کنم.
#پست_حمایتی
@SEYED_BAX
همونطور که میدونید عکس بالا سخت ترین کار برای هر دولوپری هستش 😁
خیلی وقتا اون ترکیب بندی کلمات توی ذهن نمیاد، خیلی وقتا طولانی میشه متنش، حتی بعضی وقت ها نمیدونیم این تغییر که دادیم دقیقا چه نوعیه، feat, ref, chore و ...
این شد من یک برنامه کوچیک و جمع و جور نوشتم که بعد از اینکه فایل هاتون رو به stage اضافه کردید، با اجرای این برنامه توی دایرکتوری پروژه تون، از مدل Gemini-1.5-flash استفاده میکنه و بهتون چند تا commit message بر اساس تغییراتتون پیشنهاد میده
این لینک گیت هاب پروژه هست و ممنون میشم اگه خوشتون اومد با star دادن من رو خوشحال کنید:
https://github.com/ali-hv/comsu
همچنین اگه ایده ای براش دارید که میتونه بهترش کنه، ممنون میشم اگه میتونید pr بزنید یا بهم بگید تا من اعمال کنم.
#پست_حمایتی
@SEYED_BAX
🔥13👍6👏3
Forwarded from Ninja Learn | نینجا لرن
💎 مشکل همزمانی یا همون Concurrency Problem 💎
امروز میخوایم یه موضوع خیلی مهم و جذاب رو با هم موشکافی کنیم:
مشکل همزمانی یا همون Concurrency Problem 🤓 شاید اسمش به گوشتون خورده باشه، ولی اگه دقیقتر بشناسیدش، میفهمید که چرا این موضوع اینقدر تو دنیای برنامهنویسی مهمه.
همزمانی یعنی چی؟ 🤔
اول از همه، بگم که وقتی از همزمانی حرف میزنیم، داریم در مورد اجرای چند تا کار بهصورت همزمان تو یه برنامه صحبت میکنیم. مثلاً فرض کنید یه برنامه دارید که داره همزمان چند تا درخواست کاربر رو مدیریت میکنه، یا داره یه سری عملیاتهای محاسباتی سنگین رو انجام میده. اینجاست که مفهوم همزمانی مطرح میشه. هدف همزمانی اینه که بتونیم از منابع سیستم بهینهتر استفاده کنیم و سرعت اجرای برنامه رو بالا ببریم 🚀
مشکل از کجا شروع میشه؟ 😬
مشکل وقتی پیش میاد که چند تا ترد (Thread) یا پردازش (Process) به یه منبع مشترک دسترسی پیدا میکنن. مثلاً فرض کنید دو تا ترد همزمان دارن یه متغیر رو آپدیت میکنن. اینجاست که ممکنه مقدار نهایی اون متغیر چیزی که انتظار داشتیم نباشه و این یعنی Race Condition 🏁
مثال عملی Race Condition 🛠️
فرض کنید یه اپلیکیشن بانکی دارید که باید موجودی حساب کاربر رو مدیریت کنه. حالا دو تا ترد مختلف میخوان همزمان این موجودی رو آپدیت کنن. مثلاً یه ترد داره پول به حساب اضافه میکنه و ترد دیگه داره از حساب برداشت میکنه. اگه این دو تا ترد همزمان و بدون هماهنگی دقیق اجرا بشن، ممکنه موجودی حساب بهطور نادرست محاسبه بشه 😱 این اتفاق دقیقاً مثالی از Race Condition هست.
راهحلها چی هستن؟ 🔧
خب حالا که مشکل رو فهمیدیم، بیایید ببینیم چجوری میتونیم جلوی این مشکلات رو بگیریم:
1️⃣ Locks (قفلها) 🛡️:
یه راهحل معمول استفاده از قفلهاست. وقتی یه ترد میخواد به یه منبع مشترک دسترسی پیدا کنه، اول اون رو قفل میکنه. اینجوری بقیه تردها باید صبر کنن تا اون ترد کارش رو تموم کنه و قفل رو آزاد کنه. این کار میتونه از بههمریختگی جلوگیری کنه، ولی خودش یه چالش دیگه به نام Deadlock ایجاد میکنه، جایی که دو یا چند ترد منتظر قفلهای همدیگه هستن و هیچکدوم نمیتونن کارشون رو پیش ببرن 😩
2️⃣ Atomic Operations (عملیات اتمی) 💥:
این عملیاتها طوری طراحی شدن که یا کامل انجام میشن یا اصلاً انجام نمیشن. یعنی وسطشون هیچ ترد دیگهای نمیتونه دخالت کنه. مثلاً اضافه کردن یه مقدار به یه متغیر میتونه یه عملیات اتمی باشه.
3️⃣ Synchronization (همگامسازی) ⏰:
با همگامسازی میتونید مطمئن بشید که یه ترد قبل از اینکه ترد دیگه کارش تموم بشه، کاری رو شروع نکنه. این کار معمولاً با استفاده از دستوراتی مثل synchronized در جاوا یا پایتون انجام میشه.
4️⃣ Thread Pools (مجموعه تردها) 🏊:
استفاده از Thread Poolها میتونه به مدیریت بهتر تردها کمک کنه. اینجوری تعداد تردها محدود میشه و از مشکلاتی مثل Overhead جلوگیری میکنید.
مشکلات ناشی از راهحلها 🤯
حالا که از راهحلها گفتیم، یه نکته خیلی مهم رو هم باید اضافه کنم: همه این روشها مشکلات خودشون رو دارن. مثلاً استفاده زیاد از قفلها میتونه کارایی برنامه رو کاهش بده، چون تردها باید منتظر بمونن تا قفل آزاد بشه. از طرف دیگه، اگه قفلها رو درست مدیریت نکنید، ممکنه برنامهتون دچار Deadlock بشه و کلاً قفل بشه 😵
نتیجهگیری 🎯
مشکل همزمانی یه موضوع پیچیده و حساس تو برنامهنویسیه که اگه درست مدیریت نشه، میتونه مشکلات بزرگی رو ایجاد کنه. باید همیشه به این فکر کنید که چطور میتونید از منابع مشترک بهینه استفاده کنید، بدون اینکه برنامهتون دچار مشکلاتی مثل Race Condition یا Deadlock بشه. پس دفعه بعدی که داشتید یه برنامه چندتردی نوشتید، حتماً به این نکات فکر کنید و مطمئن بشید که بهترین راهحل رو انتخاب کردید ✅
مرسی که تا اینجا همراه من بودید، امیدوارم این توضیحات براتون مفید بوده باشه. اگه سوال یا نظری دارید حتماً تو کامنتا بنویسید 😁✌️
@ninja_learn_ir
امروز میخوایم یه موضوع خیلی مهم و جذاب رو با هم موشکافی کنیم:
مشکل همزمانی یا همون Concurrency Problem 🤓 شاید اسمش به گوشتون خورده باشه، ولی اگه دقیقتر بشناسیدش، میفهمید که چرا این موضوع اینقدر تو دنیای برنامهنویسی مهمه.
همزمانی یعنی چی؟ 🤔
اول از همه، بگم که وقتی از همزمانی حرف میزنیم، داریم در مورد اجرای چند تا کار بهصورت همزمان تو یه برنامه صحبت میکنیم. مثلاً فرض کنید یه برنامه دارید که داره همزمان چند تا درخواست کاربر رو مدیریت میکنه، یا داره یه سری عملیاتهای محاسباتی سنگین رو انجام میده. اینجاست که مفهوم همزمانی مطرح میشه. هدف همزمانی اینه که بتونیم از منابع سیستم بهینهتر استفاده کنیم و سرعت اجرای برنامه رو بالا ببریم 🚀
مشکل از کجا شروع میشه؟ 😬
مشکل وقتی پیش میاد که چند تا ترد (Thread) یا پردازش (Process) به یه منبع مشترک دسترسی پیدا میکنن. مثلاً فرض کنید دو تا ترد همزمان دارن یه متغیر رو آپدیت میکنن. اینجاست که ممکنه مقدار نهایی اون متغیر چیزی که انتظار داشتیم نباشه و این یعنی Race Condition 🏁
مثال عملی Race Condition 🛠️
فرض کنید یه اپلیکیشن بانکی دارید که باید موجودی حساب کاربر رو مدیریت کنه. حالا دو تا ترد مختلف میخوان همزمان این موجودی رو آپدیت کنن. مثلاً یه ترد داره پول به حساب اضافه میکنه و ترد دیگه داره از حساب برداشت میکنه. اگه این دو تا ترد همزمان و بدون هماهنگی دقیق اجرا بشن، ممکنه موجودی حساب بهطور نادرست محاسبه بشه 😱 این اتفاق دقیقاً مثالی از Race Condition هست.
راهحلها چی هستن؟ 🔧
خب حالا که مشکل رو فهمیدیم، بیایید ببینیم چجوری میتونیم جلوی این مشکلات رو بگیریم:
1️⃣ Locks (قفلها) 🛡️:
یه راهحل معمول استفاده از قفلهاست. وقتی یه ترد میخواد به یه منبع مشترک دسترسی پیدا کنه، اول اون رو قفل میکنه. اینجوری بقیه تردها باید صبر کنن تا اون ترد کارش رو تموم کنه و قفل رو آزاد کنه. این کار میتونه از بههمریختگی جلوگیری کنه، ولی خودش یه چالش دیگه به نام Deadlock ایجاد میکنه، جایی که دو یا چند ترد منتظر قفلهای همدیگه هستن و هیچکدوم نمیتونن کارشون رو پیش ببرن 😩
2️⃣ Atomic Operations (عملیات اتمی) 💥:
این عملیاتها طوری طراحی شدن که یا کامل انجام میشن یا اصلاً انجام نمیشن. یعنی وسطشون هیچ ترد دیگهای نمیتونه دخالت کنه. مثلاً اضافه کردن یه مقدار به یه متغیر میتونه یه عملیات اتمی باشه.
3️⃣ Synchronization (همگامسازی) ⏰:
با همگامسازی میتونید مطمئن بشید که یه ترد قبل از اینکه ترد دیگه کارش تموم بشه، کاری رو شروع نکنه. این کار معمولاً با استفاده از دستوراتی مثل synchronized در جاوا یا پایتون انجام میشه.
4️⃣ Thread Pools (مجموعه تردها) 🏊:
استفاده از Thread Poolها میتونه به مدیریت بهتر تردها کمک کنه. اینجوری تعداد تردها محدود میشه و از مشکلاتی مثل Overhead جلوگیری میکنید.
مشکلات ناشی از راهحلها 🤯
حالا که از راهحلها گفتیم، یه نکته خیلی مهم رو هم باید اضافه کنم: همه این روشها مشکلات خودشون رو دارن. مثلاً استفاده زیاد از قفلها میتونه کارایی برنامه رو کاهش بده، چون تردها باید منتظر بمونن تا قفل آزاد بشه. از طرف دیگه، اگه قفلها رو درست مدیریت نکنید، ممکنه برنامهتون دچار Deadlock بشه و کلاً قفل بشه 😵
نتیجهگیری 🎯
مشکل همزمانی یه موضوع پیچیده و حساس تو برنامهنویسیه که اگه درست مدیریت نشه، میتونه مشکلات بزرگی رو ایجاد کنه. باید همیشه به این فکر کنید که چطور میتونید از منابع مشترک بهینه استفاده کنید، بدون اینکه برنامهتون دچار مشکلاتی مثل Race Condition یا Deadlock بشه. پس دفعه بعدی که داشتید یه برنامه چندتردی نوشتید، حتماً به این نکات فکر کنید و مطمئن بشید که بهترین راهحل رو انتخاب کردید ✅
#Concurrency #برنامه_نویسی #مشکل_همزمانی #RaceCondition #Deadlock #Synchronization #Threading
YouTube | Instagram | Group
YouTube
Ninjalearn
خوش اومدی به Ninjalearn! 👋 اینجا قراره مسیر یادگیری برنامهنویسی و توسعه وب رو به یک تجربه جذاب و حرفهای تبدیل کنی! 💻
ما توی Ninjalearn باور داریم که هر کسی با راهنمایی درست و کمی انگیزه میتونه به یک توسعهدهنده موفق تبدیل بشه. برای همین، تیم ما که شامل…
ما توی Ninjalearn باور داریم که هر کسی با راهنمایی درست و کمی انگیزه میتونه به یک توسعهدهنده موفق تبدیل بشه. برای همین، تیم ما که شامل…
👍10❤1🔥1