Reading materials
19 subscribers
2 photos
19 links
نوشته های کوتاه من و
پست‌هایی از سراسر وب که به نظرم ارزش خوندن دارن.
https://virgool.io/@ebrahimisina
Download Telegram
✔️ چگونه فایل‌های json عه بزرگ را بدون تموم شدن مموری‌مون 😬 بخونیم

یک مشکلی که بعضا برای کسایی که با json خصوصا فایل‌هایی با حجم بالا کار میکنن اینه که استفاده غیرطبیعی و بسیار زیاد مموری رو تجربه میکنن!!

برای جلوگیری از این مشکل چندین راه‌حل وجود داره که در این مقاله راجع بهشون صحبت شده:

https://pythonspeed.com/articles/json-memory-streaming/


©@PSFarsi
Forwarded from سیلیسیم (Mohammad Babazadeh)
✔️ پایپ لاین ایده‌آل CI/CD

در این ویدئو به بررسی یک پایپ‌لاین ایده‌آل CI/CD می‌پردازیم و راجع به انواع تست‌های پرکاربرد نرم‌افزار نظیر:
1. Unit Test
2. Integration Test
3. End-to-End Test
4. Smoke Test
5. Security Test
6. White-box & Black-box Test
7. Performance Test
8. Scalibility Test
9. Load Test
10. Stress Test
11. etc.
صحبت می‌کنیم.

🖥 مشاهده در یوتوب
👉 Link: https://youtu.be/Zrtdon8XH4M

#devops #CICD #دوآپس
〰️〰️〰️〰️〰️〰️
@siliciumir
* و / توی آرگومان‌های فانکشن‌ها چیکار میکنن؟
def func(param1: int, param2: str = "name", param3: bool):
...

احتمالا قبلا به صورت اتفاقی هم که شده اینجوری توی پایتون تابع نوشتید و بعدش با اروری مواجه شدید که میگفت: "نمیتونی بعد از یه پارامتر که مقدار دیفالت داره، پارامتری بذاری که مقدار دیفالتی نداره"

اون دوتا کاراکتری که بالا گفتم اینجا به کار میان:
فکر کنید میخواید تابع بالا رو بنویسید و خیلی براتون مهمه که ترتیب آرگومان‌ها به همین شکل باشه و مثلا پارامتر وسط فقط مقدار دیفالت داشته باشه. چی‌کار میتونیم بکنیم؟
میتونیم قبل از تعریف بقیه پارامترها، یدونه * بذاریم. مثل زیر:
def func(*, param1: int, param2: str = "name", param3: bool):
...

البته این کار یه بدی هم داره که اینه که اون * میاد تمام آرگومان‌های بعد از خودش رو keyword only میکنه. میگید این یعنی چی؟
یعنی وقتی میخواید تابع رو صدا بزنید. فقط میتونید اون‌ها رو به عنوان keyword argument به تابع پاس بدید. مثلا:
func(param1=1, param2="hello", param3=True)

در واقع اون ستاره میاد تمام positional argument های بعدش رو میخوره.
تابعی که اول پست گفتم شاید رایج ترین شکل استفاده از * باشه. این مثال رو زدم که اگه یه وقت باهاش مواجه شدید، بدونین چیکار میکنه. حالا جلوتر استفاده‌های دیگه‌اش رو هم میگم.

حالا بریم سر وقت اینکه / چیکار میکنه. در واقع برعکس حالت قبل عمل میکنه و مارو مجبور میکنه که آرگومان‌هامون رو به صورت positional only پاس بدیم.
def func(param1: int, param2: str, param3: bool, /):
...
در این حالت دیگه نمیتونیم موقع صدا کردن تابع، از اسم اون آرگومان استفاده کنیم (param1=1) و باید اونا رو به شکل positional بهش بدیم:
func(1, "hello", True)

حالا جالب اینجاست که این دوتا رو میتونیم با هم ترکیب کنیم!
مثلا:
def func(param1, param2, /, param3, *, param4, param5):
...
اینجوری تمام پارامترهای قبلا از / رو positional only میکنیم، و پارامترهای بعد از * رو هم keyword only میکنیم. توی این حالت، اینجوری تابع رو میتونیم صدا بزنیم:
func(1, "name", True, param4=4, param5=5)
یا
func(1, "name", param3=True, param4=4, param5=5)
که param3 میتونه به هر دو حالت صدا بشه.


اگه دوست دارید بیشتر در این باره بخونید:
نمونه کد از FastAPI
این سوال استک‌اورلفو
pep3102
این پاراگراف از داکیومنت FastAPI
کاش گیت undo داشت.
انواع مختلفی از روش ها که میتونید باهاشون آندو کنید
https://ohshitgit.com/
نوشته‌های ترمینالی
کاش گیت undo داشت. انواع مختلفی از روش ها که میتونید باهاشون آندو کنید https://ohshitgit.com/
تا حالا شده شروع کنید به ادیت کردن یا اضافه کردن یه فیچر به کد، و یهو یادتون بیاد ای بابا چرا یه برنچ جدید نساختم و ادیتامو روی master انجام دادم؟
تنها کاری که باید قبل از کامیت کردن بکنید اینه که همون موقع برنچ جدید رو بسازید:
git checkout -b newBranch

link
Monorepo vs Multirepo

https://kinsta.com/blog/monorepo-vs-multi-repo/

سعی میکنم توی پست بعدی یه نمونه واقعی از multirepo که توی یک پروژه واقعی استفاده کردم رو شرح بدم، و همچنین اینکه چجوری مدیریتش کردم
ادامه پست قبل...

