Node Master
در اینجا سعی میکنم تجریبات خودم رو درمورد تکنولوژی های Back-End و بخصوص اکو سیستم مربوط به js یعنی Deno, Node, Bun به اشتراک بزارم. و البته از مفاهیم مرتبط با Back-End که مربوط به Stack خاصی هم نباشه مطلب خواهیم داشت Admin: @napoleon_n1 NodeMaster.ir
Більше- Підписники
- Перегляди допису
- ER - коефіцієнт залучення
Триває завантаження даних...
Триває завантаження даних...
DENO_FUTURE=1#Update
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 descriptor های اون رو دست کاری کردین چطور میخواین بدون ست کردن flag یا نشانه در هنگام serialize کردن و بعد از دریافت همون object متوجه بشید که property descriptor رو چطور باید ست کنید.
کلا بخوام خلاصه و جمع بندی کنم هرچیزی که مختص object هست که در runtime وجود داره مثل انواع reflection ها و property descriptor و 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 Descriptor رو هم کنار object های User گذاشتیم و میبینیم اون هم به صورت کامل میبینیم. اگر بخوام خلاصه در یک جمله توضیح بدم رسما با اینکار انگار از یک object دارید فایل exe میسازید به جای یک برنامه بزرگ!
نکته بعدی این که این pickel استاندارد مربوط به کد های python هست و جای دیگ تقریبا میشه گفت کاربردی نداره.
https://docs.python.org/3/library/pickle.htmlSource 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...
#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...
یادم نمیاد کدوم کتاب ولی داخل یک کتابی یک کلمه دیدم به اسم Turing complete language که بعد از اون با مفهوم Turing completeness آشنا شدم و با یکم عمیق تر شدن رسیدم به این مسئله خیلی ساده و جالب. ( خیلی عمیق نشدم و چیز زیادی هم یادم نیست ) آخر این رشته نتیجه گیری رو حتما بخونید /1
من Db expert نیستم ولی تا حالا پروژه ای ندیدم که از database design که دارن ایراد کوچیک و بزرگ نگیرم. ندانستن db design توانایی این رو داره یک بیزینس رو به نابودی بکشونه و توانایی مدل کردن داده های بیزینس به data model یک دانش خیلی با ارزشه. /1
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یک Pattern وجود داره که خیلی درموردش صحبت نمیشه در اکوسیستم #JavaScript چه پروژه های #FrontEnd و چه #Backend که با #NodeJS و بقیه runtime ها توسعه داده شده باشن. این پترن خیلی ساده هست. استفاده نکردن ( یا حداقل استفاده ) از Anonymous function ها میباشد. حالا سوال پیش میاد چرا از این پترن باید استفاده کنیم؟ وقتی دارید برنامه توسعه میدین و به نوعی چه توسط خودتون یا Framework که استفاده میکنید با فرایند IOC درگیر هستید مثل #React یا حتی #Express و ... اگر سایز پروژه بزرگ باشه برای پیدا کردن Bug ها به هیچ عنوان تکنیک console.log راه بهینه ای نیست. و معمولا از ابزار ها و تکنیک های مختلف در کنار هم استفاده میشن تا این فرایند راحت تر باشه. در کنار این مفاهیم لاگ کردن Error ها و stack trace مربوط بهشون خیلی مهم هست و خیلی کمک میکنه تا scope مربوط به به باگ رو کوچک تر کنیم و سریعتر بتونیم باگ رو پیدا کنیم. با استفاده زیاد از Anonymous function ها که معمولا بیشتر در هنگام arg برای پاس دادن به عنوان callback استفاده میشن، stack trace شکل خوبی نخواهد داشت و اگر زیاد استفاده بشه حتی stack trace میتونه کاملا بی مصرف بشه…
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
ORDER BY
CASE WHEN Status = 'WAIT' THEN 0 ELSE 1 END,
Date DESC
#Tip #SQLНа вашому тарифі доступна аналітика тільки для 5 каналів. Щоб отримати більше — оберіть інший тариф.