CodeCrafters
765 subscribers
91 photos
51 videos
42 files
170 links
Download Telegram
بخش product development: تمام توسعه محصول در بخش توسعه محصول متمرکز است که دارای سه بخش فرعی است. هر یک از این بخش ها بر روی یک منطقه خاص تمرکز می کنند

بخش analytics: بخش تجزیه و تحلیل نحوه استفاده از خدمات و محصولات را تجزیه و تحلیل می کند.روندها را رصد می کند و به مشتریان کمک می کند تا نحوه استفاده از خدمات و محصولات ارائه شده را بهینه کنند.

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

بخش product support:بخش پشتیبانی محصول در این زمینه ها پشتیبانی می کند:پشتیبانی مشتری، پشتیبانی فنی و پشتیبانی پیاده سازی

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

بخش domain service: توسعه محصولات و خدمات خاص را مدیریت می کند. به عنوان مثال، سیستم کاهش ترافیک، توسعه یافته و توسط این بخش نگهداری می شود

بخش Mobile Services: توسعه همه برنامه های تلفن همراه را انجام می دهد

بخش customer product: پشتیبانی مشتری به سوالات مربوط به استفاده از محصولات و خدمات رسیدگی می کند

بخش technical support: پشتیبانی فنی با مسائل اتصال، ادغام فنی و مسائل مربوط به امنیت سر و کار دارد

بخش implementation support: پشتیبانی پیاده سازی، به مشتریان محصول کمک می کند تا متصل شوند


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

مدیر عامل CEO: "من می خواهم این شرکت رشد کند. ما در حال حاضر عده‌ای به عنوان مشتری داریم. من می خواهم در دو سال آینده مشتریان افزایش پیدا کند.ما باید هزینه های IT را در یک راستا نگه داریم، زیرا آنها در چند سال گذشته به طور پیوسته در حال افزایش بوده اند

مدیر فروش sales manager: «مشتریان ما گزینه های مختلف استقرار را می خواهند. برخی در حال حاضر ابر خصوصی خود را دارند و نمی خواهند در ابر ما اجرا شوند.علاوه بر این، آنها خواهان دسترسی آسان‌تر به داده‌ها هستند تا بتوانند آن‌ها را در برنامه‌های کاربردی خود بگنجانند»


مدیر توسعه development manager: «ما باید توسعه خدمات را ادغام کنیم. سرویس ها از انواع مختلفی از مدل ها استفاده می کنند. ما همچنین متوجه شده‌ایم که برخی از سرویس‌ها تقریباً عملکرد مشابهی را ارائه می‌کنند، و می‌خواهیم تعدادی از خدمات را برای حذف این تکرار اصلاح کنیم.»


مدیر پشتیبانی محصول product support manager: «ما نسخه‌های بسیار زیادی در حال تولید داریم که پشتیبانی از آن‌ها سخت است و نظارت خوبی نداریم. ما یک نسخه واحد می خواهیم که همه مشتریان از آن استفاده کنند. ما همچنین سوالات زیادی در مورد نحوه استفاده از خدمات دریافت می کنیم که باید در جایی مستند شود.

تحلیلگر اصلی lead analyst: «ما باید بتوانیم گزارش‌های سفارشی ایجاد کنیم تا به مشتریان خود کمک کنیم. می‌خواهم ببینم فرآیند درخواست مجوز چه زمانی و توسط چه کسی و چه مدت اجرا می‌شود، از کدام سرویس‌ها استفاده می‌شود.»

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

#microservice
#soa

@code_crafters
5👍1
Array¹
آرایه²
ساختمان داده آرایه‌³ای یک مفهوم اساسی در علوم کامپیوتر است که مجموعه‌ای از عناصر⁴ را در یک قطعه⁵ پیوسته از حافظه ذخیره می‌کند. این امکان دسترسی موثر به عناصر را با استفاده از اندیس‌ها⁶ فراهم می‌کند و به طور گسترده در برنامه‌نویسی برای سازماندهی⁷ و دستکاری⁸ داده‌ها استفاده می‌شود.

آرایه چیست؟
آرایه یک ساختمان داده خطی⁹ است که در آن همه عناصر به صورت متوالی¹⁰ مرتب شده‌اند. این مجموعه‌ای از عناصر از نوع داده یکسان یا مواردی از همان نوع متغیر¹¹ است که در مکان‌های حافظه به هم پیوسته ذخیره می‌شوند. این یکی از محبوب‌ترین و ساده‌ترین ساختمان‌های داده است و اغلب برای پیاده‌سازی سایر ساختمان‌های داده استفاده می‌شود. هر مورد¹² در یک آرایه با شروع از 0 ایندکس می‌شود. هر عنصر در یک آرایه از طریق ایندکس آن قابل دسترسی است.
1_تصویر مربوطه

برای سادگی، می‌توانیم آرایه‌ای را به‌عنوان تعدادی پله در نظر بگیریم که روی هر پله یک مقدار قرار می‌گیرد (مثلاً یکی از دوستان شما). در اینجا، شما می‌توانید مکان هر یک از دوستان خود را به سادگی با دانستن تعداد پلکانی که در آن قرار دارند شناسایی کنید.

این کار محاسبه موقعیت هر عنصر را به سادگی با افزودن یک افست¹³ به یک مقدار پایه، یعنی مکان حافظه اولین عنصر آرایه (که معمولاً با نام آرایه مشخص می‌شود) آسان‌تر می‌کند. مقدار پایه ایندکس 0 است و تفاوت بین این دو ایندکس‌ها افست است.

📌 به یاد داشته باشید: "مکان ایندکس بعدی به نوع داده‌ای که استفاده می‌کنیم بستگی دارد".

آیا اندازه آرایه همیشه ثابت است؟
در زبان برنامه‌نویسی ¹⁴C، آرایه دارای یک اندازه ثابت است، به این معنی که وقتی اندازه به آن داده می‌شود، نمی توان آن را تغییر داد، یعنی نمی‌توانید آن را کاهش دهید و نمی‌توانید آن را گسترش دهید. دلیل آن این بود که برای گسترش اگر اندازه را تغییر دهیم، نمی‌توانیم مطمئن باشیم (هر بار امکان ندارد) که مکان حافظه بعدی را به صورت رایگان در اختیارمان قرار دهد. کاهش یافتن کار نخواهد کرد زیرا آرایه، زمانی که اعلام شود، حافظه به صورت ایستا¹⁵ تخصیص می‌یابد، و بنابراین کامپایلر¹⁶ تنها کسی است که می‌تواند آن را از بین ببرد.

