CodeCrafters
764 subscribers
91 photos
51 videos
42 files
170 links
Download Telegram
طراحی میکروسرویس با جنگو بخش سوم طراحی سیستم میکروسرویس

یکی از مسایل مهم در میکروسرویس‌ها طراحی درست و دقیق ماژولهای آن است در این بخش در این خصوص صحبت خواهیم کرد، همچنین موضوعات کلیدی مانند نکات مهم برای ایجاد معماری میکروسرویس و توسعه سرویس را پوشش می‌دهیم

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

اگر برای هر سرویس تصمیم درستی گرفته باشیم میتوانیم رفتار سیستم را تغییر و اصلاح کنیم، کار همزمان بر روی همه سرویس‌ها بسیار سخت می‌باشد

اگر ما از رویکرد مدل‌پایه استفاپه کنیم میتونیم به راحتی مفهوم سازی کرده و راحب سیستم صحبت کنیم

مدل طراحی میکروسرویس به پنج بخش تقسیم میشود
Service, Solution, Process, Organization, Culture

بخش service
طراحی خوب میکروسرویس ها و API های برای سیستم مهم هستند. در یک سیستم میکروسرویس، سرپیس‌ها بلوک‌های ساختمان اتمی را تشکیل می‌دهند که کل ارگانیسم از آن ساخته می‌شود.اگر بتوانیم طراحی، محدوده و مقیاس خدمات خود را تعیین کنیم، می توانیم پیچیدگی را کاهش دهیم و آن را ساده کنیم

بخش solution
این بخش ارائه میده این چنین معماری و راه حلی که برای هر سرویس متفاوت باشد و همچنین نمایی از آینده رو نشون میده. هنگامی که ما میکروسرویس را طراحی می کنیم، باید همیشه نگران هماهنگی ورودی ها و خروجی های چندین سرویس باشیم. سیستم آینده نگر سیستم مطلوب تری را ارائه می دهد. به عنوان مثال، اگر ما روی ویژگی‌های ایمنی و مسیریابی در اجرای سطح اول کار کنیم، می‌توانیم پیچیدگی هر سرویس را کاهش دهیم.

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

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

بخش culture
فرهنگ نیز عامل مهمی است. این ناملموس است اما همچنین یک عامل مهم برای معماری میکروسرویس ها است. فرهنگ مجموعه‌ای از ارزش‌هاست که بین همه کارکنان سازمان مشترک است. به عبارت ساده، اگر فرهنگ سازمانی ما خوب باشد، آنها از ایده های جدید یا استراتژی های توسعه جدید مانند سرویس خرد استقبال می کنند. با این رویکرد، سازمان بر روی محصولات خود تسلط پیدا می کند و توسط محصولات می تواند بر بازار تأثیر بگذارد.

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

ادامه موضوع در وبسایت ...

لینک وبسایت

#microservice
#django

@code_crafters
👍6
انتخاب محل ذخیره سازی تصاویر: فایل سیستم یا پایگاه داده؟

تصمیم گیری در مورد بهترین راه برای ذخیره سازی تصاویر بین Blob (Binary Large Object)در پایگاه داده و فایل سیستم (مانند S3) همیشه بحث برانگیز بوده.

پایگاه داده یا فایل سیستم؟ کدوم بهتره؟

اول از همه، بریم سراغ مزایای هر کدوم:

پایگاه داده:

اطمینان و یکپارچگی: پایگاه داده ها از قوانین ACID (اتمی بودن، سازگاری، انزوا، دوام) پیروی می کنن. یعنی داده ها همیشه کامل، درست و هماهنگ باقی می مونن. این به این معنیه که حتی اگه یه فایل از روی فایل سیستم پاک بشه، اطلاعات اون تو پایگاه داده محفوظه.
بکاپ گیری راحت: چون همه اطلاعات یکجا هستن، گرفتن بکاپ از پایگاه داده خیلی آسون تره.
جستجوی سریع: با زیاد شدن تعداد تصاویر، پایگاه داده ها نسبت به جستجو تو فایل سیستم سریع تر عمل می کنن.
حذف و آپدیت ساده تر: حذف و آپدیت فایل ها تو پایگاه داده خیلی راحت تره. دیگه نیازی نیست نگران پاک کردن دستی فایل از روی فایل سیستم هم باشید.

فایل سیستم (مانند S3):

حجم کم و هزینه مناسب: اگه تصاویر زیادی با کیفیت بالا دارید، ذخیره کردنشون تو پایگاه داده باعث میشه بکاپ هاتون خیلی سنگین بشن و هزینه تون بره بالا. در حالی که فایل سیستم ها این مشکل رو ندارن.
دسترسی مستقیم از CDN: با استفاده از CDN می تونید بدون نیاز به طی کردن لایه های برنامه و پایگاه داده، به فایل ها از هر جای دنیا دسترسی داشته باشید. این کار سرعت نمایش تصاویر رو هم بیشتر می کنه.
اشتراک گذاری راحت: اگه نیاز دارید تصاویر رو با افراد یا سرویس های دیگه به اشتراک بذارید، فایل سیستم ها این کار رو خیلی ساده تر می کنن.
سرعت بالا برای استریم: اگه برنامه شما به عملکرد بالایی برای استریم ویدیو یا تصاویر زنده نیاز داره، فایل سیستم ها گزینه مناسب تری هستن.

پس کدوم رو انتخاب کنیم؟

خب، بستگی به نیاز شما داره!

تصاویر کوچیک: اگه تصاویر شما حجم کمی دارن (مثلا چند صد کیلوبایت)، مثلا عکس پروفایل یا مدارک شناسایی، ذخیره کردنشون تو پایگاه داده منطقی تره.
تصاویر بزرگ و به اشتراک گذاری شده: اگه پلتفرمی دارید که کاربرا تصاویر بزرگی رو آپلود و به اشتراک میذارن، بهتره از فایل سیستم استفاده کنید.
آپدیت کم: اگه تصاویر زیاد آپدیت نمی شن و بیشتر جایگزین یا حذف می شن، نیازی به استفاده از ویژگی های ACID پایگاه داده ندارید و فایل سیستم گزینه بهتر و به صرفه تریه.

در نهایت...

هیچ راه حل کاملی وجود نداره و انتخاب بهترین روش به نیازهای شما بستگی داره.

#Database #General
@Code_Crafters
👍83
در این پست  قراره تمایز اغلب گیج کننده بین function  و  method  هارو  را بررسی  کنیم🥸
هر دو بلوک های اساسی در  پایتون هستند اما اهداف کمی تفاوت دارد. ما آنها را در کنار هم در قالب جدول با هم مقایسه خواهیم کرد و نمونه های کد واقعی را برای نشان دادن نحوه استفاده از هر کدام ارائه می دهیم. چه مبتدی باشید و چه به دنبال تقویت مهارت های پایتون خود باشید، این تفکیک دقیق به شما درک روشنی از زمان و نحوه استفاده موثر از function  ها و method  ها می دهد.                                                                                                                                                                                                                                                                                   

تابع(functios)در پایتون چیست؟                                                                                                                در پایتون، یک تابع یک بلوک از کد است که برای انجام یک کار خاص طراحی شده است. توابع به تقسیم برنامه ما به قطعات کوچکتر و ماژولار کمک می کنند. با ایجاد برنامه های پیچیده تر، توابع را می توان مجدداً مورد استفاده قرار داد و کد شما را سازماندهی و مدیریت کرد.                                                                                                                                                                                                                           مثالی از یک تابع:
def greet(name):
    return f"Hello, {name}!"

print(greet("ali"))  # Output: Hello, ali!



متد در پایتون چیست؟
متد
، به عکس تابع، یک تابع است که به یک شیء مرتبط است. در پایتون، متدها مستقل نیستند و باید بر روی یک شیء یا داخل یک کلاس فراخوانی شوند. متدها به طور ضمنی از یک شیء استفاده می‌کنند که برای آن فراخوانی شده‌اند.
برای درک بهتر به مثال زیر توجه کنید.
class Greeter:
    def __init__(self, name):
        self.name = name
   
    def greet(self):
        return f"Hello, {self.name}!"

