جنگولرن
3.81K subscribers
287 photos
74 videos
31 files
556 links
آموزش Django و بستگان
Download Telegram
📣 تبلیغ رایگان

کانال تلگرامی @pythonlearnme خیلی از مفاهیم رو بدون حاشیه توضیح داده و سریع رفته سر اصل مطلب

Nerwork&security
The Good, Bad and the Ugly

توی این کانال فقط قرار هست در مورد برنامه نویسی به زبان پایتون حوزه های شبکه و امنیت صحبت میکنیم

این کانال یک بلاگ شخصی هست و پیرامون نظرات و چیزهایی که توی بیش از 5سال کد زدن یاد گرفتم (فقط برای کمک به دوستان تازه‌کار)
👨‍💻📚Chief Information Security Officer/Red Hat/Network Administrator Useful Network Sensor/Security Consultant📚👨‍💻

Admin: @Antoone2024
Github:https://github.com/ChiefInformationSecurityOfficer
Linkedin: https://www.linkedin.com/in/amirsamrozveltr-rezvani-80653a291/
Forwarded from مطالب رایگان و آزاد🎈 ( behrad)
* چجوری توی پایتون نمودار بکشیم؟

خیلی وقتا پیش میاد که بخواین یه دیتایی رو ببرین روی نمودار، به دلایل مختلف:

* نمودار ساده‌ترین روشیه که میتونیم از روی دیتای خام، دانش استنتاج کنیم.
* نمودار اینترفیسیه که آدمها خیلی ساده میتونن یه برداشتی از یه دیتا بکنن.
* نمودار ابزار خوبیه برای مقایسه روشها و متدهای مختلف.
* نمودار یه ویژوآلایزشن کلی از یه اطلاعات مفصل رو در یه قاب کوشولو به انسان میده.

چه ابزاری برای نمودار کشیدن ساده‌تر و کارآمد تره؟
من چندتا ابزار رو تست کردم، حتی ابزارهای گرافیکی، ولی به عقیده من بهترین و ساده‌ترین ابزار کتابخونه matplotlib بود.
فکر کنم این کتابخونه بصورت یه ماژول بیلت-این توی همه ورژنهای پایتون امبد شده باشه و وجود داره، تنها هزینه‌ش یه ایمپورته:)
import matplotlib.pyplot as plt

اگر نصب نبود که، آقای پیپ در خدمت شماست:
pip install matplotlib


=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+

هیستوریش هم خیلی باحاله،
آقای جان هانتر، که یه نوروبیولوژیست بود (نمیدونم ترجمه فارسیش چی میشه: عصب-زیست‌شناس یا همچین چیزی) میخواسته یه EEG رو روی نمودار نشون بده، نشسته این برنامه رو اون قدیما - سال 2002 شاید - نوشته، که بعدا بقیه هم دیدن گوگوله و استفاده کردن ... الان تیم matplotlib توسعه‌ش میده... اگه میخواین مشارکت کنین:

https://github.com/matplotlib/matplotlib
https://matplotlib.org/

نکته علمی هم EEG هست که مخفف Electroencephalography هست، به معنی "نوار مغزی"... یه بار کلمه‌ش هم بخونین، الکترو-انسِفالو-گرافی (uh·lek·trow·en·seh·fuh·lo·gruh·fee)

بهش ستاره بدین اگه استفاده کردین و البته بریم چند تا مثال ازش حل کنیم.
👍53
پستی از لینکدین Mohammad Amin Amjadi فعلا فقط تصمیم گرفته. اما از همین تصمیم اش خیلی چیزارو میشه یاد گرفت 🤣 لینک

تصمیم گرفتم برای رشد خودم و جامعه جنگو در ایران شروع کنم به اشتراک گذاشتن تجربیات و مطالب مختلف با تمرکز روی توسعه بک اند جنگو برای تیم‌های استارتاپی و شرکت‌های بزرگ که دغدغه کد قابل توسعه رو دارن.

موضوعات زیر رو فعلا برای تولید محتوا در نظر گرفتم [حجم مطالب زیاده و قطعا از هر کمک، مشارکت و پیشنهادی استقبال خواهم کرد]، اگر موضوع یا چالش جذاب دیگه‌ای هم در نظر دارین زیر همین پست بگین حتما.

- ساختار پیشنهادی پروژه

- نحوه داشتن یک setting زیبا (داشتن base و develop و ... اصلا خوب و مناسب نیست خصوصا برای پروژه های بزرگ)

_ نحوه مدیریت env ها و اینکه چه چیزهایی داخل env باشن

- شیوه‌های مناسب مدیریت پکیج‌ها و نکاتی که در پروژه‌های بزرگ با تعداد پکیج زیاد به وجود میاد

- ساختار و نحوه کدنویسی هر اپ

- شیوه‌های پیاده سازی ارتباط بین اپ‌های مختلف تا decouple نگه‌شون داریم

- شیوه‌های مدیریت dependency injection برای وابستگی‌های داخلی و بیرون هر اپ

_نحوه نگه‌داری کد و وابستگی‌ها تا در آینده با چالش‌های کمتری بتونیم در صورت نیاز به سمت میکروسرویس بریم یا بخش‌هایی از سورس کد رو به سرویسی مجزا منتقل کنیم