اصطلاحات پایه آرایه
- ایندکس آرایه¹⁷: در یک آرایه، عناصر با ایندکس‌هایشان شناسایی می‌شوند. ایندکس آرایه از 0 شروع می‌شود.
- عنصر آرایه¹⁸: عناصر، مواردی هستند که در یک آرایه ذخیره می‌شوند و با ایندکس آن‌ها می‌توان به آن‌ها دسترسی داشت.
- طول آرایه¹⁹: طول یک آرایه با تعداد عناصری که می تواند داشته باشد تعیین می‌شود.

نمایش حافظه آرایه
در یک آرایه، تمام عناصر در مکان‌های حافظه به هم پیوسته ذخیره می‌شوند. بنابراین، اگر یک آرایه را مقداردهی اولیه کنیم:
2_تصویر مربوطه

پانوشت:
1. به فارسی: آرایه
2. Array 3. Array Data Structure
4. elements 5. block
6. indices 7. organizing
8. manipulating 9. Linear Data Structure
10. sequential 11. Variable
12. item 13. offset
14. C Programming Language
15. Static
16. Compiler
یا کامپایلر نرم‌افزاری برای تبدیل کُد منبع (Source Code) به کُد شی (Object Code) است. به عبارت دیگر می‌توان گفت که کامپایلر کُدهای نوشته شده به زبان سطح بالا (نزدیک به زبان انسان) توسط برنامه‌نویسان را به زبان دودویی ماشین تبدیل می‌کند.
17. Array Index 18. Array element
19. Array Length

#data_structures
#algorithm

@code_crafters
6👍1
اهمیت آرایه
فرض کنید کلاسی متشکل از 5 دانش آموز وجود دارد و اگر باید سوابق نمرات آن‌ها را در امتحان نگه‌داریم، می‌توانیم این کار را با اعلام مجزا پنج متغیر و نگه‌داری پیگیری سوابق انجام دهیم، اما اگر تعداد دانش‌آموزان بسیار زیاد شود، چه می‌شود. دستکاری و نگهداری داده‌ها چالش‌برانگیز خواهد بود.
معنی آن این است که ما می‌توانیم از متغیرهای عادی (... ,v1, v2, v3) زمانی که تعداد اشیاء کمی داریم استفاده کنیم. اما اگر بخواهیم تعداد زیادی نمونه را ذخیره کنیم، مدیریت آن‌ها با متغیرهای عادی مشکل می شود. ایده آرایه این است که نمونه‌های زیادی را در یک متغیر نشان دهد.
3_تصویر مربوطه

انواع آرایه‌ها
آرایه‌ها را می‌توان به دو صورت طبقه‌بندی کرد:
- بر اساس تخصیص حافظه¹
- بر اساس ابعاد²

4_تصویر مربوطه

انواع آرایه‌ها بر اساس ابعاد:
دو نوع اصلی آرایه وجود دارد که به انواع آرایه‌ها بر اساس ابعاد تقسیم‌بندی می‌شوند:
- 1. آرایه‌های تک‌بُعدی (آرایه 1 بُعدی)³: می‌توانید یک آرایه 1 بُعدی را به عنوان یک ردیف تصور کنید که در آن عناصر یکی پس از دیگری ذخیره می‌شوند یا به عبارتی این آرایه‌ها یک ردیف از عناصر را ذخیره می‌کنند.
5_تصویر مربوطه
- 2. آرایه‌های چندبُعدی⁴: آرایه چند بُعدی آرایه‌ای با بیش از یک بُعد است. ما می‌توانیم از آرایه چند بُعدی برای ذخیره داده‌های پیچیده در قالب جداول و غیره استفاده کنیم. می‌توانیم آرایه‌های 2 بُعدی⁵، آرایه‌های 3 بُعدی⁶، آرایه‌های 4 بُعدی⁷ و از این قبیل داشته باشیم و به عبارتی این آرایه‌ها چندین ردیف از عناصر را ذخیره می‌کنند.

+ آرایه دو بُعدی (آرایه 2 بُعدی یا ماتریس)⁸: آرایه‌های چندبُعدیِ 2 بُعدی را می‌توان به عنوان آرایه‌ای از آرایه‌ها یا به عنوان ماتریسی متشکل از ردیف‌ها و ستون‌ها در نظر گرفت.
6_تصویر مربوطه
+ آرایه سه بُعدی (آرایه 3 بُعدی)⁹: یک آرایه چند بُعدیِ 3 بُعدی شامل سه بُعد است، بنابراین می‌توان آن را آرایه‌ای از آرایه‌های دو بُعدی در نظر گرفت.
7_تصویر مربوطه

انواع آرایه‌ها بر اساس تخصیص حافظه:
1. آرایه‌‌های ایستا¹⁰:
در این نوع آرایه، حافظه در زمان کامپایل با اندازه ثابتی از آن تخصیص می‌یابد. ما نمی‌توانیم اندازه این آرایه را تغییر دهیم یا به روز کنیم. این نوع تخصیص حافظه به عنوان تخصیص حافظه ثابت¹¹ یا زمانِ کامپایل¹² نیز شناخته می‌شود. در اینجا فقط یک اندازه ثابت (یعنی اندازه ای که در پرانتز [] ذکر شده است) از حافظه برای ذخیره‌سازی اختصاص داده می‌شود. در صورتی که اندازه آرایه را ندانیم، اگر اندازه بزرگتر را اعلام کنیم و تعداد عناصر کمتری را ذخیره کنیم باعث هدر رفتن حافظه می‌شود یا اندازه کمتری را نسبت به تعداد عناصر اعلام می‌کنیم، در این صورت حافظه کافی برای ذخیره همه عناصر نخواهیم داشت. در چنین مواردی، تخصیص حافظه ثابت ترجیح داده نمی‌شود.
// Static Integer Array
int arr[5] = {1, 2, 3, 4, 5};

// Static Integer Array
int arr[5] = {1, 2, 3, 4, 5};

// Static Array
int[] arr = { 1, 2, 3, 4, 5 };

import array
# Static Array
arr = array.array('i', [1, 2, 3, 4, 5])

// Static array
int[] arr = { 1, 2, 3, 4, 5 };

let arr[] = {1, 2, 3, 4, 5}

پانوشت:
1. Memory Allocation 2. Dimensions
3. One-dimensional Array(1-D Array)
4. Multi-dimensional Array
5. 2-D arrays 6. 3-D arrays
7. 4-D arrays
8. Two-Dimensional Array(2-D Array or Matrix)
9. Three-Dimensional Array(3-D Array)
10. Static Arrays 11. static
12. compile-time

#data_structures
#algorithm

@code_crafters
👌52👍2
2. آرایه‌های پویا¹:
در این نوع آرایه، حافظه در زمان اجرا تخصیص داده می‌شود اما اندازه ثابتی² ندارد. فرض کنید، کاربر می‌خواهد هر اندازه تصادفی³ یک آرایه را اعلام کند، پس از آرایه ایستا استفاده نمی‌کنیم، به جای آن از یک آرایه پویا استفاده می‌شود. این نوع تخصیص حافظه به عنوان تخصیص حافظه پویا یا زمانِ اجرا⁴ نیز شناخته می‌شود. برای تعیین اندازه آن در طول زمان اجرای هر برنامه استفاده می‌شود.
// Dynamic Integer Array
int* arr = new int[5];

