بایگانی ماهیانه: مرداد 1401

یک خط کد که نیمی از اینترنت رو پایین آورد!

چند وقت پیش به مدت حدودا یک ساعت و پانزده دقیقه قطعی توی اینترنت اتفاق افتاد که تقریبا نیمی از اینترنت برای بعضی از آدما توی دنیا قابل دسترس نیود. توی این مطلب سعی می‌کنم دلیل قطعی رو بگم و دقیق تر ببینیم چه اتفاقی افتاده.

در تاریخ 21 2022 June از ساعت 6:27 UTC تا ساعت 7:42 UTC نیمی از اینترنت از دسترس کاربران حارج میشه که دلیل قطعی مشکلی توی سرور های کلودفلر (cloudflare) بود که باعث شد 19 تا از دیتاسنتر های این شرکت از دسترس خارج بشن.
البته این قطعی فقط برای بعضی از کاربران بوده (با توجه به محلی که زندگی می‌کردند) و بقیه کاربران بدون مشکل به اینترنت دسترسی داشتن.
اگرچه این 19 تا سرور فقط 4% از کل شبکه کلودفلر رو شامل میشده اما همین قطعی باعث شده که 50% از کل درخواست های داخل شبکه تحت تاثیر قرار بگیرن.

همونطوری که می‌دونید سرویس هایی که روی اینترنت داده میشن به شکل کلی یک بخش پردازش دارن (برنامه های سمت سرور بخش اصلی این کار رو می‌کنند) و یک بخش که نیاز به پردازش نداره و فقط فایل های مربوط به اون سرویس ذخیره سازی می‌شه (به عنوان مثال فایل های استاتیک و کد های فرانت) و می‌دونیم که ذخیره سازی از پردازش ارزون تر هست. و این هم می‌دونیم که موقعیت مکانی شما و فاصله شما نسبت به سرور مهم هست.
کلودفلر که یک شرکت سرویس دهنده خدمات زیرساخت و شبکه هست، سرویسی به نام CDN یا Content Delivery Network داره.
به شکل ساده اگر بخوام بگم کلودفلر تعداد زیادی دیتاسنتر توی نقاط مختلف دنیا داره و مثلا فایل های استاتیک سایت های مختلف رو داخل سرور های این دیتاسنتر ها کپی کرده در نتیجه مثلا وفتی شما می‌خواید به فلان سایت برید که از CDN کلودفلر استفاده می‌کنه با توجه به موقعیت مکانی شما درخواست شما به نزدیک ترین سرور می‌رسه . (مسلما من تخصصی توی شبکه و این شکل از مباحث ندارم و سعی کردم به شکل کلی توضیح بدم . اگر شما به این مسئله مسلط هستید توی کامتت ها می‌تونید بهم بگید که من متن رو اصلاح کنم 🙂 )

نکته ای که در مورد اینترنت خوبه بدونیم این هست که اینترنت شبکه ای از کامپیوتر ها نیست و در واقع شبکه ای از شبکه هاست که بهم وصل هستند
پروتکلی به نام BGP وجود داره که وظیفش این هست که داخل شبکه کوتاه ترین مسیر رو پیدا کنه
برای پیدا کردن کوتاه ترین مسیر داخل شبکه باید به ‌ip کامپیوتر ها نگاه کنیم. از روی ip می‌تونیم محل کاربر رو پیدا کنیم و بر اساس همین مورد کوتاه ترین مسیر رو تا رسیدن به مقصد پیشنهاد بدیم.

مشکل کلودفلر به خاطر آپدیتی بود که قبل از قطع شدن سرویس ها انجام داده بود
برای پیدا کردن کوتاه ترین مسیر داخل شبکه می‌تونیم بر اساس ip کاربر یکسری سیاست رو مشخص کنیم.
کد زیر بخشی از سیاست ها تعیین شده بر اساس ip کاربر رو نشون میده که توی آپدیت کلودفلر تغییر کرده بودن.

