Python BackendHub – Telegram
Python BackendHub
7.51K subscribers
314 photos
46 videos
11 files
432 links
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
Download Telegram
Python BackendHub
چرا کد پایتون مستقیم کد ماشین نمیشه؟ دلیلش اینه که PVM و Python runtime environment داره تو پایتون کارای دیگه‌ای هم میکنه تو ران تایم مثل مدیریت حافظه، لود کردن ماژول‌ها و پکیج‌ها و... این باعث میشه که پایتون انعطاف‌پذیر و راحت باشه، ولی خب به قیمت افت عملکرد در مقایسه با زبان های کامپایلری مثل C.
۳ خط اخر رو یکم باز میکنم حس میکنم کافی توضیح ندادم (این پست دیگه خیلی ربطی به JIT نداره). راجب اینکه چرا پایتون نمیتونه به راحتی از قبل تبدیل به ماشین کد شه.

یک مثال خیلی ساده بزنم شما تو پایتون میتونید یک سورس پایتونی از اینترنت دانلود کنید, و بعد از تابع eval() استفاده کنید که درجا رانش کنه! چطور این کد میتونه تبدیل به کد ماشینی بشه با یک کامپایل مستقیما؟ موقع کامپایل هنوز مشخص نیست چی قراره دانلود شه و ران شه! این اولین خاصیت پایتونه تو انعطاف پذیریش.

دومین خاصیش داینامیک تایپ بودنشه. شما یک فانکشن دارین foo(a,b,c). اگه شما تایپ ورودی این فانکشن رو نمیدونید, نمیتونید کامپایلش کنید. ولی اگه بدونید ممکنه چه تایپ هایی باشن, میتونید برای هر combination یک نسخه متفاوت کمپایل کنید. برای همینه که زبونای statically typed راحت کمپایل میشن به کد ماشین.

این دو خصوصیت باعث میشه پایتون نتونه به راحتی مستقیم تبدیل به ماشین کد بشه. پروژه هایی هستش که اینکارو میکنن ولی با static analysis و تکنیک های دیگه با لیمیتشن های خیلی زیاد. کلا زبون های داینامیک تایپ خیلی سخت از قبل میتونن تبدیل به ماشین کد بشن‌(اگه نگم غیر ممکن) ولی زبونای استتیک تایپ خیلی راحت تر اینکارو انجام میدن.

@PyBackendHub
👍12🔥2
فرض کنید یک دیتا بسیار سنگین دارید که از دیتابیس به صورت سورت‌شده بر اساس تاریخ ایجاد کتاب‌ها میاد. حالا شما دو تابع دارین:

۱. تابع get_books که کتاب‌ها را از دیتابیس به صورت سورت‌شده بر اساس تاریخ ایجاد میگیره.
۲. تابع process_book که کتاب‌ها را پردازش میکنه، ولی به شرطی درست کار میکنه که ورودی تابع سورت شده باشه (مثلا حتما از تابع اول اومده باشه).

مسئله اینه که این دو تابع نمیتونن با هم ترکیب بشن، چون نمی‌خوایم منطق پردازش با منطق دریافت دیتا یک جا باشه و منطق پردازش رو abstract کردیم.

سوال اینجاست: در تابع process_book چه کار می‌کنید؟

۱. ورودی را دوباره سورت می‌کنید تا ۱۰۰ درصد مطمئن شین که سورت انجام شده.
۲. ورودی را سورت نمی‌کنید اما در داک استرینگ می‌نویسید که ورودی باید سورت‌شده باشد.
یا راهکار دیگه ای دارین؟‌ کامنت کنید پاسختون رو.


@PyBackendHub
👍7
Python BackendHub
فرض کنید یک دیتا بسیار سنگین دارید که از دیتابیس به صورت سورت‌شده بر اساس تاریخ ایجاد کتاب‌ها میاد. حالا شما دو تابع دارین: ۱. تابع get_books که کتاب‌ها را از دیتابیس به صورت سورت‌شده بر اساس تاریخ ایجاد میگیره. ۲. تابع process_book که کتاب‌ها را پردازش میکنه،…
مهدی تو کامنتا اشاره کرد که میتونید NewType بزنید. اسم دیگه New Type تو تایپ سیستم بهش Brand Type هم میگن. شما دارین یک تایپ رو برند میکنید. برند کردن یک تایپ یعنی چی؟‌

به مثال زیر دقت کنید

