صفحه بندی داده دادهها: Limit/Offset و Cursor-Based
وقتی صحبت از نمایش حجم زیادی از دادهها در صفحات مختلف میشه، استفاده از pagination ضروری میشه. دو روش رایج برای این کار وجود داره که هر کدوم سادگیها و چالشهای خاص خودشون رو دارن:
صفحه بندی با Limit و Offset سادگی ولی ...
صفحه بندی با Limit و Offset رو میشه سادهترین و اولین روشی دونست که به ذهن میرسه. شما به دیتابیس میگید "فقط Limit تا رکورد بهم بده" و "از Offset مشخصی شروع کن".
سادگی:
پیادهسازی خیلی آسونی داره.
برای صفحات اول که تعداد رکوردها کمه، عملکرد خوبی داره.
چالشها:
عملکرد ضعیف در صفحات بالا: با افزایش
مشکل تغییر دادهها: اگه در حین حرکت بین صفحات، دادهای اضافه یا حذف بشه، ممکنه رکوردهای تکراری ببینید یا بعضی از رکوردها رو از دست بدید.
مرتبسازی (Sorting): معمولاً نیازمند مرتبسازی روی یک فیلد ثابت هستید تا نتیجه قابل پیشبینی باشه.
مثال ساده (SQL):
برای گرفتن ۱۰ رکورد اول از جدول
برای گرفتن ۱۰ رکورد بعدی (صفحه ۲):
صفحه بندی با روش Cursor-Based Pagination: راه حلی برای مقیاسپذیری
صفحه بندی با Cursor-based pagination با استفاده از یک "نشانگر" (cursor) که معمولاً یک فیلد یکتا و مرتبسازی شده (مثل تاریخ ایجاد یا ID) هست، صفحه بعدی رو مشخص میکنه. به جای گفتن "صفحه N رو بیار"، میگیم "رکوردها رو از بعد از این نقطه مشخص بیار".
محدودیتها و نکتهها:
پیچیدگی پیادهسازی: نسبت به Limit/Offset کمی پیچیدهتره و نیازمند طراحی دقیقتر کوئریهاست.
مرتبسازی: باید همیشه بر اساس فیلد Cursor مرتبسازی انجام بشه. این یعنی نمیتونید هر جور دلتون خواست دادهها رو مرتب کنید.
پرش به صفحات دلخواه: معمولاً قابلیت "پرش به صفحه 5" رو نداره و فقط میتونید به صفحه بعدی یا قبلی برید (Next/Previous). مناسب برای فیدها و لیستهای طولانی: برای سیستمهایی مثل فید شبکههای اجتماعی که فقط به اسکرول کردن ادامه دار نیاز دارن و پرش به صفحه خاصی مطرح نیست، عالی عمل میکنه.
مثال ساده (SQL):
فرض کنید آخرین
#pagination #sql
@Syntax_fa
وقتی صحبت از نمایش حجم زیادی از دادهها در صفحات مختلف میشه، استفاده از pagination ضروری میشه. دو روش رایج برای این کار وجود داره که هر کدوم سادگیها و چالشهای خاص خودشون رو دارن:
صفحه بندی با Limit و Offset سادگی ولی ...
صفحه بندی با Limit و Offset رو میشه سادهترین و اولین روشی دونست که به ذهن میرسه. شما به دیتابیس میگید "فقط Limit تا رکورد بهم بده" و "از Offset مشخصی شروع کن".
سادگی:
پیادهسازی خیلی آسونی داره.
برای صفحات اول که تعداد رکوردها کمه، عملکرد خوبی داره.
چالشها:
عملکرد ضعیف در صفحات بالا: با افزایش
Offset
، دیتابیس مجبور میشه تعداد زیادی از رکوردها رو اسکن کنه و بعد اونا رو دور بندازه که باعث کندی شدید میشه.مشکل تغییر دادهها: اگه در حین حرکت بین صفحات، دادهای اضافه یا حذف بشه، ممکنه رکوردهای تکراری ببینید یا بعضی از رکوردها رو از دست بدید.
مرتبسازی (Sorting): معمولاً نیازمند مرتبسازی روی یک فیلد ثابت هستید تا نتیجه قابل پیشبینی باشه.
مثال ساده (SQL):
برای گرفتن ۱۰ رکورد اول از جدول
products
(صفحه ۱):SELECT *
FROM products
ORDER BY id
LIMIT 10 OFFSET 0;
برای گرفتن ۱۰ رکورد بعدی (صفحه ۲):
SELECT *
FROM products
ORDER BY id
LIMIT 10 OFFSET 10;
صفحه بندی با روش Cursor-Based Pagination: راه حلی برای مقیاسپذیری
صفحه بندی با Cursor-based pagination با استفاده از یک "نشانگر" (cursor) که معمولاً یک فیلد یکتا و مرتبسازی شده (مثل تاریخ ایجاد یا ID) هست، صفحه بعدی رو مشخص میکنه. به جای گفتن "صفحه N رو بیار"، میگیم "رکوردها رو از بعد از این نقطه مشخص بیار".
محدودیتها و نکتهها:
پیچیدگی پیادهسازی: نسبت به Limit/Offset کمی پیچیدهتره و نیازمند طراحی دقیقتر کوئریهاست.
مرتبسازی: باید همیشه بر اساس فیلد Cursor مرتبسازی انجام بشه. این یعنی نمیتونید هر جور دلتون خواست دادهها رو مرتب کنید.
پرش به صفحات دلخواه: معمولاً قابلیت "پرش به صفحه 5" رو نداره و فقط میتونید به صفحه بعدی یا قبلی برید (Next/Previous). مناسب برای فیدها و لیستهای طولانی: برای سیستمهایی مثل فید شبکههای اجتماعی که فقط به اسکرول کردن ادامه دار نیاز دارن و پرش به صفحه خاصی مطرح نیست، عالی عمل میکنه.
مثال ساده (SQL):
فرض کنید آخرین
id
محصولی که در صفحه قبلی دیدهاید 1234
بوده:SELECT *
FROM products
WHERE id > 1234
ORDER BY id
LIMIT 10;
#pagination #sql
@Syntax_fa
👍9😁1
در ردیس وقتی ttl یک کلید رو میگیریم، اگه کلید وجود نداشته باشه مقدار بازگشتی:
Anonymous Quiz
23%
مساوی با 0 هستش
44%
مساوی با null هستش
9%
مساوی با -2 هستش
25%
مساوی با -1 هستش
👍5👎1👏1
اگه حس میکنی توی زندگی گم شدی، شاید به این خاطره که داری از نقشه یه نفر دیگه استفاده میکنی!
خیلی از ما ناخودآگاه دنبال راه و رسم بقیه میریم؛ مثلا چون آقای X کارش گرفته و ایده خانم Y ترکیده، ما هم با تقلید همون راه رو میریم!!!
یه چنل یوتیوب بزنم مثل فلانی ... یه پیج اینستاگرام بزنم مثل بمانی ... پایه ای پادکست بزنیم پول پارو کنیم؟ حاجی ترید مثل آب خوردنه بزنیم تو کارش؟
این وسط یه سوال مهم فراموش میشه! ما واقعا مناسب این کارها هستیم؟ روحیاتمون و شرایط خانوادگیمون این اجازه رو میده؟
اکثر این نقشهها مال بقیه ست و مخصوص خودشونه. اگه بخوای راه خودت رو پیدا کنی، باید بشینی و ببینی با توجه به وضعیتت چه چیزی مناسبته!
این روزها همه دارن یوتیوبر میشن ولی قطعا بالای 90 درصدشون شکست میخورن. دلیل؟ تولیدمحتوای ویدیویی در یک بازه زمانی طولانی کار هرکسی نیست و با شرایط زندگی همه آدمها جور در نمیاد.
بهتره بریم سراغ ارزشهای غیرتحمیلی! چیزی که حاصل عشق و تفکر خودمونه نه تحمیل جامعه و سوشال مدیا ...
کولهبار شکستهامون رو با رفتارهای هیجانی سنگینتر نکنیم.
کانال منبع:
source
@Syntax_fa
خیلی از ما ناخودآگاه دنبال راه و رسم بقیه میریم؛ مثلا چون آقای X کارش گرفته و ایده خانم Y ترکیده، ما هم با تقلید همون راه رو میریم!!!
یه چنل یوتیوب بزنم مثل فلانی ... یه پیج اینستاگرام بزنم مثل بمانی ... پایه ای پادکست بزنیم پول پارو کنیم؟ حاجی ترید مثل آب خوردنه بزنیم تو کارش؟
این وسط یه سوال مهم فراموش میشه! ما واقعا مناسب این کارها هستیم؟ روحیاتمون و شرایط خانوادگیمون این اجازه رو میده؟
اکثر این نقشهها مال بقیه ست و مخصوص خودشونه. اگه بخوای راه خودت رو پیدا کنی، باید بشینی و ببینی با توجه به وضعیتت چه چیزی مناسبته!
این روزها همه دارن یوتیوبر میشن ولی قطعا بالای 90 درصدشون شکست میخورن. دلیل؟ تولیدمحتوای ویدیویی در یک بازه زمانی طولانی کار هرکسی نیست و با شرایط زندگی همه آدمها جور در نمیاد.
بهتره بریم سراغ ارزشهای غیرتحمیلی! چیزی که حاصل عشق و تفکر خودمونه نه تحمیل جامعه و سوشال مدیا ...
کولهبار شکستهامون رو با رفتارهای هیجانی سنگینتر نکنیم.
کانال منبع:
source
@Syntax_fa
👍22❤2
چند تا کامند داکر برای پاکسازی و آزاد کردن فضا
پاک کردن فضای بلا استفاده داکر هر چند وقت یبار نیازه وگرنه اگه مثل من از داکر زیاد استفاده کنید ممکنه کلی فضا بگیره.
1. حذف همه چیزهای استفاده نشده (Containers, Images, Networks, Volumes)
این دستور جامعترین راه برای آزاد کردن فضاست و تمام آبجکتهای داکر که در حال استفاده نیستن (کانتینرهای متوقف شده، ایمیجهای بدون استفاده، شبکههای بدون اتصال و والیوم های بدون کاربرد) رو حذف میکنه:
اگه میخواید والیوم های بدون استفاده هم حذف بشن، از فلگ —volumes استفاده کنید:
2. حذف کانتینرهای متوقف شده
این دستور فقط کانتینرهایی رو حذف میکنه که در حال اجرا نیستن:
3. حذف ایمیجهای بدون استفاده (Dangling Images)
ا. Dangling Images ایمیجهایی هستن که تگ ندارن و توسط هیچ کانتینری استفاده نمیشن:
برای حذف تمام ایمیجهای استفاده نشده (حتی اونایی که توسط کانتینری استفاده نمیشن ولی تگ دارن)، از سوییچ —all یا -a استفاده کنید:
4. حذف ولومهای بدون استفاده
این دستور ولومهایی رو حذف میکنه که به هیچ کانتینری متصل نیستن:
5. حذف شبکههای بدون استفاده
این دستور شبکههایی رو حذف میکنه که هیچ کانتینری بهشون متصل نیست:
حذف کش بیلد(این یکی ممکنه فضای زیادی گرفته باشه):
نمایش فضای اشغال شده:
برای مشاهده فضای کلی اشغال شده توسط داکر و جزئیات مربوط به ایمیجها، کانتینرها و والیوم ها، میتونید از دستور زیر استفاده کنید:
#docker
@Syntax_fa
پاک کردن فضای بلا استفاده داکر هر چند وقت یبار نیازه وگرنه اگه مثل من از داکر زیاد استفاده کنید ممکنه کلی فضا بگیره.
1. حذف همه چیزهای استفاده نشده (Containers, Images, Networks, Volumes)
این دستور جامعترین راه برای آزاد کردن فضاست و تمام آبجکتهای داکر که در حال استفاده نیستن (کانتینرهای متوقف شده، ایمیجهای بدون استفاده، شبکههای بدون اتصال و والیوم های بدون کاربرد) رو حذف میکنه:
docker system prune
اگه میخواید والیوم های بدون استفاده هم حذف بشن، از فلگ —volumes استفاده کنید:
docker system prune --volumes
2. حذف کانتینرهای متوقف شده
این دستور فقط کانتینرهایی رو حذف میکنه که در حال اجرا نیستن:
docker container prune
3. حذف ایمیجهای بدون استفاده (Dangling Images)
ا. Dangling Images ایمیجهایی هستن که تگ ندارن و توسط هیچ کانتینری استفاده نمیشن:
docker image prune
برای حذف تمام ایمیجهای استفاده نشده (حتی اونایی که توسط کانتینری استفاده نمیشن ولی تگ دارن)، از سوییچ —all یا -a استفاده کنید:
Bash
docker image prune -a
4. حذف ولومهای بدون استفاده
این دستور ولومهایی رو حذف میکنه که به هیچ کانتینری متصل نیستن:
docker volume prune
5. حذف شبکههای بدون استفاده
این دستور شبکههایی رو حذف میکنه که هیچ کانتینری بهشون متصل نیست:
docker network prune
حذف کش بیلد(این یکی ممکنه فضای زیادی گرفته باشه):
docker builder prune
نمایش فضای اشغال شده:
برای مشاهده فضای کلی اشغال شده توسط داکر و جزئیات مربوط به ایمیجها، کانتینرها و والیوم ها، میتونید از دستور زیر استفاده کنید:
docker system df
#docker
@Syntax_fa
👍8❤3
معرفی Redis Insight
یه ابزار گرافیکی خوشساخت و راحت برای Redis هست که باهاش میتونی خیلی راحت دیتابیست رو ببینی، مدیریت کنی و حتی از قابلیتهای حرفهای Redis هم استفاده کنی.
چیزایی که Redis Insight برات روون و آسون میکنه:
میتونی دادههات (کلید-مقدار) رو خیلی راحت مرور، فیلتر و حتی به شکلهای مختلف ببینی (مثل JSON، هگز، ASCII و …)
میتونی خیلی راحت روی انواع ساختار داده مثل لیست، هش، استرینگ، ست، ست مرتب و استریم CRUD انجام بدی
جیسان(JSON) هم پشتیبانی میکنه، میتونی مستقیم با دادههای ساختاریافته کار کنی
آموزشهای تعاملی داره که نشون میده چطور از JSON استفاده کنی، جستجوهای قوی انجام بدی و حتی برای پروژههای AI مثل سرچ برداری ازش کمک بگیری
خودش پیشنهادهایی برای بهتر شدن کارایی و مصرف حافظه بهت میده و این پیشنهادها بسته به کاری که میکنی تغییر میکنن
پروفایلر(Profiler) داره که همهی دستوراتی که میفرستی رو لحظهای بررسی میکنه
ا SlowLog هم داره تا ببینی چه چیزایی تو Redis کند اجرا شدن
سیستم Pub/Sub هم پشتیبانی میکنه؛ یعنی میتونی تو کانالها عضو شی و پیام رد و بدل کنی
قابلیت حذف گروهی کلیدها رو هم داره (وقتی با فیلتر دنبال یه سری کلید خاص میگردی)
ا Workbench یه خط فرمان باحال داره با تکمیل خودکار و نمایش گرافیکی دادهها
حتی میتونی نمایش گرافیکی نتایج سرچ و ایندکسها رو ببینی و اگه بخوای، پلاگین خودت رو هم برای نمایش دادهها بسازی
https://github.com/RedisInsight/RedisInsight
#redis
@Syntax_fa
یه ابزار گرافیکی خوشساخت و راحت برای Redis هست که باهاش میتونی خیلی راحت دیتابیست رو ببینی، مدیریت کنی و حتی از قابلیتهای حرفهای Redis هم استفاده کنی.
چیزایی که Redis Insight برات روون و آسون میکنه:
میتونی دادههات (کلید-مقدار) رو خیلی راحت مرور، فیلتر و حتی به شکلهای مختلف ببینی (مثل JSON، هگز، ASCII و …)
میتونی خیلی راحت روی انواع ساختار داده مثل لیست، هش، استرینگ، ست، ست مرتب و استریم CRUD انجام بدی
جیسان(JSON) هم پشتیبانی میکنه، میتونی مستقیم با دادههای ساختاریافته کار کنی
آموزشهای تعاملی داره که نشون میده چطور از JSON استفاده کنی، جستجوهای قوی انجام بدی و حتی برای پروژههای AI مثل سرچ برداری ازش کمک بگیری
خودش پیشنهادهایی برای بهتر شدن کارایی و مصرف حافظه بهت میده و این پیشنهادها بسته به کاری که میکنی تغییر میکنن
پروفایلر(Profiler) داره که همهی دستوراتی که میفرستی رو لحظهای بررسی میکنه
ا SlowLog هم داره تا ببینی چه چیزایی تو Redis کند اجرا شدن
سیستم Pub/Sub هم پشتیبانی میکنه؛ یعنی میتونی تو کانالها عضو شی و پیام رد و بدل کنی
قابلیت حذف گروهی کلیدها رو هم داره (وقتی با فیلتر دنبال یه سری کلید خاص میگردی)
ا Workbench یه خط فرمان باحال داره با تکمیل خودکار و نمایش گرافیکی دادهها
حتی میتونی نمایش گرافیکی نتایج سرچ و ایندکسها رو ببینی و اگه بخوای، پلاگین خودت رو هم برای نمایش دادهها بسازی
https://github.com/RedisInsight/RedisInsight
#redis
@Syntax_fa
❤6👍2
برای حذف کامل ادیتور zed تو لینوکس اینکارو کنید:
هیچ اثری ازش باقی نمیمونه انگار که هیچوقت سمتش نرفتید
#fun
@Syntax_fa
~/.local/bin/zed zed --uninstall
rm -rf ~/.local/zed.app
rm ~/.local/bin/zed
rm ~/.local/share/applications/dev.zed.Zed.desktop
rm -rf ~/.local/share/zed
rm -rf ~/.config/zed
rm -rf ~/.cache/zed
هیچ اثری ازش باقی نمیمونه انگار که هیچوقت سمتش نرفتید
#fun
@Syntax_fa
😁20👍4👎1
Syntax | سینتکس
ساختار پروژه های جنگویی تیم سینتکسفا در پروژههای نرمافزاری، به ویژه پروژههای بزرگ، ساختار مناسب کد نقش کلیدی داره. ساختار پروژه تأثیر مستقیمی به خوانایی، قابلیت نگهداری، و مقیاسپذیری کد داره. در جنگو، یک ساختار مناسب تضمین میکنه که تیم توسعهدهنده…
آپدیت شد:
احراز هویت JWT
مدیریت خطای پیشرفته
داکرایز
پردازش غیرهمزمان با استفاده از celery و تسک های زمانبندی با استفاده از celery beat
مستندسازی API با استفاده از drf-spectacular
هوکهای
با GitHub Actions یه CI ساده راه افتاده که روی Pull Requestها تستها و Lintها رو اجرا میکنه
#django
@Syntax_fa
احراز هویت JWT
مدیریت خطای پیشرفته
داکرایز
پردازش غیرهمزمان با استفاده از celery و تسک های زمانبندی با استفاده از celery beat
مستندسازی API با استفاده از drf-spectacular
هوکهای
pre-commit
از قبل تنظیم شدن؛ شامل pylint
برای بررسی کیفیت کد و gitlint
برای استاندارد کردن پیامهای کامیت.با GitHub Actions یه CI ساده راه افتاده که روی Pull Requestها تستها و Lintها رو اجرا میکنه
#django
@Syntax_fa
👍6
مامانم گفت کیس کامپیوترتو دادم به همسایهمون چون "فقط خاک میخورد". دارم میرم خونه اگه منظورش سرورم باشه... امیدوارم که اشتباه شده باشه.
#fun
@Syntax_fa
#fun
@Syntax_fa
😁47❤1
توضیح ساده مفهوم Anti-Corruption Layer (ACL):
فرض کن یه سیستم خیلی تمیز و مرتب ساختی، که از UILD برای IDها استفاده میکنه. حالا یه روز سرویسهای دیگهای میان که میخوان به سیستم تو وصل بشن. مثلاً یه اپلیکیشن که از INT برای user_id استفاده میکنه یا یکی دیگه که UUID استفاده میکنه.
حالا اگه تو مستقیماً اون INT یا UUID رو وارد سیستم خودت کنی، داری فساد رو وارد دنیای تمیزت میکنی، این میشه corruption.
Anti-Corruption Layer
یه لایه محافظه که جلوی این آلودگی رو میگیره. یعنی وقتی یه سرویس خارجی با مدل دیتا خودش با تو حرف میزنه، ACL میاد اون رو تبدیل میکنه به مدل خودت.
مثال از سرویس نوتیفیکیشن:
تو سرویس نوتیفیکیشن قراره از user_id توی بخشهای مختلف استفاده شه. ولی به این دلیل که سرویسهای خارجی ممکنه IDها با تایپ های مختلفی بفرستن (INT UUID و...)، نباید این تنوع رو بیاری داخل سرویست.
پس چی کار میشه کرد؟
1. اول چک میکنی که externalUserID ارسالی ULID هست یا نه.
2. اگه نیست، میره تو کش cache یا دیتابیس دنبال اینکه آیا قبلا برای این external ID یه ULID تولید شده یا نه.
3. اگه نیست، خودش یه ULID جدید میسازه و نگه میداره.
4. از اون به بعد، هر بار external ID بیاد، همون ULID رو برمیگردونه و تو هر کجا که به user_id نیاز داریم ازش استفاده میکنیم.
یعنی:
* سیستمهای خارجی میتونن هر جور ID بفرستن.
* سرویس نوتیفیکیشن همیشه با یک مدل استاندارد ULID کار میکنه.
مزایا:
* ساختار داخلی سیستم از تغییر و شلختگی سرویسهای خارجی مصون میمونه.
* یکپارچگی و استاندارد بودن دیتای داخلی حفظ میشه.
#anti_corruption_layer #ACL
@Syntax_fa
فرض کن یه سیستم خیلی تمیز و مرتب ساختی، که از UILD برای IDها استفاده میکنه. حالا یه روز سرویسهای دیگهای میان که میخوان به سیستم تو وصل بشن. مثلاً یه اپلیکیشن که از INT برای user_id استفاده میکنه یا یکی دیگه که UUID استفاده میکنه.
حالا اگه تو مستقیماً اون INT یا UUID رو وارد سیستم خودت کنی، داری فساد رو وارد دنیای تمیزت میکنی، این میشه corruption.
Anti-Corruption Layer
یه لایه محافظه که جلوی این آلودگی رو میگیره. یعنی وقتی یه سرویس خارجی با مدل دیتا خودش با تو حرف میزنه، ACL میاد اون رو تبدیل میکنه به مدل خودت.
مثال از سرویس نوتیفیکیشن:
تو سرویس نوتیفیکیشن قراره از user_id توی بخشهای مختلف استفاده شه. ولی به این دلیل که سرویسهای خارجی ممکنه IDها با تایپ های مختلفی بفرستن (INT UUID و...)، نباید این تنوع رو بیاری داخل سرویست.
پس چی کار میشه کرد؟
1. اول چک میکنی که externalUserID ارسالی ULID هست یا نه.
2. اگه نیست، میره تو کش cache یا دیتابیس دنبال اینکه آیا قبلا برای این external ID یه ULID تولید شده یا نه.
3. اگه نیست، خودش یه ULID جدید میسازه و نگه میداره.
4. از اون به بعد، هر بار external ID بیاد، همون ULID رو برمیگردونه و تو هر کجا که به user_id نیاز داریم ازش استفاده میکنیم.
یعنی:
* سیستمهای خارجی میتونن هر جور ID بفرستن.
* سرویس نوتیفیکیشن همیشه با یک مدل استاندارد ULID کار میکنه.
مزایا:
* ساختار داخلی سیستم از تغییر و شلختگی سرویسهای خارجی مصون میمونه.
* یکپارچگی و استاندارد بودن دیتای داخلی حفظ میشه.
#anti_corruption_layer #ACL
@Syntax_fa
👍8👏2
رائفیپور:
رفتم چک کردم گیتهابشونو
دقیقا 1666 کامیت زده بود! حتما توطئه ای در جریانه و برنامه نویس فراسونر هاست
#fun
@Syntax_fa
رفتم چک کردم گیتهابشونو
دقیقا 1666 کامیت زده بود! حتما توطئه ای در جریانه و برنامه نویس فراسونر هاست
#fun
@Syntax_fa
😁21👎1
الگوی Profile model
تا حالا به این مشکل برخوردید که توی پروژهتون دو نوع کاربر دارید؟ مثلاً «خریدار» و «فروشنده»؟
خریدار فقط نام و ایمیل داره، اما فروشنده کلی اطلاعات اضافه مثل «نام فروشگاه»، «آدرس» و «شماره صنفی» هم داره.
اینجا چند تا راه به ذهن میاد:
راه حل بد: همهی فیلدها رو توی یک مدل User بریزیم (که برای خریدارها کلی فیلد NULL و خالی ایجاد میکنه و مدل رو شلوغ میکنه).
راه حل پیچیده: برای هر کدوم یک مدل User جدا بسازیم(که مدیریت احراز هویت و دسترسیهارو سختش می کنه)
الگوی پروفایل (Profile Model Pattern)
یک مدل User مرکزی داشته باشید: این مدل فقط مسئول اطلاعات مشترک و احراز هویته (نام کاربری، ایمیل، پسورد و ...)
یک مدل Profile جدا بسازید: برای اطلاعات اضافی، یک مدل جدید (مثلا SellerProfile) بسازید و تمام فیلدهای مخصوص فروشنده رو داخل اون قرار بدید.
با OneToOneField وصلشون کنید: این دو مدل رو با یک رابطه یک-به-یک به هم متصل کنید.
#profile_model_pattern
@Syntax_fa
تا حالا به این مشکل برخوردید که توی پروژهتون دو نوع کاربر دارید؟ مثلاً «خریدار» و «فروشنده»؟
خریدار فقط نام و ایمیل داره، اما فروشنده کلی اطلاعات اضافه مثل «نام فروشگاه»، «آدرس» و «شماره صنفی» هم داره.
اینجا چند تا راه به ذهن میاد:
راه حل بد: همهی فیلدها رو توی یک مدل User بریزیم (که برای خریدارها کلی فیلد NULL و خالی ایجاد میکنه و مدل رو شلوغ میکنه).
راه حل پیچیده: برای هر کدوم یک مدل User جدا بسازیم(که مدیریت احراز هویت و دسترسیهارو سختش می کنه)
الگوی پروفایل (Profile Model Pattern)
یک مدل User مرکزی داشته باشید: این مدل فقط مسئول اطلاعات مشترک و احراز هویته (نام کاربری، ایمیل، پسورد و ...)
یک مدل Profile جدا بسازید: برای اطلاعات اضافی، یک مدل جدید (مثلا SellerProfile) بسازید و تمام فیلدهای مخصوص فروشنده رو داخل اون قرار بدید.
با OneToOneField وصلشون کنید: این دو مدل رو با یک رابطه یک-به-یک به هم متصل کنید.
#profile_model_pattern
@Syntax_fa
👍16
یه کانال برنامه نویسیه شخصی درست می کنم میذارم تو پروفایلم تا بقیه با استایل خاصم آشنا بشن
#fun
@Syntax_fa
#fun
@Syntax_fa
😁49💩2👍1
Forwarded from Zhino | ژینو (mahdi)
🌟 چیتها یا همون ابزار تقلب در بازیهای آنلاین چطور کار میکنند؟
به طور کلی در بازیهای آنلاین دو عامل وجود دارد که با همکاری یکدیگر میشه به طور آنلاین با بازیکنان دیگه یه بازی آنلاین بازی کرد.
🧑💻 کلاینت (Client): سیستم بازیکن که رندر گرافیک، ورودی کاربر و ارسال اطلاعات رو انجام میده.
☁️ سرور (Server): هماهنگکننده اصلی که دادههای همه بازیکنان رو دریافت و تحلیل میکنه و تصمیم میگیره چه اتفاقیهایی باید بیفته.
– 🧩 خب کسایی که ابزار تقلب یا همون چیت میسازن دقیقا چهکاری انجام میدن؟ 🤔
معمولا با دستکاری فایلهای بازی، حافظهی اجرایی یا ساختار دادههای سمت کلاینت، رفتار بازی رو عوض میکنن. این کار میتونه با روشهایی مثل مهندسی معکوس، تزریق کد یا ویرایش موقتی حافظه انجام بشه.
– 🧩 آیا چیتسازها از سرور بازی هم میتونن استفاده کنند؟ 👀
چون این کار نیازمند نفوذ غیرمجاز به سرور است و ریسک قانونی و امنیتی بالایی داره، معمولا مورد استفاده قرار نمیگیره. البته برای اینکار نیاز به مهارتهای هک و نفوذ هم نیاز دارن.
– 🤖 چی باعث میشه که یک بازیکن از ابزار تقلبی استفاده کرده شناسایی بشه؟
آنتیچیتها معمولا به دو نوع اصلی تقسیم میشن:
— نوع اول: یه سری که روی سیستم بازیکن اجرا میشن، مثل Easy Anti-Cheat یا BattleEye، که حافظه، فایلهای DLL و فعالیتهای مشکوک سیستم رو زیر نظر دارن.
— نوع دوم: یه نوع دیگههم هست که سمت سروره و رفتار بازیکنان رو بررسی میکنه؛ مثلا اگر پلیری خیلی سریعتر از حد معمول حرکت کنه یا با دقت غیرطبیعی تیر بزنه، بهعنوان مشکوک شناسایی میشه.
👈 مثالی از نحوه شناسایی:
– اگر حداکثر سرعت مجاز یک بازیکن 5 واحد بر ثانیه باشد، اما دادههای ارسالی از کلاینت نشون بده که در یک فریم از مختصات (0,0) به (0,10) رسیده، سرور یا آنتیچیت میتونه این مورد رو به عنوان حرکت غیرمجاز ثبت کنه.
– 🎖 چیتهای پراستفاده و نحوه کارکردشان: خب حالا بیایید بررسی کنیم که چیت های پر استفاده چطوری کار میکنن.
*⃣ اِیمبات [Aimbot]:
از حافظهی RAM بازی موقعیت دقیق دشمنها رو استخراج میکنه. با استفاده از توابع حرکتی موس یا تزریق DLL، موس رو بهصورت مصنوعی به مختصات دشمن میبره. معمولا با FPS بازی هماهنگ میشه تا طبیعیتر بهنظر برسه (و آنتیچیت سختتر متوجه بشه).
*⃣ والهک [Wallhack]:
بازی معمولا اطلاعات بقیه بازیکنان رو به دلیل سینک [Synchronizing] بهتر برای کلاینت ها میفرسته. از حافظه یا GPU این اطلاعات رو استخراج میکنن و به صورت باکس یا اسکلت بهم نمایش میدن.
*⃣ اسپید هک [Speed hack]:
در برخی بازیها سرعت حرکت در RAM نگهداری میشه. چیت با تغییر اون مقدار، سرعت بازیکن رو بالا میبره. بعضی وقتا هم با دستکاری Time Scale این کار انجام میشه (مثل فریمریت فیک).
*⃣ تریگر بات [Triggerbot]:
از توابع DirectX یا OpenGL برای بررسی پیکسلهای مرکز صفحه استفاده میکنه. وقتی رنگ مشخصی (مثل قرمز دشمن) در وسط صفحه دیده بشه، کلیک موس اجرا میشه.
– 🔥 در آخر یادم نره بگم که به طور خلاصه چیتها از روشهای زیر ساخته میشن:
🟡 Memory Editing:
دادههای در حال اجرا در RAM رو تغییر میده.
🟡 DLL Injection:
کد جدیدی وارد فرآیند بازی میکنه.
🟡 Hooking APIs :
توابع گرافیکی یا کنترلی بازی رو تغییر میده.
🟡 Packet Editing:
غیر رایجه؛ بستههای شبکه رو تغییر میده (معمولا قابل شناسایی توسط سرور)
🟡 External Programs:
بدون دخالت مستقیم، با گرفتن اسکرین، مکان دشمن رو تشخیص میده.
*⃣ #Game #Article
💎 Channel: @ZhinoDev
به طور کلی در بازیهای آنلاین دو عامل وجود دارد که با همکاری یکدیگر میشه به طور آنلاین با بازیکنان دیگه یه بازی آنلاین بازی کرد.
🧑💻 کلاینت (Client): سیستم بازیکن که رندر گرافیک، ورودی کاربر و ارسال اطلاعات رو انجام میده.
💡 مثال: اگر بازی شوتر باشه اطلاعاتی مثل
مکان دقیق بازیکن، شلیک تیر، نارنجک و ...
☁️ سرور (Server): هماهنگکننده اصلی که دادههای همه بازیکنان رو دریافت و تحلیل میکنه و تصمیم میگیره چه اتفاقیهایی باید بیفته.
💡 مثال: بازی اگر بازی شوتر باشه اطلاعات شلیک گلوله رو از کلاینت اول میگیره
و اطلاعات مکان بازیکن رو از کلاینت دوم میگیره. هرموقع که این دو مختصات رویهم منطبق شدند به پلیر ۲ دمیج وارد میشه.
– 🧩 خب کسایی که ابزار تقلب یا همون چیت میسازن دقیقا چهکاری انجام میدن؟ 🤔
معمولا با دستکاری فایلهای بازی، حافظهی اجرایی یا ساختار دادههای سمت کلاینت، رفتار بازی رو عوض میکنن. این کار میتونه با روشهایی مثل مهندسی معکوس، تزریق کد یا ویرایش موقتی حافظه انجام بشه.
– 🧩 آیا چیتسازها از سرور بازی هم میتونن استفاده کنند؟ 👀
چون این کار نیازمند نفوذ غیرمجاز به سرور است و ریسک قانونی و امنیتی بالایی داره، معمولا مورد استفاده قرار نمیگیره. البته برای اینکار نیاز به مهارتهای هک و نفوذ هم نیاز دارن.
– 🤖 چی باعث میشه که یک بازیکن از ابزار تقلبی استفاده کرده شناسایی بشه؟
آنتیچیتها معمولا به دو نوع اصلی تقسیم میشن:
— نوع اول: یه سری که روی سیستم بازیکن اجرا میشن، مثل Easy Anti-Cheat یا BattleEye، که حافظه، فایلهای DLL و فعالیتهای مشکوک سیستم رو زیر نظر دارن.
— نوع دوم: یه نوع دیگههم هست که سمت سروره و رفتار بازیکنان رو بررسی میکنه؛ مثلا اگر پلیری خیلی سریعتر از حد معمول حرکت کنه یا با دقت غیرطبیعی تیر بزنه، بهعنوان مشکوک شناسایی میشه.
👈 مثالی از نحوه شناسایی:
– اگر حداکثر سرعت مجاز یک بازیکن 5 واحد بر ثانیه باشد، اما دادههای ارسالی از کلاینت نشون بده که در یک فریم از مختصات (0,0) به (0,10) رسیده، سرور یا آنتیچیت میتونه این مورد رو به عنوان حرکت غیرمجاز ثبت کنه.
⚠️ البته بررسی کامل این رفتارها منابع زیادی مصرف میکنه، برای همین بعضی بازیها فقط موارد خاص رو بررسی میکنن یا از سیستمهای گزارشدهی بازیکنان استفاده میکنند.
– 🎖 چیتهای پراستفاده و نحوه کارکردشان: خب حالا بیایید بررسی کنیم که چیت های پر استفاده چطوری کار میکنن.
*⃣ اِیمبات [Aimbot]:
از حافظهی RAM بازی موقعیت دقیق دشمنها رو استخراج میکنه. با استفاده از توابع حرکتی موس یا تزریق DLL، موس رو بهصورت مصنوعی به مختصات دشمن میبره. معمولا با FPS بازی هماهنگ میشه تا طبیعیتر بهنظر برسه (و آنتیچیت سختتر متوجه بشه).
*⃣ والهک [Wallhack]:
بازی معمولا اطلاعات بقیه بازیکنان رو به دلیل سینک [Synchronizing] بهتر برای کلاینت ها میفرسته. از حافظه یا GPU این اطلاعات رو استخراج میکنن و به صورت باکس یا اسکلت بهم نمایش میدن.
*⃣ اسپید هک [Speed hack]:
در برخی بازیها سرعت حرکت در RAM نگهداری میشه. چیت با تغییر اون مقدار، سرعت بازیکن رو بالا میبره. بعضی وقتا هم با دستکاری Time Scale این کار انجام میشه (مثل فریمریت فیک).
⚠️ این نوع چیت معمولا راحت شناسایی میشه چون دادههای غیرعادی برای سرور میفرسته.
*⃣ تریگر بات [Triggerbot]:
از توابع DirectX یا OpenGL برای بررسی پیکسلهای مرکز صفحه استفاده میکنه. وقتی رنگ مشخصی (مثل قرمز دشمن) در وسط صفحه دیده بشه، کلیک موس اجرا میشه.
– 🔥 در آخر یادم نره بگم که به طور خلاصه چیتها از روشهای زیر ساخته میشن:
🟡 Memory Editing:
دادههای در حال اجرا در RAM رو تغییر میده.
🟡 DLL Injection:
کد جدیدی وارد فرآیند بازی میکنه.
🟡 Hooking APIs :
توابع گرافیکی یا کنترلی بازی رو تغییر میده.
🟡 Packet Editing:
غیر رایجه؛ بستههای شبکه رو تغییر میده (معمولا قابل شناسایی توسط سرور)
🟡 External Programs:
بدون دخالت مستقیم، با گرفتن اسکرین، مکان دشمن رو تشخیص میده.
*⃣ #Game #Article
💎 Channel: @ZhinoDev
🔥14❤2💩1👌1
❤6👍1
Syntax | سینتکس
از کدوم بیشتر استفاده می کنید؟
حرف هوش مصنوعی شد.
من هوش مصنوعیمو به تلگرام وصل کردم.
الان توی گروه سینتکسفا هستش.
تو گروه پیام بدید و سعی کنید باهاش ارتباط برقرار کنید تا با یه هوش مصنوعی خیلی متفاوت روبرو بشید
فعلا خاموشه
من هوش مصنوعیمو به تلگرام وصل کردم.
الان توی گروه سینتکسفا هستش.
تو گروه پیام بدید و سعی کنید باهاش ارتباط برقرار کنید تا با یه هوش مصنوعی خیلی متفاوت روبرو بشید
فعلا خاموشه
👻14