Dev Perfects
40 subscribers
9.23K photos
1.26K videos
468 files
13K links
بخوام خیلی خلاصه بگم
این کانال میاد مطالب کانالای خفن تو حوزه تکنولوژی و برنامه نویسی رو جمع میکنه

پست پین رو بخونید
https://t.iss.one/dev_perfects/455


ارتباط:
https://t.iss.one/HidenChat_Bot?start=936082426
Download Telegram
Forwarded from کانال مهرداد لینوکس (Mehrdad Linux)
This media is not supported in your browser
VIEW IN TELEGRAM
دنبال یک جایگزین برای grep در ترمینال لینوکس هستی ؟
همه CGrep،ngrep،vgrep،bingrep و ... را امتحان کردید راضی نبودید !!!

این شما و این هم ugrep
مستندات عالی
https://ugrep.com/
سازگاری کامل با GNU grep
یک سویچ -Q بزار جلوش یک query TUI to search میده باقلوا

semantic-grep
ripgrep

نصب کن حالشو ببر
#linux #لینوکس
Forwarded from Artin
وقتی همه خوابن، تو هنوز داری با یه ارور کلنجار میری؟
وقتی کد می‌زنی، حس می‌کنی با دنیا درگیری؟
همه می‌پرسن "مگه برنامه‌نویسی خنده‌دارم هست؟"
ما می‌گیم: آره... خیلی هم هست!

پروگرمرز جوک جاییه برای همدردی، خنده، و یه ذره دیوونه‌بازی دولوپری.
میم‌های خفن، جوک‌های تخصصی، و طنزی که فقط ما می‌فهمیم.

اگه دنبال یه نفس تازه وسط باگ‌ها و دیباگ‌هاتی،
این کانال برای توئه:
t.iss.one/programmerjokes_fa

بیا بخندیم. با هم.
Forwarded from محتوای آزاد سهراب (Sohrab)
کازمیک یک باگ مسخره‌ای که داره و گزارش کردم بهشون اینه که وقتی کیبورد فارسی رو اضافه می‌کنی و از sddm به عنوان دیسپلی منیجر استفاده کنی، کیبورد پیشفرض sddm به فارسی تغییر پیدا می‌کنه :)))


اصولاً نباید اینطوری بشه، هم باگ عجیبی بود هم شدیداً رو مخ.


@SohrabContents
Forwarded from Linuxor ?
می‌دونستین نسخه وب تلگرام از یه قابلیت معروف مرورگر به اسم Service Worker استفاده می‌کنه؟

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

تلگرام ازش برای رمزنگاری کردن streamها، کش کردن مدیا، و دریافت ناتیفیکیشن استفاده می‌کنه.

در واقع تلگرام وب یه اپ native هستش که روی مرورگر سوار شده سرویس ورکر ها توی یه thread جدا اجرا می‌شن این یعنی:
رمزگشایی فایل‌ها (مثلاً ویدیوهای MP4 یا voice) مرورگر رو کند نمی‌کنه و حتی آپلودها یا دانلودها می‌تونن توی پس‌زمینه ادامه پیدا کنن :)


@Linuxor
Forwarded from محتوای آزاد سهراب (Sohrab)
خب فعلاً بیخیال نصب کازمیک بشید چون یک نیم ساعتی هم من رو علاف کرد و مجبور شدم کل کانفیگ‌هام رو ریست کنم.

این بزرگوار میاد و توی dconf یک کلید می‌نویسه برای تم GTK، تا اینجاش که اوکیه. ولی وقتی کی‌دی‌ای هم داشته باشی و کازمیک رو حذف کنی اون کلید حذف نمیشه و بعد از حذف کازمیک تم ریست میشه به دیفالت گنوم و غیرقابل تغییر میشه.


و من الان یک مشت بسته اضافی کازمیک رو نگهداشتم که اون کلید حذف نشه.


@SohrabContents
یک نکته قابل توجهی که می‌گه و تو گروه هم ما راجبش بحث کردیم.
اینه که توی مارکت Rust برنامه‌نویس‌های Junior بیشتر وجود داره (که خب استخدام نشدن هم دلیلش همین هست) اکثر شرکت‌هایی که میرند سمت زبان Rust نیاز به کسی دارند که بیزینس رو خوب بلد باشه یا توی زبان برنامه‌نویسی و ... ایی که قبلا کار کرده Senior باشه و حالا Rust هم بتونه کد بزنه!

برای همین ۹۹٪ شما وقتی می‌گید من دارم Rust میخونم؛ می‌گم: اشتباه می‌کنی.