g = Greeter("ali")
print(g.greet())  # Output: Hello, ali!

در اینجا، greet یک متد از کلاس Greeter است و بر روی نمونه g از آن کلاس فراخوانی می‌شود.

در ادامه چند مثال عملی رو باهم بررسی میکنیم.
Function:
def factorial(n):
    if n == 0:
        return 1
    else:
        return n * factorial(n-1)

print(factorial(5))  # Output: 120

در اینجا یک تابع ساده برای به دست اوردن فاکتوریل یک عدد داریم.(5!)

Method:
class Car:
    def __init__(self, make, model):
        self.make = make
        self.model = model

    def description(self):
        return f"{self.make} {self.model}"

my_car = Car("Toyota", "Corolla")
print(my_car.description())  # Output: Toyota Corolla

در اینجا تابع description  یک متود است که جزئیات مربوط به یک نمونه خودرو رو نشون میده.


درک تمایز بین توابع و متودها در پایتون برای نوشتن کد واضح و موثر بسیار مهم است. توابع ماژولار بودن و قابلیت استفاده مجدد را ارائه می دهند، در حالی که متود ها ما را قادر می سازند تا رفتارهای درون اشیاء را با رعایت اصول برنامه نویسی شی گرا محصور کنیم. اینکه یک تابع یا یک روش را انتخاب کنید تا حد زیادی به نیازهای خاص برنامه و ترجیحات طراحی شما بستگی دارد. با درک این مفاهیم، ​​می توانید از انعطاف پذیری و استحکام پایتون در پروژه های برنامه نویسی خود استفاده کنید و کد خود را سازماندهی و پویا تر کنید.
در قسمت کامنت ها جدولی رو برای اختلاف بین function و method میتونید مشاهده کنید
منبع

#python

@code_crafters
👍12
در این پست  نکات و ترفند های پیشرفته مدل های جنگو رو بررسی خواهیم کرد.🥸
از جمله: ...indexing, custom managers, inheritance

ارث بری مدل ها به شما امکان می دهد یک مدل پایه با اطلاعات رایج ایجاد کنید و آن را در مدل های دیگر گسترش دهید. جنگو از سه نوع model inheritance پشتیبانی می کند:
abstract base classes, multi-table inheritance, and proxy models

Using Abstract Models:
روشی فوق‌العاده برای جمع‌بندی اطلاعات و رفتار مشترک هستند. برای یک abstract model هیچ جدولی در دیتابیس نشان داده نمی شود. در عوض، فیلدها و متدهای آن توسط زیر کلاس‌ها به ارث می‌رسند.
Example:
class BaseProfile(models.Model):
bio = models.TextField()
avatar = models.ImageField(upload_to='avatars/')

class Meta:
abstract = True

class StudentProfile(BaseProfile):
graduation_year = models.IntegerField()

class TeacherProfile(BaseProfile):
office = models.CharField(max_length=100)

در اینجا BaseProfile مانند یک الگو عمل میکند.StudentProfile, TeacherProfile هر دو دارای فیلد های bio , avatar خواهند بود اما هر کدام در جدول های پایگاه داده خودشان ذخیره میشوند.


Custom Managers :
در جنگو Custom Managers به شما این امکان را می دهند که عملکردهای سطح جدول را به مدل های جنگو خود اضافه کنید. آنها را می توان برای کپسوله کردن و عملیات های crud پیچیده و ارائه یک API تمیزتر برای مدل استفاده کرد.
Example:
class ActiveProfileManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(deleted=False)

class Profile(models.Model):
name = models.CharField(max_length=100)
deleted = models.BooleanField(default=False)
objects = models.Manager() # The default manager.
active_objects = ActiveProfileManager() # Our custom manager.

# Usage:
active_profiles = Profile.active_objects.all()

این custom manager تمامی query های شمارو بر اساس "deleted" فیلتر میکند.


Models Migrations:
مدیریت
Migrations مدل‌ها
در جنگو migrations به شما امکان می‌دهند تا طی زمان، طرح پایگاه داده خود را تکامل دهید. مدیریت مناسب migrations ها برای حفظ یک پروژه سالم بسیار حیاتی است.

توصیه‌ها:

برنامه‌ریزی migrations خود: سعی کنید هنگام امکان‌پذیر بودن، مهاجرت‌ها را ترکیب کنید و آن‌ها را به کنترل نسخه منتقل کنید.
تست migrations: همیشه migrations را به صورت محلی و در محیط استیجینگ تست کنید، قبل از اعمال آن‌ها در محیط تولید.
استفاده از دستور makemigrations برای تولید فایل‌های migrations
استفاده از دستور migrate برای اعمال migrations ها
استفاده از دستور sqlmigrate برای پیش‌نمایش دستور sql


Proxy Models:
مدل‌های پروکسی برای تغییر رفتار یک مدل، مانند defualt ordering یا custom manager بدون ایجاد جدول پایگاه داده جدید استفاده می‌شوند.

Example:
class OrderedProfile(Profile):
class Meta:
proxy = True
ordering = ['name']

# Usage:
ordered_profiles = OrderedProfile.objects.all()

این پروکسی مدل تمامی profile هارا بر اساس نام نشان میدهد.

Multi-table Inheritance:
این نوع وراثت زمانی استفاده می شود که هر مدل در سلسله مراتب به تنهایی یک موجودیت کامل در نظر گرفته شود که به طور بالقوه به جدول پایگاه داده دیگری مرتبط است.به زبان ساده هر مدل به تنهایی می‌تواند در یک جدول جداگانه در پایگاه داده نمایش داده شود، به جای اینکه همه اطلاعات در یک جدول واحد ذخیره شود.

class Place(models.Model):
name = models.CharField(max_length=50)

class Restaurant(Place):
serves_pizza = models.BooleanField(default=False)

مدل
Restaurant از مدل Place ارث‌بری می‌کند. این بدان معنی است که همه فیلدهای Place به صورت اتوماتیک به Restaurant ارث می‌برده شده و Restaurant از همه ویژگی‌های Place استفاده می‌کند.
این الگو به شما امکان می‌دهد که یک مدل (در اینجا Restaurant) را برای ارث‌بری از ویژگی‌ها و رفتارهای یک مدل دیگر (در اینجا Place) استفاده کنید، در حالی که همچنان می‌توانید به آن فیلدها و ویژگی‌های جدیدی را اضافه کنید.

ادامه مطالب در پست بعد
#python

@code_crafters
👍92
CodeCrafters
در این پست  نکات و ترفند های پیشرفته مدل های جنگو رو بررسی خواهیم کرد.🥸 از جمله: ...indexing, custom managers, inheritance ارث بری مدل ها به شما امکان می دهد یک مدل پایه با اطلاعات رایج ایجاد کنید و آن را در مدل های دیگر گسترش دهید. جنگو از سه نوع model…
در ادامه پست قبلی:
Indexing:
ایندکس
ها برای بهبود عملکرد عملیات پایگاه داده، به ویژه برای مجموعه داده های بزرگ، ضروری هستند.
به عنوان مثال، فرض کنید شما یک جدول کاربران دارید و می‌خواهید بر اساس نام آن‌ها جستجو کنید. بدون ایندکس، پایگاه داده باید هر رکورد را از ابتدا تا انتها بررسی کند تا نام مورد نظر را پیدا کند. اما با ایجاد یک ایندکس بر روی فیلد نام، پایگاه داده می‌تواند به سرعت به رکوردهای مرتبط با نام مورد نظر دسترسی پیدا کند.

Example:
class User(models.Model):
username = models.CharField(max_length=100, db_index=True)
email = models.CharField(max_length=100)

class Meta:
indexes = [
models.Index(fields=['username'], name='username_idx'),
models.Index(fields=['email'], name='email_idx')
]


