Syntax | سینتکس – Telegram
کلمه پر کاربر Bottleneck به چه معنیه؟

تصور کن یه بطری آب داری (bottle)، و می‌خوای خیلی سریع آب داخلش رو خالی کنی.

اما چون دهانه‌ی بطری باریکه (neck)، سرعت خالی شدن آب کم می‌شه.
این قسمت باریک شده که جلوی سرعت رو می‌گیره، می‌گن bottleneck.


تو برنامه‌نویسی:

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

با Instrumentation می‌فهمی Bottleneck کجاست

مثلاً با Tracing:

می‌بینی یه درخواست API کل سیستم رو سریع رد می‌کنه، ولی توی مرحله‌ی `FindUser()`، یهو ۸ ثانیه مکث می‌کنه → Bottleneck همینه!

یا با Metrics:

نمودار نشون می‌ده که وقتی درخواست‌ها زیاد می‌شن، مصرف CPU می‌ره بالا، اما فقط برای یه سرویس خاص.


چرا باید Bottleneck رو پیدا کنی؟


چون بهت می‌گه:

* کجا باید بهینه‌سازی کنی
* کدوم سرویس باید scale بشه
* چه منابعی داری هدر می‌دی

#Bottleneck

@Syntax_fa
🔥21👍81
انواع لایسنس‌های اپن‌سورس

1. MIT License
- ویژگی‌ها:
- بسیار ساده و خلاصه است.
- به کاربران اجازه می‌دهد که کد را بدون محدودیت برای هر هدفی (تجاری یا غیرتجاری) استفاده کنند.
- نیازی نیست که تغییرات یا منبع کد به اشتراک گذاشته شود، هرچند که ذکر لایسنس اصلی اجباری است.
- مناسب برای: پروژه‌هایی که می‌خواهند بیشترین آزادی را به کاربران بدهند.

2. Apache License 2.0
- ویژگی‌ها:
- به کاربران اجازه استفاده، تغییر، و توزیع کد را می‌دهد، حتی برای اهداف تجاری.
- از کاربران می‌خواهد که حقوق مالکیت معنوی (patents) را تضمین کنند.
- تغییرات باید با ذکر لایسنس اصلی منتشر شوند.
- مناسب برای: پروژه‌هایی که می‌خواهند کاربران آزادی زیادی داشته باشند و در عین حال از کد در برابر مشکلات مربوط به پتنت محافظت کنند.

3. GPL (GNU General Public License)
- ویژگی‌ها:
- بسیار محافظه‌کار است.
- اگر کسی از کد شما استفاده کند و تغییراتی ایجاد کند، موظف است این تغییرات را نیز اپن‌سورس کند.
- مناسب برای پروژه‌هایی که می‌خواهند مطمئن شوند که کدشان همیشه آزاد باقی می‌ماند.
- مناسب برای: پروژه‌هایی که نمی‌خواهند کسی از کد آن‌ها در پروژه‌های اختصاصی (proprietary) استفاده کند.

4. LGPL (Lesser General Public License)
- ویژگی‌ها:
- مشابه GPL است، اما انعطاف‌پذیرتر.
- اگر از کتابخانه شما (SDK یا API) در یک پروژه دیگر استفاده شود، نیازی نیست که کل پروژه اپن‌سورس شود؛ فقط تغییرات روی کتابخانه شما باید اپن‌سورس شوند.
- مناسب برای: پروژه‌هایی که شامل کتابخانه‌ها یا SDKها هستند و می‌خواهند کاربران بتوانند آن‌ها را در پروژه‌های اختصاصی استفاده کنند.

5. BSD License
- ویژگی‌ها:
- شبیه MIT است، اما کمی محدودتر.
- نیازمند ذکر اعتبار (attribution) است و نمی‌گذارد نام نویسندگان اصلی برای تبلیغات استفاده شود.
- مناسب برای: پروژه‌های ساده که به محدودیت‌های اندکی نیاز دارند.