from typing import NewType

EmailType = NewType("EmailType", str)
email = EmailType("foo@gmail.com")
print(type(email))


ایمیل تو ران تایم, تایپش str معمولیه. هیچ فرقی نکرده. ولی برای تایپ چکر ایمیل EmailType هست. اینطوری شما اگه یک تابع داشتی send_email که یک ایمیل میگرفت نیاز نیست هربار ولیدیت کنی که ایا واقعا این استرینگی که داده شده به کد شما درواقع ایمیل هست یا نه. به جاش EmailType استفاده میکنی.

اینجام دقیقا همینه. شما نیازی نیست که تو ران تایم تو توابعت وقتی یک همچین کیسی داری که دو جا دو چیز به هم لینک شدن بیای هربار چک کنی که این ورودی از اون تابع اومده یا نه. به جاش تو فانکشن get_books خروجی رو Brand میکنی. مثلا SortedBookList. و ورودی این تابع رو فقط میذاری SortedBookList.

البته که هنوز شما میتونی خطا کنی. شما همچنان میتونی تو ران تایم قبل پاس دادن ورودی به اون فانکشن لیستی که سورت نشده یا استرینگی که واقعا ایمیل نیست رو cast کنی به اون تایپ. ولی پیدا کردن همچین خطایی تو code review خیلی راحته و احتمالش خیلی ناچیزه که خطا غیرعمدی انجام شه.

یک مقاله خیلی خوب راجب typing تو پایتون
یک مقاله با typenoscript که داره Branded type و یوزکیس هاشو خیلی قشنگ توضیح میده

@PyBackendHub
👍15
یکی از سخت ترین و مجیک ترین کد هایی که نوشتم تو لایبری های اوپن سورسم این بوده:
https://github.com/ManiMozaffar/aioclock/blob/main/tests/test_examples.py

تو این کد, دارم کل مثال هایی که تو داکیومنت لایبری aioclock ام چه به صورت داک استرینگ و چه تو یک فایل .md هست رو تست میکنم که ران شه و مشکلی نداشته باشه.

@PyBackendHub
👍9🔥4
Forwarded from Sadra Codes
👍 or 👎?
👍57👎3🤷‍♂11
Sadra Codes
👍 or 👎?
حق اگه توییت بود
👍9
Forwarded from ‌BenDev
امشب یعنی سه شنبه ساعت ۹ شب به وقت ایران لایو جنجالی داریم از دستش ندید

قراره که یه گپ و گفتی راجع به این داستان چت ناشناس داشته باشیم و پیاده سازیش هم می‌کنیم

@BenDevelop
11😁2
Forwarded from Yasha
همونطور که می‌دونید چند روز پیش ربات‌های ناشناس تلگرام هک شدن و همه متوجه ناامن بودنش شدیم. من و چند تا دیگه از بچه‌های کامیونیتی روی ربات پیام ناشناسی کار کردیم که می‌کنیم که اوپن‌سورسه، پیام‌ها رو با استفاده از الگوریتم‌های رمزنگاری End2End رمزشده جابجا می‌کنه و سرور قابلیت خوندن پیام‌ها رو نداره. تمام فرایند رمزنگاری رو سمت کلاینت انجام میده و سرور هیچ دخالتی توی مکانیزمش حتی نداره. این ربات الان توی مرحله تسته، ازتون می‌خوام که ربات رو تست کنید و نظرتون رو اعلام کنید.

🔗 @E2EChatbot
🔗 Source Code

برای حمایت از پروژه می‌تونید توی گیت‌هاب به ریپازیتوری استار بدید ⭐️ روی کدش مشارکت کنید، باگ‌ها رو گزارش کنید یا اینکه این پست رو به دیگران و افراد فنی صاحب نظر بفرستید تا دیده بشه و ما رو کمک‌مون کنن. 🤍

@Yasha
4👍4👎4🤔3💯1
Yasha
همونطور که می‌دونید چند روز پیش ربات‌های ناشناس تلگرام هک شدن و همه متوجه ناامن بودنش شدیم. من و چند تا دیگه از بچه‌های کامیونیتی روی ربات پیام ناشناسی کار کردیم که می‌کنیم که اوپن‌سورسه، پیام‌ها رو با استفاده از الگوریتم‌های رمزنگاری End2End رمزشده جابجا…
این چیه دیگه؟!
ببینید وقتی داریم از e2e encryption صحبت میکنیم همچین فلویی داریم