هیچ شکی نیست که قطعا همه جونیورها هم یک روزی سنیور خواهند شد! ولی اگر توی Python, Go, ... شروع کنید که مارکت همین الان کار برای جونیور داره؛ احتمالا خیلی سریعتر پیشرفت می‌کنید؛ تجربیات مهم رو بدست میارید و سنیور می‌شید!
Forwarded from Md Daily (Mahan)
داشتم یه مقاله فوق‌العاده از یه تجربه عملیاتی سنگین می‌خوندم با عنوان: «چطور یک میلیارد رکورد رو از DB1 به DB2 جابجا کردیم؛ بدون Downtime» 🚀

نویسنده مقاله (و تیمش) با یه چالش بزرگ روبرو بودن: دیتابیس قدیمیشون که دیتای حساس مالی (پرداخت، سفارش و...) رو نگه می‌داشت، از ۱ میلیارد رکورد رد شده بود و به شدت کند شده بود, Queryهایی که ثانیه‌ای طول می‌کشید، `Batch Job`ها (کارهایی که دسته‌ای مثل تسویه حساب‌ها) ساعتی طول می‌کشید. Scale کردن (افزایش مقیاس) دیگه جواب نمی‌داد و باید مهاجرت می‌کردن، اونم بدون حتی یک ثانیه Downtime (قطعی).

این خلاصه‌ی قدم‌به‌قدم کاریه که انجام دادن:

1️⃣ جابجایی دیتای قدیمی (Bulk Migration)

برای انتقال Cold data (دیتای قدیمی که دیگه تغییر نمی‌کنه)، نیومدن یه Dump (فایل خروجی) گنده بگیرن. به جاش:

✔️ جدول رو بر اساس رنج Primary Key (کلید اصلی جدول) به Chunk (تکه‌های کوچیک دیتا) تقسیم کردن.

✔️ موقع بارگذاری، ایندکس‌های ثانویه و `Constraint`ها (قیدها) رو غیرفعال کردن (تا سرعت Insert (ثبت دیتا) بالا بره).

✔️ چندتا ورکر رو Parallel (موازی) برای انتقال این تیکه‌ها ران کردن.

✔️ بعد از انتقال هر تیکه، یه Checksum (یه جور کد محاسباتی برای چک کردن یکی بودن دیتا) می‌گرفتن تا مطمئن بشن دیتا دقیقاً کپی شده.

2️⃣ مدیریت ترافیک زنده (Dual Writes)

چالش اصلی، دیتای جدیدی بود که همزمان با مهاجرت داشت وارد می‌شد.

✔️ اپلیکیشن رو طوری تغییر دادن که Dual Writes (نوشتن همزمان در دو دیتابیس) انجام بده (یعنی هر دیتای جدید رو همزمان هم تو دیتابیس قدیمی و هم تو دیتابیس جدید بنویسه).

✔️ برای اینکه مطمئن بشن دیتایی گم نمی‌شه، اگه نوشتن تو دیتابیس جدیده خراب می‌شد، اون رویداد (event) رو می‌نداختن توی یه `Retry Queue` کافکا (صفی برای کارهای شکست‌خورده که باید دوباره امتحان بشن).

✔️ یه Consumer (سرویسی که از صف کافکا دیتا می‌خونه) جدا اون صف رو می‌خوند و اونقدر تلاش می‌کرد تا بالاخره تو دیتابیس جدیده هم ثبت بشه.

✔️ برای جلوگیری از تکراری ثبت شدن دیتا (موقع تلاش مجدد)، همه‌ی نوشتن‌ها رو با آیدی یکتا Idempotent (یعنی اگه یه کاری رو چند بار هم اجرا کنی، نتیجه نهایی یکی باشه) کرده بودن.

3️⃣ تست پنهانی در پروداکشن (Shadow Reads)

خب، دیتاها سینک بودن. ولی آیا دیتابیس جدیده زیر بار واقعی جواب می‌داد؟

✔️ اینجا از Shadow Reads (خوندن پنهانی از دیتابیس جدید برای تست) استفاده کردن.

✔️ مشتری‌ها هنوز داشتن از دیتابیس قدیمی می‌خوندن اما در پشت صحنه، اپلیکیشن همون `Query` رو روی دیتابیس جدیده هم می‌زد و نتایج رو با هم مقایسه می‌کرد.

✔️ این کار باعث شد کلی باگ ریز ولی حیاتی رو پیدا کنن که تو تست‌ها معلوم نمی‌شد: مثلاً تفاوت رفتار Timezone ها (منطقه‌های زمانی)، تبدیل `NULL`ها (مقادیر پوچ) به مقادیر پیش‌فرض، و تفاوت در Collation (قواعد مرتب‌سازی و مقایسه متن‌ها) (که باعث می‌شد مرتب‌سازی نتایج فرق کنه).

4️⃣ لحظه جابجایی نهایی (The Cutover)

روز Cutover (لحظه جابجایی کامل و سوییچ کردن)، ریسک اصلی این بود که Cache (حافظه موقت) دیتابیس جدیده «سرد» (Cold) بود و اولین کوئری‌ها ممکن بود خیلی کند باشن.