// Dynamic Integer Array
int* arr = malloc(sizeof(int) * 5);

// Dynamic Integer Array
ArrayList<Integer> arr = new ArrayList<>();

# Dynamic Array
arr = []

// Dynamic Integer Array
int[] arr = new int[5];

// Dynamic Array
let arr = new Array(5);

پانوشت:
1. Dynamic Arrays
2. fixed size
3. random
4. run-time

#data_structures
#algorithm

@code_crafters
👍73👏1
عملیات روی آرایه
1. پیمایش آرایه¹:
پیمایش آرایه شامل یک بار بازدید از تمام عناصر آرایه به ترتیب خاصی است (به عنوان مثال: متوالی²، معکوس‌³). در زیر پیاده‌سازی پیمایش آرایه در زبان‌های مختلف آورده شده است:
int arr[] = { 1, 2, 3, 4, 5 };
int len = sizeof(arr) / sizeof(arr[0]);
// Traversing over arr[]
for (int i = 0; i < len; i++) {
printf("%d ", arr[i]);
}

int arr[] = { 1, 2, 3, 4, 5 };
// Traversing over arr[]
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}

import array
arr = array.array('i', [1, 2, 3, 4, 5])
# Traversing over arr[]
for x in arr:
print(x, end=" ")

int[] arr = { 1, 2, 3, 4, 5 };
// Traversing over arr[]
for (int i = 0; i < arr.Length; i++)
Console.Write(" " + arr[i]);

let arr = [1, 2, 3, 4, 5]
// Traversing over arr[]
for (let x of arr)
console.log(x)

int arr[] = { 1, 2, 3, 4, 5 };
int len = sizeof(arr) / sizeof(arr[0]);
// Traversing over arr[]
for (int i = 0; i < len; i++) {
cout << arr[i] << " ";
}

پانوشت:
1. Array Traversal
2. sequential
3. reverse

#data_structures
#algorithm

@code_crafters
7👍1👌1
2. درج در آرایه¹:
ما می‌توانیم یک یا چند عنصر را در هر موقعیتی در آرایه وارد کنیم یا به عبارتی در یک ایندکس خاص. در زیر پیاده‌سازی درج در آرایه به زبان‌های مختلف برنامه‌نویسی آورده شده است:
// Function to insert element
// at a specific position
void insertElement(int arr[], int n, int x, int pos)
{
// shift elements to the right
// which are on the right side of pos
for (int i = n - 1; i >= pos; i--)
arr[i + 1] = arr[i];

arr[pos] = x;
}

// Function to insert element
// at a specific position
void insertElement(int arr[], int n, int x, int pos)
{
// shift elements to the right
// which are on the right side of pos
for (int i = n - 1; i >= pos; i--)
arr[i + 1] = arr[i];

arr[pos] = x;
}

static void insertElement(int arr[], int n, int x, int pos)
{
// shift elements to the right
// which are on the right side of pos
for (int i = n - 1; i >= pos; i--)
arr[i + 1] = arr[i];
arr[pos] = x;
}

# python Program to Insert an element
# at a specific position in an Array

def insertElement(arr, n, x, pos):

# shift elements to the right
# which are on the right side of pos
for i in range(n-1, pos-1, -1):
arr[i + 1] = arr[i]

arr[pos] = x

static void insertElement(int[] arr, int n, int x, int pos)
{
// shift elements to the right
// which are on the right side of pos
for (int i = n - 1; i >= pos; i--)
arr[i + 1] = arr[i];
arr[pos] = x;
}

// javascript Program to Insert an element
// at a specific position in an Array
function insertElement(arr, n, x, pos)
{
// shift elements to the right
// which are on the right side of pos
var i = n - 1;
for (i; i >= pos; i--)
{
arr[i + 1] = arr[i];
}
arr[pos] = x;
}

پانوشت:
1. Insertion in Array

#data_structures
#algorithm

@code_crafters
7👍1💯1
در ادامه مباحث میکروسرویس و حاکمیت soa میرسیم به سیاست‌های ادغام سازی


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

بیایید با یک مثال اندکی بیشتر راجبش صحبت کنیم، فرض کنید که ما یک پروژه داریم که قراره از خدمات بانکی استفاده کنه یا به بانک‌ها خدمات ارائه بده، سیستم بانکی در سرتاسر کشور یکسان هستش و قوانین مشخص شده‌ای داره که کا باید از این قوانین پیروی کنیم در صورت عدم پیروی از این قوانین پروژه ما با شکست مواجه میشه، از طرفی دیگه هم پروژه ما باید توانایی ادغام با سیستم بانکی رو هم داشته باشه و مشابه کاری که ما میخوایم انجام بدیم هم توسط سازمان‌های دیگه صورت گرفته، اینجاست که یکسری سیاست‌های حاکمیتی soa به شکل زیر به میان میاد:

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

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

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


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

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

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


سیاست‌های نگهداری چند نسخه بصورت همزمان:
در سیستم‌های بزرگ بروز رسانی موضوعی همیشگی هستش، اما این برای مشتریان سیستم نه شاید جالب باشد تصور کنید نسخه‌ای از سیستم ارائه شده و مشتریان در حال استفاده از اون هستند اندکی بعد نسخه جدید ارائه میگردد و مشتریان باید خود رو با نسخه جدید هماهنگ کنن، در نهایت تصمیم برخی مشتریان ماندن در نسخه قبلی می‌باشد(درخواست مدیر فروش)
بیانیه: ما باید بتوانیم دو نسخه از سیستم را همزمان پشتیبانی کنیم.مشتریان ما مجاز به اجرای یک نسخه قبلی هستند. هنگامی که یک نسخه جدید را ارائه می کنیم، همچنین باید بررسی کنیم که آیا این یک تغییر شکسته است، که یک شماره نسخه جدید را معرفی می کند یا یک تغییر سازگار با قبلی است، که نسخه جدید را تضمین نمی کند.

#microservice
#soa

@code_crafters
4👍1🔥1
منطق بیانیه: دلیل این خط‌مشی این است که نمی‌توانیم انتظار داشته باشیم که مصرف‌کنندگان خدمات ما فوراً به نسخه جدیدی از سرویسی که استفاده می‌کنند به‌روزرسانی کنند. تغییر در حال شکستن همچنین مستلزم تغییراتی در سمت مشتری است. برای اینکه به مصرف کنندگان ما اجازه دهیم به راحتی به نسخه جدیدی از یک سرویس بروند، به آنها اجازه می دهیم یک نسخه اصلی را پشت سر بگذارند.

