توی دنیای لاراول همیشه یه قلب تپنده وجود داره که خیلی وقتا مخفی میمونه، ولی همهچی بهش وصله:
Service Container (یا همون IoC Container)
حالا Service Container چیه؟
فرض کن توی یه پروژه بزرگ، کلی سرویس داری: مثل PaymentService، UserRepository، Logger و ...
اگه بخوای همه رو با new بسازی و دستی بهم وصل کنی، خیلی زود پروژه میشه یه باتلاق
اینجاست که Service Container وارد میشه:
تو فقط میگی "من به یه PaymentService نیاز دارم"،
لاراول خودش میره اون رو میسازه و وابستگیهاش رو هم تزریق میکنه.
به این جادوی قشنگ میگن Inversion of Control: یعنی به جای اینکه خودت کنترل ساخت اشیا رو بگیری، این کارو به Container میسپری.
چی شد که از لاراول 8 تا 12 تکامل پیدا کرد؟
بیایم مثل یه خط زمان نگاه کنیم:
* لاراول 8 - Auto-Resolution: لاراول خودش میفهمید چی رو باید resolve کنه.
نیاز کمتر به ثبت دستی سرویسها.
* لاراول 9 - Contextual Binding: میتونستی بگی "وقتی فلان کلاس خواست PaymentGateway رو، بهش Stripe بده؛ ولی برای یه کلاس دیگه Paypal بده".
انعطاف بیشتر توی پروژههای پیچیده.
* لاراول 10 - تستپذیری قویتر: راحتتر میشد سرویسها رو mock کرد.
هماهنگی بیشتر با PHP 8 و type hintها.
* لاراول 11 و 12 - ساختار بوتاسترپ سادهتر شد (دیگه لازم نیست هر چیزی رو دستی تو ServiceProvider ثبت کنی).
Container سریعتر و هوشمندتره؛ خیلی وقتا قبل از اینکه بفهمی نیاز داری، خودش resolve میکنه
چرا باید اهمیت بدیم ؟
1- کدی که مینویسی loosely coupled میشه (یعنی بخشها کمتر به هم وابستهان).
2- تستنویسی آسونتر میشه.
3- هر وقت خواستی یه سرویس رو عوض کنی (مثلاً از Stripe بری روی Paypal)، فقط کافیه binding رو تغییر بدی.
4- توی پروژههای بزرگ، این ویژگی واقعاً مثل اکسیژنه
5- برای پروژه های میکوسرویس خیلی کاربرد داره : )
@DevTwitter | <amirreza raadi/>
Service Container (یا همون IoC Container)
حالا Service Container چیه؟
فرض کن توی یه پروژه بزرگ، کلی سرویس داری: مثل PaymentService، UserRepository، Logger و ...
اگه بخوای همه رو با new بسازی و دستی بهم وصل کنی، خیلی زود پروژه میشه یه باتلاق
اینجاست که Service Container وارد میشه:
تو فقط میگی "من به یه PaymentService نیاز دارم"،
لاراول خودش میره اون رو میسازه و وابستگیهاش رو هم تزریق میکنه.
به این جادوی قشنگ میگن Inversion of Control: یعنی به جای اینکه خودت کنترل ساخت اشیا رو بگیری، این کارو به Container میسپری.
چی شد که از لاراول 8 تا 12 تکامل پیدا کرد؟
بیایم مثل یه خط زمان نگاه کنیم:
* لاراول 8 - Auto-Resolution: لاراول خودش میفهمید چی رو باید resolve کنه.
نیاز کمتر به ثبت دستی سرویسها.
* لاراول 9 - Contextual Binding: میتونستی بگی "وقتی فلان کلاس خواست PaymentGateway رو، بهش Stripe بده؛ ولی برای یه کلاس دیگه Paypal بده".
انعطاف بیشتر توی پروژههای پیچیده.
* لاراول 10 - تستپذیری قویتر: راحتتر میشد سرویسها رو mock کرد.
هماهنگی بیشتر با PHP 8 و type hintها.
* لاراول 11 و 12 - ساختار بوتاسترپ سادهتر شد (دیگه لازم نیست هر چیزی رو دستی تو ServiceProvider ثبت کنی).
Container سریعتر و هوشمندتره؛ خیلی وقتا قبل از اینکه بفهمی نیاز داری، خودش resolve میکنه
چرا باید اهمیت بدیم ؟
1- کدی که مینویسی loosely coupled میشه (یعنی بخشها کمتر به هم وابستهان).
2- تستنویسی آسونتر میشه.
3- هر وقت خواستی یه سرویس رو عوض کنی (مثلاً از Stripe بری روی Paypal)، فقط کافیه binding رو تغییر بدی.
4- توی پروژههای بزرگ، این ویژگی واقعاً مثل اکسیژنه
5- برای پروژه های میکوسرویس خیلی کاربرد داره : )
@DevTwitter | <amirreza raadi/>
👍23👎16❤10🔥1
انقلابی برای UIهای پیچیده!
Parallel Routing در Next.js
خیلی خلاصه بگم میاد همزمان چند روت (صفحه) رو در یک صفحه لود میکنه و چون نمیخوای به عنوان کامپوننت باشه و قابلیت یک روت رو در بخش های مختلف یک صفحه داشته باشی میای سراغ روت همزمان.
مثلا تو یک صفحه یک تب داری ، سایدبار داری و یک بخش چت داری میخوای با این بخش ها مثل یک روت رفتار کنی کاربر یک صفحه میبینه اما پشت کار هر بخش یک صفحه ی مجزاست یعنی قابلیت های روت رو بهت میده مثل :
1 URL مستقل برای هر بخش (Route Independence)
2 Data Fetching جدا برای هر Slot (SSR/SSG جداگانه)
3 Streaming جداگانه (React Server Components Streaming)
4 Error Boundaries مستقل
5 Loading States مستقل
6 Prefetching و Caching جداگانه
7 Optional Routes / Default UI برای هر بخش
8 Dynamic Parallel Routing (Slotهای داینامیک)
9 Separation of Concerns بهبود ساختار کد و ماژولار بودن
10 SEO بهتر برای بخشهای مستقل
2 بهترین جا برای استفاده:
داشبوردها، اپهای چت و ایمیل، UIهای چندبخشی، و اپلیکیشنهای SaaS با صفحههای پیچیده.
3 برای پروژههای ساده ، استفاده از Parallel Routing غیرضروریه و فقط کد رو پیچیده میکنه. همون کامپوننت بهتره.
یوز کیس های خیلی قشنگی براش میتونید دربیارید البته برای اپ های بزرگ که سرعت و پرفورمنس یو آی براشون خیلی مهمه مثل اپ های جامع . فروشگاه های چند وجهی و ...
اینجا مفصل تر توضیح داده شده
https://vrgl.ir/tyjGD
@DevTwitter | <Ahmad Safari/>
Parallel Routing در Next.js
خیلی خلاصه بگم میاد همزمان چند روت (صفحه) رو در یک صفحه لود میکنه و چون نمیخوای به عنوان کامپوننت باشه و قابلیت یک روت رو در بخش های مختلف یک صفحه داشته باشی میای سراغ روت همزمان.
مثلا تو یک صفحه یک تب داری ، سایدبار داری و یک بخش چت داری میخوای با این بخش ها مثل یک روت رفتار کنی کاربر یک صفحه میبینه اما پشت کار هر بخش یک صفحه ی مجزاست یعنی قابلیت های روت رو بهت میده مثل :
1 URL مستقل برای هر بخش (Route Independence)
2 Data Fetching جدا برای هر Slot (SSR/SSG جداگانه)
3 Streaming جداگانه (React Server Components Streaming)
4 Error Boundaries مستقل
5 Loading States مستقل
6 Prefetching و Caching جداگانه
7 Optional Routes / Default UI برای هر بخش
8 Dynamic Parallel Routing (Slotهای داینامیک)
9 Separation of Concerns بهبود ساختار کد و ماژولار بودن
10 SEO بهتر برای بخشهای مستقل
2 بهترین جا برای استفاده:
داشبوردها، اپهای چت و ایمیل، UIهای چندبخشی، و اپلیکیشنهای SaaS با صفحههای پیچیده.
3 برای پروژههای ساده ، استفاده از Parallel Routing غیرضروریه و فقط کد رو پیچیده میکنه. همون کامپوننت بهتره.
یوز کیس های خیلی قشنگی براش میتونید دربیارید البته برای اپ های بزرگ که سرعت و پرفورمنس یو آی براشون خیلی مهمه مثل اپ های جامع . فروشگاه های چند وجهی و ...
اینجا مفصل تر توضیح داده شده
https://vrgl.ir/tyjGD
@DevTwitter | <Ahmad Safari/>
👎19👍16❤6🔥4
کاهش حجم باندل نهایی پروژه ها با Vite
خیلی از پروژههای فرانتاند بعد از Build حجم بالایی دارن و این باعث کندی لود اولیه (TTFB و FCP بالا) میشه.
یکی از بهترین راهکارها برای حل این مشکل، استفاده از فشردهسازی (Compression) هست.
معرفی پکیج
پکیج vite-plugin-compression یک پلاگین ساده و کارآمد برای Vite هست که فایلهای خروجی پروژه رو با الگوریتمهای مختلف فشرده میکنه:
gzip
brotli
deflate
مزایا
کاهش حجم فایلهای استاتیک (CSS, JS, HTML)
بهبود سرعت بارگذاری صفحات (Load Time)
سازگاری با اکثر مرورگرها
پیکربندی ساده
با فعال کردن این پلاگین میشه تا ۶۰٪ کاهش حجم فایلها داشت
@DevTwitter | <Mohsen Karimvand/>
خیلی از پروژههای فرانتاند بعد از Build حجم بالایی دارن و این باعث کندی لود اولیه (TTFB و FCP بالا) میشه.
یکی از بهترین راهکارها برای حل این مشکل، استفاده از فشردهسازی (Compression) هست.
معرفی پکیج
پکیج vite-plugin-compression یک پلاگین ساده و کارآمد برای Vite هست که فایلهای خروجی پروژه رو با الگوریتمهای مختلف فشرده میکنه:
gzip
brotli
deflate
مزایا
کاهش حجم فایلهای استاتیک (CSS, JS, HTML)
بهبود سرعت بارگذاری صفحات (Load Time)
سازگاری با اکثر مرورگرها
پیکربندی ساده
با فعال کردن این پلاگین میشه تا ۶۰٪ کاهش حجم فایلها داشت
@DevTwitter | <Mohsen Karimvand/>
👍29❤6👎2🔥1
فکر کنم هر کسی با خوندن این مقاله کاملا داکر رو درک نه ! به زبان خیلی خیلی ساده !
لینک مقاله
@DevTwitter | <Mohammad Nasiri/>
لینک مقاله
@DevTwitter | <Mohammad Nasiri/>
👎21❤11👍2
اگه شما هم مثل من تو پایتون با ORMها برای مدیریت دیتابیس سروکار دارید، حتما گاهی اوقات با یه سری محدودیت ها و کاهش سرعت تو کتابخونه هایی مثل SQLAlchemy و Turtoise مواجه شدید...
اما Ormax همه معادلات رو تغییر داده، Ormax یه ORM سبک، سریع و جدید و خیلی قدرتمنده که تمام نیازهای ما رو برای مدیریت یه دیتابیس SQL تو پایتون برآورده میکنه
در واقع مقایسه Ormax با SQLAlchemy مثل مقایسه Django و FastAPI میمونه، همینقدر خلاصه و ساده.
پیشنهاد میکنم حتما امتحانش کنین
https://github.com/shayanheidari01/ormax
https://ormax.shayan-heidari.ir
@DevTwitter | <ShtyhonX/>
اما Ormax همه معادلات رو تغییر داده، Ormax یه ORM سبک، سریع و جدید و خیلی قدرتمنده که تمام نیازهای ما رو برای مدیریت یه دیتابیس SQL تو پایتون برآورده میکنه
در واقع مقایسه Ormax با SQLAlchemy مثل مقایسه Django و FastAPI میمونه، همینقدر خلاصه و ساده.
پیشنهاد میکنم حتما امتحانش کنین
https://github.com/shayanheidari01/ormax
https://ormax.shayan-heidari.ir
@DevTwitter | <ShtyhonX/>
1👎30🔥12❤3
خسته کننده بود اما ارزشش داشت :)))
کتابخانهای برای ایجاد و نمایش جدول در محیط کنسول با داتنت،
میتونه برای آرایه یک و دوبعدی و انواع لیست جدول نمایش بده و اگه خواستین فیلد فیلد مرتب کنه
منتظر استارهای زیباتون هستم
https://github.com/AmirHosseinOstad/Morattab
@DevTwitter | <Amir Hossein/>
کتابخانهای برای ایجاد و نمایش جدول در محیط کنسول با داتنت،
میتونه برای آرایه یک و دوبعدی و انواع لیست جدول نمایش بده و اگه خواستین فیلد فیلد مرتب کنه
منتظر استارهای زیباتون هستم
https://github.com/AmirHosseinOstad/Morattab
@DevTwitter | <Amir Hossein/>
🔥25👍6❤4👎3
Open Builder
یک پروژه متن باز رایگان برای ایجاد Landing های حرفه ای HTML با کشیدن و رها کردن (Drag and Drop) هست که دارای کلی کامپوننت زیبا و ریسپانسیو هست که می توانید به آسانی و در کمترین زمان صفحات دلخواه خود را توسعه دهید. یا اگر توسعه دهنده هستید می توانید یک سرویس بزرگتر راه اندازی کنید و کامپوننت های خودتون رو توسعه دهید.
مخزن پروژه:
https://github.com/code3-dev/open-builder
دمو:
https://openbuilder.vercel.app
@DevTwitter | <Hossein Pira/>
یک پروژه متن باز رایگان برای ایجاد Landing های حرفه ای HTML با کشیدن و رها کردن (Drag and Drop) هست که دارای کلی کامپوننت زیبا و ریسپانسیو هست که می توانید به آسانی و در کمترین زمان صفحات دلخواه خود را توسعه دهید. یا اگر توسعه دهنده هستید می توانید یک سرویس بزرگتر راه اندازی کنید و کامپوننت های خودتون رو توسعه دهید.
مخزن پروژه:
https://github.com/code3-dev/open-builder
دمو:
https://openbuilder.vercel.app
@DevTwitter | <Hossein Pira/>
👍15❤8🔥5👎1
وقتی با ترمینال آشنا شدم، اول زیاد خوشم نمیاومد و نسبت بهش مقاومت میکردم...
اما یکم که ور رفتم با خودم گفتم گور بابای GUi، کنسول عشقه !
این شد که تصمیم گرفتم با c# یه دفتر کار روزمره (to-do list) تحت کنسول بنویسم، با رنگبندی جذاب، جدول مرتب و ...
آدرس ریپو:
https://github.com/AmirHosseinOstad/fehrestoonak
@DevTwitter | <Amir Hossein/>
اما یکم که ور رفتم با خودم گفتم گور بابای GUi، کنسول عشقه !
این شد که تصمیم گرفتم با c# یه دفتر کار روزمره (to-do list) تحت کنسول بنویسم، با رنگبندی جذاب، جدول مرتب و ...
آدرس ریپو:
https://github.com/AmirHosseinOstad/fehrestoonak
@DevTwitter | <Amir Hossein/>
👎69👍34🔥6❤5
DevTwitter | توییت برنامه نویسی
رفقا برنامهای چیزی برای اندروید سراغ دارید که بشه توش کارها رو track کرد؟ پیگیری کنه وضعیت کارها رو هی یادآوری کنه که امروز این کارو نکردی، از فلان چیز چه خبر، امروز یه ساعت وقتتو گذاشتی و این حرفا سینک هم بشه
لیست اپهایی که مناسب آدمای تنبله برای این که کاراشونو پیگیری کنن و چیزی رو یادشون نره:
- Tick Tick × 12
- Habitica × 7
- To-Do Focus × 3
- Sectograph × 2
- Todoist × 2
- Logsec × 2
اعداد جلوشون تعداد دفعاتی هست که پیشنهاد شده
@DevTwitter
- Tick Tick × 12
- Habitica × 7
- To-Do Focus × 3
- Sectograph × 2
- Todoist × 2
- Logsec × 2
اعداد جلوشون تعداد دفعاتی هست که پیشنهاد شده
@DevTwitter
🔥45❤10👍8
This media is not supported in your browser
VIEW IN TELEGRAM
کمپانی Hugging Face یه ابزار اپن سورس برای ساختن، غنیسازی و تغییر دیتاستها با کمک مدلهای هوش مصنوعی به اسم AI Sheets, اونم بدون کدنویسی داده.
میتونید این ابزار رو هم به صورت لوکال روی سیستم خودتون اجرا کنید، هم روی Huggingface Hub . اینجوری میتونید از بین هزاران مدل موجود تو Hugging Face Hub استفاده کنید؛ چه با Inference Providers چه با مدلهای لوکال، حتی شامل gpt-oss از OpenAI هم میشه.
Github: https://github.com/huggingface/aisheets
@DevTwitter | <Mehdi Allahyari/>
میتونید این ابزار رو هم به صورت لوکال روی سیستم خودتون اجرا کنید، هم روی Huggingface Hub . اینجوری میتونید از بین هزاران مدل موجود تو Hugging Face Hub استفاده کنید؛ چه با Inference Providers چه با مدلهای لوکال، حتی شامل gpt-oss از OpenAI هم میشه.
Github: https://github.com/huggingface/aisheets
@DevTwitter | <Mehdi Allahyari/>
👍14❤4🔥3👎2
خیلی وقتا پیش اومده بخواید یه فایلی رو برای یکی سریع بفرستید ولی باید فایل رو اول اپلود کنید و بعد طرف مقابل دانلود کنه که میتونه زمانبر باشه! حجمش زیاد باشه که دیگه مصیبته!
یه راه سریع برای اینکار این سایته به این صورت که همزمان با آپلود، طرف مقابل میتونه دانلود کنه
محدودیت حجمی هم نداره! و چون اینطوره که بدون نیاز به اینکه فایل کامل آپلود بشه طرف میتونه دانلود کنه، زمان انتقال فایل عملا نصف میشه!
این روش کاملا امنه و به صورت رمزنگاری شده هست!
آدرس سایتش:
https://toffeeshare.com/
اینام چندتاسایت مشابه:
http://wormhole.app
http://file.pizza
http://send.vis.ee
@DevTwitter | <ixAbolfazl />
یه راه سریع برای اینکار این سایته به این صورت که همزمان با آپلود، طرف مقابل میتونه دانلود کنه
محدودیت حجمی هم نداره! و چون اینطوره که بدون نیاز به اینکه فایل کامل آپلود بشه طرف میتونه دانلود کنه، زمان انتقال فایل عملا نصف میشه!
این روش کاملا امنه و به صورت رمزنگاری شده هست!
آدرس سایتش:
https://toffeeshare.com/
اینام چندتاسایت مشابه:
http://wormhole.app
http://file.pizza
http://send.vis.ee
@DevTwitter | <ixAbolfazl />
👍51❤4🔥2
مثل اینکه میشه یک سیستم RAG مقیاس پذیر با بهره وری بالا و رایگان بصورت لوکال با این پکیج پیاده کرد. بیزحمت یکی تستش کنه بهمون بگه وعده توخالیه یا واقعا خفنه!
https://github.com/yichuan-w/LEANN
@DevTwitter | <Nima />
https://github.com/yichuan-w/LEANN
@DevTwitter | <Nima />
❤12🔥1
قطعاً آرزوی هر برنامه نویسیه که وقتی میخواد ریپو گیتهابش رو با کسی به اشتراک بزاره، یه بنر خوشگل نمایانگر تلاشش باشه.
این پروژه داتنت توی محیط کنسول به دو صورت (خودکار و دستی) برای ریپوهای گیت هاب بنر سوشال مدیا در سایز مناسب ایجاد میکنه و میشه اونو به تنظیمات ریپو اضافه کرد...
پیشنهاد میکنم حداقل یبار تست کنین
منتظر استارهای گرمتون هستم
https://github.com/AmirHosseinOstad/Paint_Hub
@DevTwitter | <Amir Hossein/>
این پروژه داتنت توی محیط کنسول به دو صورت (خودکار و دستی) برای ریپوهای گیت هاب بنر سوشال مدیا در سایز مناسب ایجاد میکنه و میشه اونو به تنظیمات ریپو اضافه کرد...
پیشنهاد میکنم حداقل یبار تست کنین
منتظر استارهای گرمتون هستم
https://github.com/AmirHosseinOstad/Paint_Hub
@DevTwitter | <Amir Hossein/>
👎43👍17❤7🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
رپویی که قبلا درست کرده بودم الان به روز کردم. الان شامل یک دیتابیس از ۶۵۰ مطالعهی موردی از بیش از ۱۰۰ شرکت مختلفه (طراحی سیستمهای ماشین لرنینگ) که نشون میده شرکتهایی مثل نتفلیکس، ایربیانبی و doordash و خیلی کمپانی های دیگه چطور از یادگیری ماشین برای بهبود محصولات و فرایندهاشون استفاده میکنن. این مطالعات موردی نمونههای واقعی از کاربردهای ماشین لرنینگ، مدلهای LLM و نکات ارزشمندی از طراحی سیستمهای ML رو در اختیارتون میذاره.
Github: https://github.com/mallahyari/ml-practical-usecases
@DevTwitter | <Mehdi Allahyari/>
Github: https://github.com/mallahyari/ml-practical-usecases
@DevTwitter | <Mehdi Allahyari/>
❤11👎5👍1🔥1
کجا نباید از داداشمون RabbitMQ استفاده کنیم؟
1- وقتی نیاز به real-time response داریم.
چرا؟ چون RabbitMQ صف هست و ارسال/دریافت پیام ممکنه با تاخیر انجام شود.
پیشنهادم WebSocket، gRPC یا Redis Pub/Sub است.
2- وقتی به message replay یا history نیاز داریم
چرا؟ چون RabbitMQ پیامها رو بعد از مصرف حذف میکند. البته میشه کانفیگ کرد که نگه داره.
3- زمانی که پیامها حجمشون خیلی زیاد است.
چرا؟ چون در حجم بالا RabbitMQ دچار افت performance میشود. Kafka رو پیشنهاد میکنم برای اینجا.
4- وقتی ترتیب دقیق پردازش پیامها خیلی مهم است. چرا؟ چون RabbitMQ تضمین دقیقی برای ترتیب پیامها ندارد. اینجا هم پیشنهادم Kafka است.
@DevTwitter | <Amirhossein Dehghan/>
1- وقتی نیاز به real-time response داریم.
چرا؟ چون RabbitMQ صف هست و ارسال/دریافت پیام ممکنه با تاخیر انجام شود.
پیشنهادم WebSocket، gRPC یا Redis Pub/Sub است.
2- وقتی به message replay یا history نیاز داریم
چرا؟ چون RabbitMQ پیامها رو بعد از مصرف حذف میکند. البته میشه کانفیگ کرد که نگه داره.
3- زمانی که پیامها حجمشون خیلی زیاد است.
چرا؟ چون در حجم بالا RabbitMQ دچار افت performance میشود. Kafka رو پیشنهاد میکنم برای اینجا.
4- وقتی ترتیب دقیق پردازش پیامها خیلی مهم است. چرا؟ چون RabbitMQ تضمین دقیقی برای ترتیب پیامها ندارد. اینجا هم پیشنهادم Kafka است.
@DevTwitter | <Amirhossein Dehghan/>
👍36❤8👎6
اگر تک سرور دارید و سیستم IDS/IPS ندارید و برای امن سازی Fail2Ban استفاده میکنید یک GUI برای آن طراحی شده که دید بهتری برای log این نرمافزار هم دارد.
اگر لینوکسی نیستید چنین ابزارهایی ممکن است برای آغاز، مناسب باشند ولی قطعا CLI آن هم خوب است.
https://github.com/SubleXBle/Fail2Ban-Report
@DevTwitter | <VAHID NAMENI/>
اگر لینوکسی نیستید چنین ابزارهایی ممکن است برای آغاز، مناسب باشند ولی قطعا CLI آن هم خوب است.
https://github.com/SubleXBle/Fail2Ban-Report
@DevTwitter | <VAHID NAMENI/>
❤10🔥1
اینکه با AI میتونی یکی از سختترین کارها، یعنی فهمیدن مسائل پیچیده، رو ساده کنی از مهمترین نعمتهاشه.
این system prompt رو نوشتم که مفاهیم مهندسی کامپیوتر رو با داستان توضیح بده، بعدش تعریف علمی دقیقش رو هم بگه. برای من که خیلی life changer بوده.
https://gist.github.com/mhrlife/26a279b4fcacc71e20d2068219dd7bbc
@DevTwitter | <The Big Rad/>
این system prompt رو نوشتم که مفاهیم مهندسی کامپیوتر رو با داستان توضیح بده، بعدش تعریف علمی دقیقش رو هم بگه. برای من که خیلی life changer بوده.
https://gist.github.com/mhrlife/26a279b4fcacc71e20d2068219dd7bbc
@DevTwitter | <The Big Rad/>
👍35❤6👎3🔥1
فیچر های ++C توی ورژن های 2020 2017 2014 2011 رو به صورت یه جا همشو اینجا جمع کردن با توضیح کوتاه و ساده:
https://github.com/AnthonyCalandra/modern-cpp-features
@DevTwitter | <Nimo/>
https://github.com/AnthonyCalandra/modern-cpp-features
@DevTwitter | <Nimo/>
❤17👎3👍2🔥1
جدا از مهندسی پشت تلگرام که بهینه نوشته شده، تلگرام چیزی داره به اسم Update Queue. چیزی که ۱ سال از دوران جوونیم رو صرف مهندسی معکوسش کردم.
تلگرام برای پوش کردن تغییرات مثل پیام جدید، ادیت، ری اکشن، تایپینگ و… به کلاینتها از سرویس Updates تو پروتکل MTProto استفاده میکنه، ایده ی کلی و کلیدی خیلی ساده اس و اینه که کلاینت ها یه state محلی نگه میدارن و آپدیتارو دقیقا با ترتیب درست اعمال میکنن؛ اگه شکافی بینشون افتاد، Difference میگیرن و دوباره پرش میکنن.
چرا اینکارو کرده و کلا چالشا چیه؟
• ترتیبش مهمه چون ممکنه یه اپدیت وابسته به چیزی باشه که توی خود همون پچ میاد
• تحویل دقیق باید انجام بشه و هیچی گم نشه
• مقیاسش هم میلیونها کاربر همزمان باید بگیرنش، مثل کانال های بزرگ
از اونجایی که هر پیامرسان منبع عظیمی از اتفاقاتیه که هر لحظه میوفته ما میتونیم اسم این اتفاقات رو event بزاریم. تلگرام هم یه پیامرسان مولتی کلاینته، یعنی هر کاربر میتونه چندین دیوایس برای یه حساب داشته باشه، پس وقتی یه ایونت اتفاق میوفته که باید یه کاربر از اون خبردار بشه باید اون ایونت رو به دیوایس های دیگه ی کاربر هم بفرسته، حدودا با مرتبه زمانی On^2.
مکانیزم اینجوریه که وقتی دیوایسی انلاین باشه و سوکت همون سوکتی باشه که keep alive هست یا اخرین rpc رو کال کرده سرور ایونت رو توی queue برای اون دیوایس نگه نمیداره و مستقیم میفرسته به کلاینت، حالا از اونجایی که کلاینت های دیگه ممکنه افلاین باشن یا حتی توی بکگراند پروسسشون کیل شده باشه عقب میمونن. حالا وقتی اون دیوایسی که عقب مونده بود با باز شدن سوکتش درخواست گرفتن اپدیت هارو وقتی که افلاین بوده رو از سرور میکنه و اطلاعات لوکالش رو میفرسته به سرور، من برای ساده شدنش اینجوری میگم که دیوایس میاد به سرور میگه من تا این زمان t رو داشتم و بعد این رو بهم بده، سرور هم میاد حساب کتابش رو میکنه و جواب رو توی یه پچ میفرسته! حالا چی توی این پچ هست و چی رو میفرسته رو میتونم یه رشته توییت دیگه در موردش بزنم.
حالا اگه اعدادی که توی پچ میاد با اعداد توی کلاینت نخونه عملا میگیم گپ اتفاق افتاده، برای همین هم کلاینت باید رکویست getDiff رو بزنه.
رکویست updates.getDifference به کلاینت اجازه میده بگه:
من الان pts = X و seq = Y هستم و هر چی بین این و حالت جدید هست بهم بده.
• سرور ممکنه جواب بده:
difference: همه ی آپدیت های گمشده
differenceSlice: بخشی از آپدیت ها یعنی هنوز باید به فچ کردن ادامه بدی
differenceEmpty: چیزی تغییر نکرده
جالبترش اینه که توی نسخه های جدیدترش برای کانال ها مکانیسم جدا getChannelDifference هست، چون هر کانال pts مستقل داره و این باعث میشه شما فقط کانال هایی رو بگیری که تغییر کردن! برای سوپر گروه هم مکانیزم همینه.
این باعث میشه حتی اگر چند ساعت آفلاین باشی، بعد از اتصال دوباره دقیقاً همهچی رو بگیری و هیچ پیامی رو از دست ندی
حتی با packet loss یا reconnect، state کلاینت خراب نمیشه و سرور مجبور نیست برای هر کلاینت همه چی رو دوباره بفرسته. فقط gap ها sync میشن
@DevTwitter | <Abolfazl/>
تلگرام برای پوش کردن تغییرات مثل پیام جدید، ادیت، ری اکشن، تایپینگ و… به کلاینتها از سرویس Updates تو پروتکل MTProto استفاده میکنه، ایده ی کلی و کلیدی خیلی ساده اس و اینه که کلاینت ها یه state محلی نگه میدارن و آپدیتارو دقیقا با ترتیب درست اعمال میکنن؛ اگه شکافی بینشون افتاد، Difference میگیرن و دوباره پرش میکنن.
چرا اینکارو کرده و کلا چالشا چیه؟
• ترتیبش مهمه چون ممکنه یه اپدیت وابسته به چیزی باشه که توی خود همون پچ میاد
• تحویل دقیق باید انجام بشه و هیچی گم نشه
• مقیاسش هم میلیونها کاربر همزمان باید بگیرنش، مثل کانال های بزرگ
از اونجایی که هر پیامرسان منبع عظیمی از اتفاقاتیه که هر لحظه میوفته ما میتونیم اسم این اتفاقات رو event بزاریم. تلگرام هم یه پیامرسان مولتی کلاینته، یعنی هر کاربر میتونه چندین دیوایس برای یه حساب داشته باشه، پس وقتی یه ایونت اتفاق میوفته که باید یه کاربر از اون خبردار بشه باید اون ایونت رو به دیوایس های دیگه ی کاربر هم بفرسته، حدودا با مرتبه زمانی On^2.
مکانیزم اینجوریه که وقتی دیوایسی انلاین باشه و سوکت همون سوکتی باشه که keep alive هست یا اخرین rpc رو کال کرده سرور ایونت رو توی queue برای اون دیوایس نگه نمیداره و مستقیم میفرسته به کلاینت، حالا از اونجایی که کلاینت های دیگه ممکنه افلاین باشن یا حتی توی بکگراند پروسسشون کیل شده باشه عقب میمونن. حالا وقتی اون دیوایسی که عقب مونده بود با باز شدن سوکتش درخواست گرفتن اپدیت هارو وقتی که افلاین بوده رو از سرور میکنه و اطلاعات لوکالش رو میفرسته به سرور، من برای ساده شدنش اینجوری میگم که دیوایس میاد به سرور میگه من تا این زمان t رو داشتم و بعد این رو بهم بده، سرور هم میاد حساب کتابش رو میکنه و جواب رو توی یه پچ میفرسته! حالا چی توی این پچ هست و چی رو میفرسته رو میتونم یه رشته توییت دیگه در موردش بزنم.
حالا اگه اعدادی که توی پچ میاد با اعداد توی کلاینت نخونه عملا میگیم گپ اتفاق افتاده، برای همین هم کلاینت باید رکویست getDiff رو بزنه.
رکویست updates.getDifference به کلاینت اجازه میده بگه:
من الان pts = X و seq = Y هستم و هر چی بین این و حالت جدید هست بهم بده.
• سرور ممکنه جواب بده:
difference: همه ی آپدیت های گمشده
differenceSlice: بخشی از آپدیت ها یعنی هنوز باید به فچ کردن ادامه بدی
differenceEmpty: چیزی تغییر نکرده
جالبترش اینه که توی نسخه های جدیدترش برای کانال ها مکانیسم جدا getChannelDifference هست، چون هر کانال pts مستقل داره و این باعث میشه شما فقط کانال هایی رو بگیری که تغییر کردن! برای سوپر گروه هم مکانیزم همینه.
این باعث میشه حتی اگر چند ساعت آفلاین باشی، بعد از اتصال دوباره دقیقاً همهچی رو بگیری و هیچ پیامی رو از دست ندی
حتی با packet loss یا reconnect، state کلاینت خراب نمیشه و سرور مجبور نیست برای هر کلاینت همه چی رو دوباره بفرسته. فقط gap ها sync میشن
@DevTwitter | <Abolfazl/>
🔥129👍28❤21👎2
#wordpress
ببینید یه چیز کوچیک باعث میشه افزونه وردپرس نوشته بشه و بیشتر از 50 هزار نصب هم بگیره.
تغییر ایمیل اصلی مدیر سایت، بدون ارسال ایمیل تاییدیه!
https://wordpress.org/plugins/change-admin-email-setting-without-outbound-email/
@DevTwitter | <Morteza Geransayeh/>
ببینید یه چیز کوچیک باعث میشه افزونه وردپرس نوشته بشه و بیشتر از 50 هزار نصب هم بگیره.
تغییر ایمیل اصلی مدیر سایت، بدون ارسال ایمیل تاییدیه!
https://wordpress.org/plugins/change-admin-email-setting-without-outbound-email/
@DevTwitter | <Morteza Geransayeh/>
🔥21❤3👍2