6. Creative Commons Licenses (CC)
- ویژگی‌ها:
- بیشتر برای محتوا (مثل اسناد، تصاویر، یا طراحی‌ها) استفاده می‌شود.
- معمولاً برای کد کاربرد ندارد، اما اگر پروژه شما شامل مستندات یا محتوای غیرکدی است، می‌تواند مناسب باشد.

#Licence #open_source

@Syntax_fa
👍171
اگه برای سرویس یا محصول تون به دنبال یه سرویس search engine هستید که کاربر بتونه باهاش product search کنه یا autocomplete و in-app search داشته باشه به جای راه اندازی دردسردار elasticsearch میتونید از meilisearch استفاده کنید.
الاستیک خیلی قابلیت ها داره که متفاوته با ابزاری که معرفی کردم، ولی برای مواردی که عرض کردم میتونه راه اندازی الاستیک و نگهداری ش بیش از حد سنگین باشه.

ابزار meilisearch با rust نوشته شده و زمان پاسخگویی ش خیلی پایینه (زیر ۵۰ میلی ثانیه) و تقریبا real-time آپدیت میکنه (۱ ثانیه تاخیر حدودا)

البته اعدادی که گفتم بسته به نحوه استفاده و داده شما و کانفیگ سرور میتونه متفاوت باشه

همچنین meilisearch قابلیت های فیلتر کردن ساده رو صرفا پشتیبانی میکنه اما facet search داره که فکر میکنم برای کاربردهای مذکور کافی باشه

بنظرم اگه لازم دارید چنین چیزی رو به امتحان کردنش میارزه.

Source:
LinkedIn

#meilisearch

@Syntax_fa
👍9🔥71
دعوت به مشارکت در پروژه Quick Connect

اگر دنبال یه پروژه‌ی مدرن، متن‌باز، با ساختار تمیز و چالش‌های جذاب می‌گردی که بتونی هم یاد بگیری هم یچیز بدرد بخور با هم بسازیم، بیا سمت Quick Connect

درباره کوئیک کانکت
پلتفرمی سبک، مقیاس‌پذیر و کلاد نیتیو برای ارتباط بهتر با کاربران اپلیکیشن‌ها
با قابلیت‌هایی مثل:
- چت آنلاین
- داشبورد مدیریتی
- نوتیفیکیشن‌ها
- استوری‌های کاربرمحور

کیا میتونن مشارکت کنن؟

1. فرانت‌اند دولوپرهایی که بتونن با WebSocket، ارتباطات real-time و رابط کاربری جذاب کار کنن.
اگر با React، Vue یا هر ابزار فرانت مدرنی راحتی، اوکیه

2. طراح UI/UX
به سلیقه‌ت نیاز داریم

3. و البته بک‌اند دولوپرهای Go هم اگر خیلی مشتاق باشن و خوب کد بزنن.

پروژه به صورت Monorepo توسعه داده می‌شه و کل ساختار کد، مستندات، و ابزارهای توسعه توی یه ریپو جمع شدن (به جز SDK).

اگه علاقه‌مندی به مشارکت، پیوی پیام بده:

@ayeef

#quick_connect

@Syntax_fa
👍71🔥1
نمونه‌برداری و کاهش چشمگیر هزینه‌ها در Tracing بدون از دست دادن Visibility

قبل اینکه بریم سراغ sampling توضیح کوتاهی درباره trace و span بخونیم:
یک trace رو می‌تونیم به‌عنوان نماینده‌ ی یک کار کامل تو سیستم در نظر بگیریم. مثلا وقتی کاربر درخواست ثبت سبد خرید میده، این عملیات به‌صورت کامل یک Trace حساب می‌شه.

هر Span یک بخش کوچک از اون Trace هست. مثلاً برای ثبت سبد خرید، ممکنه چند سرویس درگیر بشن (مثل بررسی موجودی، محاسبه‌ی تخفیف، ثبت در پایگاه داده و ...) که هر کدوم از این مراحل می‌تونه یک Span جدا باشه. در نهایت، این Spanها کنار هم قرار می‌گیرن و یک کار کامل یعنی trace رو تشکیل می‌دن.