سیاست implication: ما باید مطمئن شویم که فضاهای نام استفاده شده منعکس کننده نسخه صحیح یک سرویس یا پیام هستند. سرویس های REST نیز باید نسخه شوند. این بدان معنی است که در توصیف نوع محتوای آنها باید شماره نسخه وجود داشته باشد. چرخه عمر سرویس باید وجود داشته باشد که به مصرف کننده وضعیتی که سرویس در آن است اطلاع دهد. مخزن باید بتواند چندین نسخه از یک سرویس را پشتیبانی کند و کاربران مخزن باید بتوانند به راحتی نسخه سرویس مورد نظر خود را تشخیص دهند.

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

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

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

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


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

بیانیه: ما باید مطمئن باشیم که همه پیام‌هایی که اطلاعاتی را در سیستم‌های ما ایجاد یا به‌روزرسانی می‌کنند، می‌توانند از نظر یکپارچگی و عدم انکار پیام بررسی شوند.

منطق بیانیه: اگر مشتریان بتوانند داده های جعلی ارسال کنند، محاسبات نادرست خواهد بود و سازمان ضرر خواهد کرد.

پیامدهای بیانیه: ما باید راهی را تعریف کنیم که پیام ما می تواند امضا شود.این باید به ما امکان دهد تشخیص دهیم که آیا پیام دستکاری شده است یا خیر. مشتریان ما باید به هر پیامی که می فرستند یک امضا اضافه کنند. باید سرویس‌های خود را تغییر دهیم تا هر پیام قبل از پردازش تأیید شود.

بیانیه(دوم): همه برنامه ها و سرویس ها از یک سیستم مرکزی استفاده می کنند که نقش ها و حقوق کاربران سیستم ها و برنامه های ما را تعیین می کند.

منطق بیانیه: اجرای مجوز اغلب به شیوه ای بسیار خاص برای برنامه انجام می شود.
هر سرویس و برنامه ای طرح های مجوز خود را ابداع می کند که باید به طور جداگانه توسعه و مدیریت شوند. ما با یک سیستم مجوز واحد، شیوه برخورد برنامه‌ها با مجوز را استاندارد می‌کنیم و می‌توانیم مدیریت نقش‌ها، حقوق و کاربران را متمرکز کنیم.

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


سیاست‌های تست و افزایش کارایی:
مشتریان سازمان ما متفاوت هستند، گاها یک مستری نسبت به خدمات ما تقاضای شخصی خود را نیز دارد، که منجر به نوشتن یک قرارداد سطح خدمات (SLA) میشود مشتری از ما اطمینان پاسخ دهی سریع سرویس را میخواهد(درخواست مدیر فروش)

بیانیه: میانگین زمان پردازش پیام ها باید کمتر از 10 میلی ثانیه باشد

پیامدهای منطقی: برای اینکه بتواند با بار فزاینده کنار بیاید، سرویسی که با داده های سروکار دارد باید بتواند پیام ها را در عرض 10 میلی ثانیه پردازش کند.

پیامدهای بیانیه: برای مشاهده میانگین زمان پردازش باید محیط را زیر نظر داشته باشیم. ما باید تست های استرس را اجرا کنیم تا ببینیم سیستم تحت افزایش بار چگونه عمل می کند.


#microservice
#soa

@code_crafters
4👍1🔥1
سیاست‌های نظارت بر عملکرد:
واحد پشتیبانی باید در لحظه بتواند سرویس را نظارت کند و قبل از وقوع اتفاق این امکان نظارت را داشته باشد، معمولا واحد پشتیبانی بعد از رخ داد برای سرویس متوجه ان میشود(درخواست مدیر پشتیبانی)

بیانیه: همه خدمات باید در زمان واقعی نظارت شوند.

منطق بیانیه: اگر بخواهیم بتوانیم خدمات خود را به طور موثر نظارت کنیم و به هر مشکلی در اسرع وقت پاسخ دهیم، باید خدمات خود را در زمان واقعی نظارت کنیم.

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


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

بیانیه: خدمات باید یک نمای قابل تنظیم از رویدادهای خاص ارائه دهد.

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

پیامدهای بیانیه: داشبوردهایی را تنظیم کنید که عملکرد خاص خدمات ما را نظارت کنند. اجازه پردازش پیچیده رویدادها را برای ایجاد نمای مورد نیاز تحلیلگران تجاری.


سیاست مقیاس کردن پروژه:
در طی سالیان انتظار رشد زیاد پروژه رو دارند ازین بابت نیازمند رویکردی کم هزینه هستیم (درخواست مدیر عامل و مدیر فروش)

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

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

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


سیاست بررسی و نظارت بر توسعه سیستم:
هر سیستم بخش‌هایی از آن به دلایلی ممکن است دچار خطا شوند این زمانی معضل میشه که تعداد آنها بسیار بالا باشد و بخش پشتیبانی رو با حجم زیادی از درخواست روبرو کند، از این رو نظارت بر توسعه سیستم بوجود میاد(درخواست مدیر توسعه)

بیانیه: همه خدمات ما باید قبل از ارسال آزمایش شوند. این سرویس ها باید روی تمام لایه های مختلف تست شوند. علاوه بر این تست ها، باید از بررسی خودکار برای تعیین کیفیت کد و پوشش تست برای یک سرویس خاص استفاده شود.

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

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


#microservice
#soa

@code_crafters
5👍2🔥1
CodeCrafters
2. درج در آرایه¹: ما می‌توانیم یک یا چند عنصر را در هر موقعیتی در آرایه وارد کنیم یا به عبارتی در یک ایندکس خاص. در زیر پیاده‌سازی درج در آرایه به زبان‌های مختلف برنامه‌نویسی آورده شده است: // Function to insert element // at a specific position void insertElement(int…
3. حذف در آرایه¹:
ما می‌توانیم یک عنصر را در هر ایندکسی در یک آرایه حذف کنیم. در زیر اجرای حذف عنصر در یک آرایه آمده است:
// To search a key to be deleted
int findElement(int arr[], int n, int key);

// Function to delete an element
int deleteElement(int arr[], int n, int key)
{
// Find position of element to be deleted
int pos = findElement(arr, n, key);

if (pos == -1) {
cout << "Element not found";
return n;
}

// Deleting element
int i;
for (i = pos; i < n - 1; i++)
arr[i] = arr[i + 1];

return n - 1;
}

// Function to implement search operation
int findElement(int arr[], int n, int key)
{
int i;
for (i = 0; i < n; i++)
if (arr[i] == key)
return i;
// Return -1 if key is not found
return -1;
}

// C program to implement delete operation in a
// unsorted array
#include <stdio.h>

// To search a key to be deleted
int findElement(int arr[], int n, int key);