Overriding Model Methods:
وقتی در Django یک مدل ایجاد می‌کنید، می‌توانید رفتارهای خاصی را برای عملیات‌های مختلف مدل، مانند ذخیره‌سازی یا حذف، سفارشی‌سازی کنید. این کار به شما این امکان را می‌دهد که قبل یا بعد از انجام یک عملیات، کارهای خاصی انجام دهید. شما میتوانید عملیات save , delete ,.... رو بازنویسی کنید.

Example:
class MyModel(models.Model):
name = models.CharField(max_length=100)

def save(self, *args, **kwargs):
self.name = self.name.upper()
super().save(*args, **kwargs)

در این مثال، هر زمان که یک نمونه از MyModel ذخیره می‌شود، مقدار فیلد name به حروف بزرگ تبدیل می‌شود قبل از ذخیره‌سازی و سپس عملیات ذخیره‌سازی انجام می‌شود.


Soft Deletion:

استفاده از Soft Deletion به شما این امکان را می‌دهد که آیتم‌ها را به عنوان حذف شده علامت‌گذاری کنید، اما در واقع آن‌ها را از پایگاه داده حذف نکنید. به این تکنیک "حذف نرم" یا "حذف موقت" نیز گفته می‌شود. این روش برای نگهداری تاریخچه داده‌ها، امکان بازگردانی آیتم‌های حذف شده و همچنین حفظ ارتباطات بین آیتم‌های مختلف مفید است.
Example:
class SoftDeleteModel(models.Model):
is_deleted = models.BooleanField(default=False)

def delete(self, *args, **kwargs):
self.is_deleted = True
self.save()


هر یک از این تکنیک ها مجموعه ای از مزایای خاص خود را ارائه می دهد و می تواند به طور قابل توجهی بر کارایی و عملکرد پروژه های شما تأثیر بگذارد. با اجرای این استراتژی‌ها، می‌توانید از قابلیت‌های قدرتمند مدل‌سازی جنگو برای ساخت برنامه‌های کاربردی وب قوی‌تر و مقیاس‌پذیرتر بهره ببرید.
منبع
#python

@code_crafters
11
کلاس دیاگرام اولیه پروژه‌ی فعلی

تو شرکت‌ها کسانی هستند که بهشون طراح و معمار سیستم میگیم کارشونdesign systemهستش،چکاری میکنند؟

میان پروژه ورودی شرکت رو تحلیل میکنن و بیزنس مدل‌های اون رو در میارن و معماری مناسب روجهت پیاده سازی شدن پروژه بر اساس بیزنس مدل‌ها مشخص میکنن،دیاگرام روطراحی میکنن و میفرستن سمت توسعه دهندگان جهت پیاده سازی پروژه بر اساس اون معماری و بیزنس مدلهای مشخص میشه،اینکار رو معمولا در پروژه‌های بزرگ که نیاز هست بر اساس میکروسرویس وDDDپیاده سازی بشه انجام‌ میدن،این پیاده سازی بر اساس اصول سازمانی هر شرکت مخصوص خودش صورت میگیره این مسئله کمک میکنه تا تیم و یا تیم‌های فنی از چهارچوب سازمان خارج نشده و دید یکسانی از پروژه داشته باشن،آماده کردن اون بر اساس میزان بزرگی پروژه زمان بر هست،طراح سیستم بایدآینده نگری نسبت به پروژه داشته باشه تاهزینه‌های شرکت رو بشدت کاهش بده ونقش حیاتی درمشخص کردن هسته بیزنس ایفا میکنه،اشتباه در طراحی این دیاگرام در مرحله اول اون موجب آسیب رسیدن به دیتابیس و داده‌های اون خواهد شد و در مرحله بعدی به کوئری‌ها و پرفورمنس پروژه میرسه
#microservice

#daily

@code_crafters
👍9
در ادامه کار بعد از کلاس دیاگرام(در واقع کلاس دیاگرام لایه‌های دیتا data layers رو برامون مشخص میکنه) میرسیم به پیدا کردن بیزنس‌های تجاری پروژه، طبق ساختاری که از دیتا لایرها هستش، کاری که صورت میگیره این هست که دنبال الگوهایی میگردیم، که طبق اون بتونیم دومین‌هامون رو شناسایی کنیم و بر اساس خروجی اون بتونیم سرویس‌هامون رو تشخیص و تفکیک بدیم، هر دومین ممکنه طبق دیدگاه و برآورد شما به یک یا چند سرویس تقسیم بشه

مهمترین دومین در پروژه رو طبق الگوی سرویس مشخص میکنیم، الگوی سرویس همون هسته بیزنس پروژه هستش (قلب تپنده هر سیستمی)، بیشترین بخش کد و توسعه رو شامل میشه، خبره ترین توسعه دهندگان تیم بر روی این بخش متمرکز میشن تا سرویس‌ها رو به بهترین شکل ممکن بالا بیارن پر هزینه ترین دومین برای هر سیستمی هستش و شکست در اون جبران ناپذیر خواهد بود، دومین دیگر مربوط به الگوی کاربران هستش که از اسمش مشخص هستش، دومین بعدی ما بخش مربوط به الگوی درآمدزایی خواهد بود، دیدگاه و تفکر شما در پیدا کردن دومین‌ها و تبدیل اون به سرویس‌های مجزا بسیار حائز اهمیت هستش

#microservice

#daily

@code_crafters
🔥3👍2👎1
باینری ها در PostgreSQL: ذخیره سازی اطلاعات خام

تصور کنید می‌خواهید عکسی از گربه‌تان را در PostgreSQL ذخیره کنید. چطور می‌توانید این کار را انجام دهید؟

پایگاه داده PostgreSQL نوع داده‌ای به نام bytea را ارائه می‌دهد که برای ذخیره اطلاعات باینری مانند تصاویر، فایل‌های صوتی و ویدئوها ایده‌آل است.

تفاوت باینری و رشته‌های کاراکتری:

* رشته‌های باینری مانند "بایت‌های خام" هستند و می‌توانند هر نوع داده‌ای را ذخیره کنند، از جمله صفر و کاراکترهای غیرقابل چاپ.
* رشته‌های کاراکتری برای ذخیره متن مناسب هستند و محدودیت‌هایی در مورد کاراکترهای مجاز دارند.

فرمت‌های ذخیره سازی:

هگزادسیمال: هر بایت به عنوان دو رقم شانزده‌گانی نمایش داده می‌شود (مثلاً "00" برای بایت صفر). این فرمت خوانایی بیشتری دارد.
نوع Escape: برخی از بایت‌ها با کاراکترهای خاص علامت‌گذاری می‌شوند. این فرمت قدیمی‌تر است و کاربرد کمتری دارد.

کاربردها:

۱.ذخیره تصاویر، فایل‌های صوتی و ویدئوها
۲.ذخیره داده‌های باینری مانند کدهای برنامه
۳.ذخیره اطلاعات رمزنگاری شده

مثال:

فرض کنید می‌خواهید تصویر گربه‌تان را با نام cat.jpg در پایگاه داده ذخیره کنید:

INSERT INTO photos (name, data)
VALUES ('cat.jpg', BYTEA('\xFF\xD8\xFF\xE0'));


نکات:

پایگاه داده PostgreSQL از نوع داده BLOB (Binary Large Object) نیز برای ذخیره داده‌های باینری پشتیبانی می‌کند. فرمت ورودی BLOB با bytea متفاوت است، اما توابع و عملگرهای مشابهی دارند.
می‌توانید از توابع و عملگرهای مختلفی برای کار با داده‌های bytea استفاده کنید، مانند LENGTH(), SUBSTRING() و COMPARE().

نتیجه:

نوع داده bytea یک ابزار قدرتمند برای ذخیره و مدیریت داده‌های باینری در PostgreSQL است. با استفاده از این نوع داده، می‌توانید انواع مختلف اطلاعات را به طور کارآمد و ایمن ذخیره کنید.

