جنگولرن
3.78K subscribers
287 photos
74 videos
31 files
554 links
آموزش Django و بستگان
Download Telegram
اگه میخواهید توی جنگو از 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
Forwarded from Python Hints
#تجربه

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

باعث شد یک چیزی رو مطمئن بشم؛ ۹۸٪ کتاب خواندن رو بلد نیستیم
البته حق هم داریم، دانشگاه و مدرسه و ... باعث و بانی این موضوع بوده و البته اینکه هیچ کس بهمون یاد نداد یا بهمون نگفت که داریم اشتباه می‌خونیم.

شخصاً این مشکل رو داشتم.

برای مثال: اول هفته با یکی از همکاران شرکت شروع به خواندن یک کتاب کردیم (بخش تحقیقات)
من دیروز کتاب رو تموم کردم و شروع کردم به کد زدن (با اینکه من جاهای دیگه هم کار می‌کنم) وقتی 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)
هست و بعد سعی میکنی همین رو درک کنی حالا اگر نویسنده کتاب زحمت کشیده ی مثال هم زده و شما بلد نیستی نباید برات مهم باشه

چون اون مثال میشه حاشیه برای شما؛ چون تو اصلا بکند دولوپر نیستی.
👍11
پکیج django-axes برای مدیریت و کنترل ورود به سیستم در جنگو

✔️امکاناتش:
-تعیین محدودیت برای تلاش‌های ورود ناموفق به سیستم
-قابلیت بلاک کردن آی‌پی‌های مشکوک و حمله‌ کننده 😂
-امکان تنظیم تعداد تلاش‌های ناموفق برای ورود به سیستم و زمان‌های مجاز برای تلاش مجدد
-قابلیت ارسال ایمیل هشدار به مدیر سیستم در صورت امنیت کاهش یافته
-امکان تنظیم و سفارشی‌سازی پیام خطا برای صفحه ورود به سیستم

خودم فقط یکم داکیومنتش رو خوندم و یه ویدئو هم ازش دیدم. ولی تست اش نکردم.
اگه تجربه استفاده ازش دارید کامنت کنید لطفا
👍16
Forwarded from Abolfazl 🤘
الگوی طراحی facade ( فِساد خونده میشه)

یکی از الگوهای بسیار پر کاربرد که برای کاهش کاپلینگ بین کلاس ها ( یا حتی sub system ها ) استفاده میشه.
به طور کلی ما زمانی از الگوی فساد استفاده میکنیم که کلاس های مختلفی داریم و میخوایم این کلاس ها از طریق یک کلاس دیگه بدون دسترسی مستقیم به هم اطلاعات رد و بدل کنن.
مثال : ما دو کلاس food و drink داریم و یک کلاسorder
واضحه که ما میخوایم غذا یا نوشیدنی یا هر دو رو به هر حال سفارش بدیم.
یه راه اشتباه استفاده مستقیم از از این دو کلاس داخل کلاس order هست.
اما یه راه درست اینه که کلاس order اطلاعی از داخل اون دو کلاس نداشته باشه. یعنی یک interface تعریف شه و کلاس order از طریق اون interface کارشو انجام بده.


مثال دوم یه مثال از ریپازیتوری گیتهاب خودمه که تا حد قابل توجهی حق مطلب رو ادا میکنه
👍5😁3👎1
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
👍108👎3
جنگولرن
سری مهندسی نرم‌افزار: پست 7 از لینکدین Saeed Shahrivari Joghan توسعه چابک نرم‌افزار: سرعت یا انطباق؟ حوالی سال ۲۰۰۱ میلادی تعدادی از افراد شناخته شده حوزه نرم‌افزار طی بیانیه‌ای اعلام کردند که به راه‌های بهتری برای توسعه نرم‌افزار نسبت به دهه ۹۰ میلادی رسیدند…
سری مهندسی نرم‌افزار: پست 8
از لینکدین 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
6👍1
تراکنش (Transaction) و ACID و درخواست‌های موازی

یکی از مفاهیم مهم #دیتابیس تراکنش‌ها یا همون Transactionها هستن. با کمک ACID بخصوص Atomicty و Isolation Level، ترنزکشن ها بهمون کمک میکنن چندین کوئری رو در قالب یک واحد به دیتابیس بدیم و به شکل موازی اجرا بشن تا در نهایت خروجی یکسان و Consistant داشته باشیم، بدون اینکه این وسط 100 هزار تومن پول یهو گم شه!
از کانال @MhrCode

https://youtu.be/lF8pheUpa6I
🔥3
قبل از مصاحبه Systems Design یاد بگیر: Eventual Consistency

فرض کنید یکی از آدمای معروف توی توییتر 10 میلیون فالوئر داشته باشه و بخواد همون که توییت زد، توییتش بره توی تایم لاین فالوئراش. اگه بخوایم این کارو همون موقع در لحظه انجام بدیم سیستممون crash میکنه یا اون آدم باید 10 دقیقه منتظر لودینگ ثبت توییت باشه! مفهوم Eventual Consistency یکی از مفاهیم مهم دنیای نرم افزار هست که توی مصاحبه های نرم افزاری زیاد در موردش سوال پرسیده میشه.

https://youtu.be/3j3g_mVGUc8
👍51
سلام. جنگولرن بیشتر چه مطالبی توی کانال بزاره؟
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
👍161