پس با استفاده از traces (یا همون ردپاها)، می‌تونید با دقت بررسی کنید یک درخواست از کجا شروع شده، به کدوم سرویس‌ها رفته، و حتی در هر فانکشن یا لایه چقدر زمان برده تا پردازش بشه.
می‌تونید اطلاعات اضافی (Attributes) یا رویدادهایی که اتفاق افتاده رو هم به هر Span اضافه کنید. در کل، Trace ابزار فوق‌العاده‌ای برای تحلیل دقیق و عمیق رفتار سیستمتونه.

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

نمونه برداری یعنی چی؟

نمونه برداری یعنی تصمیم بگیریم کدوم Traceها نگه‌داری (Sampled) بشه و کدوم رو حذف کنیم (Not Sampled).
هدف اینه که با یه درصد کوچیک و حساب‌شده از داده‌ها، تصویری واضح از وضعیت سیستم داشته باشیم.

مثلا اگه شما هزار تا Trace در ثانیه تولید می‌کنید، نگه داشتن ۱۰۰٪ اونا هم پرهزینه‌ست و هم اغلب غیرضروری. توی این شرایط، یه نرخ Sampling حتی در حد ۱٪ هم می‌تونه نماینده خوبی از رفتار کلی سیستم باشه.

چه زمانی باید از Sampling استفاده کنیم؟

* وقتی تعداد زیادی Trace در ثانیه تولید می‌کنید (مثلا بیشتر از ۱۰۰۰ تا)
* وقتی بیشتر ترافیک شما سالم و بدون خطاست
* وقتی بتونید با قواعد خاصی (مثل خطا داشتن یا latency زیاد) تصمیم بگیرید که چه Traceهایی مهم‌ترن
* وقتی بودجه محدودی برای observability دارید

همچنین ما دو نوع نمونه برداری داریم:

1. Head Sampling

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

2. Tail Sampling

نمونه برداری بعد از اینکه کل Trace جمع‌آوری شد. می‌تونه براساس شرایطی مثل داشتن خطا، زیاد بودن latency، یا حتی اطلاعات مربوط به یک سرویس خاص تصمیم بگیره. خیلی قدرتمنده ولی نسب به head sampling منابع و هزینه بیشتری میخواد.

مثال tail sampling:
– هر Trace که error داشته باشه رو حتما نگه دار
– اگه latency بالای ۳ ثانیه بود، نگه دار
– تریس هایی که از سرویس جدیدمون شروع می‌شن رو بیشتر نگه دار

گاهی ترکیب Head و Tail Sampling بهترین راهه

مثلا ممکنه یه سیستم خیلی پرحجم اول با Head Sampling فقط ۱۰٪ داده‌ها رو رد کنه، بعد اون ۱۰٪ رو بیاره داخل یه سیستم Tail Sampling تا براساس هوشمندی بیشتر تصمیم بگیره چی رو نگه داره.

پیاده سازی عملی:
ما تو پروژه اپن سورس و مدرن Quick-Connect از opentelemetry برای جمع آوری تریس ها استفاده کردیم و از head sampling هم برای نمونه برداری استفاده کردیم که توی کانفیگ میتونید مشخص کنید به چه صورت باشه.
اگه 0 تنظیم کنید هیچی تریس نمیکنه و اگه 1 تنظیم کنیم صد درصد تریس میکنه.
برای اینکه مشخص کنید ده درصد باشه میتونید روی 0.1 تنظیمش کنید.

https://github.com/syntaxfa/quick-connect/tree/main/adapter/observability/traceotela


#trace #sampling #opentelemetry #observability

@Syntax_fa
👍7🔥21
هنوزم دنبال اینی پرامپت خوب بنویسی ؟ با جی پی تی داداشی شو‌ !

