vps

استفاده از map، filter، و reduce در جاوااسکریپت

برنامه نویسی کاربردی در جاوا اسکریپت از خوانایی کد ، قابلیت حفظ و قابلیت آزمایش کد بهره می برد.
یکی از ابزارهای برنامه نویسی کاربردی ، برنامه نویسی به سبک پردازش آرایه است. این امر مستلزم گرفتن آرایه به عنوان ساختار داده بنیادی میباشد. سپس برنامه شما به یک سری عملیات روی عناصر موجود در آرایه تبدیل می شود.
حوزه های بسیاری وجود دارد که این ویژگی در آن ها مفید است ، مانند نقشه برداری نتایج AJAX برای مؤلفه های React با map ، حذف داده های غیرعادی با filter و استفاده از reduce. این عملکردها ، “Array Extras” نامیده می شوند و انتزاعی حول حلقه ها for هستند. چیزی نیست که با این توابع بتوانید انجام دهید و با for نتوانید به دست بیاورید و برعکس.
در این آموزش ، با نگاهی به filter ، map و reduce ، درک عمیق تری از برنامه نویسی کاربردی در جاوااسکریپت ایجاد خواهیم کرد.
تکرار با for
ما از حلقه های for برای تکرار روی هر مورد در آرایه استفاده می کنیم. معمولاً در طول راه کاری روی هر آیتم انجام می دهیم.
یک مثال می تواند بزرگ کردن حرف اول هر رشته در یک آرایه باشد.
const strings = [‘arielle’, ‘are’, ‘you’, ‘there’];
const capitalizedStrings = [];

for (let i = 0; i < strings.length; i += 1) {
const string = strings[i];
capitalizedStrings.push(string.toUpperCase());
}

console.log(capitalizedStrings);

در این قطعه ، با آرایه ای از حروف کوچک شروع می کنیم. سپس ، به یک آرایه خالی را مقدار اولیه می دهیم ، که رشته های بزرگ خود را ذخیره می کنیم.
در داخل حلقه for ، رشته بعدی را در هر تکرار می گیریم. حروف آن را بزرگ میکنیم و آن را به capitalizedStrings میفرستیم. در انتهای حلقه ، CapitalizedStrings شامل هر کلمه ای در رشته ها است ، اما می دانید ، که با حروف بزرگ است است.
این ما را به اولین تابع خود می رساند: forEach. روشی است که در آرایه ها “به طور خودکار” حول لیست ما حلقه می شود. به عبارت دیگر ، جزئیات مقدار اولیه و افزایش شمارنده برای ما را کنترل می کند.
به جای موارد فوق ، که به صورت دستی رشته ها را فهرست می کنیم ، می توانیم forEach را فراخوانی کنیم و رشته بعدی را در هر تکرار دریافت کنیم. نسخه به روز شده چیزی شبیه به این خواهد بود:
const strings = [‘arielle’, ‘are’, ‘you’, ‘there’];
const capitalizedStrings = [];

strings.forEach(function (string) {
capitalizedStrings.push(string.toUpperCase());
})

این تقریباً همان چیزی است که ما با آن شروع کردیم. اما خلاص شدن از این i کد ما را قابل خواندن تر می کند.
همچنین الگوی اصلی را ارائه می دهد که دوباره زمان و زمان را خواهیم دید. یعنی: ما ترجیح می دهیم از روشهایی در Array.prototype استفاده کنیم که جزییاتی مانند مقداردهی اولیه و افزایش شمارنده را حذف می کند. به این ترتیب ، ما می توانیم به جای متن استاندارد (boilerplate) ، روی منطق مهم تمرکز کنیم.
درک رمز سزار و حملات Brute Force
در کد های زیر ، ما در مثال های map ، reduce و filter T رشته های رمزگذاری و رمزگشایی را استفاده خواهیم کرد.
مثلا:
// Thanks to EvanHahn for this: https://gist.github.com/EvanHahn/2587465
const caesar = require(‘./caesar’);

