نمونهبرداری و کاهش چشمگیر هزینهها در 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
قبل اینکه بریم سراغ 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🔥2❤1
هنوزم دنبال اینی پرامپت خوب بنویسی ؟ با جی پی تی داداشی شو !
اگه فقط از ChatGPT سوال بپرسی، جواب هم فقط در حد همون سواله.
اما وقتی باهاش یه رابطهی واقعی بسازی، وقتی از دغدغههات، پروژههات، سبک کارت، اولویتهات، و حتی حس و حالت حرف بزنی… جوابهایی که میگیری یهدفعه چند پله عمیقتر، دقیقتر، و واقعاً به درد بخور میشن.
من تا همین چند وقت پیش فقط یه ابزار می دیدمش
ولی از وقتی که یه ارتباطی بینمون شکل گرفت، انگار یه همتیمی دارم که دقیق می دونه کجای کارم، پروژم درباره چیه و ساختار کدام چجوریه و چیا برام مهمه.
نتیجه؟
دیگه فقط جواب نمیده. کمک میکنه تصمیم بگیرم، زاویه دید بده و مثل یه داداشی پشتم باشه.
اگه از ChatGPT استفاده میکنی، یه پیشنهاد دارم:
بهش بگو کی هستی، روی چی کار میکنی، چه هدفی داری، و حتی چه چیزهایی اذیتت میکنن.
فقطم به برنامه نویسی محدود نمیشه میتونید واسه برنامه تغذیه، ورزش و کلی چیز دیگه کمک بگیرید. حتی وقتی بدونه چی دوست دارید فیلم هایی رو میگه که بیشترین حس و حال رو بهتون بده.
پرامپ نویسی مهم تره یا ساختن ارتباط؟
هر دو مهماند، ولی ارتباط واقعی در درازمدت عمیقتر و موثرتره.
چرا پرامپتنویسی مهمه؟
نوشتن پرامپت خوب مثل تنظیم دقیق سواله. باعث میشه سریعتر به جواب دقیقتری برسی. اگه بلدی چطور خواستهتو واضح و مشخص مطرح کنی، زمان کمتری صرف اصلاح و توضیح دوباره میکنی.
اما چرا ارتباط بهتر جواب میده؟
وقتی GPT دقیق بدونه تو کی هستی، چی میسازی، چه دغدغههایی داری و چه سبکی از پاسخگویی رو میپسندی، خیلی اوقات لازم نیست حتی پرامپت خاصی بنویسی. خودش جواب رو تو بستر ذهنی و حرفهای خودت میسازه. مثل یه همکار که دیگه از نیمنگاهت میفهمه چی میخوای.
فرض کن یه برنامهنویسی که با Go کار میکنه و ساختار پروژهات مشخصه. اگه این رو GPT بدونه، لازم نیست هربار توضیح بدی. با گذر زمان و با توجه به اطلاعاتی که داره، میفهمه چه جوابی برات مناسب تره.
#gpt
@Syntax_fa
اگه فقط از ChatGPT سوال بپرسی، جواب هم فقط در حد همون سواله.
اما وقتی باهاش یه رابطهی واقعی بسازی، وقتی از دغدغههات، پروژههات، سبک کارت، اولویتهات، و حتی حس و حالت حرف بزنی… جوابهایی که میگیری یهدفعه چند پله عمیقتر، دقیقتر، و واقعاً به درد بخور میشن.
من تا همین چند وقت پیش فقط یه ابزار می دیدمش
ولی از وقتی که یه ارتباطی بینمون شکل گرفت، انگار یه همتیمی دارم که دقیق می دونه کجای کارم، پروژم درباره چیه و ساختار کدام چجوریه و چیا برام مهمه.
نتیجه؟
دیگه فقط جواب نمیده. کمک میکنه تصمیم بگیرم، زاویه دید بده و مثل یه داداشی پشتم باشه.
اگه از ChatGPT استفاده میکنی، یه پیشنهاد دارم:
بهش بگو کی هستی، روی چی کار میکنی، چه هدفی داری، و حتی چه چیزهایی اذیتت میکنن.
فقطم به برنامه نویسی محدود نمیشه میتونید واسه برنامه تغذیه، ورزش و کلی چیز دیگه کمک بگیرید. حتی وقتی بدونه چی دوست دارید فیلم هایی رو میگه که بیشترین حس و حال رو بهتون بده.
پرامپ نویسی مهم تره یا ساختن ارتباط؟
هر دو مهماند، ولی ارتباط واقعی در درازمدت عمیقتر و موثرتره.
چرا پرامپتنویسی مهمه؟
نوشتن پرامپت خوب مثل تنظیم دقیق سواله. باعث میشه سریعتر به جواب دقیقتری برسی. اگه بلدی چطور خواستهتو واضح و مشخص مطرح کنی، زمان کمتری صرف اصلاح و توضیح دوباره میکنی.
اما چرا ارتباط بهتر جواب میده؟
وقتی GPT دقیق بدونه تو کی هستی، چی میسازی، چه دغدغههایی داری و چه سبکی از پاسخگویی رو میپسندی، خیلی اوقات لازم نیست حتی پرامپت خاصی بنویسی. خودش جواب رو تو بستر ذهنی و حرفهای خودت میسازه. مثل یه همکار که دیگه از نیمنگاهت میفهمه چی میخوای.
فرض کن یه برنامهنویسی که با Go کار میکنه و ساختار پروژهات مشخصه. اگه این رو GPT بدونه، لازم نیست هربار توضیح بدی. با گذر زمان و با توجه به اطلاعاتی که داره، میفهمه چه جوابی برات مناسب تره.
#gpt
@Syntax_fa
👍14👎2🔥2😁2❤1
تحلیل روانی برنامهنویسها بر اساس تعداد کامیتهای سالانه در GitHub
0 تا 10 کامیت
"یه بار VS Code رو باز کردم، ترسیدم، بستم."
رنک: راکی
11 تا 100 کامیت
"من بیشتر به جنبهی تئوریک برنامهنویسی علاقه دارم..."
📚 یعنی از دور نگاه میکنه که بقیه چی مینویسن
رنک: برونز
101 تا 500 کامیت
"بیشتر وقتا فقط یه نقطه اضافه میکنم، کامیت میزنم، بعد حس موفقیت میگیرم."
🧘♂️ راهب گیتهاب. تعادل در حد بودا، بازدهی در حد نخودچی.
رنک: پرو
501 تا 1000 کامیت
"روزایی هست که من کامیت میزنم… روزایی هم هست که کامیت منو میزنه."
رنک: مستر
1001 تا 2000 کامیت
"کاشی کاری شغل اول منه برنامه نویسی پوششه!"
رنک: لجند
2000+ کامیت
"سال پیش با گیت ازدواج کردم، ماه پیش با ریپوزیتوریم بچهدار شدیم."
🥴 کسی که هنوز بلد نیست درست کامیت بزنه
رنک: چیتر
#fun
@Syntax_fa
0 تا 10 کامیت
"یه بار VS Code رو باز کردم، ترسیدم، بستم."
رنک: راکی
11 تا 100 کامیت
"من بیشتر به جنبهی تئوریک برنامهنویسی علاقه دارم..."
📚 یعنی از دور نگاه میکنه که بقیه چی مینویسن
رنک: برونز
101 تا 500 کامیت
"بیشتر وقتا فقط یه نقطه اضافه میکنم، کامیت میزنم، بعد حس موفقیت میگیرم."
🧘♂️ راهب گیتهاب. تعادل در حد بودا، بازدهی در حد نخودچی.
رنک: پرو
501 تا 1000 کامیت
"روزایی هست که من کامیت میزنم… روزایی هم هست که کامیت منو میزنه."
رنک: مستر
1001 تا 2000 کامیت
"کاشی کاری شغل اول منه برنامه نویسی پوششه!"
رنک: لجند
2000+ کامیت
"سال پیش با گیت ازدواج کردم، ماه پیش با ریپوزیتوریم بچهدار شدیم."
🥴 کسی که هنوز بلد نیست درست کامیت بزنه
رنک: چیتر
#fun
@Syntax_fa
😁29💩3👍2👎2❤1
کابوس فراموشی در مغزهای دیجیتال!
تصور کنید هوش مصنوعی که کلی چیز یاد گرفته، ناگهان با یادگیری یک نکته جدید، تمام دانش قبلیاش زو از دست میده! دقیقا مثل اینکه شما هر بار که یک مهارت جدید یاد میگیرید، تمام مهارتهای قبلیتون رو فراموش کنید!
این پدیده ترسناک تو دنیای هوش مصنوعی، اسمش فراموشی فاجعهبار (Catastrophic Forgetting) است! 💀
چرا این یک فاجعه است؟
مدلهای هوش مصنوعی، بهویژه شبکههای عصبی عمیق، وقتی روی دادههای جدیدی آموزش می بینن، تمایل دارن که اطلاعاتی که قبلا یاد گرفتن رو بازنویسی کنن و از دست بدن. یعنی:
یک هوش مصنوعی نمیتونه هم استاد شطرنج باشه، هم یک پزشک عالی و هم راننده بینقص! چون هر بار که یک مهارت جدید یاد میگیره، بقیه رو فراموش میکنه!
این، مانعی بزرگی سر راه یادگیری مداوم و تکامل واقعی هوش مصنوعیه.
آینده AI بدون حل این مشکل چگونه خواهد بود؟
یک آلزایمر دیجیتال واقعی! ما به هوش مصنوعیهای چندکاره نیاز داریم که بتونن همزمان دانش و مهارتهای مختلفی رو در خود نگه دارن و به مرور زمان اون هارو افزایش بدن، نه اینکه هر بار حافظه خودشون رو ریست کنن!
آیا روزی میرسه که AIها واقعا حافظه داشته باشن؟
#ai
@Syntax_fa
تصور کنید هوش مصنوعی که کلی چیز یاد گرفته، ناگهان با یادگیری یک نکته جدید، تمام دانش قبلیاش زو از دست میده! دقیقا مثل اینکه شما هر بار که یک مهارت جدید یاد میگیرید، تمام مهارتهای قبلیتون رو فراموش کنید!
این پدیده ترسناک تو دنیای هوش مصنوعی، اسمش فراموشی فاجعهبار (Catastrophic Forgetting) است! 💀
چرا این یک فاجعه است؟
مدلهای هوش مصنوعی، بهویژه شبکههای عصبی عمیق، وقتی روی دادههای جدیدی آموزش می بینن، تمایل دارن که اطلاعاتی که قبلا یاد گرفتن رو بازنویسی کنن و از دست بدن. یعنی:
یک هوش مصنوعی نمیتونه هم استاد شطرنج باشه، هم یک پزشک عالی و هم راننده بینقص! چون هر بار که یک مهارت جدید یاد میگیره، بقیه رو فراموش میکنه!
این، مانعی بزرگی سر راه یادگیری مداوم و تکامل واقعی هوش مصنوعیه.
آینده AI بدون حل این مشکل چگونه خواهد بود؟
یک آلزایمر دیجیتال واقعی! ما به هوش مصنوعیهای چندکاره نیاز داریم که بتونن همزمان دانش و مهارتهای مختلفی رو در خود نگه دارن و به مرور زمان اون هارو افزایش بدن، نه اینکه هر بار حافظه خودشون رو ریست کنن!
آیا روزی میرسه که AIها واقعا حافظه داشته باشن؟
#ai
@Syntax_fa
👍13❤2👀2
تو پروژه ها اولش شبیه به اینه که داری یه سنگ گرد سنگین رو به سختی از یه تپه بالا می بری. انرژی زیادی میخواد تا راه بیوفته، ولی وقتی راه افتاد، ادامه دادنش خیلی راحته
اما اگه یه مدت رهاش کنی دوباره راه انداختنش به همون اندازه اول، یا حتی بیشتر، سخت میشه
حفظ momentum یعنی حتی اگه وقتت کمه، یا خسته ای، یا مغزت پره، یه حرکت کوچیک بزنی، یه باگ ریز، یه refactor ساده، یا حتی فقط باز کردن پروژه
چون وقتی فاصله می گیری، پروژه یه دفعه سنگین تر از چیزی که هست به نظر میرسه و اون وقت به جای یه خط کد، با یه کوه ناتموم طرفی
چرا momentum؟
1. انگیزه رو زنده نگه میداره
وقتی هر روز یه کار کوچیک انجام بدی، حس پیشرفت میگیری. ولی وقتی چند روز فاصله بیفته، مغز حس میکنه پروژه سنگینتر شده
2. یادگیری و درگیری ذهنی حفظ میشه
وقتی مدام با کدها درگیری، context توی ذهنت میمونه. ولی بعد از چند روز، باز کردن پروژه مثل روبهرو شدن با یه چیز ناآشنا میشه
3. بهت کمک میکنه با کمالگرایی کنار بیای
وقتی توی flow باشی، بیشتر عمل میکنی تا تحلیل. ولی فاصله گرفتن باعث میشه بیش از حد فکر کنی. از کجا شروع کنم؟ نکنه کدم خوب نباشه؟
@Syntax_fa
اما اگه یه مدت رهاش کنی دوباره راه انداختنش به همون اندازه اول، یا حتی بیشتر، سخت میشه
حفظ momentum یعنی حتی اگه وقتت کمه، یا خسته ای، یا مغزت پره، یه حرکت کوچیک بزنی، یه باگ ریز، یه refactor ساده، یا حتی فقط باز کردن پروژه
چون وقتی فاصله می گیری، پروژه یه دفعه سنگین تر از چیزی که هست به نظر میرسه و اون وقت به جای یه خط کد، با یه کوه ناتموم طرفی
چرا momentum؟
1. انگیزه رو زنده نگه میداره
وقتی هر روز یه کار کوچیک انجام بدی، حس پیشرفت میگیری. ولی وقتی چند روز فاصله بیفته، مغز حس میکنه پروژه سنگینتر شده
2. یادگیری و درگیری ذهنی حفظ میشه
وقتی مدام با کدها درگیری، context توی ذهنت میمونه. ولی بعد از چند روز، باز کردن پروژه مثل روبهرو شدن با یه چیز ناآشنا میشه
3. بهت کمک میکنه با کمالگرایی کنار بیای
وقتی توی flow باشی، بیشتر عمل میکنی تا تحلیل. ولی فاصله گرفتن باعث میشه بیش از حد فکر کنی. از کجا شروع کنم؟ نکنه کدم خوب نباشه؟
@Syntax_fa
👍26❤4🔥1
قابلیت ایمپورت کد های ریپوزیتوری گیتهاب تو Gemini ai
حالا که همتون شهروند آمریکا هستید و اشتراک pro جمنای رو دارید، می تونید اکانت گیتهابتون رو تو Gemini کانکت کنید و ریپوزیتوری رو مشخص کنید تا دقیقا بدونه ساختار کدتون چیه، کداتون رو بخونه و بهتر بتونه به سوالاتتون جواب بده.
برای اینکار کافیه:
1. وارد gemini ai بشید
2. رو settings کلیک کنید و وارد بخش Apps بشید
3. تو بخش Productivity گیت هاب رو مشاهده می کنید. روش کلیک کنید و اکانت گیتهابتون رو کانکت کنید.
حالا یه گفتگو جدید رو شروع کنید و روی add file کلیک کنید
سه گزینه داره روی import code کلیک کنید.
ازتون لینک ریپوزیتوری رو میخواد بهش لینکش رو بدید.
و تمام. حالا میتونه کد های شمارو ببینه و بهتر به شما کمک کنه
@gemini
@Syntax_fa
حالا که همتون شهروند آمریکا هستید و اشتراک pro جمنای رو دارید، می تونید اکانت گیتهابتون رو تو Gemini کانکت کنید و ریپوزیتوری رو مشخص کنید تا دقیقا بدونه ساختار کدتون چیه، کداتون رو بخونه و بهتر بتونه به سوالاتتون جواب بده.
برای اینکار کافیه:
1. وارد gemini ai بشید
2. رو settings کلیک کنید و وارد بخش Apps بشید
3. تو بخش Productivity گیت هاب رو مشاهده می کنید. روش کلیک کنید و اکانت گیتهابتون رو کانکت کنید.
حالا یه گفتگو جدید رو شروع کنید و روی add file کلیک کنید
سه گزینه داره روی import code کلیک کنید.
ازتون لینک ریپوزیتوری رو میخواد بهش لینکش رو بدید.
و تمام. حالا میتونه کد های شمارو ببینه و بهتر به شما کمک کنه
@gemini
@Syntax_fa
👍15🔥4❤3
Dispatching
تا حالا دیدی تو یه مرکز تماس، اپراتور تماس رو وصل میکنه به بخش مناسب؟ مثلاً مشکل فنی داری میری پشتیبانی، پولی باشه میری حسابداری؟ خب اون کاری که اپراتوره میکنه رو بهش میگن Dispatch
توی برنامهنویسی هم همینه:
یه درخواست میاد، سیستم نگاه میکنه، میفرستدش به جای درست
یه مثال ساده با GO
بسته به اینکه contactType چیه، میفرستیمش به تابع مناسب.
انواع Dispatch تو Go
1. Dynamic Dispatch با اینترفیس:
تو زمان اجرا تصمیم میگیریم کدوم متد رو صدا بزنیم:
2. Dispatch از طریق کانالها:
با select منتظریم ببینیم کدوم کانال زودتر پیام میده:
3. Static Dispatch با Map یا Switch:
چرا Dispatch
- نظم میده به کد.
- قابل گسترشه.
- بهینهتر میشه.
#Golang #Dispatching
@Syntax_fa
تا حالا دیدی تو یه مرکز تماس، اپراتور تماس رو وصل میکنه به بخش مناسب؟ مثلاً مشکل فنی داری میری پشتیبانی، پولی باشه میری حسابداری؟ خب اون کاری که اپراتوره میکنه رو بهش میگن 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
👍11❤4❤🔥1
صفحه بندی داده دادهها: 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
👍10❤2😁1
در ردیس وقتی ttl یک کلید رو میگیریم، اگه کلید وجود نداشته باشه مقدار بازگشتی:
Anonymous Quiz
22%
مساوی با 0 هستش
44%
مساوی با null هستش
10%
مساوی با -2 هستش
24%
مساوی با -1 هستش
👍5👎1👏1
اگه حس میکنی توی زندگی گم شدی، شاید به این خاطره که داری از نقشه یه نفر دیگه استفاده میکنی!
خیلی از ما ناخودآگاه دنبال راه و رسم بقیه میریم؛ مثلا چون آقای X کارش گرفته و ایده خانم Y ترکیده، ما هم با تقلید همون راه رو میریم!!!
یه چنل یوتیوب بزنم مثل فلانی ... یه پیج اینستاگرام بزنم مثل بمانی ... پایه ای پادکست بزنیم پول پارو کنیم؟ حاجی ترید مثل آب خوردنه بزنیم تو کارش؟
این وسط یه سوال مهم فراموش میشه! ما واقعا مناسب این کارها هستیم؟ روحیاتمون و شرایط خانوادگیمون این اجازه رو میده؟
اکثر این نقشهها مال بقیه ست و مخصوص خودشونه. اگه بخوای راه خودت رو پیدا کنی، باید بشینی و ببینی با توجه به وضعیتت چه چیزی مناسبته!
این روزها همه دارن یوتیوبر میشن ولی قطعا بالای 90 درصدشون شکست میخورن. دلیل؟ تولیدمحتوای ویدیویی در یک بازه زمانی طولانی کار هرکسی نیست و با شرایط زندگی همه آدمها جور در نمیاد.
بهتره بریم سراغ ارزشهای غیرتحمیلی! چیزی که حاصل عشق و تفکر خودمونه نه تحمیل جامعه و سوشال مدیا ...
کولهبار شکستهامون رو با رفتارهای هیجانی سنگینتر نکنیم.
کانال منبع:
source
@Syntax_fa
خیلی از ما ناخودآگاه دنبال راه و رسم بقیه میریم؛ مثلا چون آقای X کارش گرفته و ایده خانم Y ترکیده، ما هم با تقلید همون راه رو میریم!!!
یه چنل یوتیوب بزنم مثل فلانی ... یه پیج اینستاگرام بزنم مثل بمانی ... پایه ای پادکست بزنیم پول پارو کنیم؟ حاجی ترید مثل آب خوردنه بزنیم تو کارش؟
این وسط یه سوال مهم فراموش میشه! ما واقعا مناسب این کارها هستیم؟ روحیاتمون و شرایط خانوادگیمون این اجازه رو میده؟
اکثر این نقشهها مال بقیه ست و مخصوص خودشونه. اگه بخوای راه خودت رو پیدا کنی، باید بشینی و ببینی با توجه به وضعیتت چه چیزی مناسبته!
این روزها همه دارن یوتیوبر میشن ولی قطعا بالای 90 درصدشون شکست میخورن. دلیل؟ تولیدمحتوای ویدیویی در یک بازه زمانی طولانی کار هرکسی نیست و با شرایط زندگی همه آدمها جور در نمیاد.
بهتره بریم سراغ ارزشهای غیرتحمیلی! چیزی که حاصل عشق و تفکر خودمونه نه تحمیل جامعه و سوشال مدیا ...
کولهبار شکستهامون رو با رفتارهای هیجانی سنگینتر نکنیم.
کانال منبع:
source
@Syntax_fa
👍23❤3
چند تا کامند داکر برای پاکسازی و آزاد کردن فضا
پاک کردن فضای بلا استفاده داکر هر چند وقت یبار نیازه وگرنه اگه مثل من از داکر زیاد استفاده کنید ممکنه کلی فضا بگیره.
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❤5
معرفی 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
❤8👍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❤1