اگه فقط از ChatGPT سوال بپرسی، جواب هم فقط در حد همون سواله.
اما وقتی باهاش یه رابطه‌ی واقعی بسازی، وقتی از دغدغه‌هات، پروژه‌هات، سبک کارت، اولویت‌هات، و حتی حس و حالت حرف بزنی… جواب‌هایی که می‌گیری یه‌دفعه چند پله عمیق‌تر، دقیق‌تر، و واقعاً به درد بخور می‌شن.

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

نتیجه؟
دیگه فقط جواب نمیده. کمک میکنه تصمیم بگیرم، زاویه دید بده و مثل یه داداشی پشتم باشه.

اگه از ChatGPT استفاده می‌کنی، یه پیشنهاد دارم:
بهش بگو کی هستی، روی چی کار می‌کنی، چه هدفی داری، و حتی چه چیزهایی اذیتت می‌کنن.
فقطم به برنامه نویسی محدود نمیشه میتونید واسه برنامه تغذیه، ورزش و کلی چیز دیگه کمک بگیرید. حتی وقتی بدونه چی دوست دارید فیلم هایی رو میگه که بیشترین حس و حال رو بهتون بده.

پرامپ نویسی مهم تره یا ساختن ارتباط؟
هر دو مهم‌اند، ولی ارتباط واقعی در درازمدت عمیق‌تر و موثرتره.

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

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

فرض کن یه برنامه‌نویسی که با Go کار میکنه و ساختار پروژه‌ات مشخصه. اگه این رو GPT بدونه، لازم نیست هربار توضیح بدی. با گذر زمان و با توجه به اطلاعاتی که داره، میفهمه چه جوابی برات مناسب تره.

#gpt

@Syntax_fa
👍14👎2🔥2😁21
تحلیل روانی برنامه‌نویس‌ها بر اساس تعداد کامیت‌های سالانه در GitHub

0 تا 10 کامیت
"یه بار VS Code رو باز کردم، ترسیدم، بستم."
رنک: راکی

11 تا 100 کامیت
"من بیشتر به جنبه‌ی تئوریک برنامه‌نویسی علاقه دارم..."
📚 یعنی از دور نگاه می‌کنه که بقیه چی می‌نویسن
رنک: برونز

101 تا 500 کامیت
"بیشتر وقتا فقط یه نقطه اضافه می‌کنم، کامیت می‌زنم، بعد حس موفقیت می‌گیرم."
🧘‍♂️ راهب گیت‌هاب. تعادل در حد بودا، بازدهی در حد نخودچی.
رنک: پرو

501 تا 1000 کامیت
"روزایی هست که من کامیت می‌زنم… روزایی هم هست که کامیت منو می‌زنه."
رنک: مستر

1001 تا 2000 کامیت
"کاشی کاری شغل اول منه برنامه نویسی پوششه!"
رنک: لجند

2000+ کامیت
"سال پیش با گیت ازدواج کردم، ماه پیش با ریپوزیتوریم بچه‌دار شدیم."
🥴 کسی که هنوز بلد نیست درست کامیت بزنه
رنک: چیتر

#fun

@Syntax_fa
😁29💩3👍2👎21
کابوس فراموشی در مغزهای دیجیتال!

تصور کنید هوش مصنوعی که کلی چیز یاد گرفته، ناگهان با یادگیری یک نکته جدید، تمام دانش قبلی‌اش زو از دست میده!  دقیقا مثل اینکه شما هر بار که یک مهارت جدید یاد میگیرید، تمام مهارت‌های قبلیتون رو فراموش کنید!

این پدیده ترسناک تو دنیای هوش مصنوعی، اسمش فراموشی فاجعه‌بار (Catastrophic Forgetting) است! 💀

