CodeCrafters
773 subscribers
90 photos
50 videos
42 files
170 links
Download Telegram
وب سایت کانال https://codecrafters.ir

لیست هشتک‌ها در کانال رو در زیر براتون خواهم گذاشت و آپدیت خواهد شد


#design_patterns الگوهای طراحی

#postgresql پستگرس

#k8s کوبرنتیز

#agile اجایل
#scrum

#algorithm الگوریتم

#video

#meeting متینگ‌

#principles اصول کدنویسی

#project_managment_system مدیریت تیم

#free خارج از مبحث کامپیوتر


#app برنامه‌های کاربردی

#Git #actions مباحث مربوط به گیت و گیتلب

#conda #env کار با

#Docker مباحث مربوط به داکر

#AI #ML مباحث هوش مصنوعی

#book معرفی کتاب

#monitoring بررسی وضعیت سیستم و کد

#concurrency همزمانی کتاب grokking concurrency


#blovkchain #web3

#DDD #domain_driven_design

#BDD #behavior_driven_development

#soa #sso #microservice


@Code_Crafters

Git Hub:
https://github.com/CodeCrafters-ir/
👍1
چرا conda استفاده کنیم؟؟؟


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

conda create -n MyENV python=3.8
دوم اینکه محیطی که براتون میسازه رو داخل home شما و در دایرکتوری مخصوص خودش میسازه و نه در مسیر جاری شما خب این مزیتش این هست که شما راحت هرجا باشید میتونید ۱-سریع فعال و ۲-غیرفعال و یا محیط خودتون رو تغییر بدید و یا بدون دغدغه نسبت به محل قرارگیریش محیط جدید بسازید و ۳-حذف هم کنید و بین محیط‌های مختلف راحت سویچ کنید

1- conda activate my_env

2- conda deactivate

3- conda env remove -n MyENV
مورد بعدی هم اینکه:
۱-نصب پکیج هم داخلش راحته
۲-و علاوه بر خودش میتونید از pip هم استفاده کنید
۳- همچنین بروز رسانی پکیج
1- conda install PackName

2- pip install PackName

3- conda update PackName
۱-لیست پکیج‌های نصب شده رو هم میتونید ببینید
۲-و یا یک فایل حاوی ادرس‌های آن جهت نصب بسازید
۳-و یا بصورت yaml براتون قرار میده که از دو بخش تشکیل شده پکیج‌هایی که خودش نصب کرده و پکیج‌هایی که با pip نصب شده

1- conda list

2- conda list --explicit

3- conda env export > requirements.yml
که بالطبع میتونید اون رو هم در یک محیط دیگه نصب کنید
conda create -f requirements.yml

conda create -n MyENV -f requirements.yml
گفتیم همه محیط‌ها رو در یک مسیر قرار میده که با دستور زیر هم میتونید لیست همه محیط هاتون رو ببینید

conda env list
۱- اگه بخواید یک‌محیط رو‌حذف کنید ۲-یا یک پکیج رو حذف کنید
1- conda env remove -n MyENV --all

2- conda remove PackName
برای دیدن اطلاعات مربوط به محیط تون
conda info
جهت تست و بررسی سلامت محیط
conda doctor
جهت تغییر نام محیط با شرط فعال نبودن محیط تون(فراموش نکنید conda یک محیط base داره که با دستور اولی فعال میشه)
conda activate

conda rename -n OldName NewName
۱-جستجوی پکیج با نمایش تاریخچه تگ آن
۲-مشاهده وابستگی های آن
۳-مشاهده پکیج‌ها استفاده کننده آن
1- conda search PackName

2- conda repoquery depends PackName

3- conda repoquery whoneeds PackName
ادغام محیط شل با conda
conda init bash
پاک کردن پکیج‌های نا استفاده
conda clean
برای کانفیگ از قبیل محیط نصب، پکیج‌ها محدودیت دانلود و ...
conda config

conda config --help
موضوع جالب اینکه هنگام نصب پکیج تمام وابستگی‌ها رو اجرایی میکنه و نصب و حتی اگه نیاز به نسخه دیگری از پایتون باشه اون رو downgraid میکنه که منجر میشه تا حد ممکن براتون خطایی رخ نده و دردسر نکشید


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

#conda
#pip
#env

@code_crafters
👍51
خب بیاید یک کار کوچیک باهاش انجام بدیم

