نسخه 20.16 LTS مربوط به #NodeJS خیلی وقته اومده و خب چون مدتی فعال نبودیم. از دست ما در رفته نگاهی بهش بندازیم.
یک فانکشن کمکی به این نسخه اضافه شده و از این زاویه جالب هست که یک حرکت eco system رو نشون میده که برای ما developer ها در در طولانی مدت میتونه خوب باشه. این که در آینده کدهای بیشتری ببینیم که به runtime خاصی وابسته نباشن و فریم ورک های جدید تر روی هر runtime به صورت native اجرا بشه.
فانکشن کمکی جدید process.getBuiltinModule
این فانکشن به ما کمک میکنه که در runtime هر ماژولی رو از std مربوط به #NodeJS به راحتی import کنیم. حالا سوال پیش میاد که چرا از خود ES import استفاده نمیکنیم. به این دلیل که اگر یک کد داشته باشیم که به #Deno وابستگی داره حالا اگر بخواهیم اون کد رو با #NodeJS ران کنیم بره و از std مربوط به Node استفاده کنه و نه Deno. بزارید با مثال این رو ببینیم. نمونه ای خوب و ساده از Factory pattern و Polymorphism هم میشه دید. اگر تازه کارتر هستید و در حال یادگیری به این مثال بیشتر دقت کنید خیلی بهتون کمک خواهد کرد.
هدف خوندن یک فایل از روی disk هست و البته که این کد برای runtime های #Deno و #NodeJS از Native API مربوط به هر runtime استفاده کنه. باتوجه به این که این runtime ها هرکدوم دنیای خودشون رو دارن و API های خاص خودشون. اول باید یک API مشترک برای این دوتا بسازیم که بتونیم به هدفمون برسیم. اینجا Factory pattern به کمک ما میاد که بهمون اجازه میده با استفاده از type switch تصمیم بگیریم که روی کدام runtime هستیم و با توجه به اون runtime کلاس reader مربوط بهش رو بهمون میده و البته با استفاده از Duck typing در #JavaScript یا با استفاده از interface ها در #TypeScript یک interface یکسان برای خواندن فایل با دو implemetion متفاوت باید ایجاد کنیم که در بالا معادل NodeReader و DenoReader هست که readFile میشه interface یکسان بین این دو.
نکته قابل توجه این که چون اینجا مشخص نیست کدوم runtime رو قراره استفاده کنیم، استفاده از top-level import به صورت کلی کنسل هست به این دلیل که اگر کد زیر بزاریم و برنامه با Deno ران کنیم کلا هدفمون میره تو دیوار.
یک سوال دیگ که پیش میاد دقیقا همین ویژگی رو ما میتونیم با استفاده از dynamic import داشته باشیم چرا از اون استفاده نکنیم؟ در جواب این موضوع مشکل خیلی خاصی به وجود نمیاد. مزیت این روش نسبت به dynamic import این هست که این روش به صورت sync فرایند import رو انجام میده درصورتی که حاصل dynamic imprort یک Promise هست که اگر ESM باشید با top-level await میتونید تمیز حلش کنید. اما اگر روی CJS باشید کثیف کاری خواهید داشت در نتیجه در این سناریو این روش جدید منطقی تر به نظر میرسه.
قبلا هم درمورد Duck typing مفصل صحبت کرده بودیم که اینجا میتونید ببینید اگر دوست داشتید.
https://t.me/NodeMaster/136
یک فانکشن کمکی به این نسخه اضافه شده و از این زاویه جالب هست که یک حرکت eco system رو نشون میده که برای ما developer ها در در طولانی مدت میتونه خوب باشه. این که در آینده کدهای بیشتری ببینیم که به runtime خاصی وابسته نباشن و فریم ورک های جدید تر روی هر runtime به صورت native اجرا بشه.
فانکشن کمکی جدید process.getBuiltinModule
این فانکشن به ما کمک میکنه که در runtime هر ماژولی رو از std مربوط به #NodeJS به راحتی import کنیم. حالا سوال پیش میاد که چرا از خود ES import استفاده نمیکنیم. به این دلیل که اگر یک کد داشته باشیم که به #Deno وابستگی داره حالا اگر بخواهیم اون کد رو با #NodeJS ران کنیم بره و از std مربوط به Node استفاده کنه و نه Deno. بزارید با مثال این رو ببینیم. نمونه ای خوب و ساده از Factory pattern و Polymorphism هم میشه دید. اگر تازه کارتر هستید و در حال یادگیری به این مثال بیشتر دقت کنید خیلی بهتون کمک خواهد کرد.
class DenoReader {
constructor() {
this.decoder = new TextDecoder();
}
readFile(fileName) {
const byteArray = Deno.readFileSync(fileName);
const result = this.decoder.decode(byteArray);
return result;
}
}
class NodeReader {
constructor() {
this.fs = globalThis.process.getBuiltinModule("fs");
}
readFile(fileName) {
const result = this.fs.readFileSync(fileName).toString("utf-8");
return result;
}
}
function getReader() {
switch (true) {
case globalThis.Deno !== undefined:
return new DenoReader();
case globalThis.process.getBuiltinModule !== undefined:
return new NodeReader();
default:
throw new Error("No Reader available");
}
}
const nodeReader = getReader();
const nodeResult = nodeReader.readFile("my-text.txt");
console.log(nodeResult);
هدف خوندن یک فایل از روی disk هست و البته که این کد برای runtime های #Deno و #NodeJS از Native API مربوط به هر runtime استفاده کنه. باتوجه به این که این runtime ها هرکدوم دنیای خودشون رو دارن و API های خاص خودشون. اول باید یک API مشترک برای این دوتا بسازیم که بتونیم به هدفمون برسیم. اینجا Factory pattern به کمک ما میاد که بهمون اجازه میده با استفاده از type switch تصمیم بگیریم که روی کدام runtime هستیم و با توجه به اون runtime کلاس reader مربوط بهش رو بهمون میده و البته با استفاده از Duck typing در #JavaScript یا با استفاده از interface ها در #TypeScript یک interface یکسان برای خواندن فایل با دو implemetion متفاوت باید ایجاد کنیم که در بالا معادل NodeReader و DenoReader هست که readFile میشه interface یکسان بین این دو.
نکته قابل توجه این که چون اینجا مشخص نیست کدوم runtime رو قراره استفاده کنیم، استفاده از top-level import به صورت کلی کنسل هست به این دلیل که اگر کد زیر بزاریم و برنامه با Deno ران کنیم کلا هدفمون میره تو دیوار.
import fs from "node:fs";
یک سوال دیگ که پیش میاد دقیقا همین ویژگی رو ما میتونیم با استفاده از dynamic import داشته باشیم چرا از اون استفاده نکنیم؟ در جواب این موضوع مشکل خیلی خاصی به وجود نمیاد. مزیت این روش نسبت به dynamic import این هست که این روش به صورت sync فرایند import رو انجام میده درصورتی که حاصل dynamic imprort یک Promise هست که اگر ESM باشید با top-level await میتونید تمیز حلش کنید. اما اگر روی CJS باشید کثیف کاری خواهید داشت در نتیجه در این سناریو این روش جدید منطقی تر به نظر میرسه.
قبلا هم درمورد Duck typing مفصل صحبت کرده بودیم که اینجا میتونید ببینید اگر دوست داشتید.
https://t.me/NodeMaster/136
Telegram
Node Master
برای درک مفهوم Duck Test و کلا Duck Typing میتونیم با این مثال درمورد Promise ها نکاتی یاد بگیریم. فرض کنید فانکشنی داریم که یک Promise رو میگیره و حالا یک کاری انجام میده.
function doWork(promise) {
promise.then(() => {
console.log("Work Is Done");…
function doWork(promise) {
promise.then(() => {
console.log("Work Is Done");…
درود و وقت بخیر دوستان.
یکی از نکاتی که خیلی میتونه بهتون کمک کنه به عنوان Backend developer دانش شبکه هست.
متاسفانه اکثر دوره های شبکه برای بچه های Developer ممکنه یکم درکشون سخت باشه چون از زاویه Network engineering بهشون نگاه میشه و نه development.
در نهایت دوره های شبکه رو هم حداقل پایه ای رو باید گذروند اما چند روز پیش این دوره کوتاه ( ۲ ساعته ) رو دیدم و به نظرم مفاهیم شبکه رو در حد خوبی با زبانی که برای developer ها ساده باشه و پایه خوبی باشه برای دوره هایی مثل Network+ میتونید ببینید.
https://downloadly.ir/elearning/video-tutorials/introduction-to-computer-networking-2-hour-crash-course/
البته نسخه که داخل یودمی هست یکم آپدیت شده و ابن نسخه دانلودلی ناقص تر هست ولی همین رو هم ببینید خوبه.
امیدوارم موفق باشید
یکی از نکاتی که خیلی میتونه بهتون کمک کنه به عنوان Backend developer دانش شبکه هست.
متاسفانه اکثر دوره های شبکه برای بچه های Developer ممکنه یکم درکشون سخت باشه چون از زاویه Network engineering بهشون نگاه میشه و نه development.
در نهایت دوره های شبکه رو هم حداقل پایه ای رو باید گذروند اما چند روز پیش این دوره کوتاه ( ۲ ساعته ) رو دیدم و به نظرم مفاهیم شبکه رو در حد خوبی با زبانی که برای developer ها ساده باشه و پایه خوبی باشه برای دوره هایی مثل Network+ میتونید ببینید.
https://downloadly.ir/elearning/video-tutorials/introduction-to-computer-networking-2-hour-crash-course/
البته نسخه که داخل یودمی هست یکم آپدیت شده و ابن نسخه دانلودلی ناقص تر هست ولی همین رو هم ببینید خوبه.
امیدوارم موفق باشید
دانلود رایگان نرم افزار
دانلود Introduction to Computer Networking - 2 Hour Crash Course - دانلود رایگان نرم افزار
دانلود Udemy - Introduction to Computer Networking - 2 Hour Crash Course 2022-5 - دوره آموزش مقدمه ای بر شبکه های کامپیوتری
چند روزی هست که #Deno نسخه 1.46 منتشر شده.
از نکات جالبی که اضافه شده
این flag یکجورایی شبیه به cluster در #NodeJS عمل میکنه. البته اگر درموردش مطالعه کنید تفاوت هایی هست.
- آپدیت بعدی مربوط به deno fmt هست که فرمت های مختلف مثل html css ,scss, yml و ... رو هم انجام میده.
- یکی از تغیرات مهم دیگ پایدار شدن std مربوط به #Deno هست. نکته جالب در این مورد این هست که این std ها رو شما میتونید روی پروژه های #NodeJS خودتون هم استفاده کنید.
و از همه مهتر Deno 2 خیلی نزدیک هست و این آپدیت یعنی نسخه 1.46 آخرین آپدیت نسخه 1.X میباشد.
https://deno.com/blog/v1.46
از نکات جالبی که اضافه شده
deno serve --parallel
این flag یکجورایی شبیه به cluster در #NodeJS عمل میکنه. البته اگر درموردش مطالعه کنید تفاوت هایی هست.
- آپدیت بعدی مربوط به deno fmt هست که فرمت های مختلف مثل html css ,scss, yml و ... رو هم انجام میده.
- یکی از تغیرات مهم دیگ پایدار شدن std مربوط به #Deno هست. نکته جالب در این مورد این هست که این std ها رو شما میتونید روی پروژه های #NodeJS خودتون هم استفاده کنید.
و از همه مهتر Deno 2 خیلی نزدیک هست و این آپدیت یعنی نسخه 1.46 آخرین آپدیت نسخه 1.X میباشد.
https://deno.com/blog/v1.46
Deno Blog
Deno 1.46: The Last 1.x Release
Our last 1.x release before Deno 2 comes with a ton of features, ranging from a simpler, improved CLI, to multi-threaded web servers, improvements to Node.js/npm compatibility, and more.
چندین بار سعی کردم با معماری #Microservice دقیق تر آشنا بشم ولی همیشه به دلیل پیچیده بودن pattern ها لینک کردن بین مطالب زیاد موفق نبود و البته یکی از منابع خوبی که برای عمیق شدن وجود داره کتاب Building Microservices Book by Sam Newman هست.
امروز این دوره 2 ساعته رو نگاه کردم. به صورت خیلی Big picture درمورد #Microservice صحبت میکنه و البته بعضی مفاهیم هم با code snippet های خیلی ساده #NodeJS و #Express توضیح میده. پیشنهاد میکنم اگر قصد دارید #Microservice عمیق تر بشید و اگر مثل من زیاد در این مورد نمیدونید اول این دوره رو نگاه کنید و بعد مفاهیم و نکات این دوره رو هرکدوم به عنوان یک سرفصل یا سرتیتر برای مطالعه بیشتر و عمیق تر شدن استفاده کنید. به نظرم مقدمه خوبی هست قبل از مطالعه کتابی که بالاتر گفتم.
https://downloadly.ir/elearning/video-tutorials/node-js-microservices-the-big-picture/
#course
امروز این دوره 2 ساعته رو نگاه کردم. به صورت خیلی Big picture درمورد #Microservice صحبت میکنه و البته بعضی مفاهیم هم با code snippet های خیلی ساده #NodeJS و #Express توضیح میده. پیشنهاد میکنم اگر قصد دارید #Microservice عمیق تر بشید و اگر مثل من زیاد در این مورد نمیدونید اول این دوره رو نگاه کنید و بعد مفاهیم و نکات این دوره رو هرکدوم به عنوان یک سرفصل یا سرتیتر برای مطالعه بیشتر و عمیق تر شدن استفاده کنید. به نظرم مقدمه خوبی هست قبل از مطالعه کتابی که بالاتر گفتم.
https://downloadly.ir/elearning/video-tutorials/node-js-microservices-the-big-picture/
#course
دانلود رایگان نرم افزار
دانلود Pluralsight - Node.js Microservices: The Big Picture 2023-10 - دانلود رایگان نرم افزار
دانلود Pluralsight - Node.js Microservices: The Big Picture 2023-10 - دوره آموزش میکروسرویس ها در Node.js: نمای کلی
یکی از نکات زیبا که درمورد #Deno و #JSR که وجود داره این هست که شما میتونید از پکیج های std دینو در #NodeJS استفاده کنید. همشون نه ولی به اکثرشون دسترسی دارید. به لینک زیر یک نگاهی بندازید و مشخصا میبینید که کدوم پکیج ها رو میتونید در پروژه #NodeJS خودتون استفاده کنید.
https://jsr.io/@std
به عنوان مثال پکیج @std/msgpack به پروژه خودمون اضافه میکنیم.
و بعد کد زیر رو با #NodeJS اجرا کنید.
حالا سوال پیش میاد که اصلا چرا همچین کاری باید کنیم. باتوجه به این که #JavaScript خودش std بزرگی مثل #Python یا #Java نداره گاهی اوقات نیاز به یک سری کدهای کمکی برای پروژه خودتون دارید و پکیج هایی مثل Lodash, es-toolkit کمک بزرگی کردن. اما حالا #Deno هم با این کار به اکوسیستم کمک بزرگی کرده و یک رنج از ابزار های کمکی که ممکنه در loadash و بقیه شبیهه بهش پیدا نکنید رو شاید اینجا پیدا کنید.
به عنوان مثال اگر پروژه کوچیکی دارید که فقط یک instance از server شما وجود داره استفاده از ابزاری مثل #Redis صرفا برای Cache زیاد منطقی نیست و خب در اکثرا اوقات یک Map ساده مشکل شما رو میتونه حل کنه. اگر ویژگی TTL هم بخواید داشته باشید خودتون میتونید پیاده سازی کنید با کمک Map ولی معمولا از پکیج node-cache در این سناریو استفاده میکنن. حالا یک گزینه دیگ داریم که مربوط به #Deno std هست.
https://jsr.io/@std/cache
این پکیج جدا از مثال بالا مدل های مختلف دیگ از cache رو در اختیار شما میزاره که نگاهی بندازید و جالبه.
https://jsr.io/@std
به عنوان مثال پکیج @std/msgpack به پروژه خودمون اضافه میکنیم.
npx jsr add @std/msgpack
و بعد کد زیر رو با #NodeJS اجرا کنید.
import * as msgpack from "@std/msgpack";
const data = { name: "node-master" };
const enc = msgpack.encode(data);
const dec = msgpack.decode(enc);
console.log(dec);
حالا سوال پیش میاد که اصلا چرا همچین کاری باید کنیم. باتوجه به این که #JavaScript خودش std بزرگی مثل #Python یا #Java نداره گاهی اوقات نیاز به یک سری کدهای کمکی برای پروژه خودتون دارید و پکیج هایی مثل Lodash, es-toolkit کمک بزرگی کردن. اما حالا #Deno هم با این کار به اکوسیستم کمک بزرگی کرده و یک رنج از ابزار های کمکی که ممکنه در loadash و بقیه شبیهه بهش پیدا نکنید رو شاید اینجا پیدا کنید.
به عنوان مثال اگر پروژه کوچیکی دارید که فقط یک instance از server شما وجود داره استفاده از ابزاری مثل #Redis صرفا برای Cache زیاد منطقی نیست و خب در اکثرا اوقات یک Map ساده مشکل شما رو میتونه حل کنه. اگر ویژگی TTL هم بخواید داشته باشید خودتون میتونید پیاده سازی کنید با کمک Map ولی معمولا از پکیج node-cache در این سناریو استفاده میکنن. حالا یک گزینه دیگ داریم که مربوط به #Deno std هست.
https://jsr.io/@std/cache
این پکیج جدا از مثال بالا مدل های مختلف دیگ از cache رو در اختیار شما میزاره که نگاهی بندازید و جالبه.
jsr.io
@std - JSR
@std on JSR
بلاخره بعد از سال ها نسخه 5 برای #Express منتشر شده میتونید تغییرات رو از اینجا ببینید و تستش کنید.
https://github.com/expressjs/express/releases/tag/v5.0.0
کلا این روزا اگر پروژه ای دارید به نظر من از هرچیزی جز #Express استفاده کنید به نظر من بهتره
https://github.com/expressjs/express/releases/tag/v5.0.0
کلا این روزا اگر پروژه ای دارید به نظر من از هرچیزی جز #Express استفاده کنید به نظر من بهتره
GitHub
Release 5.0.0 · expressjs/express
Express v5.0.0
🎉 Express v5 is finally here! 🎉
After years of development, the long-awaited Express v5 has been officially released. This version focuses on simplifying the codebase, improving secu...
🎉 Express v5 is finally here! 🎉
After years of development, the long-awaited Express v5 has been officially released. This version focuses on simplifying the codebase, improving secu...
وقتی در حال توسعه با #NodeJS هستید یکی از مشکلاتی که در حال حاظر وجود داره استفاده از #TypeScript در هنگام توسعه میباشد. باتوجه به آپدیت های اخیر #NodeJS حرکت هایی جهت پشتیبانی راحت #TypeScript در #NodeJS با اضافه کردن فلگ های --experimental-transform-types و --experimental-strip-types تغییراتی داشته ولی همچنان تا Production ready بودن خیلی فاصله داره. گزینه های که میتونه بهتون در این مورد کمک کنه استفاده از ts-node و tsx هست.
در یک سال گذشته شخصا از هردو در پروژه های مختلف استفاده کردم. با توجه به آزمون و خطایی که من کردم در حال حاظر tsx خیلی خیلی بهتر از ts-node هست و کارتون رو به خوبی راه میندازه.
https://tsx.is/
در یک سال گذشته شخصا از هردو در پروژه های مختلف استفاده کردم. با توجه به آزمون و خطایی که من کردم در حال حاظر tsx خیلی خیلی بهتر از ts-node هست و کارتون رو به خوبی راه میندازه.
https://tsx.is/
tsx
tsx (TypeScript Execute) - The easiest way to run TypeScript in Node.js
یکی از کسایی که در کامینیوتی #NodeJS میتونید خیلی چیزا ازش یاد بگیرید Matteo Collina سازنده فریم ورک #Fastify و کلی ابزار Open source دیگ برای #NodeJs .
تا حالا چندین ویدیو از ایشون دیدم و خیلی نکات ریزی رو یاد گرفتم که اگر خودم بخوام به اون ها برسم رسما سال ها زمان میبره.
پیشنهاد میکنم این ویدیو رو حتما ببینید.
- نکته جالبی که در این ویدیو برای من بود عمق فریم ورک #Fastify بود که به برای ریز ترین مشکلات هم یک راه حلی وجود داره.
- من شخصا با #Jest به شدت مشکل دارم و در این ویدیو یک دلیل بسیار بسیار ترسناک و بزرگ رو اشاره میکنه که این مشکل رو به تنفر نسبت به #Jest تبدیل کرد.
https://www.youtube.com/watch?v=HyOuKN6KYqo
تا حالا چندین ویدیو از ایشون دیدم و خیلی نکات ریزی رو یاد گرفتم که اگر خودم بخوام به اون ها برسم رسما سال ها زمان میبره.
پیشنهاد میکنم این ویدیو رو حتما ببینید.
- نکته جالبی که در این ویدیو برای من بود عمق فریم ورک #Fastify بود که به برای ریز ترین مشکلات هم یک راه حلی وجود داره.
- من شخصا با #Jest به شدت مشکل دارم و در این ویدیو یک دلیل بسیار بسیار ترسناک و بزرگ رو اشاره میکنه که این مشکل رو به تنفر نسبت به #Jest تبدیل کرد.
https://www.youtube.com/watch?v=HyOuKN6KYqo
YouTube
Masterclass | Mastering Node.js Backends
Have you ever struggled with designing and structuring your Node.js applications?
Building applications that are well-organized, testable and extendable, while also remaining simple, is not always easy.
In this live event, Matteo Collina, Co-Founder and…
Building applications that are well-organized, testable and extendable, while also remaining simple, is not always easy.
In this live event, Matteo Collina, Co-Founder and…
مدت زیادی هست که #Redis Stack منتشر شده ولی هنوز خیلی ها به Redis به چشم یک دیتابیس Key-Value ساده نگاه میکنند و از 90 درصد قابلیت هاش استفاده نمیکنند. پیشنهاد میکنم داکیومنت مربوط بهش رو حتما بخونیدتا تمام ویژگی هایی رو که داره ببینید.
دوتا از ویژگی های خوبی که Redis Stack داره به اسم Redis Search و Redis JSON هست.
- تا قبل از Redis JSON برای ذخیره کردن JSON ها در Redis، معادل Serialize شده رو به صورت Key-Value ذخیره میکردن و یا گاهی به صورت Map باهاش رفتار میکردن. حالا شما با Redis JSON میتونید مثل یک document oriented database مثل MongoDB رفتار کنید. ( البته Query ها به صورت پیش فرض محدودیت هایی دارند )
- تا قبل از Redis Search برای سرچ کردن تنها گزینه موجود استفاده از Glob Pattern ها بود که حتی داخل خود داکیومنت هم پیشنهاد کرده بودن که اگر روی Production هستید سعی کنید زیاد استفاده از Glob pattern نکنید. و این موضوع با در نظر گرفتن این نکته که Redis به صورت ذاتی Single thread هست و Event loop رو با این کار در حجم زیاد دیتا بلاک میکنید منطقی هست. البته این موضوع برای دوستان #JavaScript و #NodeJS کاملا به صورت واضح قابل درک هست. حالا شما با استفاده از Redis Search میتونید روی دیتا مورد نظرتون Index بزارید و باتوجه به اون Index و Schema که تعریف کردین Query بزنید و دیتا رو خیلی سریع و تمیز دریافت کنید. انتظار قدرت SQL و بقیه دیتابیس ها مثل MongoDB رو نداشته باشید ولی در بعضی سناریو ها واقعا ترکیب Redis Json و Redis Search میدرخشه.
در این مثال با نحوه کار کردن با Redis JSON آشنا میشیم و در پست بعدی با Redis Search یک خورده کار میکنیم.
به صورت کلی شما با استفاده از "JSON" میتونید دسترسی به namespace مربوط بهش رو داشته باشید و با json ها کار کنید.
- ایجاد یک Json doc جدید
با استفاده از JSON.SET میتونید JSON به راحتی ذخیره کنید. در اینجا key منظور از همون کلید عادی هست نکته خاصی نداره ( در Redis Search درموردش بیشتر صحبت میکنیم ). منظور از Path اینجا مسیر JsonPath هست که با استفاده از اون میتونید فیلتر های مختلف روی دیتا Json بزارید و بخش خاصی رو فقط بخونید یا آپدیت کنید ( معادل Xpath برای داده های XML ). برای این که بتونیم یک دیتا json ذخیره کنیم خب ما میخوایم در مسیر Root این کلید ذخیره کنیم و با استفاده از "$" مشخص میکنیم که میخوایم روی Root ذخیره کنیم.
حالا اگر بخوام فقط بخش name رو بخونم از این به این صورت عمل میکنم.
یا اگر بخوام شهر رو آپدیت کنم به تهران.
حالا اگر بخوایم کل دیتا بخونیم و نتیجه رو ببینیم.
یک نکته خیلی مهم و ریز درمورد آپدیت بگم. جایی که دیتا رو قرار میدیم یعنی '"Tehran"' هر مدل دیتایی میخواد باشه مثل اینجا که یک string ساده هست. باید یک parser مربوط به JSON بتونه به صورت Valid این دیتا رو Serialize کنه. به عنوان مثال یعنی عبارت زیر در #JavaScript باید بدون هیچ خطایی کار کنه.
در صورتی که JSON.stringify به شما خروجی داد شما اون دیتا رو میتونید به عنوان value استفاده کنید.
حالا برا این که مثال رو یکم جالب تر کنیم یک Json دیگ رو داخل این Embed میکنیم.
در پست بعدی به Redis Search نگاه میندازیم و اگر انرژی هم موند یکی از مهم ترین و اساسی ترین نکات Redis که دونستنش میتونه مثل مرگ و زندگی باشه یعنی Atomicity رو برسی میکنیم.
امیدوارم موفق باشید.
دوتا از ویژگی های خوبی که Redis Stack داره به اسم Redis Search و Redis JSON هست.
- تا قبل از Redis JSON برای ذخیره کردن JSON ها در Redis، معادل Serialize شده رو به صورت Key-Value ذخیره میکردن و یا گاهی به صورت Map باهاش رفتار میکردن. حالا شما با Redis JSON میتونید مثل یک document oriented database مثل MongoDB رفتار کنید. ( البته Query ها به صورت پیش فرض محدودیت هایی دارند )
- تا قبل از Redis Search برای سرچ کردن تنها گزینه موجود استفاده از Glob Pattern ها بود که حتی داخل خود داکیومنت هم پیشنهاد کرده بودن که اگر روی Production هستید سعی کنید زیاد استفاده از Glob pattern نکنید. و این موضوع با در نظر گرفتن این نکته که Redis به صورت ذاتی Single thread هست و Event loop رو با این کار در حجم زیاد دیتا بلاک میکنید منطقی هست. البته این موضوع برای دوستان #JavaScript و #NodeJS کاملا به صورت واضح قابل درک هست. حالا شما با استفاده از Redis Search میتونید روی دیتا مورد نظرتون Index بزارید و باتوجه به اون Index و Schema که تعریف کردین Query بزنید و دیتا رو خیلی سریع و تمیز دریافت کنید. انتظار قدرت SQL و بقیه دیتابیس ها مثل MongoDB رو نداشته باشید ولی در بعضی سناریو ها واقعا ترکیب Redis Json و Redis Search میدرخشه.
در این مثال با نحوه کار کردن با Redis JSON آشنا میشیم و در پست بعدی با Redis Search یک خورده کار میکنیم.
به صورت کلی شما با استفاده از "JSON" میتونید دسترسی به namespace مربوط بهش رو داشته باشید و با json ها کار کنید.
- ایجاد یک Json doc جدید
JSON.SET key path value
با استفاده از JSON.SET میتونید JSON به راحتی ذخیره کنید. در اینجا key منظور از همون کلید عادی هست نکته خاصی نداره ( در Redis Search درموردش بیشتر صحبت میکنیم ). منظور از Path اینجا مسیر JsonPath هست که با استفاده از اون میتونید فیلتر های مختلف روی دیتا Json بزارید و بخش خاصی رو فقط بخونید یا آپدیت کنید ( معادل Xpath برای داده های XML ). برای این که بتونیم یک دیتا json ذخیره کنیم خب ما میخوایم در مسیر Root این کلید ذخیره کنیم و با استفاده از "$" مشخص میکنیم که میخوایم روی Root ذخیره کنیم.
JSON.SET user:1 $ '{"name": "Iman", "age": 25, "city": "Bushehr"}'
حالا اگر بخوام فقط بخش name رو بخونم از این به این صورت عمل میکنم.
JSON.GET user:1 "name"
یا اگر بخوام شهر رو آپدیت کنم به تهران.
JSON.SET user:1 $.city '"Tehran"'
حالا اگر بخوایم کل دیتا بخونیم و نتیجه رو ببینیم.
JSON.GET user:1
یک نکته خیلی مهم و ریز درمورد آپدیت بگم. جایی که دیتا رو قرار میدیم یعنی '"Tehran"' هر مدل دیتایی میخواد باشه مثل اینجا که یک string ساده هست. باید یک parser مربوط به JSON بتونه به صورت Valid این دیتا رو Serialize کنه. به عنوان مثال یعنی عبارت زیر در #JavaScript باید بدون هیچ خطایی کار کنه.
> JSON.stringify("Tehran")
'"Tehran"'
در صورتی که JSON.stringify به شما خروجی داد شما اون دیتا رو میتونید به عنوان value استفاده کنید.
حالا برا این که مثال رو یکم جالب تر کنیم یک Json دیگ رو داخل این Embed میکنیم.
JSON.SET user:1 $.address '{"zipCode":1234}'
JSON.GET user:1 $.address.zipCode
در پست بعدی به Redis Search نگاه میندازیم و اگر انرژی هم موند یکی از مهم ترین و اساسی ترین نکات Redis که دونستنش میتونه مثل مرگ و زندگی باشه یعنی Atomicity رو برسی میکنیم.
امیدوارم موفق باشید.
Node Master
مدت زیادی هست که #Redis Stack منتشر شده ولی هنوز خیلی ها به Redis به چشم یک دیتابیس Key-Value ساده نگاه میکنند و از 90 درصد قابلیت هاش استفاده نمیکنند. پیشنهاد میکنم داکیومنت مربوط بهش رو حتما بخونیدتا تمام ویژگی هایی رو که داره ببینید. دوتا از ویژگی های خوبی…
در پست قبلی درمورد #Redis JSON برای ذخیره کردن Document ها و Query های مربوط به این بخش آشنا شدیم. امروز نگاهی به Redis Search میندازیم و ترکیبش رو با Redis JSON برسی میکنیم.
اولین نکته این که شما توانایی index کردن HASH ها و JSON ها رو دارید. یعنی اگر پروژتون الان روی HASH هست بدون هیچ دردسری میتونید از Query های Redis Search استفاده کنید. برای پست امروز با Redis JSON کار میکنیم باتوجه به این که مطالعه کوچیکی درموردشون داشتیم. اولین کاری که میکنیم #Redis رو با دیتا فیک Seed میکنیم.
درمورد کار کردن با JSON در پست قبلی توضیح دادیم. مرحله بعدی این هست که Index و Schema مناسب برای این دیتا ایجاد کنیم که بتونیم Query بزنیم.
به FT.CREATE ما میتونیم ایندکس جدید ایجاد کنیم. این کامند بسیار آپشن های زیادی داره و پیشنهاد میکنم حتما داکیومنت مربوط بهش رو بخونید به عنوان مثال میتونید بعضی از Field ها که نیاز ندارید داخل Index قرار ندین ولی توی Schema شما وجود داشته باشه. برای امروز ما سعی میکنیم تا حد ممکن مثال رو ساده نگه داریم.
- بخش اول یعنی idx:user اسم ایندکس یا به قولی Schema ما هست. اگر میخواید ببینید چه Index هایی دارید میتونید از FT._LIST استفاده کنید.
- بخش دوم یعنی ON JSON تعریف میکنید که دیتا JSON هست و اینجا میتونید HASH هم بزارید.
- بخش سوم که برای Performance مهم هست این هست که محدودیت Index ایجاد میکنید که روی تمام Key ها ایجاد نشه. اینجا ما گفتیم کلید هایی که پیشوند 'user:' دارن و اگر دقت کنید در بخش Seed هم تمامی کلید ها با 'user:' شروع میشوند. توجه کنید اگر دیتا شما با این پسوند شروع نشه index نمیشه و نمیتونید سرچ انجام بدین. اگر این بخش هم نزارید کل key ها رو index میکنه یعنی '*' که ما نمیخوایم.
- بخش چهارم که Schema رو تعریف میکنیم با انواع data type ها. اول مسیر فیلد رو با #JSONPath مشخص میکنیم و بعد برای Query زدن با استفاده از AS براشون Alias میزاریم و البته در آخر نوع data type هم مشخص میکنیم.
در اینجا age از نوع عددی هست و بقیه TEXT. در اینجا هم آپشن های متنوعی وجود داره مثل استفاده از Geo میتونید مختصات جغرافیایی بزارید و Query های خاص خودش رو استفاده کنید. مثلا در app های دوست یابی میخواین نزدیک ترین افراد رو به کاربر پیدا کنید.
حالا یک سری Query رو با هم برسی میکنیم.
مثلا افرادی رو میخوایم که بالا 30 سال سن دارن و از offset 0 شروع کن 2 تا نتیجه رو برای ما بیار
اینجا هست که با استفاده از Alias هایی که بالا مشخص کردیم میتونیم Query بزنیم روی ایندکسی که میخوایم.
حالا اگر بخوایم ادمایی که 34 سال دارن رو ببینیم.
این دوتا Query برابر هستن از نظر خروجی. تنها تفاوت این هست که #Redis در Query lang که داره برای حفظ Backward compatibility سینتکس های جدید که اضافه میکنه رو با DIALECT دسته بندی کرده که در دومی DIALECT مدل 2 رو میبینم.
حالا یکی رو میخوایم ببینیم که توی یک شهر خاص زندگی میکنه و میخوایم فقط اسمش رو ببینیم.
حالا میخوایم تمام کاربرا رو بر اساس سن Sort شده ببینیم.
اینجا جا داره بگم به قول خارجی های Sky is the limit کلی قابلیت دیگه وجود داره که واقعا ارزش برسی داره مثل Aggregate ها که قدرت خیلی زیادی داره یا کار کردن با Vector ها.
هدف از این پست آشنایی با این بخش بود. در آینده بخش های بیشتری رو برسی میکنیم. امیدوارم موفق باشید.
اولین نکته این که شما توانایی index کردن HASH ها و JSON ها رو دارید. یعنی اگر پروژتون الان روی HASH هست بدون هیچ دردسری میتونید از Query های Redis Search استفاده کنید. برای پست امروز با Redis JSON کار میکنیم باتوجه به این که مطالعه کوچیکی درموردشون داشتیم. اولین کاری که میکنیم #Redis رو با دیتا فیک Seed میکنیم.
JSON.SET user:0 $ '{"name":"Farah","city":"Malibong East","age":21}'
JSON.SET user:1 $ '{"name":"Wyn","city":"Hezheng Chengguanzhen","age":62}'
JSON.SET user:2 $ '{"name":"Frederich","city":"Liujia","age":32}'
JSON.SET user:3 $ '{"name":"Maria","city":"Tudela","age":47}'
JSON.SET user:4 $ '{"name":"Marty","city":"Irtyshskiy","age":48}'
JSON.SET user:5 $ '{"name":"Glendon","city":"Bagorejo","age":59}'
JSON.SET user:6 $ '{"name":"Minne","city":"San Pedro","age":59}'
JSON.SET user:7 $ '{"name":"Garrett","city":"Shuangpu","age":26}'
JSON.SET user:8 $ '{"name":"Anna-diana","city":"Jalālpur","age":32}'
JSON.SET user:9 $ '{"name":"Silas","city":"Qacha’s Nek","age":34}'
درمورد کار کردن با JSON در پست قبلی توضیح دادیم. مرحله بعدی این هست که Index و Schema مناسب برای این دیتا ایجاد کنیم که بتونیم Query بزنیم.
FT.CREATE idx:user ON JSON PREFIX 1 user: SCHEMA $.name AS name TEXT $.age AS age NUMERIC $.city AS city TEXT
به FT.CREATE ما میتونیم ایندکس جدید ایجاد کنیم. این کامند بسیار آپشن های زیادی داره و پیشنهاد میکنم حتما داکیومنت مربوط بهش رو بخونید به عنوان مثال میتونید بعضی از Field ها که نیاز ندارید داخل Index قرار ندین ولی توی Schema شما وجود داشته باشه. برای امروز ما سعی میکنیم تا حد ممکن مثال رو ساده نگه داریم.
- بخش اول یعنی idx:user اسم ایندکس یا به قولی Schema ما هست. اگر میخواید ببینید چه Index هایی دارید میتونید از FT._LIST استفاده کنید.
- بخش دوم یعنی ON JSON تعریف میکنید که دیتا JSON هست و اینجا میتونید HASH هم بزارید.
- بخش سوم که برای Performance مهم هست این هست که محدودیت Index ایجاد میکنید که روی تمام Key ها ایجاد نشه. اینجا ما گفتیم کلید هایی که پیشوند 'user:' دارن و اگر دقت کنید در بخش Seed هم تمامی کلید ها با 'user:' شروع میشوند. توجه کنید اگر دیتا شما با این پسوند شروع نشه index نمیشه و نمیتونید سرچ انجام بدین. اگر این بخش هم نزارید کل key ها رو index میکنه یعنی '*' که ما نمیخوایم.
- بخش چهارم که Schema رو تعریف میکنیم با انواع data type ها. اول مسیر فیلد رو با #JSONPath مشخص میکنیم و بعد برای Query زدن با استفاده از AS براشون Alias میزاریم و البته در آخر نوع data type هم مشخص میکنیم.
در اینجا age از نوع عددی هست و بقیه TEXT. در اینجا هم آپشن های متنوعی وجود داره مثل استفاده از Geo میتونید مختصات جغرافیایی بزارید و Query های خاص خودش رو استفاده کنید. مثلا در app های دوست یابی میخواین نزدیک ترین افراد رو به کاربر پیدا کنید.
حالا یک سری Query رو با هم برسی میکنیم.
مثلا افرادی رو میخوایم که بالا 30 سال سن دارن و از offset 0 شروع کن 2 تا نتیجه رو برای ما بیار
FT.SEARCH idx:user '@age:[30 +inf]' LIMIT 0 2
اینجا هست که با استفاده از Alias هایی که بالا مشخص کردیم میتونیم Query بزنیم روی ایندکسی که میخوایم.
حالا اگر بخوایم ادمایی که 34 سال دارن رو ببینیم.
FT.SEARCH idx:user '@age:[34 34]'
FT.SEARCH idx:user '@age==34' DIALECT 2
این دوتا Query برابر هستن از نظر خروجی. تنها تفاوت این هست که #Redis در Query lang که داره برای حفظ Backward compatibility سینتکس های جدید که اضافه میکنه رو با DIALECT دسته بندی کرده که در دومی DIALECT مدل 2 رو میبینم.
حالا یکی رو میخوایم ببینیم که توی یک شهر خاص زندگی میکنه و میخوایم فقط اسمش رو ببینیم.
FT.SEARCH idx:user '@city:San Pedro' RETURN 1 name
حالا میخوایم تمام کاربرا رو بر اساس سن Sort شده ببینیم.
FT.SEARCH idx:user '*' SORTBY age DESC
اینجا جا داره بگم به قول خارجی های Sky is the limit کلی قابلیت دیگه وجود داره که واقعا ارزش برسی داره مثل Aggregate ها که قدرت خیلی زیادی داره یا کار کردن با Vector ها.
هدف از این پست آشنایی با این بخش بود. در آینده بخش های بیشتری رو برسی میکنیم. امیدوارم موفق باشید.
باشد تا رستگار شویم.🔥
"node".split('').sort().join('')
Please open Telegram to view this post
VIEW IN TELEGRAM
چند روزی هست #NodeJS نسخه 23 منتشر شده و بزودی 22 LTS رو میبینیم.
سعی میکنم تغییرات رو باهم برسی کنیم در آینده.
https://nodejs.org/en/blog/release/v23.0.0
سعی میکنم تغییرات رو باهم برسی کنیم در آینده.
https://nodejs.org/en/blog/release/v23.0.0
nodejs.org
Node.js — Node v23.0.0 (Current)
Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.
سلام به همگی دوستان که جدید اومدن خیلی خیلی خوش اومدین.
قدیمی ها دمتون گرم مرسی که همیشه همراه من بودین.
لینک گروه بچه ها ما اینجا هست خوشحال میشم اگر دوست داشتید به کامینیوتی کوچیک ما جوین بشید.
https://t.me/NodeMasterGP
قدیمی ها دمتون گرم مرسی که همیشه همراه من بودین.
لینک گروه بچه ها ما اینجا هست خوشحال میشم اگر دوست داشتید به کامینیوتی کوچیک ما جوین بشید.
https://t.me/NodeMasterGP
Telegram
Node Master Group
هدف از این گروه صحبت و پرسش پاسخ درمورد نکات مربوط به برنامه نویسی میباشد.
از بحث های حاشیه ای به شدت دوری کنید لطفا.
Admin: @NapoleoN_N1
@NodeMaster
از بحث های حاشیه ای به شدت دوری کنید لطفا.
Admin: @NapoleoN_N1
@NodeMaster
خیلی از دوستانی که من میشناسم اکثرا به صورت self thought بودن و از رشته های دیگ وارد برنامه نویسی شدن.
بخاطر همین موضوع ممکنه یکم سردرگمی برای دوستان پیش بیاد درمورد مفاهیم پایه ای تر مربوط به Computer science و البته شما چه frontend یا backend باشید هرچقد در این مفاهیم عمیق تر باشید در بازار کار به شما Competitive advantage میده و کار پیدا کردن برای شما خیلی راحت تر میشه و این موضوع رو هم قشنگ حس میکنید.
نکته بعدی این که این مسیر به هیچ عنوان یک مسیر یک شب یک ماه و یک ساله نیست و سال ها زمان بر هست و این شما هستین که تصمیم میگرید چقدر برای شما کافی هست با توجه به علاقه شما. میتونید این ها رو ندونید و درآمد قابل قبولی هم داشته باشید ولی اگر قصد پیشرفت دارید این مفاهیم از واجبات هست.
خودم هم در همین مسیر هستم و دارم یاد میگیرم و از این منابع استفاده میکنم و امیدوارم براتون مفید باشه و کورس ها و نکاتی هم که اینجا میگم باتوجه به سطحی که حس میکنید دارید انتخاب کنید و ببینید.
- همیشه هروقت کسی از من درمورد مسیر Backend سوال میپرسه من تاکید خیلی زیادی روی database و database design دارم.
https://downloadly.ir/elearning/video-tutorials/complete-intro-to-databases/
https://downloadly.ir/elearning/video-tutorials/complete-intro-to-sql-postgresql/
و اگر سطح خوبی دارید و میخواید deep تر بشید قطعا این چنل یوتیوب یک طلا درمورد database ها هست بیشتر از زاویه آکادمیک به مسائل نگاه میکنه و خب برای باتجربه تر ها خیلی مناسب هست.
https://www.youtube.com/@CMUDatabaseGroup
- موضوع بعدی networking هست. شما چه frontend باشی یا backend باید و باید OSI Model رو به صورت قلبی درک کرده باشی و البته در حد پایه ای network رو بشناسین شاید شما بگی من فرانت هستم لازم نداره. ممکنه این موضوع مستقیم تاثیری روی کار شما نداشته باشه ولی وقتی همکار devops شما اگر ازتون سوالی پرسید میتونید باهاش همکاری کنید مثل مجسمه خشک به همکارتون نگاه نمیکنید و این خیلی نکته مثبتی هست.
https://downloadly.ir/elearning/video-tutorials/introduction-to-computer-networking-2-hour-crash-course/
این دوره خیلی کوتاه هست و برای خیلی ها کافی هست و بیشتر نیازی نیست پیش برید ولی برای همه لازم هست. بقیه بیشتر برای عمیق تر شدن و علاقه هست.
https://downloadly.ir/elearning/video-tutorials/comptia-network-n10-008-full-course-practice-exam-1/
https://www.goodreads.com/book/show/59147607-computer-networking-global-edition
این کتاب که پایین میزارم یک خورده قدیمی هست و اگر میخواید مطالعه کنید یکم دقت کنید. درکل کتاب باارزشی هست.
https://www.goodreads.com/book/show/505564.The_TCP_IP_Guide
در ادامه از این دو repo سعید کنید الهام بگیرد برای مطالعه و deep تر شدن.
https://github.com/ossu/computer-science
https://github.com/jwasham/coding-interview-university
مفاهیم دیگه ای که در آینده با هم منابع مهمشون رو برسی میکنیم مثل سیستم عامل و مفاهیم low level تر مثل Computer architecture.
یک نکته دیگ این که اگر حس میکنید من میتونم به شما کمکی کنم در هرموردی میتونید PV به من پیام بدین و من خیلی خوشحال میشم اگر بتونم کمکی کنم.
#Course #Book #Guide
بخاطر همین موضوع ممکنه یکم سردرگمی برای دوستان پیش بیاد درمورد مفاهیم پایه ای تر مربوط به Computer science و البته شما چه frontend یا backend باشید هرچقد در این مفاهیم عمیق تر باشید در بازار کار به شما Competitive advantage میده و کار پیدا کردن برای شما خیلی راحت تر میشه و این موضوع رو هم قشنگ حس میکنید.
نکته بعدی این که این مسیر به هیچ عنوان یک مسیر یک شب یک ماه و یک ساله نیست و سال ها زمان بر هست و این شما هستین که تصمیم میگرید چقدر برای شما کافی هست با توجه به علاقه شما. میتونید این ها رو ندونید و درآمد قابل قبولی هم داشته باشید ولی اگر قصد پیشرفت دارید این مفاهیم از واجبات هست.
خودم هم در همین مسیر هستم و دارم یاد میگیرم و از این منابع استفاده میکنم و امیدوارم براتون مفید باشه و کورس ها و نکاتی هم که اینجا میگم باتوجه به سطحی که حس میکنید دارید انتخاب کنید و ببینید.
- همیشه هروقت کسی از من درمورد مسیر Backend سوال میپرسه من تاکید خیلی زیادی روی database و database design دارم.
https://downloadly.ir/elearning/video-tutorials/complete-intro-to-databases/
https://downloadly.ir/elearning/video-tutorials/complete-intro-to-sql-postgresql/
و اگر سطح خوبی دارید و میخواید deep تر بشید قطعا این چنل یوتیوب یک طلا درمورد database ها هست بیشتر از زاویه آکادمیک به مسائل نگاه میکنه و خب برای باتجربه تر ها خیلی مناسب هست.
https://www.youtube.com/@CMUDatabaseGroup
- موضوع بعدی networking هست. شما چه frontend باشی یا backend باید و باید OSI Model رو به صورت قلبی درک کرده باشی و البته در حد پایه ای network رو بشناسین شاید شما بگی من فرانت هستم لازم نداره. ممکنه این موضوع مستقیم تاثیری روی کار شما نداشته باشه ولی وقتی همکار devops شما اگر ازتون سوالی پرسید میتونید باهاش همکاری کنید مثل مجسمه خشک به همکارتون نگاه نمیکنید و این خیلی نکته مثبتی هست.
https://downloadly.ir/elearning/video-tutorials/introduction-to-computer-networking-2-hour-crash-course/
این دوره خیلی کوتاه هست و برای خیلی ها کافی هست و بیشتر نیازی نیست پیش برید ولی برای همه لازم هست. بقیه بیشتر برای عمیق تر شدن و علاقه هست.
https://downloadly.ir/elearning/video-tutorials/comptia-network-n10-008-full-course-practice-exam-1/
https://www.goodreads.com/book/show/59147607-computer-networking-global-edition
این کتاب که پایین میزارم یک خورده قدیمی هست و اگر میخواید مطالعه کنید یکم دقت کنید. درکل کتاب باارزشی هست.
https://www.goodreads.com/book/show/505564.The_TCP_IP_Guide
در ادامه از این دو repo سعید کنید الهام بگیرد برای مطالعه و deep تر شدن.
https://github.com/ossu/computer-science
https://github.com/jwasham/coding-interview-university
مفاهیم دیگه ای که در آینده با هم منابع مهمشون رو برسی میکنیم مثل سیستم عامل و مفاهیم low level تر مثل Computer architecture.
یک نکته دیگ این که اگر حس میکنید من میتونم به شما کمکی کنم در هرموردی میتونید PV به من پیام بدین و من خیلی خوشحال میشم اگر بتونم کمکی کنم.
#Course #Book #Guide
دانلود رایگان نرم افزار
Complete Intro to Databases - Frontend Masters - دانلود رایگان نرم افزار
دانلود Complete Intro to Databases، یک دوره آموزش مقدماتی پایگاه داده شامل آموزش پایگاه های داده MongoDB، PostgreSQL، Neo4j و Redis
Node Master
چند روزی هست #NodeJS نسخه 23 منتشر شده و بزودی 22 LTS رو میبینیم. سعی میکنم تغییرات رو باهم برسی کنیم در آینده. https://nodejs.org/en/blog/release/v23.0.0
دوستان نسخه LTS جدید یعنی 22 اومد.
الان میتونید پروژه ها خودتون آپدیت کنید.
به زودی در یک ویدیو تمام آپدیت های اخیر رو باهم برسی خواهیم کرد.
https://nodejs.org/en/blog/release/v22.11.0
#Update
الان میتونید پروژه ها خودتون آپدیت کنید.
به زودی در یک ویدیو تمام آپدیت های اخیر رو باهم برسی خواهیم کرد.
https://nodejs.org/en/blog/release/v22.11.0
#Update
nodejs.org
Node.js — Node v22.11.0 (LTS)
Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.
دنبال یک بهانه بودم که دوتا از بزرگترین و مهم ترین کتاب های computer science رو معرفی کنم.
خودم کامل نتونستم هردو رو بخونم چون به شدت سنگین هستن و وقت گیر.
در این توییت به این کتاب ها با یک داستان درمورد لینوکس و شخص سازندش یعنی لینوس توروالدز اشاره میکنم نقطه مشترکشون با این کتاب ها رو میگم
https://x.com/imanhpr_media/status/1854096388641996939?t=g2nNlKxcScFHFab8BUeELA&s=09
#Book
خودم کامل نتونستم هردو رو بخونم چون به شدت سنگین هستن و وقت گیر.
در این توییت به این کتاب ها با یک داستان درمورد لینوکس و شخص سازندش یعنی لینوس توروالدز اشاره میکنم نقطه مشترکشون با این کتاب ها رو میگم
https://x.com/imanhpr_media/status/1854096388641996939?t=g2nNlKxcScFHFab8BUeELA&s=09
#Book
به تمامی دوستان چه تازه کار و چه کسانی که سال ها تجربه دارند پیشنهاد میکنم حتما مفاهیم 12factor رو مطالعه کنند. خیلی از قدیمی تر ها این مفاهیم رو با سال ها کسب تجربه و به سختی به دست آوردن و همچین منبعی که به صورت خیلی خلاصه این ها رو به تمیز ترین شکل ممکن توضیح میده واقعا خیلی با ارزش هست.
https://12factor.net/
#Resource
https://12factor.net/
#Resource
12factor.net
The Twelve-Factor App
A methodology for building modern, scalable, maintainable software-as-a-service apps.
Node Master
به تمامی دوستان چه تازه کار و چه کسانی که سال ها تجربه دارند پیشنهاد میکنم حتما مفاهیم 12factor رو مطالعه کنند. خیلی از قدیمی تر ها این مفاهیم رو با سال ها کسب تجربه و به سختی به دست آوردن و همچین منبعی که به صورت خیلی خلاصه این ها رو به تمیز ترین شکل ممکن…
سناریویی رو تصور کنید که یک پروژه مالی Deploy دارید و قصد دارید آپدیت جدید Production رو Deploy کنید و این سرویس هم ترافیک زیادی رو دریافت میکنه.
اتفاقی که میافته این هست که Process قدیمی Kill میشه و یک Process با آپدیت جدید باز میشود که خیلی ساده هست.
حالا موضوعی که باید توجه ویژه بشه این هست که این سرویس ترافیک زیادی داره و Kill کردن Process به صورت یهویی ممکنه در روند Transaction های موجود اختلال ایجاد کنه که به هیچ عنوان قابل قبول نیست.
در بهترین حالت برای حل این چالش باید راهی داشته باشیم که تمام Transaction های جاری نهایی بشن ولی هیچ Request جدید از سمت کلاینت ها دریافت نشه. حالا برای پیاده سازی این موضوع باید چیکار کنیم؟
راه حل خیلی ساده هست.
در این حالت به عنوان مثال با فرض این که application ما از طرف kubernetes سیگنال SIGTERM دریافت میکنه کافیه که server.close رو استفاده کنیم و در callback مربوط بهش از Process خارج بشیم.
وقتی server.close اجرا میشه سرور دیگه ریکوست جدید دریافت نمیکنه و سعی میکنه response برای request های درحال پردازش ارسال کنه و در نهایت بعد از به پایان رسیدن تمامی request ها وارد callback میشه.
کلا این مفهوم Graceful shutdown رو باید همیشه در Apllication هایی که توسعه میدین رو در نظر بگیرید و این موضوع رو داخل 12factor هم میبینید که بهش اشاره شده.
گاهی اوقات توجه نکردن به Graceful shutdown میتونه با توجه به داشتن Side effect خیلی ترسناک بشه مثل کار کردن با در پروژه های realtime که میتونه باعث data lost بشه.
اتفاقی که میافته این هست که Process قدیمی Kill میشه و یک Process با آپدیت جدید باز میشود که خیلی ساده هست.
حالا موضوعی که باید توجه ویژه بشه این هست که این سرویس ترافیک زیادی داره و Kill کردن Process به صورت یهویی ممکنه در روند Transaction های موجود اختلال ایجاد کنه که به هیچ عنوان قابل قبول نیست.
در بهترین حالت برای حل این چالش باید راهی داشته باشیم که تمام Transaction های جاری نهایی بشن ولی هیچ Request جدید از سمت کلاینت ها دریافت نشه. حالا برای پیاده سازی این موضوع باید چیکار کنیم؟
راه حل خیلی ساده هست.
در این حالت به عنوان مثال با فرض این که application ما از طرف kubernetes سیگنال SIGTERM دریافت میکنه کافیه که server.close رو استفاده کنیم و در callback مربوط بهش از Process خارج بشیم.
وقتی server.close اجرا میشه سرور دیگه ریکوست جدید دریافت نمیکنه و سعی میکنه response برای request های درحال پردازش ارسال کنه و در نهایت بعد از به پایان رسیدن تمامی request ها وارد callback میشه.
import http from "node:http";
import process from "node:process";
const server = http.createServer((_, res) => res.end("NodeMaster"));
process.on("SIGTERM", () => {
server.close((err) => {
if (err) process.exit(1);
process.exit(0);
});
});
server.listen(3000);
کلا این مفهوم Graceful shutdown رو باید همیشه در Apllication هایی که توسعه میدین رو در نظر بگیرید و این موضوع رو داخل 12factor هم میبینید که بهش اشاره شده.
گاهی اوقات توجه نکردن به Graceful shutdown میتونه با توجه به داشتن Side effect خیلی ترسناک بشه مثل کار کردن با در پروژه های realtime که میتونه باعث data lost بشه.
https://www.linkedin.com/posts/sheydasafiallah_aepaezaedaesabraefaesaepahyahy-aeuaepaeqahyaeuaeuaep-activity-7260940701058666496-OdR9?utm_source=share&utm_medium=member_desktop
#Job
#Job
Linkedin
Sheyda Safiallah on LinkedIn: #فرصت_طلایی #جابینجا #چارتـفراز #فراز #بکاند #فرانتاند #استخدام #backend… | 12 comments
ما در حال ساختن فصل جدیدی از موفقیت هستیم 🚀 و به دنبال همتیمیهای سنیور فرانتاند و بکاند میگردیم! 🌟 اگه تو هم میخوای بخشی از این تحول باشی و تو رشد ما… | 12 comments on LinkedIn