به تازگی نسخه جدید LTS یعنی 20.15 برای #NodeJS منتشر شده.
یکی از ویژگی های کاربردی که اضافه شده مربوط به "node:test" هست. قابلیت test plan هست
به این صورت کار میکنه که اگر تعداد subtest ها و یا assertion ها برابر با plan نباشه تست به خطا میخوره و این موضوع در unit test خیلی میتونه کاربردی باشه به دلیل این که میتونه تست ها رو strict تر کنه.
موضوع بعدی اضافه شدن یک flag جدید هست
یکی از مهمترین flag های #NodeJS در حقیقت خانواده flag های inspect هست. حالا سوال پیش میاد چرا؟ با کمک این فلگ ها میتونید با استفاده از ابزار های کمکی مثل chrome dev tools که یک debugger مربوط به انجین V8 داره به جنگ Bug ها و Bottleneck ها برید. برای Bottleneck یک ابزاری که اینجا در دسترس هست flamegraph هست که فارغ از زبان تو هر زبان برنامه نویسی میتونی این مدل نمودار رو ببینی ( لازمه بگم کسایی که flamegraph بلدن بخونن واقعا آدم های قابل احترامی هستن ).
یکی دیگه از بزرگترین و مهمترین ابزار هایی که کمک میکنه و میتونه ساعت ها زندگیتون رو نجات بده Heap Profiler هست. کابوس هر برنامه نویس #NodeJS قطعا Memory leak هست و پیدا کردنش خیلی سخته. اما اگر از Heap Profiler درست استفاده بشه خیلی سریع میشه Memory leak ها رو پیدا کرد.
چندماه هست دوست دارم درمورد inspect عمیق بشیم ولی متاسفانه فرصتش هیچ وقت برام پیش نیومده. ولی قطعا یک روز این موضوع رو عمیق میشیم.
#Update
یکی از ویژگی های کاربردی که اضافه شده مربوط به "node:test" هست. قابلیت test plan هست
test('top level test', t => {
t.plan(2);
t.assert.ok('some relevant assertion here');
t.subtest('subtest', () => {});
});به این صورت کار میکنه که اگر تعداد subtest ها و یا assertion ها برابر با plan نباشه تست به خطا میخوره و این موضوع در unit test خیلی میتونه کاربردی باشه به دلیل این که میتونه تست ها رو strict تر کنه.
موضوع بعدی اضافه شدن یک flag جدید هست
--inspect-wait
یکی از مهمترین flag های #NodeJS در حقیقت خانواده flag های inspect هست. حالا سوال پیش میاد چرا؟ با کمک این فلگ ها میتونید با استفاده از ابزار های کمکی مثل chrome dev tools که یک debugger مربوط به انجین V8 داره به جنگ Bug ها و Bottleneck ها برید. برای Bottleneck یک ابزاری که اینجا در دسترس هست flamegraph هست که فارغ از زبان تو هر زبان برنامه نویسی میتونی این مدل نمودار رو ببینی ( لازمه بگم کسایی که flamegraph بلدن بخونن واقعا آدم های قابل احترامی هستن ).
یکی دیگه از بزرگترین و مهمترین ابزار هایی که کمک میکنه و میتونه ساعت ها زندگیتون رو نجات بده Heap Profiler هست. کابوس هر برنامه نویس #NodeJS قطعا Memory leak هست و پیدا کردنش خیلی سخته. اما اگر از Heap Profiler درست استفاده بشه خیلی سریع میشه Memory leak ها رو پیدا کرد.
چندماه هست دوست دارم درمورد inspect عمیق بشیم ولی متاسفانه فرصتش هیچ وقت برام پیش نیومده. ولی قطعا یک روز این موضوع رو عمیق میشیم.
#Update
👍9
یک خورده دارم #React مرور میکنم برای پروژه شخصی. یک موضوعی که به ذهنم اومد این هست که چطور موقع هندل کردن event ها با handler function ها چطور stack trace تمیزی داشته باشیم.
در این پست درمورد این موضوع و این که چطور stack trace تمیزی داشته باشیم با مثال #Express روی #NodeJS صحبت کردیم.
https://news.1rj.ru/str/NodeMaster/228
در این پست هم راجع به Reflection اشاره ای کردیم.
https://news.1rj.ru/str/NodeMaster/121
حالا شما component زیر که خیلی ساده هست رو در نظر بگیرید
بزارید همین اول بگم این نکته شاید خیلی زیاده روی باشه و نیاز نباشه ولی خب میتونه برای درک بهتر Reflection درنظر گرفتش. تا اینجا باتوجه به چیزایی که میدونم stack trace خوبی خواهیم داشت به دلیل این که clickHandler اسم داره.
سناریویی رو در نظر بگیرید که دارید روی یک سری دیتا loop میزنید و برای هر Entity که دارید یک clickHandler ایجاد میکنید. سوال پیش میاد وقتی روی یکی از این function ها کلیک و call میشه چطور بدونیم کدوم call شده دقیق؟
۱. راه حل ساده تر و همیشه جواب log کردن هست.
۲. راه حل پیچیده تر کمک از Reflection و تغییر اسم function در runtime.
دوستان لزوما نیازی نیست از Reflection استفاده کنید. با log کردن صحیح نیازی اصلا ندارید و فقط این روش پیچدگی بیهوده اضاف میکنه و صرفا برا عمیق شدن داریم میریم جلو.
در اینجا من اومدم به اسم فانکشن Id که به عنوان prop اومده رو در runtime اضافه میکنم و خب این دقیقا معادل همچین چیزی میشه.
اسم فانکشن به صورت عادی یکی از چیزایی هست که زمان compile time ( یا اینجا dev time میشه بهش گفت هرچند خیلی مرسوم نیست) مشخص میشه و خب وقتی چیزی رو در این زمان داشته باشیم dynamic کردنش نزدیک به غیرممکن هست.
حالا اینجا Reflection بهمون کمک میکنه که در runtime یک چیزی که به صورت عادی دردسترس نیست رو تغییر بدیم مثل name atter برای function ها که در این مثال دارید میبینید و دقیقا این موضوع معادل کد clickHandler_2 هست با این تفاوت که در runtime ایجاد میشه و نه compile time.
#Tip
در این پست درمورد این موضوع و این که چطور stack trace تمیزی داشته باشیم با مثال #Express روی #NodeJS صحبت کردیم.
https://news.1rj.ru/str/NodeMaster/228
در این پست هم راجع به Reflection اشاره ای کردیم.
https://news.1rj.ru/str/NodeMaster/121
حالا شما component زیر که خیلی ساده هست رو در نظر بگیرید
function SimpleComp() {
function clickHandler() {
console.log("handler fn :", clickHandler.name);
}
return <button onClick={clickHandler}>click here!</button>;
}بزارید همین اول بگم این نکته شاید خیلی زیاده روی باشه و نیاز نباشه ولی خب میتونه برای درک بهتر Reflection درنظر گرفتش. تا اینجا باتوجه به چیزایی که میدونم stack trace خوبی خواهیم داشت به دلیل این که clickHandler اسم داره.
سناریویی رو در نظر بگیرید که دارید روی یک سری دیتا loop میزنید و برای هر Entity که دارید یک clickHandler ایجاد میکنید. سوال پیش میاد وقتی روی یکی از این function ها کلیک و call میشه چطور بدونیم کدوم call شده دقیق؟
۱. راه حل ساده تر و همیشه جواب log کردن هست.
۲. راه حل پیچیده تر کمک از Reflection و تغییر اسم function در runtime.
دوستان لزوما نیازی نیست از Reflection استفاده کنید. با log کردن صحیح نیازی اصلا ندارید و فقط این روش پیچدگی بیهوده اضاف میکنه و صرفا برا عمیق شدن داریم میریم جلو.
function SimpleComp({ id }) {
function clickHandler() {
console.log("handler fn :", clickHandler.name);
}
Reflect.defineProperty(clickHandler, "name", {
value: clickHandler.name + "_" + id,
});
return <button onClick={clickHandler}>click here!</button>;
}در اینجا من اومدم به اسم فانکشن Id که به عنوان prop اومده رو در runtime اضافه میکنم و خب این دقیقا معادل همچین چیزی میشه.
function clickHandler_2 (){}اسم فانکشن به صورت عادی یکی از چیزایی هست که زمان compile time ( یا اینجا dev time میشه بهش گفت هرچند خیلی مرسوم نیست) مشخص میشه و خب وقتی چیزی رو در این زمان داشته باشیم dynamic کردنش نزدیک به غیرممکن هست.
حالا اینجا Reflection بهمون کمک میکنه که در runtime یک چیزی که به صورت عادی دردسترس نیست رو تغییر بدیم مثل name atter برای function ها که در این مثال دارید میبینید و دقیقا این موضوع معادل کد clickHandler_2 هست با این تفاوت که در runtime ایجاد میشه و نه compile time.
#Tip
Telegram
Node Master
یک Pattern وجود داره که خیلی درموردش صحبت نمیشه در اکوسیستم #JavaScript چه پروژه های #FrontEnd و چه #Backend که با #NodeJS و بقیه runtime ها توسعه داده شده باشن. این پترن خیلی ساده هست. استفاده نکردن ( یا حداقل استفاده ) از Anonymous function ها میباشد.
…
…
👍11
دوستان که با من کم و بیش درمورد roadmap و یا نظرم رو درمورد مسیرشون پرسیدن همه میدونن من چقدر شخصا روی مبحث database و db design خیلی تاکید زیادی دارم.
در این توییت یک کتاب که مدتی هست دارم میخونم معرفی کردم و نکاتی هم کلی گفتم.
https://x.com/imanhpr_media/status/1808176854945177927?t=6qvq2I-HaKufcJh4a0KGSQ&s=19
این کتاب خیلی کتاب با ارزشی هست و برا من حکم یک سلاح مخفی داره و خب باعث competitive advantage زیادی برای من شده.
#Book
در این توییت یک کتاب که مدتی هست دارم میخونم معرفی کردم و نکاتی هم کلی گفتم.
https://x.com/imanhpr_media/status/1808176854945177927?t=6qvq2I-HaKufcJh4a0KGSQ&s=19
این کتاب خیلی کتاب با ارزشی هست و برا من حکم یک سلاح مخفی داره و خب باعث competitive advantage زیادی برای من شده.
#Book
👍12
باورم نمیشه مفهوم به این عمیقی در CS این روزا ها میشه بهش نگاه سیاسی داشت.
این توییتم درمورد halting problem توضیح دادم. خیلی زیاد یادم نیست در این مورد و خیلی خلاصه و ساده سعی کردم توضیح بدم که هر خواننده ای بتونه بخونه. ولی در کل برای شما میتونه یک سرنخی باشه برای عمیق تر شدن در این موضوع.
https://x.com/imanhpr_media/status/1808831653323608501
#CS #Tip
این توییتم درمورد halting problem توضیح دادم. خیلی زیاد یادم نیست در این مورد و خیلی خلاصه و ساده سعی کردم توضیح بدم که هر خواننده ای بتونه بخونه. ولی در کل برای شما میتونه یک سرنخی باشه برای عمیق تر شدن در این موضوع.
https://x.com/imanhpr_media/status/1808831653323608501
#CS #Tip
👍3
#Work
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
ظاهرا به صورت std قراره sqlite به #NodeJS اضافه بشه. خبر جالبی هست.
اینجا میتونید اطلاعات بیشتر رو دنبال کنید.
https://github.com/nodejs/node/pull/53752
#NodeWeekly
اینجا میتونید اطلاعات بیشتر رو دنبال کنید.
https://github.com/nodejs/node/pull/53752
#NodeWeekly
GitHub
lib,src,test,doc: add node:sqlite module by cjihrig · Pull Request #53752 · nodejs/node
#53264 has been open for over a month with no objections, so I am opening this PR with an initial node:sqlite module. There is other functionality that could potentially be exposed in the future, b...
👍6
من شخصا به عنوان یک #Python Hater دو آتیشه هستم.
ولی یک چیزی داره و عجیب خوب هست. حداقل من تا حالا شبیهش رو داخل هیچ اکوسیستم دیگه ای ندیدم و اگر شبیهش رو میشناسید معرفی کنید خوشحال میشم.
این ویژگی خیلی واقعا خفن pickle std برای #Python هست. در حقیقت pickle یک serialization format مثل #JSON هست و مثل #Protobuf یک فرمت binaray هست. حالا سوال پیش میاد چه نکته ای داره.
شما به pickel هر object در اکوسیستم #Python رو میتونید serialize کنید. هر Object با تمام پیچدگی ها custom که داره. بزارید با مثال توضیح بدم.
تصور کنید یک JSON دارید و اون رو میخواید map کنید به یک class و خب معمولا با Factory ها و به شکل های مختلف این اتفاق میافته.
همه چی خیلی منطقی کار میکنه در این سناریو. نکته جالب که اینجا و توجه بهش جالبه این هست که در اینجا به صورت ذاتی هیچ metadata وجود نداره که مشخص بشه مقدار runTimeInput واقعا از جنس User هست و معمولا با استفاده از validation های مختلف و factory متد ها باید مشخص کنیم. اگر بخوایم یک سناریو دیگ رو برسی کنیم که یکم پیچیده تر باشه. شما به هردلیل منطقی یا غیرمنطقی تصمیم داری یک function که در نهایت یک object هست رو serialize کنید. چطور این کار میکنید؟
باتوجه به این که در #JSON به طور کلی هیچ طوره فرمت استانداردی وجود نداره برای این کار منطقی هست کد بالا کار نکنه. ( البته با trick همین کد بالا رو میتونید کاری کنید که بشه ولی کاری به اون سناریو نداریم :) )
یک سناریو پیچیده تر اینه که شما یک object داشته باشید که property denoscriptor های اون رو دست کاری کردین چطور میخواین بدون ست کردن flag یا نشانه در هنگام serialize کردن و بعد از دریافت همون object متوجه بشید که property denoscriptor رو چطور باید ست کنید.
کلا بخوام خلاصه و جمع بندی کنم هرچیزی که مختص object هست که در runtime وجود داره مثل انواع reflection ها و property denoscriptor و method ها و ... .
اینجا هست که pickel خودش رو نشون میده.
در اینجا شما هر جسم قابل لمسی رو در #Python میتونید serialize کنید و مستقیم با خوندن همون data یک object قابل لمس در runtime با تمام metadata ها دریافت کنید. از class گرفته تا یک gatter method که با decorator هست تا انواع magic method ها یا به قول #Pythonic ها dunder method.
از همه جالب تر اون بخش آخر هست که یک Python Denoscriptor رو هم کنار object های User گذاشتیم و میبینیم اون هم به صورت کامل میبینیم. اگر بخوام خلاصه در یک جمله توضیح بدم رسما با اینکار انگار از یک object دارید فایل exe میسازید به جای یک برنامه بزرگ!
نکته بعدی این که این pickel استاندارد مربوط به کد های python هست و جای دیگ تقریبا میشه گفت کاربردی نداره.
https://docs.python.org/3/library/pickle.html
ولی یک چیزی داره و عجیب خوب هست. حداقل من تا حالا شبیهش رو داخل هیچ اکوسیستم دیگه ای ندیدم و اگر شبیهش رو میشناسید معرفی کنید خوشحال میشم.
این ویژگی خیلی واقعا خفن pickle std برای #Python هست. در حقیقت pickle یک serialization format مثل #JSON هست و مثل #Protobuf یک فرمت binaray هست. حالا سوال پیش میاد چه نکته ای داره.
شما به pickel هر object در اکوسیستم #Python رو میتونید serialize کنید. هر Object با تمام پیچدگی ها custom که داره. بزارید با مثال توضیح بدم.
تصور کنید یک JSON دارید و اون رو میخواید map کنید به یک class و خب معمولا با Factory ها و به شکل های مختلف این اتفاق میافته.
class User {
constructor(name) {
this.name = name;
}
static FromJsonString(input) {
const result = JSON.parse(input);
return new User(result.name);
}
}
const runTimeInput = '{"name":"imanhpr"}';
const user = User.FromJsonString(runTimeInput);
console.log(user instanceof User);
console.log(user.name);همه چی خیلی منطقی کار میکنه در این سناریو. نکته جالب که اینجا و توجه بهش جالبه این هست که در اینجا به صورت ذاتی هیچ metadata وجود نداره که مشخص بشه مقدار runTimeInput واقعا از جنس User هست و معمولا با استفاده از validation های مختلف و factory متد ها باید مشخص کنیم. اگر بخوایم یک سناریو دیگ رو برسی کنیم که یکم پیچیده تر باشه. شما به هردلیل منطقی یا غیرمنطقی تصمیم داری یک function که در نهایت یک object هست رو serialize کنید. چطور این کار میکنید؟
function hello() {
console.log("hooo");
}
console.log(JSON.stringify(hello));باتوجه به این که در #JSON به طور کلی هیچ طوره فرمت استانداردی وجود نداره برای این کار منطقی هست کد بالا کار نکنه. ( البته با trick همین کد بالا رو میتونید کاری کنید که بشه ولی کاری به اون سناریو نداریم :) )
یک سناریو پیچیده تر اینه که شما یک object داشته باشید که property denoscriptor های اون رو دست کاری کردین چطور میخواین بدون ست کردن flag یا نشانه در هنگام serialize کردن و بعد از دریافت همون object متوجه بشید که property denoscriptor رو چطور باید ست کنید.
کلا بخوام خلاصه و جمع بندی کنم هرچیزی که مختص object هست که در runtime وجود داره مثل انواع reflection ها و property denoscriptor و method ها و ... .
اینجا هست که pickel خودش رو نشون میده.
import pickle
class NumberOne:
def __get__(self, obj, objtype=None) :
return 1
class User:
__name = "iman"
one = NumberOne()
@property
def name(self):
print("hello from getter")
return self.__name
def __eq__(self, value: object) -> bool:
if isinstance(value , User) and self.__name == value.__name:
return True
return False
def __str__(self) -> str:
return f'User(name={self.__name})'
def hello():
print("hello from function")
# instance sterilization
user_instance_bin = pickle.dumps(User())
run_time_user = pickle.loads(user_instance_bin)
print("user instanceof User :",isinstance(run_time_user , User))
print("user object :" , run_time_user)
print("equality check :" , run_time_user == User())
print("getter invocation :" , run_time_user.name)
# function sterilization
function_bin = pickle.dumps(hello)
run_timefn = pickle.loads(function_bin)
run_timefn()
# class sterilization
cls_bin = pickle.dumps(User)
runtime_cls = pickle.loads(cls_bin)
print("class check:" , issubclass(runtime_cls , User))
# << Exciting part >>
print("WTF:",run_time_user.one)
در اینجا شما هر جسم قابل لمسی رو در #Python میتونید serialize کنید و مستقیم با خوندن همون data یک object قابل لمس در runtime با تمام metadata ها دریافت کنید. از class گرفته تا یک gatter method که با decorator هست تا انواع magic method ها یا به قول #Pythonic ها dunder method.
از همه جالب تر اون بخش آخر هست که یک Python Denoscriptor رو هم کنار object های User گذاشتیم و میبینیم اون هم به صورت کامل میبینیم. اگر بخوام خلاصه در یک جمله توضیح بدم رسما با اینکار انگار از یک object دارید فایل exe میسازید به جای یک برنامه بزرگ!
نکته بعدی این که این pickel استاندارد مربوط به کد های python هست و جای دیگ تقریبا میشه گفت کاربردی نداره.
https://docs.python.org/3/library/pickle.html
Python documentation
pickle — Python object serialization
Source code: Lib/pickle.py The pickle module implements binary protocols for serializing and de-serializing a Python object structure. “Pickling” is the process whereby a Python object hierarchy is...
👍5
Node Master
ظاهرا به صورت std قراره sqlite به #NodeJS اضافه بشه. خبر جالبی هست. اینجا میتونید اطلاعات بیشتر رو دنبال کنید. https://github.com/nodejs/node/pull/53752 #NodeWeekly
به نسخه LTS آینده یعنی 22 در آپدیت 22.5 پکیج node:"sqlite اضافه شد. البته این نکته قابل ذکر هست که این پکیج stable نیست و در حال توسعه میباشد.
https://nodejs.org/docs/latest/api/sqlite.html
https://nodejs.org/docs/latest/api/sqlite.html
👍4
درود دوستان وقت همگی بخیر باشه.
یک مدتی هست فعالیت کانال کم شده و شخصا خیلی فعالیتی ندارم. خواستم بگم. یک مدت کوتاهی میخوام استراحت کنم ولی بعد دوباره با هم ادامه خواهیم داد. امیدوارم موفق باشین❤️
یک مدتی هست فعالیت کانال کم شده و شخصا خیلی فعالیتی ندارم. خواستم بگم. یک مدت کوتاهی میخوام استراحت کنم ولی بعد دوباره با هم ادامه خواهیم داد. امیدوارم موفق باشین❤️
👍36👎2
درود و وقت بخیر.
مدتی فعالیت نداشتم و امروز دوباره برگشتم و امیدوارم هرجا هستید حالتون خوب باشه. در حال حاظر به صورت Full time دارم مطالعه میکنم قطعا پست های جالب تر و عمیق تری نسبت به قبل خواهیم داشت. امروز برای دست گرمی با معرفی یک ابزار شروع میکنیم.
اگر برای سرویستون تست مینویسید و تست های شما وابستگی به دیتابیس داره برای سرعت معمولا سعی میشه که تست ها با یک دیتابیس in-memory اجرا بشه که وابستگی بیرون نداشته باشه و دردسر کمتری هم این روش داره.
حالا مشکلی که اینجا وجود داشت این که اگر پروژه شما به #MongoDB وابستگی داشته باشه در این راه برای استفاده از پکیج مربوط به In memory در حالت هایی دردسر زیادی داره که استفاده از روش های پایین خیلی منطقی تره.
روش هایی که در این حالت میشد استفاده کرد به این صورت بودن:
- استفاده یک دیتابیس جدا و کاملا ایزوله
- استفاده از Service ها در CI/CD pipeline مثل github and gitlab services ( در صورت نبود دیتابیس in memory این روش خیلی بهتری هست )
https://docs.github.com/en/actions/use-cases-and-examples/using-containerized-services/about-service-containers
https://docs.gitlab.com/ee/ci/services/
برای دیتابیس های SQL هم معمولا از #Sqlite نسخه In-memory رو به عنوان engine در هنگام تست استفاده میکنن ولی به این نکته باید توجه داشت که #Sqlite مثل هر #SQL دیگ تفاوت هایی با بقیه دارد و اگر همون تست ها رو بخواید با دیتابیس دیگ مثل #Postgres و #MySQL اجرا کنید ممکنه به خطا بخورید که این هم بخاطر تفاوت ها هست. مخصوصا اگر در تست هاتون به Primary key وابستگی داشته باشید که قطعا خیلی زیاد پیش میاد. ولی درکل هندل کردنشون به طوری که روی همشون کار کنه کار سختی نیست و با ریفکتور کوچیک بیشتر مواقع این موضوع حل میشه.
نمونه کد برای اجرا کردن #Sqlite با #NodeJS پکیج استاندارد جدیدی که اخیرا اضافه شده.
البته شما باید باتوجه به ORM که استفاده میکنید کانفیگ رو انجام بدید.
برای Redis هم که Package مربوط به redis in-memory هست میتونید نصب کنید و استفاده کنید.
و حالا میرسیم برای #MongoDB دردسر ساز که این پکیج کارتون رو راه میندازه. نکته ای که وجود داره این که شما اگر بخواید با استفاده از in memory mongo پروژه خودتون تست کنید اگر هر نسخه از #NodeJS کانتینر برای تست خودتون استفاده کنید کار نمیکنه که جزیاتش رو میتونید داخل داکیومنتش ببینید و البته در این حالت ترجیح میدم از سرویس services مربوط به gitlab یا github استفاده کنم.
https://github.com/typegoose/mongodb-memory-server
مدتی فعالیت نداشتم و امروز دوباره برگشتم و امیدوارم هرجا هستید حالتون خوب باشه. در حال حاظر به صورت Full time دارم مطالعه میکنم قطعا پست های جالب تر و عمیق تری نسبت به قبل خواهیم داشت. امروز برای دست گرمی با معرفی یک ابزار شروع میکنیم.
اگر برای سرویستون تست مینویسید و تست های شما وابستگی به دیتابیس داره برای سرعت معمولا سعی میشه که تست ها با یک دیتابیس in-memory اجرا بشه که وابستگی بیرون نداشته باشه و دردسر کمتری هم این روش داره.
حالا مشکلی که اینجا وجود داشت این که اگر پروژه شما به #MongoDB وابستگی داشته باشه در این راه برای استفاده از پکیج مربوط به In memory در حالت هایی دردسر زیادی داره که استفاده از روش های پایین خیلی منطقی تره.
روش هایی که در این حالت میشد استفاده کرد به این صورت بودن:
- استفاده یک دیتابیس جدا و کاملا ایزوله
- استفاده از Service ها در CI/CD pipeline مثل github and gitlab services ( در صورت نبود دیتابیس in memory این روش خیلی بهتری هست )
https://docs.github.com/en/actions/use-cases-and-examples/using-containerized-services/about-service-containers
https://docs.gitlab.com/ee/ci/services/
برای دیتابیس های SQL هم معمولا از #Sqlite نسخه In-memory رو به عنوان engine در هنگام تست استفاده میکنن ولی به این نکته باید توجه داشت که #Sqlite مثل هر #SQL دیگ تفاوت هایی با بقیه دارد و اگر همون تست ها رو بخواید با دیتابیس دیگ مثل #Postgres و #MySQL اجرا کنید ممکنه به خطا بخورید که این هم بخاطر تفاوت ها هست. مخصوصا اگر در تست هاتون به Primary key وابستگی داشته باشید که قطعا خیلی زیاد پیش میاد. ولی درکل هندل کردنشون به طوری که روی همشون کار کنه کار سختی نیست و با ریفکتور کوچیک بیشتر مواقع این موضوع حل میشه.
نمونه کد برای اجرا کردن #Sqlite با #NodeJS پکیج استاندارد جدیدی که اخیرا اضافه شده.
import { DatabaseSync } from 'node:sqlite';
const database = new DatabaseSync(':memory:');البته شما باید باتوجه به ORM که استفاده میکنید کانفیگ رو انجام بدید.
برای Redis هم که Package مربوط به redis in-memory هست میتونید نصب کنید و استفاده کنید.
و حالا میرسیم برای #MongoDB دردسر ساز که این پکیج کارتون رو راه میندازه. نکته ای که وجود داره این که شما اگر بخواید با استفاده از in memory mongo پروژه خودتون تست کنید اگر هر نسخه از #NodeJS کانتینر برای تست خودتون استفاده کنید کار نمیکنه که جزیاتش رو میتونید داخل داکیومنتش ببینید و البته در این حالت ترجیح میدم از سرویس services مربوط به gitlab یا github استفاده کنم.
https://github.com/typegoose/mongodb-memory-server
GitHub Docs
About service containers - GitHub Docs
You can use service containers to connect databases, web services, memory caches, and other tools to your workflow.
👍8
هدف از این پست ایجاد کنجکاوی در شما هست.
یک مفهوم low level مربوط به computer science داخل این عکس هست.
بگردید پیدا کنید بخونید یاد بگیرد. و از مسیر لذت ببرید.
موفق باشید دوستان👍
https://x.com/imanhpr_media/status/1824874084511150256?t=hFiFIQitnXNBIi_I80Z3PQ&s=19
یک مفهوم low level مربوط به computer science داخل این عکس هست.
بگردید پیدا کنید بخونید یاد بگیرد. و از مسیر لذت ببرید.
موفق باشید دوستان
https://x.com/imanhpr_media/status/1824874084511150256?t=hFiFIQitnXNBIi_I80Z3PQ&s=19
Please open Telegram to view this post
VIEW IN TELEGRAM
Node Master
هدف از این پست ایجاد کنجکاوی در شما هست. یک مفهوم low level مربوط به computer science داخل این عکس هست. بگردید پیدا کنید بخونید یاد بگیرد. و از مسیر لذت ببرید. موفق باشید دوستان👍 https://x.com/imanhpr_media/status/1824874084511150256?t=hFiFIQitnXNBIi_I80Z3PQ&s=19
خب چند روز پیش این پست رو گذاشتم و گفتم این موضوع یک موضوع خیلی پایه ای مربوط به CS داخلش هست که امکان نداره کتاب درمورد زبان هایی مثل C یا سیستم عامل بخونید و به این کلمه اشاره نشه.
این کلمه هست Endianness حالا سوال پیش میاد ربط این دستان با این عکس چیه.
درمورد داستان سفر های گالیور هست که در دنیا Lilliputian یک مذهبی وجود داشت که تخم مرغ رو باید از قسمت کوچیک ترش بشکنی و به اینا میگن little endian. یکسری هم ظاهرا ساز مخالف که باید تخم مرغ رو از سمت بزرگش بشکنی که میشه big endian و ظاهرا در این سرزمین درگیری های زیادی هم بخاطر این که چطور تخم مرغ رو باید شکست بوده.
حالا چه ربطی به کامپیوتر داره؟
شما این عدد رو در نظر بگیرید که معادل HEX این رو داخل عکس میبینید.
168,496,141 = 0A0B0C0D
در ریاضی دوم دبستان وقتی یکان دهگان صدگان یاد گرفتیم به این درک رسیدیم که سمت چپ ترین عدد بیشترین وزن رو داره که به این صورت میتونیم عدد بالا رو نشون بدیم.
حالا اگر تبدیل مبنا ها رو بلد باشید اگر دیتا bin رو بخواید تبدیل به decimal کنید میدونید که bit ها هرکدوم وزن دارند. حالا یک بحثی اینجا هست که اگر بخوایم یک دیتایی رو در یک مجموعه متوالی از حافظه بخوایم ذخیره کنیم اون قسمتی که بیشترین وزن رو دارد آیا باید در اولین خونه حافظه قرار بدیم یا در آخرین خونه حافظه مربوط به این بخش.
خب اینجا معماری های مختلف CPU مثل X86, ARM, RISC-V جنگ تخم مرغی خودشون دارن ( دقیق یادم نمیاد کدوم چه شکل هست میتونید خودتون برید سرچ کنید )
بعضیا دوست دارن که اون Byte که بیشترین وزن رو داره در اولین خانه از حافظه ذخیره بشه. این میشه Big endian در عکس هم که میبینید مقدار 0A که دراین سناریو بیشترین وزن رو داره در خانه A که اولین خانه RAM هست در این سناریو ذخیره شده.
بعضیا هم میگن که باید اون Byte که بیشترین وزن رو داره در آخرین خانه از حافظه باید ذخیره بشه و اولین خانه از حافظه باید کمترین وزن رو داشته باشه. این میشه Little endian که در عکس میبینید مقدار 0A در این سناریو در آخرین خانه از حافظه یعنی A+3 ذخیره شده که بیشترین وزن رو داره و در خانه اول یعنی A مقدار 0D ذخیره شده.
#CS
این کلمه هست Endianness حالا سوال پیش میاد ربط این دستان با این عکس چیه.
درمورد داستان سفر های گالیور هست که در دنیا Lilliputian یک مذهبی وجود داشت که تخم مرغ رو باید از قسمت کوچیک ترش بشکنی و به اینا میگن little endian. یکسری هم ظاهرا ساز مخالف که باید تخم مرغ رو از سمت بزرگش بشکنی که میشه big endian و ظاهرا در این سرزمین درگیری های زیادی هم بخاطر این که چطور تخم مرغ رو باید شکست بوده.
حالا چه ربطی به کامپیوتر داره؟
شما این عدد رو در نظر بگیرید که معادل HEX این رو داخل عکس میبینید.
168,496,141 = 0A0B0C0D
در ریاضی دوم دبستان وقتی یکان دهگان صدگان یاد گرفتیم به این درک رسیدیم که سمت چپ ترین عدد بیشترین وزن رو داره که به این صورت میتونیم عدد بالا رو نشون بدیم.
100,000,000 + 60,000,000 + 8,000,000 + 400,000 + 90,000 + 6,000 + 100 + 40 + 1
حالا اگر تبدیل مبنا ها رو بلد باشید اگر دیتا bin رو بخواید تبدیل به decimal کنید میدونید که bit ها هرکدوم وزن دارند. حالا یک بحثی اینجا هست که اگر بخوایم یک دیتایی رو در یک مجموعه متوالی از حافظه بخوایم ذخیره کنیم اون قسمتی که بیشترین وزن رو دارد آیا باید در اولین خونه حافظه قرار بدیم یا در آخرین خونه حافظه مربوط به این بخش.
خب اینجا معماری های مختلف CPU مثل X86, ARM, RISC-V جنگ تخم مرغی خودشون دارن ( دقیق یادم نمیاد کدوم چه شکل هست میتونید خودتون برید سرچ کنید )
بعضیا دوست دارن که اون Byte که بیشترین وزن رو داره در اولین خانه از حافظه ذخیره بشه. این میشه Big endian در عکس هم که میبینید مقدار 0A که دراین سناریو بیشترین وزن رو داره در خانه A که اولین خانه RAM هست در این سناریو ذخیره شده.
بعضیا هم میگن که باید اون Byte که بیشترین وزن رو داره در آخرین خانه از حافظه باید ذخیره بشه و اولین خانه از حافظه باید کمترین وزن رو داشته باشه. این میشه Little endian که در عکس میبینید مقدار 0A در این سناریو در آخرین خانه از حافظه یعنی A+3 ذخیره شده که بیشترین وزن رو داره و در خانه اول یعنی A مقدار 0D ذخیره شده.
#CS
👍8
Node Master
هدف از این پست ایجاد کنجکاوی در شما هست. یک مفهوم low level مربوط به computer science داخل این عکس هست. بگردید پیدا کنید بخونید یاد بگیرد. و از مسیر لذت ببرید. موفق باشید دوستان👍 https://x.com/imanhpr_media/status/1824874084511150256?t=hFiFIQitnXNBIi_I80Z3PQ&s=19
This media is not supported in your browser
VIEW IN TELEGRAM
👍2
Node Master
خب چند روز پیش این پست رو گذاشتم و گفتم این موضوع یک موضوع خیلی پایه ای مربوط به CS داخلش هست که امکان نداره کتاب درمورد زبان هایی مثل C یا سیستم عامل بخونید و به این کلمه اشاره نشه. این کلمه هست Endianness حالا سوال پیش میاد ربط این دستان با این عکس چیه.…
مرسی از دوستانی که در بحث مربوط به این موضوع شرکت کردند.
یکی از دوستان یک ویدیو خوب مربوط به این موضوع هست اشاره کرد دوست داشتید ویدیو رو ببینید جالب هست.
https://www.youtube.com/watch?v=NcaiHcBvDR4
یکی از دوستان یک ویدیو خوب مربوط به این موضوع هست اشاره کرد دوست داشتید ویدیو رو ببینید جالب هست.
https://www.youtube.com/watch?v=NcaiHcBvDR4
YouTube
Endianness Explained With an Egg - Computerphile
Byte ordering, or boiled egg orientation, endianness is important! Dr Steve Bagley on the computer science topic named after something from an 18th century novel....
The copy of Gulliver's Travels used in the graphics was found at archive.org and can be…
The copy of Gulliver's Travels used in the graphics was found at archive.org and can be…
نسخه 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://news.1rj.ru/str/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://news.1rj.ru/str/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");…
👍11
درود و وقت بخیر دوستان.
یکی از نکاتی که خیلی میتونه بهتون کمک کنه به عنوان 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 - Beginner Crash Course - دانلود رایگان نرم افزار
دانلود Udemy - Introduction to Computer Networking - Beginner Crash Course 2025-3 - دوره آموزش مقدمه ای بر شبکه های کامپیوتری
👍19
چند روزی هست که #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
Deno 1.46: The Last 1.x Release | Deno
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.
👍3
چندین بار سعی کردم با معماری #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
👍16
یکی از نکات زیبا که درمورد #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
👍5
بلاخره بعد از سال ها نسخه 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...
👍13👎3