امروز یکی جذاب ترین اتفاقات عمرم برام رخ داد، که دوست دارم اینجام به اشتراک بذارم.
تیم ایونت دعوت شدم به یک ویلایی خارج از برلین. جای خیلی خوبیه و خلاصه جاتون خالی 😁 اب و هوا ام عوض شد.
یک ایونت داشتیم، که هرکسی باید ۲۰ عکس به صورت اسلاید از یک تیکه با ارزش زندگیش درست میکرد و تو هر اسلاید ۲۰ ثانیه حرف میزد. میتونست خاطره باشه، یک عادت (hobby) باشه، یا هرچیزی. خلاصه کل افراد تیم پرزنت کردن تا اخر سر نوبت رسید به CEO. وقتی پرزنتش شروع شد عکسای ایرانو دیدم! خاطره سفرش از سال ۲۰۱۷ داخل ایرانو گفت و اینکه چقدر مردم باهاش مهربون بودن، مهمون نواز بودن، غذا مهمونش میکردن و چقدر جو صمیمی بود. از تهران و اصفهان و شیراز و چند شهر ایران دیدن کرده بود، و اخرش گفت با وجود اینکه خیلی کشور ها رفته و مسافرت کرده ولی بهترین تجربه زندگیش تو ایران بوده.
همینطور که اسلایدا رو داشت میبرد به اسلاید بعدی، خیلی حس غرور منو گرفت :)) ۷ ساله ایران نیومدم و کاش میتونستم بیام یک سر مسافرت.😁
خلاصه اینکه اگه یک سری اتفاقا نمیفتاد و یک سریا وجود نداشتن ایران واقعا توریستی ترین و قشنگ ترین کشور جهان برای همه مردم میشد 🥲
@PyBackendHub
تیم ایونت دعوت شدم به یک ویلایی خارج از برلین. جای خیلی خوبیه و خلاصه جاتون خالی 😁 اب و هوا ام عوض شد.
یک ایونت داشتیم، که هرکسی باید ۲۰ عکس به صورت اسلاید از یک تیکه با ارزش زندگیش درست میکرد و تو هر اسلاید ۲۰ ثانیه حرف میزد. میتونست خاطره باشه، یک عادت (hobby) باشه، یا هرچیزی. خلاصه کل افراد تیم پرزنت کردن تا اخر سر نوبت رسید به CEO. وقتی پرزنتش شروع شد عکسای ایرانو دیدم! خاطره سفرش از سال ۲۰۱۷ داخل ایرانو گفت و اینکه چقدر مردم باهاش مهربون بودن، مهمون نواز بودن، غذا مهمونش میکردن و چقدر جو صمیمی بود. از تهران و اصفهان و شیراز و چند شهر ایران دیدن کرده بود، و اخرش گفت با وجود اینکه خیلی کشور ها رفته و مسافرت کرده ولی بهترین تجربه زندگیش تو ایران بوده.
همینطور که اسلایدا رو داشت میبرد به اسلاید بعدی، خیلی حس غرور منو گرفت :)) ۷ ساله ایران نیومدم و کاش میتونستم بیام یک سر مسافرت.😁
خلاصه اینکه اگه یک سری اتفاقا نمیفتاد و یک سریا وجود نداشتن ایران واقعا توریستی ترین و قشنگ ترین کشور جهان برای همه مردم میشد 🥲
@PyBackendHub
❤91👍13👎4😭4💔3🤣1👻1🫡1💅1💊1
یکی از بهترین روش های پیاده سازی retry mechanism استفاده از کانتکس منیجر و generator هست. علتش؟ چون شما میتونید یک try except ای داشته باشین که کاملا reusable هست و base اش درواقع اکسپشن هایی هست که catch میکنید.
مثالش, به جای اینکار:
میتونید اینکارو انجام بدید
خوبیش چیه؟ هیچی try except بلاکتون کاملا reusable میشه. خیلیا برای اینکه همچین چیزی داشته باشن ۲ لایه کلس مینویسن که نیازی نیست واقعا. اینطوری خیلی ساده تره و راحت تره. بخش زیادی از سورس کد httpx اینطوریه.
چیزی نیاز داشته باشین تو try except میتونید به کانتکس منیجر بدید. تو این مثال ساده بود من چیزی نذاشتم. ولی این شیوه کاملا داینامیکه و خیلی میتونه خوب باشه برای retry mechanism مخصوصا برای لایبریا چون نیازی نیست دیگه ارث بری انجام شه فلان متود رو اورراید کنی فلان کارو کنی فلان اتفاق میفته. نه flow کاملا دسته خودتونه.
همیشه توصیه کردم سورس کد لایبری هارو بخونید خیلی چیزا برای الهام داره. مثلا تو httpx مثالی که زدم خیلی استفاده شده و باعث شده کد یک دست و خیلی خوبی داشته باشه.
@PyBackendHub
مثالش, به جای اینکار:
def fn():
try:
foo(bar)
except FooBarException:
... # handler 1
except BazException:
... # handler 2
میتونید اینکارو انجام بدید
@contextmanager
def flow_manager():
try:
yield
except FooBarException:
... # handler 1
except BazException:
... # handler 2
with flow_manager():
foo(bar)
خوبیش چیه؟ هیچی try except بلاکتون کاملا reusable میشه. خیلیا برای اینکه همچین چیزی داشته باشن ۲ لایه کلس مینویسن که نیازی نیست واقعا. اینطوری خیلی ساده تره و راحت تره. بخش زیادی از سورس کد httpx اینطوریه.
چیزی نیاز داشته باشین تو try except میتونید به کانتکس منیجر بدید. تو این مثال ساده بود من چیزی نذاشتم. ولی این شیوه کاملا داینامیکه و خیلی میتونه خوب باشه برای retry mechanism مخصوصا برای لایبریا چون نیازی نیست دیگه ارث بری انجام شه فلان متود رو اورراید کنی فلان کارو کنی فلان اتفاق میفته. نه flow کاملا دسته خودتونه.
همیشه توصیه کردم سورس کد لایبری هارو بخونید خیلی چیزا برای الهام داره. مثلا تو httpx مثالی که زدم خیلی استفاده شده و باعث شده کد یک دست و خیلی خوبی داشته باشه.
@PyBackendHub
👍25🆒11
تو جنگو هیچوقت از .save() خالی استفاده نکنید موقعه آپدیت کردن. چون هرچی تو مموری باشه فلاش میکنه به دیتابیس. پس بهتره explicit باشین و بگین چی میخواین فرستاده شه سمت دیتابیس. یک مثال عینی میزنم که متوجه شین یعنی چی این جمله.
ببین فکر کن یک مدل داری با ۳ تا فیلد
MyModel
- id
- first_name
- last_name
که دو تای پایینی nullable هستن. رکورد ایدی اول تو دیتابیس هم first name اش null هست هم last name اش. من ۲ درخواست همزمان میدم. درخواست اول first name رو مانی میکنم. درخواست دوم last name رو مظفر.
اتفاقی که میفته اینه که اول از دیتابیس MyModel رو میخونه جفت درخواستا. برای جفتشون first_name=None و last_name=None هست. بعد هرکدومشون همچین query ای میزنن:
درخواست اول:
درخواست دوم:
دیدی چی شد؟ جفتشون یک NULL هم فرستادن سمت دیتابیس. چرا؟ چون تو مموری یکی از نام و نام خانوادگی null بود و وقتی .save رو میزنی همونو میفرسته به دیتابیس.
بنابراین یا first name نال میمونه یا last name. در صورتی که درستش اینه:
معادل orm اش چی میشه؟
@PyBackendHub
ببین فکر کن یک مدل داری با ۳ تا فیلد
MyModel
- id
- first_name
- last_name
که دو تای پایینی nullable هستن. رکورد ایدی اول تو دیتابیس هم first name اش null هست هم last name اش. من ۲ درخواست همزمان میدم. درخواست اول first name رو مانی میکنم. درخواست دوم last name رو مظفر.
اتفاقی که میفته اینه که اول از دیتابیس MyModel رو میخونه جفت درخواستا. برای جفتشون first_name=None و last_name=None هست. بعد هرکدومشون همچین query ای میزنن:
درخواست اول:
// model.first_name = "Mani"
// model.save()
UPDATE MyModel
SET first_name = 'Mani', last_name = NULL
WHERE MyModel.id = 1
درخواست دوم:
// model.last_name = "Mozaffar"
// model.save()
UPDATE MyModel
SET first_name = NULL, last_name = 'Mozaffar'
WHERE MyModel.id = 1
دیدی چی شد؟ جفتشون یک NULL هم فرستادن سمت دیتابیس. چرا؟ چون تو مموری یکی از نام و نام خانوادگی null بود و وقتی .save رو میزنی همونو میفرسته به دیتابیس.
بنابراین یا first name نال میمونه یا last name. در صورتی که درستش اینه:
// req 2
UPDATE MyModel
SET last_name = 'Mozaffar'
WHERE MyModel.id = 1
// req 1
UPDATE MyModel
SET first_name = 'Mani'
WHERE MyModel.id = 1
معادل orm اش چی میشه؟
# req 1
MyModel.object.filter(id=instance.id).update(last_name="Mani")
# req 2
MyModel.object.filter(id=instance.id).update(last_name="Mozaffar")
# OR...
mymodel.save(update_fields=['first_name'])
@PyBackendHub
👍36❤5🆒2
Python BackendHub
تو جنگو هیچوقت از .save() خالی استفاده نکنید موقعه آپدیت کردن. چون هرچی تو مموری باشه فلاش میکنه به دیتابیس. پس بهتره explicit باشین و بگین چی میخواین فرستاده شه سمت دیتابیس. یک مثال عینی میزنم که متوجه شین یعنی چی این جمله. ببین فکر کن یک مدل داری با ۳ تا…
اما sqlalchemy یک فیچر داره که بهش میگن dirty tracking
Dirty means that field in-memory and database values are different.
یعنی دقیقا استیت دیتابیس و مموری رو track کنه. پس متوجه میشین چه فیلد هایی override شدن.
یعنی تو sqlalchemy میتونید بنویسید
و موقعه flush فقط first name رو فلاش میکنه.
تو جنگو هم یک پکیج هست برای اینکار که میتونید استفاده کنید:
https://github.com/romgar/django-dirtyfields
ولی من به سلیقم نمیخوره و ترجیح میدم بنویسم که چه فیلدی رو میخوام اپدیت کنم.
@PyBackendHub
Dirty means that field in-memory and database values are different.
یعنی دقیقا استیت دیتابیس و مموری رو track کنه. پس متوجه میشین چه فیلد هایی override شدن.
یعنی تو sqlalchemy میتونید بنویسید
mymodel.first_name = "Mani"
و موقعه flush فقط first name رو فلاش میکنه.
تو جنگو هم یک پکیج هست برای اینکار که میتونید استفاده کنید:
https://github.com/romgar/django-dirtyfields
ولی من به سلیقم نمیخوره و ترجیح میدم بنویسم که چه فیلدی رو میخوام اپدیت کنم.
@PyBackendHub
GitHub
GitHub - romgar/django-dirtyfields: Tracking dirty fields on a Django model
Tracking dirty fields on a Django model. Contribute to romgar/django-dirtyfields development by creating an account on GitHub.
👍11
چطور issue رو به صورت حرفه ای تو یک community مطرح کنیم و به جواب برسیم؟
اولین مشکلی که من خیلی میبینم مشکل xy هست.
https://en.wikipedia.org/wiki/XY_problem
مشکل xy چیه؟ به جای اینکه راجب صورت سوال, سوال بپرسن راجب مشکلی میپرسن که در طی پاسخ به اون سوال از اون روش بهش برخوردن. مثلا یک مثال ساده: من چطور تو پایتون میتونم سه کاراکتر اخر از یک string که میاد رو بگیرم؟
حالا سوال و چالش واقعی:من چطور میتونم ببینم فایلی که کلاینت برام فرستاده همون فایلیه که ادعا میکنه؟ جوابش: مقایسه مجیک بایت و تطابقش با file extension که بعد آخرین نقطه میاد.
پس همیشه سوالتون رو بپرسید. میتونید راهکاری هم که داشتین در کنارش معرفی کنید.
دومین مشکل همون مشکل dont ask to ask هست که احتمال پاسخ گرفتنتون رو به شدت کاهش میدین.
https://dontasktoask.com
و آخرین مشکل نحوه و کالچر مطرح کردن مشکلتون هست. لایبری های اوپن سورس اگه ایشو زده باشین حتما با کالچر مطرح issue آشنا هستین, این موارد شامل:
۱. جدایی لاجیک از کدتون. هرچقدر لاجیک لای کدتون بیشتر باشه خواناییش کمتر میشه برای کسی که مسلط نیست به اون لاجیک.
۲. نوشتن یک failing test. خیلی وقتا همه مشکلشونو میگن ولی واقعا نمیفهمم کجاش مشکل بوده 😁
۳. اگه مورد دو رو انجام ندادین, میتونید یک قطعه کد کوتاهی بذارین که مشکلتون رو reproduce کنه! expected result مشخص باشه.
۴. محیطتون رو کامل شرح بدید. سیستم عاملتون, چه نسخه ای از لایبری و پایتون رو دارین استفاده میکنید.
۵. اسکرین شات با سایت هایی مشابه ray.so بنویسید یا از قابلیت جدید تلگرام استفاده کنید برای ارسال کد.
@PyBackendHub
اولین مشکلی که من خیلی میبینم مشکل xy هست.
https://en.wikipedia.org/wiki/XY_problem
مشکل xy چیه؟ به جای اینکه راجب صورت سوال, سوال بپرسن راجب مشکلی میپرسن که در طی پاسخ به اون سوال از اون روش بهش برخوردن. مثلا یک مثال ساده: من چطور تو پایتون میتونم سه کاراکتر اخر از یک string که میاد رو بگیرم؟
حالا سوال و چالش واقعی:من چطور میتونم ببینم فایلی که کلاینت برام فرستاده همون فایلیه که ادعا میکنه؟ جوابش: مقایسه مجیک بایت و تطابقش با file extension که بعد آخرین نقطه میاد.
پس همیشه سوالتون رو بپرسید. میتونید راهکاری هم که داشتین در کنارش معرفی کنید.
دومین مشکل همون مشکل dont ask to ask هست که احتمال پاسخ گرفتنتون رو به شدت کاهش میدین.
https://dontasktoask.com
و آخرین مشکل نحوه و کالچر مطرح کردن مشکلتون هست. لایبری های اوپن سورس اگه ایشو زده باشین حتما با کالچر مطرح issue آشنا هستین, این موارد شامل:
۱. جدایی لاجیک از کدتون. هرچقدر لاجیک لای کدتون بیشتر باشه خواناییش کمتر میشه برای کسی که مسلط نیست به اون لاجیک.
۲. نوشتن یک failing test. خیلی وقتا همه مشکلشونو میگن ولی واقعا نمیفهمم کجاش مشکل بوده 😁
۳. اگه مورد دو رو انجام ندادین, میتونید یک قطعه کد کوتاهی بذارین که مشکلتون رو reproduce کنه! expected result مشخص باشه.
۴. محیطتون رو کامل شرح بدید. سیستم عاملتون, چه نسخه ای از لایبری و پایتون رو دارین استفاده میکنید.
۵. اسکرین شات با سایت هایی مشابه ray.so بنویسید یا از قابلیت جدید تلگرام استفاده کنید برای ارسال کد.
@PyBackendHub
👍21
برای یک پروژه یک سری چیزا ضروریه. تو اولین پست میرم سمت IDE یعنی vscode. یک پروژه به چیا نیاز داره تو vscode ؟
۱. مهم ترینش که قطعا دارین pylance هست. pylance یک language server هست برای پایتون که static type check هم انجام میده (برخلاف pycharm که نداره). استتیک تایپ چکش بر اساسه pyright هست, درواقع superset ای هست از pyright یعنی کمی فرق میکنه ولی احتمالا متوجه نخواهید شد. نکته خیلی مهم اینه که حتما static type check پایتونتون رو فعال کنید و رو حالت basic بذارین حداقل. به طور دیفالت خاموشه. چطوری؟وارد user setting داخل vscode تون بشین و سرچ کنید type checking mode و اونو بذارین رو حالت basic.
۲. لینتر ruff. داشتن یک لینتر خیلی مهمه. ruff هم خیلی سریعه و هم خیلی سبک و هم خیلی عالی. با rust نوشته شده و هم کاره black و isort رو انجام میده. یعنی ایمپورت هایی که استفاده نکردین هم پاک میکنه.توصیه میشه حتی تنظیمات راف رو داخل pyproject بذارین که بین همه یوزرا یکسان باشه. تو پست بعدی که راجب استراکچر خوده پروژه هست بیشتر صحبت میکنم.
۳. اکستنشن دیباگر تست. خیلی وقتا باگایی که داریم رو با یک تست reproduce میکنیم (یا بهتره بگم همیشه باید اینکارو کنیم). اون موقع ران کردن یک تست خاص با دیباگر خیلی میتونه مفید باشه. میتونید اینکارو بدون extension هم انجام بدید ولی مدام باید یک کانفیگی رو عوض کنید که یکم اذیت کننده میتونه باشه. این extension خودش تستا رو پیدا میکنه و میتونید ران کنید با دیباگر یا به صورت معمولی:
https://marketplace.visualstudio.com/items?itemName=LittleFoxTeam.vscode-python-test-adapter
۴. داشتن یک .vsocde/settings.json که کمک میکنه یک ستینگ واحد داشته باشین بین همه کسایی که تو پروداکت دارن با vscode کار میکنن. خیلیا اینو میذارن تو gitignore ولی من دلیلی نمیبینم. میتونه خیلی مفید باشه.
۵. استفاده از built in extension خوده git وی اس کد. اینطوری سریع تر میتونید کامیت بزنید و بهتر میتونید متوجه شین چیو دارین کامیت میکنید.
۶. استفاده از vscode/launhc.json که اپ هاتون رو با دیباگر بتونید ران کنید. مثلا جنگو یا فست دارین بتونید با لانچر تو حالت دیباگ رانش کنید. داکیومنت کاملش این زیر هست.
https://code.visualstudio.com/docs/editor/debugging
حالا تو پست های بعدی میپردازم به بخش پایتونی و غیر از IDE
@PyBackendHub
۱. مهم ترینش که قطعا دارین pylance هست. pylance یک language server هست برای پایتون که static type check هم انجام میده (برخلاف pycharm که نداره). استتیک تایپ چکش بر اساسه pyright هست, درواقع superset ای هست از pyright یعنی کمی فرق میکنه ولی احتمالا متوجه نخواهید شد. نکته خیلی مهم اینه که حتما static type check پایتونتون رو فعال کنید و رو حالت basic بذارین حداقل. به طور دیفالت خاموشه. چطوری؟وارد user setting داخل vscode تون بشین و سرچ کنید type checking mode و اونو بذارین رو حالت basic.
۲. لینتر ruff. داشتن یک لینتر خیلی مهمه. ruff هم خیلی سریعه و هم خیلی سبک و هم خیلی عالی. با rust نوشته شده و هم کاره black و isort رو انجام میده. یعنی ایمپورت هایی که استفاده نکردین هم پاک میکنه.توصیه میشه حتی تنظیمات راف رو داخل pyproject بذارین که بین همه یوزرا یکسان باشه. تو پست بعدی که راجب استراکچر خوده پروژه هست بیشتر صحبت میکنم.
۳. اکستنشن دیباگر تست. خیلی وقتا باگایی که داریم رو با یک تست reproduce میکنیم (یا بهتره بگم همیشه باید اینکارو کنیم). اون موقع ران کردن یک تست خاص با دیباگر خیلی میتونه مفید باشه. میتونید اینکارو بدون extension هم انجام بدید ولی مدام باید یک کانفیگی رو عوض کنید که یکم اذیت کننده میتونه باشه. این extension خودش تستا رو پیدا میکنه و میتونید ران کنید با دیباگر یا به صورت معمولی:
https://marketplace.visualstudio.com/items?itemName=LittleFoxTeam.vscode-python-test-adapter
۴. داشتن یک .vsocde/settings.json که کمک میکنه یک ستینگ واحد داشته باشین بین همه کسایی که تو پروداکت دارن با vscode کار میکنن. خیلیا اینو میذارن تو gitignore ولی من دلیلی نمیبینم. میتونه خیلی مفید باشه.
۵. استفاده از built in extension خوده git وی اس کد. اینطوری سریع تر میتونید کامیت بزنید و بهتر میتونید متوجه شین چیو دارین کامیت میکنید.
۶. استفاده از vscode/launhc.json که اپ هاتون رو با دیباگر بتونید ران کنید. مثلا جنگو یا فست دارین بتونید با لانچر تو حالت دیباگ رانش کنید. داکیومنت کاملش این زیر هست.
https://code.visualstudio.com/docs/editor/debugging
حالا تو پست های بعدی میپردازم به بخش پایتونی و غیر از IDE
@PyBackendHub
Visualstudio
Python Test Explorer for Visual Studio Code - Visual Studio Marketplace
Extension for Visual Studio Code - Run your Python tests in the Sidebar of Visual Studio Code
👍35👎1
اقا abstract نکنید الکی 😁 خیلی وقتا میبینم بعضیا چیزای عجیبی رو abstract میکنن. نمونش بروکره. یا دیتابیس. که اگه خواستی بتونی با تغییر ۲۰ خط کد بروکرت رو تغییر بدی. یا دیتابیستو تغییر بدی.
سوالی که من برام پیش میاد همیشه اینه:
اگه شما با ۲۰ خط کد داری بروکر یا دیتابیستو تغییر میدی, ایا واقعا داری از اون بروکر یا دیتابیس به نحو احسن استفاده میکنی؟ چون قطعا فیچر هایی داشته که مخصوص خودش بوده .
البته اضافه کنم abstraction میتونه خیلی پرفکتم انجام شه. مثل orm django یا sqlalchemy که بستگی به دیتابیس رفتارش میتونه متفاوت باشه. ولی اونا لایبرین. ایا زحمت همچین abstraction پرفکتی بیشتر نیست از اینکه بشینی ۳ تا خط کدو عوض کنی؟
@PyBackendHub
سوالی که من برام پیش میاد همیشه اینه:
اگه شما با ۲۰ خط کد داری بروکر یا دیتابیستو تغییر میدی, ایا واقعا داری از اون بروکر یا دیتابیس به نحو احسن استفاده میکنی؟ چون قطعا فیچر هایی داشته که مخصوص خودش بوده .
البته اضافه کنم abstraction میتونه خیلی پرفکتم انجام شه. مثل orm django یا sqlalchemy که بستگی به دیتابیس رفتارش میتونه متفاوت باشه. ولی اونا لایبرین. ایا زحمت همچین abstraction پرفکتی بیشتر نیست از اینکه بشینی ۳ تا خط کدو عوض کنی؟
@PyBackendHub
👍33
Python BackendHub
برای یک پروژه یک سری چیزا ضروریه. تو اولین پست میرم سمت IDE یعنی vscode. یک پروژه به چیا نیاز داره تو vscode ؟ ۱. مهم ترینش که قطعا دارین pylance هست. pylance یک language server هست برای پایتون که static type check هم انجام میده (برخلاف pycharm که نداره).…
در ادامه سری پست های قبلی, اینبار میپردازیم به استراکچر و نیازه اولیه یک پروژه فارغ از نوع پروژه.
۱. اولین چیزی که مهمه داشتن یک command runner هست که کامندا همه یک جا جمع باشن. برای اینکار میتونید از makefile یا justfile استفاده کنید. همه دپندسی هارو ship نکنید و تا حد ممکن کمترین دپندسی رو ship کنید.
۲. لطفا دیگه از requirements.txt استفاده نکنید :)). بهترین حالت pyproject هست چون خیلی flexible تره و requirements.txt دیگه deprecate شده. حتی بنظره من بهتره دپندسی ها لاک شن چون دیگه خیلی قابل پیش بینی میشه سرویس. برای اینکار میتونید از poetry یا حتی گزینه بهتر از uv استفاده کنید.
۳. داشتن static analyzer خیلی کمکتون میکنه. اگه خیلی restrict باشه جلوی سرعت توسعه رو میگیره و کلا استفاده از پایتونو تا حدی زیر سوال میبره (مگه برای لایبرای اوپن سورس یا پروژه هایی که خیلی scale کردن). من باشم از pyright استفاده میکنم چون مشابه vscode هست.
۴. داشتن کامیت هوک خیلی میتونه کمک کنه. دوستان پری کامیت هوک فیچری گیته! پری کامیت که یک cli tool پایتونی هست فقط برای پایتون نیست. درواقع یک پری کامیت هوکه. شما میتونید گیت هوک خودتونو بنویسید و خیلی راحته اینکار. تو این ویدیو بهتون آموزش میده. من شخصا بنظرم پری کامیت (لایبری پایتونی) خیلی لیمیت داره. پس توصیه میکنم خودتون کامیت هوکتونو بنویسید خیلی سادست بخدا :). میتونید از pre push هوک استفاده کنید که قبل از پوش کردن ران شه و dx رو ضعیف تر نکنه.
۵. هر سرویس کانتینری که میزنید باید entry point داشته باشه. لطفا هارد کد نکنید تو خوده فایل داکرتون. باعث میشه آپریشن و توسعه بیشتر دیکاپل شه.
۶. اسکریپت های یک پروژه رو تو فولدر جدا و تست هاشو هم تو یک فولدر جدا نگه دارین از خوده سرویس. نیازی نیست تست یا اسکریپت رو ship کنید به پروداکشن. فقط فایل سرویس.
۷. فایل .envrc خیلی میتونه تو توسعه کمکتون کنه. مقاله زیر رو بخونید که متوجه شین کاربردش چیه.
۸. موقعه توسعه لاگ هارو ذخیره کنید. که اگه باگی پیدا کردین و نتونستید reproduce اش کنید و لاگ کنسولتونو از دست دادین همچنان لاگ داشته باشین.
نهایتا سرویستون این شکلی میشه:
@PyBackendHub
۱. اولین چیزی که مهمه داشتن یک command runner هست که کامندا همه یک جا جمع باشن. برای اینکار میتونید از makefile یا justfile استفاده کنید. همه دپندسی هارو ship نکنید و تا حد ممکن کمترین دپندسی رو ship کنید.
۲. لطفا دیگه از requirements.txt استفاده نکنید :)). بهترین حالت pyproject هست چون خیلی flexible تره و requirements.txt دیگه deprecate شده. حتی بنظره من بهتره دپندسی ها لاک شن چون دیگه خیلی قابل پیش بینی میشه سرویس. برای اینکار میتونید از poetry یا حتی گزینه بهتر از uv استفاده کنید.
۳. داشتن static analyzer خیلی کمکتون میکنه. اگه خیلی restrict باشه جلوی سرعت توسعه رو میگیره و کلا استفاده از پایتونو تا حدی زیر سوال میبره (مگه برای لایبرای اوپن سورس یا پروژه هایی که خیلی scale کردن). من باشم از pyright استفاده میکنم چون مشابه vscode هست.
۴. داشتن کامیت هوک خیلی میتونه کمک کنه. دوستان پری کامیت هوک فیچری گیته! پری کامیت که یک cli tool پایتونی هست فقط برای پایتون نیست. درواقع یک پری کامیت هوکه. شما میتونید گیت هوک خودتونو بنویسید و خیلی راحته اینکار. تو این ویدیو بهتون آموزش میده. من شخصا بنظرم پری کامیت (لایبری پایتونی) خیلی لیمیت داره. پس توصیه میکنم خودتون کامیت هوکتونو بنویسید خیلی سادست بخدا :). میتونید از pre push هوک استفاده کنید که قبل از پوش کردن ران شه و dx رو ضعیف تر نکنه.
۵. هر سرویس کانتینری که میزنید باید entry point داشته باشه. لطفا هارد کد نکنید تو خوده فایل داکرتون. باعث میشه آپریشن و توسعه بیشتر دیکاپل شه.
۶. اسکریپت های یک پروژه رو تو فولدر جدا و تست هاشو هم تو یک فولدر جدا نگه دارین از خوده سرویس. نیازی نیست تست یا اسکریپت رو ship کنید به پروداکشن. فقط فایل سرویس.
۷. فایل .envrc خیلی میتونه تو توسعه کمکتون کنه. مقاله زیر رو بخونید که متوجه شین کاربردش چیه.
۸. موقعه توسعه لاگ هارو ذخیره کنید. که اگه باگی پیدا کردین و نتونستید reproduce اش کنید و لاگ کنسولتونو از دست دادین همچنان لاگ داشته باشین.
نهایتا سرویستون این شکلی میشه:
service/
logs/
service/
tests/
noscripts/
container_entrypoint.sh
makefile (or justfile)
.envrc
**.lock (اگه باشه بنظرم عالیه)
pyproject.toml
@PyBackendHub
YouTube
Complete guide to GitHooks - Creating your own pre-commit hooks
GitHooks are a great way of automating tasks and checking information while using git. These hooks are both powerful surprisingly easy to create yourself. In this video tutorial we run through how git hooks work and how to create both local and global git…
👍64✍2
Forwarded from Python BackendHub
یک نکته اگه دوست داشتین رعایت کنید خیلی به سطح پستای کانال کمک میکنه 🙏
اگه از یک تایپ پست خوشتون میاد reaction مثبت بدین. اگه نمیاد ری اکشن منفی بدین. من بر اساس ری اکشن و تعداد forward و کامنت و سوالایی که ازم تو پیوی میپرسن معمولا تصمیم میگیرم چه پستی مناسب تره.
@ManiFoldsPython
اگه از یک تایپ پست خوشتون میاد reaction مثبت بدین. اگه نمیاد ری اکشن منفی بدین. من بر اساس ری اکشن و تعداد forward و کامنت و سوالایی که ازم تو پیوی میپرسن معمولا تصمیم میگیرم چه پستی مناسب تره.
@ManiFoldsPython
👍51💩6🖕1
من واقعا اینو دیدم.. خیلی هم دیدم که نیروی های ایرانی به مراتب از نظر هارد اسکیل قوی ترن و راحت میتونن استخدام شن تو خارج کشور. ۳ مورد رو اگه تقویت کنید واقعا شانس استخدام شدنتون بالا میره:
۱. اولیش زبانه. زبان انگلیسی باید خوب حرف بزنید. من دیدم بچه ها دنبال مهاجرت کارین ولی سطح زبانشون در حد b1 هست. خب خیلی سخت پیش میاد شرکتی شما رو قبول کنه چون تا بخواین به c1 برسید حداقل چنین ماه یا حتی شاید سال زمان میبره . بنابراین هزینه training شما خیلی زیاد میشه برای شرکت و خیلی راحت بیخیال میشه. پس سعی کنید حداقل تو مصاحبه خیلی روان صحبت کنید.
۲. دومیش رزومست. رزومه غیر استاندارد مینویسن. قبول نمیشه توسط ATS ها. من خیلی افراد سطح بالایی دیدم که رزومشون واقعا ضعیف بود و این باعث کمتر شدن فرصت هاشون میشه. تو هر مقطع و سطحی که هستین باید رزومه رو خوب بنویسید. چه میخواد جونیور باشه چه principal engineer.
ریپو من راجب رزومه نویسی:
https://github.com/ManiMozaffar/awesome-resumes
۳. آخریش نشون دادن مهارته. من دیدم بعضی بچه ها واقعا مهارت خوبی دارن ولی چون تو رزومه و گیت هابشون خوب نتونستن نشون بدن به چشم نمیان. موقع بولت پوینت نویسی برین PR هایی که زدین به ریپو شرکت رو ببینید و یک دور دوره کنید. همین موضوع خودش باعث میشه ۳ سطح بولت پوینت هاتون بهتر شه چون یادتون میره چه کدایی زدین.
پلی لیست من راجب پیدا کردن شغل اول و رشد مسیر شغلی:
https://www.youtube.com/playlist?list=PLEQ3RnweNGA6ccgQkiov9Q6jnQAw8H-ob
من دیدم یک سری دوستان الان پول میگیرن رزومه بررسی میکنند یا از این قبیل کارا میکنن. خب اون دوستان نوش جونشون کار میکنن ولی شما که این همه ریسورس (حداقل تو ایران) ریخته چرا استفاده نمیکنی؟ و بعد میری پول میدی بابت همین چیزایی که رایگان با کیفیت عالی در دسترست هست.. مثل tech immigrant که واقعا کمکتون میکنه تو مسیر مهاجرت کاری, از صد تا موسسه مهاجرت بیشتر.
@PyBackendHub
۱. اولیش زبانه. زبان انگلیسی باید خوب حرف بزنید. من دیدم بچه ها دنبال مهاجرت کارین ولی سطح زبانشون در حد b1 هست. خب خیلی سخت پیش میاد شرکتی شما رو قبول کنه چون تا بخواین به c1 برسید حداقل چنین ماه یا حتی شاید سال زمان میبره . بنابراین هزینه training شما خیلی زیاد میشه برای شرکت و خیلی راحت بیخیال میشه. پس سعی کنید حداقل تو مصاحبه خیلی روان صحبت کنید.
۲. دومیش رزومست. رزومه غیر استاندارد مینویسن. قبول نمیشه توسط ATS ها. من خیلی افراد سطح بالایی دیدم که رزومشون واقعا ضعیف بود و این باعث کمتر شدن فرصت هاشون میشه. تو هر مقطع و سطحی که هستین باید رزومه رو خوب بنویسید. چه میخواد جونیور باشه چه principal engineer.
ریپو من راجب رزومه نویسی:
https://github.com/ManiMozaffar/awesome-resumes
۳. آخریش نشون دادن مهارته. من دیدم بعضی بچه ها واقعا مهارت خوبی دارن ولی چون تو رزومه و گیت هابشون خوب نتونستن نشون بدن به چشم نمیان. موقع بولت پوینت نویسی برین PR هایی که زدین به ریپو شرکت رو ببینید و یک دور دوره کنید. همین موضوع خودش باعث میشه ۳ سطح بولت پوینت هاتون بهتر شه چون یادتون میره چه کدایی زدین.
پلی لیست من راجب پیدا کردن شغل اول و رشد مسیر شغلی:
https://www.youtube.com/playlist?list=PLEQ3RnweNGA6ccgQkiov9Q6jnQAw8H-ob
من دیدم یک سری دوستان الان پول میگیرن رزومه بررسی میکنند یا از این قبیل کارا میکنن. خب اون دوستان نوش جونشون کار میکنن ولی شما که این همه ریسورس (حداقل تو ایران) ریخته چرا استفاده نمیکنی؟ و بعد میری پول میدی بابت همین چیزایی که رایگان با کیفیت عالی در دسترست هست.. مثل tech immigrant که واقعا کمکتون میکنه تو مسیر مهاجرت کاری, از صد تا موسسه مهاجرت بیشتر.
@PyBackendHub
GitHub
GitHub - ManiMozaffar/awesome-resumes: Create resumes and CV with awesome-resumes. Practical tips, guidelines, guide, examples…
Create resumes and CV with awesome-resumes. Practical tips, guidelines, guide, examples and documentation for all IT fields - ManiMozaffar/awesome-resumes
👍31❤8
دو مقاله خیلی خوب برای بیشتر آشنا شدن با Kafka
https://medium.com/swlh/apache-kafka-what-is-and-how-it-works-e176ab31fcd5
https://medium.com/@jaykreps/exactly-once-support-in-apache-kafka-55e1fdd0a35f
@PyBackendHub
https://medium.com/swlh/apache-kafka-what-is-and-how-it-works-e176ab31fcd5
https://medium.com/@jaykreps/exactly-once-support-in-apache-kafka-55e1fdd0a35f
@PyBackendHub
Medium
Apache Kafka: What Is and How It Works
An introduction to the world of streams
👍9
این قسمت خیلی جالبه :
For example several people in comments cited the “FLP” paper which is noscriptd “The Impossibility of Consensus with One Faulty Process”. That doesn’t sounds good! Then again you might just as easily run into a paper claiming in its first sentence that failure detectors “can be used to solve Consensus in asynchronous systems with crash failures.” What to make of this? Well this is where the detail really matter in theoretical distributed systems claims: you have to be concrete about the setting and fault-model. The FLP result is proving that consensus isn’t possible in a very limited setting. Once you allow even simple things like local timers or randomization it becomes possible. You’ll notice consensus algorithms depend on these things to implement a kind of noisy but eventually correct failure detection such as “a process that doesn’t heartbeat for some time is dead”. These are the settings people refer to when they say such-and-such an algorithm “solves consensus”.
نشون میده چقدر تو دنیای ما مهمه که دقیق حرف بزنیم. خیلی مهمه دقیق حرف زدن.
یکی از دوستان میگفت که تو تعریف کلمات نمونید, مهم مدل استفاده هست. که بنظرم خیلی اشتباهه. دقیقا تعریف هاست که مدل استفاده رو دقیق داره توضیح میده. این موضوع تو همه سطوح هست, حتی تو اسم یک تابع. اگه اسم تابع دقیقا نگه اون تابع داره چیکار میکنه, میتونه خیلی گیج کننده باشه و سورس کد رو اسپاگتی کنه بعد از یک تایمی.
@PyBackendHub
For example several people in comments cited the “FLP” paper which is noscriptd “The Impossibility of Consensus with One Faulty Process”. That doesn’t sounds good! Then again you might just as easily run into a paper claiming in its first sentence that failure detectors “can be used to solve Consensus in asynchronous systems with crash failures.” What to make of this? Well this is where the detail really matter in theoretical distributed systems claims: you have to be concrete about the setting and fault-model. The FLP result is proving that consensus isn’t possible in a very limited setting. Once you allow even simple things like local timers or randomization it becomes possible. You’ll notice consensus algorithms depend on these things to implement a kind of noisy but eventually correct failure detection such as “a process that doesn’t heartbeat for some time is dead”. These are the settings people refer to when they say such-and-such an algorithm “solves consensus”.
نشون میده چقدر تو دنیای ما مهمه که دقیق حرف بزنیم. خیلی مهمه دقیق حرف زدن.
یکی از دوستان میگفت که تو تعریف کلمات نمونید, مهم مدل استفاده هست. که بنظرم خیلی اشتباهه. دقیقا تعریف هاست که مدل استفاده رو دقیق داره توضیح میده. این موضوع تو همه سطوح هست, حتی تو اسم یک تابع. اگه اسم تابع دقیقا نگه اون تابع داره چیکار میکنه, میتونه خیلی گیج کننده باشه و سورس کد رو اسپاگتی کنه بعد از یک تایمی.
@PyBackendHub
👍10👏2🤔1👌1🍌1
یک پکیج نوشتم, که۹ ماه پیش شبیهشو نوشته بودم.
این پکیج کاملا type stated هست. کاری که این پکیج میکنه اینه که به شما یک interface خیلی عالی میده برای هندل کردن exchange پول های مختلف رو میده. مثلا یورو به دلار. یا بالعکس. همینطور همینکارو برای crypto ها هم انجام میده. بلاکچین هم inspect میکنه. و همه اینکار هارو با داشتن یک تایپ عالی و یک تجربه توسعه عالی بهتون میده و جلوی illegal state هارو میگیره (مثل مقایسه کردن مقدار دلار و یورو بدون exchange کردنشون)
در حال حاضر فقط دلار و یورو و USDT Trc20 ساپورت میشن. اگه دوست داشتین میتونید کامیت بزنید. سورس کدش براتون احتمالا جالب باشه. برای حمایت خیلی ممنون میشم استار و یا contribute بدید 🙏
لینک گیتهاب لایبری:
https://github.com/ManiMozaffar/fastexchange
@PyBackEndHub
این پکیج کاملا type stated هست. کاری که این پکیج میکنه اینه که به شما یک interface خیلی عالی میده برای هندل کردن exchange پول های مختلف رو میده. مثلا یورو به دلار. یا بالعکس. همینطور همینکارو برای crypto ها هم انجام میده. بلاکچین هم inspect میکنه. و همه اینکار هارو با داشتن یک تایپ عالی و یک تجربه توسعه عالی بهتون میده و جلوی illegal state هارو میگیره (مثل مقایسه کردن مقدار دلار و یورو بدون exchange کردنشون)
در حال حاضر فقط دلار و یورو و USDT Trc20 ساپورت میشن. اگه دوست داشتین میتونید کامیت بزنید. سورس کدش براتون احتمالا جالب باشه. برای حمایت خیلی ممنون میشم استار و یا contribute بدید 🙏
لینک گیتهاب لایبری:
https://github.com/ManiMozaffar/fastexchange
@PyBackEndHub
GitHub
GitHub - ManiMozaffar/fastexchange: A type stated library, to handle crypto and currency exchange Right now very few currencies…
A type stated library, to handle crypto and currency exchange Right now very few currencies and cryptos are supported, but you can help with that with contribution. - ManiMozaffar/fastexchange
👍16👏4
تو پست قبلی interface لایبری خیلی واضح نشد, برای همین عکس میدم ازش. اگه ایده ای داشتین حتما بهم بگید. تومن و بقیه کریپتو ها ساپورت شن میتونه game changer خوبی باشه.
(پ.ن: تایپ ها یک جورین که میتونید راحت تیبلشون کنید 😅.)
برای حمایت خیلی ممنون میشم استار و یا contribute بدید 🙏
لینک گیتهاب لایبری:
https://github.com/ManiMozaffar/fastexchange
@PyBackEndHub
(پ.ن: تایپ ها یک جورین که میتونید راحت تیبلشون کنید 😅.)
برای حمایت خیلی ممنون میشم استار و یا contribute بدید 🙏
لینک گیتهاب لایبری:
https://github.com/ManiMozaffar/fastexchange
@PyBackEndHub
👍11
یک مقاله خیلی خوب بازم راجب type state که ben (بنیامین فکر کنم؟ 😁) تو گروه به اشتراک گذاشت:
Writing python like rust
همه چیزه این مقاله درست نیست قطعا ولی ایده کلیش رو اگه بگیرین خیلی بهتر کد میزنید.
اگه نمیدونید type state چیه توصیه میکنم حتما ویدیو زیر رو ببینید:
آموزش پترن type state به زبان فارسی
و یا مقاله های زیر هم خیلی بهتون میتونه کمک کنه:
Parse, don't validate in Python
Rust, for type state!
سمپل کدش هم که اخیرا share کردم. یک لایبری که type state هست برای بحث کریپتو و پول. اینترفیس خیلی آسون تری میده و تجربه توسعه عالی بهتون میده. همین که استتیک تایپ چکر رو ران کنید و ایرادی بهتون نگیره احتمال خیلی قوی کدتون مشکلی نداره.
FastExchange
تایپ استیت کد زدن میتونه خیلی نحوه و سبک کد زنیتون رو تغییر بده.
@PyBackEndHub
Writing python like rust
همه چیزه این مقاله درست نیست قطعا ولی ایده کلیش رو اگه بگیرین خیلی بهتر کد میزنید.
اگه نمیدونید type state چیه توصیه میکنم حتما ویدیو زیر رو ببینید:
آموزش پترن type state به زبان فارسی
و یا مقاله های زیر هم خیلی بهتون میتونه کمک کنه:
Parse, don't validate in Python
Rust, for type state!
سمپل کدش هم که اخیرا share کردم. یک لایبری که type state هست برای بحث کریپتو و پول. اینترفیس خیلی آسون تری میده و تجربه توسعه عالی بهتون میده. همین که استتیک تایپ چکر رو ران کنید و ایرادی بهتون نگیره احتمال خیلی قوی کدتون مشکلی نداره.
FastExchange
تایپ استیت کد زدن میتونه خیلی نحوه و سبک کد زنیتون رو تغییر بده.
@PyBackEndHub
Kobzol’s blog
Writing Python like it’s Rust
You can check out a YouTube recording of a talk based on this blog post.
👍9❤3
Writing python like rust
مقاله ای که پست قبل شیر کردم بهترین مقاله ای بود که تو پایتون خوندم سمت typing
چیزی که خودم خیلی رعایت میکنم استفاده مناسب از NewType هست.
دقت کنید نیازی نیست حتما از pydantic استفاده کنید و overhead داشته باشین. فقط وقتی باید از pydantic استفاده کنید که دیتاتون ازبیرون اومده باشه. مثل بروکر یا response ای از یک api.
تو مقاله اصلا از pydantic استفاده نکرده (از serde کرده که لایبری مشابه serde راست هست. ولی فقط برای لایه بیرون لازمه. نه داخل خوده کد)
تو لایبری FastExchange علتی که استفاده کردم از Discriminated union بوده. که تو این مقاله خودش با پایتون دستی نوشته همین Discriminated union. برای نوشتن Discriminated union میتونید از pydantic استفاده کنید.
@PyBackendHub
مقاله ای که پست قبل شیر کردم بهترین مقاله ای بود که تو پایتون خوندم سمت typing
چیزی که خودم خیلی رعایت میکنم استفاده مناسب از NewType هست.
دقت کنید نیازی نیست حتما از pydantic استفاده کنید و overhead داشته باشین. فقط وقتی باید از pydantic استفاده کنید که دیتاتون ازبیرون اومده باشه. مثل بروکر یا response ای از یک api.
تو مقاله اصلا از pydantic استفاده نکرده (از serde کرده که لایبری مشابه serde راست هست. ولی فقط برای لایه بیرون لازمه. نه داخل خوده کد)
تو لایبری FastExchange علتی که استفاده کردم از Discriminated union بوده. که تو این مقاله خودش با پایتون دستی نوشته همین Discriminated union. برای نوشتن Discriminated union میتونید از pydantic استفاده کنید.
@PyBackendHub
👍15❤1
یک چیز جالب دیدم؛
https://leetcode.com/zcgzcgzcg/
رنک ۹۴ دنیا هستن، تو لیت کد.
اما ایشون اصلا حرفه اش برنامه نویسی نیست. دارنده ۳ مدال طلا المپیک و یکی از بهترین بازیکن های پینگ پونگ تو دوران خودش بوده 😂
@PyBackendHub
https://leetcode.com/zcgzcgzcg/
رنک ۹۴ دنیا هستن، تو لیت کد.
اما ایشون اصلا حرفه اش برنامه نویسی نیست. دارنده ۳ مدال طلا المپیک و یکی از بهترین بازیکن های پینگ پونگ تو دوران خودش بوده 😂
@PyBackendHub
LeetCode
zcgzcgzcg - LeetCode Profile
View zcgzcgzcg's profile on LeetCode, the world's largest programming community.
🔥20🤯7❤2
یک سافت اسکیل خیلی مهم که نداشتنش میتونه محیط کاری رو تبدیل به محیط سمی کنه:
Disagree and commit
کالچری هست که تو آمازون و خیلی شرکت های خوب دنیا هست. رفرنس
At Amazon, you may know, we have a set of leadership principles that we take very seriously. I’m a big fan of the one that says “Have Backbone: Disagree and Commit.” It means that if you disagree with something, it’s your responsibility to argue. It’s meant to be applied even if it’s your boss’s idea. Disagreeing doesn’t mean acting like a jerk. It means making a cogent case, using data where possible to support your arguments. The second part of the principle, “Commit,” is important as well. At some point, you may have to give in, or compromise. If you do, then you’re committed to the decision. You can’t be passive-aggressive or later say “I told you so.” You own the final decision, even if it’s not what you originally wanted.
"دیدی بهت گفتم؟". بدترین جمله ای هست که یک نفر میتونه بگه تو یک تیم بنظرم.
تو این فیلمم jeff خودش توضیح میده
https://www.youtube.com/watch?v=Afoh23PHVP0
@PyBackendHub
Disagree and commit
کالچری هست که تو آمازون و خیلی شرکت های خوب دنیا هست. رفرنس
At Amazon, you may know, we have a set of leadership principles that we take very seriously. I’m a big fan of the one that says “Have Backbone: Disagree and Commit.” It means that if you disagree with something, it’s your responsibility to argue. It’s meant to be applied even if it’s your boss’s idea. Disagreeing doesn’t mean acting like a jerk. It means making a cogent case, using data where possible to support your arguments. The second part of the principle, “Commit,” is important as well. At some point, you may have to give in, or compromise. If you do, then you’re committed to the decision. You can’t be passive-aggressive or later say “I told you so.” You own the final decision, even if it’s not what you originally wanted.
"دیدی بهت گفتم؟". بدترین جمله ای هست که یک نفر میتونه بگه تو یک تیم بنظرم.
تو این فیلمم jeff خودش توضیح میده
https://www.youtube.com/watch?v=Afoh23PHVP0
@PyBackendHub
Amazon
Guts, Part Three: Having Backbone – Disagreeing and Committing | Amazon Web Services
Sometimes, other leaders in your company reject your ideas. Perhaps you’re a CIO, who knows perfectly well that the cloud will have tremendous benefit for your company. But the CFO says no, it’s too risky, or the economic projections aren’t convincing. Or…
👍13
یک سوال دارم ممنون میشم کامنت کنید جوابتون رو. از چه مدل پست های کانال بیشتر خوشتون میاد و بنظرتون مفیده؟ اینو نمیپرسم که بقیه نوع پستا رو نذارم. اینو میپرسم چون دوست دارم بدونم مخاطب از چه مدل پستی که گذاشتم خوشش اومده.
👍16❤1
نتیجه کامنتا ها رو سوالمیکنم، بنظرتون سطح و میزان مطالب راجب دیتابیس و SQL چطور بوده؟
Anonymous Poll
60%
خوب
26%
متوسط
14%
ضعیف