// Function to delete an element
int deleteElement(int arr[], int n, int key)
{
// Find position of element to be deleted
int pos = findElement(arr, n, key);

if (pos == -1) {
printf("Element not found");
return n;
}

// Deleting element
int i;
for (i = pos; i < n - 1; i++)
arr[i] = arr[i + 1];

return n - 1;
}

// Function to implement search operation
int findElement(int arr[], int n, int key)
{
int i;
for (i = 0; i < n; i++)
if (arr[i] == key)
return i;
// Return -1 if key is not found
return -1;
}

from array import array

# Function to search for a key in the array
def findElement(arr, n, key):
for i in range(n):
# Return the index if key is found
if arr[i] == key:
return i
# Return -1 if key is not found
return -1

# Function to delete an element from the array
def deleteElement(arr, n, key):
# Find position of element to be deleted
pos = findElement(arr, n, key)

if pos == -1:
print("Element not found")
return n

# Deleting element
for i in range(pos, n - 1):
arr[i] = arr[i + 1]

return n - 1

int findElement(int[] arr, int n, int key)
{

int i;
for (i = 0; i < n; i++)
if (arr[i] == key)
return i;

return -1;
}

// Function to delete an element
int deleteElement(int[] arr, int n, int key)
{
// Find position of element
// to be deleted
int pos = findElement(arr, n, key);

if (pos == -1) {
Console.WriteLine("Element not found");
return n;
}

// Deleting element
int i;
for (i = pos; i < n - 1; i++)
arr[i] = arr[i + 1];

return n - 1;
}

پانوشت:
1. Deletion in Array

#data_structures
#algorithm

@code_crafters
5👍1👏1
CodeCrafters
3. حذف در آرایه¹: ما می‌توانیم یک عنصر را در هر ایندکسی در یک آرایه حذف کنیم. در زیر اجرای حذف عنصر در یک آرایه آمده است: // To search a key to be deleted int findElement(int arr[], int n, int key); // Function to delete an element int deleteElement(int arr[]…
// function to search a key to
// be deleted
static int findElement(int arr[], int n, int key)
{
int i;
for (i = 0; i < n; i++)
if (arr[i] == key)
return i;
// Return -1 if key is not found
return -1;
}

// Function to delete an element
static int deleteElement(int arr[], int n, int key)
{
// Find position of element to be
// deleted
int pos = findElement(arr, n, key);

if (pos == -1) {
System.out.println("Element not found");
return n;
}

// Deleting element
int i;
for (i = pos; i < n - 1; i++)
arr[i] = arr[i + 1];

return n - 1;
}

// function to search a key to  be deleted
function findElement(arr,n,key)
{
let i;
for (i = 0; i < n; i++)
if (arr[i] == key)
return i;
return -1;
}

// Function to delete an element
function deleteElement(arr,n,key)
{
// Find position of element to be deleted
let pos = findElement(arr, n, key);

if (pos == -1)
{
document.write("Element not found");
return n;
}
// Deleting element
let i;
for (i = pos; i< n - 1; i++)
arr[i] = arr[i + 1];
return n - 1;
}


#data_structures
#algorithm

@code_crafters
🔥5👍2👏1
4. جستجو در آرایه¹:
ما می‌توانیم روی یک آرایه پیمایش کنیم و یک عنصر را جستجو کنیم یا به عبارتی یافتن ایندکس یک عنصر در یک آرایه. در زیر اجرای حذف عنصر در یک آرایه آمده است:
// Function to implement search operation
int findElement(int arr[], int n, int key)
{
int i;
for (i = 0; i < n; i++)
if (arr[i] == key)
return i;

// If the key is not found
return -1;
}

// Function to implement search operation
int findElement(int arr[], int n, int key)
{
int i;
for (i = 0; i < n; i++)
if (arr[i] == key)
return i;

// If the key is not found
return -1;
}

// Function to implement search operation
int findElement(int arr[], int n, int key)
{
for (int i = 0; i < n; i++)
if (arr[i] == key)
return i;

// If the key is not found
return -1;
}

# Python program for searching in
# unsorted array

def findElement(arr, n, key):
for i in range(n):
if (arr[i] == key):
return i
# If the key is not found
return -1

// Function to implement
// search operation
int findElement(int[] arr, int n, int key)
{
for (int i = 0; i < n; i++)
if (arr[i] == key)
return i;

// If the key is not found
return -1;
}

// Function to implement search operation 
function findElement( arr, n, key)
{
let i;
for (i = 0; i < n; i++)
if (arr[i] == key)
return i;

return -1;
}

پانوشت:
1. Searching in Array

#data_structures
#algorithm

@code_crafters
9👍2👏1
خب سلام دوستان. تصمیم گرفتم تو یکسری پست سریالی(دوره) در مورد فناوری های نوین و جدید و آینده دار که در ایران متاسفانه کمتر بهشون پرداخته شده بپردازیم و چیزای جدید رو یاد بگیریم.

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

بخش اول: بلاکچین - انقلاب در دنیای دیجیتال
ما این دوره را با بلاکچین آغاز می‌کنیم، فناوری‌ای که با تمرکززدایی، امنیت و شفافیت خود، تحولات عظیمی در ارزهای دیجیتال، قراردادهای هوشمند و مدیریت زنجیره تأمین ایجاد کرده است.

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

ساختار دوره
این دوره به 4 فصل کلیدی تقسیم شده است:

فصل 1: بلاکچین چیست و چگونه کار می‌کند
1-بلاکچین چیست
2-بلاکچین چگونه کار می‌کند
3-کاربردهای بلاکچین
4-اولین بلاکچین و معروف‌ترین‌ها
فصل 2: مفاهیم پایه ارز دیجیتال
1-بلاکچین‌های معروف در حوزه ارزهای دیجیتال
2-استخراج (Mining)
3-کیف پول‌های دیجیتال و امنیت
فصل 3: کاربردهای پیشرفته بلاکچی
1-قراردادهای هوشمند
2-دپس (DApps) و وب 3.0
3-بلاکچین در صنایع مختلف
4-آینده بلاکچی
فصل 4: ابزارها و تکنولوژی‌های مرتبط با بلاکچین
1-زبان‌های برنامه‌نویسی بلاکچین
2-پلتفرم‌های توسعه و ابزارهای کاربردی
3-تحلیل داده‌های بلاکچین
4-آموزش و منابع یادگ
ادامه مسیر: وب 3 و کامپیوترهای کوانتومی
پس از تسلط بر بلاکچین، به سراغ وب 3 و سپس کامپیوترهای کوانتومی خواهیم رفت تا شما را برای آینده‌ای دیجیتالی و هوشمند آماده کنیم.