#PostgreSQL
@Code_Crafters
5👍2🔥2
ذخیره سازی اطلاعات خام ولی در حجم بالا با Blob در PostgreSQL

در پایگاه داده PostgreSQL نوع داده‌ای به نام bytea را ارائه می‌دهد که برای ذخیره اطلاعات باینری مانند تصاویر، فایل‌های صوتی و ویدئوها ایده‌آل است. اما گاهی اوقات با داده‌های باینری خیلی بزرگتر از حد معمول سروکار داریم. در اینجاست که مفهوم BLOB یا "Binary Large Object" به کمک ما می‌آید.

تعریف BLOB چیست؟

در واقع BLOB یک نوع داده در PostgreSQL است که برای ذخیره داده‌های باینری بسیار بزرگ مانند:

۱. فایل‌های چند گیگابایتی
۲. مجموعه داده‌های علمی
۳. تصاویر با وضوح بالا
۴. فایل‌های ویدئویی با کیفیت بالا

استفاده می‌شود.

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

* ذخیره سازی داده‌های حجیم: BLOB ها می‌توانند داده‌هایی با حجم تا 1 ترابایت را ذخیره کنند.
* کارایی: BLOB ها برای ذخیره سازی داده‌های باینری بهینه شده‌اند و می‌توانند عملکرد بهتری نسبت به ذخیره سازی داده‌های باینری در قالب رشته‌های متنی ارائه دهند.
* انعطاف پذیری: BLOB ها می‌توانند برای ذخیره هر نوع داده باینری، صرف نظر از نوع و فرمت آن، استفاده شوند.

نحوه استفاده از BLOB:

برای استفاده از BLOB در PostgreSQL، باید مراحل زیر را انجام دهید:

1. نوع داده BLOB را در جدول خود تعریف کنید:
CREATE TABLE my_table (
id INT PRIMARY KEY,
data BYTEA
);

2. با استفاده از دستور INSERT، داده‌های BLOB را در جدول ذخیره کنید:
INSERT INTO my_table (id, data)
VALUES (1, lo_import('image.jpg'));

3. با استفاده از دستور SELECT، داده‌های BLOB را از جدول بازیابی کنید:
SELECT data FROM my_table WHERE id = 1;

نکات مهم:

برای ذخیره و بازیابی BLOB ها، باید از توابع lo_import و lo_export استفاده کنید.
پایگاه داده PostgreSQL ابزارهای مختلفی برای مدیریت BLOB ها ارائه می‌دهد، مانند توابع و عملگرهای خاص.
برای اطلاعات بیشتر در مورد BLOB ها، می‌توانید به مستندات PostgreSQL مراجعه کنید.

مثال:

فرض کنید می‌خواهید یک ویدیو با حجم 2 گیگابایت را در PostgreSQL ذخیره کنید. می‌توانید مراحل زیر را انجام دهید:

1. نوع داده BLOB را در جدول خود تعریف کنید:
CREATE TABLE videos (
id INT PRIMARY KEY,
title VARCHAR(255),
data BYTEA
);

2. با استفاده از دستور INSERT، ویدیو را در جدول ذخیره کنید:
INSERT INTO videos (id, title, data)
VALUES (1, 'My Video', lo_import('video.mp4'));

3. با استفاده از دستور SELECT، ویدیو را از جدول بازیابی کنید:
SELECT data FROM videos WHERE id = 1;

با استفاده از BLOB ها، می‌توانید هر نوع داده باینری را در PostgreSQL ذخیره کنید و به آنها دسترسی داشته باشید. این امر PostgreSQL را به یک راه حل قدرتمند برای ذخیره سازی و مدیریت داده‌های باینری تبدیل می‌کند.

در ادامه، چند نمونه دیگر از کاربردهای BLOB در PostgreSQL آورده شده است:

۱. ذخیره سازی اسناد و مدارک
۲. ذخیره سازی تصاویر و ویدیوها
۳. ذخیره سازی فایل‌های صوتی
۴. ذخیره سازی پایگاه داده‌های NoSQL
۵. ذخیره سازی داده‌های رمزنگاری شده

جمع بندی:

در واقع BLOB ها یک ابزار قدرتمند برای ذخیره سازی داده‌های باینری در PostgreSQL هستند. با استفاده از BLOB ها، می‌توانید داده‌های حجیم را به طور کارآمد و ایمن ذخیره کنید.

#PostgreSQL
@Code_Crafters
🔥62
در ادامه مباحث مربوط به طراحی سیستم و معماری آن میریم به سراغ مشخص کردن محدوده و لبه‌های بخش‌های مختلف سرویس، ابتدا دیتا لایه رو مشخص کردیم و سپس دومین‌های تجاری رو پیدا کردیم و اکنون بر روی یک طرح مشخص میکنیم هر سرویس با چه سرویس‌های دیگه ارتباط داره و اشتراکاتشون کجاست(شکل هندسی آن با توجه به هر سیستم متفاوت میگردد) هر سرویس رو با دیتا لایر خودش مشخص میکنیم(در تصویر بلوک‌های زرد رنگ)، یک سیستم میتواند چند دومین تجاری داشته باشد و هر دومین نیز یک یا چند سرویس مجزا بر اساس این طرح بندی در تصویر اولویت‌های ما کامل مشخص خواهد شد و تیم یا تیم‌های توسعه راحت میتوانند تصمیم بگیرند کدام سرویس‌ها پایه و اولویت بالاتری دارن و کدام وابستگی‌های بیشتری ایجاد میکنند و این در پیش برد صحیح و اجرای اولیه بسیار به سازمان کمک میکند، علاوه بر ان میتوان قسمت mvp (نمونه اولیه را نیز مشخص کرد، کادر سبز رنگ)


#microservice

#daily

@code_crafters
👍4👎3
رویه ذخیره شده Stored Procedure ناجی برنامه های تحت فشار:
در دنیای برنامه‌نویسی(منظور ما سمت Back-End است نه Front-End 🥸)، بهینه‌سازی و عملکرد روان برنامه‌ها از اهمیت بالایی برخوردار است. در این میان، پایگاه‌های داده نقش حیاتی در ذخیره‌سازی و بازیابی اطلاعات ایفا می‌کنند.

رویه ذخیره‌شده یا Stored Procedure چیست ؟
به صورت خلاصه Stored Procedure یک مجموعه از دستورات SQL است که کار خاصی را انجام میدهد و ما برای آن یک نام مرتبط میگذاریم و در هر جایی که نیاز داشته باشیم آن را فراخوانی میکنیم (اگر پارامتر خاصی نیاز داشته باشد هم میتوانیم به آن پاس بدهیم )

به صورت معمول برنامه نویس ها از ORM هایی مخصوص زبان برنامه نویسی که با آن کار میکنند برای ایجاد کوئری بر روی دیتابیس استفاده میکنند ولی ORM (منظورم هر ORM است حتی اگر معجزه برنامه نویسی قرن باشد!!!) چندین ایراد مهم و اساسی دارند که در ادامه به آن ها اشاره میشود:

۱. شما باید هزینه تبدیل کد هایتان را به SQL پرداخت کنید(با کاهش قدرت برنامه) در نهایت پایگاه داده شما با SQL کار میکند نه زبان برنامه نویسی شما !!!

۲.وقتی از ORM ها استفاده میکنید اگر نیاز به کوئری پیچیده و یا خیلی خاصی داشته باشید قدرت زیادی برای مدیریت این چالش با استفاده از ORM نخواهید داشت.