- دیدگاه‌ و معیارهای لازم برای شکوندن اپ‌ها

- نکات تست نویسی، چطور تست بنویسیم و برای چیا تست بنویسیم

- روش های ماژولاریتی خصوصا روش های Modular By Layer و Modular By Feature و پترن Vertical Slice Architecture و ...

- معماری Clean Architecture

- پترن MVC برای لایه Presentation و استفاده از اون برای توسعه وب سرویس های مبتنی بر DRF

- ملاحظات و نکات مدلسازی خصوصا وقتیکه تیم دیتا داریم، قراره Data warehouse بسازیم یا در آینده کارهای تحلیلی و دیتاساینس انجام بدیم و ...

_ ملاحظات فیلد‌های کاستوم در مدل و سریلایزر و ...

- کوئری‌هامون رو کجا بنویسیم؟

- چطوری کوئری‌هامون رو آپتیمایز کنیم؟

- این همه میگن Fat Model، Fat Model چه نکاتی و ملاحظات و باید و نبایدهایی داره و اینکه چرا باز این روش اصلا خوب نیست خصوصا برای تیم و پروژه‌های بزرگ و روش‌های جایگزینش چیه؟

- در کل بیزینس لاجیک رو کجا و چطور پیاده کنیم؟ کمی با DDD آشنا بشیم و دست به کد بشیم تا کدی مناسب برای پروژه و شرکت‌های بزرگ و استارتاپ‌هایی که اجایل بودن براشون مهمه بزنیم

_ ملاحظات ماگریشن‌ها و اینکه چطور ماگریشن دستی بنویسیم و اگر حجم دیتای زیادی داخل دیتابیس داشته باشیم چکار کنیم؟

_ مزیت Connection Pool چیه و چرا باید داشته باشیم و چطور؟

- چرا باید از Repository Pattern استفاده کنیم و چی هست اصلا؟ کی ازش استفاده کنیم؟

- اگر دو یا چندتا دیتابیس روی چندتا دیتاسنتر که بصورت failover کانفیگ شده باشن داشته باشیم چکار کنیم؟

- اگر بخواهیم per app یا per model تصمیم بگیریم از دیتابیسی مجزا استفاده بشه چکار کنیم؟

- اگر بخواهیم برای محیط local دولوپرها دیتابیسی داشته باشیم که اتوماتیک برای هر فرد دیتابیسی مجزا در نظر گرفته بشه چکار کنیم؟

- ملاحظات توسعه api با DRF و نکات کلاس‌های Serializers، Permissions, Relations و Fields، Renders و ...

- نکات مربوط به Dockerfile و اقدامات لازم جهت افزایش سرعت بیلد

- تنظیمات مناسب Gitlab-Ci

- کاربرد PreCommit و نقشش در بهبود فرآیند توسعه کد و code review و شیوه توسعه PreCommit کاستوم

- کار با ابزارهای Tracking، Profiling و monitoring

و ....
👍7🔥42
Forwarded from Python BackendHub (Mani)
تو جواب ها اشاره کردن به بخش اول سوال. یک راه حل نسبتا کارگشا.
یک چیزی هست به اسم two phase commit. یعنی شما قبل اینکه بخوای یک transaction رو کامیت کنی میتونی یک اوکی بگیری از دیتابیس. دیتابیس بهت میگه این transaction تو اون لحظه ای که داری ازش میپرسی قابلیت کامیت شدن رو داره بدون مشکل یا نه. پس اون سرویس دوم باید two phase commit بزنه وقتی با سرویس اول داره حرف میزنه. و اگه اوکی بود ببره رو سرویس اول.

حالا مشکلی که وجود داره اینه که ممکنه اختلاف زمانی که تو two phase commit رخ میده ممکنه خودش باعث fail شدن transaction شه. یعنی state دیتابیس تو این چند ثانیه تغییر کرده باشه. ممکنه براتون سوال پیش بیاد باید چیکار کرد؟‌
هیچی باید تسلیم شد!

این بحث تو ریاضی بهش میگن Two Generals' Problem که هیچوقت حل نشده و ثابت شده حل نشدنیه.
یعنی چی؟‌ یعنی فکر کنید دو ژنرال میخوان به یک شهر حمله کنن با ۲ ارتش مختلف از ۲ نقطه مختلف. ژنرال اول به دوم میگه دو شنبه صبح حمله میکنیم. ژنرال اول نمیدونه ژنرال دوم پیامش رو دریافت کرد یا نه. برای همین باید صبر کنه که ژنرال دوم جواب بده. ژنرال دوم میگه باشه شنیدم. حالا ژنرال دوم نمیدونه که ژنرال اول پیامشو دریافت کرد یا نه. حالا باید صبر کنه دوباره ژنرال اول بگه شنیدم. و این loop تا انتها میتونه بره.

بنابر این قضیه, شما حتی میتونی درخواست HTTP بزنی که duplicate شه یعنی دو بار ارسال شه! چون acknowledge نشده.
واسه همین fault tolerancy همیشه تا یک حدی معقوله. از یک جا به بعد دیگه میشه مرز جنون :)) خوبه بهش فکر کنیم ولی یادمون نره وارد جنون نشیم 😁
@PyBackEndHub
Forwarded from Python Hints
توی شرکت روی پروژه شرکت مثال زدم؛ عذر میخوام اگر توی تصویر بالا مثال خیلی کاربردی نیست
جایی رو ندیدم مثال خوب / واقعی بزنه یا زده باشه سعی کردم ی مورد مشابه رو مثال بزنم