همچنین میتونید مطالب مرتبط با بلاکچین  و وب3 رو  و مطالب مرتبط  با کامپیوتر های کوانتومی رو با هشتگ های زیر ازین پس در چنل پیدا کنید.
#blockchain
#web3
#quantum_computing
🔥16❤‍🔥2🥰2👏2🍌1
CodeCrafters
4. جستجو در آرایه¹: ما می‌توانیم روی یک آرایه پیمایش کنیم و یک عنصر را جستجو کنیم یا به عبارتی یافتن ایندکس یک عنصر در یک آرایه. در زیر اجرای حذف عنصر در یک آرایه آمده است: // Function to implement search operation int findElement(int arr[], int n, int key)…
تحلیل پیچیدگی عملیات‌ها بر روی آرایه

پیچیدگی زمانی¹:

عملیات پیمایش درج حذف جستجو
بهترین حالت Ω(1) Ω(1) Ω(1) Ω(N)
حالت میانگین
θ(N) θ(N) θ(N) θ(N)
بدترین حالت
O(N) O(N) O(N) O(N)

پیچیدگی فضایی²:
عملیات پیمایش درج حذف جستجو
بهترین حالت Ω(1) Ω(1) Ω(1) Ω(1)
حالت میانگین
θ(1) θ(N) θ(N) θ(1)
بدترین حالت
O(1) O(N) O(N) O(1)

پانوشت:
1. Time Complexity
2. Space Complexity

#data_structures
#algorithm

@code_crafters
6👍1👏1
نیاز به ساختمان‌های داده آرایه
آرایه‌ها یک ساختمان داده اساسی در علوم کامپیوتر هستند. آن‌ها در طیف گسترده‌ای از برنامه‌های کاربردی استفاده می‌شوند، از جمله:
- ذخیره‌سازی داده‌ها برای پردازش
- پیاده‌سازی ساختمان‌های داده مانند استک‌ها و صف¹ها
- نمایش داده‌ها در جداول و ماتریس²ها
- ایجاد ساختمان‌های داده پویا³ مانند لیست‌های پیوندی⁴ و درخت⁵ها

مزایای آرایه
- آرایه‌ها اجازه دسترسی تصادفی به عناصر را می‌دهند. این باعث می‌شود دسترسی به عناصر بر اساس موقعیت سریع‌تر شود.
- آرایه‌ها محل ذخیره حافظه‌پنهان(کَش)⁶ بهتری دارند که تفاوت نسبتاً بزرگی در عملکرد ایجاد می‌کند.
- آرایه‌ها چندین مورد داده از یک نوع را با استفاده از یک نام واحد نشان می‌دهند.
- آرایه‌ها برای پیاده‌سازی سایر ساختمان‌های داده مانند لیست‌های پیوندی، استک‌ها، صف‌ها، درخت‌ها، نمودارها⁷ و غیره استفاده می‌شوند.

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

برنامه‌های کاربردی آرایه
آرایه‌ها در برنامه‌های کاربردی مختلفی استفاده می‌شوند، از جمله:
- ذخیره‌سازی داده‌ها برای پردازش
- آن‌ها در پیاده‌سازی سایر ساختمان‌های داده مانند لیست‌های آرایه⁸، استک‌ها و صف‌ها، هرم‌ها⁹، جداول درهم‌سازی یا چکیده‌سازی(جداول هَش)¹⁰، بُردارها(وِکتور)¹¹ و ماتریس‌ها استفاده می‌شوند.
- نمایش داده‌ها در جداول و ماتریس‌ها
- ایجاد ساختمان‌های داده پویا مانند لیست‌های پیوندی و درخت‌ها
- سوابق¹² پایگاه داده معمولاً به صورت آرایه پیاده‌سازی می‌شوند.
- در جداول جستجو¹³ توسط کامپیوتر استفاده می‌شود.

نتیجه

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

پانوشت:
1. Queues 2. Matrices
3. Dynamic Data Structures
4. Linked Lists 5. Trees
6. cache locality 7. Graphs
8. Array Lists 9. Heaps
10. Hash Tables 11. Vectors
12. records 13. lookup tables

#data_structures
#algorithm

@code_crafters
🔥6👍32
CodeCrafters
خب سلام دوستان. تصمیم گرفتم تو یکسری پست سریالی(دوره) در مورد فناوری های نوین و جدید و آینده دار که در ایران متاسفانه کمتر بهشون پرداخته شده بپردازیم و چیزای جدید رو یاد بگیریم. فناوری‌ های نوین مثل بلاکچین، وب 3 و کامپیوترهای کوانتومی که در حال تغییر جهان…
فصل اول
1-بلاکچین چیست؟

همه بلاکچین با بیت کوین میشناسند. البته که خیلی هم اتفاق عجیبی نیست بخاطر این که بیت کوین در بستر بلاکچین هست که معنا پیدا کرده.
اما جالبکه بدونید تاریخچه بلاکچین به مدت ها قبل مربوط میشه.بلاکچین در واقع یک مدل دیتابیس هست  اما با یکسری تفاوت کلیدی.
خب این تفاوت ها چی هستن؟

1-تغییر ناپذیری و مدیریت داده ها
به محض این که اطلاعاتی در بلاکچین ذخیره بشه به هیچ  عنوان قابلیت
پاک شدن یا تغییر رو نداره
  ما در دیتابیس عملیات CRUD رو داریم (create, read , update , delete)
اما  بلاکچین از عملیات تغییر  پذیری پیشتیبانی نمیکند. به عبارت دیگر در بلاکچین  فقط فقط عملیات C&R(Read, Create) داریم.
به این معنی که داده های یک بار نوشته میشن و دیگه نمیتونن پاک بشن یا جایگزین بشن.

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

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


2-معماری

از نظر معماری، بلاکچین و دیتابیس متفاوت هستند.
پایگاه داده بر اساس معماری کلاینت-سرور Client-server ساخته شده یکی معماری  که هم  در  محیط های کوچک و هم در مقیاس های بزرگ موفقیت های زیادی داشته.

بلاکچین ها قابلیت این رو دارند که غیر متمرکز بشن یعنی هیچ نهادی واحدی بلاکچین رو کنترل نمیکنه . این بانک اطلاعاتی در شبکه های از کامپیوتر ها توضیع شده و تمامشون یک نسخه از این دیتابیس رو داره بخاطر همین میشه گفت هم شفافیت و هم صحت اطلاعات دائم در داخل شبکه تایید میشه . عملا این اتفاق  الزام یک نهاد واسطه  مثل سازمان ها و یا دولت ها که مجبور باشن نظارت داشته باشن رو از بین میبره. عملا بلاکچین میتونه روی یک شبکه با اجماع اکثریت به صورت خودمختار و قابل اعتماد اطلاعات رو نگه داری و  پردازش کنه.
سایر تفاوت‌ها
3-هزینه و پیاده‌سازی
4-سرعت و عملکرد


#blockchain