۳. معمولا برای فراخوانی یک مقدار از پایگاه داده به چندین روش مختلف میتوان این کار را انجام داد که یه سری از این روش ها دارای پرفومنس خوب و بعضی از روش ها دارای پرفومنس وحشتناک هستند
(این مورد مربوط به افزایش پرفومنس در SQL است که توضیح طولانی دارد که در اینجا جای نمیگیرد ولی برای آشنایی بیشتر ساده ترین مورد را اشاره میکنم :
تصور کنید جدولی به نام کارکنان و با ۱۵ ردیف داریم و میخواهید مقدار نام از جدول کارکنان خود را بخوانید با استفاده از ORM خود در نهایت به این کوئری خواهید رسید :
select * from employee;

در حالی که شما فقط به نام کارکنان در این جدول نیاز دارید و این جدول دارای ۱۵ ردیف است که فراخوانی ۱۴ ردیف دیگر بیهوده و هزینه برخواهد بود
و این کوئری نیاز شما را برطرف میکرد :


select name from employee;

که دارای پرفومنس بهتری خواهد بود
{شاید بتوانید جلوی استفاده از * بگیرید و ORM را مجبور به فراخوانی تنها name کنید ولی در موارد دیگر چنین ساده نخواهد بود })
وقتی از ORM خود استفاده میکنید شما کنترل زیادی برای اینکه از چه روشی استفاده کند نخواهید داشت و صرفا کد های ORM خود را خواهید دید

۴. گاها پیش میآید که شما برای فراخوانی مقدار در پایگاه داده با استفاده از ORM کوئری میسازید ولی ORM کوئری عجیبی تولید میکند که فشار فوق العاده ای بر روی برنامه شما وارد میکند.(برای جلوگیری این مورد اگر اصرار به استفاده از ORM دارید باید به موارد پیشرفته ORM خود مراجعه کنید که نیاز به تمرین و زمان است)

از معایب استفاده از Stored Procedure میتوان به این موارد اشاره کرد:


۱. نیاز به دانش خوبی از SQL دارد

۲. در صورت تغییر پایگاه داده نیاز به بازنویسی خواهند داشت

۳.نوشتن برنامه با سرعت خیلی پایین تری پیش خواهد رفت.

مقایسه Stored Procedure با ORM:


در واقع ORMها (Object-Relational Mapping) ابزاری برای نگاشت اشیاء برنامه به ساختارهای پایگاه داده هستند. ORMها به طور خودکار وظایف مربوط به ترجمه کوئری‌ها از زبان برنامه‌نویسی به زبان SQL را انجام می‌دهند.

در حالی که ORMها مزایایی از جمله سادگی و سهولت استفاده را ارائه می‌دهند، اما در مقایسه با Stored Procedureها، معایبی نیز دارند. ORMها می‌توانند به دلیل ترجمه‌های اضافی، باعث افت عملکرد شوند. همچنین، ORMها در مدیریت کوئری‌های پیچیده و خاص، انعطاف‌پذیری Stored Procedureها را ندارند.

در نتیجه :اگر برنامه شما دارای فشار زیادی بر روی پایگاه داده است و همین طور برنامه شما دارای بار زیادی است میتوانید برای مدیریت آن از Stored Procedure ها در پایگاه داده تان استفاده کنید
یا اینکه میتوانید استفاده نکنید و به زیبایی کد های خود با استفاده از ORM به خود افتخار کنید و بگذارید پایگاه داده تحت فشار کد های SQL عجیب شما تبدیل به نفت شود
این مورد کاملا بستگی به برنامه و نیاز شما بستگی دارد.

#Database #General
@Code_Crafters
👍3🔥2😁1
در ادامه مباحث مربوط به میکروسرویس و soa بارها به سیاست و اصول سازمانی اشاره کردیم (در کتاب طراحی میکروسرویس با جنگو یک بخش مهم از کتاب که نظر خود من رو بشدت جلب کرده بود بارها و بارها به این موضوع اشاره کرده بود) و گفتیم بخش مهمی از طراحی به سبک این معماری‌های نوین بشدت وابسته به این مسئله می‌باشد

در این پست پست‌های با تگ soa# راجب این موضوع حرف میزنیم و مثالهایی برای اون خواهیم گفت تا دیدگاهمون نسبت بهش بازتر بشه و شناخت دقیقتری ازش داشته باشیم

مسئله بر سر حاکمیت soa در سازمان هست
حاکمیت SOA به مجموعه ای از اصول و روش‌ها میگیم که این اطمینان رو حاصل کنه برامون که معماری سرویس گرا (SOA) به طور موثر و کارآمد و مطابق با نیازهای سازمان اداره و بکار گرفته میشود، که شامل تعیین فرآیندها،روابط،کنترل مکانیسم‌ها و اعمال سیاست‌ها میشود

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

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

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


1-سیاست‌های پایه


1-1 سیاست پایه زمان طراحی (design-time policies):
۱-سرویس‌های بدون تکرار:
در یک بخش، بسیاری از عملکردها بین خدمات تکراری است. رسمی کردن این مورد در یک خط‌مشی و بررسی این خط‌مشی قبل از شروع کار بر روی یک سرویس جدید، می‌تواند باعث صرفه‌جویی در کارهای تکراری شود

۲-استانداردسازی فناوری:
این سیاست چیزی شبیه به این است که: "همه خدمات ارائه شده به عموم مردم، به عنوان مثال، از طریق اینترنت، باید از الگوی REST پیروی کنند.خدماتی که منحصراً برای اهداف B2B ارائه می شوند باید از معماری WS-* استفاده کنند." این یک سیاست اساسی است، اما سیاستی است که مانع از آن می‌شود که طراحان پروژه‌ها آنچه را که فکر می‌کنند بهترین است بدون نگاه کردن به شمای بزرگ‌تر انجام دهند.


۳-تایید محتوای پیام:
این سیاست می تواند به شما در ایجاد یک چشم اندازی یکسان از سرویس کمک کند. وقتی عمیق‌تر به این خط‌مشی نگاه می‌کنیم، احتمالاً باید نوع اعتبارسنجی مورد نیاز را نیز تعریف کنیم، به عنوان مثال، این می تواند به این معنی باشد که تمام قالب های پیام این سرویس باید XML همراه با یک شماتیک باشد. یا اینکه تمام پیام های JSON ارسال شده می توانند با استفاده از شماتیک JSON تأیید شوند.


1-2 سیاست‌های پایه زمان اجرا (runtime policies):
۱-سرویس باید در یک بازه زمانی مشخص پاسخ دهد(برای مثال کمتر از ۲ ثانیه):
با ایزارهای مشخص و معینی میتوانید این مورد رو مورد بررسی قرار دهید، این یک سیاست ساده در این بخش خواهد بود، شما میتوانید یک داکیومنت بسازید که در آن مشخص شده چه زمان‌هایی سرویس شما در دسترس بوده یا نبوده، این سند میتواند مورد استفاده تحلیلگران سیستم در سازمان قرار گیرد که سیستم رو مورد بررسی قرار دهند

۲-صداکردن (تماس) سرویس‌ها باید در یک کانال امن صورت گیرد:
یکی دیگر از سیاست‌های اساسی برای شروع میتواند این مورد باشد، اگر قرار است ارتباط سرویس‌ها در یک بستر امن صورت گیرد این میتواند یک مورد مناسب باشد، برای مثال جهت اجرای این سیاست ارتباطات میتوانند توسط Apache اجرا کنید

۳-سرویس باید خود توصیفگر باشد:
هنگام استقرار یک سرویس باید خود توصیفگر باشد، شما نباید برای تعامل با یک سرویس و نحوه ارتباط با آن نیاز به یک کتاب بزرگ راهنمایی جهت خوندن اون باشید


ما سیاست‌های پایه خودمون رو مشخص کردیم حال به سراغ سیاست‌های دسته‌بندی میریم و اونهارو بررسی میکنیم


#microservoce
#soa

@code_crafters
👍4
2-سیاست‌های دسته بندی شده

2-1سیاست های طراحی و مستندسازی

۱- مستندسازی سرویس‌های خود را ایجاد کنید:
تمام سرویس‌ها باید مستندسازی شوند. شما باید بتوانید بدون نیاز به بررسی دفترچه راهنما از یک سرویس استفاده کنید