[edit policy-options policy-statement AGGREGATES-OUT]
term 6-DISABLED_PREFIXES { ... }
!    term 6-ADV-TRAFFIC-PREDICTOR { ... }
!    term 4-ADV-TRAFFIC-PREDICTOR { ... }
!    term ADV-FREE { ... }
!    term ADV-PRO { ... }
!    term ADV-BIZ { ... }
!    term ADV-ENT { ... }
!    term ADV-DNS { ... }
!    term REJECT-THE-REST { ... }
!    term 4-ADV-SITE-LOCALS { ... }
!    term 6-ADV-SITE-LOCALS { ... }
[edit policy-options policy-statement AGGREGATES-OUT term 4-ADV-SITE-LOCALS then]
community delete NO-EXPORT { ... }
+      community add STATIC-ROUTE;
+      community add SITE-LOCAL-ROUTE;
+      community add AMS07;
+      community add EUROPE;
[edit policy-options policy-statement AGGREGATES-OUT term 6-ADV-SITE-LOCALS then]
community delete NO-EXPORT { ... }
+      community add STATIC-ROUTE;
+      community add SITE-LOCAL-ROUTE;
+      community add AMS07;
+      community add EUROPE;

برای پیدا کردن مشکل کافی هست که فقط به این سه خط بیشتر توجه کنید

!    term REJECT-THE-REST { ... }
!    term 4-ADV-SITE-LOCALS { ... }
!    term 6-ADV-SITE-LOCALS { ... }

همونطوری که می‌بینید این قسمت از کد داره پیشوند های ip ها رو بررسی می‌کنه و میگه که اگر این ip با فلان پیشوند بود از کدوم مسیر برده و اگر ip ما توی هیچ کدوم از این شرط ها صدق نکرد reject بشه.
اما اگر نگاه کنید بعد از reject دو خط کد دیگه وجود داره که هیچوقت اجرا نمیشن چون قبل از اینکه بررسی بشن reject میشن و همین باعث شده بود که حجم زیادی از درخواست ها reject بشن.
عکس زیر رو سایت کلودفلر منتشر کرده که ترافیک شبکه رو در لحظه قطع شبکه و بعد از برگشت شبکه نشون می‌ده.

همونطور که گفتم تخصص من شبکه نیست در نتیجه سعی کردم چیز هایی رو که از جا های مختلف خونده بودم بهم وصل کنم و توضیح بدم

اگر خواستید خبر رو دقیق‌تر بخونید این گزارش از کلودفلر رو ببینید.

استاندارد نویسی و code convention در جاوا

در ادامه مجموعه پست‌های کد تمیز که می‌تونید اینجا همشون رو ببینید، ای پست در رابطه با code convention خواهد بود.

code convention یعنی چی ؟

زمانی که یک زبان برنامه نویسی منتشر میشه، شرکت یا گروهی که پشت این زبان هست مجموعه ای از مستندات رو منتشر میکنه و توضیح میده که این زبان چطوری کار میکنه و چطوری شما میتونید ازش استفاده کنید.
مثلا توی زبان جاوا برای تعریف متغیر میگه که شما می‌تونید اسم متغیر هاتون رو با استفاه از کارکتر های زبان انگلیسی مشخص کنید و اگر لازم داشتید با استفاده از underline قسمت های اون رو جدا کنید و همچنین نمی‌تونید اسم متغیرتون رو جوری مشخص کنید که با عدد شروع بشه.
این ها جزو ساختار های اون زبان حساب میشن و شما مجبورید که حتما رعایتشون کنید و اگر رعایت نکنید برنامتون اجرا نمیشه.
در کنار مستنداتی که برای زبان برنامه نویسی منتشر میشه توسعه دهنده های اون زبان یک مستند هم با عنوان code convention منتشر میکنه که داخل اون توضیح‌ میده که بهتره کدتون رو به این شکل و با این استایل خاص بنویسید.
این کار باعث میشه که تمام برنامه نویس ها روی یک سری چیز ها توافق کنن تا بتونن کد های خوانا و تمیز تری بنویسن.
به عنوان مثال داخل زبان جاوا من میتونم اسم متغیرم رو age یا AGE بذارم. از نظر کمپایلر این دو تا اسم قابل قبول هستن و کد من بدون مشکل اجرا میشه.
اما code convention مربوط به جاوا میگه بهتره اسم متغیر هایی که به شکل final معرفی میشن و در طول اجرای برنامه تغییر نمی‌کنن رو با حروف بزرگ مشخص کنیم و اگر می‌خوایم یک متغیر معمولی داشته باشیم اون رو با حروف کوچیک بنویسیم.
این یکی از convention های مربوط به جاوا بود که بهتره برنامه نویس ها توی کد هاشون اون رو رعایت کنند.این کار باعث میشه توی پروژه ها بتونید گروهی کار کنید و برنامه بنویسید.
رعایت کردن این اصول باعث میشه کد های برنامه های مختلف یکپارچه باشن و درک کد ها ساده تر باشه.

آیا مجبور به رعایت code convention هستیم ؟