@code_crafters
👍162🔥1👏1💯1🖕1
در ادامه مباحث در خصوص میکروسرویس و حاکمیت soa و سیاست‌های آن میرسیم به سیاست‌های مستند سازی


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


طراحی سرویس و سیاست داکیومنت سازی

۱-خدمات مستندسازی خود را ایجاد کنید:
برای مشتریان شما مهم است که اسناد خوبی برای خدماتی که می خواهند استفاده کنند داشته باشند.اغلب این مستندات در یک سند جداگانه است که باید قبل از اینکه با رابط سرویس ارتباط برقرار و معنادار شود، مطالعه کنند.
(با این خط‌مشی به شما نشان می‌دهم که بیشتر قابلیت‌هایی که یک سرویس ارائه می‌دهد را می‌توان توسط خود سرویس توصیف کرد، بدون نیاز به اسناد خارجی گسترده)


۲-استفاده مجدد از استانداردهای موجود:
یک ضد الگویی (anti pattern) که اغلب دیده می شود، الگوی "اختراع نشده" است.به جای استفاده از استانداردها (استانداردهای واقعی)، سازمان ها، به ویژه گروه های فناوری اطلاعات، تمایل به اختراع مجدد چرخ دارند. در اجرای این خط مشی، خواهید دید که استفاده مجدد از استانداردهای موجود در محیط های معماری های معروف چقدر آسان است


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

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


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


در ادامه و تکمیل موارد ذکر شده در بالا مطرح کردن این موضوع که استاندارد HTTP میتواند سریعا به مصرف کنندگان سرویس‌های ما سندی توضیحی ارایه دهد بسیار قابل توجه هستش، استفاده از متدهای POST, DELETE, GET, PUT به مشتریان سریعا میرساند که چه چیزی بدست میگیرند رعایت موارد دیگر نیز میتواند درک صریحی رو ارائه دهند برای مثال ذکر json در ریپورت استاندارد HTML این رو میرسونن که در انتظار چه نوع خروجی باشد و همچنین کاربر با دیدن <report-ID> به این مسئله پی خواهد برد که با گذاشتن مقدار عددی بجای ID میتواند اطلاعات مربوط به ان را بگیرد

ذکر این مسائل به ما میگوید که در داکیومنت سازی لازم نیست هرچیزی را مطرح کنید، ذکر موارد زیر در داکیومنت سازی کافیست

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

ریپوزیتوری پروژه بهترین جای ممکن برای ذخیره و نگهداشت و ارائه اون به مشتریان هستش


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


#microservice
#soa

@code_crafters
4👍2🔥1👏1
بیایید به انواع مختلفی از خدماتی که می توانید تعریف کنید نگاه کنیم:
 ■ خدمات فرآیند: خدمات فرآیندی درشت ترین خدمات هستند. این نوع خدمات اغلب خدمات یا محصولاتی را به مصرف کنندگان خود ارائه می دهند.  به عنوان مثال، شما می توانید یک سرویس فرآیندی داشته باشید که فروش یک محصول(هر چیزی) را انجام می دهد. در این سناریو سیستم مالیاتی باید به روز شود، سیستم فروشندگی(فروشگاه، انبار و ...) باید به روز شود و سیستم های بسیار بیشتری در این معامله دخیل هستند. یک سرویس فرآیندی دیگر خدمات فرآیند و خدمات تجاری را برای انجام وظیفه خود فراخوانی می کند.  وقتی به ارکستراسیون(orchestrations) فکر می کنید، احتمالاً در مورد یک سرویس فرآیند صحبت می کنید.

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

■ خدمات فنی: بهترین خدمات، خدمات فنی هستند. یک سرویس فنی بخش کوچکی از عملکرد را برای سایر خدمات فراهم می کند. یک مثال از این می‌تواند سرویسی باشد که به شما امکان می‌دهد یک شخصیت شخصی را در پایگاه داده به‌ روزرسانی کنید، یک ایمیل ارسال کنید.


جدا سازی لایه انتقال transformer layer (سریالایزر) از لایه منطق تجاری business logic، این امکان رو براتون بوجود میاره که سرویس خود رو منتقل کنید، این امر باعث میشه که لایه منطق شما قابل استفاده و در صورت نیاز رابط‌های راه دوری ساخت که از منطق تحاری شما مجدد استفاده کنند


سیستم ما در حال توسعه است و دستخوش تغییراتی که ممکن است ورژن جدیدی رو خلق کنه، این تغییرات به دو دسته عملیات شکسته نشدن و عملیات شکسته شدن منجر گردد، که عواقب آن شامل سازگاری با نسخه قبلی و عدم سازگاری با نسخه قبلی گردد

سیاست‌های موجود در این خصوص
سازگاری با نسخه قبلی و شکسته نشدن:
(افزودن api جدید به سرویس‌های خاص و افزودن منابع غیر اجباری-مشتریان میتونن نادیده بگیرند)
۱-افزودن عملیات جدید- با افزودن عملیات جدید به سرویس‌های خود شکسته شدن رخ نمیدهد و سازگاری با نسخه قبلی همچنان پا بر جاست
۲-با افزودن عملیات جدید، طرحواره xml نیز بوجود می‌آید (schema)، تا زمانیکه طرحواره‌های بوجود اومده برای عملیات‌های جدید منجر به تغییر در طرحواره‌های قبلی و موجود فعلی نگردد سازگاری پا برجاست


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

۲-تغییر نام یک عملیات موجود، این مسئله چیزی نیست جز حذف عملیات قبلی و خلق عملیات جدید که منجر به عدم سازگاری با نسخه قبلی میگردد

۳-تغییر پارامترهای موجود، این عمل منجر میشود که ورودی و خروجی عملیات شما دچار دگرگونی شود

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

نسخه گذاری و ورژنینگ بر اساس شکسته شدن یا عدم شکسته شدن روی میدهد برای مثال ورژن فعلی ما 1.1 میباشد، اگر عملیات بدون شکسته شدن باشد ورژن ما 1.2 و اگر همراه با شکسته شدن باشد ورژن ما 2.1 خواهد شد، که به آن افزایش جزئی و افزایش تعداد نسخه میگوییم


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

لایه ذخیره ساز شما دیتابیس میباشد

لایه دیتای شما مدل‌های شما میباشد

لایه کوئری شما در مدلهای شما می‌باشد(object manager) که عملیات جستجو در ان قرار میگیرد

لایه دسترسی دیتای شما شامل تمامی عملیات‌های crud می باشد

لایه منطق تجاری شما شامل تمام عملیات‌های اعتبار سنجی و پردازش می‌باشد(لایه کوئری و لایه دسترسی داده شما در اینجا فراخوانی میشود)-ویو در این لایه قرار دارد اما اکسپرت این است که در کنار view ما فایل service هم داشته باشیم که رابطی بین viewی ما با لایه کوئری و دسترسی داده باشد و قرار بگیرد