من فرستنده یک private key و public key دارم. شما هم همینطور.
من برای اینکه پیامی به شما بفرستم که کسی جز شما نخونه باید با پابلیک کی شما پیام رو encrypt کنم. بعدش با private key خودم میام اون پیام رو digital signature میزنم. اینکار باعث میشه که شما بدونی من این پیام رو فرستادم برات.
شما که پیام رو میخونی نیاز به پابلیک کی من داری. که بتونی چک کنی ایا این پیامو واقعا من فرستادم برات؟

دوستان ربات ناشناس و e2e encryption کاملا در تضاد هستن
چرا؟‌ فکر کن من بهت پیام دادم سلام روت کراش زدم. شما شک کردی که مانی همچین پیامی داده. به من میگی مانی میتونی یک سلام کنی تو لینک ناشناسم؟ همین که من یک سلام بنویسم public key پیام جدیدم با قبلیه رو مقایسه میکنی و متوجه میشی که من همونیم که گفتم روت کراش زدم.

نکته دوم نحوه ذخیره خوده تلگرامه. من به صدرا لینکو دادم گفتم یک پیام بفرست. صدرا که پیامو فرستاد من هم با سیستم بازش کردم هم با گوشی. تو جفت حالت تونستم پیام رو ببینم. پس درواقع secret key من رو گوشی یا سیستمم ذخیره نشده. رو دیتابیسه تلگرامه! کارمند تلگرام اراده کنه میتونه بیاد پیام های منو بخونه. e2e encryption یعنی فقط و فقط مقصد و مبدا سکرت کی داشته باشن و کسی این وسط نتونه بخونه.

متاسفانه e2e encryption صرفا یک buzz word هست. تو تلگرام فقط secret chat انکریپت میشه. نه چت معمولی. واتس اپ هم به شما قابلیت بک آپ دیتا و ریکاور کردنش رو یک گوشی دیگه میده. که دوباره طبق لاجیک بالا همچین چیزی فقط به شرطی ممکنه که واتس اپ سکرت کی شما رو نگه داشته باشه.

امنیت یک بخش بزرگیش فرهنگه اجتماعی و قانون گذاری هست. شما هرچی برنامت رو ایمن تر کنی UX بدتری خواهی داشت. پس این درست نیست که بگم من الان یک برنامه خیلی امن و خفن میسازم و همه قراره حال کنند. ترید آفه.

اما اینکه مشکلات بزرگی رخ نده (که هر ۱ ماه یک بار تو ایران اتفاق میفته) جلوگیریش با روش های تکنیکال و بیشتر قفل زدن نیست. تو اروپا آمریکا هیچ چیزی e2e انکریپت نمیشه. به جاش data regulatory خوب دارن. قوانین سنگین دارن. یک شرکت ۵ نفری باید فکر GDPR (قوانین مربوط به دیتا تو اروپا)‌ باشه. شما میتونی ایمیل بدی یا تو خوده اپ درخواست بزنی دیتات کامل پاک شه.

و در نهایت دیتایی که شما میفرستی تو اینترنت مشخص نیست واقعا چه بلایی سرش میاد.

یک مثال:
من یک فیلم ۱ گیگی براتون میفرستم. شما میفرستی تو save message ات. من فیلمو یک ساعت بعد پاک میکنم (دو طرفه). اون فیلم شما هنوز تو save message هست. عملیات forward به شدت سریعه. پس سوال اینجاست که آیا با دیلیت چت دو طرفه واقعا دیتا داره پاک میشه از سرور تلگرام؟ بعید بدونم.


دو ساعت راجب این چیزا تو لایو امروز امیربهادر صحبت کردیم. بحثای جالبی شد. اگه وقت و علاقه داشتین توصیه میکنم ببینید.
@PyBackendHub
👍272👎1
Python BackendHub
منیت یک بخش بزرگیش فرهنگه اجتماعی و قانون گذاری هست. شما هرچی برنامت رو ایمن تر کنی UX بدتری خواهی داشت. پس این درست نیست که بگم من الان یک برنامه خیلی امن و خفن میسازم و همه قراره حال کنند. ترید آفه.
این پارگراف هم باز کنم و برم بخوابم :))

اینکه میگم فرهنگه منظورم اینه که من باید بدونم که نباید aws secret key شرکتو رو slack بفرستم برای همکارم. این قسمت فرهنگشه. که باید آکاه باشم دیتایی که بره تو نت دیگه خدا میدونه چه بلایی سرش میاد.

