Channel: Ninja Learn | نینجا لرن
خب خب خب، Volume توی داکر🐳
Volume ها توی داکر یه راه استاندارد برای ذخیره ی داده ها به شکل پایدار(persistent data) هستن. یعنی وقتی که یه کانتینر خاموش یا پاک میشه، داده هایی که داخل Volume ذخیره شده باشن از بین نمیرن و دوباره قابل استفاده هستن. که این یعنی Volume ها جدا از لایه ی فایل سیستم کانتینر عمل میکنن و توی
چطور ازشون استفاده کنیم؟🤔
میتونید با استفاده از دستور زیر Volumeها رو مدیریت کنید.
نکته⚠️: اگه یه Volume هنوز به یه کانتینر متصل باشه، نمیشه مستقیم با rm حذفش کرد.
بعد از ساختن Volume های مورد نظرتون میتونید به این شکل وصلشون کنید به کانتینر هاتون:
یا توی فایل compose:
خب همونطور که دیدین، اسم Volume رو سمت چپ دو نقطه و مسیری که میخوایم توی کانتینر بهش وصل بشیم رو سمت راست میذاریم.
با اینکار هر تغییری که توی مسیر
یه نکته ی مهم⚠️
احتمالا توی بعضی جاها دیده باشین که از سینتکس زیر استفاده میشه:
توی این روش سمت راست دونقطه به جای اسم Volume، مسیر فعلی توی سیستم قرار داده شده. توی این روش اصلا از Volume استفاده نمیشه و اسمش Bind Mount هست. درواقع اگه سمت راست دو نقطه به جای اسم Volume یه مسیر توی فایل سیستمتون رو بنویسید، Bind Mount اتفاق میوفته.
اینجا به جای اینکه یه Volume رو به فایل سیستم کانتینر وصل کرده باشیم، پوشه فعلی از فایل سیستم اصلی خودمون رو به فایل سیستم کانتینر وصل کردیم. این کار باعث بروز یه سری مشکلات میشه:
1️⃣ اگه اطلاعات توی کانتینر از دست برن توی فایل سیستم اصلی هم از دست میرن
جمع بندی✍️
Volume ها بشدت کاربردی هستن و میتونن برنامه نویس و کد رو نجات بدن. فقط باید دقت کنید که مسیر درستی رو به Volume بدین.
همچنین Bind Mount هم میتونه توی فاز توسعه کاربردی باشه. چون خیلی راحت میشه تغییرات توی کد رو روی کانتینر مشاهده و بررسی کرد ولی برای محیط پروداکشن خیلی خطرناک هستن و میتونن کلا محصول شمارو خراب کنن.
➖➖➖➖➖➖➖➖➖➖
Volume ها توی داکر یه راه استاندارد برای ذخیره ی داده ها به شکل پایدار(persistent data) هستن. یعنی وقتی که یه کانتینر خاموش یا پاک میشه، داده هایی که داخل Volume ذخیره شده باشن از بین نمیرن و دوباره قابل استفاده هستن. که این یعنی Volume ها جدا از لایه ی فایل سیستم کانتینر عمل میکنن و توی
/var/lib/docker/volumes/
نگهداری میشن. کاربردشون معمولا برای دیتابیس ها، فایل های کاربر، یا هر داده ای که نباید با حذف کانتینر از دست بره هست.چطور ازشون استفاده کنیم؟🤔
میتونید با استفاده از دستور زیر Volumeها رو مدیریت کنید.
docker volume ls
# List all existing volumes
docker volume create NAME
# Create a new volume
docker volume inspect NAME
# View detailed information about a volume
docker volume rm NAME
# Remove a specific volume
docker volume prune
# Remove all unused volumes
نکته⚠️: اگه یه Volume هنوز به یه کانتینر متصل باشه، نمیشه مستقیم با rm حذفش کرد.
بعد از ساختن Volume های مورد نظرتون میتونید به این شکل وصلشون کنید به کانتینر هاتون:
docker run -v my_volume:/app/data my_image
یا توی فایل compose:
services:
app:
image: my_image
container_name: my_container
volumes:
- my_volume:/app/data
volumes:
my_volume:
خب همونطور که دیدین، اسم Volume رو سمت چپ دو نقطه و مسیری که میخوایم توی کانتینر بهش وصل بشیم رو سمت راست میذاریم.
با اینکار هر تغییری که توی مسیر
/app/data/
توی فایل سیستم کانتینر رخ بده توی Volume هم ذخیره میشه و حتی با خاموش شدن کانتینر هم در دسترس و قابل استفاده هست.یه نکته ی مهم⚠️
احتمالا توی بعضی جاها دیده باشین که از سینتکس زیر استفاده میشه:
services:
app:
image: my_image
container_name: my_container
volumes:
- .:/app/data
توی این روش سمت راست دونقطه به جای اسم Volume، مسیر فعلی توی سیستم قرار داده شده. توی این روش اصلا از Volume استفاده نمیشه و اسمش Bind Mount هست. درواقع اگه سمت راست دو نقطه به جای اسم Volume یه مسیر توی فایل سیستمتون رو بنویسید، Bind Mount اتفاق میوفته.
اینجا به جای اینکه یه Volume رو به فایل سیستم کانتینر وصل کرده باشیم، پوشه فعلی از فایل سیستم اصلی خودمون رو به فایل سیستم کانتینر وصل کردیم. این کار باعث بروز یه سری مشکلات میشه:
1️⃣ اگه اطلاعات توی کانتینر از دست برن توی فایل سیستم اصلی هم از دست میرن
یعنی اگه شما پروژه رو توی کانتینر حذف کنید، از روی سیستم خودتون هم حذف میشه. درواقع هر تغییری که توی کانتینر ایجاد کنید توی فایل سیستم اصلیتون هم ایجاد میشه.2️⃣ عدم تطابق نسخه ی فایل ها
وقتی چند تا کانتینر همزمان یه مسیر رو Bind کردن، ممکنه فایل ها تصادفی توسط یکی از کانتینر ها تغییر کنه و هماهنگی بین فایل های پروژه به هم بریزه و باعث خرابی بشه.3️⃣ ریسک های امنیتی
اگه داخل کانتینر دسترسی root باشه و به پوشه های حساسی Bind Mount شده باشه، کانتینر میتونه مستقیما به فایل های سیستمی آسیب بزنه.4️⃣ انتقال ناخواسته ی فایل های حساس
اگه اشتباهی کل home/ یا / رو mount کنید داخل کانتینر، ممکنه فایل های حساس(مثل SSH Keyها، توکن ها، رمزها و...) هم توی محیط کانتینر قابل دسترس باشه.
جمع بندی✍️
Volume ها بشدت کاربردی هستن و میتونن برنامه نویس و کد رو نجات بدن. فقط باید دقت کنید که مسیر درستی رو به Volume بدین.
همچنین Bind Mount هم میتونه توی فاز توسعه کاربردی باشه. چون خیلی راحت میشه تغییرات توی کد رو روی کانتینر مشاهده و بررسی کرد ولی برای محیط پروداکشن خیلی خطرناک هستن و میتونن کلا محصول شمارو خراب کنن.
#️⃣ #programming #devops
➖➖➖➖➖➖➖➖➖➖
🥷🏻 CHANNEL | GROUP
👍13
خب خب خب، Middleware های FastAPI🚀
خب middleware یه کد واسط بین دریافت درخواست و پاسخ دادن توی یه اپلیکیشن وبه. یعنی هر ریکوئستی که به سرور میرسه، قبل از رسیدن به route اصلی، از middleware رد میشه و همچنین هر درخواستی هم قبل از رسیدن به کلاینت از middleware عبور میکنه تا تغییر داده بشه، لاگ بشه و ...
چطور توی FastAPI ازشون استفاده کنیم؟🤔
Middleware ها توی FastAPI با دکوریتور
همونطور که توی مثال بالا دیدید، هر کدی که قبل از اجرای
چندتا مثال ساده برای درک کاربرداش🛠️
از چندتا مثال ساده میتونیم استفاده کنیم
لاگ گیری ساده درخواست ها:
اضافه کردن Header به پاسخ:
سنجش مدت زمان اجرای درخواست:
چندتا نکته📎
1️⃣کلاس Middleware که از FastAPI ایمپورت شده درواقع همون کلاس Middleware توی Starlette هست و برای راحتی میتونیم از FastAPI ایمپورتش کنیم.
2️⃣اگه dependency ای داشته باشیم که با
3️⃣اگه BackgrounTask ای وجود داشته باشه، اون ها بعد از اجرای همه ی middleware ها اجرا میشن.
جمع بندی✍️
با استفاده از middleware ها میتونید درخواست و پاسخ هارو تمیز کنید، یا قبل از پردازش شدنشون توسط route کارایی که میخواین رو انجام بدین. درواقع با تعریف middleware یه تابع بین client و route اصلی قرار میدیم.
➖➖➖➖➖➖➖➖➖➖
خب middleware یه کد واسط بین دریافت درخواست و پاسخ دادن توی یه اپلیکیشن وبه. یعنی هر ریکوئستی که به سرور میرسه، قبل از رسیدن به route اصلی، از middleware رد میشه و همچنین هر درخواستی هم قبل از رسیدن به کلاینت از middleware عبور میکنه تا تغییر داده بشه، لاگ بشه و ...
چطور توی FastAPI ازشون استفاده کنیم؟🤔
Middleware ها توی FastAPI با دکوریتور
app.middleware
تعریف میشن و معمولا ساختارشون این شکلیه:from fastapi import FastAPI, Request
app = FastAPI()
@app.middleware("http")
async def my_middleware(request: Request, call_next):
# Before reaching route
print("Before route")
# Executing View
response = await call_next(request)
# After view did its thing
print("After route")
return response
همونطور که توی مثال بالا دیدید، هر کدی که قبل از اجرای
call_next
باشه مربوط به درخواست، و هر کدی که بعد از اجرای call_next
نوشته بشه مربوط به پاسخ میشه.توی این مثال قبل از رسیدن درخواست به route اصلی، عبارت 'Before route' چاپ میشه و بعد اینکه route پردازشش با درخواست تموم شد و پاسخ آماده ی برگشت به کلاینت بود، عبارت 'After route' چاپ میشه و بعد از اون پاسخ به کلاینت میرسه.
چندتا مثال ساده برای درک کاربرداش🛠️
از چندتا مثال ساده میتونیم استفاده کنیم
لاگ گیری ساده درخواست ها:
@app.middleware("http")
async def log_requests(request: Request, call_next):
print(f"New request: {request.method} {request.url}")
response = await call_next(request)
return response
اضافه کردن Header به پاسخ:
@app.middleware("http")
async def add_custom_header(request: Request, call_next):
response = await call_next(request)
response.headers["X-App-Version"] = "1.0.0"
return response
سنجش مدت زمان اجرای درخواست:
import time
@app.middleware("http")
async def measure_time(request: Request, call_next):
start = time.time()
response = await call_next(request)
duration = time.time() - start
response.headers["X-Process-Time"] = str(duration)
return response
چندتا نکته📎
1️⃣کلاس Middleware که از FastAPI ایمپورت شده درواقع همون کلاس Middleware توی Starlette هست و برای راحتی میتونیم از FastAPI ایمپورتش کنیم.
2️⃣اگه dependency ای داشته باشیم که با
yield
تعریف شدن، بخش خرجی اون ها بعد از اجرای middleware اجرا میشه.3️⃣اگه BackgrounTask ای وجود داشته باشه، اون ها بعد از اجرای همه ی middleware ها اجرا میشن.
جمع بندی✍️
با استفاده از middleware ها میتونید درخواست و پاسخ هارو تمیز کنید، یا قبل از پردازش شدنشون توسط route کارایی که میخواین رو انجام بدین. درواقع با تعریف middleware یه تابع بین client و route اصلی قرار میدیم.
#️⃣ #fastapi #python #backend
➖➖➖➖➖➖➖➖➖➖
🥷🏻 CHANNEL | GROUP
❤14
Forwarded from CBE ARCHIVE
بروبچ سلام
افتتاحیه کامیونیتی CS12 در 05-05-2025 یعنی 15 اردیبهشت ماه سال 1404 از ساعت 14:00 تا 17:00 در لوکیشن "شهر زیبا" در شهر تهران برگزار میشه.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2🔥1
خب خب خب، تسک های CPU Bound🔧
احتمالا CPU Bound به گوشتون خورده، همون تسک هایی که بار پردازشی سنگینی دارن. یعنی دیگه منتظر عملیات I/O(خوندن از فایل یا دیتابیس، API خارجی و...) نیستن و عملا انجام شدنشون توسط CPU طول میکشه.
CPU Bound🧮
خب وقتی که به صورت عادی برناممون رو توسعه میدیم، برنامه ی ما فقط توی یک Process و یک هسته ی CPU اجرا میشه. اگه برنامه کار سنگینی مثل پردازش تصویر، محاسبات ریاضی فوق سنگین، الگوریتم های رمزنگاری و فشرده سازی و... داشته باشه، نتیجه اجرا شدنش توی یک Process چیزی بجز کندی و فشار روی CPU نیست. برای مثال شما یه CPU با ۸ هسته دارید ولی برنامه ای که نوشتید فقط روی یک هسته اجرا میشه.
توی این موقعیت میتونیم از Multi Processing استفاده کنیم.
Multi Processing یعنی چی؟🧐
میتونیم با استفاده از Multi Processing برنامه ای که نوشتیم رو توی چند Process و روی چند هسته اجرا کنیم. اینجوری از تمام توان CPU استفاده میشه و در نتیجه هم برنامه ما سریع تر میشه و هم فشار روی هسته های CPU تقسیم میشه.
چرا Multi Threading مناسب نیست؟💈
توی پایتون برای تسک های CPU Bound نمیتونیم از Multi Threading استفاده کنیم. چون پایتون یه چیزی به اسم GIL داره که باعث میشه فقط یک Thread بتونه در لحظه اجرا بشه.
یعنی اگه برای تسک های CPU Bound ازش استفاده کنیم در عمل فقط یک Thread داره واقعا اجرا میشه.
استفاده از Multi Processing🛠
با استفاده از ماژول multiprocessing میتونیم از محدودیت GIL عبور کنیم و چند process داشته باشیم.
یه مثال ساده:
این کد تابع cpu_bound_task رو همزمان توی ۴ تا process اجرا میکنه. هر process حافظه، thread و هسته ی CPU خودش رو داره. با اینکار میتونیم واقعا تسک های CPU Bound رو موازی اجرا کنیم و از مزایایی مثل سرعت بهتر بهره مند شیم.
جمع بندی✍️
در نهایت، وقتی با برنامهای سروکار داریم که CPU-bound هست، خیلی مهمه که درست تشخیص بدیم چه راهحلی برای بهینهسازی استفاده از منابع لازم داریم. توی پایتون، وقتی از multi threading استفاده میکنیم، به دلیل محدودیت GIL، همهی پردازشها روی یه هسته و یه thread اجرا میشن.
برای اینکه بتونیم از چند هستهی CPU استفاده کنیم و پردازشهای سنگین رو سریعتر انجام بدیم، باید از multi processing بهره بگیریم. با این روش، میتونیم هر بخش از برنامه رو به یک process جداگانه اختصاص بدیم که به طور مستقل و همزمان روی هستههای مختلف CPU اجرا بشه.
➖➖➖➖➖➖➖➖➖➖
احتمالا CPU Bound به گوشتون خورده، همون تسک هایی که بار پردازشی سنگینی دارن. یعنی دیگه منتظر عملیات I/O(خوندن از فایل یا دیتابیس، API خارجی و...) نیستن و عملا انجام شدنشون توسط CPU طول میکشه.
CPU Bound🧮
خب وقتی که به صورت عادی برناممون رو توسعه میدیم، برنامه ی ما فقط توی یک Process و یک هسته ی CPU اجرا میشه. اگه برنامه کار سنگینی مثل پردازش تصویر، محاسبات ریاضی فوق سنگین، الگوریتم های رمزنگاری و فشرده سازی و... داشته باشه، نتیجه اجرا شدنش توی یک Process چیزی بجز کندی و فشار روی CPU نیست. برای مثال شما یه CPU با ۸ هسته دارید ولی برنامه ای که نوشتید فقط روی یک هسته اجرا میشه.
توی این موقعیت میتونیم از Multi Processing استفاده کنیم.
Multi Processing یعنی چی؟🧐
میتونیم با استفاده از Multi Processing برنامه ای که نوشتیم رو توی چند Process و روی چند هسته اجرا کنیم. اینجوری از تمام توان CPU استفاده میشه و در نتیجه هم برنامه ما سریع تر میشه و هم فشار روی هسته های CPU تقسیم میشه.
چرا Multi Threading مناسب نیست؟💈
توی پایتون برای تسک های CPU Bound نمیتونیم از Multi Threading استفاده کنیم. چون پایتون یه چیزی به اسم GIL داره که باعث میشه فقط یک Thread بتونه در لحظه اجرا بشه.
یعنی اگه برای تسک های CPU Bound ازش استفاده کنیم در عمل فقط یک Thread داره واقعا اجرا میشه.
استفاده از Multi Processing🛠
با استفاده از ماژول multiprocessing میتونیم از محدودیت GIL عبور کنیم و چند process داشته باشیم.
یه مثال ساده:
from multiprocessing import Process
def cpu_bound_task():
# مثلاً محاسبهی یک عدد بزرگ
total = 0
for i in range(10**7):
total += i
print(total)
if __name__ == '__main__':
processes = []
for _ in range(4):
p = Process(target=cpu_bound_task)
p.start()
processes.append(p)
for p in processes:
p.join()
این کد تابع cpu_bound_task رو همزمان توی ۴ تا process اجرا میکنه. هر process حافظه، thread و هسته ی CPU خودش رو داره. با اینکار میتونیم واقعا تسک های CPU Bound رو موازی اجرا کنیم و از مزایایی مثل سرعت بهتر بهره مند شیم.
اگه پروژتون بزرگه بهتره تسک های سنگین رو به سیستم هایی مثل Celery بسپرین و از worker های process-based استفاده کنید.
جمع بندی✍️
در نهایت، وقتی با برنامهای سروکار داریم که CPU-bound هست، خیلی مهمه که درست تشخیص بدیم چه راهحلی برای بهینهسازی استفاده از منابع لازم داریم. توی پایتون، وقتی از multi threading استفاده میکنیم، به دلیل محدودیت GIL، همهی پردازشها روی یه هسته و یه thread اجرا میشن.
برای اینکه بتونیم از چند هستهی CPU استفاده کنیم و پردازشهای سنگین رو سریعتر انجام بدیم، باید از multi processing بهره بگیریم. با این روش، میتونیم هر بخش از برنامه رو به یک process جداگانه اختصاص بدیم که به طور مستقل و همزمان روی هستههای مختلف CPU اجرا بشه.
#️⃣ #programmin #python
➖➖➖➖➖➖➖➖➖➖
🥷🏻 CHANNEL | GROUP
👍10❤2
خب خب خب، Background Task ها توی FastAPI🚀
گاهی اوقات نیاز داریم که یه کاری بعد از ارسال پاسخ به کاربر انجام بشه. مثل ارسال ایمیل خوشامد گویی، ثبت لاگ یا آمار توی دیتابیس، پردازش فایل آپلود شده و .... توی این شرایط میتونیم از Background Task ها استفاده کنیم، اینجوری میتونیم بدون معطل کردن کاربر اون کارهارو جداگانه انجام بدیم.
استفاده از Background Task ها🛠
خب اول باید کلاس
حالا FastAPI میاد یه آبجکت با نوع
بعد از اینکه فانکشن تسکمون رو ایجاد کردیم میتونیم با استفاده از متود
Background Tasks و Dependency injection💉
Background Tasks به خوبی با سیستم تزریق وابستگی FastAPI سازگاره. میتونیم توی سطح های مختلف برنامه(فانکشن route، یه وابستگی و...) از Background Task استفاده کنیم.
توی این مثال بعد از اینکه پاسخ به کلاینت ارسال شد، یه تسک میاد ایمیل کاربر رو توی فایل
نکته مهم⚠️
این ابزار فقط برای کارهای سبک وسریع مناسبه. مثل همین لاگ نوشتن، ارسال ایمیل یا پردازش های خیلی کوچیک و سبک. برای کارهای سنگین تر مثل پردازش تصویر بهتره که از سیستم هایی مثل Celery استفاده بشه.
جمع بندی✍️
Background Task یه ابزار ساده ولی کاربردیه. میتونه توی پروژه هایی که تسک های سنگینی ندارن از Celery بی نیازتون کنه و کارهارو بعد از پاسخ دهی به صورت غیرهمزمان انجام بده.
➖➖➖➖➖➖➖➖➖➖
گاهی اوقات نیاز داریم که یه کاری بعد از ارسال پاسخ به کاربر انجام بشه. مثل ارسال ایمیل خوشامد گویی، ثبت لاگ یا آمار توی دیتابیس، پردازش فایل آپلود شده و .... توی این شرایط میتونیم از Background Task ها استفاده کنیم، اینجوری میتونیم بدون معطل کردن کاربر اون کارهارو جداگانه انجام بدیم.
استفاده از Background Task ها🛠
خب اول باید کلاس
BackgroundTasks
رو ایمپورت کنیم و یه پارامتر از همین نوع برای فانکشن route بنویسیم.from fastapi import BackgroundTasks, FastAPI
app = FastAPI()
def write_notification(email: str, message=""):
with open("log.txt", mode="w") as email_file:
content = f"notification for {email}: {message}"
email_file.write(content)
@app.post("/send-notification/{email}")
async def send_notification(email: str, background_tasks: BackgroundTasks):
background_tasks.add_task(write_notification, email, message="some notification")
return {"message": "Notification sent in the background"}
حالا FastAPI میاد یه آبجکت با نوع
BackgroundTasks
برامون ایجاد میکنه و به اون پارامتر پاس میده.بعد از اینکه فانکشن تسکمون رو ایجاد کردیم میتونیم با استفاده از متود
()add_task
از همون پارامتر اون فانکشن رو به صف اجرا اضافه کنیم. همچنین میتونیم آرگومان های مورد نیازمون رو هم با استفاده از همین متود به تسکمون پاس بدیم.Background Tasks و Dependency injection💉
Background Tasks به خوبی با سیستم تزریق وابستگی FastAPI سازگاره. میتونیم توی سطح های مختلف برنامه(فانکشن route، یه وابستگی و...) از Background Task استفاده کنیم.
from typing import Annotated
from fastapi import BackgroundTasks, Depends, FastAPI
app = FastAPI()
def write_log(message: str):
with open("log.txt", mode="a") as log:
log.write(message)
def get_query(background_tasks: BackgroundTasks, q: str | None = None):
if q:
message = f"found query: {q}\n"
background_tasks.add_task(write_log, message)
return q
@app.post("/send-notification/{email}")
async def send_notification(
email: str, background_tasks: BackgroundTasks, q: Annotated[str, Depends(get_query)]
):
message = f"message to {email}\n"
background_tasks.add_task(write_log, message)
return {"message": "Message sent"}
توی این مثال بعد از اینکه پاسخ به کلاینت ارسال شد، یه تسک میاد ایمیل کاربر رو توی فایل
log.txt
مینویسه. اگه یه کوئری پارامتر هم به API ارسال بشه یه تسک دیگه اون رو هم توی فایل مینویسه.نکته مهم⚠️
این ابزار فقط برای کارهای سبک وسریع مناسبه. مثل همین لاگ نوشتن، ارسال ایمیل یا پردازش های خیلی کوچیک و سبک. برای کارهای سنگین تر مثل پردازش تصویر بهتره که از سیستم هایی مثل Celery استفاده بشه.
جمع بندی✍️
Background Task یه ابزار ساده ولی کاربردیه. میتونه توی پروژه هایی که تسک های سنگینی ندارن از Celery بی نیازتون کنه و کارهارو بعد از پاسخ دهی به صورت غیرهمزمان انجام بده.
#️⃣ #fastapi #python #backend
➖➖➖➖➖➖➖➖➖➖
🥷🏻 CHANNEL | GROUP
👍10❤6
خب خب خب، Redis ولی برای چه کاری؟🗃
خب خیلی وقتا اسم ردیس رو شنیدید ولی دقیقا ندونید که کاربردش چیه و کجا استفاده میشه.
اصلا Redis چی هست؟🤔
خیلی ساده بخوام بگم، ردیس یه دیتابیس in-memory هست که با ساختار کلید و مقدار(key-value) کار میکنه. یعنی داده ها به صورت یک کلید و یک مقدار توش ذخیره میشن. حالا همون in-memory بودنش باعث شده تا سرعت فوقالعاده بالای داشته باشه.
ویژگی های Redis🔍
1️⃣ in-memory بودن که باعث سرعت بالاش شده.
2️⃣ پشتیبانی از TTL یا همون انقضای خودکار داده ها.
3️⃣ Atomic بودن عملیات ها.
4️⃣ پشتیبانی از Pub/Sub برای ارسال پیام بین سرویس ها.
5️⃣ قابلیت Cluster و Scale افقی
خب کجا کاربرد داره؟🛠
کش(Cache): وقتی یه داده ی پرتکرار داریم که نمیخوایم هربار از منبع دریافتش کنیم(مثلا دیتابیس اصلی پروژه) میتونیم یه بار دریافتش کنیم، توی redis ذخیرش کنیم و درنهایت توی درخواست های بعدی اون داده رو از redis دریافت کنیم. فقط باید حواسمون باشه که داده هایی که توی redis هستن بسته به داده ای که داریم توی یه بازه زمانی مشخص آپدیت بشن تا داده های قدیمی برنگردونیم.
صف پیام(Message Queue): خب redis میتونه به عنوان یه صف سبک کار کنه. مثلا برای صف بندی ایمیل هایی که میخوایم ارسال کنیم، تسک های پس زمینه و خیلی چیزای دیگه.
مدیریت نشست ها(Session Management): برای ذخیره سازی session های کاربرا با زمان انقضا. خیلی از سیستم های احراز هویت و مدیریت سبد خرید توی سایت های فروشگاهی از redis استفاده میکنن.
جمع بندی✍️
Redis یه ابزار سبک و سریعه که با سرعت فوقلعادش برای کارهای موقتی و سریع عالیه. این دیتابیس داده هارو به شکل key-value ذخیره میکنه. اگه تسکایی دارین که نیاز به دسترسی سریع، ذخیره ی موقت یا مدیریت ساده ی تسک ها نیاز دارن، Redis میتونه انتخاب خوبی باشه.
➖➖➖➖➖➖➖➖➖➖
خب خیلی وقتا اسم ردیس رو شنیدید ولی دقیقا ندونید که کاربردش چیه و کجا استفاده میشه.
اصلا Redis چی هست؟🤔
خیلی ساده بخوام بگم، ردیس یه دیتابیس in-memory هست که با ساختار کلید و مقدار(key-value) کار میکنه. یعنی داده ها به صورت یک کلید و یک مقدار توش ذخیره میشن. حالا همون in-memory بودنش باعث شده تا سرعت فوقالعاده بالای داشته باشه.
ویژگی های Redis🔍
1️⃣ in-memory بودن که باعث سرعت بالاش شده.
2️⃣ پشتیبانی از TTL یا همون انقضای خودکار داده ها.
3️⃣ Atomic بودن عملیات ها.
4️⃣ پشتیبانی از Pub/Sub برای ارسال پیام بین سرویس ها.
5️⃣ قابلیت Cluster و Scale افقی
خب کجا کاربرد داره؟🛠
کش(Cache): وقتی یه داده ی پرتکرار داریم که نمیخوایم هربار از منبع دریافتش کنیم(مثلا دیتابیس اصلی پروژه) میتونیم یه بار دریافتش کنیم، توی redis ذخیرش کنیم و درنهایت توی درخواست های بعدی اون داده رو از redis دریافت کنیم. فقط باید حواسمون باشه که داده هایی که توی redis هستن بسته به داده ای که داریم توی یه بازه زمانی مشخص آپدیت بشن تا داده های قدیمی برنگردونیم.
صف پیام(Message Queue): خب redis میتونه به عنوان یه صف سبک کار کنه. مثلا برای صف بندی ایمیل هایی که میخوایم ارسال کنیم، تسک های پس زمینه و خیلی چیزای دیگه.
مدیریت نشست ها(Session Management): برای ذخیره سازی session های کاربرا با زمان انقضا. خیلی از سیستم های احراز هویت و مدیریت سبد خرید توی سایت های فروشگاهی از redis استفاده میکنن.
جمع بندی✍️
Redis یه ابزار سبک و سریعه که با سرعت فوقلعادش برای کارهای موقتی و سریع عالیه. این دیتابیس داده هارو به شکل key-value ذخیره میکنه. اگه تسکایی دارین که نیاز به دسترسی سریع، ذخیره ی موقت یا مدیریت ساده ی تسک ها نیاز دارن، Redis میتونه انتخاب خوبی باشه.
#️⃣ #programming #db
➖➖➖➖➖➖➖➖➖➖
🥷🏻 CHANNEL | GROUP
👍10❤1
خب خب خب، انواع کلید توی دیتابیس های رابطه ای🔑
کلید ها توی دیتابیس ها نقش حیاتی ای توی تضمین یکپارچگی و سازماندهی داده ها دارن. شاید تا الان موقع طراحی دیتابیس به این فکر کرده باشین که مثلا Primary Key چیه؟ چطوری تعیین میشه؟ یا اینکه اصلا Foreign Key چیه؟ توی این پست مهم ترین کلیدهای دیتابیس رو باهم مرور میکنیم.
1. کلید اولیه یا اصلی (Primary Key):
هر جدول یک کلید اولیه داره که رکوردها رو بهصورت یکتا شناسایی میکنه. مقادیر این کلید باید منحصربهفرد و غیر NULL باشن.
مثال: توی جدول کاربران، user_id به عنوان کلید اولیه عمل میکنه. نمیتونه NULL باشه و حتما باید منحصر به فرد باشه.
2. کلید خارجی (Foreign Key):
کلید خارجی ارتباط بین دو جدول را فراهم میکنه و به کلید اولیه یک جدول دیگر اشاره داره. این کلید برای حفظ یکپارچگی مرجع استفاده میشه. درواقع ستونی که به کلید اصلی یه جدول دیگه اشاره کنه رو کلید خارجی میگن.
مثال: توی جدول سفارشات، user_id به کلید اولیه جدول کاربران اشاره میکنه. کلید اصلی از جدول کاربران توی جدول سفارشات استفاده شده و توی جدول سفارشات بهش میگیم کلید خارجی.
3. کلید ترکیبی (Composite Key):
کلیدی که از ترکیب چند ستون ساخته میشه و برای شناسایی یکتا به کار میره. معمولاً زمانی که یک ستون به تنهایی کافی نیست از کلید ترکیبی استفاده میشه.
مثال: در جدول ثبتنامها، ترکیب student_id و course_id یک کلید ترکیبی ایجاد میکنه.
4. کلید کاندید (Candidate Key):
هر ستون یا ترکیبی از ستونها که بتونه به عنوان کلید اصلی استفاده بشه، کلید کاندید نامیده میشه. هر جدول میتواند چندین کلید کاندید داشته باشه، اما فقط یکی از اونها به عنوان کلید اصلی انتخاب میشن. خیلی ساده تر بخوام بگم ستون یا ستون هایی که میتونستند به عنوان کلید اصلی انتخاب بشن.
مثال: توی جدول محصولات، ستونهای product_code و product_name میتونن به عنوان کلید کاندید عمل کنن.
5. سوپر کلید (Super Key):
سوپر کلید، هر مجموعهای از ستونهاست که میتونه هر رکورد توی جدول رو بهطور یکتا شناسایی کنه. همه کلیدهای کاندید و کلید اصلی، سوپر کلید هستند، ولی هر سوپر کلیدی کاندید نیست.
مثال: ستون user_id یا ترکیب user_id و email در جدول کاربران میتواند سوپر کلید باشد.
7. کلید جایگزین (Alternate Key):
زمانی که یک کلید کاندید به عنوان کلید اولیه انتخاب نمیشه، بهش کلید جایگزین میگن. این کلید هنوز قابلیت شناسایی یکتا را داره،ولی به عنوان کلید اصلی انتخاب نشده.
مثال: اگر توی جدول کاربران هم user_id و هم email کلید کاندید باشن و user_id به عنوان کلید اصلی انتخاب بشه، email کلید جایگزین خواهد بود.
8. کلید منحصر به فرد (Unique Key):
مثل کلید کاندیده با این تفاوت که کلید منحصر به فرد میتونه مقدار NULL داشته باشه (در بیشتر پایگاهدادهها حتی چند مقدار NULL مجازه)، ولی مقادیر غیر NULL نباید تکراری باشن. کلید منحصر به فرد در تضمین یکتایی دادهها موثر هست.
مثال: توی جدول کاربران، email میتونه یک کلید منحصر به فرد باشه، به این صورت که مقادیر ایمیل نباید تکراری باشن، اما میتونن NULL باشند.
جمع بندی✍️
این کلیدها به شما کمک میکنن تا وابستگیهای تابعی رو بهتر بشناسید و ساختار دیتابیستون رو اصولی و منظم طراحی کنید. همچنین باعث میشن دیتابیستون هم مقیاسپذیرتر باشه و هم برای تغییرات آینده آمادهتر.
➖➖➖➖➖➖➖➖➖➖
کلید ها توی دیتابیس ها نقش حیاتی ای توی تضمین یکپارچگی و سازماندهی داده ها دارن. شاید تا الان موقع طراحی دیتابیس به این فکر کرده باشین که مثلا Primary Key چیه؟ چطوری تعیین میشه؟ یا اینکه اصلا Foreign Key چیه؟ توی این پست مهم ترین کلیدهای دیتابیس رو باهم مرور میکنیم.
1. کلید اولیه یا اصلی (Primary Key):
هر جدول یک کلید اولیه داره که رکوردها رو بهصورت یکتا شناسایی میکنه. مقادیر این کلید باید منحصربهفرد و غیر NULL باشن.
مثال: توی جدول کاربران، user_id به عنوان کلید اولیه عمل میکنه. نمیتونه NULL باشه و حتما باید منحصر به فرد باشه.
2. کلید خارجی (Foreign Key):
کلید خارجی ارتباط بین دو جدول را فراهم میکنه و به کلید اولیه یک جدول دیگر اشاره داره. این کلید برای حفظ یکپارچگی مرجع استفاده میشه. درواقع ستونی که به کلید اصلی یه جدول دیگه اشاره کنه رو کلید خارجی میگن.
مثال: توی جدول سفارشات، user_id به کلید اولیه جدول کاربران اشاره میکنه. کلید اصلی از جدول کاربران توی جدول سفارشات استفاده شده و توی جدول سفارشات بهش میگیم کلید خارجی.
3. کلید ترکیبی (Composite Key):
کلیدی که از ترکیب چند ستون ساخته میشه و برای شناسایی یکتا به کار میره. معمولاً زمانی که یک ستون به تنهایی کافی نیست از کلید ترکیبی استفاده میشه.
مثال: در جدول ثبتنامها، ترکیب student_id و course_id یک کلید ترکیبی ایجاد میکنه.
4. کلید کاندید (Candidate Key):
هر ستون یا ترکیبی از ستونها که بتونه به عنوان کلید اصلی استفاده بشه، کلید کاندید نامیده میشه. هر جدول میتواند چندین کلید کاندید داشته باشه، اما فقط یکی از اونها به عنوان کلید اصلی انتخاب میشن. خیلی ساده تر بخوام بگم ستون یا ستون هایی که میتونستند به عنوان کلید اصلی انتخاب بشن.
مثال: توی جدول محصولات، ستونهای product_code و product_name میتونن به عنوان کلید کاندید عمل کنن.
5. سوپر کلید (Super Key):
سوپر کلید، هر مجموعهای از ستونهاست که میتونه هر رکورد توی جدول رو بهطور یکتا شناسایی کنه. همه کلیدهای کاندید و کلید اصلی، سوپر کلید هستند، ولی هر سوپر کلیدی کاندید نیست.
مثال: ستون user_id یا ترکیب user_id و email در جدول کاربران میتواند سوپر کلید باشد.
برای این میگیم هر سوپر کلیدی، کلید کاندید نیست که یه سوپر کلید ممکنه از ترکیب یه کلید اصلی و یه کلید کاندید ایجاد شده باشه(مثلا user_id+user_email) ولی چون فقط با یکی از اینها(user_id) میتونیم یه رکورد رو به صورت یکتا شناسایی کنیم و کلید دومی(user_email) یه جورایی اضافه هست، دیگه این ترکیب کاندید نیست بلکه این فیلد ها هرکدوم یه کلید کاندید به حساب میان.
7. کلید جایگزین (Alternate Key):
زمانی که یک کلید کاندید به عنوان کلید اولیه انتخاب نمیشه، بهش کلید جایگزین میگن. این کلید هنوز قابلیت شناسایی یکتا را داره،ولی به عنوان کلید اصلی انتخاب نشده.
مثال: اگر توی جدول کاربران هم user_id و هم email کلید کاندید باشن و user_id به عنوان کلید اصلی انتخاب بشه، email کلید جایگزین خواهد بود.
8. کلید منحصر به فرد (Unique Key):
مثل کلید کاندیده با این تفاوت که کلید منحصر به فرد میتونه مقدار NULL داشته باشه (در بیشتر پایگاهدادهها حتی چند مقدار NULL مجازه)، ولی مقادیر غیر NULL نباید تکراری باشن. کلید منحصر به فرد در تضمین یکتایی دادهها موثر هست.
مثال: توی جدول کاربران، email میتونه یک کلید منحصر به فرد باشه، به این صورت که مقادیر ایمیل نباید تکراری باشن، اما میتونن NULL باشند.
جمع بندی✍️
این کلیدها به شما کمک میکنن تا وابستگیهای تابعی رو بهتر بشناسید و ساختار دیتابیستون رو اصولی و منظم طراحی کنید. همچنین باعث میشن دیتابیستون هم مقیاسپذیرتر باشه و هم برای تغییرات آینده آمادهتر.
#️⃣ #programming #db
➖➖➖➖➖➖➖➖➖➖
🥷🏻 CHANNEL | GROUP
👍9❤3
خب خب خب، وابستگی های تابعی توی دیتابیس ها🗄
وقتی داریم یه دیتابیس رو طراحی میکنیم، ممکنه با مسئله ای رو به رو بشیم که داده هامون تکراری بشن یا اینکه ناسازگاری پیش بیاد. اینجا میتونیم با استفاده از وابستگی های تابعی این مشکل رو حل کنیم. قبل از اینکه بتونیم وابستگیهای تابعی رو تشخیص بدیم، باید کلیدهای جدولهامون رو بشناسیم، چون معمولاً وابستگیها بر اساس کلیدها تعریف میشن. اگه با کلیدها آشنا نیستین توی این پست درمورد کلیدها هم توضیح دادیم.
وابستگی تابعی چیه؟🧐
وابستگی تابعی زمانی رخ میده که مقدار یک ستون در جدول بتونه مقدار یه ستون دیگه رو مشخص کنه. یعنی اگه دو سطر در ستون A مقدار یکسانی داشته باشن، حتما مقدار ستون B هم باید یکسان باشه. وابستگی تابعی رو به شکل زیر نمایش میدیم:
A->B
این نماد به این معناست که ستون A مقدار ستون B رو تعیین میکنه. یا از یه زاویه دیگه بهش نگاه کنیم، ستون B به ستون A وابسته هست.
برای مثال توی جدول کارمندان، emp_id میتونه emp_name رو مشخص کنه. چون هر شناسه کارمند منحصر به فرده و فقط به یک نام خاص اشاره میکنه.
اهمیت وابستگی های تابعی📝
1️⃣بهبود طراحی پایگاه داده:
شناسایی وابستگی های تابعی به ما کمک میکنن تا جدول هامون رو به شکل منطقی و بهینه طراحی کنیم و از تکرار داده ها و اطلاعات جلوگیری کنیم.
2️⃣کاهش ناهماهنگی داده:
نرمال سازی جدول ها بر اساس وابستگی های تابعی، ناهماهنگی و تناقضات داده ها رو کم میکنه و باعث بالا رفتن کیفیت داده ها میشه.
3️⃣پیدا کردن کلیدهای کاندید:
وابستگی های تابعی به پیدا کردن کلیدهای کاندید کمک میکنن.
4️⃣بهینه سازی عملکرد:
طراحی بر اساس وابستگی های تابعی، عملکرد جستجو، به روزرسانی و حذف داده هارو بهینه میکنه و از تداخل جلوگیری میکنه.
5️⃣مدیریت داده های پیچیده:
کمک به درک بهتر ساختار و روابط داده ها در سیستم های پیچیده و جلوگیری از مشکلات احتمالی.
6️⃣نرمال فرم ها:
نرمال فرم ها معمولا براساس این وابستگی ها تعریف میشن و از اون ها برای بهینه سازی ساختار جدول ها استفاده میکنن.
نحوه کشف وابستگی های تابعی🔍
1️⃣تحلیل داده ها:
بررسی رکورد ها و شناسایی الگوها و روابط بین ستون ها.
2️⃣روش های الگوریتمی:
استفاده از الگوریتم هایی مثل Apriori و FD-Mining برای کشف وابستگی های تابعی.
3️⃣تجزیه و تحلیل آماری:
استفاده از روش های آماری مثل تحلیل همبستگی و رگرسیون برای شناسایی وابستگی ها.
4️⃣مقایسه مدل های مفهومی:
ایجاد مدل های مفهومی و مقایسه اونها با داده های واقعی.
جمع بندی✍️
توی این پست با مفهوم وابستگی های تابعی آشنا شدیم، اهمیت اون هارو درک کردیم و یاد گرفتیم چطوری کشفشون کنیم و ازشون توی روند طراحی دیتابیسمون استفاده کنیم. توی بخش بعد به انواع وابستگی های تابعی و مثال های دقیق تر میپردازیم.
➖➖➖➖➖➖➖➖➖➖
وقتی داریم یه دیتابیس رو طراحی میکنیم، ممکنه با مسئله ای رو به رو بشیم که داده هامون تکراری بشن یا اینکه ناسازگاری پیش بیاد. اینجا میتونیم با استفاده از وابستگی های تابعی این مشکل رو حل کنیم. قبل از اینکه بتونیم وابستگیهای تابعی رو تشخیص بدیم، باید کلیدهای جدولهامون رو بشناسیم، چون معمولاً وابستگیها بر اساس کلیدها تعریف میشن. اگه با کلیدها آشنا نیستین توی این پست درمورد کلیدها هم توضیح دادیم.
وابستگی تابعی چیه؟🧐
وابستگی تابعی زمانی رخ میده که مقدار یک ستون در جدول بتونه مقدار یه ستون دیگه رو مشخص کنه. یعنی اگه دو سطر در ستون A مقدار یکسانی داشته باشن، حتما مقدار ستون B هم باید یکسان باشه. وابستگی تابعی رو به شکل زیر نمایش میدیم:
A->B
این نماد به این معناست که ستون A مقدار ستون B رو تعیین میکنه. یا از یه زاویه دیگه بهش نگاه کنیم، ستون B به ستون A وابسته هست.
برای مثال توی جدول کارمندان، emp_id میتونه emp_name رو مشخص کنه. چون هر شناسه کارمند منحصر به فرده و فقط به یک نام خاص اشاره میکنه.
اهمیت وابستگی های تابعی📝
1️⃣بهبود طراحی پایگاه داده:
شناسایی وابستگی های تابعی به ما کمک میکنن تا جدول هامون رو به شکل منطقی و بهینه طراحی کنیم و از تکرار داده ها و اطلاعات جلوگیری کنیم.
2️⃣کاهش ناهماهنگی داده:
نرمال سازی جدول ها بر اساس وابستگی های تابعی، ناهماهنگی و تناقضات داده ها رو کم میکنه و باعث بالا رفتن کیفیت داده ها میشه.
3️⃣پیدا کردن کلیدهای کاندید:
وابستگی های تابعی به پیدا کردن کلیدهای کاندید کمک میکنن.
4️⃣بهینه سازی عملکرد:
طراحی بر اساس وابستگی های تابعی، عملکرد جستجو، به روزرسانی و حذف داده هارو بهینه میکنه و از تداخل جلوگیری میکنه.
5️⃣مدیریت داده های پیچیده:
کمک به درک بهتر ساختار و روابط داده ها در سیستم های پیچیده و جلوگیری از مشکلات احتمالی.
6️⃣نرمال فرم ها:
نرمال فرم ها معمولا براساس این وابستگی ها تعریف میشن و از اون ها برای بهینه سازی ساختار جدول ها استفاده میکنن.
نحوه کشف وابستگی های تابعی🔍
1️⃣تحلیل داده ها:
بررسی رکورد ها و شناسایی الگوها و روابط بین ستون ها.
2️⃣روش های الگوریتمی:
استفاده از الگوریتم هایی مثل Apriori و FD-Mining برای کشف وابستگی های تابعی.
3️⃣تجزیه و تحلیل آماری:
استفاده از روش های آماری مثل تحلیل همبستگی و رگرسیون برای شناسایی وابستگی ها.
4️⃣مقایسه مدل های مفهومی:
ایجاد مدل های مفهومی و مقایسه اونها با داده های واقعی.
جمع بندی✍️
توی این پست با مفهوم وابستگی های تابعی آشنا شدیم، اهمیت اون هارو درک کردیم و یاد گرفتیم چطوری کشفشون کنیم و ازشون توی روند طراحی دیتابیسمون استفاده کنیم. توی بخش بعد به انواع وابستگی های تابعی و مثال های دقیق تر میپردازیم.
#️⃣ #programming #db
➖➖➖➖➖➖➖➖➖➖
🥷🏻 CHANNEL | GROUP
❤7👍2
خب خب خب، انواع وابستگی های تابعی توی دیتابیس🗄
توی پست قبلی با وابستگی های تابعی آشنا شدیم و کاربردشون و نحوه کشفشون رو یاد گرفتیم. توی این پست به انواع این وابستگی ها میپردازیم.
1️⃣وابستگی تابعی کامل(Full)
زمانی رخ میده که مقدار یه ستون(B) به طور کامل توسط یک ستون دیگه(A) تعیین میشه. یعنی هیچ زیر مجموعه ای از A نمیتونه مقدار B رو تعیین کنه.
مثال: employee_id -> employee_name
2️⃣وابستگی تابعی جزئی(Partial)
زمانی رخ میده که فقط بخشی از یک کلید ترکیبی مقدار یک ستون دیگه رو تعیین میکنه.
مثال: اگر در (employee_id, department_id -> department_name) فقط department_id بتونه به تنهایی department_name رو تعیین کنه این وابستگی رخ میده.
3️⃣وابستگی تابعی متعدی(Transitive)
اگر A مقدار B رو تعیین کنه و B مقدار C رو تعیین کنه، وابستگی متعدی بین A و C رخ میده.
مثال: اگر order_id -> customer_id و customer_id -> customer_name برقرار باشن بنابراین order_id -> customer_name هم برقراره.
4️⃣وابستگی تابعی بدیهی(Trivial)
توی وابستگی تابعی بدیهی مجموعه وابسته زیر مجموعه ای از مجموعه تعیین کننده است و در این صورت مجموعه تعیین کننده مقادیر مجموعه وابسته رو تعیین میکنه.
مثال: (employee_id, employee_name -> employee_name)
5️⃣وابستگی تابعی غیربدیهی(Non-Trivial)
در وابستگی تابعی غیربدیهی مجموعه وابسته زیر مجموعه ای از مجموعه تعیین کننده نیست.
مثال: employee_id -> employee_name
6️⃣وابستگی تابعی چند مقداری(MultiValued)
زمانی رخ میده که یک کلید اولیه میتونه مقدار چندین ستون رو تعیین کنه به شرطی که بین ستون های وابسته هیچ ارتباط یا وابستگی ای نباشه.
مثال: employee_id -> (employee_name, employee_age). توی این مثال id کارمند اسم و سن اون رو تعیین میکنه ولی ارتباط یا وابستگی ای بین سن و اسم کارمند وجود نداره.
جمع بندی✍️
این ها انواع وابستگی های تابعی بودن و سعی کردم ساده و قابل فهم توضیحشون بدم. در اصل پیدا کردن و شناختنشون یکمی پیچیده تر از چیزیه که اینجا بیان شد، میتونین با مراجعه به منابع مختلف دانش خودتون توی این زمینه رو تقویت کنید.
➖➖➖➖➖➖➖➖➖➖
توی پست قبلی با وابستگی های تابعی آشنا شدیم و کاربردشون و نحوه کشفشون رو یاد گرفتیم. توی این پست به انواع این وابستگی ها میپردازیم.
1️⃣وابستگی تابعی کامل(Full)
زمانی رخ میده که مقدار یه ستون(B) به طور کامل توسط یک ستون دیگه(A) تعیین میشه. یعنی هیچ زیر مجموعه ای از A نمیتونه مقدار B رو تعیین کنه.
مثال: employee_id -> employee_name
2️⃣وابستگی تابعی جزئی(Partial)
زمانی رخ میده که فقط بخشی از یک کلید ترکیبی مقدار یک ستون دیگه رو تعیین میکنه.
مثال: اگر در (employee_id, department_id -> department_name) فقط department_id بتونه به تنهایی department_name رو تعیین کنه این وابستگی رخ میده.
3️⃣وابستگی تابعی متعدی(Transitive)
اگر A مقدار B رو تعیین کنه و B مقدار C رو تعیین کنه، وابستگی متعدی بین A و C رخ میده.
مثال: اگر order_id -> customer_id و customer_id -> customer_name برقرار باشن بنابراین order_id -> customer_name هم برقراره.
4️⃣وابستگی تابعی بدیهی(Trivial)
توی وابستگی تابعی بدیهی مجموعه وابسته زیر مجموعه ای از مجموعه تعیین کننده است و در این صورت مجموعه تعیین کننده مقادیر مجموعه وابسته رو تعیین میکنه.
مثال: (employee_id, employee_name -> employee_name)
5️⃣وابستگی تابعی غیربدیهی(Non-Trivial)
در وابستگی تابعی غیربدیهی مجموعه وابسته زیر مجموعه ای از مجموعه تعیین کننده نیست.
مثال: employee_id -> employee_name
6️⃣وابستگی تابعی چند مقداری(MultiValued)
زمانی رخ میده که یک کلید اولیه میتونه مقدار چندین ستون رو تعیین کنه به شرطی که بین ستون های وابسته هیچ ارتباط یا وابستگی ای نباشه.
مثال: employee_id -> (employee_name, employee_age). توی این مثال id کارمند اسم و سن اون رو تعیین میکنه ولی ارتباط یا وابستگی ای بین سن و اسم کارمند وجود نداره.
جمع بندی✍️
این ها انواع وابستگی های تابعی بودن و سعی کردم ساده و قابل فهم توضیحشون بدم. در اصل پیدا کردن و شناختنشون یکمی پیچیده تر از چیزیه که اینجا بیان شد، میتونین با مراجعه به منابع مختلف دانش خودتون توی این زمینه رو تقویت کنید.
#️⃣ #programming #db
➖➖➖➖➖➖➖➖➖➖
🥷🏻 CHANNEL | GROUP
❤9
خب خب خب، git reset🔄
توی گیت، دستور reset مثل یه دکمه ی سفر در زمانه که مارو به گذشته ی پروژه میبره. اما چند حالت مختلف داره و بسته به اینکه کدوم یکی از این حالت ها استفاده بشن میتونه روی تاریخچه ی پروژه هم تاثیر بزاره.
Mixed🟡
این حالت پیش فرض برای دستور reset هست. HEAD رو به کامیت مشخص شده برمیگردونه. تغییرات بعد از اون کامیت از Stage خارج میشن(unstaged) ولی تغییرات هنوز توی فایل ها هستن. برای موقعی که میخواین تغییرات باقی بمونن ولی توی Stage نباشن خوبه.
شکل کلی دستور ریست:
دستور ریست با حالت mixed:
دستور بالا آخرین کامیت رو پاک میکنه، تغییرات هنوز وجود دارن ولی دیگه توی Stage نیستن.
Soft🔵
فقط HEAD رو برمیگردونه به کامیت مشخص شده. تغییرات بعد از اون کامیت رو توی Stage نگه میداره. زمانی استفاده میشه که بخوایم کامیت رو حذف کنیم ولی تغییرات باقی بمونن، برای commit مجدد یا اصلاح پیام.
به طور مثال دستور بالا آخرین کامیت رو پاک میکنه و تغییرات رو توی Staging قرار میده.
Hard🔴
توی این حالت HEAD به کامیت مشخص شده برمیگرده، Staging area و فایل هارو کاملا با کامیت مشخص شده هماهنگ میکنه، درواقع هرتغییر یا کامیتی بعد از کامیت مشخص شده پاک میشه و پروژه برمیگرده به وضعیت همون کامیت. وقتی استفاده میشه که بخوایم همه چی رو مثل اون کامیت کنیم و تغییرات بعد از اون رو حذف کنیم.
این دستور پروژه رو طوری تغییر میده که انگار اصلا کامیت آخر وجود نداشته. هیچ تغییری هیچ جایی ذخیره نمیشه و فایل ها برمیگردن به کامیت قبلی.
جمع بندی✍️
دستور reset میتونه نجات دهنده و حتی مخرب باشه. میتونه پروژه رو نجات بده یا یه تغییر بزرگ رو از بین ببره. کاربردای مختلفی داره و برای برگشت به کامیت های قبلی به شکل های مختلف استفاده میشه.
➖➖➖➖➖➖➖➖➖➖
توی گیت، دستور reset مثل یه دکمه ی سفر در زمانه که مارو به گذشته ی پروژه میبره. اما چند حالت مختلف داره و بسته به اینکه کدوم یکی از این حالت ها استفاده بشن میتونه روی تاریخچه ی پروژه هم تاثیر بزاره.
Mixed🟡
این حالت پیش فرض برای دستور reset هست. HEAD رو به کامیت مشخص شده برمیگردونه. تغییرات بعد از اون کامیت از Stage خارج میشن(unstaged) ولی تغییرات هنوز توی فایل ها هستن. برای موقعی که میخواین تغییرات باقی بمونن ولی توی Stage نباشن خوبه.
شکل کلی دستور ریست:
git reset <--mode> <commit-id>
دستور ریست با حالت mixed:
git reset --mixed HEAD~1
git reset HEAD~1 # هست mixed حالت پیش فرض همین
دستور بالا آخرین کامیت رو پاک میکنه، تغییرات هنوز وجود دارن ولی دیگه توی Stage نیستن.
Soft🔵
فقط HEAD رو برمیگردونه به کامیت مشخص شده. تغییرات بعد از اون کامیت رو توی Stage نگه میداره. زمانی استفاده میشه که بخوایم کامیت رو حذف کنیم ولی تغییرات باقی بمونن، برای commit مجدد یا اصلاح پیام.
git reset --soft HEAD~1
به طور مثال دستور بالا آخرین کامیت رو پاک میکنه و تغییرات رو توی Staging قرار میده.
Hard🔴
توی این حالت HEAD به کامیت مشخص شده برمیگرده، Staging area و فایل هارو کاملا با کامیت مشخص شده هماهنگ میکنه، درواقع هرتغییر یا کامیتی بعد از کامیت مشخص شده پاک میشه و پروژه برمیگرده به وضعیت همون کامیت. وقتی استفاده میشه که بخوایم همه چی رو مثل اون کامیت کنیم و تغییرات بعد از اون رو حذف کنیم.
git reset --hard HEAD~1
این دستور پروژه رو طوری تغییر میده که انگار اصلا کامیت آخر وجود نداشته. هیچ تغییری هیچ جایی ذخیره نمیشه و فایل ها برمیگردن به کامیت قبلی.
جمع بندی✍️
دستور reset میتونه نجات دهنده و حتی مخرب باشه. میتونه پروژه رو نجات بده یا یه تغییر بزرگ رو از بین ببره. کاربردای مختلفی داره و برای برگشت به کامیت های قبلی به شکل های مختلف استفاده میشه.
#️⃣ #programming
➖➖➖➖➖➖➖➖➖➖
🥷🏻 CHANNEL | GROUP
🔥11👍2❤1
خب خب خب، زمان به زبان کامپیوتر ها⏱️
حتما تا الان توی برنامه نویسی یا دیتابیس ها، زمان رو به شکل یه عدد عجیب و غریب مثل
چرا از 1970؟🤔
زمانی که سیستم عامل Unix در دهه ی 70 ساخته شد، توسعه دهنده ها برای ذخیره ی زمان تصمیم گرفتن یه نقطه شروع ثابت رو انتخاب کنن و اون نقطه شروع شد:
1970-01-01 00:00:00
جه کاربردی داره و کجا استفاده میشه؟🛠
1️⃣هماهنگی زمان توی سیستم های مختلف
زمان میتونه توی سیستم های مختلف و حتی سطوح مختلف، به شکل های مختلفی ثبت بشه یا برای همه ی سیستم ها قابل خوندن نباشه، با استفاده از Epoch Time خیلی راحت میشه هماهنگی و دقت زمان بین سیستم های مختلف رو حفظ کرد.
2️⃣مقایسه ی ساده تر زمان
چون فقط یه عدد معمولیه، خیلی راحت میشه با عملگرهای ساده مثل بزرگتر یا کوچکتر، زمانها رو با هم مقایسه کرد.
به عنوان ساده ترین مثال هم میشه به توکن های JWT اشاره کرد که برای نگهداری زمان انقضا از Epoch Time استفاده میکنن.
چطوری Epoch Time رو به دست بیاریم؟🧮
میتونید به سایت هایی مثل epoch converter مراجعه کنید. این سایت ها امکاناتی مثل تبدیل زمان و نمایش زمان فعلی به شکل Epoch رو دراختیارتون قرار میدن.
همچنین میتونید با زبان برنامه نویسی خودتون هم زمان هارو تبدیل کنید. به طور مثال توی پایتون با کد زیر میشه اینکارو انجام داد:
نکته جالب: زمان منفی هم داریم!
درسته اگه بخوایم زمان قبل از 1970 رو نشون بدیم Epoch Time مقدار منفی میگیره. مثلا:
جمع بندی✍️
درواقع Epoch Time یعنی تعداد ثانیه هایی که از ۱ ژانویه ۱۹۷۰ میلادی ساعت 00:00:00 گذشته. این روش زمان سنجی توی بیشتر سیستم عامل ها، زبان های برنامه نویسی و دیتابیس ها استفاده میشه و برای اکثر برنامه ها قابل خوندنه. مزیتیش اینه که زمان رو به صورت عددی، دقیق، فشرده و قابل مقایسه ذخیره میکنه و زمان توی Epoch Time میتونه مثبت یا منفی باشه.
➖➖➖➖➖➖➖➖➖➖
حتما تا الان توی برنامه نویسی یا دیتابیس ها، زمان رو به شکل یه عدد عجیب و غریب مثل
1717069200
دیدین. این عدد درواقع همون Epoch Time یا Unix Timestamp هست. درواقع از 1 ژانویه ی 1970 شمارش زمان به این شکل شروع شده و اون لحظه عدد صفر رو در زمان یونیکس مشخص میکنه. نحوه شمارش هم به این شکله که هر ثانیه که از اون لحظه بگذره، به این عدد یکی اضافه میشه.چرا از 1970؟🤔
زمانی که سیستم عامل Unix در دهه ی 70 ساخته شد، توسعه دهنده ها برای ذخیره ی زمان تصمیم گرفتن یه نقطه شروع ثابت رو انتخاب کنن و اون نقطه شروع شد:
1970-01-01 00:00:00
جه کاربردی داره و کجا استفاده میشه؟🛠
1️⃣هماهنگی زمان توی سیستم های مختلف
زمان میتونه توی سیستم های مختلف و حتی سطوح مختلف، به شکل های مختلفی ثبت بشه یا برای همه ی سیستم ها قابل خوندن نباشه، با استفاده از Epoch Time خیلی راحت میشه هماهنگی و دقت زمان بین سیستم های مختلف رو حفظ کرد.
2️⃣مقایسه ی ساده تر زمان
چون فقط یه عدد معمولیه، خیلی راحت میشه با عملگرهای ساده مثل بزرگتر یا کوچکتر، زمانها رو با هم مقایسه کرد.
به عنوان ساده ترین مثال هم میشه به توکن های JWT اشاره کرد که برای نگهداری زمان انقضا از Epoch Time استفاده میکنن.
چطوری Epoch Time رو به دست بیاریم؟🧮
میتونید به سایت هایی مثل epoch converter مراجعه کنید. این سایت ها امکاناتی مثل تبدیل زمان و نمایش زمان فعلی به شکل Epoch رو دراختیارتون قرار میدن.
همچنین میتونید با زبان برنامه نویسی خودتون هم زمان هارو تبدیل کنید. به طور مثال توی پایتون با کد زیر میشه اینکارو انجام داد:
from datetime import datetime
now = datetime.now()
print(int(datetime.timestamp(now))) >>> 1717069200
نکته جالب: زمان منفی هم داریم!
درسته اگه بخوایم زمان قبل از 1970 رو نشون بدیم Epoch Time مقدار منفی میگیره. مثلا:
-86400 → معادل: 31 دسامبر 1969
جمع بندی✍️
درواقع Epoch Time یعنی تعداد ثانیه هایی که از ۱ ژانویه ۱۹۷۰ میلادی ساعت 00:00:00 گذشته. این روش زمان سنجی توی بیشتر سیستم عامل ها، زبان های برنامه نویسی و دیتابیس ها استفاده میشه و برای اکثر برنامه ها قابل خوندنه. مزیتیش اینه که زمان رو به صورت عددی، دقیق، فشرده و قابل مقایسه ذخیره میکنه و زمان توی Epoch Time میتونه مثبت یا منفی باشه.
#️⃣ #programming
➖➖➖➖➖➖➖➖➖➖
🥷🏻 CHANNEL | GROUP
❤5
خب خب خب، مدیریت تنظیمات با Pydantic⚙️
احتمالا اسم Pydantic به گوشتون خورده یا توی پروژه هاتون ازش استفاده کردین. ولی برای مدیریت تنظیمات پروژه از چی استفاده کردین؟ Pydantic یه کلاس به اسم BaseSettings ارائه میده که برای مدیریت تنظیمات برنامه از جمله متغیر های محیطی و پیش فرض ها استفاده میشه.
چرا از BaseSettings استفاده کنیم؟🧐
1️⃣ خواندن خودکار متغیر های محیطی:
با استفاده از BaseSettigns بدون نیاز به کتابخونه های اضافی مثل python-dotenv میتونیم به متغیر های محیطی دسترسی داشته باشیم.
2️⃣ اعتبارسنجی امن و خودکار متغیر ها:
Pydantic به صورت خودکار تایپ هارو چک میکنه و دیگه نیازی به type cast دستی نیست.
3️⃣ پشتیبانی ساده از چند محیط:
با یکم خلاقیت میتونیم چندین کلاس تنظیمات برای محیطهای مختلف مثل Dev, Prod و Test بسازیم.
4️⃣ مناسب برای پروژههای بزرگ:
میشه همهی تنظیمات پروژه مثل دیتابیس، کلیدهای API، حالت دیباگ و... رو توی یک کلاس متمرکز نگهداری کرد و راحت تو کل پروژه استفادهشون کرد.
ساختار پایه ی کلاس تنظیمات🔧
قبل از هر کاری مطمئن بشید که
و بعد میتونید با تعریف کلاس و تنظیماتی که نیاز دارین اونارو مدیریت کنین.
این یعنی:
مقدار debug به طور پیش فرض True هست و بقیه مقادیر باید توی فایل env. یا محیط سیستم تعریف بشن، در غیر این صورت ارور میگیریم. نکته جالب اینه که Pydantic از type cast خودکار پشتیبانی میکنه، مثلا اینجا مقدار "True" توی محیط رو به bool تبدیل میکنه.
و فایل env. باید به این شکل باشه:
نحوه ی استفاده از تنظیمات🛠
میتونیم یه نمونه از کلاس تنظیمات بسازیم و بعد با استفاده از اتریبیوت ها به تنظیمات دسترسی پیدا کنیم:
جمع بندی✍️
کلاس
توی پروژههای بزرگ یا اپلیکیشنهایی که چند محیط (مثل dev، test و prod) دارن، استفاده از این ساختار کمک میکنه کد تمیزتر و حرفهایتری داشته باشین.
➖➖➖➖➖➖➖➖➖➖
احتمالا اسم Pydantic به گوشتون خورده یا توی پروژه هاتون ازش استفاده کردین. ولی برای مدیریت تنظیمات پروژه از چی استفاده کردین؟ Pydantic یه کلاس به اسم BaseSettings ارائه میده که برای مدیریت تنظیمات برنامه از جمله متغیر های محیطی و پیش فرض ها استفاده میشه.
چرا از BaseSettings استفاده کنیم؟🧐
1️⃣ خواندن خودکار متغیر های محیطی:
با استفاده از BaseSettigns بدون نیاز به کتابخونه های اضافی مثل python-dotenv میتونیم به متغیر های محیطی دسترسی داشته باشیم.
2️⃣ اعتبارسنجی امن و خودکار متغیر ها:
Pydantic به صورت خودکار تایپ هارو چک میکنه و دیگه نیازی به type cast دستی نیست.
3️⃣ پشتیبانی ساده از چند محیط:
با یکم خلاقیت میتونیم چندین کلاس تنظیمات برای محیطهای مختلف مثل Dev, Prod و Test بسازیم.
4️⃣ مناسب برای پروژههای بزرگ:
میشه همهی تنظیمات پروژه مثل دیتابیس، کلیدهای API، حالت دیباگ و... رو توی یک کلاس متمرکز نگهداری کرد و راحت تو کل پروژه استفادهشون کرد.
ساختار پایه ی کلاس تنظیمات🔧
قبل از هر کاری مطمئن بشید که
pydantic
و پکیج pydantic-settings
نصب باشن:pip install pydantic pydantic-settings
و بعد میتونید با تعریف کلاس و تنظیماتی که نیاز دارین اونارو مدیریت کنین.
from pydantic import Field
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
model_config = SettingsConfigDict(
env_file='.env', # env file location
)
debug: bool = True
database_url: str
secret_key: str
این یعنی:
مقدار debug به طور پیش فرض True هست و بقیه مقادیر باید توی فایل env. یا محیط سیستم تعریف بشن، در غیر این صورت ارور میگیریم. نکته جالب اینه که Pydantic از type cast خودکار پشتیبانی میکنه، مثلا اینجا مقدار "True" توی محیط رو به bool تبدیل میکنه.
و فایل env. باید به این شکل باشه:
DATABASE_URL=postgresql://user:pass@localhost/dbname
SECRET_KEY=s3cr3t-k3y
نحوه ی استفاده از تنظیمات🛠
میتونیم یه نمونه از کلاس تنظیمات بسازیم و بعد با استفاده از اتریبیوت ها به تنظیمات دسترسی پیدا کنیم:
settings = Settings()
print(settings.database_url)
print(settings.debug)
جمع بندی✍️
کلاس
BaseSettings
یکی از ابزارهای بسیار مهم و کاربردی در Pydantic هست که به شما اجازه میده تنظیمات پروژه رو به شکل متمرکز، امن، قابل تست و قابل توسعه مدیریت کنین.توی پروژههای بزرگ یا اپلیکیشنهایی که چند محیط (مثل dev، test و prod) دارن، استفاده از این ساختار کمک میکنه کد تمیزتر و حرفهایتری داشته باشین.
#️⃣ #programming #python
➖➖➖➖➖➖➖➖➖➖
🥷🏻 CHANNEL | GROUP
👍6❤4🔥4
خب خب خب، بهترین فریمورک ها برای توسعه مایکروسرویس🕸
تو دنیای امروز که اپلیکیشنها پیچیدهتر شدن و نیاز به مقیاسپذیری، توسعه سریع و قابلیت نگهداری بالا بیشتر از قبل حس میشه، معماری مایکروسرویس (Microservices) به یکی از محبوبترین انتخابها برای توسعه نرمافزارهای مدرن تبدیل شده.
اما انتخاب فریمورک مناسب برای پیادهسازی مایکروسرویسها خیلی مهمه؛ چون مستقیماً روی سرعت توسعه، پرفورمنس، ساختار پروژه و حتی تجربهی تیم تأثیر میذاره.
Spring Boot (Java)☕️
یکی از محبوبترین انتخابها برای توسعه سرویسهای بزرگ و سازمانی. این فریمورک با ترکیب قدرت Java و اکوسیستم Spring، ساخت سرویسهای مستقل، مقیاسپذیر و امن رو آسون میکنه.
از نقاط قوتش میشه به پشتیبانی گسترده از ابزارهای Enterprise، جامعهی کاربری بسیار بزرگ، مستندات کامل و یکپارچگی فوقالعاده با Spring Cloud اشاره کرد.
FastAPI (Python)⚡️
فریمورکی مدرن و سبک برای ساخت APIهای سریع و خوانا با زبان پایتون. طراحیشده بر پایه ASGI و Starlette و بهشدت روی سرعت و خوانایی تمرکز داره. از مزایای مهمش میتونیم به سرعت بالا، پشتیبانی عالی از Async Programming، مستندسازی خودکار با Swagger و ReDoc، استفاده از type hinting و هماهنگی کامل با استانداردهای OpenAPI اشاره کنیم.
ASP.NET Core (C#)🧱
انتخاب حرفهای برای توسعهدهندگان داتنت، مخصوصاً در پروژههایی که از زیرساختهای Microsoft استفاده میکنن. این فریمورک کاملاً cross-platform هست و روی لینوکس هم عملکرد بالایی داره. پرفورمنس عالی، امنیت بالا، پشتیبانی از WebSocket، gRPC و امکانات کامل برای تولید و دیپلوی مایکروسرویسها از مزایای مهمشه.
Go-Kit (Go)🦾
فریمورکی ساختارمند برای توسعه سرویسهای حرفهای با زبان Go. برخلاف فریمورکهای سبکتر مثل Gin، این ابزار مناسب تیمهایی هست که دنبال معماری تمیز، قابلیت تست بالا، جداسازی concerns و مقیاسپذیری بالا هستن. پشتیبانی از transportهای مختلف (HTTP، gRPC و...)، logging، tracing و monitoring باعث شده انتخاب خوبی برای سیستمهایی با ترافیک بالا باشه.
جمع بندی✍️
انتخاب فریمورک مناسب برای مایکروسرویس به زبان برنامهنویسی، تجربهی تیم، نوع پروژه و زیرساخت فنی بستگی داره. اگر به یک اکوسیستم پایدار و کامل نیاز دارید، Spring Boot یا ASP.NET Core میتونن بهترین انتخاب باشن. اما اگر هدف شما سرعت، سادگی و توسعه سریعتره، FastAPI یا Go-Kit میتونن عملکرد بسیار خوبی داشته باشن.
➖➖➖➖➖➖➖➖➖➖
تو دنیای امروز که اپلیکیشنها پیچیدهتر شدن و نیاز به مقیاسپذیری، توسعه سریع و قابلیت نگهداری بالا بیشتر از قبل حس میشه، معماری مایکروسرویس (Microservices) به یکی از محبوبترین انتخابها برای توسعه نرمافزارهای مدرن تبدیل شده.
اما انتخاب فریمورک مناسب برای پیادهسازی مایکروسرویسها خیلی مهمه؛ چون مستقیماً روی سرعت توسعه، پرفورمنس، ساختار پروژه و حتی تجربهی تیم تأثیر میذاره.
Spring Boot (Java)☕️
یکی از محبوبترین انتخابها برای توسعه سرویسهای بزرگ و سازمانی. این فریمورک با ترکیب قدرت Java و اکوسیستم Spring، ساخت سرویسهای مستقل، مقیاسپذیر و امن رو آسون میکنه.
از نقاط قوتش میشه به پشتیبانی گسترده از ابزارهای Enterprise، جامعهی کاربری بسیار بزرگ، مستندات کامل و یکپارچگی فوقالعاده با Spring Cloud اشاره کرد.
FastAPI (Python)⚡️
فریمورکی مدرن و سبک برای ساخت APIهای سریع و خوانا با زبان پایتون. طراحیشده بر پایه ASGI و Starlette و بهشدت روی سرعت و خوانایی تمرکز داره. از مزایای مهمش میتونیم به سرعت بالا، پشتیبانی عالی از Async Programming، مستندسازی خودکار با Swagger و ReDoc، استفاده از type hinting و هماهنگی کامل با استانداردهای OpenAPI اشاره کنیم.
ASP.NET Core (C#)🧱
انتخاب حرفهای برای توسعهدهندگان داتنت، مخصوصاً در پروژههایی که از زیرساختهای Microsoft استفاده میکنن. این فریمورک کاملاً cross-platform هست و روی لینوکس هم عملکرد بالایی داره. پرفورمنس عالی، امنیت بالا، پشتیبانی از WebSocket، gRPC و امکانات کامل برای تولید و دیپلوی مایکروسرویسها از مزایای مهمشه.
Go-Kit (Go)🦾
فریمورکی ساختارمند برای توسعه سرویسهای حرفهای با زبان Go. برخلاف فریمورکهای سبکتر مثل Gin، این ابزار مناسب تیمهایی هست که دنبال معماری تمیز، قابلیت تست بالا، جداسازی concerns و مقیاسپذیری بالا هستن. پشتیبانی از transportهای مختلف (HTTP، gRPC و...)، logging، tracing و monitoring باعث شده انتخاب خوبی برای سیستمهایی با ترافیک بالا باشه.
جمع بندی✍️
انتخاب فریمورک مناسب برای مایکروسرویس به زبان برنامهنویسی، تجربهی تیم، نوع پروژه و زیرساخت فنی بستگی داره. اگر به یک اکوسیستم پایدار و کامل نیاز دارید، Spring Boot یا ASP.NET Core میتونن بهترین انتخاب باشن. اما اگر هدف شما سرعت، سادگی و توسعه سریعتره، FastAPI یا Go-Kit میتونن عملکرد بسیار خوبی داشته باشن.
#️⃣ #programming #backend
➖➖➖➖➖➖➖➖➖➖
🥷🏻 CHANNEL | GROUP
❤13
خب خب خب، بهترین زبان های برنامه نویسی برای Cloud Programming☁️💻
خب برنامه نویسی ابری یعنی توسعه ی نرم افزارهایی که روی سرویس های ابری مثل AWS, Google Cloud, Azureو... اجرا میشن. توی این فضا مقیاس پذیری، سرعت اجرا، امنیت و پشتیبانی از ابزارهای ابری حرف اول رو میزنن.
Python🐍
به خاطر سادگی و سرعت توسعه، یکی از محبوبترین زبانها برای Cloud محسوب میشه. توی پروژههای مربوط به اتوماسیون، DevOps و مخصوصاً یادگیری ماشین رو سرویسهای ابری مثل AWS یا Google Cloud خیلی خوب جواب میده. اما به خاطر سرعت پایین و محدودیت در پردازشهای سنگین (مثل real-time) برای پروژههای بزرگ انتخاب اول نیست.
Go🚀
زبانیه که دقیقاً برای همین کار ساخته شده. سریع، کممصرف و با پشتیبانی قوی از concurrency، Go گزینهای ایدهآل برای میکروسرویسها، زیرساختهای cloud-native و سرویسهایی با بار بالا محسوب میشه. البته نسبت به پایتون ساده نیست و فضای توسعهش خشکتره.
JavaScript (Node.js)🪩
وقتی با جاوااسکریپت آشنایی داشته باشین، استفاده از Node.js تو Cloud مخصوصاً برای ساخت API و سرورهای سبک یا سرویسهای Serverless خیلی راحته. سرعت توسعه بالاست و پشتیبانی از async بودن ذاتی خیلی به درد میخوره. ولی برای پردازشهای سنگین یا مدیریت منابع در حد enterprise، محدودیت داره.
Java☕️
با وجود قدیمی بودن، هنوزم تو شرکتهای بزرگ برای ساخت سرویسهای پایدار و مقیاسپذیر استفاده میشه. ابزارهایی مثل Spring Boot و Spring Cloud تو فضای ابری خیلی پرکاربردن. قدرت و امنیتش عالیه، ولی کدنویسیش verbose و سنگینتر از زبانهای مدرنتره.
Rust🦀
زبانیه که سرعت و امنیت رو همزمان داره. برای سیستمهایی که performance یا امنیت حافظه خیلی مهمه، انتخاب خوبیه. تو پروژههای زیرساختی یا اپهایی که مصرف منابع براشون مهمه، Rust حرف نداره. البته یادگیریش سخته و جامعهی توسعهدهندههاش هنوز به بزرگی بقیه نیست.
جمع بندی✍️
در نهایت، انتخاب زبان برای Cloud Programming بستگی به نوع پروژه داره؛ اگه دنبال توسعه سریع و ساده هستین، Python و Node.js انتخابای خوبیان. برای سیستمهای سریع و مقیاسپذیر Go میدرخشه، Java برای اپهای پایدار سازمانی مناسبه، و Rust برای پروژههایی با نیاز بالا به performance و امنیت انتخاب آیندهمحوره. مهم اینه بدونین چی میخواین و ابزار مناسب همون رو انتخاب کنین.
➖➖➖➖➖➖➖➖➖➖
خب برنامه نویسی ابری یعنی توسعه ی نرم افزارهایی که روی سرویس های ابری مثل AWS, Google Cloud, Azureو... اجرا میشن. توی این فضا مقیاس پذیری، سرعت اجرا، امنیت و پشتیبانی از ابزارهای ابری حرف اول رو میزنن.
Python🐍
به خاطر سادگی و سرعت توسعه، یکی از محبوبترین زبانها برای Cloud محسوب میشه. توی پروژههای مربوط به اتوماسیون، DevOps و مخصوصاً یادگیری ماشین رو سرویسهای ابری مثل AWS یا Google Cloud خیلی خوب جواب میده. اما به خاطر سرعت پایین و محدودیت در پردازشهای سنگین (مثل real-time) برای پروژههای بزرگ انتخاب اول نیست.
Go🚀
زبانیه که دقیقاً برای همین کار ساخته شده. سریع، کممصرف و با پشتیبانی قوی از concurrency، Go گزینهای ایدهآل برای میکروسرویسها، زیرساختهای cloud-native و سرویسهایی با بار بالا محسوب میشه. البته نسبت به پایتون ساده نیست و فضای توسعهش خشکتره.
JavaScript (Node.js)🪩
وقتی با جاوااسکریپت آشنایی داشته باشین، استفاده از Node.js تو Cloud مخصوصاً برای ساخت API و سرورهای سبک یا سرویسهای Serverless خیلی راحته. سرعت توسعه بالاست و پشتیبانی از async بودن ذاتی خیلی به درد میخوره. ولی برای پردازشهای سنگین یا مدیریت منابع در حد enterprise، محدودیت داره.
Java☕️
با وجود قدیمی بودن، هنوزم تو شرکتهای بزرگ برای ساخت سرویسهای پایدار و مقیاسپذیر استفاده میشه. ابزارهایی مثل Spring Boot و Spring Cloud تو فضای ابری خیلی پرکاربردن. قدرت و امنیتش عالیه، ولی کدنویسیش verbose و سنگینتر از زبانهای مدرنتره.
Rust🦀
زبانیه که سرعت و امنیت رو همزمان داره. برای سیستمهایی که performance یا امنیت حافظه خیلی مهمه، انتخاب خوبیه. تو پروژههای زیرساختی یا اپهایی که مصرف منابع براشون مهمه، Rust حرف نداره. البته یادگیریش سخته و جامعهی توسعهدهندههاش هنوز به بزرگی بقیه نیست.
جمع بندی✍️
در نهایت، انتخاب زبان برای Cloud Programming بستگی به نوع پروژه داره؛ اگه دنبال توسعه سریع و ساده هستین، Python و Node.js انتخابای خوبیان. برای سیستمهای سریع و مقیاسپذیر Go میدرخشه، Java برای اپهای پایدار سازمانی مناسبه، و Rust برای پروژههایی با نیاز بالا به performance و امنیت انتخاب آیندهمحوره. مهم اینه بدونین چی میخواین و ابزار مناسب همون رو انتخاب کنین.
#️⃣ #programming #backend
➖➖➖➖➖➖➖➖➖➖
🥷🏻 CHANNEL | GROUP
❤8
این چند وقته نبودم و واقعا نیاز به استراحت ذهنی داشتم.
به زودی دوباره فعالیت رو شروع میکنم و صد البته چیزهای مفید تریم میزارم
ممنونم از کسایی این مدت به من کمک کردن مخصوصا @real_denver ❤️😊
به امید روزای بهتر و زندگی اروم تر 😊
➖➖➖➖➖➖➖➖➖➖
به زودی دوباره فعالیت رو شروع میکنم و صد البته چیزهای مفید تریم میزارم
ممنونم از کسایی این مدت به من کمک کردن مخصوصا @real_denver ❤️😊
به امید روزای بهتر و زندگی اروم تر 😊
➖➖➖➖➖➖➖➖➖➖
🥷🏻 CHANNEL | GROUP
❤10👌1
اگه پیشنهادی دارید یا دوست دارید یه چیز خاص تر توی کانال ببینید، حتماً تو کامنت همین پست بگید. خوشحال میشم پستها رو جوری بسازم که بیشتر به دلتون بشینه 😊
❤9👎3🤣1💔1
HTML Embed Code: