CodeCrafters
765 subscribers
91 photos
51 videos
42 files
170 links
Download Telegram
بیا یه انبار داده‌های باحال بسازیم: مثال پارتیشن‌بندی با PostgreSQL

فکر کن یه عالمه داده درباره ترموستات‌های هوشمند داریم. دما، تاریخ، وضعیت روشن/خاموش و یه عالمه اطلاعات دیگه. خب، چطوری قراره این انبوه اطلاعات رو منظم و مرتب نگه داریم؟ اینجا با پارتیشن‌بندی تو PostgreSQL آشنا می‌شیم که حکم قفسه‌چین‌های حرفه‌ای رو دارن!

اول یه نگاهی به انبارمون بندازیم:
SELECT * FROM thermostat LIMIT 10;


این دستور ۱۰ تا ردیف اول از جداول thermostat رو نشون میده. هر ردیف شامل تاریخ، شناسه‌ی ترموستات، دمای فعلی و وضعیتش هست. حالا می‌تونیم این انبار رو با پارتیشن‌بندی مرتب‌تر و کارآمدتر کنیم. تو قسمت بعدی قراره ببینیم چطور میشه این کار رو انجام داد!

آماده‌ای بریم سراغ جادوی پارتیشن‌بندی با PostgreSQL؟ ⚡️

👩‍💻 #postgresql
@Code_Crafters
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1
ساخت قفسه‌های دیجیتالی: ایجاد جدول پارتیشن‌بندی‌شده

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

دستور زیر رو بزن تا جدول جدید iot_thermostat ساخته بشه:
CREATE TABLE iot_thermostat (
thetime timestamptz,
sensor_id int,
current_temperature numeric (3,1),
thermostat_status text
) PARTITION BY RANGE (thetime);


اینجا به PostgreSQL می‌گیم که جدول iot_thermostat رو با پارتیشن‌بندی بر اساس بازه‌های زمانی (RANGE (thetime)) درست کنه. یعنی قراره اطلاعات ترموستات‌ها رو بر اساس تاریخشون توی قفسه‌های جداگانه بچینیم.

یادت باشه که واسه پیدا کردن سریع‌تر وسایل توی انبار، لازمه برچسب‌های راهنما داشته باشیم. برای این کار از ایندکس‌ها استفاده می‌کنیم. دستور زیر یه ایندکس روی فیلد thetime می‌سازه:

CREATE INDEX ON iot_thermostat(thetime);


اینجوری PostgreSQL می‌تونه خیلی سریع‌تر اطلاعات رو بر اساس تاریخ پیدا کنه. دیگه لازم نیست کل انبار رو زیر و رو کنه!

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

👩‍💻 #postgresql
@Code_Crafters
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2
برچسب‌های روی قفسه‌ها: ایجاد پارتیشن‌های جداگانه

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

دستور زیر قفسه‌هایی برای تاریخ‌های ۲۳ جولای تا ۴ آگوست می‌سازه:

SQL 
CREATE TABLE iot_thermostat07232022 PARTITION OF iot_thermostat FOR VALUES FROM ('2022-07-23 00:00:000') TO ('2022-07-24 00:00:000');
CREATE TABLE iot_thermostat07242022 PARTITION OF iot_thermostat FOR VALUES FROM ('2022-07-24 00:00:000') TO ('2022-07-25 00:00:000');
CREATE TABLE iot_thermostat07252022 PARTITION OF iot_thermostat FOR VALUES FROM ('2022-07-25 00:00:000') TO ('2022-07-26 00:00:000');
CREATE TABLE iot_thermostat07262022 PARTITION OF iot_thermostat FOR VALUES FROM ('2022-07-26 00:00:000') TO ('2022-07-27 00:00:000');
CREATE TABLE iot_thermostat07272022 PARTITION OF iot_thermostat FOR VALUES FROM ('2022-07-27 00:00:000') TO ('2022-07-28 00:00:000');
CREATE TABLE iot_thermostat07282022 PARTITION OF iot_thermostat FOR VALUES FROM ('2022-07-28 00:00:000') TO ('2022-07-29 00:00:000');
CREATE TABLE iot_thermostat07292022 PARTITION OF iot_thermostat FOR VALUES FROM ('2022-07-29 00:00:000') TO ('2022-07-30 00:00:000');
CREATE TABLE iot_thermostat07302022 PARTITION OF iot_thermostat FOR VALUES FROM ('2022-07-30 00:00:000') TO ('2022-07-31 00:00:000');
CREATE TABLE iot_thermosta07312022 PARTITION OF iot_thermostat FOR VALUES FROM ('2022-07-31 00:00:000') TO ('2022-08-01 00:00:000');
CREATE TABLE iot_thermostat08012022 PARTITION OF iot_thermostat FOR VALUES FROM ('2022-08-01 00:00:000') TO ('2022-08-02 00:00:000');
CREATE TABLE iot_thermostat08022022 PARTITION OF iot_thermostat FOR VALUES FROM ('2022-08-02 00:00:000') TO ('2022-08-03 00:00:000');
CREATE TABLE iot_thermostat08032022 PARTITION OF iot_thermostat FOR VALUES FROM ('2022-08-03 00:00:000') TO ('2022-08-04 00:00:000');