سیستم عامل من ubuntu 23.10 هستش که پایتون ۳.۱۱ روش نصب و من نیاز به نسخه ۳.۱۰ دارم و ...
در حالت معمول من باید برم پایتون نسخه ۳.۱۰ رو نصب کنم بعد یک جایی محیطی بسازم که دست نخورده و محافظت شده بمونه برام و دپندنسی هارو نصب کنم و بعد پکیج‌های مدنظرم رو و ... 😢😢😢
خب قبل از هرچیزی vscode و conda رو نصب میکنم

و تک دستور زیر رو میزنم
conda create -n ML python=3.10  scikit-learn jupyter
همین ،خودش تمام دپندنسی هارو برام نصب میکنه و تموم و با یک خط دستور راه هزار ساله قبلی رو رفتم،حالا کافیه هرجایی که دوست دارم یک work directory بسازم و vscode رو اجرا کنم و work directory رو‌ باز کنم

طبق تصویر بالایی اکستنشن هارو با python intellisense, python debugger نصب کنید

تصویر پایین، بالا سمت راست (قرمز شده) کلیک میکنم و یک پنجره کشویی در vscode باز میکنه گزینه python environments و سپس محیط ML رو انتخاب میکنم( کرنل انتخاب شد)

در قسمت سمت راست فایل‌هام رو با .ipynb میسازم (قرمز شده)


الان محیط jupyter با intellisense دارم


#conda
#pip
#env

@code_crafters
👍2
خب بریم سراغ داکرایز کردن پروژه با conda

عجله نکنید
بیاید قبلش یکم راجب محیط‌های conda حرف بزنیم و بیشتر باهاش آشنا بشیم و درک‌ کنیم conda چجوری باهاش کار میکنه


نکته هنگام نصب conda یک‌ محیط خودش بصورت پیش فرض میسازه با نام base

با دستور زیر میتونید محیط‌ها رو ببینید
conda env list
این رو فراموش نکنید خیلی بکارمون میاد بعدا


خب ما محیط خودمون رو میسازیم و داخلش پکیج‌هامون رو نصب میکنیم و پروژه رو‌توسعه میدیم
conda env create -n venv

conda activate venv

conda install django
حالا ما یک‌ محیط با اسم venv داریم و یکسری پکیج داخلش نصب هست


میدونیم با دستور زیر یک فایل که حاوی پکیچ‌ها هست رو میسازیم
conda env export > requirements.yml
خروجی اون بشکل تصویر خواهد بود(تصویر رو در کامنت براتون میزارم حتما ببینید و بعد ادامه بدید)
خط آخر رو پاک کنید یعنی prefix

حال اگه بخوایم این فایل رو‌ مجدد نصب کنیم خطا میده
conda env create -f requirements.yml
چرا؟؟؟
خط اول رو ببینید مقدار name این دقیقا اسم محیطمون هست

نکته conda میاد هم محیط رو میسازه و هم پکیچ‌هاش رو نصب میکنه

قبلا گفتیم conda تمام محیط‌ها رو در یک مسیر خاص قرار میده و‌ میسازه (این مسیر کجاست مقدار prefix انتهای فایل که گفتیم پاک‌ کنید) و خوب ما نمیتونیم دوتا محیط با یک اسم داشته باشیم (اگه محیط قبلی رو حذف کنید و دستور رو بزنید اجرا میشه) یا یکار باحال‌تر مقدار name رو داخل فایل بصورت دستی تغییر بدید و دستور رو بزنید باز هم کار خواهد کرد

تنها نکته باید بدونید این هست محیط تکراری نمیتونیم داشته باشیم، در ابتدای فایل اون name در واقع اسم محیطمون هست

اگه ما بخوایم پکیچ‌های این فایل رو در یک محیط دیگه نصب کنیم چکاری باید انجام بدیم؟؟؟

تصور کنید ما یک محیط دیگه با نام test داریم و میخوایم پکیچ‌های فایل requirements.yml رو‌ داخلش نصب کنیم

داخل همین فایل مقدار name رو به test(اسم‌ محیط مقصدمون) تغییر میدیم و دستور زیر رو میزنیم

conda env update -f requirements.yml
میره و این پکیج‌هارو در محیط test که داریم نصب میکنه داخلش


چیارو‌فهمیدیم؟؟؟
یک‌ محیط داریم همیشه با اسم base 

وقتی فایل requirements.ymlرو‌ میسازیم قسمت prefix رو‌ پاک میکنیم و کنترل کردن مقدار name در فایل خیلی مهم هست که بتونیم با دستورات create و update کار کنیم

نمیتونیم محیط با اسم تکراری داشته باشیم