فرض کنید ما ۳ نوع فایل داریم که خیلی برامون مهم هست :
1- لاگ‌ها ؛ خطاهای سرویس‌ها - دیتابیس و ... توی این فایل‌ها نوشته میشه و وجودش برای پروژه بسیار بسیار مهم هست
پس اگر فایل لاگ وجود نداشت پروژه به هیچ وجه نباید روی پروداکشن بره

2- فایل‌های کمکی؛ وجودشون مهم هست اما نه اونقدری که نذاریم پروژه بره روی پروداکشن
بعنوان مثال تصویر لوگوی شرکت

3- یک سری گذارشات روزانه مثلا و.ضعیت پرداخت‌ها و ...
که بصورت اتوماتیک انتهای ساعت کاری هر روز درست میشه؛ اما اگر یکی از ادمین‌ها یا مشتری‌ها وسط روز بخواد خروجی بگیره ممکنه نداشته باشم.

توی مثال بالا بصورت دیفالت هر ۳ فایل یک ارور رو بر میگردونه :
FileNotFoundError
که اگر بخوایم exception handler بنویسیم باید حتما توی داخلی ترین تابع پردازش نوشته بشه و حتما باید بررسی کنیم که توی یک تابع یا متد بصورت همزمان وجود بیش از ۱ مورد از فایل‌های بالا بررسی نشه چون در اون صورت نمی‌دونیم ارور مربوط به عدم وجود کدوم فایل بوده و نمی‌تونیم تصمیم بگیریم آیا ابزار باید روی پروداکشن بره یا خیر یا ...

اهمیت custom exception نوشتن همینجا مشخص می‌شه؛
شما می‌تونید هرجایی که دلتون خواست و هر نوع فایلی که دلتون خواست رو بررسی کنید.
برنامه‌نویس‌های تیم شما آزادی عمل بیشتری دارند و این یعنی تصمیمات بهتری می‌تونند بگیرند
دیباگ کردن بسیار راحت تر خواهد بود؛ چرا که به لطف خطاهای مشخص می‌تونید درجا سروقت تابع یا متدی برید که وظیفه بررسی اون خطا رو داره
جداسازی مفاهیم مختلف؛ مثل بررسی لاگ و اعمالش یا بررسی و برخورد با گزارشات روزانه و ... باعث میشه شما بتونید کد رو به راحتی به افراد مختلف بسپارید و این یعنی کار کردن به صورت پارالل به راحتی قابل انجام هست پس سرعت توسعه کد قطعا بیشتر خواهد بود.
و ...


اتفاقی که امروز افتاد: برای ما روی یک پکیج حیاتی و بسیار بزرگ بود که پیدا کردن باگ داخلش می‌تونه حتی هفته‌ها طول بکشه
اما اگر پروژه شما انقدر گسترده نیست می‌تونید این مورد رو چشم پوشی کنید.

ولی در نظر بگیرید:
هیچ کس از رعایت best practice ها متضرر نشده و نمی‌شه.
👍5
سلام به همه. درسته که بعضی پست هایی که فوروارد میکنم به یک یا چند پست دیگه وابسته هستن (مثل همین دو پست آخر).
ولی نکاتی که توی این پست ها هست، مد نظر منه و به نظرم آموزنده هستن.
مثلا یکی به Two Generals' Problem اشاره کرده.
یکی دیگه هم به custom exception اشاره کرده.

لکن از @Abbasi_ai و @mani_nikou به خاطر مطالب آموزنده شون تشکر میکنم.
6
جنگولرن
مشکل soft delete برای relation ها اگه این ویدئو رو از کانال @microfrontend_ir دیده باشید. تقریبا همه حالت هارو برای Soft delete هندل کرده. برای اینکه حذف واقعی اتفاق نیافته، متد delete مدل رو override می کنیم و میگیم جای حذف، رکورد رو آپدیت کن و... ولی…
کامنت @Sepehr_e
سلام و درود. من برای این یه راه حلی دیدم از ریپو یکی از دوستان بنظر اومد مربوطه
کاری که کردن اومدن و از models.CASCADE استفاده کردن و یه SOFT_CASCADE نوشتن که همه مدلای مربوطه رو سافت دلیت میکنه
from django.db import connections
from django.utils import timezone
from collections import defaultdict


def SOFT_CASCADE(collector, field, sub_objs, using):
collector.data = defaultdict(set)

collector.collect(
sub_objs,
source=field.remote_field.model,
source_attr=field.name,
nullable=field.null,
fail_on_restricted=False,
)

collector.data = defaultdict(set)

for item in sub_objs:
item.is_deleted = True
item.delete_date = timezone.now()
item.save()

if field.null and not connections[using].features.can_defer_constraint_checks:
collector.add_field_update(field, None, sub_objs)