۲-استفاده مجدد از استانداردهای تبادل داده (پیام) موجود:
اگر یک مدل استاندارد یا واقعی وجود دارد که در سازمان یا دامنه تجاری شما استفاده می شود، باید از آن مدل در سرویس خود استفاده کنید.(برای مثال استفاده از REST برای کاربران نهایی و WS-* برای تجارت بین سازمانی، شماتیک json مشخص در خروجی)

۳-طراحی برای قابلیت استفاده مجدد
قبل از شروع کار بر روی یک سرویس جدید، باید مطمئن شوید که در حال حاضر سرویسی وجود ندارد که همان عملکرد را ارائه دهد یا به راحتی قابل توسعه (داخل متن مرجوعی از کلمه تغییر بجای توسعه استفاده کرده و با توجه به اصول solid در این خصوص من از کلمه توسعه استفاده کردم تا ذهنیت توسعه دهندگان در خصوص اصول باقی بماند) باشد تا عملکرد مورد نیاز را ارائه دهد.

۴-پشتیبانی از چندین نسخه از سرویس:
پشتیبانی از چندین نسخه از یک سرویس در کنار یکدیگر باید امکان پذیر باشد.تغییرات در نسخه ها باید تا حد امکان بر مصرف کننده تأثیر بگذارد.

2-2 سیاست‌های امنیتی

۱-رمزنگاری کانال ارتباطی برای داده‌های حساس:
تمامی ارتباطات با سرویس شما باید در یک کانال امن صورت بگیرد

۲- تایید یکپارچگی و عدم انکار پیام:
باید مطمئن شوید که می‌توانید یکپارچگی و منشأ داده‌های پیام را تضمین کنید.(برای مثال ارسال مشخص امضا شده دو طرفه، استفاده از گواهینامه‌های اعتبارسنجی، در برخی از پروتکل‌ها مانند ws-secureconversion این امکان بصورت فیچر وجود دارد)

۳-سرویس احرازهویت مرکزی:
هنگامی که یک مصرف کننده نیاز به احراز هویت برای خدمات شما دارد، باید فقط یک بار احراز هویت کند، نه به طور جداگانه برای هر سرویس.

۴-استفاده از یک سیستم هویت متمرکز برای مجوزها:
مجوز مورد استفاده همه سرویس‌ها می باشد.برای جلوگیری از اجرای این مورد برای هر سرویس به طور جداگانه، باید از یک سیستم هویت و مجوز متمرکز استفاده کنید.


2-3موارد تست و کارایی
۱-پردازش پیام در ۱۰ ثانیه:
یک سرویس همیشه باید در کمترین زمان ممکن پاسخ دهد

۲-مانیتور سرویس بموقع(real time):
اگر می خواهید خدمات خود را به طور موثر نظارت کنید، باید بتوانید عملکرد را در زمان واقعی اندازه گیری کنید.

۳-یک ویوی منعطف برای نحوه استفاده از سرویس ارائه دهید:
بسته به نیازهای تحلیلگران، باید بتوانید دیدگاه های متفاوتی از نحوه استفاده از سرویس خود نشان دهید.

۴-اجرای سرویس‌ها در فضای ابری:
تمام سرویس هایی که توسعه می یابند باید به صورت افقی مقیاس پذیر باشند تا از صرف سرمایه زیاد در سخت افزار جلوگیری شود و امکان رشد خطی فراهم گردد

۵-کیفیت کد و پوشش تست را اعمال کنید:
تمامی سرویس‌های شما باید با درصد خاصی از پوشش کد مطابقت داشته باشد و حداقل سطح کیفیت از پیش تعریف شده داشته باشد.


در سازمان خود اگر برای بخش‌هایی از سیاست‌ها ابزار خاصی مدنظر دارید در داخل سند ارائه شده مطرح کنید برای مثال:
در بخش مانیتورینگ از graphana telegraf یا Prometheus یا BAM استفاده میشود

در بخش کیفیت سنجی و تحلیل کد از sonarqube با sage استفاده میگردد

در بخش تست کدها از end2end یا integration استفاده میگردد

برای بررسی لاگ‌ها ELK استفاده میگردد

برای container orchestrations از k8s استفاده میگردد


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

#microservice
#soa

@code_crafters
👍4
تصور واقعی ما از کسانی که تو رزومه میزنن مسلط به چند زبان (در ظاهر خودشون و بقیه شیر اما از دیدگاه مدیران فنی و ...)


#fun

@code_crafters
😁12👍2
CodeCrafters
https://telegra.ph/Stacks-and-queues-09-30 #algorithm @code_crafters
Queue¹
صف²
یک صف شبیه به یک استک³ است، اما روش متفاوتی را برای افزودن و حذف عناصر تعریف می‌کند.
عناصر از یک انتها اضافه می‌شوند که به آن rear⁴ می‌گویند و از انتهای دیگر به نام front⁵ حذف می‌شوند.

به این رفتار FIFO⁶ (First in First Out) گفته می‌شود.
برای تجسم عملکرد آن می توانید یک صف از افراد را در نظر بگیرید. افراد به ترتیب وارد صف می شوند. به مرور طول صف افزایش می‌یابد. سپس افراد به ترتیبی که وارد صف شده اند، از صف خارج می‌شوند. در این صورت اولین نفری که وارد صف شده، اولین نفری است که از صف خارج خواهد شد.

اصطلاح شناسی
فرآیند افزودن عناصر جدید به صف را enqueue⁷ می‌گویند.
فرآیند حذف یک عنصر از صف را dequeue⁸ می‌گویند.

برنامه‌های کاربردی
از صف‌ها هر زمان که نیاز به مدیریت اشیاء⁹ داشته باشیم به منظور شروع با اولین مورد وارد شده استفاده می‌شود.
سناریوها شامل چاپ اسناد¹⁰ بر روی چاپگر، سیستم‌های مرکز تماس پاسخگویی به افراد در انتظار و غیره است.

📌 لیست¹¹های پایتون ساده‌ترین راه برای پیاده‌سازی عملکرد یک صف هستند.


پانوشت:
1. به فارسی: صف
2. به انگلیسی: Queue
3. Stack (به فارسی: پُشته)
4. انتها، پشت
5. جلو
6. First in First Out
یا به اختصار FIFO یعنی خروج به ترتیب ورود، یکی از روش‌های سازماندهی کنترل داده با توجه به زمان و اولویت‌بندی است.
7. enqueue
کردن، عنصری را به انتهای Queue (صف) اضافه میکند.
8. dequeue
کردن، اولین عنصر یا همان عنصر جلوی صف را از Queue خارج و حذف خواهد کرد.
9. Object
10. Document
11. List

#data_structures
#algorithm

@code_crafters
👍4🔥3
CodeCrafters
Queue¹ صف² یک صف شبیه به یک استک³ است، اما روش متفاوتی را برای افزودن و حذف عناصر تعریف می‌کند. عناصر از یک انتها اضافه می‌شوند که به آن rear⁴ می‌گویند و از انتهای دیگر به نام front⁵ حذف می‌شوند. به این رفتار FIFO⁶ (First in First Out) گفته می‌شود. برای تجسم…
صف در پایتون

بیایید کلاس Queue را با متُدهای enqueue، dequeue، is_empty و print مربوطه پیاده سازی کنیم.

ما از یک لیست برای ذخیره عناصر استفاده خواهیم کرد.
class Queue:
def __init__(self):
self.items = []

def is_empty(self):
return self.items == []

def enqueue(self, item):
self.items.insert(0, item)

def dequeue(self):
return self.items.pop()

def print_queue(self):
print(self.items)

q = Queue()
q.enqueue('a')
q.enqueue('b')
q.enqueue('42')
q.print_queue()

q.dequeue()
q.print_queue()


متُد enqueue یک عنصر را در ابتدای لیست اضافه می‌کند، در حالی که متُد dequeue آخرین عنصر را حذف می‌کند.

ℹ️ با کد بازی کنید و صف را در عمل ببینید!

#data_structures
#algorithm