اینکه قفل و زنجیر بزنی به اپلیکیشنت باعث امنیت بیشتر نمیشه. اپلیکیشنت اگه آسیب پذیری نداشته باشه مشکلی نداره. طبیعتا همه اپلیکیشن ها ضعف امنیتی دارن و اشکالیم نداره. یک ترید آفه اون.

بخشیش هم به قانون گذاری برمیگرده که گفتم. الان از ۱۰ تا سایت معتبر ایرانی واقعا ۳-۴ تاشون term of service دارن. سایت دیدم نماد الکترونیکی داره ولی term of service نداره. یعنی یک بازرس اومده سایتو دیده ولی اینو چک نکرده؟! اگه ربات تلگرام ناشناسی که شما استفاده میکردی term of use داشت و میگفت دیتاتون تو سرور من همیشه ذخیره میمونه, اون موقع هیچ مشکل قانونی نداشت. اگه هم اینکارو میکرد قطعا ۹۹درصد مردم نمیخوندنش. و هیچ یوزری انتظار نداره که دیتاشو پاک کنه. من تو هیچ اپی ندیدم وقتی ایران زندگی میکردم که این آپشن دیلیت کردن دیتا رو داشته باشه. پس بخشیش هم برمیگرده به فرهنگ و فقط قانون گذاری نیست. توقع کاربر کمه. تو آلمان دیدم مردم خیلی به این موارد اهمیت میدن.

و در نهایت اینکه دیتا لو رفته چیه؟ اگه دو تا عکس و فیلم باشه, نباید فرهنگمون اجازه بده که کسیو مسخره کنیم یا بذاریم زندگیش تموم شه بخاطر همچین چیزی. دیگه نسل جدید نباید اینقدر پوسیده فکر کنه. زندگی خصوصی آدما به خودشون مربوطه. متاسفانه مثال خلافش تو جامعه ما میشه یوتیوبری به اسم مدگل که کامنت های خیلی بدی میبنیم راجبش همه جا 🤦‍♂️


@PyBackendHub
👍14
یک کامنت و PR Review خیلی معمول 😂😂😂
@PyBackendHub
🤣28👍1🔥1
یکی از دوستانی امروز یادم انداخت به یه لایبری قدیمی که نوشته بودم. این لایبری یه HTTP client هست که می‌تونه سایت‌هایی که زیر پوشش Cloudflare هستن و سیستم ربات‌یابشون فعاله رو کراول کنه. تاحالا در موردش صحبت نکرده بودم، ولی گفتم اینجا یه توضیحی بدم.
لینک گیتهابش اینجاست با httpx کاملاً سازگاره، یعنی اگه از httpx استفاده می‌کردید، با تغییر import می‌تونید به راحتی ازش استفاده کنید.

مشکل چی بود؟ سایت‌هایی که از Cloudflare به عنوان reverse proxy استفاده می‌کنن، معمولاً از یه مکانیزم تشخیص ربات استفاده می‌کنن که به TLS Fingerprint متکیه. حالا TLS Fingerprint چیه؟ وقتی شما به یه سایت وصل می‌شید، اولین چیزی که رد و بدل میشه، یه پیام به اسم Client Hello هست. این پیام اطلاعات اولیه‌ای رو درباره کلاینت شما به سرور میده، مثل نسخه TLS که پشتیبانی می‌کنید و یه لیست به اسم cipher suite.

توضیح Cipher suite: در واقع مجموعه‌ای از الگوریتم‌های رمزنگاری هست که کلاینت و سرور می‌تونن برای برقراری یه ارتباط امن استفاده کنن. هر مرورگر یا کلاینت یه لیست مشخص از cipher suite داره که ترتیبش هم خاص همون کلاینت هست. مثلاً مرورگر کروم یه لیست مشخص داره، مرورگر فایرفاکس یه لیست دیگه، و مثلاً requests پایتون هم یه لیست کاملاً متفاوت.

کلادفلیر چطور متوجه میشه شما مرورگر نیستید؟ اون میاد این TLS Fingerprint، یعنی ترکیب نسخه TLS و ترتیب cipher suiteها، رو با user-agent شما مقایسه می‌کنه. اگه این دو تا با هم نخونن، مثلاً user-agent شما میگه مرورگر کروم هستید ولی cipher suiteها میگن یه اسکریپت پایتونید، Cloudflare متوجه میشه که شما مرورگر نیستید و درخواست رو بلاک می‌کنه.