https://github.com/mejomba/django_shop_m89_final/blob/main/core/models_on_delete.py
👍51
جنگولرن
پستی از لینکدین Mohammad Amin Amjadi فعلا فقط تصمیم گرفته. اما از همین تصمیم اش خیلی چیزارو میشه یاد گرفت 🤣 لینک تصمیم گرفتم برای رشد خودم و جامعه جنگو در ایران شروع کنم به اشتراک گذاشتن تجربیات و مطالب مختلف با تمرکز روی توسعه بک اند جنگو برای تیم‌های…
django001.pdf
347.3 KB
اولین پست از Mohammad Amin Amjadi
لینک
بریم سراغ اشتباهات پروژه جنگو! و اولین پستی که قولش رو داده بودم.
سعی کردم بر اساس کدهای گیت‌هاب و تجربیاتی که داشتم یکسری اشتباهات و مطالب رو باهاتون در میون بذارم.
فرض کنین که بک اند یک فروشگاه اینترنتی به این شکل پیاده شده.
از اونجایی که زودتر شروع کردن رو به یک شروع بی نقص ترجیح می‌دم قطعا اشتباهات و ایرادات زیادی بهم وارد هست.
ممنون میشم با دقت مطالعه کنین و هر نظر و سوالی داشتین باهام در میون بذارین.
امیدارم که مفید باشه و حمایت فراموش نشه.
👍136
یه دوره رایگان در مکتب خونه با عنوان تحلیل و طراحی سیستم

توضیحاتش:
یکی از اهداف اصلی تعیین شده برای فارغ التحصیلان رشته مهندسی کامپیوتر، تسلط به مراحل توسعه سیستم‌های نرم‌افزاری بزرگ و پیچیده می‌باشد. به همین دلیل، دروس طراحی سیستمهای شئ‌گرا، مهندسی نرم افزار 1 (در سرفصل جدید بنام تحلیل و طراحی سیستم)، پایگاه داده‌ها و مهندسی نرم‌افزار 2 (در سرفصل جدید بنام مهندسی نرم افزار) و چند درس مرتبط دیگر در این رشته قرار داده شده‌اند.

درس تحلیل و طراحی سیستم یا همان مهندسی نرم افزار 1 اساسی‌ترین درس برای شروع یادگیری مراحل توسعه سیستم‌های نرم افزاری است و مهمترین پیشنیاز آن درس برنامه‌نویسی شئ‌گرا می‌باشد.
در این دوره آموزشی، مفاهیم اساسی و اصول اولیه تحلیل و طراحی سیستم‌های نرم افزاری با رویکرد شئ گرا و بر مبنای متدولوژی RUP تشرح شده است. در جلسات اول مفاهیم اساسی تحلیل و طراحی سیستم‌ها بیان شده است. در ادامه مراحل توسعه نرم‌افزارها بر اساس متدولوژی RUP تدریس شده و برای تسلط کامل دانشجو بر مفاهیم طراحی، ابتدا ابتکارات طراحی شئ‌گرا و در ادامه اصول اساسی SOLID و در نهایت الگوهای طراحی به تفصیل بیان شده است و در نهایت قسمت‌هایی از مراحل تحلیل و طراحی یک سیستم نمونه آورده شده است.
لینک
👍13
Forwarded from یادگیری ماشین با چاشنی صنعت (Abolfazl 🤘)
معرفی چند دوره‌ی جامع با لود بالا خاص کسانی که میخواهند در زمینه مهندسی نرم افزار به شکل حرفه ای چه در صنعت و چه به شکل پژوهشی کار کنند:

۱. متدولوژی‌های ایجاد نرم افزار :
https://ocw.sharif.edu/course/id/336


۲. الگوها در مهندسی نرم افزار :
https://ocw.sharif.edu/course/id/443


۳. طراحی شی گرای سیستم ها :
https://ocw.sharif.edu/course/id/38


۴. ایجاد چابک نرم افزار:
https://ocw.sharif.edu/course/id/448


پ ن: این دوره ها رو با حواس جمع ببینید و از نکات بسیار خوبی که گفته میشه نهایت استفاده رو ببرید.
👍20👎4
آموزش پیاده سازی جنگو در پلتفرم های مختلف لیارا، هم روش و وی پی اس
از علی بیگدلی

در این وبینار تلاش بر این است تا مدل های مختلف پیاده سازی را به دوستان ارائه کنیم تا بتوانند بدون ترس و با خطا های کمتر گزینه های مناسب را برای پیاده سازی انتخاب کنند. از جمله مواردی که در این وبینار بررسی خواهد شد نحوه تبدیل و تغییر layout یک پروژه برای پیاده سازی در هر متد است و در ادامه به ویژگی هایی اشاره خواهد که به شما در تصمیم گیری انتخاب خواهد کرد.

همچنین در هر مورد می توانید هزینه ها و کیفیت سرویس را بررسی کنین از جمله ، پیاده سازی ها با CICD و همچنین بکاپ گیری های مداوم.

لینک آپارات:
https://www.aparat.com/v/lRu59
لینک سایت علی بیگدلی:
لینک
👍11
جنگولرن
سری مهندسی نرم‌افزار: پست 6 از لینکدین Saeed Shahrivari Joghan زوج طلایی طراحی: سادگی + تفکیک دغدغه‌ها اگه پست ۵ رو خونده باشید به اینجا رسیدیم که برای طراحی و تولید یه نرم‌افزار (باز هم تاکید می‌کنم دامنه نرم‌افزار شامل کد، داده و مستنداته🙂) که قابلیت تغییر،…
سری مهندسی نرم‌افزار: پست 7
از لینکدین Saeed Shahrivari Joghan
توسعه چابک نرم‌افزار: سرعت یا انطباق؟