هم آره و هم نه 🙂
نه به این خاطر که کمپایلر یا ادیتور شما رو مجبور به رعایت کردن این اصول نمیکنه و آره به این خاطر که اگر می‌خواید جزئی از یک تیم برنامه نویسی باشید و یا توی پروژه های آدم های دیگه مشارکت کنید باید این ها رو رعایت کنید در غیر این صورت توی بازی راهتون نمیدن.

code convention ها رو از کجا پیدا کنیم ؟

همونطو که اول پست هم گفتم شرکت یا گروه سازنده زبان به شکل مستند اون رو منتشر میکنه.
کافیه توی گوگل سرچ کنید code convention و بعدش اسم زبان برنامه نویسیتون رو اضافه کنید.
من برای جاوا از این مستند استفاده می‌کنم.ساده و راحت 🙂

تجربه من از محیط کار Unity و KDE

لینوکس معروفه به سیستم عاملی که شما می‌تونید داخل اون کاپوت رو بزنید بالا و خودتون سیستم رو دستکاری کنید. این یکی از دلایلی هست که لینوکس رو به عنوان اولین انتخاب برای من تبدیل می‌کنه.
توی توزیع های مختلف لینوکسی، اوبونتو رو من استفاده می‌کنم به خاطر جامعه‌ی بزرگی که پشتش هست در نتیجه توش کمتر به مشکل می‌خورم و اگر هم چیزی بخوام سریع می‌تونم برطرفش کنم.
از دلایل دیگه ‌ای که اوبونتو رو استفاده می‌کنم سازگاری اون با کارت گرافیک NVIDIA هست که روی سیستمم دارم .
قبلا توزیع های دیگه ای مثل fedora، suse و … رو هم امتحان کردم ولی در نهایت اوبونتو روی سیستم من بهتر جواب می‌داده.

توی سایت اوبونتو قسمتی هست به نام Flavours که اجازه میده اوبونتو رو با محیط گرافیکی مختلف و با نرم‌افزار های پیشفرض مختلف داشته باشیم .
من همیشه اوبونتو پیشفرض که با محیط unity هست رو استفاده می‌کردم ولی ایندفعه توزیعی رو به نام kubuntu نصب کردم.
همونطور که از اسمش احتمالا حدس میزنید محیط گرافیکیش KDE هست و نرم‌افزار های پیشفرض خودش رو داره

توی این پست در مورد تجربه خودم داخل این دو محیط می‌نویسم و این که من کدوم رو ترجیح میدم. شاید توی پست های بعدی هم در مورد I3 که یک مدیر پنجره هست هم بنویسم و در مورد اون هم نظر و تجربه ام رو بگم.

مزیت ها و معایب Unity

یونیتی اولین محیطی بود که من با لینوکس تجربش کردم . محیط ساده و سرراست و بدون دردسر بود.
محیط کار مجازی یا virtual desktop ساده ای داره که راحت میشه بینشون جا‌به‌جا بشید.
اگر نمیدونید virtual desktop چی هست باید بگم که فرض کنید می‌تونید چنتا مانیتور رو به شکل مجازی داخل سیستم داشته باشید و هر موقع که با برنامه‌ای کار داشتید برید سراغ اون مانیتور.
از مشخصه های این محیط نوار عمودی کنار صفحه (سمت چپ) هست که برنامه های باز یا برنامه هایی که پین شدن رو نشون میده تا دم دست باشن.
اون پایین هم یک مربع سفید رنگ داره که با فشار دادنش پنجره‌ای باز میشه که تمام نرم‌افزار های سیستم رو نشون میده.

در کل می‌تونم بگم که این محیط خیلی ساده و معمولیه. در کمتر از ۱۰ دقیقه می‌تونید تمام تنظیمات و محیط گرافیکی سیستم رو ببینید و امتحانش کنید.
به شکل پیشفرض امکان گرافیکی خاصی مثل انیمیشن یا شخصی سازی بهتون نمیده و شاید خفن ترین کاری که می‌شه داخلش انجام داد تغییر تم باشه.
البته اینم بگم که با نصب کردن برنامه هایی مثل tweak tool و یا تغییراتی که مستقیم توی فایل های کانفیگ میدید می‌تویند تغییراتی که میخواید رو بوجود بیارید.

مزیت ها و معایب KDE