توی یکی از پروژه‌ها، قرار شد سیستم چند تا سرویس داشته باشه،
یک سرویس بک‌اندAPI، یک سرویس بات تلگرام، یک سرویس فرانت‌اند، یک سرویس payment.
توی پروداکشن قرار بود همه این سرویس‌ها به هم وصل بشن، و خب بهترین و ساده ترین راه برای مدیریت این سرویس‌ها این بود که هر کدوم ریپازیتوری خودشون رو داشته باشن، چون ممکن بود افراد مختلفی بخوان هرکدوم رو بزنن(که همشون رو هم خودم زدم).

چون همه اینا باید با هم بالا باشن،
اولین چیزی که به ذهنم رسید این بود که یه اسکریپت بنویسم که بیاد همه اینا رو یک به یک از گیت کلون کنه، و بعد اجراشون کنه.
که خب این مشکلات خودش رو داره:
اول این که بعد از نصب اولیه، برای اپدیت هر پکیج باید جدا اون رو از گیت pull بکنی.
دوم این که هر کدوم از این‌ها خودشون یه ریپوی جدا هستن و جدا باید مدیریت بشن، جدا از هم اجرا بشن(هر کدوم از پروژه ها یه Dockerfile داشتن) و کلی مشکلات کوچیک و بزرگ دیگه.

کاری که در نهایت انجام دادم چی بود؟ استفاده از git submodules

برای این کار اومدم یه ریپازیتوری مادر، مثلا به اسم Main ساختم، و تمام سرویس ها رو به عنوان ساب ماژول به این ریپازیتوری اضافه کردم.
توی ریپازیتوری مادر از docker-compose استفاده کردم که میومد تمام Dockerfile های داخل هر ساب ماژول رو برمیداشت و از روی اون پروژه ها رو اجرا میکرد، به علاوه اون تمام دیتابیس‌ها و سرویس‌های مورد نیاز دیگه رو هم قبل از اونا بالا میاورد.

حالا یه مشکل دیگه که اینجا پیش اومد، آپدیت کردن هر ساب ماژول بعد از اپدیت شدن ریپوش بود.
مثلا وقتی من یه اپدیتی روی ریپازیتوری بک‌اند میزدم، اون نسخه ازش که توی ریپوی مادر بود آپدیت نمیشد.
که خب یه راه خوب هم برای این پیدا کردم.

از ورکفلوهای گیتهاب اکشنز استفاده کردم، یه ورکفلو برای ریپوی مادر، یه ورکفلو برای هرکدوم از سرویس‌ها:
۱. ورکفلوی سرویس‌ها:
کاری که میکردن این بود که هر وقت چیزی به برنچ master پوش شد و تست‌ها پاس شدن، یک آدرسی رو صدا کنه.

۲. ورکفلوی ریپوی مادر:
اون آدرسی که گفتم صدا میشه مربوط به این بخشه، هر وقت اون ادرس صدا میشد، ورکفلوی ریپوی مادر اجرا میشد و میومد ساب‌ماژول ها رو آپدیت میکرد.

میتونید از این لینک دقیق ببینید چجوری کار میکنه.

تمام این کارا روی ریپازیتوری های گیت‌هاب اتفاق میوفتاد.

حالا سمت سرور چی؟
برای دفعه اول فقط کافیه ریپوی مادر رو مثلا اینجوری کلون کنید:
git clone git@github.com:Username/Main.git --recurse-submodules


بعد از اون برای آپدیت پروژه ها توی سرور فقط کافی بود این شکلی ریپوهارو اپدیت کنم:
git submodules update —remote
و اینجوری هم ایمیج های داکر رو بیلد کنم و سرویس ها رو بالا بیارم:
docker-compose up —build

به همین سادگی!

(اگه فرصتش رو داشتم یه نمونه پروژه‌ دموی این شکلی میسازم و لینک گیتش رو اینجا قرار میدم)
دیروز این پست رو توی یه کانال تلگرامی دیدم که اومده بود و کد رو ریفکتور کرده بود.
حالا تو پست بعد چند تا نکته برای بهتر کردنش هم از نظر پرفورمنس و هم از نظر خوانایی میگم و باهم دوباره ریفکتورش میکنیم
This media is not supported in your browser
VIEW IN TELEGRAM
jless — a command-line JSON viewer

خیلی باحال میتونید داخل ترمینال یه جیسون ویور داشته باشید :)🔥

🔹 linux
🔸 mac

🔗 jless.io

#json #linux
@alirezabashi_98 🚀
یه برنامه‌ای هست به اسم reflector برای arch linux که میاد به شکل خودکار و در پس زمینه میرور‌های خوب برای آپدیت رو پیدا میکنه و لیست میرورهای pacman رو خودش بروز میکنه.
آموزش راه‌اندازیش اینجاست:
Automatically update Arch Linux mirrors by Josh Sherman
https://joshtronic.com/2021/03/14/automatically-update-arch-linux-mirrors/

(نمیگم استفاده چون یه بار راه بندازید دیگه کار میکنه)
بحث rate limit هم جالبه. ایده اینه که یه سرور (یا کلا خدمت دهنده) داریم که به یکسری مشتری می‌خواد خدمت بده، اما نمی‌خواد یه مشتری زیاد از منابع استفاده کنه که سر سرور شلوغ بشه و به بقیه منابع نرسه. برای همین میان یه محدودیت می‌ذارن که مثلا هر اکانت می‌تونه روزی ۶۰۰۰ تا توییت بخونه یا ۲۰۰ تا توییت بنویسه یا این ip صد بار در روز بیشتر آب و هوا رو چک نکنه.
حالا الگوریتم‌های مختلفی که باهاش rate limit پیاده‌سازی می‌شه چیا هستن؟
https://nordicapis.com/different-algorithms-to-implement-rate-limiting-in-apis/