حوالی سال ۲۰۰۱ میلادی تعدادی از افراد شناخته شده حوزه نرم‌افزار طی بیانیه‌ای اعلام کردند که به راه‌های بهتری برای توسعه نرم‌افزار نسبت به دهه ۹۰ میلادی رسیدند و عنوان این بیانیه رو گذاشتند «توسعه نرم‌افزار به صورت چابک». بر خلاف روش‌های کلاسیک اجایل ارز‌ش‌های جدیدی رو تاکید می‌کرد:
۱- ارزش بیشتر افراد و تعاملات نسبت به فرآیند‌ها و ابزار
۲- ارزش بیشتر نرم‌افزاری که کار می‌کنه نسبت به مستندات مفصل
۳- ارزش بیشتر تعامل با مشتری نسبت به مذاکره قرارداد
۴- ارزش بیشتر پاسخ به تغییر نسبت به پایبندی به برنامه قبلی
زیر بیانیه هم یه نکته نوشته شده که معمولاً کسی نمی‌خونه: «آيتم‌های آخری بی‌ارزش نیستند بلکه آیتم‌های اولی ارزش بیشتری دارند.»

من همیشه اعتقاد داشتم که اجایل بودن به معنی سریع بودن نیست بلکه ذات فلسفه اجایل «پاسخ و واکنش مناسب به تغییراته». به قول فرنگیا که میگن embracing change یعنی فراتر از پذیرش تغییرات اونها رو در آغوش بکشیم. سوال مهم اینه که «چرا باید انقدر در مقابل تغییرات منعطف باشیم؟» من در پاسخش دو تا نکته دارم:
۱- در فرآیند تولید نرم‌افزار مخصوصا شناسایی دقیق نیازمندی کاربر ما درگیر یه پروسه غیر قطعی، تکاملی و اکتشافی هستیم. یعنی ما به مرور متوجه نیازمندی دقیق کاربر میشیم و خیلی مواقع این نیازمندی‌ها تغییر می‌کنند پس ما باید به جای جنگیدن با تغییر اونها رو کامل بپذیریم. یکی از راهکار اصلی چابکی برای هضم تغییرات فرآیند تکرار‌شونده و افزایشی هست.
۲- از دید من چابکی و هضم تغییرات در راستای بقای کسب‌وکار تعریف میشه. یعنی مثل روال طبیعت اگه با تغییرات بیشتر خودت رو وفق بدی، بیشتر بقا پیدا می‌کنی. در واقع مثال خوب برای چابکی یوزپلنگ نیست که با اینکه خیلی سریعه ولی همه جا در حال انقراضه بلکه مثال خوب میتونه حضرت کروکدیل باشه که ده‌ها میلیون سال روی زمین بقا داشته. پس معمولاً شرکتی که چابکتر باشه به تغییرات واکنش بهتری نشون میده و در بازار بقای بیشتری پیدا می‌کنه.

در زمینه چابکی حرف زیاده ولی تو این پست بیشتر از این اطاله کلام نمی‌کنم و در پست‌های بعدی بیشتر توضیح میدم. برای یادآوری هم که شده بد نیست نگاهی مجدد به بیانیه چابکی بندازیم:
https://agilemanifesto.org/
اگه میخواهید توی جنگو از Preprocessor ع SASS استفاده کنید.
تا بهتر بتونید کدهای css پروژه تون مدیریت کنید.
میتونید از پکیج django-sass-processor استفاده کنید.
توی فروشگاه اوپن سورس Django-SHOP از این پکیج هم استفاده شده.
لینک:
https://pypi.org/project/django-sass-processor/

نمیدونید SASS چیه؟ این لینک یکم در موردش گفته و چندتا مثال هم داره
3🔥1
Forwarded from CodeCrafters (Behzad Azadi)
پروفایل کردن چیست؟؟؟

در طی طراحی یک برنامه همیشه این سوال برامون پیش میاد که کد و کوئری ما بهینه هست یا نه ،چقدر منابع مصرف میکنه(حافظه ، cpu ، i/o و ...) ،از لحاظ تایمینگ چطور ، و یا حتی تعداد کوئری‌هامون و ...

به این موضوع شکل گرفته در ذهن ما در دنیای مهندسی نرم افزار پروفایلینگ میگن

پروفایلینگ در توسعه نرم افزار به فرآیند تجزیه و تحلیل رفتاری زمان اجرای یک سیستم یا برنامه میگیم ،تا ازین طریق بتوان نقاط ضعف و مورد دار سیستم رو پیدا کنیم و در جهت بهبود اون اقدام به بازنویسی موارد مدنظرمون کنیم


انواع مختلف پروفایلینگ به دسته بندی های زیر تقسیم میشه
۱-پروفایلینگ زمان:
مقدار زمان صرف شده بخش‌های مختلف کد رو اندازه گیری میکنیم