@code_crafters
🔥4👍3👌1
Linked List¹

یک لینکدلیست² مجموعه‌ای از گره³ها است که در آن هر گره دادههای خود و پیوند⁵ی به گره بعدی را ذخیره می‌کند.

یک گره به گره دیگری پیوند دارد و آنچه را که می‌توان به عنوان یک زنجیره پیوندی⁶ در نظر گرفت، تشکیل می‌دهد:


اولین گره سَر⁷ نامیده می‌شود و به عنوان نقطه شروع برای هر تکرار⁸ در لیست استفاده می‌شود. آخرین گره باید پیوند آن به None⁹ اشاره داشته باشد، تا انتهای لیست تعیین شود.

برخلاف استک‌ها¹⁰ و صف‌ها¹¹، می‌توانید گره‌ها را در هر جایگاهی از لینکدلیست (شبیه به یک لیست استاندارد) اضافه و حذف کنید.

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

لینکدلیست‌ها زمانی مفید هستند که داده‌های شما پیوند داده شده است. به عنوان مثال، زمانی که به عملکرد بازگردانی-بازانجام¹² نیاز دارید، گره‌ها می‌توانند وضعیت را با پیوندهایی به حالت‌های قبلی و بعدی نشان دهند. مثال دیگر می‌تواند یک پلی‌لیست¹³ موسیقی باشد که در آن هر بُرش¹⁴ با بُرش بعدی مرتبط است.

📌 لینکدلیست‌ها همچنین می‌توانند برای ایجاد سایر ساختارهای داده¹⁵ مانند استک‌ها، صف‌ها و گراف‌ها¹⁶ استفاده شوند.


پانوشت:

1. به فارسی: لیست پیوندی (فهرست پیوندی)
2. Linked List
3. Node
یا نود یک نقطه اتصال در شبکه است. این نقطه اتصال می‌تواند یکی از نقاط توزیع مجدد داده یا نقاط ارتباطی باشد که اطلاعات را ارسال و دریافت می‌کنند. اما این همه آنچه که در خصوص node یا گره در شبکه نیست.
4. Data
5. Link
6. Linked Chain
7. Head
8. Iteration
9. از None برای نشان دادن عدم وجود یک مقدار استفاده می‌شود. این در زبان‌های دیگر برنامه‌نویسی مشابه است. مانند دیگر مقادیر خالی مانند 0، [] و رشته خالی، زمانی که به یک متغیر بولی تبدیل می‌شود false خواهد بود.
10. Stacks (پشته‌ها)
11. Queues
12. Undo/ Redo
13. Playlist
14. Clip
15. Data Structures
16. Graphs
دیتا استراکچر یا ساختمان داده‌ای است که به منظور مدل‌سازی مجموعه‌ای از اشیاء و ارتباطات مابین آن‌ها مورد استفاده قرار می‌گیرد.

#data_structures
#algorithm

@code_crafters
🔥4👍1
CodeCrafters
Linked List¹ یک لینکدلیست² مجموعه‌ای از گره³ها است که در آن هر گره داده⁴های خود و پیوند⁵ی به گره بعدی را ذخیره می‌کند. یک گره به گره دیگری پیوند دارد و آنچه را که می‌توان به عنوان یک زنجیره پیوندی⁶ در نظر گرفت، تشکیل می‌دهد: اولین گره سَر⁷ نامیده می‌شود…
لینکد‌لیست‌ در پایتون

هر گره شامل داده و پیوند به گره بعدی خواهد بود.

بیایید با ایجاد کلاس Node¹ شروع کنیم:
class Node:
def __init__(self, data, next):
self.data = data
self.next = next


اکنون می‌توانیم کلاس LinkedList را با متُدهای مربوطه ایجاد کنیم:
class Node:
def __init__(self, data, next):
self.data = data
self.next = next

class LinkedList:
def __init__(self):
self.head = None

def add_at_front(self, data):
self.head = Node(data, self.head)

def add_at_end(self, data):
if not self.head:
self.head = Node(data, None)
return
curr = self.head
while curr.next:
curr = curr.next
curr.next = Node(data, None)

def get_last_node(self):
n = self.head
while(n.next != None):
n = n.next
return n.data

def is_empty(self):
return self.head == None

def print_list(self):
n = self.head
while n != None:
print(n.data, end = " => ")
n = n.next
print()


s = LinkedList()
s.add_at_front(5)
s.add_at_end(8)
s.add_at_front(9)

s.print_list()
print(s.get_last_node())


متُد ()add_at_front یک Node جدید را به عنوان سَر لیست اضافه می کند و سَر قبلی را به آن پیوند می‌دهد.
متُد ()add_at_end با استفاده از یک حلقه² while تا انتهای لیست تکرار می‌شود و گره جدید را به عنوان پیوندِ آخرین گره اضافه می‌کند.

ℹ️ کد را اجرا کنید و ببینید چگونه کار می‌کند!


پانوشت:

1. نام کلاس "گره" (نود/ Node)
2. حلقه در برنامه نویسی یکی از عنصرهای برنامه‌نویسی به حساب می‌آید که به وسیله آن می‌توان بخشی از کدها را به تعداد دفعات مشخص تا زمانی تکرار کرد که فرایند و پروسه مورد نظر به پایان برسد.

#data_structures
#algorithm

@code_crafters
👍4🔥4👌1
سیستم SSO (single sign-on) چیست؟

در واقع sso یک سیستم احراز هویت هستش، تکنولوژی که صفحات مختلف ورود برنامه‌های مختلف رو در یک صفحه ترکیب میکنه، با sso کاربر تنها یکبار اعتبارنامه خودش (نام کاربری و رمزعبور) رو در یک صفحه وارد میکنه و به همه برنامه‌های SaaS مورد نیاز خود دسترسی پیدا میکنه

در واقع sso توسط زمینه تجاری مورد استفاده قرار میگیرد، زمانیکه تمام برنامه‌های کاربردی کاربر توسط یک تیم متخصص IT ارائه و مدیریت میگردد

یک سازمان رو در نظر بگیرید که چندین برنامه کاربردی مختلف دارد و کاربر برای هر برنامه باید بصورت جداگانه هویت خود رو احراز کند، این موجب میشه تا در نهایت کاربران نهایی از انجام آن خسته و یا بخواهند آنرا به هر طریقی شده دور بزنند، sso در اینجا این امکان رو فراهم میکنه تا کاربر تنها با یکبار مشخص کردن هویت خود به تمامی سرویس‌های کاربردی دسترسی پیدا کند، sso یک جنبه مهم از تمام راه حلهای مدیریت هویت و دسترسی یا کنترل دسترسی (IAM) و تایید هویت کاربر برای دانستن مجوزهای که هرکاربر باید داشته باشد است

مزایای استفاده از sso
علاوه بر سادگی استفاده از آن برای کاربران، امنیت آن نیز بسیار است، اما چگونه ممکن است استفاده از یک نام کاربری و پسورد برای استفاده از چندین سرویس امنتر از استفاده از چندین نام کاربری و پسورد باشد، دلایل زیر میتواند توضیح قانع کننده‌ای باشد:

۱-پسورد سخت:
کاربران تنها از یک پسورد استفاده میکنند و sso امکان ساخت و به یاد داشتن پسورد سخت رو فراهم میکنه چون کاربران تنها از یک پسورد استفاده میکنند و پسورد سخت از حملات (brute force attack) جلوگیری میکند، حدس زدن یک پسورد سخت کار رو غیر ممکن میکند

۲-عدم تکرار پسورد:
وقتی کاربران برای هر سرویس نیاز به پسورد داشته باشند معمولا از یک پسورد تکراری در تمامی سرویس‌ها استفاده میکنند(یک رمز یکسان برای تمامی سرویس‌ها) اگر داده‌های دیتابیس یک سرویس لو بره با همون پسورد کاربر میتوانن به همه سرویس‌های دیگه دسترسی پیدا کنند، sso با حذف چندین صفحه ورود به یک صفحه این مورد رو رفع میکند

