✅اگه میخواهید توی جنگو از Preprocessor ع SASS استفاده کنید.
تا بهتر بتونید کدهای css پروژه تون مدیریت کنید.
میتونید از پکیج django-sass-processor استفاده کنید.
توی فروشگاه اوپن سورس Django-SHOP از این پکیج هم استفاده شده.
لینک:
https://pypi.org/project/django-sass-processor/
❔نمیدونید 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 و ...) ،از لحاظ تایمینگ چطور ، و یا حتی تعداد کوئریهامون و ...
به این موضوع شکل گرفته در ذهن ما در دنیای مهندسی نرم افزار پروفایلینگ میگن
پروفایلینگ در توسعه نرم افزار به فرآیند تجزیه و تحلیل رفتاری زمان اجرای یک سیستم یا برنامه میگیم ،تا ازین طریق بتوان نقاط ضعف و مورد دار سیستم رو پیدا کنیم و در جهت بهبود اون اقدام به بازنویسی موارد مدنظرمون کنیم
انواع مختلف پروفایلینگ به دسته بندی های زیر تقسیم میشه
خب بیاید django-silk رو پیکربندی و نصب کنیم
نصب
این پکیج امکانات بیشتری به شما میدهد که با خوندن صفحه گیتهاب اون میتونید بیشتر باهاش آشنا بشید
@code_crafters
در طی طراحی یک برنامه همیشه این سوال برامون پیش میاد که کد و کوئری ما بهینه هست یا نه ،چقدر منابع مصرف میکنه(حافظه ، cpu ، i/o و ...) ،از لحاظ تایمینگ چطور ، و یا حتی تعداد کوئریهامون و ...
به این موضوع شکل گرفته در ذهن ما در دنیای مهندسی نرم افزار پروفایلینگ میگن
پروفایلینگ در توسعه نرم افزار به فرآیند تجزیه و تحلیل رفتاری زمان اجرای یک سیستم یا برنامه میگیم ،تا ازین طریق بتوان نقاط ضعف و مورد دار سیستم رو پیدا کنیم و در جهت بهبود اون اقدام به بازنویسی موارد مدنظرمون کنیم
انواع مختلف پروفایلینگ به دسته بندی های زیر تقسیم میشه
۱-پروفایلینگ زمان:نکته قابل توجه:
مقدار زمان صرف شده بخشهای مختلف کد رو اندازه گیری میکنیم
۲-پروفایلینگ حافظه:
تحلیل نحوه استفاده از حافظه توسط یک برنامه (مدیریت ناکارآمد، مصرف غیر ضروری و ...)
۳-پروفایلینگ cpu:
نحوه استفاده از پردازنده، شناسایی عملیاتهای محدود به cpu و نقاطی که بهینه سازی شود
۴-پروفایلینگ i/o:
دسترسی به فایلها یا کوئریهای دیتابیس،شناسایی نقاط محدود کننده و بهبود آن
۵-پروفایلینگ پوششی کد:
کدام بخش کد در طول یک جریان ،اجرا شدند کمک به تست و شناسایی کدام بخش کد اجرا نشده است
۶-پروفایلینگ فراخوانی تابع:
ردیابی فراوانی و مدت زمان فراخوانی تابع، درک سلسله مراتب فراخوانی و شناسایی توابع با تاثیر بالا
پروفایلینگ نباید در دسترس غیر توسعه دهندگان قرار گیرد ،این رویکرد و ابزارهای آن تنها مورد استفاده تیم توسعه جهت شناسایی ضعف سیستم و کدها در جهت بهبود آن می باشد نه بیشتردر فریمورک جنگو هم دو پکیج محبوب وجود دارد django-debug-toolbar و django-silk می باشد
خب بیاید django-silk رو پیکربندی و نصب کنیم
نصب
pip install django-silkتنظیمات در settings.py
INSTALLED_APPS = [در urls اصلی پروژه
...
'silk'
]
MIDDLEWARE = [
...
'silk.middleware.SilkyMiddleware',
]
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 تعریف کنید، به عنوان مثال:
در این مثال، یک مدل به نام Post تعریف شده است که از کلاس LifecycleModel ارثبری کرده است. با استفاده از دکوراتور hook، یک عملیات update_history برای مدل تعریف شده است. این عملیات هر زمان که محتوای یک نمونه از مدل تغییر میکند، یک رکورد جدید به جدول History اضافه میکند که تاریخچه تغییرات محتوا را ثبت میکند.
اطلاعات بیشتر راجبش:
https://github.com/rsinger86/django-lifecycle
@SEYED_BAX
#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
👍8❤1👎1
Forwarded from 🧑💻PythonDev🧑💻
✔️ سوال: best practiceها و ابزارات مورد نیاز برای توسعه یه بسته، لایبرری یا نرمافزار پایتونی چیه؟
ابزارهای زیادی واسه اینکارا وجود داره که بر اساس تجربه و چیزی که از 80 درصد پروژه های معروف و بزرگ دیدم، سعی میکنم بهتریناش رو معرفی کنم:
Dependency Management System
برای مدیریت وابستگی های یک پروژه بزرگ (یا نسبتا بزرگ)، پیشنهاد میکنم از
همچنین
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
برای
اگر عادت دارید کدهای خودتون رو
1. داکیومنت Flake8
https://flake8.pycqa.org/en/latest/user/invocation.html
2. داکیومنت MyPy
https://mypy.readthedocs.io/en/stable/getting_started.html
Code Formatting
برای مرتب و
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
دو کتابخونه
1. یک مقاله جامع درباره تست نویسی، انواع آن و روشهای مورد استفاده در پایتون
https://realpython.com/python-testing/
2. ویدیو درباره unittest در پایتون
https://m.youtube.com/watch?v=FxSsnHeWQBY
https://www.youtube.com/watch?v=6tNS--WetLI
* همچنین اگر از
وبسایت pre commit:
https://pre-commit.com/
ابزارهای زیادی واسه اینکارا وجود داره که بر اساس تجربه و چیزی که از 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/
GitHub
GitHub - Textualize/rich: Rich is a Python library for rich text and beautiful formatting in the terminal.
Rich is a Python library for rich text and beautiful formatting in the terminal. - Textualize/rich
❤6👍1🔥1
poetry.pdf
223.7 KB
✅برای یه پروژه برنامه نویسی قطعا مدیریت پکیجها یکی از مهمترین نکات و مواردی هست که باید بهش حواسمون باشه.
✔️فایل pdf رو مطالعه کنید.
مطلبی از لینکدین Mohammad Amin Amjadi
برای یه پروژه برنامه نویسی قطعا مدیریت پکیجها یکی از مهمترین نکات و مواردی هست که باید بهش حواسمون باشه.
اگر پکیجها آپدیت نباشن میتونه باعث مشکلات امنیتی و ... بشه.
از اون طرف اگر مدیریت پکیجهامون نادرست باشه میتونه جلوی امکان بیلد پروژه رو هم بگیره حتی.
توی این پست سعی کردم برای پروژههای پایتونی نکاتی رو پیرامون pip بگم که چرا نباید ازش استفاده کنیم و در ادامه نحوه استفاده از poetry رو برای ستاپش، استفاده، dockerfile و pre-commit رو هم آوردم.
امیدوارم که مفید باشه.
✔️فایل pdf رو مطالعه کنید.
مطلبی از لینکدین Mohammad Amin Amjadi
برای یه پروژه برنامه نویسی قطعا مدیریت پکیجها یکی از مهمترین نکات و مواردی هست که باید بهش حواسمون باشه.
اگر پکیجها آپدیت نباشن میتونه باعث مشکلات امنیتی و ... بشه.
از اون طرف اگر مدیریت پکیجهامون نادرست باشه میتونه جلوی امکان بیلد پروژه رو هم بگیره حتی.
توی این پست سعی کردم برای پروژههای پایتونی نکاتی رو پیرامون pip بگم که چرا نباید ازش استفاده کنیم و در ادامه نحوه استفاده از poetry رو برای ستاپش، استفاده، dockerfile و pre-commit رو هم آوردم.
امیدوارم که مفید باشه.
👍7❤2🔥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 برای این منظور استفاده کنیم:
خوب حالا اینطور می توانیم برای یک پست نظر ثبت کنیم :
اگر بخواهیم برای هر مدل دیگری هم که داریم مانند دوره آموزشی و مقاله یا هر مدل دیگری می توان از همین طریق نظر ثبت کرد .
@SEYED_BAX
#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
همراه شما هستم با یه موضوع زیبا و جذاب به نام دیزاین پترن یا الگوهای طراحی که امروزه تمام برنامه نویس ها و مهندسین نرم افزار باید بدوننش.
دیزاین پترن چیست؟
یه سری اشکالات رایج در برنامه نویسی و دیزاین وجود داشتن و دارن. اون اشکالات دائم تکرار میشن. حالا اگر ما بخوایم به شیوه code and fix مثل اون چیزی که تو مبانی برنامه نویسی میخوندیم بریم جلو بعد از مدتی کدمون کاملا بلا استفاده میشه . به بیان دیگه maintainability به شدت افت میکنه و کار کثیف در میاد.
جدا از اون، ما نیازه که قبل از پیاده سازی دیزاین رو انجام بدیم دیگه که بعد کدش رو بنویسیم.
رو این حساب کارکشته های حوزه برنامه نویسی اومدن برای حل این مشکلات اومدن و یه سری الگو پیشنهاد دادن.
یکی از مهمترین منابع کتاب GoF هست که خوندنش رو به همه عزیزان توصیه میکنم.
این ریپازیتوری گیتهاب رو چند مدت پیش ساختم برای پیاده سازی دیزاین پترن های پر استفاده بدون پیچیدگی خاص و بدون نیاز به درک زبان UML به زبان پایتون
https://github.com/abolfazl8131/python_design_patterns
👏5👍2🔥2
Forwarded from Python Hints
#تجربه
دوره کتابخوانی خودمون
کتاب خوانی با چندتا از همکارای شرکت
مقاله خوانی و ...
باعث شد یک چیزی رو مطمئن بشم؛ ۹۸٪ کتاب خواندن رو بلد نیستیم
البته حق هم داریم، دانشگاه و مدرسه و ... باعث و بانی این موضوع بوده و البته اینکه هیچ کس بهمون یاد نداد یا بهمون نگفت که داریم اشتباه میخونیم.
شخصاً این مشکل رو داشتم.
برای مثال: اول هفته با یکی از همکاران شرکت شروع به خواندن یک کتاب کردیم (بخش تحقیقات)
من دیروز کتاب رو تموم کردم و شروع کردم به کد زدن (با اینکه من جاهای دیگه هم کار میکنم) وقتی
خیلی ساده ببینید که آیا شما کتاب خواندن رو بلد هستید یا خیر، اگر مدل خواندن شما برای شرایط زیر فرق میکنه میشه امیدوار بود :
۱- خواندن برای آزمون تئوری (مثلاً LPIC)
۲- خواندن برای آزمون عملی (مثلاً RHCSA)
۳- خواندن برای یادگیری نکتهای (fluent python)
۴- خواندن برای یادگیری دقیق ( fastapi documentation )
اگر توی همه این موارد فرمول خواندن شما یکسان هست، اگر موقع خواندن (حتی دیجیتال) ورق و قلم بغل دستت نداری
متأسفانه باید بگم که شما کتاب خواندن درست رو بلد نیستید، و همین داره وقتتون رو میگیره یا شمارو خسته میکنه.
دوره کتابخوانی خودمون
کتاب خوانی با چندتا از همکارای شرکت
مقاله خوانی و ...
باعث شد یک چیزی رو مطمئن بشم؛ ۹۸٪ کتاب خواندن رو بلد نیستیم
البته حق هم داریم، دانشگاه و مدرسه و ... باعث و بانی این موضوع بوده و البته اینکه هیچ کس بهمون یاد نداد یا بهمون نگفت که داریم اشتباه میخونیم.
شخصاً این مشکل رو داشتم.
برای مثال: اول هفته با یکی از همکاران شرکت شروع به خواندن یک کتاب کردیم (بخش تحقیقات)
من دیروز کتاب رو تموم کردم و شروع کردم به کد زدن (با اینکه من جاهای دیگه هم کار میکنم) وقتی
pull request
زدم و درخواست peer review
دادم، بهم گفت که تازه ۱٫۳ کتاب رو خوانده.خیلی ساده ببینید که آیا شما کتاب خواندن رو بلد هستید یا خیر، اگر مدل خواندن شما برای شرایط زیر فرق میکنه میشه امیدوار بود :
۱- خواندن برای آزمون تئوری (مثلاً LPIC)
۲- خواندن برای آزمون عملی (مثلاً RHCSA)
۳- خواندن برای یادگیری نکتهای (fluent python)
۴- خواندن برای یادگیری دقیق ( fastapi documentation )
اگر توی همه این موارد فرمول خواندن شما یکسان هست، اگر موقع خواندن (حتی دیجیتال) ورق و قلم بغل دستت نداری
متأسفانه باید بگم که شما کتاب خواندن درست رو بلد نیستید، و همین داره وقتتون رو میگیره یا شمارو خسته میکنه.
👍13
Forwarded from Python Hints
روی این مورد از من راهکار خواستن (جلوتر مثال میزنم برای توضیح)
همین اول کار بگم یک فرمول ثابت برای همه وجود نداره هرکسی گفت وجود داره کلاش هست .اگر فرمولش ثابت بود؛ برای همه بچه مدرسهای ها و دانشجوها استفاده میکردن که همه بتونند به درستی از تمام ظرفیت هوش و استعدادشون استفاده کنند.
گفتند مشکل رو نشون دادن بدون راهحل فایده نداره.
من خودم گفتم؛ چندسال مسئله خودم این بود که اصلا نمیدونستم نحوه خوندم اشتباه هست؛ آدم وقتی به اشتباه پیمیبره تازه از اونجا دنبال راهکار میگرده
کدوم یک از شما تو کدی که باگ و مشکل نداره؛ دنبال تغییر الگوریتم هستید ؟ پس پیدا کردن مشکل خودش ۷۰-۸۰٪ رسیدن به راهحل هست.
درنهایت من با این مثال توضیج دادم؛ فکر کردم شاید مفید باشه هرچند یک جلسه لایو ویدئویی میتونست بهتر باشه :
مثلا:
فرض کن داکیومنت
FastAPI
رو داری میخونی؛ نمیری بشینی توضیح نحوه نوشته شدن
generator
رو بخونی؛ موارد مهم رو میخونی مثل get, post, route, authentication , ...
یعد میای میبینی نوشته
Async
و تو میدونی لازم داری توی تمام پروژههات مهم هست
چیکار میکنی از روی دامکیومنت Fastapi میخونی ؟
قطعا نه؛ میری یک کتاب یا یک دوره براش پیدا میکنی که هدفش فقط همین باشه
حالا فرض کن کتاب Async رو میخوای بخونی؛ توی ۳ فصل اول هم مقدمات پایتون هست
میشینی از اول بخونی ؟
نه فقط نگاه به سرفصل میکنی و اگر همرو میشناختی حذف میکنی و از فصل ۴ شروع میکنی
یک مثال دیگه کتاب fluent هست؛ این کتاب و کتابهای مشابه هر فصل یک هدفی داره
شاید داخل یک فصل اومده مثلا فریمورک django رو مثال زده
اینجا بر خلاف مثال قبلی
Async , FastAPI
شما نباید بری django رو بخونی اول به هدف فصل نگاه میکنی مثلا
mixin (multiple inheritance)
هست و بعد سعی میکنی همین رو درک کنی حالا اگر نویسنده کتاب زحمت کشیده ی مثال هم زده و شما بلد نیستی نباید برات مهم باشه
چون اون مثال میشه حاشیه برای شما؛ چون تو اصلا بکند دولوپر نیستی.
همین اول کار بگم یک فرمول ثابت برای همه وجود نداره هرکسی گفت وجود داره کلاش هست .اگر فرمولش ثابت بود؛ برای همه بچه مدرسهای ها و دانشجوها استفاده میکردن که همه بتونند به درستی از تمام ظرفیت هوش و استعدادشون استفاده کنند.
گفتند مشکل رو نشون دادن بدون راهحل فایده نداره.
من خودم گفتم؛ چندسال مسئله خودم این بود که اصلا نمیدونستم نحوه خوندم اشتباه هست؛ آدم وقتی به اشتباه پیمیبره تازه از اونجا دنبال راهکار میگرده
کدوم یک از شما تو کدی که باگ و مشکل نداره؛ دنبال تغییر الگوریتم هستید ؟ پس پیدا کردن مشکل خودش ۷۰-۸۰٪ رسیدن به راهحل هست.
درنهایت من با این مثال توضیج دادم؛ فکر کردم شاید مفید باشه هرچند یک جلسه لایو ویدئویی میتونست بهتر باشه :
مثلا:
فرض کن داکیومنت
FastAPI
رو داری میخونی؛ نمیری بشینی توضیح نحوه نوشته شدن
generator
رو بخونی؛ موارد مهم رو میخونی مثل get, post, route, authentication , ...
یعد میای میبینی نوشته
Async
و تو میدونی لازم داری توی تمام پروژههات مهم هست
چیکار میکنی از روی دامکیومنت Fastapi میخونی ؟
قطعا نه؛ میری یک کتاب یا یک دوره براش پیدا میکنی که هدفش فقط همین باشه
حالا فرض کن کتاب Async رو میخوای بخونی؛ توی ۳ فصل اول هم مقدمات پایتون هست
میشینی از اول بخونی ؟
نه فقط نگاه به سرفصل میکنی و اگر همرو میشناختی حذف میکنی و از فصل ۴ شروع میکنی
یک مثال دیگه کتاب fluent هست؛ این کتاب و کتابهای مشابه هر فصل یک هدفی داره
شاید داخل یک فصل اومده مثلا فریمورک django رو مثال زده
اینجا بر خلاف مثال قبلی
Async , FastAPI
شما نباید بری django رو بخونی اول به هدف فصل نگاه میکنی مثلا
mixin (multiple inheritance)
هست و بعد سعی میکنی همین رو درک کنی حالا اگر نویسنده کتاب زحمت کشیده ی مثال هم زده و شما بلد نیستی نباید برات مهم باشه
چون اون مثال میشه حاشیه برای شما؛ چون تو اصلا بکند دولوپر نیستی.
👍11
✅پکیج django-axes برای مدیریت و کنترل ورود به سیستم در جنگو
✔️امکاناتش:
-تعیین محدودیت برای تلاشهای ورود ناموفق به سیستم
-قابلیت بلاک کردن آیپیهای مشکوک و حمله کننده 😂
-امکان تنظیم تعداد تلاشهای ناموفق برای ورود به سیستم و زمانهای مجاز برای تلاش مجدد
-قابلیت ارسال ایمیل هشدار به مدیر سیستم در صورت امنیت کاهش یافته
-امکان تنظیم و سفارشیسازی پیام خطا برای صفحه ورود به سیستم
خودم فقط یکم داکیومنتش رو خوندم و یه ویدئو هم ازش دیدم. ولی تست اش نکردم.
اگه تجربه استفاده ازش دارید کامنت کنید لطفا
✔️امکاناتش:
-تعیین محدودیت برای تلاشهای ورود ناموفق به سیستم
-قابلیت بلاک کردن آیپیهای مشکوک و حمله کننده 😂
-امکان تنظیم تعداد تلاشهای ناموفق برای ورود به سیستم و زمانهای مجاز برای تلاش مجدد
-قابلیت ارسال ایمیل هشدار به مدیر سیستم در صورت امنیت کاهش یافته
-امکان تنظیم و سفارشیسازی پیام خطا برای صفحه ورود به سیستم
خودم فقط یکم داکیومنتش رو خوندم و یه ویدئو هم ازش دیدم. ولی تست اش نکردم.
اگه تجربه استفاده ازش دارید کامنت کنید لطفا
👍16
Forwarded from Abolfazl 🤘
الگوی طراحی facade ( فِساد خونده میشه)
یکی از الگوهای بسیار پر کاربرد که برای کاهش کاپلینگ بین کلاس ها ( یا حتی sub system ها ) استفاده میشه.
به طور کلی ما زمانی از الگوی فساد استفاده میکنیم که کلاس های مختلفی داریم و میخوایم این کلاس ها از طریق یک کلاس دیگه بدون دسترسی مستقیم به هم اطلاعات رد و بدل کنن.
مثال : ما دو کلاس food و drink داریم و یک کلاسorder
واضحه که ما میخوایم غذا یا نوشیدنی یا هر دو رو به هر حال سفارش بدیم.
یه راه اشتباه استفاده مستقیم از از این دو کلاس داخل کلاس order هست.
اما یه راه درست اینه که کلاس order اطلاعی از داخل اون دو کلاس نداشته باشه. یعنی یک interface تعریف شه و کلاس order از طریق اون interface کارشو انجام بده.
مثال دوم یه مثال از ریپازیتوری گیتهاب خودمه که تا حد قابل توجهی حق مطلب رو ادا میکنه
یکی از الگوهای بسیار پر کاربرد که برای کاهش کاپلینگ بین کلاس ها ( یا حتی sub system ها ) استفاده میشه.
به طور کلی ما زمانی از الگوی فساد استفاده میکنیم که کلاس های مختلفی داریم و میخوایم این کلاس ها از طریق یک کلاس دیگه بدون دسترسی مستقیم به هم اطلاعات رد و بدل کنن.
مثال : ما دو کلاس food و drink داریم و یک کلاسorder
واضحه که ما میخوایم غذا یا نوشیدنی یا هر دو رو به هر حال سفارش بدیم.
یه راه اشتباه استفاده مستقیم از از این دو کلاس داخل کلاس order هست.
اما یه راه درست اینه که کلاس order اطلاعی از داخل اون دو کلاس نداشته باشه. یعنی یک interface تعریف شه و کلاس order از طریق اون interface کارشو انجام بده.
مثال دوم یه مثال از ریپازیتوری گیتهاب خودمه که تا حد قابل توجهی حق مطلب رو ادا میکنه
👍5😁3👎1
جنگولرن
الگوی طراحی facade ( فِساد خونده میشه) یکی از الگوهای بسیار پر کاربرد که برای کاهش کاپلینگ بین کلاس ها ( یا حتی sub system ها ) استفاده میشه. به طور کلی ما زمانی از الگوی فساد استفاده میکنیم که کلاس های مختلفی داریم و میخوایم این کلاس ها از طریق یک کلاس دیگه…
✅بقیه توضیحاتش رو از کانال @tobecomesoftwareengineer بخونید 😁
لینک بقیه اش:
https://t.me/tobecomesoftwareengineer/89
https://t.me/tobecomesoftwareengineer/90
لینک بقیه اش:
https://t.me/tobecomesoftwareengineer/89
https://t.me/tobecomesoftwareengineer/90
👍2
Forwarded from سید فرندز / برنامه نویسی / هک و امنیت / تکنولوژی (SeYeD.Dev)
آموزش برنامهنویسی از صفر تا بینهایت به صورت کاملا رایگان، در این دوره قصد داریم هر آنچه که در بازار کار نیاز است را به شما آموزش دهیم. هدف این دوره، تبدیل شدن به یک برنامهنویس فول استک است.
مرحله ۱: مبانی و زبانهای برنامهنویسی
1. مقدمه به برنامهنویسی
2. زبان برنامهنویسی پایتون
3. زبان برنامهنویسی جاوا اسکریپت
4. مفاهیم برنامهنویسی شیگرا
مرحله ۲: توسعه وب و فریمورکها
5. فریمورک Django
6. فریمورک FastAPI
7. فریمورک VueJS
8. فریمورک gRPC
9. استفاده از بوتاسترپ، HTML، CSS و فریمورکهای CSS معتبر
مرحله ۳: دیتابیس
10. دیتابیس SQL
11. دیتابیس MongoDB
12. آشنایی با دیتابیس Neo4J
13. استفاده از ردیس، ربیت ام کیو، سلری
مرحله ۴: تکنولوژیهای متنوع
14. مفاهیم داکر
15. آشنایی با لینوکس
16. اجرای دیپلویمنت خودکار و CI/CD
مرحله ۵: امنیت و تستها
17. تکنیکهای تست نویسی
18. استفاده از گیت
19. مفاهیم امنیت در وب
مرحله ۶: مفاهیم پیشرفته
20. مفاهیم مالتیتردینگ و مالتیپروسسینگ و Async
21. آشنایی با معماری میکروسرویس
مرحله ۷: مهارتهای مساعدتی
22. آموزش ساخت رزومه
23. راهنمایی در مسیر کاریابی
24. فرایندهای توسعه نرمافزار Agile/Scrum
روش ارائه:
- کلاسها به صورت لایو در دیسکورد برگزار خواهند شد.
- کلاسها به صورت شبانه ارائه خواهند شد.
زمان شروع و مدت دوره:
- شروع دوره از پس از تعطیلات نوروز و تا حدود ۶ ماه به طول خواهد انجامید.
مدرس دوره:
- سید و همکاران ایشان افتخار دارند این دوره را برگزار نمایند.
کانال تلگرام سید و رفقا:
زمان دقیق شروع دوره و لینک دیسکورد در کانال سید و رفقا اطلاع رسانی داده خواهد شد
https://t.me/seyed_bax
مرحله ۱: مبانی و زبانهای برنامهنویسی
1. مقدمه به برنامهنویسی
2. زبان برنامهنویسی پایتون
3. زبان برنامهنویسی جاوا اسکریپت
4. مفاهیم برنامهنویسی شیگرا
مرحله ۲: توسعه وب و فریمورکها
5. فریمورک Django
6. فریمورک FastAPI
7. فریمورک VueJS
8. فریمورک gRPC
9. استفاده از بوتاسترپ، HTML، CSS و فریمورکهای CSS معتبر
مرحله ۳: دیتابیس
10. دیتابیس SQL
11. دیتابیس MongoDB
12. آشنایی با دیتابیس Neo4J
13. استفاده از ردیس، ربیت ام کیو، سلری
مرحله ۴: تکنولوژیهای متنوع
14. مفاهیم داکر
15. آشنایی با لینوکس
16. اجرای دیپلویمنت خودکار و CI/CD
مرحله ۵: امنیت و تستها
17. تکنیکهای تست نویسی
18. استفاده از گیت
19. مفاهیم امنیت در وب
مرحله ۶: مفاهیم پیشرفته
20. مفاهیم مالتیتردینگ و مالتیپروسسینگ و Async
21. آشنایی با معماری میکروسرویس
مرحله ۷: مهارتهای مساعدتی
22. آموزش ساخت رزومه
23. راهنمایی در مسیر کاریابی
24. فرایندهای توسعه نرمافزار Agile/Scrum
روش ارائه:
- کلاسها به صورت لایو در دیسکورد برگزار خواهند شد.
- کلاسها به صورت شبانه ارائه خواهند شد.
زمان شروع و مدت دوره:
- شروع دوره از پس از تعطیلات نوروز و تا حدود ۶ ماه به طول خواهد انجامید.
مدرس دوره:
- سید و همکاران ایشان افتخار دارند این دوره را برگزار نمایند.
کانال تلگرام سید و رفقا:
زمان دقیق شروع دوره و لینک دیسکورد در کانال سید و رفقا اطلاع رسانی داده خواهد شد
https://t.me/seyed_bax
👍10❤8👎3
جنگولرن
✅سری مهندسی نرمافزار: پست 7 از لینکدین Saeed Shahrivari Joghan توسعه چابک نرمافزار: سرعت یا انطباق؟ حوالی سال ۲۰۰۱ میلادی تعدادی از افراد شناخته شده حوزه نرمافزار طی بیانیهای اعلام کردند که به راههای بهتری برای توسعه نرمافزار نسبت به دهه ۹۰ میلادی رسیدند…
سری مهندسی نرمافزار: پست 8
از لینکدین Saeed Shahrivari Joghan
تکنکیکهای چابک برای هضم کردن تغییرات
در پست قبلی خدمتتون عرض کردم که شاید مهمترین هدف چابکی embraceکردن تغییرات باشه. در این پست میخوام مقداری راجع به تکنیکهایی که چابکی در این راستا داره صحبت کنم:
1️⃣ فرآیند تکرارشونده (Iterative) و افزایشی (Incremental): خب هر دوی این ویژگیها در یه فرآیند به معنی تدریجی بودنه اما چه فرقی با هم دارند؟ فرض کنیم میخوایم تصویر یه اسب رو نقاشی کنیم. فرآیند تکرارشونده یعنی همون روشی که در سیاه قلم استفاده میشه یعنی در اوایل کار شاکله کلی اسب رو میکشیم و بعد در چند راند به مرور جزییات رو اضافه میکنیم پس در واقع به تدریج کیفیت نقاشی کل اسب بیشتر میشه تا کار تموم بشه. اما در حالت افزایشی این مدلیه که مثلا اول سر اسب رو به صورت کامل میکشیم بعد میریم سراغ پاهاش و همینجوری همه قسمتها رو تکمیل میکنیم تا کل اسب تموم بشه. خب بدیهیه که در طی یک فرآیند تولید میشه هر دو حالت رو با هم داشت یعنی هم تکرارشونده بود و هم افزایشی. معمولا در فرآیندهای توسعه چابک طی تکرارهای (Iteration) متوالی ولی نسبتا کوتاه، ما پروژه رو تکمیل میکنیم و ممکنه در هر تکرار فیچرهای جدیدی اضافه کنیم و در کنارش کیفیت فیچرهای قبلی رو هم بهتر کنیم. معمولا خیلی خوبه که در پایان هر تکرار یه نسخه از نرمافزار (ولو ناقص) منتشر بشه که کار میکنه. که به اینکار میگن انتشار (release). ترکیب این دو حالت در کنار تکرارهای کوتاه باعث میشه که ما راحتتر بتونیم تغییرات رو در پروژه هضم کنیم. توجه داشته باشید که معمولاً در یک تکرار ما تمام مراحل تولید مثل تحلیل، طراحی، توسعه و ... رو داریم.
2️⃣ فیدبک مستمر مشتری و تیم تولیدکننده: وقتی فرآیند به صورت تکرارشونده بره جلو در پایان هر تکرار فرصت داریم تا فیدبک خوبی از مشتری و حتی تیم تولیدکننده راجع به خروجی بگیریم. این به تولیدکننده و حتی مشتری کمک خیلی خوبی میکنه که نیازمندیهاش رو به درستی متوجه بشه و در مقابل به تیم توسعه هم انتقال بده.
3️⃣ شکست سریع (fast fail): در روشهای چابک اعتقاد زیادی به شکست سریع وجود داره. به عبارتی به جای اینکه که کلی برنامهریزی و تفکر عمیق انجام بدیم که راه درست و نادرست رو تشخیص بدیم، فرآیندهای چابک ما رو تشویق میکنند که مقداری از مسیر رو بریم و اگه دیدیم جواب نمیده زود شکست بخوریم و مسیر رو اصلاح بکنیم. اغلب مواقع همین شکستها هستند که حدود مساله و مسیر بهینه رو به ما نشون میدند.
موارد بیشتری هم از تکنیکهای مشترک در روشهای اجایل میشه ذکر کرد ولی به نظر من این سه تکنیک مشترک خیلی موثر هستند که اساس همگی بر پایه برداشتن «گامهای کوچک و تدریجی» و «داشتن فیدبک» هست.
از لینکدین Saeed Shahrivari Joghan
تکنکیکهای چابک برای هضم کردن تغییرات
در پست قبلی خدمتتون عرض کردم که شاید مهمترین هدف چابکی embraceکردن تغییرات باشه. در این پست میخوام مقداری راجع به تکنیکهایی که چابکی در این راستا داره صحبت کنم:
1️⃣ فرآیند تکرارشونده (Iterative) و افزایشی (Incremental): خب هر دوی این ویژگیها در یه فرآیند به معنی تدریجی بودنه اما چه فرقی با هم دارند؟ فرض کنیم میخوایم تصویر یه اسب رو نقاشی کنیم. فرآیند تکرارشونده یعنی همون روشی که در سیاه قلم استفاده میشه یعنی در اوایل کار شاکله کلی اسب رو میکشیم و بعد در چند راند به مرور جزییات رو اضافه میکنیم پس در واقع به تدریج کیفیت نقاشی کل اسب بیشتر میشه تا کار تموم بشه. اما در حالت افزایشی این مدلیه که مثلا اول سر اسب رو به صورت کامل میکشیم بعد میریم سراغ پاهاش و همینجوری همه قسمتها رو تکمیل میکنیم تا کل اسب تموم بشه. خب بدیهیه که در طی یک فرآیند تولید میشه هر دو حالت رو با هم داشت یعنی هم تکرارشونده بود و هم افزایشی. معمولا در فرآیندهای توسعه چابک طی تکرارهای (Iteration) متوالی ولی نسبتا کوتاه، ما پروژه رو تکمیل میکنیم و ممکنه در هر تکرار فیچرهای جدیدی اضافه کنیم و در کنارش کیفیت فیچرهای قبلی رو هم بهتر کنیم. معمولا خیلی خوبه که در پایان هر تکرار یه نسخه از نرمافزار (ولو ناقص) منتشر بشه که کار میکنه. که به اینکار میگن انتشار (release). ترکیب این دو حالت در کنار تکرارهای کوتاه باعث میشه که ما راحتتر بتونیم تغییرات رو در پروژه هضم کنیم. توجه داشته باشید که معمولاً در یک تکرار ما تمام مراحل تولید مثل تحلیل، طراحی، توسعه و ... رو داریم.
2️⃣ فیدبک مستمر مشتری و تیم تولیدکننده: وقتی فرآیند به صورت تکرارشونده بره جلو در پایان هر تکرار فرصت داریم تا فیدبک خوبی از مشتری و حتی تیم تولیدکننده راجع به خروجی بگیریم. این به تولیدکننده و حتی مشتری کمک خیلی خوبی میکنه که نیازمندیهاش رو به درستی متوجه بشه و در مقابل به تیم توسعه هم انتقال بده.
3️⃣ شکست سریع (fast fail): در روشهای چابک اعتقاد زیادی به شکست سریع وجود داره. به عبارتی به جای اینکه که کلی برنامهریزی و تفکر عمیق انجام بدیم که راه درست و نادرست رو تشخیص بدیم، فرآیندهای چابک ما رو تشویق میکنند که مقداری از مسیر رو بریم و اگه دیدیم جواب نمیده زود شکست بخوریم و مسیر رو اصلاح بکنیم. اغلب مواقع همین شکستها هستند که حدود مساله و مسیر بهینه رو به ما نشون میدند.
موارد بیشتری هم از تکنیکهای مشترک در روشهای اجایل میشه ذکر کرد ولی به نظر من این سه تکنیک مشترک خیلی موثر هستند که اساس همگی بر پایه برداشتن «گامهای کوچک و تدریجی» و «داشتن فیدبک» هست.
❤3👍2
جنگولرن
poetry.pdf
amjadi_precommit.pdf
4.1 MB
✅مطلبی از لینکدین Mohammad Amin Amjadi در رابطه با pre-commit
هر چقدر حجم کد بیشتر بشه یا تیم بزرگتر
بشه چالش و دغدغهها بیشتر هم میشن و ریوو کردن کد هم خودش به چالشی بزرگتر تبدیل
میشه که روز به روز تایم بیشتری میگیره و از طرفی احتمال از قلم افتادن توافقها،
نکات و اصول هم بیشتر میشه.
اینجاست که pre-commit به دادمون میرسه. در این پست در ابتدا سعی میکنم برخی از نکات و مواردی که خودم در تیمها سعی میکردم رعایت کنم رو مطرح کنم [امیدوارم خودشون مفید و آموزنده باشن] و در نهایت به نحوه ستاپ و نوشتن pre-commit میپردازم و اشارهای به pre-push در یه مثال کاربردی و مورد نیاز و همین طور جاب qa میکنم.
تعداد اسلایدها خیلی زیاد شد و خیلی نکات قطعا از قلم افتادن و جای بهبود خیلی زیاد هست. ممنون میشم هر سوال و نکته و پیشنهادی داشتین بگین حتما و به اشتراک بذارین که بقیه هم استفاده کنن.
#git #gtilab #pre_commit #pre_push #python #django
هر چقدر حجم کد بیشتر بشه یا تیم بزرگتر
بشه چالش و دغدغهها بیشتر هم میشن و ریوو کردن کد هم خودش به چالشی بزرگتر تبدیل
میشه که روز به روز تایم بیشتری میگیره و از طرفی احتمال از قلم افتادن توافقها،
نکات و اصول هم بیشتر میشه.
اینجاست که pre-commit به دادمون میرسه. در این پست در ابتدا سعی میکنم برخی از نکات و مواردی که خودم در تیمها سعی میکردم رعایت کنم رو مطرح کنم [امیدوارم خودشون مفید و آموزنده باشن] و در نهایت به نحوه ستاپ و نوشتن pre-commit میپردازم و اشارهای به pre-push در یه مثال کاربردی و مورد نیاز و همین طور جاب qa میکنم.
تعداد اسلایدها خیلی زیاد شد و خیلی نکات قطعا از قلم افتادن و جای بهبود خیلی زیاد هست. ممنون میشم هر سوال و نکته و پیشنهادی داشتین بگین حتما و به اشتراک بذارین که بقیه هم استفاده کنن.
#git #gtilab #pre_commit #pre_push #python #django
❤6👍1
✅تراکنش (Transaction) و ACID و درخواستهای موازی
یکی از مفاهیم مهم #دیتابیس تراکنشها یا همون Transactionها هستن. با کمک ACID بخصوص Atomicty و Isolation Level، ترنزکشن ها بهمون کمک میکنن چندین کوئری رو در قالب یک واحد به دیتابیس بدیم و به شکل موازی اجرا بشن تا در نهایت خروجی یکسان و Consistant داشته باشیم، بدون اینکه این وسط 100 هزار تومن پول یهو گم شه!
از کانال @MhrCode
https://youtu.be/lF8pheUpa6I
یکی از مفاهیم مهم #دیتابیس تراکنشها یا همون Transactionها هستن. با کمک ACID بخصوص Atomicty و Isolation Level، ترنزکشن ها بهمون کمک میکنن چندین کوئری رو در قالب یک واحد به دیتابیس بدیم و به شکل موازی اجرا بشن تا در نهایت خروجی یکسان و Consistant داشته باشیم، بدون اینکه این وسط 100 هزار تومن پول یهو گم شه!
از کانال @MhrCode
https://youtu.be/lF8pheUpa6I
YouTube
دوره دیتابیس: تراکنش (Transaction) و ACID و درخواستهای موازی
یکی از مفاهیم مهم #دیتابیس تراکنشها یا همون Transactionها هستن. با کمک ACID بخصوص Atomicty و Isolation Level، ترنزکشن ها بهمون کمک میکنن چندین کوئری رو در قالب یک واحد به دیتابیس بدیم و به شکل موازی اجرا بشن تا در نهایت خروجی یکسان و Consistant داشته باشیم،…
🔥3
Forwarded from MHRCODE | برنامهنویسی با طعم توتفرنگی (Mohammad Hoseini Rad)
قبل از مصاحبه Systems Design یاد بگیر: Eventual Consistency ⏰
فرض کنید یکی از آدمای معروف توی توییتر 10 میلیون فالوئر داشته باشه و بخواد همون که توییت زد، توییتش بره توی تایم لاین فالوئراش. اگه بخوایم این کارو همون موقع در لحظه انجام بدیم سیستممون crash میکنه یا اون آدم باید 10 دقیقه منتظر لودینگ ثبت توییت باشه! مفهوم Eventual Consistency یکی از مفاهیم مهم دنیای نرم افزار هست که توی مصاحبه های نرم افزاری زیاد در موردش سوال پرسیده میشه.
https://youtu.be/3j3g_mVGUc8
فرض کنید یکی از آدمای معروف توی توییتر 10 میلیون فالوئر داشته باشه و بخواد همون که توییت زد، توییتش بره توی تایم لاین فالوئراش. اگه بخوایم این کارو همون موقع در لحظه انجام بدیم سیستممون crash میکنه یا اون آدم باید 10 دقیقه منتظر لودینگ ثبت توییت باشه! مفهوم Eventual Consistency یکی از مفاهیم مهم دنیای نرم افزار هست که توی مصاحبه های نرم افزاری زیاد در موردش سوال پرسیده میشه.
https://youtu.be/3j3g_mVGUc8
YouTube
قبل از مصاحبه Systems Design یاد بگیر: Eventual Consistency ⏰
فرض کنید یکی از آدمای معروف توی توییتر 10 میلیون فالوئر داشته باشه و بخواد همون که توییت زد، توییتش بره توی تایم لاین فالوئراش. اگه بخوایم این کارو همون موقع در لحظه انجام بدیم سیستممون crash میکنه یا اون آدم باید 10 دقیقه منتظر لودینگ ثبت توییت باشه! مفهوم…
👍5❤1
سلام. جنگولرن بیشتر چه مطالبی توی کانال بزاره؟
Anonymous Poll
16%
همین فرمون خوبه
56%
اختصاصی جنگو
18%
مهندسی نرم افزار
9%
سیستم دیزاین
👍9
ali_oauth2.pdf
644.1 KB
✅احراز هویت با oauth2 سرویس google در فریمورک جنگو
از علی بیگدلی
در پروژه های متفاوت بر حسب نیاز ممکن است بخواهید از مدل های مختلفی از پیاده سازی authentication و authorization استفاده نمایید که یکی از این روش ها استفاده از احراز با سرویس هایی همچون google و github و غیره است. اما معمولا دیده میشه به خاطر همچین ارتباط ساده ای دست به دامن ماژول های زیادی میشیم و به این نتیجه رسیدم که یکم این موضوع رو مختصر تر بهتون نشون بده.
در این اسلاید به نحوه پیاده سازی احراز هویت با استفاده از سرویس oauth2 google می پردازیم.
مسیر هایی که طی میشود:
- کلاس abstract برای پیاده سازی oauth2 سرویس دهنده ها
- ساخت google client مطابق با کلاس مادر
- اضافه کردن آدرس url مربوط به login و callback
- ساخت view ها برای ارسال درخواست به google و همچنین callback برای دریافت اطلاعات کاربری
برای استفاده از اسکریپت ها می تونین به لینک gist های من به آدرس زیر مراجعه کنین.
https://gist.github.com/AliBigdeli
از علی بیگدلی
در پروژه های متفاوت بر حسب نیاز ممکن است بخواهید از مدل های مختلفی از پیاده سازی authentication و authorization استفاده نمایید که یکی از این روش ها استفاده از احراز با سرویس هایی همچون google و github و غیره است. اما معمولا دیده میشه به خاطر همچین ارتباط ساده ای دست به دامن ماژول های زیادی میشیم و به این نتیجه رسیدم که یکم این موضوع رو مختصر تر بهتون نشون بده.
در این اسلاید به نحوه پیاده سازی احراز هویت با استفاده از سرویس oauth2 google می پردازیم.
مسیر هایی که طی میشود:
- کلاس abstract برای پیاده سازی oauth2 سرویس دهنده ها
- ساخت google client مطابق با کلاس مادر
- اضافه کردن آدرس url مربوط به login و callback
- ساخت view ها برای ارسال درخواست به google و همچنین callback برای دریافت اطلاعات کاربری
برای استفاده از اسکریپت ها می تونین به لینک gist های من به آدرس زیر مراجعه کنین.
https://gist.github.com/AliBigdeli
👍16❤1