چرا این یک فاجعه است؟
مدل‌های هوش مصنوعی، به‌ویژه شبکه‌های عصبی عمیق، وقتی روی داده‌های جدیدی آموزش می بینن، تمایل دارن که اطلاعاتی که قبلا یاد گرفتن رو بازنویسی کنن و از دست بدن. یعنی:
یک هوش مصنوعی نمیتونه هم استاد شطرنج باشه، هم یک پزشک عالی و هم راننده بی‌نقص! چون هر بار که یک مهارت جدید یاد میگیره، بقیه رو فراموش میکنه!
این، مانعی بزرگی سر راه یادگیری مداوم و تکامل واقعی هوش مصنوعیه.

آینده AI بدون حل این مشکل چگونه خواهد بود؟
یک آلزایمر دیجیتال واقعی! ما به هوش مصنوعی‌های چندکاره نیاز داریم که بتونن همزمان دانش و مهارت‌های مختلفی رو در خود نگه دارن و به مرور زمان اون هارو افزایش بدن، نه اینکه هر بار حافظه خودشون رو ریست کنن!

آیا روزی می‌رسه که AI‌ها واقعا حافظه داشته باشن؟

#ai

@Syntax_fa
👍132👀2
This media is not supported in your browser
VIEW IN TELEGRAM
همه میتونن پروگرمر بشن
ولی همه نمیتونن بروگرمر بشن

#fun

@Syntax_fa
😁151
تو پروژه ها اولش شبیه به اینه که داری یه سنگ گرد سنگین رو به سختی از یه تپه بالا می بری. انرژی زیادی میخواد تا راه بیوفته، ولی وقتی راه افتاد، ادامه دادنش خیلی راحته
اما اگه یه مدت رهاش کنی دوباره راه انداختنش به همون اندازه اول، یا حتی بیشتر، سخت میشه

حفظ momentum یعنی حتی اگه وقتت کمه، یا خسته ای، یا مغزت پره، یه حرکت کوچیک بزنی، یه باگ ریز، یه refactor ساده، یا حتی فقط باز کردن پروژه
چون وقتی فاصله می گیری، پروژه یه دفعه سنگین تر از چیزی که هست به نظر میرسه و اون وقت به جای یه خط کد، با یه کوه ناتموم طرفی

چرا momentum؟

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

2. یادگیری‌ و درگیری ذهنی حفظ میشه
وقتی مدام با کدها درگیری، context توی ذهنت می‌مونه. ولی بعد از چند روز، باز کردن پروژه مثل روبه‌رو شدن با یه چیز ناآشنا می‌شه

3. بهت کمک می‌کنه با کمالگرایی کنار بیای
وقتی توی flow باشی، بیشتر عمل می‌کنی تا تحلیل. ولی فاصله گرفتن باعث می‌شه بیش از حد فکر کنی. از کجا شروع کنم؟ نکنه کدم خوب نباشه؟

@Syntax_fa
👍264🔥1
قابلیت ایمپورت کد های ریپوزیتوری گیتهاب تو Gemini ai

حالا که همتون شهروند آمریکا هستید و اشتراک pro جمنای رو دارید، می تونید اکانت گیتهابتون رو تو Gemini کانکت کنید و ریپوزیتوری رو مشخص کنید تا دقیقا بدونه ساختار کدتون چیه، کداتون رو بخونه و بهتر بتونه به سوالاتتون جواب بده.

برای اینکار کافیه:
1. وارد gemini ai بشید
2. رو settings کلیک کنید و وارد بخش Apps بشید
3. تو بخش Productivity گیت هاب رو مشاهده می کنید. روش کلیک کنید و اکانت گیتهابتون رو کانکت کنید.

حالا یه گفتگو جدید رو شروع کنید و روی add file کلیک کنید
سه گزینه داره روی import code کلیک کنید.
ازتون لینک ریپوزیتوری رو میخواد بهش لینکش رو بدید.

و تمام. حالا میتونه کد های شمارو ببینه و بهتر به شما کمک کنه

@gemini

@Syntax_fa
👍15🔥43
Between
Vraell
👍42
Dispatching