یعنی از این به بعد، هر اطلاعاتی که مربوط به تاریخ ۲۳ جولای باشه، مستقیم میره توی قفسه iot_thermostat07232022 و با اطلاعات روزهای دیگه قاطی نمیشه. اینجوری هم انبارت مرتب میمونه، هم پیدا کردن وسایل راحت‌تر میشه.

حالا اگه بخوای اطلاعات یه روز خاص رو ببینی، فقط کافیه به قفسه مربوط به اون روز سر بزنی؛ نیازی نیست کل انبار رو بگردی. این یعنی سرعتِ جت در جستجو و دسترسی به داده‌ها!

👩‍💻 #postgresql
@Code_Crafters
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1
چیدن وسایل توی قفسه‌ها: وارد کردن اطلاعات به پارتیشن‌ها

خب، قفسه‌ها آماده‌ان، برچسب‌ها خوردن، حالا وقتشه وسایل رو توشون بچینیم! اینجا با یه دستور ساده، اطلاعات رو از جدول اصلی thermostat به جدول پارتیشن‌بندی‌شده iot_thermostat منتقل می‌کنیم:
INSERT INTO iot_thermostat SELECT * FROM thermostat;

نگران نباش، لازم نیست به PostgreSQL بگی کدوم اطلاعات باید کجا بره. خودش حواسش هست و هر تیکه اطلاعات رو بر اساس تاریخش، توی قفسه مناسبش میذاره. مثل یه ربات قفسه‌چین حرفه‌ای!🤖

برای اینکه مطمئن بشی همه چی درست انجام شده، می‌تونی یه نگاهی به یکی از قفسه‌ها بندازی:
SELECT * FROM iot_thermostat07242022 LIMIT 10;

این دستور ۱۰ تا ردیف اول از قفسه‌ی ۲۴ جولای رو نشون میده. اگه همه چی مرتب باشه، فقط اطلاعات مربوط به همون روز رو باید ببینی.

حالا انبار داده‌هات حسابی مرتب و منظم شده! هم پیدا کردن اطلاعات راحت‌تره، هم مدیریتش آسون‌تره. تبریک میگم، تو یه قفسه‌چین حرفه‌ای شدی!

👩‍💻 #postgresql
@Code_Crafters
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2
انبار مرتب، انبار بی‌دردسر: چرخش پارتیشن‌ها

حالا فرض کن دیگه به اطلاعات خیلی قدیمی نیاز نداری و فقط داده‌های اخیر مهم هستن. مثلا می‌خوای اطلاعات ۲۳ جولای رو تو یه جای دیگه آرشیو کنی و از انبار اصلی حذف کنی. اینجا یه ترفند جادویی به اسم چرخش پارتیشن به کار میاد!

با دستور زیر، قفسه مربوط به ۲۳ جولای (iot_thermostat07232022) رو از انبار اصلی جدا می‌کنیم:
ALTER TABLE iot_thermostat DETACH PARTITION iot_thermostat07232022;