۲-پروفایلینگ حافظه:
تحلیل نحوه استفاده از حافظه توسط یک برنامه (مدیریت ناکارآمد، مصرف غیر ضروری و ...)

۳-پروفایلینگ cpu:
نحوه استفاده از پردازنده، شناسایی عملیات‌های محدود به cpu و نقاطی که بهینه سازی شود


۴-پروفایلینگ i/o:
دسترسی به فایلها یا کوئری‌های دیتابیس،شناسایی نقاط محدود کننده و بهبود آن

۵-پروفایلینگ پوششی کد:
کدام بخش کد در طول یک جریان ،اجرا شدند کمک به تست و شناسایی کدام بخش کد اجرا نشده است


۶-پروفایلینگ فراخوانی تابع:
ردیابی فراوانی و مدت زمان فراخوانی تابع، درک سلسله مراتب فراخوانی و شناسایی توابع با تاثیر بالا
نکته قابل توجه:
پروفایلینگ نباید در دسترس غیر توسعه دهندگان قرار گیرد ،این رویکرد و ابزارهای آن تنها مورد استفاده تیم توسعه جهت شناسایی ضعف سیستم و کدها در جهت بهبود آن می باشد نه بیشتر
در فریمورک جنگو هم دو پکیج محبوب وجود دارد django-debug-toolbar و django-silk می باشد


خب بیاید django-silk رو پیکربندی و نصب کنیم


نصب
pip install django-silk
تنظیمات در settings.py
INSTALLED_APPS = [
...
'silk'
]


MIDDLEWARE = [
...
'silk.middleware.SilkyMiddleware',
]
در urls اصلی پروژه
from django.contrib import admin
from django.urls import path, include
from django.conf import settings


urlpatterns = [
path('admin/', admin.site.urls),
]

if settings.DEBUG:
urlpatterns += [path('silk/', include('silk.urls', namespace='silk'))]
در نهایت
python manage.py makemigrations

python manage.py migrate

python manage.py collectstatic

python manage.py runserver
حالا کافیه به مرورگر خود برید یکم داخل اپلیکیشن بگردید ویوهای مختلف رو ببینید و قسمت‌های مختلف برنامه رو بالا پایین کنید و در نهایت به آدرس
http://localhost:8000/silk
میتوانید خروجی پروفایلینگ کارهای مختلف و رفتارها رو ببینید

این پکیج امکانات بیشتری به شما میدهد که با خوندن صفحه گیت‌هاب اون میتونید بیشتر باهاش آشنا بشید

@code_crafters
👍15
Forwarded from سید فرندز / برنامه نویسی / هک و امنیت / تکنولوژی (Reza Amin)
#django
#python

Django Lifecycle


این پکیج چیه کاربردش چیه؟

تفاوت اصلی میان Django Lifecycle و سیگنال‌ها (Signals) در Django این است که Django Lifecycle یک رویکرد ساختارمندتر و اصولی‌تر را برای مدیریت چرخه عمر اجزا فراهم می‌کند. با استفاده از Django Lifecycle، شما می‌توانید کدهای مربوط به هر مرحله از چرخه عمر را به صورت مستقیم در کلاس‌های مدل یا دیگر اجزا تعریف کنید و این اجزا را به یک مدل متصل کنید. این اجازه را به شما می‌دهد که کدهای مربوط به هر مرحله را در یک مکان مرتبط و خوانا نگه دارید و از تفکیک بخش‌ها بهره‌مند شوید.

مثالی از این بخش:

به عنوان مثال، فرض کنید که می‌خواهید هر زمان که یک مدل از نوع Post ایجاد یا به‌روزرسانی می‌شود، یک عملیات خاصی انجام دهید. با استفاده از Django Lifecycle، می‌توانید این عملیات را به صورت مستقیم در مدل Post تعریف کنید، به عنوان مثال:

from django.db import models
from django_lifecycle import LifecycleModel, hook

class Post(LifecycleModel):
title = models.CharField(max_length=100)
content = models.TextField()

@hook(BEFORE_UPDATE, when="content", has_changed=True)
def update_history(cls, old_instance, instance, field_name):
History.objects.create(
post=instance,
old_content=old_instance.content,
new_content=instance.content
)


post = Post.objects.create(title="Title", content="Content")


post.content = "Updated Content"
post.save()


در این مثال، یک مدل به نام Post تعریف شده است که از کلاس LifecycleModel ارث‌بری کرده است. با استفاده از دکوراتور hook، یک عملیات update_history برای مدل تعریف شده است. این عملیات هر زمان که محتوای یک نمونه از مدل تغییر می‌کند، یک رکورد جدید به جدول History اضافه می‌کند که تاریخچه تغییرات محتوا را ثبت می‌کند.

اطلاعات بیشتر راجبش:

https://github.com/rsinger86/django-lifecycle

@SEYED_BAX
👍81👎1
✔️ سوال: best practice‌ها و ابزارات مورد نیاز برای توسعه یه بسته، لایبرری یا نرم‌افزار پایتونی چیه؟

ابزارهای زیادی واسه این‌کارا وجود داره که بر اساس تجربه و چیزی که از 80 درصد پروژه های معروف و بزرگ دیدم، سعی میکنم بهتریناش رو معرفی کنم:


Dependency Management System