محیط KDE نسبت به Gnome و Unity سابقه بیشتری داره و در سال 1996 ساخته شده.
مثل محیط های گرافیکی دیگه یک نوار ابزار داره که به شکل پیشفرص پایین صفحه قرار داره اما خودتون می‌تونید اون رو به هر طرف که می‌خواید منتقل کنید. من ترجیح میدم که بالا‌ی صفحه باشه.
داخل این نوار هم می‌تونید widget هایی که میخواید رو اضافه کنید مثلا من دو تا ویجت رو که ترجیح میدم داشته باشم رو اضافه کردم . یکی وضعبت کارت شبکه رو نشون میده و اون یکی هم وضعیت cpu رو .
اگر دکمه windows رو که ما توی لینوکس بهش میگیم super فشار بدید یک منو شبیه start ویندوز باز میشه که میتوندی داخل اون لیست برنامه ها و یا امکانات دیگه مثل خاموش کردن و خروج سیستم و …چیز های دیگه رو ببینید.
محیط KDE نسبت به Unity امکانات گرافیکی بیشتری بهتون میده. توی قسمت تنظیمات این سیستم تقریبا میتونید هر چیزی رو شخصی سازی کنید حتی شکل صفحه لاگین به سیستم و یا splash screen (صفحه ای که موقع لود شدن سیستم نشون داده میشه و لوگوی سیستم عامل رو داره).
تکرار می‌کنم که این کار ها توی محیط Unity هم شدنی هست اما برای این کار مستقیما باید فایل ها کانفیگ رو دست کاری کنید و از داخل منو ها و محیط گرافیکی این امکان رو ندارید.

به نظر من یکی از مزیت هایی که توی KDE هست شکل مدیریت کردن پنجره ها و فضا‌ی کاری یا همون work space هست.
توی KDE شما میتونید هر چنتا که میخواین work space بسازید. هر work space رو مثل یک کامپیوتر جدا در نظر بگیرید که پنجره های کاملا متفاوتی نسبت به بقیه work space ها می‌تونه داشته باشه .مثلا توی تصویر بالا من دو تا work space دارم که یکیش مربوط به کار های شرکته و اون یکی هم مربوط به کار های شخصی خودمه . هر کدوم از این work space ها هم 8 تا virtual desktop دارن.

KDE یا Unity ?

من جواب دقیق به این سوال نمی‌تونیم بدم و این کاملا سلیقه ای محسوب میشه. هر دوشون کارایی و سرعت خوبی دارن و بدون مشکل می‌تونید باهاشون کار کنید.
انتخاب من در حال حاضر KDE هست اون هم به خاطر اینکه میذاره پنجره هام رو راحت تر مدیریت کنم.
اگر توی انتخاب این دوتا محیط شک دارید بهترین راه تست کردن و تجربه ای هست که از این محیط ها بدست میارید . پیشنهاد میکنم روی ماشین مجازی هر دو محیط رو تست کنید و بعد محیط سیستم اصلیتون رو انتخاب کنید.
من فعلا از KDE استفاده می‌کنم و راضی هستم. البته محیط های دیگه مثل XFCE و LXDE و خیلی محیط های دیگه هم هستن که میتونید اون ها رو هم تست کنید.
از خوبی های لینوکس میشه به همین تفاوت ها اشاره کرد که دست کاربر رو باز میذاره تا اون چیزی رو که خودش می‌خواد داشته باشه و در آخر این جمله از کتاب انسان خردمند رو یاد آوری میکنم که تکامل نتیجه تفاوت هاست.

پلاگین Time Tunnel برای وردپرس

مدتی بود که دنبال پلاگینی می‌گشتم که بتونه نشون بده که سال ها پیش در این روز مشخص چه پست هایی رو نوشتم و خب امروز به شکل اتفاقی پیداش کردم.

اسم پلاگین TimeTunnel هست و اگر از وردپرس برای مدیریت وبلاگتون استفاده می‌کنید پیشنهاد می‌کنم که نصبش کنید.
این پلاگین کمک می‌کنه پست هایی که به خاطر گذر زمان فراموش شدن دوباره بالا بیان و فرصت دوباره خونده شدنشون فراهم بشه

پی‌نوشت : مدتی هست که دارم سعی می‌کنم هفته ای حداقل سه تا پست رو داخل وبلاگ داشته باشم اما زمانی که تعداد پست ها میره بالا ممکنه کیفیت تحت تاثیر قرار بگیره . الان که پلاگین رو اضافه کردم پستی رو نشون نمیده به خاطر اینکه من خیلی منظم نمی‌نویسم ولی امید وارم همین پلاگین مجبورم کنه بیشتر وقت بزارم