-
Learning python & Backend Engineering, with Mani! Youtube: https://www.youtube.com/@GitOverHere Github: https://github.com/ManiMozaffar Linkedin: https://www.linkedin.com/in/manimozaffar Admin: @Mani_nikou لینک گروه: https://t.me/PythonFellow
متاسفانه کلی ربات زیاد شده تو کانال و همیشه میان کامنت میذارن زیره همه پستا. کار من شده پاک کردن این کامنتا. (و این از عملکرد بسیار ضعیف تلگرام هم میاد تو این زمینه)
برای همین مجبورم گروه رو دیگه پابلیک نکنم و برای عضو شدن باید درخواست بدید از این به بعد. در خصوص کامنت گذاشتن هم همین موضوع برقرار هست.
@PyBackendHub
یه صحبت جذابی با مانی داشتیم در رابطه با پیشرفت توی شرکت های بزرگ و کوچیک کلی تاپیک مختلف هم وسط اومد. گفتم به اشتراک بزارم شما هم بهره ببرید.
https://youtu.be/FOg9zK4ikGU
@BenDevelop
لینکدین به روایت تصویر😂:
I shat myself today, here are 5 things I learnt from shitting myself
1. Fart isn’t always a fart only 💨
2. Shit is wet 💧
3. Shit doesn’t go away without washing 💩
4. You can’t trust yourself ⁉️
5. Shit stinks 😷
credit: the9to5slaves
@PyBackendHub
یک فیچر جدید به RichAPI اضافه شد.
شما میتونید اکسپشن کاستوم با context بنویسید.
اینطوری دیگه لازم نیست کل متن exception تون رو stringify کنید تو detail که اصلا پترن خوبی نیست. اینطوری دیتا رو کامل تر میتونید به کلاینت بدید و بذارین خوده کلاینت متن ارور رو بسازه.
و خوبیش هم اینجاست که صورت خودکار به سواگرتون اضافه میشه 🚀
لینک گیتهاب
لینک داکیومنتشن
@PyBackendHub
از این لایبری استفاده کردین؟ چطور بود؟
به زودی یک پروژه سمپل هم میذارم با این لایبری که چطور اسکیما 4xx های بهتری بسازین.
@PyBackendHub
خروجی لایبری به همچین چیزی تبدیل میشه که کلاینت و فرانت شما دقیقا میتونه ببینه API شما چه حالت هایی و اکسپشن هایی داره!
@PyBackendHub
ما یک لایبری داریم تو راست به اسم pyo3 که بهت اجازه میده تو راست کد binding بزنی بدون اینکه بخوای یک عالمه بویلرپلیت بنویسی. اما چطور؟ core پایتون expose شده تحت لایبری C به اسم libpython
لایبری مثل Pyo3 که اجازه میده با راست برای پایتون کد binding بزنی اینطوری کار میکنه که میاد اون لایبری libpython رو wrap میکنه ولی به صورت تایپ سیف و مموری سیف. من الان یکم داکشو خوندم فکر کنم بخوام یک ادد ساده بنویسم این شکلی میشه:
use pyo3::prelude::*;
#[pyfunction]
fn add(a: i32, b: i32) -> i32 {
a + b
}
#[pymodule]
fn my_module(_py: Python, m: &PyModule) -> PyResult<()> {
m.add_function(wrap_pyfunction!(add, m)?)?;
Ok(())
}
def add(a: int, b: int) -> int
from my_module import add
add(1,2)
بد ترین نحوه استفاده از AI
برید یک کدی باهاش جنریت کنید، خودتونم نفهمید چی شده و همونو مستقیم تو پروداکشن استفاده کنید ✅
اگه ۴ ساعت برای نوشتن کوئری زمان میذارین یعنیهنوز SQL بلد نیستین و در پروسه یاد گیری هستین که مشکلیم نداره. و قطعا این روشازیک جایی به بعد جوابنمیده، هرچی تسک پیچیده تر شه کوئری که مینویسه ضعیف تره و اصلا ریزالتی که میخواین رو نمیده. خودتونم متوجه نمیشین و ران میکنید و اتفاقی ریزالتی مشابه اون چیزی که میخواین میگیرین و فکر میکنید کار کرده.
@PyBackendHub
یکی از دلایل اصلی که این لایبری رو نوشتم این بود:
تو یک سناریو آپدیت نسبتا پیچیده, چیزی که ORM بعد از آپدیت از حالت آخر row برمیگردوند و چیزی که واقعا از دیتابیس برگشته بود یکی نبود
همین موضوع راجب view هم رخ میده. که دلایلش داکیومنت شده اینجا که چرا این موضوع fail میشه.
تست فیل شدن آپدیت
تست فیل شدن view
دوم خیلی نگران کننده نیست, چون همه از view استفاده نمیکنن. ولی باگ اول تقریبا تو کله سورس کدمون هست
@PyBackendHub
یک توصیه خوب برای جونیور ها و کسایی که تازه شروع کردن
@PyBackendHub
میتونید git-fame رو نصب کنید
و با وارد کردن این دستور, ببینید چند خط با یک پسوند الان رو سورس کد وجود داره که شما کامیت کردین؟ (کدایی که قبلا زده شده و پاک شده و دیگه تو سورس کد نیست رو حساب نمیکنه).
git-fame --incl '(.*)py$'
من شروع به استفاده testcontainer کردم و واقعا خوبه.
اگه دیتابیستون رو میبرید رو pg چند آپتمایزشن میتونید انجام بدید که سرعت دیتابیستون خیلی بالا بره:
fsync=off
full_page_writes=off
shared_buffers=256MB
checkpoint_timeout=30min
checkpoint_completion_target=0.9
autovacuum=off
اینکه تک تک چی هستن رو توصیه میکنم گوگل کنید تو یک پست نمیگنجه بخوام کلش رو توضیح بدم. آف کردن این چیزا reliability دیتابیس رو به شدت پایین میاره ولی درعوض آپریشن های معمولی خیلی سریعتر انجام میشه مخصوصا fsync. و خب یک دیتابیس موقت تستی که قراره بعد تست بیاد پایین و پاک شه اصلا reliability براش معنایی نداره.
@PyBackendHub
وات د فاک
یک پکیج داریم به اسم is odd تو جاوا اسکریپت
به صورت هفتگی ۳۰۰۰ هزار دانلود داره
و سایز آنپک پکیج هم ۶ کیلو بایته 💀
@PyBackendHub
یک گاز بدید ۴۰۰ ستاره بشه 😁
برای کسایی که نمیدونن این ریپو چیه, یکی از کامل ترین گاید لاین های نوشتن رزومست.
در آینده خیلی نزدیک به همین داکیومنت گایدلاین اختصاصی برای نوشتن رزومه بدون تجربه کاری هم میذارم.
داکیومنت
خود ریپو برای ستاره دادن
با تیم Flowcv هم در ارتباطم و اگه همه چیز خوب پیش بره در آینده کمی دورتر, اینترفیسی خواهیم داشت برای بنچمارک و tailor کردن رزومتون به صورت آنلاین (و یا از طریق CLI به صورت لوکال) با استفاده از نرم افزار رایگانشون.
@PyBackendHub
یک نکته خیلی بزرگ راجب رزومه نویسی که تو ریپو هم بهش اشاره کردم
سعی کنید با کمترین تعداد لغات بیشترین مفهوم رو تو رزومتون برسونید. یک مثال میزنم:
Engineered Notification System: Designed a real time notification system to notify customers about their purchases. It improved the satisfaction of customer.
سه بار کلمه نوتیفیکشن رو نوشته. بعد توضیح داده نوتیفیکشن چیه.خب ذاتا نوتیفیکشن هم real time هست تقریبا. یعنی اینطور نیست یکی تو تلگرام به شما پیام بده شما ۵ روز بعد نوتیفیشکنشو بگیرید. بعد اون قسمتی که واقعا مهم بوده رو اصلا باز نکرده (رضایت کاربر). کاربر چطور راضیه وقتی شما بهش نوتفیکیشن میدی؟ اصلا این چه ارتباطی داره؟ یوزرا بدتر ممکنه بدشون بیاد اسپم بشن. در کل خیلی بولت پوینت ساده و خسته کننده ای هست. اصلا هم مشخص نیست این سیستم رو چطور نوشته. چیکار میکنه و ... .
Boosted app engagement and revenue through timely purchase alerts by developing a multilingual purchase notification system using Firebase.
تقریبا همون تعداد کلمه ولی خیلی بیشتر و کاملتر و دقیقتر. بعضا buzz word هم دیده میشه. حواستون باشه رزومتون رو ندید به gpt براتون بنویسه یا اگه اینکارو میکنید خواهشا سه بار بخونید از روش که ۱. تابلو نباشه AI نوشته ۲. جملات مفهوم و معنی داشته باشن و straight to point باشن.
من تو هر ۱۰۰ تا رزومه ای که میبینم ۹۵ تاش خوب نیستن... توصیه میکنم حتما رو رزومه تون خیلی وقت بذارین. رزومه بخش بزرگی از presentation شماست و تو آینده شغلیتون بسیار تاثیر میذاره.
ریپو رزومه نویسی من رو هم اگه تاحالا نخوندین لینکش اینجاست.
@PyBackendHub
یک چیزه خیلی basic و قشنگ تو پایتون که من نمیدونستم, میتونید تو list comprehension از walrus operator استفاده کنید.
فقط یک نکته ای که داره اینه که اسم variable لیک میشه. حواستون باشه به این قضیه. یعنی تو این مثال اگه از list comprehension خالی استفاده میکردم i وجود نداشت.
@PyBackendHub
قصد هیت دادن ندارم ولی واقعا لینکدین جای عجیبیه!
@PyBackendHub
این لایبری عالیه
https://github.com/adamchainz/time-machine
میتونید باهاش تایم رو ماک کنید تو پای تست.
اینطوری انگار برگشتین عقب به تایم.
اگه از این لایبری استفاده نکنید باید now رو یک جا run کنید و همه جا پاسش بدید که یکم اذیت کنندست
@PyBackendHub
این لایبری پتانسیل زیادی داره بنظرم چون در همون راستای FastAPI هست که داکیومنت خودکار انجام شه.
سباستین هم لایک کرده پست لینکدین رو 🤞
تو لینکدین دیشب پست کردم و خیلی share شده. ممنون میشم اگه قصد حمایت دارین، ریپست کنید که بیشتر دیده شه
لینک لینکدین
@PyBackendHub
همیشه با خودم فکر میکردم چی میشد اگه همونطوری که FastAPI ریسپانس 2xx که ریترن میکنیم و تو سواگر میاره, بقیه حالت ها رو هم بیاره. مثلا اگه احراز هویت کاربر درست انجام نشد بهش تو سواگر نشون بده چه ریسپانسی ممکنه بگیره.
برای همین پروژه ای نوشتم که اینکارو انجام میده. شما تو این پروژه فقط یک خط کد میتونید این قابلیت رو به پروژتون اضافه کنید!
لینک گیتهاب
لینک داکیومنتشن
لایبری RichAPI با استفاده از Abstract Syntax Tree کل کد FastAPI شما رو آنالیز میکنه و میبینه زیر روتر های شما چه اکسپشن هایی ممکنه رخ بده و اون رو به سواگر اضافه میکنه!
اگه این پست یا این کتابخونه برات مفید بوده، خیلی ممنون میشم اگه بهش یه ستاره بدی. استار گیت هاب شما به من خیلی انگیزه میده که به توسعه و بهبود فریمورکهای متنباز ادامه بدم. 🙂🙏
@PyBackendHub
خیلی وقت پیش یکی تو گروه پرسید چطور با زبونای دیگه مثل rust برای پایتون لایبری مینویسن.
منم جوابشونو دادم ولی یادم رفت بفرستم تو کانال. برای همین پست بعدیو به این موضوع اختصاص میدم.
اگه اسلاید انجام میدین
برای presentation یک چیزی
https://sli.dev/
این خیلی کمکتون میکنه.
حتی میتونید استرینگ فایل رو یک جا ذخیره نکنید. به جاش تو کدتون داشته باشید. و اعداد تو اسلاید رو dynamic جنریت کنید. اینطوری میتونید همیشه یک ورژن آپدیت اسلاید داشته باشین با ران کردن یک اسکریپت.
بیشتر به درد تیم های ریسرچ میخوره که زیاد اسلاید میزنن.
@PyBackendHub
AioClock
در ماه ۴ هزار دانلود داره 🚀
یک شرکت بزرگ تو برزیل هم داره ازش استفاده میکنه و تو لینکدین ازم تشکر کردن خیلی حس خوبی داشت :))
واقعا دوست دارم فول تایم اوپن سورس کار کنم. و مثلا همین پروژه naked sqlalchemy ام حاصله دو شب کار بود.
ولی متاسفانه هنوز به نقطه ای نرسیدم که بتونم کسب درآمد کنم از پروژه اوپن سورسم
برای همین به حمایتتون نیاز دارم این حمایت میتونه یک استار گیت هاب باشه, که پروژه هام بیشتر دیده شه و به اون نقطه نزدیک تر شم 🫶
فریم ورک/لایبری های مفید اوپن سورسی که تاحالا منتشر کردم:
AioClock - A modern python scheduling framework with dependency injection and modular integration support. Alternative for Rocketry or apscheduler
Naked SQLA - A simple and lightweight object mapper around SQLAlchemy core, simple alternative to SQLAlchemy ORM.
CfCrawler - Cloudflare scraper and cralwer written in Async, In-place library for HTTPX. Crawl website that has cloudflare enabled, easier than ever!
@PyBackendHub
امروز خیلی خوشحالم که بالاخره Naked SQLAlchemy رو معرفی میکنم، یه thin wrapper روی SQLAlchemy Core که کار با دیتابیسها تو پایتون رو سادهتر میکنه. بعد از اینکه با pitfallهای ORM مواجه شدم—مثل اینکه دادههای توی حافظه با وضعیت واقعی دیتابیس یکی نبود به خاطر پیچیدگیهایی مثل identity mapping و dirty tracking—فهمیدم این ویژگیهایی که قرار بوده کار رو راحت کنن، در واقع باعث پیچیدگی و سختتر شدن یادگیری میشن. Naked SQLAlchemy با ترویج استفاده صریح از SQL و map مستقیم نتایج کوئری به dataclassهای پایتون، این لایههای غیرضروری رو کنار میزنه.
علاوه بر بهبود سرعت قابل توجه (تقریباً دو برابر سریعتر از ORM)، یادگیری Naked SQLAlchemy آسونه چون بر پایه دانشی هست که احتمالاً از قبل داری. امکاناتی مثل مپ کردن dataclass، مدیریت session بدون داشتن state، و امکان تعریف SQL View رو لایه ORM. با تمرکز روی ویژگیهای اساسی و دوری از abstractionهای پیچیده، به شما این امکان رو میده که کدهای واضح و explicit و قابل نگهداری بنویسن، بدون دردسرهای معمول ORM.
فلسفه من اینه که کمتر، بیشتره. با کنار گذاشتن لایههای غیرضروری، Naked SQLAlchemy یه راهکار قابل اعتماد، کارآمد و ساده برای دسترسی به دیتابیس تو پایتون ارائه میده. اگه دنبال ابزاری هستی که از pitfallهای معمول ORM دوری کنه و از تخصص SQLی که از قبل داری استفاده کنه، دعوتت میکنم Naked SQLAlchemy رو امتحان کنی.
لینک ریپازیتوری
لینک مستندات
اگه این پست یا این کتابخونه برات مفید بوده، خیلی ممنون میشم اگه بهش یه ستاره بدی یا این پست رو بازنشر کنی. حمایت شما به من انگیزه میده که به توسعه و بهبود فریمورکهای متنباز ادامه بدم. مرسی 🙂🙏
@PyBackendHub
حق 👌
درواقع این همین <توهم بدن شناگر> هست. این باور جا افتاده که شناگر ها بدشون عالیه، چون شناگر هستن. درصورتی که این باور توهمه، و اگه کسی مثل شناگر ها ورزش کنه لزوما نمیتونه بدنش عالی باشه.
درواقع ریشه این مشکل اینجاست:
Correlation is not causation
که نمیتونم خوب ترجمش کنم
@PyBackendHub
سادگی همیشه خبر از پیچیدگی میده!
خیلی وقتها ما از کتابخونه و فریمورکها استفاده میکنیم به خاطر اینکه یک کار رو ساده میشه باهاشون انجام داد، از جنگو استفاده میکنیم چون کار باهاش راحته، داخل جنگو از DRF و simple jwt استفاده میکنیم چون ساخت api و لاگین رو برامون خیلی راحت میکنن. اما اینجا یک چیزی گاهی فراموش میشه.
سادگی همیشه خبر از پیچیدگی میده که شما نمیبینیدش.
یا به عبارت دیگه
کدی که شما الان نمیزنید رو قبلا یکی دیگه زده.
و شاید بگید خوب این خوبه دیگه یارو کد برای ما زده و استفاده میکنیم و لذتشو میبریم. تو خیلی از مواقع این درسته، ولی امان از اون روزی که بخوایید یکچیزی رو تغییر بدید که فریمورک/کتابخونه براتون انجام داده :) اونجاست که این سادگی که ازش لذت میبردید تبدیل کابوس میشه :D
این رو نگفتم که بگم از جنگو استفاده نکنید یا فلان کتابخونه بده و ...
این گفتم که بدونید همیشه هر سادگی خوب نیست، گاهی بهتره تن به کار بدید و اون کد خودتون بزنید تا با نیاز شما هماهنگ باشه نه اینکه یک کتابخونه هزارخطی نصب کنید تا از ۱۰۰ خطش استفاده کنید.
@TorhamDevCH
یک مشکلی همیشه تو تستا وجود داره وقتی دارین از container استفاده میکنید
اینم اونه که container پورت میگیره. تستون به یک سری hostname و پورت دپندنسی داره و اینا خیلی راحت میتونن باهم conflict بخورن.
و خیلیمشکلات دیگه
و خیلیوقتا ماک یا استفاده از SQLite پاسخگو نیاز نیست مثلا ماگریشن دارین یا functionality خاصی از دیتابیس استفاده میکنید یا … و تستاتون flaky میشه
اکثر این مشکلات رو testcontainer حلشون کرده.
https://testcontainers.com/
@PyBackendHub
https://martinheinz.dev/blog/92
یک پست خوب از بنیامین که تو گروه گذاشته بود که چرا نباید از ایمیج Alpine استفاده کنید. سه نکته همیشه موقع تصمیم گیری یادتون باشه:
۱. خیلی کم پیش میاد که یک چیزی خوبه مطلق باشه. همین که قدرت تصمیم گیری تو اپلیکیشن بالغی برای شما فراهم شده یعنی یک ترید آف وجود داشته که maintainer ها گذاشتن خودتون تصمیم بگیرید. اینکه ایمیج سایز کمتر بهتره واقعا جمله چرتیه! درستش اینه که ایمیج چیزه اضافه ای نداشته باشه که نیاز نداشته باشین و مراحل بیلدش درست باشه.
۲. همیشه تحقیق کنید. پیرو مورد یک, خیلی وقتا نیازه که تصمیم گیری کنید. اگه چند تا آپشن دارین, گوگل کنید که چرا اون آپشن بده. و drawback های اون آپشن چیه. درکش کنید چطور کار میکنه. همینطوری از یک توتوریال برندارین کپی پیست کنید.
۳. بهتره داکیومنت که چرا اون تصمیم رو گرفتین. تحقیق کردین, دراوبک هارو متوجه شدید, و طبق یک منطقی یک چیزی رو انتخاب کردین. سعی کنید این پروسه رو داکیومنت کنید, چون ۲ ماه دیگه ممکنه یادتون نباشه چرا اون تصمیم رو گرفتین. و یا هم تیمی هاتون ممکنه بعدا گیج بشن چرا فلان تصمیم گرفته شده. تو این مثال فکر کنید یک نفر بگه خب ما این مشکلی که تو این مقاله گفته شده رو نداریم, پس میریم از ایمیج Alpine استفاده میکنیم. ۱ سال دیگه همون مشکل پیش میاد, چون فرضیاتی که داشتین موقع تصمیم گیری دیگه درست نیست. اشتراک دانش یکی از عناصر مهم پویایی یک تیم و پروداکته.
@PyBackendHub