برای مدیریت وابستگی های یک پروژه بزرگ (یا نسبتا بزرگ)، پیشنهاد میکنم از Poetry استفاده کنید، چون ابزار بسیار قدرتمندی هست، کار باهاش بسیار راحته (خیلی شبیه به Cargo در زبان Rust هست)، کامیونیتی بزرگی داره، به راحتی محیط dev و prod رو میتونید مدیریت کنید، مستندات بسیار خوب و روانی داره، در سریع ترین زمان ممکن میتونید پروژه رو در PyPI منتشر کنید و همچنین پروژه⁧های معروفی از جمله Rich (کتابخونه⁧ای که خود pip هم ازش برای رنگی کردن progress barها استفاده میکنه) از اون استفاده میکنن، که همین نشون میده چقدر کاربردی هست.
همچنین build و run هم توسط Poetry انجام میشه

- منابع آموزشی:

1. آشنایی و شروع به کار با Poetry
https://realpython.com/dependency-management-python-poetry/

2. جزیات عمیق درباره هر قابلیت و نحوه استفاده
https://python-poetry.org/docs

3. نحوه انتشار یک package پایتونی در PyPI به کمک Poetry
https://johnfraney.ca/blog/create-publish-python-package-poetry/


Linting & Type Checking

برای Linting ابزارهای flake8 و pylint از معروف ترین⁧ها هستن، هر یک رو میتونید شدت سخت گیریشون رو تنظیم کنید، به راحتی همراه با Poetry تنظیماتشون در یک فایل قرار میگیره و نیاز به نگه داشتن فایل⁧های متفاوت برای هر کدوم ندارید. به نظرم خود flake8 به تنهایی نیازتون رو برطرف میکنه. اگر از PyCharm استفاده کنید یک Linter به صورت Built-in در اختیارتون میذاره که خوبه و کارتون رو راه میندازه.

اگر عادت دارید کدهای خودتون رو Annotate کنید و زیاد از Type Hint ها استفاده میکنید، استفاده از MyPy به عنوان یک static type checker به شما کمک میکنه ایرادات موجود در کلاس ها، توابع و ... رو پیدا کنید و بتونید typeهای دقیق تری استفاده کنید. همچنین ابزار Pyright که توسط مایکروسافت توسعه داده میشه، در VSCode به صورت integrated با افزونه Pylance کار میکنه و اگر از VSCode استفاده میکنید پیشنهاد میکنم حتما افزونه Pylance رو نصب کنید. PyCharm هم یک Type Checker داره ولی هنوز توانمندی Pylance و MyPy رو نداره.


- منابع آموزشی:

1. داکیومنت Flake8
https://flake8.pycqa.org/en/latest/user/invocation.html

2. داکیومنت MyPy
https://mypy.readthedocs.io/en/stable/getting_started.html


Code Formatting

برای مرتب و organize کردن importها از isort استفاده کنید، هم به صورت CLI در دسترس هست و هم یک API داره که میتونید در کد پایتون استفاده کنید. یک code formatter بسیار معروف که در اکثر پروژه⁧ها استفاده میشه Black هست، زیر نظر PSF (یا Python Software Foundation) و برنامه نویسای با تجربه و کار کشته ای همچون آقای Łukasz Langa (ریلیس منیجر پایتون 3.9) توسعه داده میشه، با دیگر ابزار ها مثل isort سازگار هست، با PEP8 سازگاره و کلی قابلیت مزیت دیگه داره که حقیقتا اینجا جا نمیشن :)

- منابع آموزشی:

1. داکیومنت isort
https://pycqa.github.io/isort/

2. داکیومنت Black
https://black.readthedocs.io/en/stable/getting_started.html

3. یک ویدیو از PyCon 2019 درباره Black
https://youtu.be/esZLCuWs_2Y

* این ابزارها همگی داکیومنت ساده و خوانایی دارن و به نظرم بهترین منبع همین داکیومنت⁧هاشون هست.


Testing

دو کتابخونه Pytest و unittest (در stdlib موجود هست) در تست نویسی پروژه ها استفاده میشن، برای تست کردن پروژه در environmentهای متفاوت از ابزار tox استفاده میشه و باهاش میتونید در نسخه های متفاوتی از پایتون کدتون رو تست کنید.


- منابع آموزشی:

1. یک مقاله جامع درباره تست نویسی، انواع آن و روش⁧های مورد استفاده در پایتون
https://realpython.com/python-testing/

2. ویدیو درباره unittest در پایتون
- آقای ned batchelder:
https://m.youtube.com/watch?v=FxSsnHeWQBY
- آقای Corey Schafer:
https://www.youtube.com/watch?v=6tNS--WetLI


* همچنین اگر از Git در پروژه خودتون استفاده میکنید، پیشنهاد میکنم از pre-commit حتما استفاده کنید و تمام این ابزارهای گفته شده رو automate کنید تا در هربار commit کردن، قبل از اینکه commit انجام بشه، این ابزارها روی کدتون اجرا بشن و اگر اشکالی در کدتون وجود داره پیدا بشه و اون رو برطرف کنید و دوباره commit کنید.

وبسایت pre commit:
https://pre-commit.com/
6👍1🔥1
poetry.pdf
223.7 KB
برای یه پروژه برنامه نویسی قطعا مدیریت پکیج‌ها یکی از مهم‌ترین نکات و مواردی هست که باید بهش حواسمون باشه.

