Syntax | سینتکس – Telegram
تو پروژه ها اولش شبیه به اینه که داری یه سنگ گرد سنگین رو به سختی از یه تپه بالا می بری. انرژی زیادی میخواد تا راه بیوفته، ولی وقتی راه افتاد، ادامه دادنش خیلی راحته
اما اگه یه مدت رهاش کنی دوباره راه انداختنش به همون اندازه اول، یا حتی بیشتر، سخت میشه

حفظ 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
معرفی 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
8👍2
برای حذف کامل ادیتور zed تو لینوکس اینکارو کنید:

~/.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
هوک‌های pre-commit از قبل تنظیم شدن؛ شامل pylint برای بررسی کیفیت کد و gitlint برای استاندارد کردن پیام‌های کامیت.
با GitHub Actions یه CI ساده راه افتاده که روی Pull Requestها تست‌ها و Lint‌ها رو اجرا می‌کنه

#django

@Syntax_fa
👍61
This media is not supported in your browser
VIEW IN TELEGRAM
وضعیت برنامه نویسا چند وقت دیگه

#fun

@Syntax_fa
😁32👀61
مامانم گفت کیس کامپیوترتو دادم به همسایه‌مون چون "فقط خاک می‌خورد". دارم می‌رم خونه اگه منظورش سرورم باشه... امیدوارم که اشتباه شده باشه.

#fun

@Syntax_fa
😁493
توضیح ساده مفهوم 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
👍92👏2
رائفی‌پور:
رفتم چک کردم گیت‌هابشونو
دقیقا 1666 کامیت زده بود! حتما توطئه ای در جریانه و برنامه نویس فراسونر هاست

#fun

@Syntax_fa
😁221👎1
الگوی Profile model

تا حالا به این مشکل برخوردید که توی پروژه‌تون دو نوع کاربر دارید؟ مثلاً «خریدار» و «فروشنده»؟
خریدار فقط نام و ایمیل داره، اما فروشنده کلی اطلاعات اضافه مثل «نام فروشگاه»، «آدرس» و «شماره صنفی» هم داره.

اینجا چند تا راه به ذهن میاد:
راه حل بد: همه‌ی فیلدها رو توی یک مدل User بریزیم (که برای خریدارها کلی فیلد NULL و خالی ایجاد می‌کنه و مدل رو شلوغ می‌کنه).
راه حل پیچیده: برای هر کدوم یک مدل User جدا بسازیم(که مدیریت احراز هویت و دسترسی‌هارو سختش می کنه)

الگوی پروفایل (Profile Model Pattern)


یک مدل User مرکزی داشته باشید: این مدل فقط مسئول اطلاعات مشترک و احراز هویته (نام کاربری، ایمیل، پسورد و ...)

یک مدل Profile جدا بسازید: برای اطلاعات اضافی، یک مدل جدید (مثلا SellerProfile) بسازید و تمام فیلدهای مخصوص فروشنده رو داخل اون قرار بدید.

با OneToOneField وصلشون کنید: این دو مدل رو با یک رابطه یک-به-یک به هم متصل کنید.

#profile_model_pattern

@Syntax_fa
👍181
یه کانال برنامه نویسیه شخصی درست می کنم میذارم تو پروفایلم تا بقیه با استایل خاصم آشنا بشن

#fun

@Syntax_fa
😁53💩21👍1