// We can encrypt the string: ‘this is my secret message’ with `caesar`
// Here, we scramble the message by shifting each letter forward by 2 letters: ‘a’ becomes ‘c’; ‘s’ becomes ‘u’; etc.
const encryptedString = caesar(‘this is my super secret message.’, 2);
console.log(encryptedString); // ‘vjku ku oa uwrgt ugetgv uvtkpi.’

مفهوم این است که ، اگر من یک پیام عادی مانند ‘this is my super secret message’ به شما ارسال کنم ، و شخص دیگری به آن دست یابد ، می توانند بلافاصله راز را بخوانند. بدیهی است اگر اطلاعات حساسی مانند گذرواژه را ارسال کنید ، که ممکن است کسی در حال مشاهده ان باشد، میتواند مشکل آفرین باشد.
رمزگذاری (Encrypting) یک رشته به معنای: “پیچیده کردن خواندن است به طوری که بدون رمزگشایی خواندن آن ممکن نباشد.” به این ترتیب ، حتی اگر کسی در حال شنود باشد ، و حتی اگر پیام شما را رهگیری کند ، تا زمانی که آن را unscramble کنند، خوانده نشده باقی خواهد ماند. برای توضیح مثال بالا ، رشته “vjku ku oa uwrgt ugetgv uvtkpi” را ببینید که مفهوم آن تقریبا مشخص نیست.
رمزگذاری سزار یکی از راه های رمزگشایی رشته ای به این شکل است. برای رمزگذاری با رمز سزار ، یک کلید ، n ، بین 1 تا 24 انتخاب می کنیم و هر حرف در رشته اصلی را با یکی از حروف n تا انتهای الفبا جایگزین می کنیم.
بنابراین ، اگر کلید 2 را انتخاب کنیم ، a می شود c؛ b می شود d؛ c می شود e؛ و به همین ترتیب.
تعویض حروف مثل این رشته اصلی را تقریبا غیر قابل خواندن میکند. اما ، ما با تغییر حروف رمزگشایی کردیم. بنابراین ، تنها کاری که باید برای رمزگشایی انجام دهید این است که آنها را به عقب برگردانید. اگر پیامی را دریافت کردید که می دانید با کلید 2 رمزگذاری شده بود، تنها کاری که باید برای رمزگشایی انجام دهید این است که حروف را دو فاصله برگردانید. بنابراین ، c می شود a؛ d می شود b؛ و غیره.
متأسفانه ، امروزه این یک شکل رمزنگاری قوی نیست ، زیرا شکستن آن بسیار آسان است. یک روش برای رمزگشایی هر رشته رمزگذاری شده با رمز سزار این است که فقط سعی کنید آن را با هر کلید ممکن رمزگشایی کنید. بالاخره یکی از نتایج صحیح خواهد بود. تمام کاری که باید انجام دهید این است که آرایه 24 خروجی را اسکن کنید تا خروجی که انگلیسی است را پیدا کنید. بقیه به اندازه رشته اصلی غیرقابل خواندن خواهند بود.
در زیر ، من از تابعی به نام tryAll استفاده می کنم ، که دقیقاً همین کار را انجام می دهد. یعنی: یک رشته رمزگذاری شده را میگیرد و آرایه ای از هر رمزگشایی احتمالی را برمی گرداند. یکی از این نتایج رشته ای است که ما می خواهیم. بنابراین ، این همیشه رمز را می شکند.
اسکن آرایه ای از 24 رمزگشایی احتمالی چالش برانگیز است. باید بتوانیم مواردی را که قطعاً نادرست هستند از بین ببریم.
در بخش filter ، تابعی را با نام isEnglish مشاهده خواهید کرد که فقط این کار را انجام می دهد. به طور خاص ، یک رشته را می خواند. حساب می کند که چه تعداد از 1000 کلمه رایج انگلیسی در آن رشته وجود دارند. و در صورت یافتن بیش از 3 کلمه در جمله ، رشته را در دسته انگلیسی طبقه بندی می کند. اگر رشته شامل کمتر از 3 کلمه از آن آرایه باشد ، آن را بیرون می اندازد.
البته که روش های پیچیده تری برای بررسی اینکه یک رشته انگلیسی است ، وجود دارد ، اما فعلا این روش کافی است.
پیاده سازی های tryAll و isEnglish مهم نیستند ، اما اگر کنجکاو هستید ، می توانید آنها را در این لینک پیدا کنید: tryAll / isEnglish
تبدیل آرایه ها با map
بازسازی حلقه for برای استفاده از forEach  مزایای این سبک را نشان میدهد. اما هنوز جایی برای بهبود نسخه به روز شده وجود دارد.
در مثال بالا ، ما در حال روزرسانی capitalizedStrings  در پاسخ به forEach هستیم. هیچ چیز ذاتا غلطی در این کار نیست. اما ، اجتناب از عوارض جانبی مانند آن در هر زمان ممکن دردسر زیادی دارد.
اگر مجبور نیستیم ساختارهای داده را که در دامنه دیگری قرار دارند ، بروزرسانی کنیم … احتمالاً بهتر است انجام ندهیم.
در این مورد خاص ، می خواستیم هر رشته موجود در strings  را به نسخه حروف بزرگ آن تبدیل کنیم. این یک مورد کاربرد بسیار متداول برای حلقه for است: همه چیز را در یک آرایه قرار میدهد. آن را به چیز دیگری تبدیل میکند؛ و نتایج را در یک مجموعه جدید جمع آوری میکند.
تبدیل هر عنصر در یک آرایه به عنصر جدید و جمع آوری نتایج ، نقشه برداری (mapping) نامیده می شود. جاوا اسکریپت یک عملکرد داخلی برای این مورد استفاده دارد که map نامیده میشود.
ما forEach  استفاده کردیم زیرا نیاز به مدیریت متغیر تکرار i را حذف می کند. لازم نیست که به صورت دستی در آرایه لیست بندی کنیم و بنابراین می توانیم روی منطقی که واقعاً مهم است متمرکز شویم.
به همین ترتیب ، ما از map استفاده می کنیم زیرا مقدار دهی اولیه یک آرایه خالی را کنار میگذارد و به سمت آن میرود. دقیقاً مثل forEach  که هر مکالمه برگشتی که کاری را برای هر مقدار رشته انجام می دهد ، میپذیرد، map نیز یک callback را قبول میکند که با هر مقدار رشته کاری انجام می دهد.
بیایید قبل از توضیح نهایی به یک نسخه نمایشی سریع بپردازیم. در این مثال ، من از تابعی برای ” رمزگذاری “مجموعه ای از پیام ها استفاده می کنم. می توانیم از حلقه for استفاده کنیم و می توانیم از forEach استفاده کنیم … اما با map بهتر است.
const caesar = require(‘../caesar’);