✔️فایل pdf رو مطالعه کنید.

مطلبی از لینکدین Mohammad Amin Amjadi
برای یه پروژه برنامه نویسی قطعا مدیریت پکیج‌ها یکی از مهم‌ترین نکات و مواردی هست که باید بهش حواسمون باشه.
اگر پکیج‌ها آپدیت نباشن می‌تونه باعث مشکلات امنیتی و ... بشه.
از اون طرف اگر مدیریت پکیج‌هامون نادرست باشه میتونه جلوی امکان بیلد پروژه رو هم بگیره حتی.


توی این پست سعی کردم برای پروژه‌های پایتونی نکاتی رو پیرامون pip بگم که چرا نباید ازش استفاده کنیم و در ادامه نحوه استفاده از poetry رو برای ستاپش، استفاده، dockerfile و pre-commit رو هم آوردم.

امیدوارم که مفید باشه.
👍72🔥1
Forwarded from سید فرندز / برنامه نویسی / هک و امنیت / تکنولوژی (Reza Amin)
#python
#django

Generic relations

جنریک ریلیشن در جنگو یک رابطه خاصی است که به شما اجازه می دهد یک رابطه (کلید خارجی) را با هر مدلی که در پروژه جنگویی خود نصب کرده اید برقرار کنید. وقتی شما می خواهید یک سیستمی را پیاده سازی کنید که بتواند با اشیای مختلفی ارتباط برقرار کند. ب
رای مثال، یک سیستم نظر دهی که بتواند نظرات را برای پست ها، پروفایل های کاربری، تصاویر و حتی نظرات دیگر ذخیره کند.

برای استفاده از generic relations در جنگو، شما باید از بسته contenttypes استفاده کنید که به شما اجازه می دهد از مدل ContentType استفاده کنید. این مدل اطلاعاتی درباره مدل های نصب شده در پروژه شما را ذخیره می کند و شما می توانید با استفاده از سه فیلد زیر یک رابطه عمومی با هر مدلی برقرار کنید:

یک فیلد ForeignKey که به مدل ContentType اشاره می کند (معمولا با نام content_type نامگذاری می شود).
یک فیلد PositiveIntegerField که کلید اصلی شیء مرتبط را ذخیره می کند (معمولا با نام object_id نامگذاری می شود).
یک فیلد GenericForeignKey که با استفاده از دو فیلد قبلی یک رابطه با شیء مرتبط ایجاد می کند (معمولا با نام content_object نامگذاری می شود).

مثلا فرض کنید ما یک مدل Comment داریم که می خواهیم بتواند به هر مدلی نظر دهد. ما می توانیم از generic relations برای این منظور استفاده کنیم:

from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType

class Comment(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
text = models.TextField()
date = models.DateTimeField(auto_now_add=True)

content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey()

خوب حالا اینطور می توانیم برای یک پست نظر ثبت کنیم :
post = Post.objects.get(pk=1) 

comment = Comment.objects.create(user=user, text="Nice post!", content_object=post)


اگر بخواهیم برای هر مدل دیگری هم که داریم مانند دوره آموزشی و مقاله یا هر مدل دیگری می توان از همین طریق نظر ثبت کرد .

@SEYED_BAX
👍6
Forwarded from Abolfazl 🤘
سلام دوستان عزیز
همراه شما هستم با یه موضوع زیبا و جذاب به نام دیزاین پترن یا الگوهای طراحی که امروزه تمام برنامه نویس ها و مهندسین نرم افزار باید بدوننش.

دیزاین پترن چیست؟
یه سری اشکالات رایج در برنامه نویسی و دیزاین وجود داشتن و دارن. اون اشکالات دائم تکرار میشن. حالا اگر ما بخوایم به شیوه code and fix مثل اون چیزی که تو مبانی برنامه نویسی میخوندیم بریم جلو بعد از مدتی کدمون کاملا بلا استفاده میشه . به بیان دیگه maintainability به شدت افت میکنه و کار کثیف در میاد.
جدا از اون، ما نیازه که قبل از پیاده سازی دیزاین رو انجام بدیم دیگه که بعد کدش رو بنویسیم.
رو این حساب کارکشته های حوزه برنامه نویسی اومدن برای حل این مشکلات اومدن و یه سری الگو پیشنهاد دادن.
یکی از مهمترین منابع کتاب GoF هست که خوندنش رو به همه عزیزان توصیه میکنم.

این ریپازیتوری گیتهاب رو چند مدت پیش ساختم برای پیاده سازی دیزاین پترن های پر استفاده بدون پیچیدگی خاص و بدون نیاز به درک زبان UML به زبان پایتون

https://github.com/abolfazl8131/python_design_patterns
👏5👍2🔥2
اگه میخواهید توی ادمین جنگو کلیدهای خارجی به صورت drop down نباشن از raw_id_fields استفاده کنید. یه آیکون جستجو کنار فیلد اضافه میکنه.

✔️سرعت لود صفحه بیشتر میشه. چون دیگه لازم نیست drop down لود بشه.
✔️توی فرم جدیدی که باز میشه میتونیم جستجو هم انجام بدیم.
👍236