لایه انتقال داده شما سریالایزرهای شما می‌باشد

لایه نمایش شما شامل هر چیزی میشود که کاربر میبیند(html, css, js, swagger)

رعایت کردن این لایه‌ها در سرویس‌های ما منجر به انعطاف پذیری و قابلیت استفاده مجدد میگردد


#microservice
#soa

@code_crafters
4👍4👏1💯1
فصل اول
2- بلاکچین چگونه کار می‌کند؟

بلاکچین را مجموعه‌ای از بلاک‌ها تصور کنید که به صورت زنجیره‌وار به یکدیگر متصل‌اند.

1- ساختار هر بلاک
هر بلاک در زنجیره شامل 3 بخش اصلی است:
1.1- داده (Data): این بخش شامل اطلاعاتی است که بلاک ذخیره می‌کند. برای نمونه، در بلاکچین بیتکوین داده‌ها شامل جزئیات هر تراکنش است مانند فرستنده، گیرنده و مقدار بیتکوین انتقال داده شده.

1.2- هش بلاک (Block Hash): هر بلاک دارای یک کد منحصر به فرد به نام هش است که با استفاده از الگوریتم‌های رمزنگاری تولید می‌شود. هش یک بلاک مانند اثر انگشت آن بلاک است و کوچکترین تغییری در جزئیات داده‌های بلاک، هش آن را به کلی تغییر می‌دهد.
الگوریتم‌های هشینگ توابع ریاضی یک‌طرفه‌ای هستند که ورودی آن هر چیزی می‌تواند باشد اما خروجی آن یک مقدار منحصر به فرد با اندازه ثابت است. یک‌طرفه بودن این توابع به این معناست که با داشتن خروجی نمی‌توان به داده ورودی آن دست پیدا کرد.

1.3- هش بلاک قبلی (Previous Block Hash): هر بلاک حاوی هش بلاک قبلی است که به آن متصل است. این ویژگی باعث ایجاد زنجیره‌ای از بلاک‌ها می‌شود و امنیت و تغییرناپذیری بلاکچین را تضمین می‌کند.
2- فرایند افزودن بلاک به زنجیره
برای افزودن بلاک جدید به زنجیره، مراحل زیر انجام می‌شود:
2.1- تایید تراکنش‌ها (Transaction Verification): ابتدا تراکنش‌های جدید توسط نودهای شبکه تایید می‌شوند. این تایید شامل بررسی صحت امضاهای دیجیتال و اطمینان از عدم تکراری بودن تراکنش‌ها است.

2.2- حل مسئله ریاضی (Proof of Work): برای اضافه کردن بلاک جدید به زنجیره، نودها باید یک مسئله ریاضی پیچیده را حل کنند که به آن اثبات کار می‌گویند. این فرآیند نیازمند قدرت محاسباتی زیادی است و زمان و انرژی زیادی مصرف می‌کند.

2.3- اضافه شدن به زنجیره (Block Addition): پس از حل مسئله و تایید صحت بلاک جدید توسط سایر نودهای شبکه، بلاک به زنجیره اضافه می‌شود.
شفافیت و قابلیت ردیابی
هر تراکنش در بلاکچین به صورت عمومی قابل مشاهده و ردیابی است. این ویژگی باعث می‌شود تا تمامی تراکنش‌ها شفاف و قابل اعتماد باشند. این شفافیت به ویژه در کاربردهایی مانند رای‌گیری الکترونیکی، مدیریت زنجیره تأمین و سیستم‌های مالی بسیار مهم است.

تکمیلی:
بعضی از سایت‌های تولید محتوا مانند ویکی‌پدیا و everpedia بر بستر بلاکچین هستند.که اصولا برای اضافه کردن بلاک جدید نیاز به حل معادلات پیچیده نیست،مثلا در سایت everpedia براساس یک سری الگورتیم های دیگه بلاکچین باشه که هیچ یک از این کار ها رو کاربر انجام نمیده.

بیشتر بخوانید:
الگوریتم های هشینگ Hashing algorithms
هش بلاک Block Hash
نود Node

#blockchain
@code_crafters
🔥14👍1
CodeCrafters
فصل اول 2- بلاکچین چگونه کار می‌کند؟ بلاکچین را مجموعه‌ای از بلاک‌ها تصور کنید که به صورت زنجیره‌وار به یکدیگر متصل‌اند. 1- ساختار هر بلاک هر بلاک در زنجیره شامل 3 بخش اصلی است: 1.1- داده (Data): این بخش شامل اطلاعاتی است که بلاک ذخیره می‌کند. برای نمونه،…
پ ن(تخصصی):
خب سوالی که پیش میاد این که این نود ها چطوری پیوسته و همیشه در حال چک کردن و پردازش هش بلوک ها هستن تا اونارو تایید یا رد بکنن!؟



  ما در نظر میگیریم  که ۵ بلوک داریم
هش بلوک ۲ تغییر کرده ، این باعث میشه که بلوک ۳ ناساگاز بشه و اون با بلوک ۴ و...
این پروسه مثل یک دومینو ادامه پیدا می‌کنه
حالا نود که دائم داره بلوک های جدید رو پردازش و صحت سنجی  میکنه تشخیص میده

زمانی  که یک نود بلوک جدیدی رو دریافت میکنه، اولین کاری که انجام میده، محاسبه  هش بلوک هستش
نود، داده‌های هایی در بلوک (تراکنش‌ها، تایم‌استمپ، هش بلوک قبلی و...) را به تابع هش وارد میکنه و هش تولید شده را با هش اعلام شده در بلوک مقایسه می‌کنه

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


مثال علمی:
بلوک 1 (هش: ABC)
بلوک 2 (هش: DEF) - شامل هش بلوک 1 (ABC)
بلوک 3 (هش: GHI) - شامل هش بلوک 2 (DEF)
بلوک 4 (هش: JKL) - شامل هش بلوک 3 (GHI)
بلوک 5 (هش: MNO) - شامل هش بلوک 4 (JKL)

‌ ‌ اگر دیتایی در بلوک 2 تغییر کنه هش بلوک 2 تغییر میکنه

مثلاً به XYZ حالا بلوک 3 که شامل هش قبلی (DEF) بود الان باید شامل XYZ باشه، اما هش بلوک 3 با این تغییر سازگار نیست.


نودها این تغییر را تشخیص میده زیرا وقتی اطلاعات بلوک 2 را هش می‌کنند هش جدید (XYZ) با هش اعلام شده (DEF) در بلوک 3 مطابقت نداره

و درواقع عدم تطابق باعث میشه که نودها بلوک 2 و بلوک‌های بعدی رپ کلا نامعتبر بدونه




#blockchain
@code_crafters
🔥8👍2