حالا اون یه قفسه مستقل شده و دیگه تو انبار اصلی نیست. می‌تونی اونو به یه انبار آرشیو منتقل کنی تا فقط اطلاعات مهم و اخیر تو انبار اصلی باقی بمونن.

البته قرار نیست انبار خالی بمونه! باید یه قفسه جدید هم برای اطلاعات جدید بسازیم. دستور زیر یه قفسه با برچسب iot_thermostat0842022 ایجاد می‌کنه که اطلاعات ۴ و ۵ آگوست رو توش جا می‌ده:
CREATE TABLE iot_thermostat0842022 PARTITION OF iot_thermostat
FOR VALUES FROM ('2022-08-04 00:00:000') TO ('2022-08-05 00:00:000');


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

اگه قراره این چرخش رو هر روز انجام بدی، می‌تونی از یه ابزار به اسم cron job استفاده کنی تا همه چی به صورت خودکار و بدون زحمت انجام بشه. دیگه لازم نیست خودت قفسه‌ها رو جابه‌جا کنی!

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

👩‍💻 #postgresql
@Code_Crafters
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍1
نکته مهم در مورد کدهای ارائه شده در پست های قبلی:

اگر می‌خواهید کدهای مربوط به تراکنش‌ها و پارتیشن‌بندی را امتحان کنید، لازم نیست PostgreSQL را نصب کنید!

