CodeCrafters
Kanalga Telegram’da o‘tish
Software Engineer and IT Group: https://t.me/code_crafters_chat Github: https://github.com/CodeCrafters-ir Site: https://codecrafters.ir
Ko'proq ko'rsatish711
Obunachilar
Ma'lumot yo'q24 soatlar
Ma'lumot yo'q7 kunlar
Ma'lumot yo'q30 kunlar
Postlar arxiv
711
خب بیاید راجب یک موضوع دیگه خیلی سریع در چند پست باهم بررسی و یاد بگیریم
اتومیشن کردن پروژه (ما از یک پروژه جنگویی استفاده میکنیم اما جز در قسمت داکرایز کردن آن تفاوتی در سایر مراحل ندارد)در گیتهاب با استفاده از 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:
brity.ir:
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
711
داکر ، پلتفرم اوپن سورسی که به ما در توسعه دادن (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
711
قابلیت 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
711
امیدواریم هرچه سریعتر سیستم مالیاتی جامع کشوری راه اندازی بشه و در کنارش سیستم نظارت بر درآمدزایی هم رشد کنه
با این واقعیت کنار بیاید که سیستم مالیاتی به نفع همه و بالاخص قشر ضعیف و دهک پایین جامعه خواهد بخودتون سخت نگیرید شما بعنوان کارمند نهایتا در ازای هر ده میلیون تومن فراتر از پایه حقوق ده میلیون تومن یک میلیون مالیات خواهید داد
چیزی از جیب شما کم نخواهد شد اما در مقابل افراد با درامد ناسالم شناسایی میشن ،هرکسی از روی هوا و کارهای ضد اجتماعی مثه فروش مواد مخدر پولدار نخواهد شد
از سیستم یکپارچه مالیات کشوری حمایت کنید و امیدوارم طرح بعدی سیستم نظارت جامع بر املاک و مستقلات کشوری راه اندازی بشه
711
خب برسیم به قسمت جالب کار چطور از conda داخل داکر استفاده کنیم
سناریو از این قرار هست ما یک محیط ساخته و میخوایم الزامات راه اندازی جنگو رو داشته باشیم
conda env create -n venv python=3.10 django gunicorn gevent
conda activate venv
django-admin startproject config .
conda env export > requirements.txt
برای بریم داکرایز کردنش
اول از همه ایمیج مدنظرمون رو از داکرهاب میگیریم
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 رو در نظر میگیره جالب شد همین کار مارو راه میندازهحالا یک داکر فایل ساده مینویسیم
ser version: '3'
services:
brity.ir:
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.txt رو به base تغییر ندیم شیوه کاریمون چجوری میشد؟؟؟ #conda #pip #env @code_crafters
711
خب بریم سراغ داکرایز کردن پروژه با 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
711
خب بیاید یک کار کوچیک باهاش انجام بدیم
سیستم عامل من 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_crafters711
چرا 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 rename۱-جستجوی پکیج با نمایش تاریخچه تگ آن ۲-مشاهده وابستگی های آن ۳-مشاهده پکیجها استفاده کننده آن
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 میکنه
داخل کامنت ها هم نحوه نصبش رو در اوبونتو میزارم
@code_crafters711
از خاطرات دنیای فریلنسری بهتون بگم
یبار یک موتور جستجوی تصویر برای مشتری نوشتم با opencv که مبلغش بالا بود
کدهارو جهت تست روی سرور گذاشتم و بعد از گرفتن اولین خروجی ،مشتری پسورد رو تغییر داد و من رو بلاک کرد
اما من یک باگ داخل کدهام گذاشته بودم متاسفانه که باعث شد یکماه مشتری التماسم کنه
711
وقتی ربات رو جهت تست روی هاست مشتری اجرا میکنی ، و همون لحظه مشتری پسورد یوزر هاست رو تغییر میده
#fun
@code_crafters
711
برای بررسی لاگها در سرور معمولا دو ابزار قدرتمند وجود دارد grafana loki و ELK
در ریپوی مربوط به grafana که در گیتهاب کانال موجود می باشد loki رو دامرایز کردیم و با ابزارهای دیگه و پلتفرمهای دیگه میتونسد بالا بیارید
در این ریپو هم ELK رو داکرایز و کانفیگ کردم
که با کلون کردنش میتونید ازش استفاده کنید یک فایل زیپ شده هم برای تمرین و تست گذاشتم براتون
خب بین دو پلتفرم loki و ELK کدوم رو اسفاده کنیم؟؟؟
پلتفرم loki برای پروژههای متوسط و سرورهای معمولی مناسب هست ELK هم برای سیستمهای بزرگ و معمولا میکروسرویسی
خود ELK مخفف elastic logstash kibana هستش
لینک ریپو رو در زیر براتون گذاشتم
https://github.com/CodeCrafters-ir/ELK.git
@code_crafters
711
جوابی که مدیر شرکت در جویای عدم درگیری و وجود اختلاف بکندکار و فرانتکار میگیره
جدا از طنز دو کارگردان وودی آلن و کریستوفر نولان شاهکار هستند
#fun
@code_crafters
711
نکته مهم در مورد کدهای ارائه شده در پست های قبلی:
اگر میخواهید کدهای مربوط به تراکنشها و پارتیشنبندی را امتحان کنید، لازم نیست 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
711
انبار مرتب، انبار بیدردسر: چرخش پارتیشنها
حالا فرض کن دیگه به اطلاعات خیلی قدیمی نیاز نداری و فقط دادههای اخیر مهم هستن. مثلا میخوای اطلاعات ۲۳ جولای رو تو یه جای دیگه آرشیو کنی و از انبار اصلی حذف کنی. اینجا یه ترفند جادویی به اسم چرخش پارتیشن به کار میاد!
با دستور زیر، قفسه مربوط به ۲۳ جولای (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_Crafters711
چیدن وسایل توی قفسهها: وارد کردن اطلاعات به پارتیشنها
خب، قفسهها آمادهان، برچسبها خوردن، حالا وقتشه وسایل رو توشون بچینیم! اینجا با یه دستور ساده، اطلاعات رو از جدول اصلی thermostat به جدول پارتیشنبندیشده iot_thermostat منتقل میکنیم:
INSERT INTO iot_thermostat SELECT * FROM thermostat;
نگران نباش، لازم نیست به PostgreSQL بگی کدوم اطلاعات باید کجا بره. خودش حواسش هست و هر تیکه اطلاعات رو بر اساس تاریخش، توی قفسه مناسبش میذاره. مثل یه ربات قفسهچین حرفهای!🤖
برای اینکه مطمئن بشی همه چی درست انجام شده، میتونی یه نگاهی به یکی از قفسهها بندازی:
SELECT * FROM iot_thermostat07242022 LIMIT 10;
این دستور ۱۰ تا ردیف اول از قفسهی ۲۴ جولای رو نشون میده. اگه همه چی مرتب باشه، فقط اطلاعات مربوط به همون روز رو باید ببینی.
حالا انبار دادههات حسابی مرتب و منظم شده! هم پیدا کردن اطلاعات راحتتره، هم مدیریتش آسونتره. تبریک میگم، تو یه قفسهچین حرفهای شدی!
👩💻 #postgresql
@Code_Crafters711
برچسبهای روی قفسهها: ایجاد پارتیشنهای جداگانه
یادت باشه که قراره اطلاعات ترموستاتها رو بر اساس تاریخشون توی قفسههای جداگانه بچینیم. الان وقتشه که این قفسهها رو با برچسبهای مخصوصشون بسازیم. هر برچسب یه بازهی زمانی رو مشخص میکنه تا 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_Crafters711
ساخت قفسههای دیجیتالی: ایجاد جدول پارتیشنبندیشده
خب، حالا وقتشه دست به کار شیم و قفسههای دیجیتالیمون رو بسازیم! برای این کار، یه جدول جدید درست میکنیم که از همون اول پارتیشنبندیشده باشه. مثل اینکه قبل از چیدن وسایل تو انبار، قفسهها رو آماده کنیم.
دستور زیر رو بزن تا جدول جدید 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_Crafters711
بیا یه انبار دادههای باحال بسازیم: مثال پارتیشنبندی با PostgreSQL
فکر کن یه عالمه داده درباره ترموستاتهای هوشمند داریم. دما، تاریخ، وضعیت روشن/خاموش و یه عالمه اطلاعات دیگه. خب، چطوری قراره این انبوه اطلاعات رو منظم و مرتب نگه داریم؟ اینجا با پارتیشنبندی تو PostgreSQL آشنا میشیم که حکم قفسهچینهای حرفهای رو دارن!
اول یه نگاهی به انبارمون بندازیم:
SELECT * FROM thermostat LIMIT 10;
این دستور ۱۰ تا ردیف اول از جداول thermostat رو نشون میده. هر ردیف شامل تاریخ، شناسهی ترموستات، دمای فعلی و وضعیتش هست. حالا میتونیم این انبار رو با پارتیشنبندی مرتبتر و کارآمدتر کنیم. تو قسمت بعدی قراره ببینیم چطور میشه این کار رو انجام داد!
آمادهای بریم سراغ جادوی پارتیشنبندی با PostgreSQL؟ ⚡️
👩💻 #postgresql
@Code_Crafters711
انبار دادههات رو جورچین کن: با پارتیشنبندیهای مختلف!
تصور کن یه انبار بزرگ داری پر از وسایل. حالا میخوای اونارو تو قفسهها بچینی، ولی یه مدل چیدمان جواب نمیده. خب، پارتیشنبندی هم دقیقا همینطوره! راههای مختلفی برای تفکیک و چیدمان دادههات داری که به نوع اطلاعاتت بستگی داره.
چیدمان بر اساس بازه (Range): این محبوبترین مدل برای دستههای زمانی یا دادههای عددی مثل سال، ماه، روزه. مثلا میتونی اطلاعات فروش سال ۲۰۲۳ رو تو یه قفسه، سال ۲۰۲۴ رو تو یه قفسه دیگه بذاری. پیدا کردن اطلاعات یه سال خاص سریع و آسون میشه.
چیدمان بر اساس لیست (List): اگه دادههات یه دستهبندی مشخص دارن، مثل موقعیت جغرافیایی یا دستههای محصول، میتونی از این مدل استفاده کنی. مثلا اطلاعات مشتریای تهران رو تو یه قفسه، مشتریای مشهد رو تو یه قفسه دیگه بذاری. جستجو بر اساس دستههای خاص به راحتی انجام میشه.
چیدمان بر اساس هش (Hash): وقتی دستهبندی مشخصی برای دادههات نداری، میتونی از این مدل استفاده کنی. یه کد هش به هر تیکه اطلاعات اختصاص داده میشه و اونو تو قفسه مربوطه میذاره. شبیه یه انبار با برچسبهای مخفیه!
چیدمان ترکیبی (Composite): اگه دلت میخواد از ترکیب مدلهای مختلف استفاده کنی، این گزینه ایدهآله. مثلا میتونی دادههای فروش رو هم بر اساس سال (بازه) و هم بر اساس نوع محصول (لیست) دسته بندی کنی. یه انبار مرتب و تفکیکشدهی دوبل!
این فقط یه نگاه کلی به مدلهای مختلف پارتیشنبندی بود. حالا میتونی انتخاب کنی که کدوم مدل برای انبار دادههایت بهتره و یه دیتابیس منظم و دسترسیپذیر بسازی!
👩💻 #postgresql
@Code_Crafters
711
سرعتِ جت با پارتیشنبندی: وقتی انبارت مرتب باشه، پیدا کردن وسایل هم سریعتره! 🚀
یکی از دلایلی که خیلیها عاشق پارتیشنبندی هستن، افزایش سرعت جستجو توی دادههاست. تصور کن انبار وسایلت مرتب و تفکیک شده باشه. اگه بخوای یه چیز خاص رو پیدا کنی، خیلی سریعتر پیداش میکنی، نه؟ پارتیشنبندی هم دقیقا همین کار رو با دادههات میکنه.
وقتی دادههات رو بر اساس تاریخ یا یه کلید خاص پارتیشنبندی میکنی، جستجوها به جای اینکه کل انبار رو زیر و رو کنن، مستقیم به بخش مربوطه میرن. مثل اینه که تو انبارت، برای هر دسته از وسایل یه قفسه جدا داشته باشی. حالا اگه دنبال کلاه زمستونی میگردی، مستقیم به قفسهی لباسهای زمستونی میری، نه اینکه تکتک سبدهای خونه رو بگردی!
اینجوری جستجو خیلی سریعتر انجام میشه، مخصوصا وقتی از ایندکسها یا همون برچسبهای راهنما هم استفاده کنی. دیگه خبری از انتظارای طولانی برای پیدا کردن یه تیکه اطلاعات توی یه انبار دادههای بههمریخته نیست. همه چی مرتب و منظم، با دسترسی سریع و یه کلیک!
👩💻 #postgresql
@Code_Crafters