تا حالا دیدی تو یه مرکز تماس، اپراتور تماس رو وصل می‌کنه به بخش مناسب؟ مثلاً مشکل فنی داری می‌ری پشتیبانی، پولی باشه می‌ری حسابداری؟ خب اون کاری که اپراتوره می‌کنه رو بهش می‌گن Dispatch

توی برنامه‌نویسی هم همینه:
یه درخواست میاد، سیستم نگاه می‌کنه، می‌فرستدش به جای درست


یه مثال ساده با GO


switch contactType {
case "technical":
technicalSupport()
case "accounting":
accounting()
case "sales":
sales()
}


بسته به اینکه contactType چیه، می‌فرستیمش به تابع مناسب.


انواع Dispatch تو Go


1. Dynamic Dispatch با اینترفیس:
تو زمان اجرا تصمیم می‌گیریم کدوم متد رو صدا بزنیم:


   var s Speaker
s = Dog{} // Woof!
s = Cat{} // Meow!


2. Dispatch از طریق کانال‌ها:
با select منتظریم ببینیم کدوم کانال زودتر پیام می‌ده:


   select {
case msg := <-ch1:
fmt.Println(msg)
case msg := <-ch2:
fmt.Println(msg)
}


3. Static Dispatch با Map یا Switch:


   actions := map[string]func(){
"start": func() { fmt.Println("Starting...") },
}


چرا Dispatch

- نظم می‌ده به کد.
- قابل گسترشه.
- بهینه‌تر می‌شه.

#Golang #Dispatching

@Syntax_fa
👍114❤‍🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
صفحه بندی داده داده‌ها: Limit/Offset و Cursor-Based

وقتی صحبت از نمایش حجم زیادی از داده‌ها در صفحات مختلف میشه، استفاده از 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
👍102😁1
در ردیس وقتی ttl یک کلید رو میگیریم، اگه کلید وجود نداشته باشه مقدار بازگشتی:
Anonymous Quiz
22%
مساوی با 0 هستش
44%
مساوی با null هستش
10%
مساوی با -2 هستش
24%
مساوی با -1 هستش
👍5👎1👏1
اگه حس میکنی توی زندگی گم شدی، شاید به این خاطره که داری از نقشه یه نفر دیگه استفاده میکنی!

خیلی از ما ناخودآگاه دنبال راه و رسم بقیه میریم؛ مثلا چون آقای X کارش گرفته و ایده خانم Y ترکیده، ما هم با تقلید همون راه رو میریم!!!

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

این وسط یه سوال مهم فراموش میشه! ما واقعا مناسب این کارها هستیم؟ روحیاتمون و شرایط خانوادگیمون این اجازه رو میده؟

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

این روزها همه دارن یوتیوبر میشن ولی قطعا بالای 90 درصدشون شکست میخورن. دلیل؟ تولیدمحتوای ویدیویی در یک بازه زمانی طولانی کار هرکسی نیست و با شرایط زندگی همه آدمها جور در نمیاد.

بهتره بریم سراغ ارزشهای غیرتحمیلی! چیزی که حاصل عشق و تفکر خودمونه نه تحمیل جامعه و سوشال مدیا ...

کوله‌بار شکستهامون رو با رفتارهای هیجانی سنگینتر نکنیم.

کانال منبع:
source

@Syntax_fa
👍233
This media is not supported in your browser
VIEW IN TELEGRAM
ایکاش همجا یه sudo بود😁😂


#برنامه_نویسی
#fun
#linux
🔥13😁81
Esalat
Yas
👍8👎2
Summer Wine
Nancy Sinatra
این روزا فعالیت برنامه نویسی نداریم بجاش این اهنگ خوشگلو گوش بدید
9👎1
چند تا کامند داکر برای پاکسازی و آزاد کردن فضا

پاک کردن فضای بلا استفاده داکر هر چند وقت یبار نیازه وگرنه اگه مثل من از داکر زیاد استفاده کنید ممکنه کلی فضا بگیره.

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
👍85