✔️ قبل از سوییچ، با اجرای کوئری‌های مصنوعی، کش دیتابیس جدید رو Pre-warm (گرم کردن کش با دیتای الکی) کردن.

✔️ ساعت ۴:۳۰ صبح (کمترین ترافیک) با زدن یه Feature Flag (یه جور کلید نرم‌افزاری برای روشن/خاموش کردن قابلیت‌ها)، همه‌ی Read ها (خوندن‌ها) رو به سمت دیتابیس جدید فرستادن. (برای اطمینان، Dual Writes رو هنوز روشن نگه داشتن تا راه برگشت امن داشته باشن).

5️⃣ رصد کردن (Observability) 📊

نویسنده میگه چیزی که واقعاً نجاتشون داد، SQL خفن نبود، بلکه Observability (قابلیت رصد کامل سیستم) بود. اونا وسواسی همه‌چیز رو مانیتور می‌کردن:

✔️ با Replication Lag (میزان عقب بودن دیتابیس‌های کپی از دیتابیس اصلی)

✔️ با `Deadlock`ها (وقتی دوتا پروسه قفل منتظر هم می‌مونن)

✔️ با Cache Hit Ratio (درصدی از دیتا که از کش خونده می‌شه نه از دیسک)

✔️ با شمارنده‌ی عدم تطابق نتایج در Shadow Reads

✔️ و از همه مهم‌تر: `KPI`های بیزینسی (شاخص‌های کلیدی عملکرد مثل سفارش در دقیقه).

ما چی می تونیم یاد بگیریم؟ 💡

مهاجرت‌های بزرگ، یه «مسئله دیتابیسی» نیستن، بلکه یه «مسئله System Design (طراحی سیستم)» هستن.

شما یه میلیارد ردیف رو یهو جابجا نمی‌کنید، بلکه batch امن به batch امن»، «ورودی WAL (فایلی که دیتابیس قبل از هر کاری، تغییرات رو اول اونجا می‌نویسه) به WAL» و «Checksum به Checksum» این کار رو می‌کنید.

در نهایت: Zero Downtime (قطعی صفر) شانسی نیست؛ طراحیه.

—-

💡 مثل همیشه کنجکاو بمونید :)

🆔 @MdDaily
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Gopher Academy
اخیرا درگیر کوچ کردن از یه سیستم مونولیت قدیمی با Symfony به میکروسرویس با Golang هستم. اونایی که تجربه این مدل کوچ کردن هارو توی سیستم های زیر بار و قدیمی دارن میدونن که مشکل اصلی دیتابیس و جلو رفتن بر اساس اسکیمای فعلی هست و این مدل کوچ ها باید تقریبا بدون Breaking Changes اتفاق بیوفته.

اینجا بود که با SqlBoiler توی زبان Go آشنا شدم.

مزایای SqlBoiler:

۱. ساخت Struct در یک چشم به هم زدن:
به جای اینکه ساعت‌ها بشینم و دستی Structهای گو رو بر اساس جدول‌های دیتابیس بنویسم، SQLBoiler در عرض چند ثانیه تمام مدل‌های Type-Safe ما رو ساخت. وقتم رو خرید، خیلی زیاد!

۲. تمرکز بر دیتابیس (Database-First):
چون دیتابیس ما از قبل وجود داشت، این ابزار خیلی راحت خودشو با Schema ما سینک کرد. انگار ساخته شده بود برای همین وضعیت!

۳. کوئری‌های ایمن و هوشمند:
دیگه نگران خطاهای احمقانه زمان اجرا (Runtime) نیستم. با تولید کوئری‌های Strongly Typed، هر اشتباهی توی نام ستون یا جدول باشه، همون موقع
کامپایل گیر میده.

۴. فقط چیزهای ضروری رو بگیر:
قابلیت Whitelist/Blacklist جدول‌ها و ستون‌ها فوق‌العاده است. توی محیط میکروسرویس که هر سرویس فقط به یه بخش دیتابیس نیاز داره، با این قابلیت فقط مدل‌های مرتبط رو تولید کردم و کد اضافی رو حذف کردم.

اینم لینک گیتهابش:
https://github.com/aarondl/sqlboiler

<Sepehr Mohseni/>
Forwarded from Shayan GeeDook🐧
https://hheydarian.github.io/Gitab/


درود دوستان چطورین؟
یه سایتی رو دیدم که بشدت کار ارزشمندی رو دارن انجام میدن و بشدت مورد احترام هستن.
دیدم که یکی از دوستانی که باهاشون ارتباط بودم در زمان جنگ یه رپویی گذاشته که ترجمه هارو دارن انجام میدن و حتما اگر شما هم میتونید کمکی کنید حتما به اشتراک بگذارید و مشارکت کنید اگر دوست داشتید
دمتون گرم