سایت CrunchyData (https://www.crunchydata.com/) که منبع اصلی مقاله ترجمه شده در پست های قبلی بود، یک ترمینال PostgreSQL تعاملی در سمت راست صفحه خود ارائه می‌دهد که می‌توانید از آن برای تست کدها بدون نیاز به نصب هیچ نرم‌افزاری استفاده کنید.

لینک‌های مربوط به ترمینال PostgreSQL:

تراکنش‌ها:
https://www.crunchydata.com/developers/playground/transactions


پارتیشن‌بندی:
https://www.crunchydata.com/developers/playground/partitioning


👩‍💻 #postgresql
@Code_Crafters
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2
This media is not supported in your browser
VIEW IN TELEGRAM
جوابی که مدیر شرکت در جویای عدم درگیری و وجود اختلاف بکندکار و فرانتکار میگیره


جدا از طنز دو کارگردان وودی آلن و کریستوفر نولان شاهکار هستند


#fun

@code_crafters
👍4🦄1
برای بررسی لاگ‌ها در سرور معمولا دو ابزار قدرتمند وجود دارد grafana loki و ELK

در ریپوی مربوط به grafana که در گیتهاب کانال با عنوان sysadmin_monitoring موجود می باشد، loki رو داکرایز کردیم و با ابزارهای دیگه و پلتفرم‌های دیگه میتونید بالا بیارید

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

خب بین دو پلتفرم loki و ELK کدوم رو اسفاده کنیم؟؟؟
پلتفرم loki برای پروژه‌های متوسط و سرورهای معمولی مناسب هست ELK هم برای سیستم‌های بزرگ و معمولا میکروسرویسی

خود ELK مخفف elastic logstash kibana هستش

لینک ریپو رو در زیر براتون گذاشتم

https://github.com/CodeCrafters-ir/ELK.git


#devops
#monitoring

@code_crafters
5🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
وقتی ربات رو‌ جهت تست روی هاست مشتری اجرا میکنی ، و همون لحظه مشتری پسورد یوزر هاست رو تغییر میده


#fun

@code_crafters
😁9🤣2👍1
CodeCrafters
وقتی ربات رو‌ جهت تست روی هاست مشتری اجرا میکنی ، و همون لحظه مشتری پسورد یوزر هاست رو تغییر میده #fun @code_crafters
از خاطرات دنیای فریلنسری بهتون بگم

یبار یک‌ موتور جستجوی تصویر برای مشتری نوشتم با opencv که مبلغش بالا بود

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

اما من یک باگ داخل کدهام گذاشته بودم متاسفانه که باعث شد یکماه مشتری التماسم کنه
😁13
چرا 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
امیدواریم هرچه سریعتر سیستم مالیاتی جامع کشوری راه اندازی بشه و در کنارش سیستم نظارت بر درآمدزایی هم رشد کنه

با این واقعیت کنار بیاید که سیستم مالیاتی به نفع همه و بالاخص قشر ضعیف و دهک پایین جامعه خواهد بود، بخودتون سخت نگیرید شما بعنوان کارمند نهایتا در ازای هر ده میلیون تومن فراتر از پایه حقوق ده میلیون تومن یک میلیون مالیات خواهید داد

چیزی از جیب شما کم نخواهد شد اما در مقابل افراد با درامد ناسالم شناسایی میشن ،هرکسی از روی هوا و کارهای ضد اجتماعی مثه فروش مواد مخدر پولدار نخواهد شد


از سیستم یکپارچه مالیات کشوری حمایت کنید و امیدوارم طرح بعدی سیستم نظارت جامع بر املاک و مستقلات کشوری راه اندازی بشه
👎18👍7😐1
قابلیت TTL در MongoDb: راه حلی ساده و هوشمندانه برای مدیریت اطلاعات موقتی

ذخیره سازی اطلاعات موقتی، چالشی همیشگی در برنامه نویسی بوده است.

دو راه حل رایج برای این چالش عبارتند از:

استفاده از Redisو Session: که برای ذخیره سازی داده های کوتاه مدت مانند اطلاعات مربوط به سشن کاربر مناسب است.
ساخت مدل و حذف دوره ای با cron job: که برای داده های موقتی که نیاز به ساختار پیچیده تری دارند، مانند سبد خرید، مناسب است.

اما راه حل سومی هم وجود دارد که ساده تر و کارآمدتر است: TTL در MongoDb

در واقع TTL مخفف Time To Live است و به قابلیتی در MongoDb اشاره می کند که به شما امکان می دهد اسناد را پس از گذشت زمان مشخصی به طور خودکار حذف کنید.

مزایای استفاده از TTL:

حذف خودکار اطلاعات: دیگر نیازی به نوشتن کد برای حذف دستی اطلاعات منسوخ نیست. TTL این کار را به طور خودکار برای شما انجام می دهد.
کاهش حجم داده ها: با حذف خودکار اطلاعات غیرضروری، فضای ذخیره سازی پایگاه داده شما آزاد می شود.
افزایش کارایی و عملکرد: حذف خودکار اطلاعات، بهینه سازی و سرعت بخشیدن به عملکرد پایگاه داده شما کمک می کند.

معایب استفاده از TTL:

پیچیدگی جزئی کد: استفاده از TTL نیازمند ایجاد ایندکس TTL روی فیلد زمانی است. (مثلا یک فیلد با اسم CreateAt از DateTime)
مصرف رم و CPU: حذف خودکار اطلاعات به طور مداوم، می تواند رم و CPU بیشتری را مصرف کند. (البته خوب استفاده از cron job هم همین استفاده بیشتر از رم و CPU را میخواهد)

در کل TTL در MongoDb راه حلی ساده و کارآمد برای ذخیره سازی اطلاعات موقتی است.

با وجود معایبی مانند پیچیدگی جزئی کد و مصرف رم و CPU، مزایای TTL مانند حذف خودکار اطلاعات، کاهش حجم داده ها و افزایش کارایی و عملکرد، آن را به انتخابی ایده آل برای بسیاری از برنامه ها تبدیل می کند.

برای کسب اطلاعات بیشتر از لینک زیر استفاده کنید :
https://www.mongodb.com/docs/manual/core/index-ttl/

#mongodb
@Code_Crafters
👍31
داکر ، پلتفرم اوپن سورسی که به ما در توسعه دادن (Develop) ، انتقال دادن (Ship) و اجرا (Run) کمک میکنه، یکی از فواید داکر ، ایزوله سازی اپ ها هستش این بدین معنی است که شما میتوانید اپ های خود را مستقل از سیستم عامل اجرا کنید.

🔆 ساختار داکر چگونه است؟

🔅 داکر دارای یک هسته و دو Application می باشد ، داکر کلاینت و داکر Cli ، که هردو آنها به هسته یعنی Docker-Daemon درخواست میدهند ، اگر شما میخواید یک ایمیج را Pull کنید یا حتی یک ایمیج را اجرا کنید ، باید به هسته دستور اجرا شدن را بدید. نوع ارتباط بین کلاینت و هسته با Rest Api می باشد.


🔆 ماشین مجازی یا داکر؟

🔅داکر بر خلاف ماشین مجازی (Virtual Machine) نیازی به Hypervisor ندارد و کانتینر شمارو بصورت مستقیم روی سیستم عامل و همچنین با پراسس جدیدی اجرا میکند که باعث سبک تر بودن اپ (چه از لحاظ مصرفی و چه از لحاظ سرعت ) نسبت به ماشین مجازی میشود.


🔆 اپ ما چگونه در داکر اجرا میشود؟

🔹 1- در ابتدا شما باید بوسیله ی Docker Image یک ایمیج برای خودتون بسازید ، این ایمیج خود ، ساختار چند لایه دارد ، اپ شما و ایمیج های دیگر استفاده شده بصورت جدا جدا گرفته و در مجموع یک ایمیج را شکل میدهند.

🔸2 - بعد از ساختن ایمیج ، شما میتوانید آن را اجرا کنید ، داکر قابلیت اجرای چندین Instance از یک ایمیج را دارد که آن هارا بصورت کانتینر از هم مجزا میکند. که این یعنی شما میتوانید 4 پراسس از یک اپلیکیشن را اجرا کنید.

🔹3 - همانطور که در مورد دوم گفته شد ، شما بعد از اجرای ایمیج خود در اصل یک کانیتنر می سازید ، این کانتینر بصورت کاملا ایزوله از ایمیج ساخته میشود و بصورت پراسس اجرا میشود اینجوری تمامی تغییرات اعمال شده در کانتینر روی ایمیج تاثیری نمیزارد.


♦️ داکر سرویس ، یک ابزار برای مدیریت چندین کانیتنر بصورت همزمان است ، همچنین با داکر سرویس میتوانید از قابلیت های داکر Swram نیز استفاده کنید که در پست های آینده راجب آن توضیح میدهیم.

#Docker
#Guide
#Beginner

@code_crafters
9👍2
خب بیاید راجب یک‌ موضوع دیگه خیلی سریع در چند پست باهم بررسی و یاد بگیریم


اتومیشن کردن پروژه (ما از یک پروژه جنگویی استفاده میکنیم اما جز در قسمت داکرایز کردن آن تفاوتی در سایر مراحل ندارد)در گیتهاب با استفاده از github actions


خب قبل از هرچیزی بیایم سناریویی که میخوایم انجام بدیم رو با هم بچینیم و پیاده سازیش کنیم


ما یک اپلیکیشن داریم که داخل گیتهاب در ریپوزیتوری خصوصی با نام test-action قرار دادیم


دوتا سرور داریم
یک سرور جهت تست با نام server-develope
یک سرور جهت اجرا با نام server-production


ما از رانر خودمون استفاده میکنیم که کار کردن و تنظیم کردن اون رو هم یاد بگیریم
دوستانی که سرور ندارن میتونن از environment خود گیتهاب جهت تست و تمرین استفاده کنن


سناریو به چه شکل خواهد بود
ما پروژه رو با داکرایز کردن پیاده سازی میکنیم پس در هر دو سرور تست و اجرا با این رویکرد پیش خواهیم رفت

در مبحث مربوط به cd برای سرور تست delivery و برای سرور اجرا deployment پیش خواهیم رفت

چرا از دو رویکرد برای cd استفاده میکنیم

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


خب ما یک پروژه با جنگو رو شروع میکنیم
conda env create -n tetstaction-venv python=3.10 django gunicorn gevent

conda activate tetstaction-venv

mkdir my_project

cd my_project

django-admin startproject config .



داکرایز کردن آن:
در همان مسیر دایرکتوری my_project
nano Dockerfile
مقدار زیر را داخل آن بزارید
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


فایل داکرکامپوز
nano docker-compose.yml


محتویات آن
ser 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


خب تا اینجای کار آماده شدیم
دوتا سرور تست و اجرا داریم

یک پروژه جنگویی داریم

اون رو داکرایز کردیم

و در یک ریپوی خصوصی گیتهاب گذاشتیم
از پست بعد بریم سراغ github action


#git
#actions


@code_crafters
👏4
خب میریم سراغ رانرهامون

اینکه رانر چیه و توضیحات مربوط به اون رو برید از Gemini گوگول بپرسید از تعاریف عبور می‌کنیم

ما دو نوع رانر داریم
رانر میزبانی شده توسط گیتهاب(اگه سرور ندارید میتونید ازین مورد استفاده کنید)
رانر خود میزبانی شده که بهش self hosted میگیم و روی سرور بالا میاریم(میتونید روی لپتاپ خودتون هم بالا بیارید)


به اکانت خود و ریپوی مدنظرتون برید و مسیر زیر رو دنبال کنید
Settings > Actions > Runners > New self-hosted runner

در کامنت‌ها تصویر اول رو ببینید

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

در کامنت‌ها تصویر دوم را ببینید


دستورات مربوطه در این صفحه با حفظ نکته زیر در سرور server-developer اجرا کنید

در بخش configure هنگام اجرا کردن بش اسکریپت config.sh/. موارد رو مطابق زیر پر کنید

دستور اول مربوط به ساخت دایرکتوری می باشد در هر مسیری که دوست دارید آنرا اجرا کنید و بخاطر بسپارید تمامی دستورات ما جهت پیکربندی رانر در این مسیر این دایرکتوری انجام خواهیم داد 

در مرحله اول کلید enter را بزنید تا پیش فرض بماند

در مرحله دوم هم مقدار server-developer را وارد کنید

در مرحله بعدی لیبل server-developer را وارد کنید

در مرحله بعدی کلید enter را بزنید

رانر ما اکنون آماده کار میباشد

دستور زیر را بزنید تا رانر شروع بکار کند

./run.sh
اکنون صفحه گیتهاب خود در مسیر زیر را اگر رفرش کنید با تصویر سوم در کامنت ها روبرو میشید

Settings > Actions > Runners


یک رانر با نام و برچسب server-developer می بینید این یک self-hosted هست این نام رو فراموش نکنید


نکته قابل توجه:
دستور run.sh/. ترمینال رو مشغول نگه داشته و اگه این دستور رو خاتمه بدید و به همان صفحه رانرها برگردید میبینید که رانر به حالت offline رفته

ما باید رانر رو به یک سرویس تبدیل کنیم تا همیشه به حالت کار قرار گیرد دستورات زیر را در همان مسیر دایرکتوری که رانر در ان قرار دارد اجرایی کنید (actions-runner) اجرایی کنید

sudo ./svc.sh install

systemctl start action<کلید tab را جهت کامل کردن بزنید>

اکنون اگر بجای start در دستور دوم بالا مقدار status را بزارید میبینید که رانر ما بصورت سرویس بالا آمده و در حال اجرا قرار گرفته است

برای سرور server-deployment به همان صفحه رانرها رفته و یک رانر جدید دیگر راه بندازید

Settings > Settings > Actions > New self-hosted runner

همان مراحل بالا را انجام بدید منتها نام و لیبل رو به server-deployment تغییر دهید

اکنون صفحه رانرها را رفرش کنید رانر server-deployment رو با server-developer میبینید

هر دو رانر ما آماده شدن

#git
#actions


@code_crafters
👏3
خب بریم سراغ اینکه اگه بخوایم رانر رو حذف کنیم چکار کنیم

ابتدا به سرور مدنظرمون و مسیر دایرکتوری که پست قبلی برای رانر ایجاد کردیم میریم و دستورات زیر رو میزنیم
systemctl stop action<کلید tab را جهت کامل کردن بزنید>

sudo ./svc.sh uninstall

./config.sh remove --token مقدار‌توکن
مقدار توکن را مطابق تصویر دریافت کنید به مسیر رانرها بروید بر روی اسم رانر مدنظر خودتون کلیک کنید دکمه remove را بزنید مقدار توکن را کپی کرده صفحه را ببنید در دستور بالا جایگذاری کنید و رانر را حذف کنید

Settings > Actions > runners > رانر خودرا‌انتخاب‌کنید > Remove
اگر صفحه رانرها رو رفرش کنید میبینید که رانر پاک شده است

#git
#actions

@code_crafters
👍3