VOL9: How to Write Better Logs, Json Web Token and RAII
ال logs من أساسيات شغلنا كمبرمجين بل تكاد تكون جزء يومي ولكنها من أهم الأمثلة على قاعدة "السهل الممتنع". فنعم كل المبرمجين بيستخدموها من أول الطلبة لل principles engineers لكن عدد قليل جدًا اللي قادر يوظفها ويكتبها بشكل فعّال.
فورقة وقلم وتعالوا نشوف ازاي نكتب logs حلوة 😌
أولاً لازم نعرف أننا بنتعامل يوميًا مع نوعين من الـ Logs:
ال Infrastructure logs ودي اللي بينتجها ال server or operating system or network devices
ال Application code logs ودا اللي هنتكلم عليه دايمًا لأنه كمبرمج بكتبه بشكل شبه يومي وأنا أول واحد ينتفع أو يٌضر بيه.
أهداف كتابة ال Logs
الهدف الأساسي لأي logs إنها تدينا Better observability أو رؤية أفضل على النظام بشكل عام وتمكنا من مراقبة ال events و المشاكل المهمة وتجميع معلومات عنها وبالتالي حلها أو تحسين أداء النظام.
Primitives vs objects in JavaScript
هنتكلم في المقال دا عن الـ primitive and object types in Javascript وهنقارن بينهم من حيث 3 حاجات وهم:
Mutability
Copying
As a function arguments
المقال هدفه إننا نفهم طبيعة الأنواع دي وازاي الكود ممكن يختلف على حسب أنواع المتغيرات اللي بنتعامل معاها في البرنامج، دي حاجة هتخلينا فاهمين الكود بيشتغل إزاي وبالتالي لو لقينا البرنامج بيعمل حاجة غير المتوقع منه نبقى عارفين ايه اللي محتاجين نغيره عشان نخيله يشتغل صح ونقدر نعمل Debugging بسهولة.
تعالوا نتكلم عن أول وجه مقارنة بين الـ primitive and object types وهو الـ mutability بس قبل ما نتكلم عن الـ mutability خلينا نعرف ايه هي الـ primitive type وايه الـ object types.
Primitive types: String,Number, Boolean,Undefined, Symbol
Object types: objects, arrays.
Gentle Introduction Into Modern CPP
لغة C++ هي من اللغات المستخدمة بكثافة في الجامعات لتدريس مواد مثل الخوارزميات و أنظمة التشغيل و هي اللغة اللي وراء أهم ال Technologies اللي بنستخدمها يومياً مثل WebBrowsers: ChromiumEngine, Firefox و تقريباً كل الGame Engines: Unreal Engine, Unity, Godot و معظم ال Databases و الجرافيكس سوفتوير كلها مكتوبة ب C++ و مع كل هذا ألاحظ أن ما يدرس عن اللغة لا يتعدي عن ما تعلمته في لغة C لكن مع اضافة Classes و لكن في الحقيقة C++ أكبر بكثير من مجرد C + Classes و هذا ما سوف تستفيض فيه هذه المقالة عن الإضافات التي تم اضافتها بعد C++11 و سنتكلم عن أهم مفهوم Concept في Modern C++ و هو RAII
RAII
ال RAII و هي اختصار ل Resource Acquisition Is Initialization و الفكرة ورا الكلام اللي يبان كبير و صعب ده ان كل Hardware resource سواء (Memory, File handles, network connections) هيبقي مربوط بال lifetime بتاع الobject اللي بيعبر عنه و الlifetime بتاعت الobject هي بتعبر عن امتي الobject ده هيفضل In Scope و بكده كل object هيستحوذ علي شوية Hardware resources لما تعمله Construct و هيحررfree الresources ديه لما يبقي out of scope و سعتها الdestructor بتاع الobject تلقائياً هيتعمله call و هنلاقي مفهوم الRAII ده مطبق في تقريباً كل الobjects في ال std مثلاً std::ifstream
Json Web Token In a Nutshell
الـ JWT عبارة عن Secure Tokens بيتبعت مع كل Request أو Response عشان نتأكد ان البيانات بين الطرفين متغيرتش، كونها طريقة سهلة وفعالة بيخليها واحدة من أكثر الطرق المستخدمة في الـ User Authentication and Authorization (التحقق من هوية المستخدم و تحديد صلاحياته).
أجزاء الـ JWT
ال JWT بيتكون من 3 أجزاء :
١- الـ Headers
ودي بيتكتب فيها نوع الـ Token و كذلك الـ Algorithm المستخدم.
2- الـ Payload
ودا بيحتوي على معلومات المستخدم زي الـ Email و ممكن بعض صلاحياته وتاريخ اصدار وانتهاء الـ Token.
والجزئين دول بيكونوا Base64 Encoded وتقدر تاخدهم و وتستعملهم في أي Base64 Decoder علي الانترنت و وهيظهرلك القيمة بداخلهم، وعشان كدا مينفعش نحط فيهم أي معلومات سرية زي الـ Passwords.
3- الـ Signature
والـ Secret ده الـ Server بس اللي يعرفه وكل لما كان أصعب كان قوة الـ JWT Token أكبر. وعادة ما بيتخزن في الـ Environment Variables في الـ Server ده.