#Quick
از پایتون درست استفاده کنید.
دلیل این اختلاف زمانی و حافظه رو دوستان به خوبی توی کامنتها توضیح دادند پس دیگه من صحبت نمیکنم راجبش.
اما غیر از مورد اول :
که بهینه ترین حالت محاسبات و استفاده درست از numpy هست (وقتی میخواهید روی آرایه قبلی بنویسید) باقی موارد هر ۲ باعث خطا و terminate شدن کولب شدند.
شاید فکر کنید ۱ میلیارد عدد بزرگی هست :
۱- بستگی به موضوع داره ولی توی دنیای فعلی خیر واقعاً بزرگ نیست
۲- مدل
۳-
رو همیشه باید توی بدترین حالات محاسبه کرد (برای همین Big O رو یاد گرفتیم)
از پایتون درست استفاده کنید.
دلیل این اختلاف زمانی و حافظه رو دوستان به خوبی توی کامنتها توضیح دادند پس دیگه من صحبت نمیکنم راجبش.
اما غیر از مورد اول :
x1 *= 2که بهینه ترین حالت محاسبات و استفاده درست از numpy هست (وقتی میخواهید روی آرایه قبلی بنویسید) باقی موارد هر ۲ باعث خطا و terminate شدن کولب شدند.
شاید فکر کنید ۱ میلیارد عدد بزرگی هست :
۱- بستگی به موضوع داره ولی توی دنیای فعلی خیر واقعاً بزرگ نیست
۲- مدل
LLAMA 2 (تلفظ : لاما) که چندروز پیش توسط meta معرفی شد کوچکترینش 7 میلیارد و بزرگترینش 70 میلیارد پارامتر داره.۳-
performanceرو همیشه باید توی بدترین حالات محاسبه کرد (برای همین Big O رو یاد گرفتیم)
❤🔥29👍20🤪5✍3👎2⚡1❤1👏1💘1
Python Hints
من محمد عباسی (@abbasi_ai) یک توسعه دهنده پایتون هستم با بیش از ۸ سال تجربه کار با پایتون (البته زمانی که دارم این پست رو مینویسم و باقی موارد تجربیاتم هم برای این کانال اهمیتی نداره) سعی میکنم نکاتی که فکر میکنم مهم هست تغییراتی که توی نسخههای اخیر…
#موقت
#Quick
دوستان من لینکدین رو هرروز چک نمیکنم مگر اینکه پیام یا کاری داشته باشم
اگر connect request فرستادید و طول کشید برای
Accept
کردن، عذرخواهی میکنم 🌹
توی مواردی که نخوام accept بزنم (پروفایل مشخص نیست، از نظر شغلی و ... به هم نمیخوریم مثلا مورد داشتیم طرف زده بود مشاور املاک، درخواست داده بود 😂) خودم reject میزنم. اما اگر ببینم بدون پاسخ نمیذارم.
این مورد برای پیامهای تلگرام هم صدق میکنه (اگر پیامی رو چندروز ندیدم یک پیام دیگه با متن up بفرستید که پیام بالا بیاد و ببینم)
#Quick
دوستان من لینکدین رو هرروز چک نمیکنم مگر اینکه پیام یا کاری داشته باشم
اگر connect request فرستادید و طول کشید برای
Accept
کردن، عذرخواهی میکنم 🌹
توی مواردی که نخوام accept بزنم (پروفایل مشخص نیست، از نظر شغلی و ... به هم نمیخوریم مثلا مورد داشتیم طرف زده بود مشاور املاک، درخواست داده بود 😂) خودم reject میزنم. اما اگر ببینم بدون پاسخ نمیذارم.
این مورد برای پیامهای تلگرام هم صدق میکنه (اگر پیامی رو چندروز ندیدم یک پیام دیگه با متن up بفرستید که پیام بالا بیاد و ببینم)
👍19👌8🗿5🤪2❤1
#Quick
این یکی از
یکی از سرویسهای شرکت رو چون جلوتر از
Sprint
بودم و بسیار بسیار شبیه یکی دیگه از سرویسهایی هست که خودم کد زده بودم بجای اینکه طبق معمول پیاده سازی کنم
پیادهسازی کردم با اینکه فکر میکردم چون
دوستان یوتیوبر بنظرم، ازین دورهها بسازید.
برای توسعه دهندهها شاید الان خیلی چیز پر دردسری باشه نسبت به موارد دیگه که وجود داره و نیاز به
ولی قطعاً آینده Django به این سمت هست و برای درآمد بهتر در اون زمان، الان وقت شروع تمرین هست بنظرم
این یکی از
Django هست نسخه 3.2 به بعد (من فقط 3.2 و 4.2 رو تست کردم) یکی از سرویسهای شرکت رو چون جلوتر از
Sprint
بودم و بسیار بسیار شبیه یکی دیگه از سرویسهایی هست که خودم کد زده بودم بجای اینکه طبق معمول پیاده سازی کنم
Async پیادهسازی کردم با اینکه فکر میکردم چون
ORM هنوز async نشده و نباید خیلی کمک بزرگی بهم بکنه اما طبق خروجی profiler تقریباً ۲.۲ برابر request بیشتری رو دارم هندل میکنم با سختافزار و کانفیگ یکسان.دوستان یوتیوبر بنظرم، ازین دورهها بسازید.
برای توسعه دهندهها شاید الان خیلی چیز پر دردسری باشه نسبت به موارد دیگه که وجود داره و نیاز به
sync_to_async , ...ولی قطعاً آینده Django به این سمت هست و برای درآمد بهتر در اون زمان، الان وقت شروع تمرین هست بنظرم
👍25⚡7👎1
#Quick
برای بالا بردن سرعت کدها اولین کاری که میکنید اینه که میرید
یاد میگیرید ؟
اشتباه نکنید، چیزی که قبل از اون نیاز دارید و ۹۹.۹٪ مشکلاتتون رو حل میکنه
(شاید یک آموزشی هم براش گذاشتم)
برای مثال توی پروژه اخیر، بجای یک سری از پردازشهای مهم تصویر رو که با
numpy
پیاده سازی شده بود آوردیم روی
Cython (numpy)
زمان اجرا تمام پردازشها قبل از این برای ۱ عکس توی بنچمارک ۵۳ ثانیه بود و بعد از تبدیل به Cython به حدوداً ۱ ثانیه رسید.
خیلی مهمه با همین ابزارهایی که در اختیارتون هست آشنا باشید و بتونید کار کنید.
پ.ن : کتاب بروزی نداریم برای این موضوع متأسفانه ولی یکی از بهترین منابع که یادم هستم (چندسال قبل خوندم؛ با یکی از دوستان)
بود و البته داکیومنت خود
Cython
حتی یاد گیری مقدماتش هم میتونه تا ۴-۵ برابر کدهاتون رو سریعتر کنه
برای بالا بردن سرعت کدها اولین کاری که میکنید اینه که میرید
Cیاد میگیرید ؟
اشتباه نکنید، چیزی که قبل از اون نیاز دارید و ۹۹.۹٪ مشکلاتتون رو حل میکنه
Cython(شاید یک آموزشی هم براش گذاشتم)
برای مثال توی پروژه اخیر، بجای یک سری از پردازشهای مهم تصویر رو که با
numpy
پیاده سازی شده بود آوردیم روی
Cython (numpy)
زمان اجرا تمام پردازشها قبل از این برای ۱ عکس توی بنچمارک ۵۳ ثانیه بود و بعد از تبدیل به Cython به حدوداً ۱ ثانیه رسید.
خیلی مهمه با همین ابزارهایی که در اختیارتون هست آشنا باشید و بتونید کار کنید.
پ.ن : کتاب بروزی نداریم برای این موضوع متأسفانه ولی یکی از بهترین منابع که یادم هستم (چندسال قبل خوندم؛ با یکی از دوستان)
Cython (A guide for python programmers) by Kurt W.Smith - O'Reilly بود و البته داکیومنت خود
Cython
حتی یاد گیری مقدماتش هم میتونه تا ۴-۵ برابر کدهاتون رو سریعتر کنه
👍44🤯8👌4⚡1
Rust for Python developers
این یکی واقعاً جالبه، جایگزین Flake8, isort, black, pyupgrade, ... با سرعت خیلی بیشتر. Ruff که با Rust نوشته شده، و پروژه Scipy, Pandas, FastApi, ... هم سمتش رفتند.
#Quick
پست قبلی که گذاشتم راجب
توافق کردند از
استفاده کنند، بخصوص که حالا دیگه
تا اینجا که خیلی خوب پیش رفته (از صبح).
پست قبلی که گذاشتم راجب
uv حقیقتا از اینجا متوجه پروژه شدم که تیمهایData Engineering, Backend, Test توافق کردند از
ruffاستفاده کنند، بخصوص که حالا دیگه
vs-code extension هم براش وجود داره و خیلی راحت شده کار بچهها گفتند ما هم بریم سراغش و منم دارم بررسی میکنم که نظراتم رو راجبش بدم، نسبت به تمام کانفیگهایی که داریم.تا اینجا که خیلی خوب پیش رفته (از صبح).
👍20❤1
#Quick
نوشتن
این مورد رو بین بچههای دیتاساینس و هوش خیلی زیاد میبینم و بین بچههای بکند هم وقتی دارند روی
موضوع فقط مصرف زیاد رم نیست؛ موضوع سرعت هم هست اگر قرار به تمیزکاری و پردازش هر نمونه دپتا یا خط به خط هست لطفا از
مشکل دارن با ما؛ ما اینجا زحمت میکشیم
تصویر ی نمونه خیلی ساده برای مثال هست (زمان اجرا کامنت شده)
نوشتن
list اطراف هر تابع باید دوبار بهش فکر کنید. اگر اون تابع یک generator باشه شما دارید بدترین کار ممکن رو میکنید.این مورد رو بین بچههای دیتاساینس و هوش خیلی زیاد میبینم و بین بچههای بکند هم وقتی دارند روی
CSV, Json و یا Json-line کار میکنند.موضوع فقط مصرف زیاد رم نیست؛ موضوع سرعت هم هست اگر قرار به تمیزکاری و پردازش هر نمونه دپتا یا خط به خط هست لطفا از
generator ها به درستی استفاده کنیدمشکل دارن با ما؛ ما اینجا زحمت میکشیم
generator مینویسیم بعد اینا سریع میندازنش توی listتصویر ی نمونه خیلی ساده برای مثال هست (زمان اجرا کامنت شده)
👍50❤2👎1🐳1
Python Hints
لطفاً پیامهای پین شده کانال رو بخونید 🌹 به لطف شما عزیزان, کانال قابلیت استوری گذاشتن داره و سعی میکنم ازین قابلیت برای معرفی کتابها استفاده کنم تا دوستان به راحتی بتونند کتابها رو پیدا کنند. همونطور که قبلاً گفتم، فقط و فقط کتابهایی رو معرفی میکنم…
#quick_note
تعداد افرادی که از کانالهای جنگو و هوش مصنوعی وارد این کانال شدند درحال افزایش هست
برای همین توی بخش معرفی کتابها و استوری ها ازین به بعد کتابهایی غیر از
معرفی کتاب که ضرری نداره (اما لطفا غیر از موضوع
هر موضوع دیگری : @DevChaiChat
در نهایت؛ یادآوری کنم من فقط کتابی رو معرفی میکنم که شخصا خونده باشم و بنظرم ارزش معرفی داشته باشه
اضافه کنم :
تمامی کتابهای معرفی شده رو میتونید با کلیک روی اسم کانال و رفتن توی قسمت
تعداد افرادی که از کانالهای جنگو و هوش مصنوعی وارد این کانال شدند درحال افزایش هست
برای همین توی بخش معرفی کتابها و استوری ها ازین به بعد کتابهایی غیر از
Core Python رو هم اضافه میکنم.معرفی کتاب که ضرری نداره (اما لطفا غیر از موضوع
Core Python) توی گروه متصل به کانال صحبتی نشههر موضوع دیگری : @DevChaiChat
در نهایت؛ یادآوری کنم من فقط کتابی رو معرفی میکنم که شخصا خونده باشم و بنظرم ارزش معرفی داشته باشه
اضافه کنم :
تمامی کتابهای معرفی شده رو میتونید با کلیک روی اسم کانال و رفتن توی قسمت
Posts ببینید.#Quick
یک سری وقتها هست که توی پروژه بنا به هر دلیلی نیاز هست که یک پوشه خالی داشته باشید و اون رو روی
اکثرا برای
حالا مساله چیه ؟ هرکی برای خودش از یک استاندارد استفاده میکنه (همه موارد جواب میده)
۱- اونایی که توی
اضافه کردن فایل
۲- بچههای
اضافه کردن یکم فایل با نام دلخواه و شروع با
۳- ویندوزیها :
اضافه کردن یک فایل با پسوند
اما برای این کار یک قرارداد نانوشته مشترک بین همه برنامهنویسها هست اونم؛ توی اون پوشه خالی یک فایل به اسم
بسازید (جدای از
یعنی همه چیز داخل این پوشه رو برای
ربطی به موارد
یک سری وقتها هست که توی پروژه بنا به هر دلیلی نیاز هست که یک پوشه خالی داشته باشید و اون رو روی
git هم بذارید.اکثرا برای
permission درست و ... دیدم این کار انجام میشه.حالا مساله چیه ؟ هرکی برای خودش از یک استاندارد استفاده میکنه (همه موارد جواب میده)
۱- اونایی که توی
Mac کد میزنند:اضافه کردن فایل
.DSStore (با همچین اسمی به پوشه خالی)۲- بچههای
Linux :اضافه کردن یکم فایل با نام دلخواه و شروع با
. بیشترین مورد : .ignore۳- ویندوزیها :
اضافه کردن یک فایل با پسوند
txtاما برای این کار یک قرارداد نانوشته مشترک بین همه برنامهنویسها هست اونم؛ توی اون پوشه خالی یک فایل به اسم
.gitignoreبسازید (جدای از
gitignore کل پروژه هست) و محتوای داخلش این خواهد بود:*
!.gitignore
یعنی همه چیز داخل این پوشه رو برای
git نادیده بگیر به غیر از .gitignoreربطی به موارد
advance نداشت ولی چون دیدم خیلی کم رعایت میشه گفتم پست بذارم.👍59❤4🤨2🤝2⚡1🙊1
#Quick
هاردهاتون رو تمیز کنید
فضای خالی بدست اومد.
کاری که من کردم :
۱- کل فایلهای روی
بعد اول بر اساس اسم
و بعد از اون بر اساس تاریخ مرتب کردم
حدود
دیتاهای
کد قبلی رو با
۲- بعد از اون یک سری فایلها بودند که مشکوک بودم
پس با
۳- من همیشه توی کدهام، اسم
دقیق بررسی نکردم ولی فکر کنم
.
همرو دستی دیلیت کردم که این بخش یک مقدار زمانبر شد.
اضافه کنم:
برای آخر هفته یک
یک مورد هم برای
هاردهاتون رو تمیز کنید
1.6 TB
فضای خالی بدست اومد.
کاری که من کردم :
۱- کل فایلهای روی
۳ تا هارد اصلیم رو بدست آوردم و توی یک csv شامل این ستونها ریختم؛اسم فایل، پسوند، مسیر، حجم فایل، تاریخ ایجاد
بعد اول بر اساس اسم
و بعد از اون بر اساس تاریخ مرتب کردم
حدود
۸۰۰ گیگ با همین وضعیت پاک شد.دیتاهای
duplicate نبودند ولی مثلاً بکاپ فایلها بودند که خب با وجود اینکه توی تاریخهای بعدی نسخه آپدیتش رو گرفته بودم فراموش کرده بودم نسخه قبلی رو حذف کنم.کد قبلی رو با
multi-threading, ThreadPool زدم و کمتر از ۱ ثانیه اجرا شد.۲- بعد از اون یک سری فایلها بودند که مشکوک بودم
duplicate باشند؛ پس با
md5 شروع کردم hash کردن، از multi-process استفاده کردم، و اینجا هم حدود ۱۰۰ گیگ duplicate پیدا شد که بعد بررسی دیدم دقیقاً یکسان هستند و پاک شد.۳- من همیشه توی کدهام، اسم
virtualenv هارو .venv میذارم پس دنبال اینها هم گشتم + مدلهای هوش مصنوعی با پسوندهای مختلف باقی موارد هم همگی برای اینها بود دقیق بررسی نکردم ولی فکر کنم
۲۰۰ گیگ .venv داشتم (عادت دارم کل پوشه پروژه رو میفرستم روی هارد بکاپ) خلاصه که کار خوبیه و تکنیکهایی هم که گفتم برای من خیلی جواب بود، شما هم دوست داشتید استفاده کنید
.
۹۰٪ کدهاشم دادم codestral برام نوشت و فقط مطمئن شدم پیادهسازی درست هست و اجرا کردم، اما دسترسی دیلیت بهش ندادم.همرو دستی دیلیت کردم که این بخش یک مقدار زمانبر شد.
اضافه کنم:
برای آخر هفته یک
auto indexer + notifier + web هم پیاده خواهم کرد که بهم یادآوری کنه بکاپهای قدیمی رو پاک کنم اگر بر اساس اسم مشابه بود (همچنین باقی فایلا)یک مورد هم برای
.venv اضافه کنم و در نهایت web endpoint رو هم بذارم قبل از اینکه چیزی رو برای چندمین بار دانلود کنم بتونم سرچ کنم که آیا دانلود شده روی سیستم دارم یا خیر❤🔥38👍24🔥2👌2✍1
Python Hints
#بسیار_مهم #خارج_از_بحث خواهشاً بیاید این مورد رو آنقدر به اشتراک بذاریم که همه رعایت کنند. چند وقت پیش دنبال یک نیروی React برای شرکت یکی از دوستان میگشتم، گفتم میرم لینکدین چندتا پروفایل open to work رو میبینم و درخواست رزومه میدم به اونهایی که بنظرم…
#Quick
اگر توی
مهمترین موارد :
۱- لوکیشن (محل سکونت٫اقامت)
۲- توضیح مختصر در مورد خودتون، تجربیاتی که دارید
۳- اطلاعات سابقه کاری
۴- وضعیت تحصیل (دانشجو هستید یا خیر)
۵- مدارک و ....
توی این هفته، کلی پروفایل
یادتون باشه اگر توی
باقی مواردی که مهم نیست ولی بودنش قطعا کمک میکنی :
۱- تصویر پروفایل (بهتره تصویر پارک و ... نگذارید.)
۲- تصویر بنر
۳- پستهایی که پین کردید
۴- پستهایی که لایک٫کامنت میکنید
بازم همون قانونی که توی رزومه نویسی گفتم،
نه خیلی رنگی و ... که انگار برای موقعیت شغلی دلقک شرکت کردید (عاشق دلقک هستم)
و نه خیلی مشکی و بدون چیزی که حوصله سر بر باشه
مثل یک
باید جوری باشه که طرف حداقل ۱۰ دقیقه وقت بذاره (ولی توی ۲ دقیقه اطلاعات مهم روزمه شمارو بخونه، شما تو چشمش فرو کنید.)
پروفایل من رو مرجع نکنید، من توی لینکدین دنبال کار نمیگردم، برای همین اصلا آپدیت نشده.
اضافه کنم :
لطفاً از ابزارهای رزومه سازی استفاده نکنید (مخصوصاً اینایی که همهجای روزمه شما اطلاعات سایت رو مینویسند)
نهایتاً اینکه
ازشون ایده بگیرید، قالب رو بسازید و بعد خودتون خروجی
این موضوع خیلی مهم هست، و رعایت نکردنش نکته منفی بزرگی میتونه باشه برای کارجو.
اگر توی
LinkedIn وضعیت خودتون رو به #OpenToWork تغییر میدید حتماً قبلش پروفایل و اطلاعات اصلی خودتون رو تکمیل کنید.مهمترین موارد :
۱- لوکیشن (محل سکونت٫اقامت)
۲- توضیح مختصر در مورد خودتون، تجربیاتی که دارید
۳- اطلاعات سابقه کاری
۴- وضعیت تحصیل (دانشجو هستید یا خیر)
۵- مدارک و ....
توی این هفته، کلی پروفایل
LinkedIn رو که Open2Work بودند بررسی کردم شاید بتونم بگم فقط ۳۰٪ بطور کامل تمام اطلاعات مهم رو درست و دقیق داشتند.یادتون باشه اگر توی
LinkedIn جویای کار هستید، اولین برخورد و آشنایی قبل از همکاری کارفرما٫مدیر٫نیروی منابع انسانی و ... با صفحه شخصی شما در LinkedIn خواهد بود.باقی مواردی که مهم نیست ولی بودنش قطعا کمک میکنی :
۱- تصویر پروفایل (بهتره تصویر پارک و ... نگذارید.)
۲- تصویر بنر
۳- پستهایی که پین کردید
۴- پستهایی که لایک٫کامنت میکنید
بازم همون قانونی که توی رزومه نویسی گفتم،
نه خیلی رنگی و ... که انگار برای موقعیت شغلی دلقک شرکت کردید (عاشق دلقک هستم)
و نه خیلی مشکی و بدون چیزی که حوصله سر بر باشه
مثل یک
ui/ux کار ببینید.باید جوری باشه که طرف حداقل ۱۰ دقیقه وقت بذاره (ولی توی ۲ دقیقه اطلاعات مهم روزمه شمارو بخونه، شما تو چشمش فرو کنید.)
اضافه کنم :
لطفاً از ابزارهای رزومه سازی استفاده نکنید (مخصوصاً اینایی که همهجای روزمه شما اطلاعات سایت رو مینویسند)
نهایتاً اینکه
ازشون ایده بگیرید، قالب رو بسازید و بعد خودتون خروجی
pdf بدون watermark رو بگیرید و ارسال کنید.این موضوع خیلی مهم هست، و رعایت نکردنش نکته منفی بزرگی میتونه باشه برای کارجو.
👍42❤10😨1
#Quick
من این مشکل رو زیاد دیدم؛ بیش از حداقل 20% پروژههای خدماتی که دوستان روش کار میکنن. میبینم که
شاید به روی خودتون نیارید ولی خیلی از شما هم ازین پروژهها دیدید دیگه.
خواستم هم اهمیت
هم بگم پروژههایی مثل
مثال:
کاری به درست و غلط بودن دیزاین و ... ندارم و بحثم فقط همین مورد
یک کدی رو دیدم؛ طرف یک سیستم
این دیتابیس خیلی اهمیت زیادی نداره؛ هر کد قراره نهایتا
چرا میخواید شر درست کنید برای تیم
خیلی ها مشکلشون این هست که اطلاعات ندارند (هیچوقت هم جرات تجربه کردن نداشتند)؛ خود
بیش از 500 هزار
روی
اضافه کنم :
اینم rqlite اگر حتی خواستید
من این مشکل رو زیاد دیدم؛ بیش از حداقل 20% پروژههای خدماتی که دوستان روش کار میکنن. میبینم که
Postgresql به معنای واقعی کلمه OverKill هست. مخصوصا وقتی Sqlite کار رو در میاره.شاید به روی خودتون نیارید ولی خیلی از شما هم ازین پروژهها دیدید دیگه.
خواستم هم اهمیت
SQLite رو یادآوری کنمهم بگم پروژههایی مثل
rqlite هم وجود دارههامثال:
کاری به درست و غلط بودن دیزاین و ... ندارم و بحثم فقط همین مورد
Sqlite هست.یک کدی رو دیدم؛ طرف یک سیستم
verification جدا براش طراحی کرده بود و تمام پروژههاشون ازین سرویس استفاده میکرد. فکر کنم این سرویس یا .net بود یا golang بعد بحث اصلی سر این بود که Postgres بذارند یا MsSql من درجا پیشنهاد SQlite رو دادم.این دیتابیس خیلی اهمیت زیادی نداره؛ هر کد قراره نهایتا
۱۰ دقیقه valid باشه. در صورت پاک شدن هم طرف یکبار دیگه درخواست میده (که من تاحالا پاک شدن خود به خود توش ندیدم).چرا میخواید شر درست کنید برای تیم
devops, server, database, ...خیلی ها مشکلشون این هست که اطلاعات ندارند (هیچوقت هم جرات تجربه کردن نداشتند)؛ خود
SQLite روی SSD طبق بنچمارکها.بیش از 500 هزار
insert در ثانیه رو پشتیبانی میکنه و برای read هم این مورد به بیش از 1 میلیون میرسه و این مورد بدون config های پرفورمنسی هست که توی داکیومنت خودش ارائه شده.روی
NVMe هم چندسال قبل تست کردیم؛ اعداد بهتر هم میشه.اضافه کنم :
اینم rqlite اگر حتی خواستید
SQlite رو بصورت distributed داشته باشید (قبلا توی اون کی کانال راجبش صحبت کردم با K8s )GitHub
GitHub - rqlite/rqlite: The lightweight, user-friendly, fault-tolerant database built on SQLite.
The lightweight, user-friendly, fault-tolerant database built on SQLite. - rqlite/rqlite
👍54👌5❤4✍3🍓1🗿1
#Quick
یک عادت خوبی که توی بچههای ایران هست که یک
برای اونایی که نمیدونند،
حالا چرا میگم اشتباه پیادهسازی میشه، اول میرم سراغ مانیتورینگ:
فرض کن شما یک بکند داری که برای کار کردن به
فکر کنم متوجه منظورم شدید؛ توی
توی مثال قبلی اگر
حالا چرا
هر
پس سرویس رو از exception, ... مانیتور کنید با
یک عادت خوبی که توی بچههای ایران هست که یک
endpoint توی پروژههای بکند میسازند به اسم health-check اما ۹۰٪ اشتباه پیادهسازی میشه متأسفانه.برای اونایی که نمیدونند،
health-check برای این هست که بصورت اتوماتیک یک سیستم دیگه مثل k8s یا سیستم مانیتورینگ بتونه وضعیت بکند رو بررسی کنه و اگر جوابی نگرفت ایمیل بزنه یا اون pod رو ریست کنه.حالا چرا میگم اشتباه پیادهسازی میشه، اول میرم سراغ مانیتورینگ:
فرض کن شما یک بکند داری که برای کار کردن به
postgres, celery نیاز داره با این وضعیت سیستم شما وقتی سالم هست که به postgres شما بتونه یه درستی دسترسی بگیره و البته به celery (عملکرد celery, postgres رو اگر بخواید بررسی کنید نیاز به ۲ تا سیستم مانیتورینگ جدا دارید، برای شما توی سطح اپلیکیشن دسترسی به این سرویسها مهم هست)فکر کنم متوجه منظورم شدید؛ توی
health-check باید دسترسی به سرویسهایی که بکند شما بدون اونا healthy نیست رو هم چک کنید.توی مثال قبلی اگر
celery برای شما اجبار نیست توی health-check کانکشن بهش رو تست نمیکنید.حالا چرا
k8s رو مثال زدم ؟ برای اینکه بگم استفاده از این endpoint برای بررسی pod ها کار درستی نیست: هر
pod بصورت جداگونه و بصورت تک سرویس در نظر گرفته میشه که به تنهایی میتونه restart بشه بدون اینکه به سیستم لطمه بزنه (من HA درنظرم گرفتم، k8s برای همینه دیگه) پس باید تو سریعتر زمانی که عملکرد خودش رو از دست میده restart بشه فکر کن load سیستم بره بالا در این شرایط هم از روی health-check نمیشه مطمئن بود آیا چون load شبکه رفت بالا جواب دیر میاد یا memory leakage داریم یا ...پس سرویس رو از exception, ... مانیتور کنید با
k8s تا جایی که میشه.👍44✍12❤3👎1
Forwarded from Rust for Python developers
#Quick
اگر از
الان اومد یک کدی رو بزنم چندتا از
اگر از
vscode برای Rust استفاده میکنید حتما این extension رو نصب کنید که دستورات sql رو براتون وسط کدهای rs به خوبی highlight میکنه ( از حالت str& خالی در میاد)الان اومد یک کدی رو بزنم چندتا از
Sql Query هاش خیلی طولانی و سخت شد بدون highlight خوندنش قطعا آزار دهنده بود با سرچ به این رسیدم و بنظرم گزینه بسیار کمک کننده و عالیای هست.👍29❤6🙏2✍1🔥1
#Quick
مثالی برای یک بحث:
یک سری سوالات هست توی مصاحبه که واقعاً نیاز به درک درست از چندین جنبه داره.
یک مثال میزنم و بعدش دیگه این سوال رو از مصاحبههام حذف میکنم :
مثلاً توی بکند؛
چرا به سریالایزر نیاز داریم ؟ من مدل دیتابیس رو دارم پکیجهای مورد نیاز برای کار با
این مثلاً ازون سوالاتی هست که اگر پوزیشن کاری جنگو باشه، توی سطح
اما اگر غیر از اون باشه حتماً توی سطح
به جوابش فکر کنید، اگر نمیدونید هم تحقیق کنید.
مثالی برای یک بحث:
یک سری سوالات هست توی مصاحبه که واقعاً نیاز به درک درست از چندین جنبه داره.
یک مثال میزنم و بعدش دیگه این سوال رو از مصاحبههام حذف میکنم :
مثلاً توی بکند؛
چرا به سریالایزر نیاز داریم ؟ من مدل دیتابیس رو دارم پکیجهای مورد نیاز برای کار با
json, dict هم که وجود داره چرا مستقیم خودم اینکار رو نکنم و حتماً باید از serializer استفاده کنم ؟این مثلاً ازون سوالاتی هست که اگر پوزیشن کاری جنگو باشه، توی سطح
mid میپرسم.اما اگر غیر از اون باشه حتماً توی سطح
junior میپرسم، یک نمونه از چیزهایی که میگم بکند رو فارغ از فریمورک یادبگیرید هم هست.به جوابش فکر کنید، اگر نمیدونید هم تحقیق کنید.
👍34🤔9❤2
Python Hints
#Quick مثالی برای یک بحث: یک سری سوالات هست توی مصاحبه که واقعاً نیاز به درک درست از چندین جنبه داره. یک مثال میزنم و بعدش دیگه این سوال رو از مصاحبههام حذف میکنم : مثلاً توی بکند؛ چرا به سریالایزر نیاز داریم ؟ من مدل دیتابیس رو دارم پکیجهای مورد نیاز…
#Quick
یک سری پروژه داشتم نگاه میکردم، پروژههایی که یا توی دورههای مختلف گذاشته شده (برای آموزش) یا بچهها برای تمرین زدند.
(جلوتر میگم چرا اینکارو داشتم میکردم)
بعد میدیدم که خب هیچکدوم ازین پروژهها مثلاً از ابزاری مثل
اول اینکه مگه توی دنیای فعلی میشه شما پروژهای داشته باشی ولی
یا یک مثال دیگه، هیچکدوم از پروژهها رو نمیشد با تک کامند
بحث ci/cd نیست الان، ولی docker compose و ... باید به درستی نوشته بشه
و البته کلی نکات دیگه مثل این موضوع.
اینکه چرا دارم این موارد رو دنبال میکنم :
ضبط یک دوره کامل، اگر به نتیجه برسیم با یک تیم حرفهای.
یک سری پروژه داشتم نگاه میکردم، پروژههایی که یا توی دورههای مختلف گذاشته شده (برای آموزش) یا بچهها برای تمرین زدند.
(جلوتر میگم چرا اینکارو داشتم میکردم)
بعد میدیدم که خب هیچکدوم ازین پروژهها مثلاً از ابزاری مثل
Celery استفاده نکردن یا Celery داره ولی Flower نداره.اول اینکه مگه توی دنیای فعلی میشه شما پروژهای داشته باشی ولی
celery توش نباشه؟ یا اینکه celery رو ببری روی پروداکشن ولی مانیتور نکنی (اینو توی خیلی پروژهها هم دیدم).یا یک مثال دیگه، هیچکدوم از پروژهها رو نمیشد با تک کامند
deploy کرد.local, stage, productionبحث ci/cd نیست الان، ولی docker compose و ... باید به درستی نوشته بشه
و البته کلی نکات دیگه مثل این موضوع.
اینکه چرا دارم این موارد رو دنبال میکنم :
ضبط یک دوره کامل، اگر به نتیجه برسیم با یک تیم حرفهای.
👍77❤21👎5❤🔥3🔥2
Python Hints
اومدم یک تولز معرفی کنم و برم : من حدودا ۲ سالی میشه که Postman ندارم؛ از وقتی که لاگین و Sync و ... کم کم اجباری شد (احمقانه) ی مدت طولانی رفتم روی کد پایتون؛ یک بخشی داشتم به اسم api client توی اکثر کدهام که خودش ی پروژه کنار پروژه اصلی میشه ( کارفرما و…
#Quick
و در نهایت :
استفاده از
بخاطر اینکه برای استفاده ازین ۲ ابزار حتماً باید اکانت داشته باشید و حتماً هم این ابزارها تمام اطلاعات رو با سرورهاشون
پیشنهاد خودشون
پ.ن : اگر کسی گزینه بهتری میشناسه قطعاً منتظر شنیدنش هستم.
هم درحال حاضر استفاده میکنم البته، ولی خب چندتا از دولوپرها
و در نهایت :
استفاده از
Insomnia, Postman توی شرکت برای پروژههای اصلی ممنوع شد.بخاطر اینکه برای استفاده ازین ۲ ابزار حتماً باید اکانت داشته باشید و حتماً هم این ابزارها تمام اطلاعات رو با سرورهاشون
Sync میکنند.پیشنهاد خودشون
Bruno بوده (پیشنهاد من بود) ولی هر ابزاری که بدون نیاز به اینترنت و sync بشه استفاده کرد مشکلی نداره.پ.ن : اگر کسی گزینه بهتری میشناسه قطعاً منتظر شنیدنش هستم.
Thunder Client هم درحال حاضر استفاده میکنم البته، ولی خب چندتا از دولوپرها
vscode ندارند که دردسر شده.👍29✍6👎3👏2🤔2
#Quick
داشتم پروژه
اولین کاری کردم این بوده که یک سری دیتا تست با
چیز جالبی که دیدم؛ پروژه موقع کار کردن با
ولی
حجم دیتاهای تست رو کم کردم و مشکل حل شد؛ توی چندتا تست مختلف که زدم دیدم مسئله و مشگل از سمت پیکج
بجای اینکه برای
مشکل خیلی ساده حل شد؛ ولی برای این حل ساده خیلی زمان و درک
اهمیت
داشتم پروژه
django شرکت رو میخوندم یک مشکل داریم سر بعضی endpointها و برخی تسکها. اولین کاری کردم این بوده که یک سری دیتا تست با
faker بهش دادم مثه loadtest ولی بدون ابزار و بعد هم profiling گرفتم و ذخیره کردم.چیز جالبی که دیدم؛ پروژه موقع کار کردن با
redis به مشکل میخورد.ولی
redis منابعش بیشتر از حد مورد نیازش بود.حجم دیتاهای تست رو کم کردم و مشکل حل شد؛ توی چندتا تست مختلف که زدم دیدم مسئله و مشگل از سمت پیکج
redis هست توی پایتون و راهکار ساده رو هم خود redis داده (هرچند من برعکس بهش رسیدم)$ pip install "redis[hiredis]"
بجای اینکه برای
parse کردن دیتا از python استفاده کنه وقتی hiredis رو نصب کنید از C استفاده میکنه (بنچمارکاش هم توی گیتهاب hiredis هست ببینید)مشکل خیلی ساده حل شد؛ ولی برای این حل ساده خیلی زمان و درک
profiling لازم بود.اهمیت
profiling👍68🔥3❤2🆒2
#Quick
سوال مصاحبه یکی از دوستان بوده.
توی مصاحبه خیلی از زبانهای برنامهنویسی مختلف یکی از سوالاتی که پرسیده میشه مربوط به نحوه ارسال آرگومان به توابع هست اکثرا هم شما به یکی از دو حالت:
Pass by Value
Pass by Reference
اشاره میکنید؛ اما توی پایتون اینطوری نیست توی پایتون ما
Pass By Object Reference (Pass by Assignment)
رو داریم. اول برگردیم به این تعریف که:
وقتی یک آرگومان رو به تابع میدید؛ رفرنس اون آبجکت رو براش میفرستید و نه یک کپی از اون رو ولی این رفرنس رو بصورت pass by value میفرستید! گیج گننده شد؟ برای همین میگیم پایتون نه Pass By Reference هست نه Pass By Value
یک صندوق رو فرض کنید که توش وسایل شما قرار داره (این حکم object رو داره) حالا فرض کنید برای اینکه جاش رو یادتون نره آدرسش رو روی یک کاغذ نوشتید و توی جیبتون میذارید (این میشه reference شما)
یکی از دوستانتون میخواد صندوق رو ببینه؛ شما فقط کافیه آدرس رو بهش بدید که برای اینکار شما آدرس رو روی یک کاغذ جدید مینویسید و اون رو بهش میدید (این میشه Pass reference by Value)
و این میشه مدل پایتون؛ اگر رفیق شما بره اونجا و از داخل صندوق چیزی برداره یا تغییراتی روی صندوق انجام بده؛ شما هم اون تغییرات رو خواهید دید. اگرم که صندوق رو ببینه و کارش که تموم شد کاغذ آدرس صندوق رو بندازه دور اونوقت صندوق هنوز سرجاش خواهد بود و شما صاحبش هستید.
اگر بره از صندوق یدونه بسازه؛ صندوق شما تغییری نمیکنه فقط یکی دیگه مشابهش وجود داره (که ممکنه چیزایی که داخلش هست فرق کنه)
مثال بالا میشه برای Object هایی که قابل تغییر هستند مثل list
اما اگر Object قابل تغییر نبود چی ؟ مثل Int
اونوقت رفیق شما هر تغییری که بخواد بده اول باید ی دونه از روی چیزی که مال شما هست برای خودش بسازه بعد تغییرش بده.
سوال مصاحبه یکی از دوستان بوده.
توی مصاحبه خیلی از زبانهای برنامهنویسی مختلف یکی از سوالاتی که پرسیده میشه مربوط به نحوه ارسال آرگومان به توابع هست اکثرا هم شما به یکی از دو حالت:
Pass by Value
Pass by Reference
اشاره میکنید؛ اما توی پایتون اینطوری نیست توی پایتون ما
Pass By Object Reference (Pass by Assignment)
رو داریم. اول برگردیم به این تعریف که:
همه چیز در پایتون نهایتا object هست.
وقتی یک آرگومان رو به تابع میدید؛ رفرنس اون آبجکت رو براش میفرستید و نه یک کپی از اون رو ولی این رفرنس رو بصورت pass by value میفرستید! گیج گننده شد؟ برای همین میگیم پایتون نه Pass By Reference هست نه Pass By Value
یک صندوق رو فرض کنید که توش وسایل شما قرار داره (این حکم object رو داره) حالا فرض کنید برای اینکه جاش رو یادتون نره آدرسش رو روی یک کاغذ نوشتید و توی جیبتون میذارید (این میشه reference شما)
یکی از دوستانتون میخواد صندوق رو ببینه؛ شما فقط کافیه آدرس رو بهش بدید که برای اینکار شما آدرس رو روی یک کاغذ جدید مینویسید و اون رو بهش میدید (این میشه Pass reference by Value)
و این میشه مدل پایتون؛ اگر رفیق شما بره اونجا و از داخل صندوق چیزی برداره یا تغییراتی روی صندوق انجام بده؛ شما هم اون تغییرات رو خواهید دید. اگرم که صندوق رو ببینه و کارش که تموم شد کاغذ آدرس صندوق رو بندازه دور اونوقت صندوق هنوز سرجاش خواهد بود و شما صاحبش هستید.
اگر بره از صندوق یدونه بسازه؛ صندوق شما تغییری نمیکنه فقط یکی دیگه مشابهش وجود داره (که ممکنه چیزایی که داخلش هست فرق کنه)
مثال بالا میشه برای Object هایی که قابل تغییر هستند مثل list
اما اگر Object قابل تغییر نبود چی ؟ مثل Int
اونوقت رفیق شما هر تغییری که بخواد بده اول باید ی دونه از روی چیزی که مال شما هست برای خودش بسازه بعد تغییرش بده.
def demonstrate_passing_behavior(my_list, my_int):
print("\n--- INSIDE FUNCTION ---")
print(f"List ID: {id(my_list)}, Int ID: {id(my_int)}")
my_list.append(4)
print(f"List after append: {my_list}, ID(append): {id(my_list)}")
print("Copy of the original list")
my_list = list(my_list)
print(f"List copy and reassignment: {my_list}, ID(copy): {id(my_list)}")
print("Modifying integer...")
my_int = my_int + 10
print(f"Int after modification: {my_int}, ID(modified) : {id(my_int)}")
original_list = [1, 2, 3]
original_int = 5
print(f"Original list: {original_list}, ID: {id(original_list)}")
print(f"Original int: {original_int}, ID: {id(original_int)}")
demonstrate_passing_behavior(original_list, original_int)
print("\n--- AFTER FUNCTION CALL ---")
print(f"Original list: {original_list}, ID: {id(original_list)}")
print(f"Original int: {original_int}, ID: {id(original_int)}")
👍54❤23
چه تغییرات قشنگی داریم روی؛
برای من سه موردش خیلی جذاب هست؛
اولیش بالاخره؛
دومیش؛ پشتیبانی کامل از
تازه اگر پستهای قبلی رو دنبال کرده باشید میدونید
نهایتا یک سری
و یک اشاره هم بکنم به این پست (حدودا همین موقعها ۲ سال پیش):
https://t.iss.one/pyHints/117
هنوزم دیر نشده؛ وقت بذارید براش و درکش کنید!
پ.ن؛
از دوستان اشاره کردند،
شوخی خوبی بود، اگر نگرفتید:
بخاطر این هست که
PostgreSql 18 شماهم دیدید ؟برای من سه موردش خیلی جذاب هست؛
اولیش بالاخره؛
Asynchronous I/O بله منم خوندم فعلا فقط روی Read ولی همینم خوبه ۲-۳ برابر سرعت بیشتر اونم مفتی کیه که بدش بیاد ؟دومیش؛ پشتیبانی کامل از
UUIDv7 یعنی بدون دردسر میتونی حتی روی distributed system هم primary key کاملا یونیک داشته باشی.تازه اگر پستهای قبلی رو دنبال کرده باشید میدونید
UUIDv7 برای ایندکس هم عملکرد بهتری داره (مشکلی که خیلی از پروژهها با UUIDv4 داشتند و حالا تقریبا حل شده)نهایتا یک سری
Optimization های خاص که بصورت اتومات کوئری شما رو قبل از اجرا بهبود میده مثلا اگر OR زیاد باشه و بشه با Any تغییرش میده و ...و یک اشاره هم بکنم به این پست (حدودا همین موقعها ۲ سال پیش):
https://t.iss.one/pyHints/117
هنوزم دیر نشده؛ وقت بذارید براش و درکش کنید!
پ.ن؛
از دوستان اشاره کردند،
created_at هم اگر یادمون بره به چخ نمیریم 😁شوخی خوبی بود، اگر نگرفتید:
بخاطر این هست که
UUIDv7 بر اساس زمان هستTelegram
Python Hints
#Quick
من این اخطار هارو همیشه زودتر به دوستان نزدیکم میگم
گفتم ازین به بعد بعضیهاش رو اینجا هم بگم:
اولین :
asyncio
رو هرچه زودتر یاد بگیرید، پترنها و مفاهیم برنامهنویسی
Async, Parallel, Concurent
قبلتر تأکید زیادی روش نداشتم، اما دیر نیست (توی…
من این اخطار هارو همیشه زودتر به دوستان نزدیکم میگم
گفتم ازین به بعد بعضیهاش رو اینجا هم بگم:
اولین :
asyncio
رو هرچه زودتر یاد بگیرید، پترنها و مفاهیم برنامهنویسی
Async, Parallel, Concurent
قبلتر تأکید زیادی روش نداشتم، اما دیر نیست (توی…
🔥27👍4
#Quick
یکی از دلایل خوب استفاده از
پروژهای رو داشتم که هنوز از
بعد بنده خدا مدیر شرکت میخواست optimization بزنه که مشکلاتش کمتر بشه، همین که ابزارهایی که استفاده میکردند رو آپدیت کردم و البته معماری سیستم رو کمی بهتر (مثلاً برای دسترسی به یک سری سرویسهای داخلی چون نتونسته بودند کانفیگ کنند، درخواستها رو از اینترنت رد میکردند که خودش باعث میشه
بخصوص میزان مصرف منابع!
خلاصه که، اون ایمیج لعنتی رو هر از گاهی یک آپدیت بزنید. از کانتینرها برای همین استفاده میکنیم.
یکی از دلایل خوب استفاده از
containar اینه که آپدیت ورژنها سادهتر باشه! پروژهای رو داشتم که هنوز از
Postgres 12 استفاده میکرد؛ ۱۴ نوامبر ۲۰۲۴ پشتیبانی این نسخه تموم شده (سرچ کردم حفظ نیستم).بعد بنده خدا مدیر شرکت میخواست optimization بزنه که مشکلاتش کمتر بشه، همین که ابزارهایی که استفاده میکردند رو آپدیت کردم و البته معماری سیستم رو کمی بهتر (مثلاً برای دسترسی به یک سری سرویسهای داخلی چون نتونسته بودند کانفیگ کنند، درخواستها رو از اینترنت رد میکردند که خودش باعث میشه
latency زیاد بشه) بیش از ۷۰-۸۰٪ مشکلاتشون حل شد. بخصوص میزان مصرف منابع!
خلاصه که، اون ایمیج لعنتی رو هر از گاهی یک آپدیت بزنید. از کانتینرها برای همین استفاده میکنیم.
👍29❤4🔥2