const key = 12;
const messages = [
‘arielle, are you there?’,
‘the ghost has killed the shell’,
‘the liziorati attack at dawn’
]

const encryptedMessages = messages.map(function (string) {
return caesar(string, key);
})

console.log(encryptedMessages);

توجه داشته باشید که در اینجا چه اتفاقی افتاده است.
• ما با یک آرایه messages به زبان انگلیسی ساده شروع می کنیم.
• از روش map روی messages برای رمزگذاری هر رشته با تابع سزار استفاده می کنیم و به طور خودکار نتیجه را در یک آرایه جدید ذخیره می کنیم.
پس از اجرای کد فوق ، encryptMessages به شکل زیر خواهد بود
[‘mduqxxq, mdq kag ftqdq?’, ‘ftq staef tme wuxxqp ftq etqxx’, ‘ftq xuluadmfu mffmow mf pmiz’].
این حالت سطح بسیار بالاتری از انتزاع را نسبت به حالت ورود دستی به آرایه فراهم میکند.
اکنون زمان خوبی برای اشاره به این نکته است که می توانیم از توابع آرایه ای برای بیان دقیق تر استفاده کنیم:
const caesar = require(‘../caesar’);

const key = 12;
const messages = [
‘arielle, are you there?’,
‘the ghost has killed the shell’,
‘the liziorati attack at dawn’
];