کله سناریویی که گفتم اینجا داره اتفاق میفته تو لایبری من که کلا ۱۰ خط کده.

@PyBackendHub
👍35🔥4🥰31
Python BackendHub
یکی از دوستانی امروز یادم انداخت به یه لایبری قدیمی که نوشته بودم. این لایبری یه HTTP client هست که می‌تونه سایت‌هایی که زیر پوشش Cloudflare هستن و سیستم ربات‌یابشون فعاله رو کراول کنه. تاحالا در موردش صحبت نکرده بودم، ولی گفتم اینجا یه توضیحی بدم. لینک گیتهابش…
اگه این پست و لایبری براتون مفید بود، خوشحال می‌شم اگه بهش استار بدید. این کار به من انگیزه بیشتری برای توسعه و بهبود فریم‌ورک های اوپن سورس میده. از حمایت‌تون خیلی ممنونم 🙂 🙏

@PyBackendHub
🥰21👍7
Forwarded from Yasha
image_2024-08-22_18-05-43.png
166.9 KB
الگوریتم رو می‌تونید اینجا به صورت بصری ببینید.

@Yasha
Yasha
image_2024-08-22_18-05-43.png
یک شفاف سازی: منظوراز سرور تو این schema سرور خوده ربات ناشناسه.

این بهترین نسخه ای هست که میشه با تلگرام اپ نوشت، هویت شما با هرپیام تغییر‌ میکنه بنابراین ناشناسه.

ولی هنوز e2e نیست چون سکرت کی ها همه تو کلاد استوریج تلگرام ذخیره میشن.
نکته دیگه هم اینه که من فرض رو براین گذاشتم که دیتایی که یک اپلیکیشن رو کلاد تلگرام ذخیره میکنه، قابل دریافت مجدد نیست توسط خوده اپلیکیشن. اگه این فرضیه درست نباشه، کلا این قضیه شدنی نیست رو تلگرام.

@PyBackendHub
👍51🤣1
Python BackendHub
یکی از دوستانی امروز یادم انداخت به یه لایبری قدیمی که نوشته بودم. این لایبری یه HTTP client هست که می‌تونه سایت‌هایی که زیر پوشش Cloudflare هستن و سیستم ربات‌یابشون فعاله رو کراول کنه. تاحالا در موردش صحبت نکرده بودم، ولی گفتم اینجا یه توضیحی بدم. لینک گیتهابش…
چند نفر تو پیوی ازم پرسیدن چطور به این نتیجه رسیدم و این لایبری رو نوشتم. گفتم شاید بهتر باشه تو کانال در موردش صحبت کنم چون نکته مهمیه که همیشه به درد می‌خوره.

ببینید من نه مهندس معکوسم، نه تو امنیت کار کردم. یکی از پروژه‌هایی که داشتم روی کراولینگ بود. یه روز دیدم سایتی که کراول می‌کردم همه درخواست‌هارو بلاک می‌کنه. یه درخواست با curl زدم، نتیجه رو ذخیره کردم و دیدم. فهمیدم مشکل چالش Cloudflare هست. جالبه که با مرورگر وقتی همون درخواست رو می‌زدم، سریع جواب می‌گرفتم.

من قبلاً کتابی در مورد HTTP و TLS خونده بودم و می‌دونستم معجزه‌ای در کار نیست. وقتی درخواست می‌زنی، سرور جوابی می‌ده. پس یه چیزی تو curl داره اشتباه می‌شه که تو مرورگر نمی‌شه. درخواست مرورگر رو دقیقاً با curl کپی کردم، ولی بازم فیل شد! ترافیک سیستم رو پروکسی کردم، یک بار همون curl رو زدم و یک بار هم با مرورگر. مقایسه‌شون کردم و دیدم تفاوت اصلی توی Hello Client هست. همینو تو پایتون پیاده کردم و بایپس شد.

کل این پروسه ۲۰ دقیقه طول کشید. یه سرچ کردم ببینم کلاینت پایتونی برای Cloudflare هست یا نه. دو تا پروژه پیدا کردم که نه کار می‌کردن نه توضیح داده بودن چطور این کارو کردن. حتی اگه کارم می‌کردن، استفاده نمی‌کردم. هیچ‌وقت لایبری که نمی‌دونی چیکار می‌کنه رو تو پروداکشن استفاده نکن. بعداً سورس کد یکیشونو دیدم که وسطش یه کار عجیب می‌کرد که باعث مموری لیک می‌شد!