@shayangeedook
Forwarded from Linuxor ?
الان که هوش مصنوعی ترسی نداره زمانی که هوش مصنوعی بتونه جوک خنده دار بگه باید ازش ترسید... نه به‌خاطر جوک هاش بلکه به‌خاطر خلاقیتش و توانایی استفاده و درک زمان حال؛ جوک خنده دار گفتن یعنی اینکه خلاقیت خیلی بالا رفته و می‌تونه از موضوعات حال (نه حتی گذشته، چون جوک های قدیمی معمولا خنده دار نیستن) چیز جدید بسازه.

این یعنی می‌تونه بره ترید کنه سود بده (چون اخبار زمان حال رو می‌تونه بخونه) یا برنامه نویسی کنه و یه سایت بسازه که ما واقعا ازش خوشمون بیاد. (کسی از دیجیکالای 5 سال پیش خوشش نمیاد)

@Linuxor
Forwarded from Future Pulse Persian
دارم پادکست پاول دوروف مال تلگرام رو میبینم

نکته جالبش اینجا اگر برادر نابغش نبود هیچ وقت تلگرامی وجود نداشت

نکته دیگه اینه اگر دقت کرده باشید پاول برعکس مارک زاکربرگ ، ایلان ماسک و . . .

زندگی خیلی لاکچری داره ولی ایلان و زاکربرگ همیشه ساده پوشن و خیلی زنی بی آلایشی از خودشون نشون میدن

حتی مارک و ایلان نهایتا ۶ تا ۸  ساعت میخوابن و پاول ۱۲ ساعت

دلیلش از نظر من خیلی جالبه

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

ولی پاول مالک خودش هست و برادرش و کلا ۴۰ برنامه نویس

هیچ وقت هم جواب به کسی نمیده

نکات خیلی زیادی داره این شخص پیشنهاد میکنم حتما درموردش مطالعه کنید

https://www.youtube.com/watch?v=qjPH9njnaVU
پشماتون بریزه

دقتِ خیلی زیاد نکنید به فنا می‌رید.

rnicrosoft[.]com

@DevTwitter
Forwarded from Ninja Learn | نینجا لرن (Mohammad)
اقا گپه ما چشه توش چت نمیکنید :(
Forwarded from Linuxor ?
اون فریم‌ورک و زبان برنامه نویسی که تو رفتی سراغش :

@Linuxor
Forwarded from 🎄 یک برنامه نویس تنبل (Lazy 🌱)
🔶 لیست ۵ کشور برتر جهان در فناوری‌های پیشرفته و تولید

#توییت

@TheRaymondDev
Forwarded from 🎄 یک برنامه نویس تنبل (Lazy 🌱)
🔶 به عنوان برنامه نویس وردپرس که افزونه ورود موبایل پیامکی وردپرس نوشتم, این شرکت های پیامکی چه اصراری است که برای دریافت API آن و نوشتن درایور مربوطه کلی مدرک هویتی بفرستیم؟

چون می خواهیم تست کنیم و این همه مدرک می خوای چکار کنید؟ از دستت کلافه شدم.

قرار نیست در سرویس پیامکی فعالیت رسمی داشته باشیم.

#وردپرس

@TheRaymondDev
Forwarded from Ditty | دیتی
۱۰۰ بار سریع‌تر از 𝗘𝗦𝗟𝗶𝗻𝘁 ؟! 😃

- واقعاً یکی از معضلات پروژه‌های بزرگ وقتیه که ابزارهایی مثل Linter و Formatter و روی اونها اجرا میشه

- جدیداً با توصیه Evan You (خالق Vue و Vite و …) با پروژه‌ای به اسم Oxc آشنا شدم که مجموعه‌ای از چند ابزار #جاوااسکریپتی هست که با زبان Rust نوشته شده و ادعا می‌کنه که سرعت و عملکرد فوق‌العادی در مقایسه با رقبا داره

- این ابزارها شامل Parser و Linter و Formatter و Minifier و … هست و توی پروژه‌هایی مثل Vite+ و Shopify و Turborepo استفاده شده و برای مثال ادعا می‌کنه ۱۰۰ برابر سریع تر از ESLint و ۴۰ برابر سریع‌تر از Babel هست

- یکی از ابزارهای این پروژه Oxlint هست که از اکثر دستورات فعلی ESLint و … پشتیبانی می‌کنه. اگه اندازهٔ پروژه‌تون خیلی بزرگ نیست و از ESlint استفاده می‌کنین، می‌تونین اون رو کاملاً با Oxlint جایگزین کنین

- برای آشنایی بیشتر با این پروژه این صفحه رو ببینین:
https://oxc.rs/docs/guide/usage/linter.html

#tools