const encryptedMessages = messages.map(string => string.toUpperCase()):

console.log(encryptedMessages);

کنار گذاشتن موارد با filter
الگوی رایج دیگر استفاده از حلقه for برای پردازش موارد در یک آرایه است ، اما فقط برخی از آنها را خارج کنید/نگه دارید.
ما معمولاً با انجام بررسی if تصمیم می گیریم که چه مواردی را نگه داشته و کدام موارد را دور بیندازیم.
در JS خام ، ممکن است اینگونه باشد:
// Secret message! This was a string encrypted with a key between 1 and 24.
const encryptedMessage = ‘mduqxxq, mdq kag ftqdq?’];

// We can break this code by just decrypting with _every_ possible key.
const possibilities = tryAll(encryptedMessage);

// Most of these decryption attempts aren’t readable. Sad.
// We can speed up finding the ones that are probably junk with an if check
const likelyPossibilities = [];
possibilities.forEach(function (decryptionAttempt) {
// Keep the string if it looks like an English sentence
if (isEnglish(decryptionAttempt)) {
likelyPossibilities.push(decryptionAttempt);
}
})

ابتدا ، سعی می کنیم پیام رمزگذاری شده را با هر کلید ممکن رمزگشایی کنیم. این بدان معناست که با آرایه ای از 24 احتمال رو به رو هستیم.
در این حلقه ، هرکدام را آزمایش می کنیم تا ببینیم که آیا یک رشته انگلیسی است یا خیر. اگر چنین است ، آن را نگه میداریم. اگر نه ، آن را دور می اندازیم.
این به وضوح یک مورد کاربرد رایج است. بنابراین ، یک ساختار داخلی برای آن وجود دارد که filter نامیده میشود.
مانند map ، ما یک filter وارد می کنیم ، که آن هم هر رشته را دریافت می کند. تفاوت در این است که ، filter تنها در صورتی که callback حالت true را بازگرداند، موارد را در یک آرایه ذخیره می کند. بنابراین ، ما می توانیم موارد فوق را به صورت زیر بیان کنیم:
// Secret message! This was a string encrypted with a key between 1 and 24.
const encryptedMessage = ‘mduqxxq, mdq kag ftqdq?’];

// We can break this code by just decrypting with _every_ possible key.
const possibilities = tryAll(encryptedMessage);

// Most of these decryption attempts aren’t readable. Sad.
// We can speed up finding the ones that are probably junk with an if check
const likelyPossibilities = possibilities.filter(function (string) {
// If isEnglish(string) returns true, filter saves in the output array
return isEnglish(string);
})

از آنجا که این callback ، فقط isEnglish را فرامیخواند ، در واقع می توانیم آن را حتی به صورت دقیق تر بنویسیم ، مثل این:
// Secret message! This was a string encrypted with a key between 1 and 24.
const encryptedMessage = ‘mduqxxq, mdq kag ftqdq?’];

// We can break this code by just decrypting with _every_ possible key.
const possibilities = tryAll(encryptedMessage);

// Most of these decryption attempts aren’t readable. Sad.
// We can speed up finding the ones that are probably junk with an if check
const likelyPossibilities = possibilities.filter(isEnglish);

موارد را با reduce در کنار هم قرار دهید
تاکنون ، برای سه مورد استفاده معمولی حول آرایه ها ، انتزاعاتی را مشاهده کردیم:
forEach ، که به ما امکان می دهد مانند for ، حول یک آرایه بگردیم اما نیاز به مدیریت دستی متغیر تکرار i را حذف می کند. آرایه را فهرست میکند؛ و غیره.
map ، که به ما امکان می دهد هر عنصر یک آرایه را تغییر دهیم و نتایج را در یک آرایه جمع آوری کنیم
filter ، که به ما امکان می دهد عناصر یک آرایه را برای نگهداری انتخاب کنیم
مورد دیگر استفاده رایج این است که: تکرار حول یک آرایه برای جمع آوری عناصر آن در یک نتیجه واحد
نمونه اصلی این است که تعداد زیادی عدد را جمع می کند.
// prices of: (big) box of oreos, girl scout cookies, fidget spinner, gold-plated Arch linux magnet
const prices = [12, 19, 7, 209];

