بررسی دو مفهوم stateful و stateless توی طراحی سیستم ها بخصوص توی وب و api ها
این روش ها هرکدوم مزایا و معایب خودشونو دارن که من چند تاشو میگم
1- دارای حالت (stateful) : توی یک سیستم دارای حالت ، سرور میاد و اطلاعاتی که مربوط به وضعیت کاربر میشن رو ذخیره میکنه داخل session ؛ برای مثال وقتی وارد یک سایت فروشگاهی میشیم اطلاعاتی مثله (سبد خرید ، احراز هویت و ...) به دست سرور توی session ما ذخیره میشن.
از مزایای این روش اینه که مناسبه برای سیستم هایی که نیاز به پیگیری وضعیت کاربر دارن مثل (بازی ها ، چت ها ، سبد خرید و ....)
معایبش هم اینه که باید منابع بیشتری مصرف کنید و مقیاس پذیری سخت تری داره
2- بی حالت (stateless) : توی این مدل سیستم ها هیچ اطلاعاتی از درخواست های قبلی کاربر ذخیره نمیشن توی session. و هر درخواست مستقل از درخواست قبلی ارسال میشه و همه ی اطلاعات مورد نیاز باید توی همون درخواست دریافت بشه.
مزایای این روش سرعت بیشتری که داره هست چون نیاز ندارید به session دسترسی داشته باشید و مقیاس پذیری بالایی داره
معایب هم می تونیم به مدیریت پیچیده ای که ممکنه برای حفظ وضعیت کاربر ها ایجاد بشه اشاره کنیم و همینطور به ارسال اطلاعات تکراری و اضافی در هر درخواست اشاره کنیم.
@DevTwitter | <Ali/>
این روش ها هرکدوم مزایا و معایب خودشونو دارن که من چند تاشو میگم
1- دارای حالت (stateful) : توی یک سیستم دارای حالت ، سرور میاد و اطلاعاتی که مربوط به وضعیت کاربر میشن رو ذخیره میکنه داخل session ؛ برای مثال وقتی وارد یک سایت فروشگاهی میشیم اطلاعاتی مثله (سبد خرید ، احراز هویت و ...) به دست سرور توی session ما ذخیره میشن.
از مزایای این روش اینه که مناسبه برای سیستم هایی که نیاز به پیگیری وضعیت کاربر دارن مثل (بازی ها ، چت ها ، سبد خرید و ....)
معایبش هم اینه که باید منابع بیشتری مصرف کنید و مقیاس پذیری سخت تری داره
2- بی حالت (stateless) : توی این مدل سیستم ها هیچ اطلاعاتی از درخواست های قبلی کاربر ذخیره نمیشن توی session. و هر درخواست مستقل از درخواست قبلی ارسال میشه و همه ی اطلاعات مورد نیاز باید توی همون درخواست دریافت بشه.
مزایای این روش سرعت بیشتری که داره هست چون نیاز ندارید به session دسترسی داشته باشید و مقیاس پذیری بالایی داره
معایب هم می تونیم به مدیریت پیچیده ای که ممکنه برای حفظ وضعیت کاربر ها ایجاد بشه اشاره کنیم و همینطور به ارسال اطلاعات تکراری و اضافی در هر درخواست اشاره کنیم.
@DevTwitter | <Ali/>
👍52❤5👎1
مدل 82 میلیون پارامتری ساختن واسه text-to-speech
هیچ زمانی مثل امروز هوش مصنوعی democratized نبوده
https://huggingface.co/hexgrad/Kokoro-82M
@DevTwitter | <Alek/>
هیچ زمانی مثل امروز هوش مصنوعی democratized نبوده
https://huggingface.co/hexgrad/Kokoro-82M
@DevTwitter | <Alek/>
❤22👍12🤣1
#نقل_کد
“Success usually comes to those who are too busy to be looking for it.”
— Henry David Thoreau
«موفقیت سراغ کسایی میره که به خاطر بیزی بودن کون این حرفا نمیذارن»
— هنری دیوید توریو
@DevTwitter
“Success usually comes to those who are too busy to be looking for it.”
— Henry David Thoreau
«موفقیت سراغ کسایی میره که به خاطر بیزی بودن کون این حرفا نمیذارن»
— هنری دیوید توریو
@DevTwitter
🤣59👎25👍22
اگه میخوای بیشتر در مورد انواع ایندکس های دیتابیس بدونی پیشنهاد میکنم این سری آموزش ویدیویی از PlanetScale رو ببین.
دیدن ش دید عمیق تری بهت میده که بهتر از ایندکس ها استفاده کنی.
لیست موضوعاتی که پوشش داده
Introduction to indexes
B+ trees
Primary keys
Secondary keys
Primary key data types
Where to add indexes
Index selectivity
Prefix indexes
Composite indexes
Covering indexes
Functional indexes
Indexing JSON columns
Indexing for wildcard searches
Fulltext indexes
Invisible indexes
Duplicate indexes
Foreign keys
https://planetscale.com/learn/courses/mysql-for-developers/indexes/introduction-to-indexes
How do Database Indexes Work?
https://planetscale.com/blog/how-do-database-indexes-work
@DevTwitter | <Hossein Nazari/>
دیدن ش دید عمیق تری بهت میده که بهتر از ایندکس ها استفاده کنی.
لیست موضوعاتی که پوشش داده
Introduction to indexes
B+ trees
Primary keys
Secondary keys
Primary key data types
Where to add indexes
Index selectivity
Prefix indexes
Composite indexes
Covering indexes
Functional indexes
Indexing JSON columns
Indexing for wildcard searches
Fulltext indexes
Invisible indexes
Duplicate indexes
Foreign keys
https://planetscale.com/learn/courses/mysql-for-developers/indexes/introduction-to-indexes
How do Database Indexes Work?
https://planetscale.com/blog/how-do-database-indexes-work
@DevTwitter | <Hossein Nazari/>
❤8👍5
چرا ما Monolith رو به Microservices ترجیح دادیم؟
(و چرا این تصمیم باعث شد تیم فنی ما سریعتر و کارآمدتر کار کنه)
چند سال اخیر همه از Microservices حرف میزنن.
میگن مقیاسپذیرتره، بهتر دپلوی میشه، تیمها مستقلتر کار میکنن.
اما… ما تصمیم گرفتیم Monolith بمونیم!
و این تصمیم درستترین انتخاب برای تیم و محصول ماست.
چرا؟
چون میکروسرویسها همیشه جواب درست نیستن.
خیلی از تیمها فقط بهخاطر ترند بودن، بدون دلیل منطقی مهاجرت میکنن.
ما ۳ فاکتور مهم رو بررسی کردیم و دیدیم که Monolith برای ما بهتره:
۱. سرعت توسعه:
در مراحل اولیهی محصول، تغییرات زیادی داریم.
اضافه کردن فیچرها در یک کدبیس یکپارچه خیلی سریعتر و سادهتر از هماهنگی بین چندین سرویس جداست.
۲. هزینهی مدیریت:
میکروسرویسها زیرساخت پیچیدهای میخوان و این تمرکز رو از روی دولوپ میبره روی نگهداشت و پایداری سیستم.
از Service Discovery گرفته تا Logging، Monitoring و DevOps.
برای یه استارتاپ، پیچیدگی بیدلیل یعنی اتلاف زمان و منابع.
۳. نیاز واقعی به مقیاسپذیری:
میکروسرویسها زمانی میدرخشند که هزاران ریکوئست در ثانیه داشته باشید.
ما هنوز به اون مرحله نرسیدیم! پس چرا خودمون رو درگیر چالشهایی کنیم که هنوز وجود ندارن؟ سری که درد نمیکنه رو...
آیا هیچوقت به Microservices مهاجرت میکنیم؟
احتمالاً بله، اما وقتی که نیازش رو حس کنیم، نه زودتر.
فعلاً یه Monolith تمیز، ماژولار و سازماندهیشده، سریعترین و کارآمدترین راهحل برای ماست.
نکته: اگر فقط بهخاطر “ترند بودن” به سمت Microservices میرید،
احتمالاً دارید کار خودتون رو سختتر میکنید.
@DevTwitter | <Joseph Yas/>
(و چرا این تصمیم باعث شد تیم فنی ما سریعتر و کارآمدتر کار کنه)
چند سال اخیر همه از Microservices حرف میزنن.
میگن مقیاسپذیرتره، بهتر دپلوی میشه، تیمها مستقلتر کار میکنن.
اما… ما تصمیم گرفتیم Monolith بمونیم!
و این تصمیم درستترین انتخاب برای تیم و محصول ماست.
چرا؟
چون میکروسرویسها همیشه جواب درست نیستن.
خیلی از تیمها فقط بهخاطر ترند بودن، بدون دلیل منطقی مهاجرت میکنن.
ما ۳ فاکتور مهم رو بررسی کردیم و دیدیم که Monolith برای ما بهتره:
۱. سرعت توسعه:
در مراحل اولیهی محصول، تغییرات زیادی داریم.
اضافه کردن فیچرها در یک کدبیس یکپارچه خیلی سریعتر و سادهتر از هماهنگی بین چندین سرویس جداست.
۲. هزینهی مدیریت:
میکروسرویسها زیرساخت پیچیدهای میخوان و این تمرکز رو از روی دولوپ میبره روی نگهداشت و پایداری سیستم.
از Service Discovery گرفته تا Logging، Monitoring و DevOps.
برای یه استارتاپ، پیچیدگی بیدلیل یعنی اتلاف زمان و منابع.
۳. نیاز واقعی به مقیاسپذیری:
میکروسرویسها زمانی میدرخشند که هزاران ریکوئست در ثانیه داشته باشید.
ما هنوز به اون مرحله نرسیدیم! پس چرا خودمون رو درگیر چالشهایی کنیم که هنوز وجود ندارن؟ سری که درد نمیکنه رو...
آیا هیچوقت به Microservices مهاجرت میکنیم؟
احتمالاً بله، اما وقتی که نیازش رو حس کنیم، نه زودتر.
فعلاً یه Monolith تمیز، ماژولار و سازماندهیشده، سریعترین و کارآمدترین راهحل برای ماست.
نکته: اگر فقط بهخاطر “ترند بودن” به سمت Microservices میرید،
احتمالاً دارید کار خودتون رو سختتر میکنید.
@DevTwitter | <Joseph Yas/>
👍90🤣7👎4❤3
This media is not supported in your browser
VIEW IN TELEGRAM
من چند روزی بود که سر اجرای یه پروژه GitHub گیر کرده بودم که هیچ جوری نمیتونستم از ساختارش دید بگیرم.
بعد چند شب بیخوابی امروز یه ابزار خفن پیدا کردم که واقعاً خیلی کاربردیه. لینکشو پایین میزارم :)
پوینتش اینه که دیگه لازم نیست وقتتون رو برای تبدیل دستی ریپازیتوری هدر بدین. فقط کافیه تو آدرس گیتهاب، "hub" رو با "ingest" عوض کنید و بلافاصله یه متن مرتب و کامل دریافت کنید که میتونید مستقیماً به GPT بدید. مث آب خوردن :)
امکاناتش؟
- نمایش کامل ساختار دایرکتوری پروژه
- یه خلاصه کوتاه و مفید از پروژه
- کل کدها و محتوا به صورت متنی آماده برای استفاده در GPT
اکستنشن کروم و .. بقیه چیزارو هم داره.
https://github.com/cyclotruc/gitingest
@DevTwitter | <Ali Mikaeili/>
بعد چند شب بیخوابی امروز یه ابزار خفن پیدا کردم که واقعاً خیلی کاربردیه. لینکشو پایین میزارم :)
پوینتش اینه که دیگه لازم نیست وقتتون رو برای تبدیل دستی ریپازیتوری هدر بدین. فقط کافیه تو آدرس گیتهاب، "hub" رو با "ingest" عوض کنید و بلافاصله یه متن مرتب و کامل دریافت کنید که میتونید مستقیماً به GPT بدید. مث آب خوردن :)
امکاناتش؟
- نمایش کامل ساختار دایرکتوری پروژه
- یه خلاصه کوتاه و مفید از پروژه
- کل کدها و محتوا به صورت متنی آماده برای استفاده در GPT
اکستنشن کروم و .. بقیه چیزارو هم داره.
https://github.com/cyclotruc/gitingest
@DevTwitter | <Ali Mikaeili/>
👍42🔥20
امنیت سرویسهای وب با WS-Security در SOAP:
امنیت در دنیای سرویسهای وب یکی از چالشهای اساسی است، بهویژه وقتی صحبت از پیامهای حساس و سیستمهای توزیعشده به میان میآید. در این میان،
WS-Security به عنوان یک استاندارد کلیدی در SOAP Web Services، نقش مهمی در تأمین امنیت پیامها ایفا میکند.
ویژگیهای برجسته WS-Security:
1- احراز هویت: با ارسال اطلاعات هویتی مانند UsernameToken، امنیت هویت کاربر تضمین میشود.
2- تمامیت دادهها: با استفاده از امضای دیجیتال (XML Signature) تضمین میشود که پیام در طول انتقال تغییر نمیکند.
3- محرمانگی: رمزنگاری پیامها (XML Encryption) از افشای اطلاعات جلوگیری میکند.
چرا WS-Security مهم است؟
این پروتکل با ارائه قابلیتهای امنیتی سطح بالا، مناسب برای سیستمهای توزیعشده و انتقال امن پیامها در محیطهای پیچیده است.
@DevTwitter | <Ahmad Esmaili/>
امنیت در دنیای سرویسهای وب یکی از چالشهای اساسی است، بهویژه وقتی صحبت از پیامهای حساس و سیستمهای توزیعشده به میان میآید. در این میان،
WS-Security به عنوان یک استاندارد کلیدی در SOAP Web Services، نقش مهمی در تأمین امنیت پیامها ایفا میکند.
ویژگیهای برجسته WS-Security:
1- احراز هویت: با ارسال اطلاعات هویتی مانند UsernameToken، امنیت هویت کاربر تضمین میشود.
2- تمامیت دادهها: با استفاده از امضای دیجیتال (XML Signature) تضمین میشود که پیام در طول انتقال تغییر نمیکند.
3- محرمانگی: رمزنگاری پیامها (XML Encryption) از افشای اطلاعات جلوگیری میکند.
چرا WS-Security مهم است؟
این پروتکل با ارائه قابلیتهای امنیتی سطح بالا، مناسب برای سیستمهای توزیعشده و انتقال امن پیامها در محیطهای پیچیده است.
@DevTwitter | <Ahmad Esmaili/>
👍15🤣12❤1🔥1
با Webtop دسترسی لحظه ای به Alpine, Ubuntu, Fedora, و Arch همراه با full desktop environments
ساده فقط روی مرورگر بدون نیاز به نصب
فقط کافیه http://lscr.io/linuxserver/webtop:latest را pull
و روی http://yourhost:3000 استفاده کنید
@DevTwitter | <MehrdadLinux/>
ساده فقط روی مرورگر بدون نیاز به نصب
فقط کافیه http://lscr.io/linuxserver/webtop:latest را pull
و روی http://yourhost:3000 استفاده کنید
@DevTwitter | <MehrdadLinux/>
👍24
ویدیوهای کامل و محتوای دورهی «یادگیری ماشین» دانشکدهی مهندسی کامپیوتر دانشگاه شریف منتشر شد:
http://SharifML.ir
کل این محتوا رایگان است.
تهیهی این مجموعه ممکن نبود، مگر با تلاش جدی یک تیم ۷۰ نفره که قدردان یکایک آنها هستم.
@DevTwitter | <علی شریفی زارچی/>
http://SharifML.ir
کل این محتوا رایگان است.
تهیهی این مجموعه ممکن نبود، مگر با تلاش جدی یک تیم ۷۰ نفره که قدردان یکایک آنها هستم.
@DevTwitter | <علی شریفی زارچی/>
🔥111👍14👎10❤9
#نقل_کد
“A person who never made a mistake never tried anything new.”
– Albert Einstein
«کسی که نمیرینه نمیتونه تپههای جدید رو فتح کنه»
— آلبرت انیشتین
@DevTwitter
“A person who never made a mistake never tried anything new.”
– Albert Einstein
«کسی که نمیرینه نمیتونه تپههای جدید رو فتح کنه»
— آلبرت انیشتین
@DevTwitter
🤣134👍41👎7🔥2
۱. الگوریتم جدید ما، LinearBoost، منتشر شد. این الگوریتم بسیار سریع برای Classification روی دادههای Tabular استفاده میشه. روی هفت دیتاست معروف بنچمارک، دقتش از XGBoost در هر هفت تا، و از LightGBM در پنج تا بالاتر بوده، و زمان اجراش تا ۹۸ درصد کمتره!
۲. روی این الگوریتم، چند سال با Reza Rawassizadeh وقت گذاشتیم تا به نتیجه برسه. و البته به عنوان پروژه جانبی و در اوقات فراغت جلو بردیمش و تمرکز اصلیمون نبوده. به همین دلیل جای کار زیاد داره. در ادامه جنبه فنی رو بیشتر توضیح میدم. نتایج رو هم در داخل ریپو گیتهاب ببینید.
۳. ماجرا اینه که سه الگوریتم رایج یعنی XGBoost و LightGBM و CatBoost مبتنی بر بوستینگ درخت تصمیم هستند. اما آیا نمیشه یه الگوریتم خطی رو جانشین درخت تصمیم کرد؟ درخت تصمیم فیچرها رو یکی یکی در نظر میگیره، در حالی که یه الگوریتم خطی همه فیچرها رو با هم میبینه و این جنبه مثبتیه.
۴. جواب اینه که میشه، ولی دو تا مشکل هست، یکی این که الگوریتمهای خطی مثل SVM معمولا زمانبر هستند و بوستینگشون زمان بسیاری خواهد گرفت، و دیگری این که این الگوریتمها خودشون خوب هستند و خیلی جنبه Weak Classifier ندارند. اما ما اومدیم و الگوریتم قبلیمون، یعنی SEFR رو بوست کردیم.
۵. نتیجه تا الان که جالب شده. مقالهاش رو هم بهزودی منتشر خواهیم کرد. کار هم به صورت متنباز و هم به صورت پکیج پایتون ارائه شده و اگر دوست دارید، شما هم تستش کنید.
https://github.com/LinearBoost/linearboost-classifier
@DevTwitter | <Hamidreza Keshavarz/>
۲. روی این الگوریتم، چند سال با Reza Rawassizadeh وقت گذاشتیم تا به نتیجه برسه. و البته به عنوان پروژه جانبی و در اوقات فراغت جلو بردیمش و تمرکز اصلیمون نبوده. به همین دلیل جای کار زیاد داره. در ادامه جنبه فنی رو بیشتر توضیح میدم. نتایج رو هم در داخل ریپو گیتهاب ببینید.
۳. ماجرا اینه که سه الگوریتم رایج یعنی XGBoost و LightGBM و CatBoost مبتنی بر بوستینگ درخت تصمیم هستند. اما آیا نمیشه یه الگوریتم خطی رو جانشین درخت تصمیم کرد؟ درخت تصمیم فیچرها رو یکی یکی در نظر میگیره، در حالی که یه الگوریتم خطی همه فیچرها رو با هم میبینه و این جنبه مثبتیه.
۴. جواب اینه که میشه، ولی دو تا مشکل هست، یکی این که الگوریتمهای خطی مثل SVM معمولا زمانبر هستند و بوستینگشون زمان بسیاری خواهد گرفت، و دیگری این که این الگوریتمها خودشون خوب هستند و خیلی جنبه Weak Classifier ندارند. اما ما اومدیم و الگوریتم قبلیمون، یعنی SEFR رو بوست کردیم.
۵. نتیجه تا الان که جالب شده. مقالهاش رو هم بهزودی منتشر خواهیم کرد. کار هم به صورت متنباز و هم به صورت پکیج پایتون ارائه شده و اگر دوست دارید، شما هم تستش کنید.
https://github.com/LinearBoost/linearboost-classifier
@DevTwitter | <Hamidreza Keshavarz/>
🔥56👍16🤣3❤1
قبل از اینکه بخواید مقایسهی سرعت زبونهای برنامهنویسی (benchmark) رو جدی بگیرید، این ۲ تا ویدیو رو ببینید؛ یه خرده طولانین ولی کاملا میارزه.
https://youtube.com/watch?v=RrHGX1wwSYM
https://youtube.com/watch?v=EH12jHkQFQk
@DevTwitter | <Mohammad FS/>
https://youtube.com/watch?v=RrHGX1wwSYM
https://youtube.com/watch?v=EH12jHkQFQk
@DevTwitter | <Mohammad FS/>
👍23🤣5👎2❤1
از نکات جالب اینکه Microsoft جزو 20 شرکت اول توسعهدهنده کرنل لینوکس 6.12LTS هست.
در کنار این توسعه، Microsoft توزیع مخصوص خودش به نام Azure Linux را دارد که کلیه سرورهای LinkedIn از CentOS بتازگی به آن مهاجرت کرده اند.
منابع:
https://linkedin.com/blog/engineering/architecture/navigating-the-transition-adopting-azure-linux-as-linkedins-operatingsystem
https://lwn.net/Articles/997959/
@DevTwitter | <Vahid Nameni/>
در کنار این توسعه، Microsoft توزیع مخصوص خودش به نام Azure Linux را دارد که کلیه سرورهای LinkedIn از CentOS بتازگی به آن مهاجرت کرده اند.
منابع:
https://linkedin.com/blog/engineering/architecture/navigating-the-transition-adopting-azure-linux-as-linkedins-operatingsystem
https://lwn.net/Articles/997959/
@DevTwitter | <Vahid Nameni/>
🤣60👍31❤4
دیزاین پترن Facade در Golang
یکی از دیزاین پترن های جذاب و کاربردی، پترن Facade! شاید اسمش یه کم شیک به نظر بیاد، ولی قول میدم که خیلی کاربردیه و کارمون رو راحتتر میکنه.
حالا Facade چیه؟
فرض کن جلوی یه ساختمون خیلی شیک و بزرگ وایسادی، ولی لازم نیست بری داخلش و همه اتاقاشو ببینی. فقط کافیه از بیرون، نمای ساده و مرتبش رو ببینی و کارتو راه بندازی. پترن Facade دقیقاً همینه! یه رابط کاربری ساده میده که دیگه لازم نباشه با پیچیدگیهای سیستم درگیر بشی.
چرا باید ازش استفاده کنیم؟
دو تا اصل مهم دنیای کدنویسی اینجا برامون روشنتر میشه:
1- همه چی ساده باشه KISS
2- تکرار نکن DRY
وقتی از Facade استفاده میکنی، پیچیدگیهای پشت پرده سیستم رو قایم میکنی و فقط چیزی که کاربر (یا حتی خودت!) نیاز داری رو نشون میدی. کدت مرتبتر، قابل نگهداریتر و قابلفهمتر میشه.
ی مثال ساده: اتصال به دیتابیس
فرض کن میخوای به دیتابیس وصل بشی، کوئری بزنی و قطع کنی. بدون Facade و با Facade داخل تصویر هست.
کاربردهای دیگه:
کار با فایلها
ارتباط با API
راهاندازی وبسرور
مدیریت سفارشهای فروشگاه آنلاین
و...
این Facade مثل یه شمشیر دولبهست. اگه زیادی سادهسازی کنی یا بخوای همه کارها رو تو یه struct و متدهاش بذاری، ممکنه یه ساختار پیچیده (God Object) بسازی که خودش یه مشکل جدیده.
خلاصه صحبت هامون:
دیزاین پترن Facade، یه ابزار فوقالعاده برای سادهسازی و مرتب کردن کدهاتونه. اما همونطور که هر چیزی حد داره، از این پترن هم فقط وقتی استفاده کن که به درد بخوره و لازم باشه.
@DevTwitter | <Mohammad Abdorrahmani/>
یکی از دیزاین پترن های جذاب و کاربردی، پترن Facade! شاید اسمش یه کم شیک به نظر بیاد، ولی قول میدم که خیلی کاربردیه و کارمون رو راحتتر میکنه.
حالا Facade چیه؟
فرض کن جلوی یه ساختمون خیلی شیک و بزرگ وایسادی، ولی لازم نیست بری داخلش و همه اتاقاشو ببینی. فقط کافیه از بیرون، نمای ساده و مرتبش رو ببینی و کارتو راه بندازی. پترن Facade دقیقاً همینه! یه رابط کاربری ساده میده که دیگه لازم نباشه با پیچیدگیهای سیستم درگیر بشی.
چرا باید ازش استفاده کنیم؟
دو تا اصل مهم دنیای کدنویسی اینجا برامون روشنتر میشه:
1- همه چی ساده باشه KISS
2- تکرار نکن DRY
وقتی از Facade استفاده میکنی، پیچیدگیهای پشت پرده سیستم رو قایم میکنی و فقط چیزی که کاربر (یا حتی خودت!) نیاز داری رو نشون میدی. کدت مرتبتر، قابل نگهداریتر و قابلفهمتر میشه.
ی مثال ساده: اتصال به دیتابیس
فرض کن میخوای به دیتابیس وصل بشی، کوئری بزنی و قطع کنی. بدون Facade و با Facade داخل تصویر هست.
کاربردهای دیگه:
کار با فایلها
ارتباط با API
راهاندازی وبسرور
مدیریت سفارشهای فروشگاه آنلاین
و...
این Facade مثل یه شمشیر دولبهست. اگه زیادی سادهسازی کنی یا بخوای همه کارها رو تو یه struct و متدهاش بذاری، ممکنه یه ساختار پیچیده (God Object) بسازی که خودش یه مشکل جدیده.
خلاصه صحبت هامون:
دیزاین پترن Facade، یه ابزار فوقالعاده برای سادهسازی و مرتب کردن کدهاتونه. اما همونطور که هر چیزی حد داره، از این پترن هم فقط وقتی استفاده کن که به درد بخوره و لازم باشه.
@DevTwitter | <Mohammad Abdorrahmani/>
👍24🤣7❤1
تو دیتابیس ها یه مفهومی وجود داره به اسم clustered index که در مقابلش non clustered index قرار میگیره
خب این clustered index یعنی چی؟ یعنی اینکه ترتیبی که داده ها در ایندکس قرار میگیرن، همون ترتیبی هست که داده ها در فایل و دیسک ذخیره میشن.
بنابراین هر جدول دیتابیس فقط میتونه یه clustered index داشته باشه که معمولا primary key هست.
کجا ها clustered index مهمه؟ جاهایی که شما range query یا sequential scan داری مهم میشه
چرا مهم میشه؟ چون دیتابیس با تعداد io کمتر رکوردهارو از فایل و دیسک fetch میکنه
حالا قرار دادن یه guid مثل uuid به عنوان primary key چه بلایی سر clustered index میاره؟ عملا رکوردهایی که در ایندکس دارن مرتب میشن میتونن تو فایل های مختلفی از دیسک scatter بشن و هزینه fetch کردن شون در کوئری های range رو بالا ببره.
یه سری دیتابیس ها یه سری بهبود برای این قضیه دارن، مثلا یه implicit primary key خودشون در نظر میگیرن که incremental integer هست و اون رو clustered index در نظر میگیرن.
https://blog.novanet.no/careful-with-guid-as-clustered-index/
@DevTwitter | <Hossein Nazari/>
خب این clustered index یعنی چی؟ یعنی اینکه ترتیبی که داده ها در ایندکس قرار میگیرن، همون ترتیبی هست که داده ها در فایل و دیسک ذخیره میشن.
بنابراین هر جدول دیتابیس فقط میتونه یه clustered index داشته باشه که معمولا primary key هست.
کجا ها clustered index مهمه؟ جاهایی که شما range query یا sequential scan داری مهم میشه
چرا مهم میشه؟ چون دیتابیس با تعداد io کمتر رکوردهارو از فایل و دیسک fetch میکنه
حالا قرار دادن یه guid مثل uuid به عنوان primary key چه بلایی سر clustered index میاره؟ عملا رکوردهایی که در ایندکس دارن مرتب میشن میتونن تو فایل های مختلفی از دیسک scatter بشن و هزینه fetch کردن شون در کوئری های range رو بالا ببره.
یه سری دیتابیس ها یه سری بهبود برای این قضیه دارن، مثلا یه implicit primary key خودشون در نظر میگیرن که incremental integer هست و اون رو clustered index در نظر میگیرن.
https://blog.novanet.no/careful-with-guid-as-clustered-index/
@DevTwitter | <Hossein Nazari/>
👍29👎2❤1
شرط میبندم اینو نمیدونستی:
توی php میتونی واسه خوانایی بیشتر بین اعداد _ قرار بدی و هیچ خللی توی برنامت وارد نشه؟ حتی عملیات ریاضی هم به درستی کار میکنن.
اگه باور نداری همین الان برو امتحانش کن
حالا به چه دردی میخوره؟ خوب از اونجایی که نمیشه داخل کد کاما بین اعداد گذاشت، این حرکت میتونه خوانایی کد رو ببره بالا.
@DevTwitter | <Pouya Farshidnia/>
توی php میتونی واسه خوانایی بیشتر بین اعداد _ قرار بدی و هیچ خللی توی برنامت وارد نشه؟ حتی عملیات ریاضی هم به درستی کار میکنن.
اگه باور نداری همین الان برو امتحانش کن
حالا به چه دردی میخوره؟ خوب از اونجایی که نمیشه داخل کد کاما بین اعداد گذاشت، این حرکت میتونه خوانایی کد رو ببره بالا.
@DevTwitter | <Pouya Farshidnia/>
11🤣110👍64🔥12👎6
This media is not supported in your browser
VIEW IN TELEGRAM
یک آموزش جدید درست کردم
تو این ویدیو یاد میگیریم چجوری با Docker Compose بتونیم MinIO رو داخل VPS ارزون خودمون بالا بیاریم و برای خودمون S3 Object Storage داشته باشیم.
بعدش یاد میگیریم چجوری داخل یک اپ Next.js به MinIO وصل بشیم و اول ازش یک Pre-Signed URL بگیریم بعدش مستقیم فایلمون رو داخل MinIO آپلود کنیم.
لینک ویدیو:
https://www.youtube.com/watch?v=UPygkumJc2A
لینک گیتهاب:
https://github.com/sesto-dev/next-minio-self-host
@DevTwitter | <Amirhossein Mohammadi/>
تو این ویدیو یاد میگیریم چجوری با Docker Compose بتونیم MinIO رو داخل VPS ارزون خودمون بالا بیاریم و برای خودمون S3 Object Storage داشته باشیم.
بعدش یاد میگیریم چجوری داخل یک اپ Next.js به MinIO وصل بشیم و اول ازش یک Pre-Signed URL بگیریم بعدش مستقیم فایلمون رو داخل MinIO آپلود کنیم.
لینک ویدیو:
https://www.youtube.com/watch?v=UPygkumJc2A
لینک گیتهاب:
https://github.com/sesto-dev/next-minio-self-host
@DevTwitter | <Amirhossein Mohammadi/>
🔥28👍10🤣5❤1
میدونستی میتونی کوئریهات رو هوشمندانهتر و بهینهتر کنی؟
اگه توی پروژههات همیشه برای فیلتر کردن محتوا بر اساس فیلدخاصی شرط مینویسی، میتونی این شرط رو یک بار برای همیشه به مدل اضافه کنی و از تکرار کدهای اضافی خلاص بشی!
کد اسلاید رو ببین:
ما یه Global Query Scope ساختیم به اسم TeamScope و به مدل Article اضافه کردیم. از این به بعد، هر وقت کوئری مربوط به مقالات رو بزنیم، خودکار فقط مقالات تیم کاربر لاگین شده برمیگرده.
نکته مهم:
این کار رو میتونید با سه روش مختلف پیادهسازی کنید که هر کدوم بسته به نیازتون کاربردی هستن.
نتیجه؟
کدهای تمیزتر و حرفهایتر
حذف شرطهای تکراری
راحتتر کردن نگهداری و گسترش پروژه
@DevTwitter | <Saber Qadimi/>
اگه توی پروژههات همیشه برای فیلتر کردن محتوا بر اساس فیلدخاصی شرط مینویسی، میتونی این شرط رو یک بار برای همیشه به مدل اضافه کنی و از تکرار کدهای اضافی خلاص بشی!
کد اسلاید رو ببین:
ما یه Global Query Scope ساختیم به اسم TeamScope و به مدل Article اضافه کردیم. از این به بعد، هر وقت کوئری مربوط به مقالات رو بزنیم، خودکار فقط مقالات تیم کاربر لاگین شده برمیگرده.
نکته مهم:
این کار رو میتونید با سه روش مختلف پیادهسازی کنید که هر کدوم بسته به نیازتون کاربردی هستن.
نتیجه؟
کدهای تمیزتر و حرفهایتر
حذف شرطهای تکراری
راحتتر کردن نگهداری و گسترش پروژه
@DevTwitter | <Saber Qadimi/>
🔥12👍10❤1👎1
ماجرای crash کردن Windows 95 بعد از 49.7 روز!
امروز به یه مطلب جالبی برخوردم.
وقتی مایکروسافت نسخه اولیه ویندوز 95 رو منتشر کرد، بعد از مدتی متوجه شد که کامپیوتر هایی که از این سیستم عامل استفاده میکنن اگر 49.7 روز به طور مداوم روشن بمونن ویندوز یهو crash میکنه.
بعد از بررسی متوجه میشن علتش type متغیری هست که زمان روشن بودن سیستم(Uptime) رو نگهداری میکنه. این متغیر زمان روشن بودن سیستم رو به میلی ثانیه نگه میداره و type رو unsigned int 32 انتخاب کرده بودن که این تایپ نهایتا تا عدد 4,294,967,295 رو میتونه توی خودش ذخیره کنه و چون بعد از 49.7 روز مقدار میلی ثانیه های گذشته از روشن بودن سیستم به عدد بالا میرسه، overflow رخ میده و این متغیر دوباره به 0 ریست میشه!
حالا بعضی از قسمت های سیستم عامل دائم در حال بررسی مقدار این متغیر هستن و این فرض رو دارن که این متغیر دائم باید در حال زیاد شدن باشه، وقتی که میبینن یهو ریست شده براشون غیر منتظرس و crash رخ میده.
بعد از اینکه مشکل رو پیدا کردن type رو به unsigned int 64 تغییر دادن و مشکل حل شد
@DevTwitter | <Bassam Nazemi/>
امروز به یه مطلب جالبی برخوردم.
وقتی مایکروسافت نسخه اولیه ویندوز 95 رو منتشر کرد، بعد از مدتی متوجه شد که کامپیوتر هایی که از این سیستم عامل استفاده میکنن اگر 49.7 روز به طور مداوم روشن بمونن ویندوز یهو crash میکنه.
بعد از بررسی متوجه میشن علتش type متغیری هست که زمان روشن بودن سیستم(Uptime) رو نگهداری میکنه. این متغیر زمان روشن بودن سیستم رو به میلی ثانیه نگه میداره و type رو unsigned int 32 انتخاب کرده بودن که این تایپ نهایتا تا عدد 4,294,967,295 رو میتونه توی خودش ذخیره کنه و چون بعد از 49.7 روز مقدار میلی ثانیه های گذشته از روشن بودن سیستم به عدد بالا میرسه، overflow رخ میده و این متغیر دوباره به 0 ریست میشه!
حالا بعضی از قسمت های سیستم عامل دائم در حال بررسی مقدار این متغیر هستن و این فرض رو دارن که این متغیر دائم باید در حال زیاد شدن باشه، وقتی که میبینن یهو ریست شده براشون غیر منتظرس و crash رخ میده.
بعد از اینکه مشکل رو پیدا کردن type رو به unsigned int 64 تغییر دادن و مشکل حل شد
@DevTwitter | <Bassam Nazemi/>
👍103🤣32❤4🔥4
همزمانی (Concurrency) در لاراول 11 را بیشتر بشناسیم
همزمانی یا Concurrency در Laravel نقش مهمی در بهبود عملکرد و مدیریت بار دارد. با استفاده از مکانیزم Queue و قابلیت Task Scheduling، میتوان وظایف را بهصورت همزمان اجرا کرد. برای جلوگیری از Race Condition، اغلب از Lock و Transaction در سطح دیتابیس بهره میبریم. هنگامی که تعداد درخواستها بالا میرود، توزیع بار توسط سرورهای متعدد در کنار مدیریت صحیح Session و Cache، Concurrency را کارآمدتر میکند. همچنین نظارت بر Performance و پیادهسازی الگوی Event-driven رویکردی کلیدی برای ساخت اپلیکیشنهای مقیاسپذیر است. همچنین بهکارگیری ابزارهایی مثل Horizon جهت مانیتورینگ Queue و Jobها، در تضمین سلامت Concurrency کمک میکند.
@DevTwitter | <Alireza Javadi/>
همزمانی یا Concurrency در Laravel نقش مهمی در بهبود عملکرد و مدیریت بار دارد. با استفاده از مکانیزم Queue و قابلیت Task Scheduling، میتوان وظایف را بهصورت همزمان اجرا کرد. برای جلوگیری از Race Condition، اغلب از Lock و Transaction در سطح دیتابیس بهره میبریم. هنگامی که تعداد درخواستها بالا میرود، توزیع بار توسط سرورهای متعدد در کنار مدیریت صحیح Session و Cache، Concurrency را کارآمدتر میکند. همچنین نظارت بر Performance و پیادهسازی الگوی Event-driven رویکردی کلیدی برای ساخت اپلیکیشنهای مقیاسپذیر است. همچنین بهکارگیری ابزارهایی مثل Horizon جهت مانیتورینگ Queue و Jobها، در تضمین سلامت Concurrency کمک میکند.
@DevTwitter | <Alireza Javadi/>
👍24👎21🤣10❤4
چرا بعضی Unit Testها به هیچ دردی نمی خورن؟
تا حالا براتون پیش اومده که بعد از کلی وقت گذاشتن روی نوشتن تست های واحد، بازم سیستم با یه باگ ناجور منفجر بشه؟ اون حس ناامیدی که انگار همه اون تست ها فقط وقت تلف کردن...
خب، چرا این اتفاق می افته؟
یه سری اشتباهات رایج باعث می شه تست ها بی اثر بشن. مثلا:
استفاده از داده های واقعی به جای داده های ساختگی:
فکر کنید تست تون روی دیتابیس واقعی اجرا بشه. اگه رکوردها تغییر کنن یا دسترسی به دیتابیس قطع بشه، تست می ترکه. تست خوب باید مستقل از محیط باشه.
عدم استفاده از Mocking:
وقتی همه وابستگی های کد واقعی باشن، دارین کل سیستم رو تست می کنید، نه فقط یه بخش خاص رو. این دیگه Unit Test نیست! استفاده از Mock باعث می شه به جای اینکه به API واقعی یا دیتابیس وصل بشید، شبیه ساز اون ها رو تست کنید.
نوشتن تست های زیاد ولی بدون هدف مشخص:
یه زمانی فکر می کردم هرچی تعداد تست ها بیشتر باشه بهتره. بعد فهمیدم تستی که هدفمند نباشه، فقط کد رو شلوغ می کنه و باعث می شه موقع تغییرات کلی مشکل زا بشه.
حالا راه حل چیه؟
۱. وابستگی ها رو Mock کنید. با ابزارهایی مثل Mockito می تونید رفتار وابستگی ها رو شبیه سازی کنید.
۲. از داده های ثابت و ساختگی (Fake Data) استفاده کنید که تغییر نمی کنن.
۳. روی سناریوهای کلیدی تمرکز کنید. مثلا یه تابع مهم چطوری ورودی های خاص رو هندل می کنه؟ این مهم تر از اینه که صد تا تست بنویسید که همشون بی هدف باشن.
@DevTwitter | <Hamed Farzanefar/>
تا حالا براتون پیش اومده که بعد از کلی وقت گذاشتن روی نوشتن تست های واحد، بازم سیستم با یه باگ ناجور منفجر بشه؟ اون حس ناامیدی که انگار همه اون تست ها فقط وقت تلف کردن...
خب، چرا این اتفاق می افته؟
یه سری اشتباهات رایج باعث می شه تست ها بی اثر بشن. مثلا:
استفاده از داده های واقعی به جای داده های ساختگی:
فکر کنید تست تون روی دیتابیس واقعی اجرا بشه. اگه رکوردها تغییر کنن یا دسترسی به دیتابیس قطع بشه، تست می ترکه. تست خوب باید مستقل از محیط باشه.
عدم استفاده از Mocking:
وقتی همه وابستگی های کد واقعی باشن، دارین کل سیستم رو تست می کنید، نه فقط یه بخش خاص رو. این دیگه Unit Test نیست! استفاده از Mock باعث می شه به جای اینکه به API واقعی یا دیتابیس وصل بشید، شبیه ساز اون ها رو تست کنید.
نوشتن تست های زیاد ولی بدون هدف مشخص:
یه زمانی فکر می کردم هرچی تعداد تست ها بیشتر باشه بهتره. بعد فهمیدم تستی که هدفمند نباشه، فقط کد رو شلوغ می کنه و باعث می شه موقع تغییرات کلی مشکل زا بشه.
حالا راه حل چیه؟
۱. وابستگی ها رو Mock کنید. با ابزارهایی مثل Mockito می تونید رفتار وابستگی ها رو شبیه سازی کنید.
۲. از داده های ثابت و ساختگی (Fake Data) استفاده کنید که تغییر نمی کنن.
۳. روی سناریوهای کلیدی تمرکز کنید. مثلا یه تابع مهم چطوری ورودی های خاص رو هندل می کنه؟ این مهم تر از اینه که صد تا تست بنویسید که همشون بی هدف باشن.
@DevTwitter | <Hamed Farzanefar/>
👍40🤣14👎3