و اینکه conda با دستور create محیط رو هم برامون میسازه و با دستور update به محیطی که داریم وصل میشه



حالا که محیط ها رو درک کردیم و فهمیدیم conda چجوری باهاشون رفتار میکنه ذره ذره آماده میشیم برای قدم اصلی

#conda
#pip
#env

@code_crafters
👍2
خب برسیم به قسمت جالب کار چطور از conda داخل داکر استفاده کنیم

سناریو از این قرار هست ما یک محیط ساخته و میخوایم الزامات راه اندازی جنگو رو داشته باشیم
conda env create -n venv python=3.10 django gunicorn gevent

conda activate venv

django-admin startproject config .

conda env export > requirements.yml
بریم واسه داکرایز کردنش

اول از همه ایمیج مدنظرمون رو از داکرهاب میگیریم
docker pull continuumio/miniconda3
ما ایمیج رو گرفتیم و داخل Dockerfile ازش استفاده میکنیم

این ایمیج محتوی conda و python3.11 هست هر دو رو داخل خودش داره

ما میخوایم پکیج‌های خودمون رو که داخل فایل requirements.yml هست نصب کنیم

میدونیم از دوتا دستور میشه استفاده کرد
conda env create -f requirements.yml

conda env update -f requirements.yml

اولی محیط رو هم برامون ایجاد میکرد
دومی روی یک محیط از قبل موجود پکیج‌هارو نصب میکرد
تو پست قبل بهتون گفتم یادتون بمونه که conda همیشه خودش یک محیط درست میکنه با اسم base

تو ایمیجش هم این ماجرا صحت داره پس ما میتونیم که از دستور دومی استفاده کنیم

منتها یک قاعده داشتیم اون هم این بود مقدار name در فایل requirements.yml رو به base تغییر بدیم

با فرض بر این که میخوایم یک اپلیکیشن جنگویی ساده رو بالا بیاریم داکرفایل رو مینویسیم

پس داکر فایل ما به شکل زیر خواهد بود

FROM continuumio/miniconda3
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
WORKDIR /code
COPY . /code/
RUN /bin/bash -c "conda env update -f requirements.yml"
EXPOSE 8000
خب ادامه بدیم و یک داکر کامپوز ساده هم بنویسیم براش

ما داریم از gunicorn با gevent استفاده میکنیم و برای اجرای اپ جنگویی لازم هست که دستور مربوطه رو در شل کانتینر اجرا کنیم

اما سوال پیش میاد ما الان پکیج‌هامون رو داخل محیط base داریم و شل هم یجای دیگه کار میکنه خب چطور اینارو باهم ارتباط بدیم

در پست اول راجب conda یک دستور خوندیم
conda run 

کارش هم این بود که دستور شل رو با یک محیط conda ترکیب کنه

نکته جالب هروقت جایی لازم بود داخل دستور conda محیط رو مشخص کنید با سویچ n myenv- و اینکار رو نکنید conda پیش فرض محیط base رو در نظر میگیره

جالب شد همین کار مارو راه میندازه


حالا یک داکر فایل ساده مینویسیم

version: '3'

services:
conda:
build: .
image: conda-test
hostname: conda
container_name: conda
restart: on-failure
command: sh -c "conda run gunicorn -k gevent --workers 4 config.wsgi:application -b 0.0.0.0:8000"
expose:
- 8000
ports:
- 8000:8000


حالا بریم واسه اجرا کردنش

docker compose up -d
یکم صبر کنید تا کار تموم بشه
docker ps

docker logs conda
کانتینر در حال اجراست و لاگ هم اروری نداریم بریم داخل کانتینر یچیز جالب رو باهم نگاه کنیم
docker exec -it conda bash

python
چه چیزی رو میبینید؟؟؟
پایتون نسخه 3.10 مگه ما اول کار نگفتیم این ایمیج پایتون نسخه 3.11 هست

درسته داخل دپندنسی فایل requirements.yml هر نسخه از پایتون باشه conda وضعیت رو تغییر میده برامون


حالا از پایتون بیایم بیرون و پکیج هارو نگاه کنیم
conda env list

همه پکیج‌ها نصب هستش
کار تمومه کانتینر ما داره کار میکنه و تونستیم با درک شیوه کار کرد conda کارمون رو راه بندازیم

یک سوال ازتون میپرسم اگر ما مقدار name در فایل requirements.yml رو به base تغییر ندیم شیوه کاریمون چجوری میشد؟؟؟


#conda
#pip
#env

@code_crafters
👍3