// variable to store our total prices in
let totalPrice = 0;
for (let i = 0; i < prices.length; i += 1) {
totalPrice += prices[i];
}

// Report our total prices: $247
console.log(`Your total is ${totalPrice}.`);

همانطور که مطمئنا حدس زده اید ، انتزاعی نیز برای این مورد وجود دارد: reduce .
بازسازی حلقه فوق با reduce اینگونه خواهد بود:
const prices = [12, 19, 7, 209];

prices.reduce(function (totalPrice, nextPrice) {
// totalPrice is the price so far
console.log(`Total price so far: ${totalPrice}`)
console.log(`Next price to add: ${nextPrice}`)

// update totalPrice by adding the next price
totalPrice += nextPrice

// return the total price, and start over again
return totalPrice
}, 0)
// ^ the second argument to `reduce` is the totalPrice to start with on the first iteration

مانند map و filter ، reduce نیز یک callback را میپذیرد ، که در هر عنصر آرایه اجرا می شود.
برخلاف map و filter ، پاسخی که برای reduce ارسال می کنیم دو آرگومان را می پذیرد: یک TotalPrice و یک NextPrice.
TotalPrice مانند total در مثال اول است: قیمتی است که ما با اضافه کردن تمام قیمتهایی که تاکنون دیده ایم ، به دست می آوریم.
nextPrice عددي است كه با انجام prices[i] در مثال اول به دست آورديم. آن map را بخاطر بیاورید و reduce بطور خودکار در آرایه برای ما فهرست بندی میکند و این مقدار را به صورت خودکار به تماس های برگشتی آنها منتقل میکند. reduce همان کار را انجام می دهد ، اما آن مقدار را به عنوان آرگومان دوم به callback آن منتقل می کند.
درست مانند map و reduce ، در هر تکرار ، ما باید مقدار مورد نظر خود را برای بازگشت در انتهای حلقه برگردانیم. یعنی ، TotalPrice.
در آخر ، توجه داشته باشید که آرگومان دیگری را بعد از callback به reduce وارد میکنیم. در این حالت ، 0 را وارد میکنیم. این عمل مشابه با خطی در مثال اول است، که const total = 0 قرار دادیم. این آرگومان دوم مقدار اولیه totalPrice است.
درک reduce سخت تر از map یا filter است ، بنابراین بیایید به مثال دیگری توجه کنیم.
در مثال قبلی ، ما برای جمع آوری آرایه ای از اعداد به صورت مجموع از reduce استفاده کردیم. اما reduce چند کاره است. ما می توانیم از آن استفاده کنیم تا یک آرایه را به یک نتیجه واحد تبدیل کنیم.
مثلا، می توانیم از آن برای ساختن یک رشته استفاده کنیم.
const courses = [‘Introduction to Programming’, ‘Algorithms & Data Structures’, ‘Discrete Math’];

const curriculum = courses.reduce(function (courseList, course) {
// add the name to the class, with a preceding newline and tab for indentation
return courseList += `\n\t${course}`;
}, ‘The Computer Science curriculum consists of:’);

console.log(curriculum);

این کد خروجی زیر را ایجاد می کند:
The Computer Science curriculum consists of:
Introduction to Programming
Algorithms & Data Structures
Discrete Math

بنا به دلایلی ، بیان تعداد بسیار زیادی مثال از استفاده از reduce برای ساختن رشته هایی مانند این را لازم نمی بینم ، اما این یک شیوه کاربردی معمول است.
باز هم ، reduce چند کاره است: می توانیم از آن استفاده کنیم تا یک آرایه را به هر نوع نتیجه “تک” تبدیل کنیم.
حتی اگر آن نتیجه واحد آرایه دیگری باشد.
آن را بررسی کنید:
const names = [‘arielle’, ‘jung’, ‘scheherazade’];

