Forwarded from Digiato | دیجیاتو
جزئیات بیشتر
Please open Telegram to view this post
VIEW IN TELEGRAM
💔3
خب دوستان به نظر باید دنبال جایگزین گیت هاب باشیم که مایکروسافت قراره تو اینم گند بزنه
😐2
داینامیک ماژول در NestJS چیست؟
ماژولهای NestJS معمولاً ثابتاند. یعنی یه چیزی مثل UserModule میسازیم، و فقط یک بار import میکنیم و تمام.
ولی اگه بخوایم ماژولی بسازیم که در هر پروژه با کانفیگ خودش کار کنه چی؟
مثلاً یه دیتابیس ماژول که تو یه پروژه با Postgres وصل شه، تو یکی دیگه با MySQL!
اینجاست که Dynamic Module میاد وسط.
Dynamic Module یعنی ماژولی که موقع import شدن میتونی بهش option بدی تا خودش رو همونجا بر اساس اون option پیکربندی کنه.
مثال:
حالا هر جا که خواستیم:
این کد یعنی DatabaseModule رو تو چند جای مختلف با کانفیگهای مختلف استفاده میکنیم بدون اینکه کدشو تغییر بدیم.
NestJS پشت صحنه این رو به عنوان یه ماژول جدید میشناسه و Provider هایاون رو مطابق چیزی که دادیم تزریق میکنیم.
میشه از این ویژگی در Logger، Auth، Database یا هر سرویس Shareable که تو پروژههای مختلف با تنظیمات مختلف کار میکنه استفاده کنیم.
#nestjs
ماژولهای NestJS معمولاً ثابتاند. یعنی یه چیزی مثل UserModule میسازیم، و فقط یک بار import میکنیم و تمام.
ولی اگه بخوایم ماژولی بسازیم که در هر پروژه با کانفیگ خودش کار کنه چی؟
مثلاً یه دیتابیس ماژول که تو یه پروژه با Postgres وصل شه، تو یکی دیگه با MySQL!
اینجاست که Dynamic Module میاد وسط.
Dynamic Module یعنی ماژولی که موقع import شدن میتونی بهش option بدی تا خودش رو همونجا بر اساس اون option پیکربندی کنه.
مثال:
@Module({})
export class DatabaseModule {
static register(options: DbOptions): DynamicModule {
return {
module: DatabaseModule,
providers: [
{ provide: 'DB_OPTIONS', useValue: options },
],
exports: ['DB_OPTIONS'],
};
}
}حالا هر جا که خواستیم:
imports: [
DatabaseModule.register({ host: 'localhost', port: 5432 }),
]
این کد یعنی DatabaseModule رو تو چند جای مختلف با کانفیگهای مختلف استفاده میکنیم بدون اینکه کدشو تغییر بدیم.
NestJS پشت صحنه این رو به عنوان یه ماژول جدید میشناسه و Provider هایاون رو مطابق چیزی که دادیم تزریق میکنیم.
میشه از این ویژگی در Logger، Auth، Database یا هر سرویس Shareable که تو پروژههای مختلف با تنظیمات مختلف کار میکنه استفاده کنیم.
#nestjs
نست کوئیز:در NestJS اگر یک ماژول معمولی را در چند FeatureModule مختلف import کنیم، NestJS چه رفتاری با سرویسهای آن ماژول دارد؟
Anonymous Quiz
20%
.برای هر import یک instance جدید از سرویسها ساخته میشود.
40%
NestJS بهطور پیشفرض همان instance قبلی را استفاده میکند و singleton است.
20%
سرویسها فقط در یک FeatureModule قابل استفاده هستند و بقیه ماژولها دسترسی ندارند.
20%
بدون Global کردن ماژول و یا ایمپورت در App Module نمیتوان از سرویسهای آن استفاده کرد.
Dev Fuel
نست کوئیز:در NestJS اگر یک ماژول معمولی را در چند FeatureModule مختلف import کنیم، NestJS چه رفتاری با سرویسهای آن ماژول دارد؟
نکته:
بچه ها FeatureModule چیزی نیست که مختص به نست باشه.
مفهوم FeatureModule یعنی ماژولی که برای یک کار خاص ساخته میشه و یک قابلیتی ارائه میده. در نست هم در نهایت زیر مجموعه App Module هستند.
بچه ها FeatureModule چیزی نیست که مختص به نست باشه.
مفهوم FeatureModule یعنی ماژولی که برای یک کار خاص ساخته میشه و یک قابلیتی ارائه میده. در نست هم در نهایت زیر مجموعه App Module هستند.
Dev Fuel
نست کوئیز:در NestJS اگر یک ماژول معمولی را در چند FeatureModule مختلف import کنیم، NestJS چه رفتاری با سرویسهای آن ماژول دارد؟
خب بچه ها الان راجع به این کوئیز یک توضیح مفصل ریز خدمتتون میدم.
جواب کوئیز رو با توضیحات زیر میتونید پیدا کنید 👇
جواب کوئیز رو با توضیحات زیر میتونید پیدا کنید 👇
چه زمانی سرویسهای NestJS دیگر Singleton نیستند؟
در NestJS، تمام provider ها بهصورت پیشفرض Singleton هستند.
یعنی فقط یک بار ساخته میشوند و همه جا share میشوند حتی اگر چند جا import کنیم.
اما دو حالت وجود داره که provider دیگه singleton نیست.
1- وقتی Scope رو تغییر بدیم. اسکوپ یعنی چی؟
Scope مشخص میکنه طول عمر (lifecycle) یک provider چقدره و NestJS چه زمانی نمونه جدید ازش میسازه.و نست 3 مدل اسکوپ داره:
Singleton (پیشفرض): یه بار ساخته میشه و همه استفاده میشه.
Request: برای هر درخواست HTTP یه نمونه جدید ساخته میشه.
Transient: هر بار inject شدن یه نمونه جدید ساخته میشه.
مثال:
این سرویس دیگه singleton نیست چون برای هر request دوباره ساخته میشه.
2- وقتی ماژول Dynamic باشه. که چند پست بالاتر راجع بهش توضیح دادیم.
#nestjs
در NestJS، تمام provider ها بهصورت پیشفرض Singleton هستند.
یعنی فقط یک بار ساخته میشوند و همه جا share میشوند حتی اگر چند جا import کنیم.
اما دو حالت وجود داره که provider دیگه singleton نیست.
1- وقتی Scope رو تغییر بدیم. اسکوپ یعنی چی؟
Scope مشخص میکنه طول عمر (lifecycle) یک provider چقدره و NestJS چه زمانی نمونه جدید ازش میسازه.و نست 3 مدل اسکوپ داره:
Singleton (پیشفرض): یه بار ساخته میشه و همه استفاده میشه.
Request: برای هر درخواست HTTP یه نمونه جدید ساخته میشه.
Transient: هر بار inject شدن یه نمونه جدید ساخته میشه.
مثال:
@Injectable({ scope: Scope.REQUEST })
export class MyRequestService {}این سرویس دیگه singleton نیست چون برای هر request دوباره ساخته میشه.
2- وقتی ماژول Dynamic باشه. که چند پست بالاتر راجع بهش توضیح دادیم.
#nestjs
تا به حال براتون پیش اومده که بخواین داکیومنت یک تکنولوژی رو بخونین ، و احساس کنید که براتون سخت یا حوصله سر بره؟
یکی از اصلیترین دلایل میتونه ضعف در زبان انگلیسی باشه.
بذارید با یک مثال واقعی توضیح بدم.
دوستی داشتم که تصمیم گرفت وب فرانت اند کار کنه .این پروسه یادگیری چیزی بیش از دو سال طول کشید.
در مقابل با شخصی آشنا شدم که معلم زبان بود و تصمیم به یاد گیری گرفت. نتیجه این شد که آقای معلم زبان در 6 ماه کلی چیز یاد گرفت و حتی در یک شرکت استخدام شد.
به راحتی هم داکیومنت میخوند و آموزش های انگلیسی با کیفیتی مشاهده میکرد.
شاید خیلی ها بگن برای شروع لازم نیست حتما انگلیسی رو فول باشیم و ...
این جمله غلط نیست ، اما اینکه هر چقدر انگلیسیتون خوب باشه سریع تر پیشرفت میکنید ، یک واقعیت غیر قابل انکاره.
پس پیشنهاد میکنم که واقعا روی انگلیسیتون کار کنید. خودتون مشاهده خواهید کرد که چقدر سرعت پیشرفتتون افزایش پیدا میکنه.
یکی از اصلیترین دلایل میتونه ضعف در زبان انگلیسی باشه.
بذارید با یک مثال واقعی توضیح بدم.
دوستی داشتم که تصمیم گرفت وب فرانت اند کار کنه .این پروسه یادگیری چیزی بیش از دو سال طول کشید.
در مقابل با شخصی آشنا شدم که معلم زبان بود و تصمیم به یاد گیری گرفت. نتیجه این شد که آقای معلم زبان در 6 ماه کلی چیز یاد گرفت و حتی در یک شرکت استخدام شد.
به راحتی هم داکیومنت میخوند و آموزش های انگلیسی با کیفیتی مشاهده میکرد.
شاید خیلی ها بگن برای شروع لازم نیست حتما انگلیسی رو فول باشیم و ...
این جمله غلط نیست ، اما اینکه هر چقدر انگلیسیتون خوب باشه سریع تر پیشرفت میکنید ، یک واقعیت غیر قابل انکاره.
پس پیشنهاد میکنم که واقعا روی انگلیسیتون کار کنید. خودتون مشاهده خواهید کرد که چقدر سرعت پیشرفتتون افزایش پیدا میکنه.
👍2
شما هم تا حالا شده که در نام گذاری فانکشن ، متغییر ها و ... به مشکل بخورین؟
قبل از ظهور AI وقتی به این مشکل میخوردم کلی بابتش فکر میکردم و گاها حسابی وقت میگرفت.
بعد که AI اومد ، این روند تسریع پیدا کرد و من ازش برای نام گذاری ها وقتی واقعا گیر میکردم ، کمک میگرفتم.
چند روز پیش سر انتخاب نام یک فانکشن به مشکل خوردم و خواستم از یک AI کمک بگیرم دلم نیومد😂.
چون همانطور که میدونید سریع لیمیت میخورن. این شد که به سرم زد یک ابزار توسعه بدم!
ابزاری که توی کامند لاین همیشه دم دستته ، و وسط کار وقتی گیر کردی کافیه فقط صداش بزنی و بگی مشکلت چیه.
من برای نام گذاری هر کدوم از این موارد : function , variable , constants , class ، یک پرامپت مخصوص نوشتم که نام های مخصوص بده.
و از اونجایی که ollama خیلی معروف شده (برنامه ای که به شما این امکان رو میده تا از بین کلی مدل هوش مصنوعی که داره هر کدوم رو خواستین روی سیستم خودتون نصب کنید و آفلاین و رایگان از هوش مصنوعی استفاده کنید)، من هم از ollama استفاده کردم و هم از openai api key. یعنی اگه api key دارید که هیچ ، اگه ندارید کافیه فقط یکی از مدل های ollama توی سیستمون نصب باشه.
در حال حاضر این ابزار قابلیت تولید نام با توضیحات رو داره و ابتداییه.
اما به نظرم پتانسیل خوبی داره و میتونه گامی در شروع استفاده از مدل های لوکال و رایگان ، در برنامه نویسی باشه! و کلی فیچر بهش اضافه کرد.
اسم این ابزار نامورا (namora) هست و برای استفاده کافیه از npm با دستور زیر نصبش کنید :
و بعد دستور namora رو بزنید.
✅ Git Hub :
https://github.com/rezadev8/namora
قبل از ظهور AI وقتی به این مشکل میخوردم کلی بابتش فکر میکردم و گاها حسابی وقت میگرفت.
بعد که AI اومد ، این روند تسریع پیدا کرد و من ازش برای نام گذاری ها وقتی واقعا گیر میکردم ، کمک میگرفتم.
چند روز پیش سر انتخاب نام یک فانکشن به مشکل خوردم و خواستم از یک AI کمک بگیرم دلم نیومد😂.
چون همانطور که میدونید سریع لیمیت میخورن. این شد که به سرم زد یک ابزار توسعه بدم!
ابزاری که توی کامند لاین همیشه دم دستته ، و وسط کار وقتی گیر کردی کافیه فقط صداش بزنی و بگی مشکلت چیه.
من برای نام گذاری هر کدوم از این موارد : function , variable , constants , class ، یک پرامپت مخصوص نوشتم که نام های مخصوص بده.
و از اونجایی که ollama خیلی معروف شده (برنامه ای که به شما این امکان رو میده تا از بین کلی مدل هوش مصنوعی که داره هر کدوم رو خواستین روی سیستم خودتون نصب کنید و آفلاین و رایگان از هوش مصنوعی استفاده کنید)، من هم از ollama استفاده کردم و هم از openai api key. یعنی اگه api key دارید که هیچ ، اگه ندارید کافیه فقط یکی از مدل های ollama توی سیستمون نصب باشه.
در حال حاضر این ابزار قابلیت تولید نام با توضیحات رو داره و ابتداییه.
اما به نظرم پتانسیل خوبی داره و میتونه گامی در شروع استفاده از مدل های لوکال و رایگان ، در برنامه نویسی باشه! و کلی فیچر بهش اضافه کرد.
اسم این ابزار نامورا (namora) هست و برای استفاده کافیه از npm با دستور زیر نصبش کنید :
npm i -g namora-cli
و بعد دستور namora رو بزنید.
✅ Git Hub :
https://github.com/rezadev8/namora
🔥4
از تجربه در یک مصاحبه بگم که بهم بر خورد واقعاً.
چند روز پیش تماس گرفتن و دعوت شدم برای مصاحبه حضوری.
امروز تایمم رو برای ساعت 2 و نیم ظهر خالی کردم و رفتم برای مصاحبه ، یک فرم دادن که یک سری سوالاش کلا عجیب بود
اطلاعات نزدیک ترین خویشاوندان هم توش پرسیده بودن 🤦♂
ده دقیقه نشستم فرم پر کردم ، یکی فرم رو گرفت گفت دانشجویی ؟ گفتم در آینده خیلی نزدیک بله.
گفت ما دانشجو قبول نمیکنیم فقط فول تایم.
اگه فکر میکنی قراره بری دانشگاه و فول تایم نیستی فرم رو ندم مهندس 😐
یکی نیست بگه عزیز من مگه تو رزومه من رو نخوندی ؟ من که توش همه چیز رو ذکر کرده بودم.
اینهمه هم وقت ما رو گرفتی.
هیچی نگفتم بهشون ولی ای کاش یه چیزی میگفتم.
حداقل شاید در ادامه در روند مصاحبشون تاثیر میذاشت🤦♂
چند روز پیش تماس گرفتن و دعوت شدم برای مصاحبه حضوری.
امروز تایمم رو برای ساعت 2 و نیم ظهر خالی کردم و رفتم برای مصاحبه ، یک فرم دادن که یک سری سوالاش کلا عجیب بود
اطلاعات نزدیک ترین خویشاوندان هم توش پرسیده بودن 🤦♂
ده دقیقه نشستم فرم پر کردم ، یکی فرم رو گرفت گفت دانشجویی ؟ گفتم در آینده خیلی نزدیک بله.
گفت ما دانشجو قبول نمیکنیم فقط فول تایم.
اگه فکر میکنی قراره بری دانشگاه و فول تایم نیستی فرم رو ندم مهندس 😐
یکی نیست بگه عزیز من مگه تو رزومه من رو نخوندی ؟ من که توش همه چیز رو ذکر کرده بودم.
اینهمه هم وقت ما رو گرفتی.
هیچی نگفتم بهشون ولی ای کاش یه چیزی میگفتم.
حداقل شاید در ادامه در روند مصاحبشون تاثیر میذاشت🤦♂
👍2
Dev Fuel
Wooow! یادش بخیر ، من هم سن ایشون بودم داشتم تو نوکیا مار بازی میکردم. (فقط خداکنه هیچ پدر ایرانی این ویدیو رو نبینه 😂)
حالا جالب اینه من نشستم ویدیوی ایشون رو دیدم ، و یک منبع خیلی خوب برای یادگیری Data Structures and Algorithms از داخلش پیدا کردم!
واقعا خودم یه فصلش رو خوندم خیلی جالب و جذاب بود پیشنهاد میکنم یه سر بهش بزنید :
https://tira.mooc.fi/kevat-2025/
واقعا خودم یه فصلش رو خوندم خیلی جالب و جذاب بود پیشنهاد میکنم یه سر بهش بزنید :
https://tira.mooc.fi/kevat-2025/
👏1
یک موضوعی هست که میخوام درباره اش حرف بزنم.
این موضوعی که الان بهش میخوام بپردازم مستقیما مربوط به برنامه نویسی نمیشه اما به شدت مهمه.
مدتی میشد که احساس میکردم یادگرفتن ، تمرکز کردن و به یاد نگه داشتن برام سخت شده!
به یاد دارم در دوران کودکی و نوجوانی وضعم خیلی بهتر بود. اما حالا چرا این اتفاق برام افتاده؟
تحقیق کردم دیدم به احتمال 99 درصد دچار مه مغزی شدم. و یکی از مهمترین دلایلش برای من دیر خوابیدن بود.
من شب ها خیلی راحت کار میکردم ، مزاحمتی برام نبود و در سکوت واقعا خوب کار میکردم. اما این عادت عواقب سنگینی برام داشت.
ساعت خوابم رو از 4 صبح رسوندم به یک ( در تلاش برای رسوندن به 11 ) و خب خیلی بهتر شد اوضاع.
اما هنوز تمرکز کردن رو یکم مشکل داشتم.
و توجه کردم دیدم از دوستان و آشنایان بعضی هاشون وضعشون از من خیلی بدتره.
گاها اصلا تو باغ نیستند بعضی ها و تمرکز واقعا براشون سخته.
صبر اندازه یک قطره هم نیست و یک لودینگ ساده رو نمیتونن تحمل کنن میگن تو اون فاصله بریم اینستایی ، یوتوبی ، ایکسی چیزی!
واقعا چیشد به این نقطه رسیدیم؟ جوابش مشخصه من بهش نمیپردازم خودتون بهتر میدونید.
همه اینها رو گفتم که در نهایت یک چیزی رو بهتون بگم.
دوستان ، تو این دورو زمونه اگه میخواهید موفق بشید ، کلیدش فقط و فقط یک چیزه.
من این رو بهتون میگم و بهش ایمان دارم :
تمرکز
برید ببینید چی تمرکزتون رو بالا میبره همون کار رو انجام بدید ، و بعد تکرارش کنید. اصلا تبدیل به عادت بکنید.
مواردی مثل ورزش کردن ، خواب به موقع ( اندازه خواب مهمه ولی نه به اندازه به موقع بودنش) ، تغذیه مناسب و ... .
به قول یارو گفتنی : شما نمیتونی یک دونه بکاری و بهش آب ندی ، خاک درست درمون ندی ، آفتاب ندی بعد هی بهش بگی : تو چرا رشد نمیکنی 😡 رشد کن دیگه!
ما آدما هم دقیقا همینیم. نمیخواد برای رشد کردن تقلای شدید بکنیم. کافیه فقط شرایط رشد رو برای خودمون فراهم کنیم.
این موضوعی که الان بهش میخوام بپردازم مستقیما مربوط به برنامه نویسی نمیشه اما به شدت مهمه.
مدتی میشد که احساس میکردم یادگرفتن ، تمرکز کردن و به یاد نگه داشتن برام سخت شده!
به یاد دارم در دوران کودکی و نوجوانی وضعم خیلی بهتر بود. اما حالا چرا این اتفاق برام افتاده؟
تحقیق کردم دیدم به احتمال 99 درصد دچار مه مغزی شدم. و یکی از مهمترین دلایلش برای من دیر خوابیدن بود.
من شب ها خیلی راحت کار میکردم ، مزاحمتی برام نبود و در سکوت واقعا خوب کار میکردم. اما این عادت عواقب سنگینی برام داشت.
ساعت خوابم رو از 4 صبح رسوندم به یک ( در تلاش برای رسوندن به 11 ) و خب خیلی بهتر شد اوضاع.
اما هنوز تمرکز کردن رو یکم مشکل داشتم.
و توجه کردم دیدم از دوستان و آشنایان بعضی هاشون وضعشون از من خیلی بدتره.
گاها اصلا تو باغ نیستند بعضی ها و تمرکز واقعا براشون سخته.
صبر اندازه یک قطره هم نیست و یک لودینگ ساده رو نمیتونن تحمل کنن میگن تو اون فاصله بریم اینستایی ، یوتوبی ، ایکسی چیزی!
واقعا چیشد به این نقطه رسیدیم؟ جوابش مشخصه من بهش نمیپردازم خودتون بهتر میدونید.
همه اینها رو گفتم که در نهایت یک چیزی رو بهتون بگم.
دوستان ، تو این دورو زمونه اگه میخواهید موفق بشید ، کلیدش فقط و فقط یک چیزه.
من این رو بهتون میگم و بهش ایمان دارم :
تمرکز
برید ببینید چی تمرکزتون رو بالا میبره همون کار رو انجام بدید ، و بعد تکرارش کنید. اصلا تبدیل به عادت بکنید.
مواردی مثل ورزش کردن ، خواب به موقع ( اندازه خواب مهمه ولی نه به اندازه به موقع بودنش) ، تغذیه مناسب و ... .
به قول یارو گفتنی : شما نمیتونی یک دونه بکاری و بهش آب ندی ، خاک درست درمون ندی ، آفتاب ندی بعد هی بهش بگی : تو چرا رشد نمیکنی 😡 رشد کن دیگه!
ما آدما هم دقیقا همینیم. نمیخواد برای رشد کردن تقلای شدید بکنیم. کافیه فقط شرایط رشد رو برای خودمون فراهم کنیم.
❤🔥2👍1
Forwarded from تواناتک Tavaanatech
⚠️ هشدار امنیتی جدی:
افزونه FreeVPN.One را فورا حذف کنید!
به گزارش منابعی مانند TechRadar و CSO Online افزونه FreeVPN.One پس از دریافت بهروزرسانیهای از جمله بعد از ۱۷ ژوئیه ۲۰۲ شروع به جمعآوری و ارسال تصاویر از صفحه نمایش کاربران بدون اطلاع آنها کرده است.
این تصاویر همراه با URL، شناسه تب و شناسه کاربر به سرورهای راه دور ارسال میشوند.
افزونه همچنین اطلاعاتی مانند موقعیت جغرافیایی و اطلاعات دستگاه کاربر را رمزگذاری کرده و ارسال میکند. محققان هشدار دادهاند که این رفتار کاملا مغایر با عملکرد واقعی VPN است و کاربران را توصیه کردهاند افزونه را فورا حذف کنند.
در صورتی که شما هم این افزونه را نصب کردهای، این توصیه ها را انجام دهید:
1️⃣ افزونه FreeVPN.One را فورا حذف نمایید.
2️⃣ از آنتیویروس مطمئنی برای اسکن دستگاه خود استفاده کنید.
3️⃣ رمزهای عبور برای سایتهایی که با این افزونه کار کردید را تغییر دهید.
💰 tavaanatech
افزونه FreeVPN.One را فورا حذف کنید!
به گزارش منابعی مانند TechRadar و CSO Online افزونه FreeVPN.One پس از دریافت بهروزرسانیهای از جمله بعد از ۱۷ ژوئیه ۲۰۲ شروع به جمعآوری و ارسال تصاویر از صفحه نمایش کاربران بدون اطلاع آنها کرده است.
این تصاویر همراه با URL، شناسه تب و شناسه کاربر به سرورهای راه دور ارسال میشوند.
افزونه همچنین اطلاعاتی مانند موقعیت جغرافیایی و اطلاعات دستگاه کاربر را رمزگذاری کرده و ارسال میکند. محققان هشدار دادهاند که این رفتار کاملا مغایر با عملکرد واقعی VPN است و کاربران را توصیه کردهاند افزونه را فورا حذف کنند.
در صورتی که شما هم این افزونه را نصب کردهای، این توصیه ها را انجام دهید:
Please open Telegram to view this post
VIEW IN TELEGRAM
توسعه سیستم عامل ، ساده ترین چالش هر توسعه دهنده
اگر بخوایم سیستم عامل خودمون رو توسعه بدیم ، باید چیکار کنیم؟🤔
چند تا بخش خیلی ساده داره که در چند دقیقه میشه فهمید و حلش کرد.
1️⃣ Bootloader (مرحله بوت شدن )
اینجا همه چیز از صفر شروع میشه. سیستم هنوز چیزی از دنیای سطح بالا نمیفهمه و باید بتونی با اسمبلی و دستور های خیلی پایین CPU کارت رو شروع کنی و سیستم رو از حالت خام ، وارد یک محیطی کنی که بتونه کدهای مثل C رو اجرا کنی.
مثل آب خوردنه.
2️⃣ Memory Management (مدیریت حافظه)
فقط این مرحله یکم سخته که اونم هیچی نداره فقط کافیه قبل توسعه این بخش ، به جای یک لیوان دو لیوان آب بنوشید.
سیستم عامل باید بدونه چه بخشی از RAM آزاد هست ، چه بخشی اشغال شده ، بتونه حافظه رو به پردازه(Process) ها بده و پس بگیره. و وقتی وارد بحث Virtual Memory (حافظه مجازی ) و paging بشی یکم داستان پیچیده تر میشه.(یکم زیادی کم پیچیده)
3️⃣ Process Management (مدیریت پردازهها)
سیستم عامل باید بتونه چند برنامه رو (ظاهرا) همزمان اجرا کنه. اگه CPU تکهستهای باشه، سیستم عامل صرفا بین برنامهها سریع سوییچ میکنه (context switch).
ولی توی CPUهای چند هستهای، بعضی پردازهها واقعا همزمان روی هستههای مختلف اجرا میشن.
که البته پیچیده نیست، چون فقط باید state هر پردازه (رجیسترها، حافظه، فایلها و …) ذخیره بشه و دوباره برگرده.
4️⃣ هر سختافزار (کیبورد، دیسک، کارت شبکه،…) زبان خودش رو داره. باید درایورهایی بنویسی که سیستمعامل بتونه باهاشون حرف بزنه.
هیچ چالشی نداره ، فقط مستندات سختافزار همیشه کامل نیستن و خیلی وقتها باید با آزمون و خطا جلو بری.
5️⃣ File System (سیستم فایل)
اینکه دادهها روی دیسک چطور ذخیره بشن و دوباره بخونی . ساختارهایی مثل FAT، ext4 و NTFS اینا دقیقاً همین بخش هستن.
6️⃣ Concurrency & Synchronization (همزمانی)
وقتی چند پردازه یا ترد همزمان میخوان به یک منبع مشترک دسترسی پیدا کنن، باید مکانیزمهایی مثل mutex، semaphore و … داشته باشی. (اینجا معمولا داستان deadlock و race condition هم سر و کلهشون پیدا میشه.)
خب ، فهمیدیم که توسعه یک سیستم عامل هیچی نداره و حالا که خودمون بلد شدیم ، دیگه وقت خودکفایی عه.
اگر بخوایم سیستم عامل خودمون رو توسعه بدیم ، باید چیکار کنیم؟🤔
چند تا بخش خیلی ساده داره که در چند دقیقه میشه فهمید و حلش کرد.
1️⃣ Bootloader (مرحله بوت شدن )
اینجا همه چیز از صفر شروع میشه. سیستم هنوز چیزی از دنیای سطح بالا نمیفهمه و باید بتونی با اسمبلی و دستور های خیلی پایین CPU کارت رو شروع کنی و سیستم رو از حالت خام ، وارد یک محیطی کنی که بتونه کدهای مثل C رو اجرا کنی.
مثل آب خوردنه.
2️⃣ Memory Management (مدیریت حافظه)
فقط این مرحله یکم سخته که اونم هیچی نداره فقط کافیه قبل توسعه این بخش ، به جای یک لیوان دو لیوان آب بنوشید.
سیستم عامل باید بدونه چه بخشی از RAM آزاد هست ، چه بخشی اشغال شده ، بتونه حافظه رو به پردازه(Process) ها بده و پس بگیره. و وقتی وارد بحث Virtual Memory (حافظه مجازی ) و paging بشی یکم داستان پیچیده تر میشه.(یکم زیادی کم پیچیده)
3️⃣ Process Management (مدیریت پردازهها)
سیستم عامل باید بتونه چند برنامه رو (ظاهرا) همزمان اجرا کنه. اگه CPU تکهستهای باشه، سیستم عامل صرفا بین برنامهها سریع سوییچ میکنه (context switch).
ولی توی CPUهای چند هستهای، بعضی پردازهها واقعا همزمان روی هستههای مختلف اجرا میشن.
که البته پیچیده نیست، چون فقط باید state هر پردازه (رجیسترها، حافظه، فایلها و …) ذخیره بشه و دوباره برگرده.
4️⃣ هر سختافزار (کیبورد، دیسک، کارت شبکه،…) زبان خودش رو داره. باید درایورهایی بنویسی که سیستمعامل بتونه باهاشون حرف بزنه.
هیچ چالشی نداره ، فقط مستندات سختافزار همیشه کامل نیستن و خیلی وقتها باید با آزمون و خطا جلو بری.
5️⃣ File System (سیستم فایل)
اینکه دادهها روی دیسک چطور ذخیره بشن و دوباره بخونی . ساختارهایی مثل FAT، ext4 و NTFS اینا دقیقاً همین بخش هستن.
6️⃣ Concurrency & Synchronization (همزمانی)
وقتی چند پردازه یا ترد همزمان میخوان به یک منبع مشترک دسترسی پیدا کنن، باید مکانیزمهایی مثل mutex، semaphore و … داشته باشی. (اینجا معمولا داستان deadlock و race condition هم سر و کلهشون پیدا میشه.)
خب ، فهمیدیم که توسعه یک سیستم عامل هیچی نداره و حالا که خودمون بلد شدیم ، دیگه وقت خودکفایی عه.
🤯2
چه قابلیت جالبی!!
نمیدونم این فیچر از چه زمانی اضافه شده ولی خیلی باحال و کاربردیه.
برای چنل هایی که فعالیت میکنند و داده های زیادی دارند ، چنل های مشابه رو نشون میده.
من چنل های مشابه رو دیدم و واقعا درست و هوشمندانه بود.
پاول جان دیگه داری توقع ما رو بالا میبری. در آپدیت بعدی منتظریم که تلگرام بدون نیاز به اینترنت کار کنه 👌
نمیدونم این فیچر از چه زمانی اضافه شده ولی خیلی باحال و کاربردیه.
برای چنل هایی که فعالیت میکنند و داده های زیادی دارند ، چنل های مشابه رو نشون میده.
من چنل های مشابه رو دیدم و واقعا درست و هوشمندانه بود.
پاول جان دیگه داری توقع ما رو بالا میبری. در آپدیت بعدی منتظریم که تلگرام بدون نیاز به اینترنت کار کنه 👌
🔥1
Forwarded from سید فرندز / برنامه نویسی / هک و امنیت / تکنولوژی (Mohammad Khoshnava)
Please open Telegram to view this post
VIEW IN TELEGRAM
امروز به یک چالش برخوردم که قبلش نیازه یکم راجع به فرآیند JWT Refresh Token توضیح بدم.
پس در اینجا راجع بهش توضیح میدم و پست بعدی چالشی که بهش برخورده بودم.
در یک پروژه داشتم بخش Auth رو تکمیل میکردم ، که قرار بود JWT Refresh Token هندل بشه.
ساز و کار کلی Refresh Token چطوریه؟
ببینید در این روش ما کلا دو تا توکن داریم. یکیش access token و یکیش refresh token .
وقتی کاربر لاگین میکنه ، ما این دوتا توکن رو میسازیم و میدیم به کلاینت.
مثلا کاربر وقتی به یک route ریکویست میزنه، اون اکسس توکن هست که ارسال میشه و باهاش احراز هویت میشه.
اکسس توکن هم طول عمرش خیلی کوتاهه مثلا نهایتا بین 15 تا 30 دقیقه قرار میدن. یا در کل بسته به نیاز پروژه ممکنه تغییر کنه.
وقتی اکسس توکن منقضی بشه نیازه که دوباره یک توکن جدید به کاربر بدیم.چون بدون این توکن نمیتونه به هیچ یک از روت های محافظت شده دسترسی داشته باشه.
اینجاست که پای refresh-token میاد وسط. وظیفه رفرش توکن اینه که اکسس توکن رو آپدیت کنه. همانطور که از اسمش پیداست یعنی رفرشش کنه.
اکسس توکن رو که مستقیما در response میدیم به به کلاینت. اما رفرش توکن رو چطور؟
من در این پروژه چون کلاینت مرورگر بود ، رفرش توکن رو توی کوکی مستقیما از سمت سرور ست کردم.
یعنی از سمت سرور مستقیما یک توکن به نام refresh_token به صورت http only در مرورگر کاربر ست کردم.
http only باعث میشه که ما از طریق کد های js به کوکی دسترسی نداشته باشیم. در نتیجه اگر هکری بخواد به این توکن دسترسی داشته باشه نمیتونه .
خب حالا چطور ما به واسطه refresh-token اکسس توکن کاربر رو آپدیت کنیم؟
در سمت سرور یک api میسازیم به اسم refresh-token . در اینجا کلاینت باید به این روت ریکویست بزنه.
وقتی ریکویست بزنه ، من در سرور به refresh-token که توی مرورگر کاربر به شکل http only ذخیره کرده بودم دسترسی دارم.
خب توی اینجا خیلی کارها میشه کرد. یکی از چیز هایی که من چک میکنم اینه که ببینم کاربر بلاک شده؟ رفرش توکنش معتبره؟ و ...
وقتی این کار ها انجام شد ، ما دوباره دو تا توکن میسازیم. یکیش یک اکسس توکن جدید و یکی هم رفرش توکن جدید.
عمر رفرش توکن هم باز بستگی به پروژه داره میتونید هر چند روز که بخواید بذارید. مثلا 7 روز.
خب ، فرض کنیم کاربر میاد به یک روت محافظت شده ریکویست میزنه ، ما توی گارد چک میکنیم که اکسس توکن معتبر هست؟ منقضی نشده؟
اگه شده بود خطا 401 میدیم به کلاینت.
اینجا برنامه نویس فرانت اند عزیز باید بیاد یک Silent Refresh راه بندازه. یعنی چی؟ یعنی وقتی به یک روتی ریکویست زدیم و توکن نامعتبر بود ، نباید بفرستیمش کاربر دوباره لاگین کنه. پس رفرش توکن اینجا چیکاره است؟
فرانت اند پروژه من با Nextjs بود و ریکویست ها رو با axios هندل میکردم. در نتیجه یک axiosInstance ساختم، و درونش کدی زدم که هر گاه بعد از ریکویست به هر روتی 401 دریافت کردی ، بیا در پس زمینه به /refresh-token در سرور ریکویست بزن و توکن های جدید رو بگیر. بدون اینکه کاربر متوجه این مراحل بشه.
اگر هم refresh-token نامعتبر بود یا منقضی شده بود هم که دیگه کاربر باید دوباره لاگین کنه.
پس در اینجا راجع بهش توضیح میدم و پست بعدی چالشی که بهش برخورده بودم.
در یک پروژه داشتم بخش Auth رو تکمیل میکردم ، که قرار بود JWT Refresh Token هندل بشه.
ساز و کار کلی Refresh Token چطوریه؟
ببینید در این روش ما کلا دو تا توکن داریم. یکیش access token و یکیش refresh token .
وقتی کاربر لاگین میکنه ، ما این دوتا توکن رو میسازیم و میدیم به کلاینت.
مثلا کاربر وقتی به یک route ریکویست میزنه، اون اکسس توکن هست که ارسال میشه و باهاش احراز هویت میشه.
اکسس توکن هم طول عمرش خیلی کوتاهه مثلا نهایتا بین 15 تا 30 دقیقه قرار میدن. یا در کل بسته به نیاز پروژه ممکنه تغییر کنه.
وقتی اکسس توکن منقضی بشه نیازه که دوباره یک توکن جدید به کاربر بدیم.چون بدون این توکن نمیتونه به هیچ یک از روت های محافظت شده دسترسی داشته باشه.
اینجاست که پای refresh-token میاد وسط. وظیفه رفرش توکن اینه که اکسس توکن رو آپدیت کنه. همانطور که از اسمش پیداست یعنی رفرشش کنه.
اکسس توکن رو که مستقیما در response میدیم به به کلاینت. اما رفرش توکن رو چطور؟
من در این پروژه چون کلاینت مرورگر بود ، رفرش توکن رو توی کوکی مستقیما از سمت سرور ست کردم.
یعنی از سمت سرور مستقیما یک توکن به نام refresh_token به صورت http only در مرورگر کاربر ست کردم.
http only باعث میشه که ما از طریق کد های js به کوکی دسترسی نداشته باشیم. در نتیجه اگر هکری بخواد به این توکن دسترسی داشته باشه نمیتونه .
خب حالا چطور ما به واسطه refresh-token اکسس توکن کاربر رو آپدیت کنیم؟
در سمت سرور یک api میسازیم به اسم refresh-token . در اینجا کلاینت باید به این روت ریکویست بزنه.
وقتی ریکویست بزنه ، من در سرور به refresh-token که توی مرورگر کاربر به شکل http only ذخیره کرده بودم دسترسی دارم.
خب توی اینجا خیلی کارها میشه کرد. یکی از چیز هایی که من چک میکنم اینه که ببینم کاربر بلاک شده؟ رفرش توکنش معتبره؟ و ...
وقتی این کار ها انجام شد ، ما دوباره دو تا توکن میسازیم. یکیش یک اکسس توکن جدید و یکی هم رفرش توکن جدید.
عمر رفرش توکن هم باز بستگی به پروژه داره میتونید هر چند روز که بخواید بذارید. مثلا 7 روز.
خب ، فرض کنیم کاربر میاد به یک روت محافظت شده ریکویست میزنه ، ما توی گارد چک میکنیم که اکسس توکن معتبر هست؟ منقضی نشده؟
اگه شده بود خطا 401 میدیم به کلاینت.
اینجا برنامه نویس فرانت اند عزیز باید بیاد یک Silent Refresh راه بندازه. یعنی چی؟ یعنی وقتی به یک روتی ریکویست زدیم و توکن نامعتبر بود ، نباید بفرستیمش کاربر دوباره لاگین کنه. پس رفرش توکن اینجا چیکاره است؟
فرانت اند پروژه من با Nextjs بود و ریکویست ها رو با axios هندل میکردم. در نتیجه یک axiosInstance ساختم، و درونش کدی زدم که هر گاه بعد از ریکویست به هر روتی 401 دریافت کردی ، بیا در پس زمینه به /refresh-token در سرور ریکویست بزن و توکن های جدید رو بگیر. بدون اینکه کاربر متوجه این مراحل بشه.
اگر هم refresh-token نامعتبر بود یا منقضی شده بود هم که دیگه کاربر باید دوباره لاگین کنه.
👏1
ما وقتی بخواهیم cookies یا authorization headers در مرورگر از سمت سرور ست کنیم ، باید در پروژمون در cors policy این فیلد credentials رو true بذاریم.
در سمت فرانت اند هم باید credentials برابر با true باشه.
من هم در axios و هم در سرور این رو true گذاشته بودم ، ولی نه کوکی ست میشد و نه وقتی فرانت اند ریکویستی میزد نتیجه ای میداد . ( Network Error میگرفتم.)
ابتدا فکر کردم قطعا مشکل از axios هست چون هربار credentials بر میداشتم خطای Network Error بر طرف میشد 🤨
اما credentials باید true میشد چون در غیر اینصورت سرور به cookies دسترسی نداشت.
پس از اینکه کلی توی issues های axios غلط زدم، تصمیم گرفتم سمت سرور رو چک کنم.
پس از کمی جستجو allowedHeaders که برابر با * گذاشته بودم رو برداشتم و همه چیز درست شد :/
من بر حسب عادت همیشه هنگام دولوپ allowedHeaders رو * میذاشتم.
خلاصه که اگر راهتون به اینورا خورد حواستون باشه allowedHeaders رو * نذارید که ممکنه دردسر بشه.
این چالش کوچولو هم بهانه ای شد به طرز کار JWT Refresh Token بپردازیم.
در سمت فرانت اند هم باید credentials برابر با true باشه.
من هم در axios و هم در سرور این رو true گذاشته بودم ، ولی نه کوکی ست میشد و نه وقتی فرانت اند ریکویستی میزد نتیجه ای میداد . ( Network Error میگرفتم.)
ابتدا فکر کردم قطعا مشکل از axios هست چون هربار credentials بر میداشتم خطای Network Error بر طرف میشد 🤨
اما credentials باید true میشد چون در غیر اینصورت سرور به cookies دسترسی نداشت.
پس از اینکه کلی توی issues های axios غلط زدم، تصمیم گرفتم سمت سرور رو چک کنم.
پس از کمی جستجو allowedHeaders که برابر با * گذاشته بودم رو برداشتم و همه چیز درست شد :/
من بر حسب عادت همیشه هنگام دولوپ allowedHeaders رو * میذاشتم.
خلاصه که اگر راهتون به اینورا خورد حواستون باشه allowedHeaders رو * نذارید که ممکنه دردسر بشه.
این چالش کوچولو هم بهانه ای شد به طرز کار JWT Refresh Token بپردازیم.