۳-اعمال و اجرا کردن سیاست‌های رمز عبور:
با استفاده از سیستم sso متخصصان IT میتوانند به راحتی سیاست‌های رمز عبور خود را اعمال کنند برای مثال: بجای بازنشانی رمز عبور دوره‌ای در سرویس‌های مختلف با استفاده از sso کاربر تنها در یک سرویس بطور دوره‌ای رمز عبور خود را بازنشانی میکند

۴-احراز هویت‌های چندعامله(multi-factore authentication):
یا به اختصار MFA رجوع میکنه به بیش از یک عامل هویت سنجی، برای مثال علاوه بر نام کاربری و رمز عبور کاربر ممکن است مجبور به استفاده از احرازهویت سخت افزاری هم گردد، این قطعه سخت افزاری در شناسایی کاربر بسیار مهم است، MFA بسیار امنتر از اتکا به رمز عبور می‌باشد، sso امکان استفاده از MFA رو در یک نقطه واحد بجای استفاده از آن در چندین نقطه که ممکن است غیرقابل پیاده سازی باشد فراهم میکند

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

۶-مدیریت اعتبار داخلی بجای حافظه خارجی:
معمولا رمزعبور کاربران بصورت مدیریت نشده توسط برنامه‌ها و سرویس‌های که ممکن است از بهترین شیوه‌های امنیتی پیروی کنند یا نکنند ذخیره میشوند، با sso آنها بصورت داخلی در محیطی ذخیره میشوند که تیم IT کنترل بیشتری روی آن دارد

۷-اتلاف زمان کمتر جهت بازیابی رمز عبور:
علاوه بر مزایای ذکر شده ،sso زمان تلف شده رو برای تیم‌های داخلی کاهش میدهد، تیم IT زمان کمتری رو برای کمک به بازیابی رمز عبور کاربران میکند و کاربران زمان کمتری رو صرف ورود به برنامه‌های مختلف برای انجام کارهای خود میکندد،این پتانسیل موجب افزایش بهره وری کسب و کار می‌شود


#microservice
#sso

@code_crafters
👍5
توکن‌های احرازهویت SSO چگونه کار میکندد؟
توانایی ارسال توکن احراز هویت به برنامه‌ها و سرویس‌های خارجی در فرآیند SSO بسیار مهم است. این همان چیزی است که سیستم تأیید هویت را قادر می سازد جدا از سایر سرویس های ابری انجام شود و SSO را ممکن می کند.

یک رویداد اجتماعی را تصور کنید که تنها یکعده خاص از مردم میتوانند در آن شرکت کنند، یک راه برای بررسی آن این است در قسمت ورودی نگهبانانی بگذاریم که ورود افراد رو چک کنه و مهر تایید بر اجازه ورود صادر بشود، شبیه هر مهر که یکسری پارامترهای تاییدی دارد توکن احرازهویت نیز پارامترهایی دارد که صحت آنرا نشان میدهد،این استاندارد توکن احراز هویت رو با نام SAML (Security Assertion Markup Language) میشناسیم


چگونه SSO در یک استراتژی مدیریت دسترسی قرار می گیرد؟
در واقع sso تنها یک جنبه مدیریت دسترسی هستش، این باید ترکیبی باشد از کنترل دسترسی، کنترل سطح دسترسی، لاگ فعالیت‌ها و سایر اقدامات جهت رهگیری و کنترل رفتار کاربر درون برنامه‌های سازمانی، با این حال، SSO یک عنصر حیاتی در مدیریت دسترسی است. اگر سیستمی نداند کاربر کیست، هیچ راهی برای اجازه یا محدود کردن اعمال آن کاربر وجود ندارد.



سیستم sso یک سرویس حیاتی در مبحث میکروسرویس هستش که سعی میکنیم این سرویس رو با جنگو و یک پلتفرم مخصوص و معروف آن پیاده سازی کنیم


#microservice
#sso

@code_crafters
👍4
در ادامه مبحث میکروسرویس رسیدیم به sso و اکنون با یک پلتفرم جامع بابتش آشنا خواهیم شد


در پست قبل گفتیم تمامی سرویس‌ها و برنامه‌های ما نیاز به احراز هویت دارن و با استفاده از sso تمام صفحات ورود رو در یک صفحه جا میدیم، برای اینکار یک پلتفرم رایگان و پر استفاده وجود دارد از شرکت readhat با نام keycloak


در واقع keycloak یک ابزار رایگان شناسایی هویت و مدیریت دسترسی میباشد(IAM) identity and access management ، فرآیند احراز هویت رو برای سرویس‌های IT ساده میکند

هدف از ابزار IAM اطمینان حاصل کردن از این مورد است که مردم به منابع درستی دسترسی دارن، که معمولاً اجرای SSO, فدراسیون هویت (identity federation) و احراز هویت قوی (authentication strong) رو امکان پذیر می کند

همه شما استفاده از مدیریت هویت و دسترسی (IAM) را می دانید.کاربرد اصلی راه حل IAM این است که به عنوان یک Identity Provider (IdP) عمل می کند، به این معنی که هویت های دیجیتالی کاربر و همچنین فاکتورهای احراز هویت آنها را ایجاد، نگهداری و مدیریت می کند

اما این سوالات پیش میاد
خود keycloak چیست؟؟
ویژگی و سودمندی آن چیست؟؟
چگونه تاثیر گذاره؟؟

ما به این سوالات پاسخ میدیم

نخست keycloak چیست؟؟
یک ابزار برای IAM هستش که مجوز Apache رو داره و توسط شرکت redhat برای sso طراحی شده است

با keycloak شما میتونید در تایم کوتاهی سرویس خودتون رو امن و احرازهویت رو به برنامه خود اضافه کنید

با استفاده از کنسول ادمین keycloak ،کمپانی‌ها میتونن با شبکه‌های اجتماعی سریعا وارد بشن، اینجا کد یا برنامه‌ای تغییر نمیکنه، تمامی این موارد نیازمند انتخاب شبکه اجتماعی میباشد، ادمین‌ها میتونن تمام جنبه‌های keycloak رو به سادگی مدیریت کنند، برای مثال فعال و غیرفعال کردن ویژگی‌های آن


ویژگی‌های keycloak
در واقع keycloak از سه نوع پروتکل oidc, oauth2, saml پشتیبانی میکند

این ابزار بصورت کامل از SSO که مخفف single-sign on و single-sign out میباشد پشتیبانی میکند

کنسول ادمین
یک رابط کاربری گرافیکی مبتنی بر وب توسط Keycloak ارائه شده است، که در آن می‌توانید تمام تنظیمات مورد نیاز خود را با «کلیک کنید» آنطور که می‌خواهید کار کند تنظیم کنید


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

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

مزایای keycloak
۱-سریع و منعطف:
جامعه ان نشان داده که بسیار سریع با تغییرات دنیای مهندسی خودش رو وفق میده و در کل طراحی keycloak خودش رو برای رویکرد agile آماده و مناسب کرده

۲-نرم افزار منبع باز:
شما میتوانید به تمامی کدهای برنامه بصورت رایگان دسترسی داشته باشید و از آن استفاده نمایید

۳-پشتیبانی و ثابت شده:
جامعه عظیم و پشتیبانی بزرگی از آن حمایت میکند که سریع میتوانند به شما بازخورد دهند

۴-احراز هویت و مجوز دسترسی:
با حداقل ترین تلاش و سریع احراز هویت و افزایش امنیت را به سازمان و برنامه‌های خود میتوانید اضافه کنید

۵-مدیریت سیستم:
حساب های کاربران را به طور یکپارچه مدیریت و داده ها و همچنین جلسات را حفظ می کند

۶-ماژول و مستقل:
می توان از آن به عنوان یک عنصر زیرساخت IT یا به عنوان یک راه حل مستقل استفاده کرد


#microservice
#sso #keycloak


@code_crafters
👍4🔥4