نکات مهم این داستان:

۱. دانشی که به‌صورت تئوری دارید، زود یادتون می‌ره. وقتی ازش استفاده عملی کنید، بیشتر تو ذهنتون می‌مونه. استفاده عملی از یک نیاز میاد. نه اینکه یک کتاب بخونید ببینید کد هاشو کپی پیست کنید.
۲. همیشه تحقیق کنید و سولوشنی که پیاده کردید رو بفهمید. من اگه اون لایبری رو استفاده می‌کردم، مموری لیک می‌خوردم و این لایبری هم نوشته نمی‌شد.
۳. برای یادگیری از GPT استفاده نکنید. تئوری یاد بگیرید بهتر از اینه که از GPT بپرسید. چون GPT تئوری رو ناقص می‌گه و نمی‌تونه دقیقاً مشکل رو تشخیص بده. همین الان هم این سوال رو ازش پرسیدم با بهترین prompt ای که میشد داد. و جوابشو ببینید خودتون
۴. با تمرین و تکرار مهارتتون بالا می‌ره. این پروسه ۲۰ دقیقه طول کشید چون بارها ترافیک سیستم عاملمو پروکسی کرده بودم و می‌دونستم Network Tab مرورگر خیلی سطح بالاست و بعضی HTTP Headerها رو نشون نمی‌ده. هیچ مجیکی وجود نداره، تمرینه که دستتو سریع می‌کنه. شاید یک نفری که ندونه اینارو و نکرده این تسک چند هفتش میشد.


@PyBackendHub
👌25👍53
Python BackendHub
به دلیل سرما خوردگی لایو به یک شنبه یک هفته بعد موکول خواهد شد (۲۵ ام August). متاسفانه نتونستم ویدیو آخر که راجب ماگریشن نویسی با alembic هست رو ظبط کنم. ایشالا اونم طی این آخر هفته انجام میدم وقتی بهتر شدم :)
راجب لایو که قراره بذاریم مجددا متاسفانه مجبورم که موکولش کنم به هفته آینده. چون هنوز ویدیو alembic رو ندادم. مریضیم کرونا بود ۲ هفته طول کشید تا کامل خوب شم 😅 (الان خوبم دوستان نگران نباشید)

امروز یا فردا ویدیو alembic هم آپلود میشه آخرین ویدیو دوره مقدماتی SQLAlchemy

@PyBackendHub
23😢1🤡1
Forwarded from Sadra Codes
آقا ساپورت کنید ببینم یک پروداکت‌هانت رو می‌گیریم یا نه. 😅
تقریبا ۱۵ ساعت مونده و سومیم. با نفر اول تقریبا ۷۰ تا vote فاصله داریم.

https://www.producthunt.com/posts/hey-7fed5187-9b92-4ee8-9ce5-e08d5bc63d15
11🤡3👍2
آیا می‌دونستید از هر ۵۰ تا رزومه فقط یکیش مصاحبه می‌گیره؟ آیا می‌دونستید که تجربه و دانش شما لزوماً به معنای رزومه‌ی بهتر نیست؟ و اینکه خیلی از مهندسای نرم‌افزار با تغییر رزومشون تونستن درآمدشون رو چند برابر کنن؟

خب، من یه راه‌حل دارم براتون! چند وقت پیش من یه ریپو داشتم که الان ۳۰۰ ستاره گرفته و توش به تکنیک‌های نوشتن رزومه پرداخته بود. حالا وقت گذاشتم و اون رو به Mkdocs تبدیل کردم تا خوندنش راحت‌تر بشه. کلی قسمت رو آپدیت کردم، مثال‌های بیشتر و نمودار و رفرنس‌های جدید اضافه کردم، و مطالب رو خیلی مرتب‌تر کردم.

لینک ریپو
لینک داکیومنشن جدید

اگه این پست و لایبری براتون مفید بود، خوشحال می‌شم اگه بهش استار بدید. این کار به من انگیزه بیشتری برای توسعه و بهبود فریم‌ورک های اوپن سورس میده. از حمایت‌تون خیلی ممنونم 🙂 🙏


@PyBackendHub
58👍10🔥3