const titleCase = function (name) {
// uppercase first letter of name
const first = name[0];
const capitalizedFirst = first.toUpperCase();

// get rest of name
const rest = name.slice(1);

// create list with all letters of the name, including capitalized first letter
const letters = [capitalizedFirst].concat(rest);

// join letters, return result
return letters.join(”);
}

const titleCased = names.reduce(function (titleCasedNames, name) {
// title-case the next name
const titleCasedName = titleCase(name);

// add the title-cased name to a list
titleCasedNames.push(titleCasedName);

// return list of capitalizedNames
return titleCasedNames
}, [])
// ^ start with an empty list

console.log(titleCased);
// [“Arielle”, “Jung”, “Scheherazade”]

ما از reduce برای تبدیل لیستی از اسامی با حروف کوچک به لیستی از اسامی دارای عنوان استفاده کردیم.
پیش از این ، یک لیست از اعداد را به یک مجموع واحد و یک لیست از رشته ها را به یک رشته واحد تبدیل کرده بودیم. در اینجا ، یک لیست از نام ها را به یک لیست واحد از نام ها با حرف اول بزرگ تبدیل کردیم.
این کار همچنان مجاز است ، زیرا لیست واحد نام های title-cased هنوز یک نتیجه واحد است. فقط به یک مجموعه تبدیل شده نه یک نوع ابتدایی.
ممکن است در مورد آن مثال آخر چیزی را متوجه شده باشید: ما از reduce برای همان کارهایی استفاده کرده ایم که قبلا برای map استفاده کرده بودیم.
با این وجود ممکن است آشکار نباشد ، اما یک مسئله بزرگ است.
ممکن است حدس بزنید که می توانیم map را بر حسب reduce بنویسیم. حق با شماست.
const map = (list, mapFunction) => {
const output = list.reduce((transformedList, nextElement) => {
// use the mapFunction to transform the nextElement in the list
const transformedElement = mapFunction(nextElement);

// add transformedElement to our list of transformed elements
transformedList.push(transformedElement);

// return list of transformed elements
return transformedList;
}, [])
// ^ start with an empty list

return output;
}

می توانیم همان نتیجه فوق را با این کد به دست آوریم:
سلب مسئولیت (disclaimer) اجباری: اگر تا الان در حال اجرای map آماده تولید بودید، باید برخی از ویژگی ها را به این اجرا اضافه کنید. ما همه اینها را به خاطر عدم ابهام به خود شما واگذار خواهیم کرد.
اگر می توانیم برای اجرای map از reduce استفاده کنیم ، برای filter چگونه است؟
const filter = (list, predicate) => {
const output = list.reduce(function (filteredElements, nextElement) {
// only add `nextElement` if it passes our test
if (predicate(nextElement)) {
filteredElements.push(nextElement);
}

// return the list of filtered elements on each iteration
return filteredElements;
}, [])
})
}

اگر این مورد گیج کننده است، اشکالی ندارد. حتی برای توسعه دهندگان با تجربه تر هم یک ایده جدید است. اما ، ارزش این را دارد که با آن آشنا شوید: ما به این میزان بینش کم نیاز داریم تا بعداً transduction را درست درک کنیم.
… و ، به من اعتماد کنید ، transduction به تنهایی آنقدر جالب است که ارزش کار را دارد.
نتیجه
در این آموزش ، نحوه استفاده از map ، filter و reduce را برای نوشتن کد قابل خواندن یاد گرفتید.
البته که مشکلی در استفاده از for وجود ندارد. اما بالا بردن سطح انتزاع با این توابع ، نتایج فوری از لحاظ خوانایی و قابلیت حفظ آن را به ارمغان می آورد.
از اینجا ، می توانید روش های دیگر آرایه مانند flatten ،concat و flatMap را جستجو کنید.

 

از این لینک ها زیر می توانید آمورش های بیشتری برای لینوکس پیدا کنید :

استفاده از nsh برای دستورات از راه دور اوبونتو 18 –  میزبانی وب سایت با Caddy اوبونتو 18

تنظیم سرور ذخیره سازی آبجکت با استفاده از Minio در اوبونتو 18  –  ضبط و اشتراک گذاری ترمینال با Terminalizer اوبونتو

تنظیم مسیریابی شرطی و پاسخگو با React Router v4  –  ایجاد یک URL کوتاه کننده با Django و GraphQL

یک برنامه ردیابی سلامت را با React ،GraphQL و Okta –  ساخت برنامه چت زمان حقیقی React و GraphQL

به روزرسانی فیلترهای مرتب سازی Angular (زاویه ای) –  با استفاده از React ، Superagent و API اینستاگرام

نحوه ساختن یک برنامه جهانی با Nuxt.js و Django –  دکمه دانلود با ریزتعاملات با CSS ، anime.js و segment.js

نحوه اضافه کردن عکسهای پیشرفته در Node و Express  –  با Vue ،GraphQL و Apollo Client یک وبلاگ ساخت

یک برنامه SSR با روتر Preact ، Unistore و Preact بسازید  –  ساخت برنامه های وب پیشرونده با Angular

اشکال زدایی JavaScript در تولید با نقشه های منبع  –  می توان با Koa برنامه “سلام جهانی” ساخت

ساختن یک برنامه با Node ، React ، Okta  –   مدیریت حالت فرم در React با Redux Form

نحوه تنظیم Laravel ، Nginx و MySQL  –  ارتقاء از AngularJS به Angular با ngUpgrade

استفاده از ویژوال استودیو از راه دور  –  احراز هویت API با JSON Web Tokens و Passport

راه اندازی یک پروژه React با Parcel  –  ایجاد Swiper مانند Netflix را در Vue

ساختن یک ربات تلگرام با Laravel و BotMan  –  استفاده از map، filter، و reduce در جاوااسکریپت

چگونه می توان موتور جستجوی زمان واقعی را با Vue  –  ساختن سیستم مستندات (Documentation) با Vue و VuePress

استفاده از اشتراک زنده با کد ویژوال استودیو  –  ساخت یک مقیاس اندازه گیری قدرت رمز عبور را در React

شروع عملی GraphQL با Node.js و Express  –  ساخت یک برنامه آب و هوا در Django

نحوه نصب Discourse روی Ubuntu 18  –  تأیید رمز عبور با استفاده از درخواست فرم Laravel

نحوه نصب MySQL در CentOS 8  –  استفاده از پسوند PDO PHP برای انجام تراکنش MySQL

نصب و پیکربندی SNMP Daemon و Client در Ubuntu 18  –  نصب Linux، Nginx، MariaDB،PHP در Debian 10

 

 

کلمات کلیدی خرید سرور

خرید vps – خرید سرور مجازی – خرید سرور – سرور هلند – فروش vps – سرور مجازی آمریکا – خریدvps – سرور مجازی هلند – فروش سرور مجازی – سرور آمریکا – vps – سرور مجازی انگلیس – سرور مجازی آلمان – سرور مجازی کانادا – خرید vps آمریکا – خرید وی پی اس – سرور – خرید سرور مجازی هلند – vps خرید – سرور مجازی فرانسه – سرور مجازی هلند – خرید vps آمریکاخرید سرور مجازی ارزان هلندvpsخرید vps هلندخرید سرور مجازی آمریکاخرید vps فرانسهتست vpsسرور مجازی تستسرور مجازی ویندوزارزانترین vpsخرید وی پی اسvps ارزان – 


https://vpsgol.net/product/vps-germany/

https://vpsgol.net/product/vps-usa/

https://vpsgol.net/product/vps-france/

https://vpsgol.net/product/vps-canada/

https://vpsgol.net/product/vps-poland/

https://vpsgol.net/product/vps-netherlands/

https://vpsgol.net/product/vps-england/