0%

في هذا الموضوع نتحدث عن مفهوم تقسيم الشبكة وعزل أجزائها بهدف حماية مكوناتها
المفهوم يطلق عليه DMZ وهو اختصار (demilitarized zone) ويعني المنطقة منزوعة السلاح لان تلك الشبكة تعتبر الأكثر عرضة للخطر

الشرح يتطرق للمواضيع التالية:

  • Network segmentation
  • NAT
  • Port forwarding
  • Home router DMZ

بروتوكولات الشبكة

تعمل غالبية شبكات الحاسب هذه الأيام على بروتوكولات أساسية مثل IP و TCP و UDP و ICMP و ARP …. الخ. حيث تعتمد الأجهزة المرتبطة بالانترنت وبالشبكات الخاصة كالشبكات الداخلية في الشركات والمنازل على هذه البروتوكولات لترتبط مع بعضها وتتناقل البيانات.

في الفيديو التالي قمت بشرح سريع لطبقات النموذج العالمي للشبكة OSI Model و كذلك Internet Model والتي تسمى كذلك TCP Model، ثم تطرقت بالحديث عن بروتوكول الأنترنت IP (الاصدار 4) والذي يختص بالتعامل مع العناوين الشبكية للأجهزة وبعد ذلك تم الحديث ببعض التفصيل عن البروتوكولين الشهيرين TCP و UDP وشمل الحديث النقاط التاليه:

  • طريقة عملهم
  • تركيبة ترويسة البروتوكول (Header)
  • الفرق بينهم
  • فوائد كل واحد وعيوبه
  • بعض التطبيقات التي تعتمد عليهم

في الفيديو التالي تجدون شرح مختصر لطريقة تركيب و إعداد منصة هيكسو الخاصة بالمدونات ذات الصفحات الثابتة (Static pages) ويغطي الشرح المحاور التالية:

  • مقارنة سريعة للصفحات الديناميكية والثابتة وفوائد كل منهما (Static vs Dynamic pages)
  • طريقة كتابة المقالات في المدونة
  • كيفية استخدام لغة الترميز ماركداون Markdown (لمزيد من المعلومات راجع المقالة التالية نبذة عن لغة الترميز Markdown)
  • طريقة تثبيت الإضافات (Plugins)
  • وطريقة تثبيت وتغيير تصميم المدونة (Themes)
  • كيفية انتاج الصفحات الثابتة وطرق رفعها على الخادم


كلمة DNS هي اختصار ل Domain Name System وتعني نظام أسماء النطاقات، وهي بالنسبة للإنترنت كدليل أرقام الهاتف، فمثلا عند رغبتنا بالاتصال بشركة ما فإننا غالبا لا نعرف الرقم فنبحث في دليل الهاتف عن اسم الشركة إلى أن نجد الرقم ونتصل به. في عالم الإنترنت أي جهاز متصل بهذه الشبكة له عنوان رقمي خاص به يسمى IP وغالبا يكون العنوان هذا ثابت ولا يتغير (مثلا 205.45.7.24)، وكما هو الحال مع أرقام الهاتف فانه من الصعب معرفة وتذكر العناوين الرقمية لجميع مواقع الإنترنت لذلك وجب وجود دليل يسهل للناس الوصول للعنوان الرقمي بمجرد معرفة اسم النطاق الخاص بالموقع (مثلا fadvisor.net) وهذا هو دور نظام أسماء النطاقات. عند محاولتنا فتح موقع معين مثلا fadvisor.net يقوم المتصفح بالاستعلام من نظام التشغيل عن العنوان الخاص بذلك الموقع وبدوره يقوم النظام بالتواصل مع خادم أسماء النطاقات والاستعلام عن الرقم وبمجرد حصوله على الرد يقوم أولاً بتسجيله في سجل مؤقت في حال تم الاستعلام عنه لاحقا ثم يقوم بالرد على المتصفح والذي يقوم باستخدام هذا الرقم للتواصل مع الخادم وفتح الموقع.

في الفيديو التالي قمت بشرح نظام أسماء النطاقات Domain Name System (DNS) وكان الحديث مركز على المحاور التالية:

  • ماهو النظام
  • طريقة عمله
  • استخدامه في حجب المواقع والاعلانات (مثل Pi-hole و Blokada)
  • استخدامه في حماية البريد الإلكتروني (SPF و DKIM و DMARC)
  • مشاكله الأمنية
  • بعض الحلول التي تقدم انواع من الحماية لمعالجة بعض مشاكلة (DNSSEC و DoH و DoT)

ماهي Markdown؟

هي لغة ترميز (markup language) تستخدم لتنسيق الكتابة بطريقة سهلة ومن ثم يتم تحويلها الكترونيا الى صيغ اخرى مثل HTML ليتم عرضها. وتتميز بكون علامات التنسيق المستخدمة بها بسيطة وتمكن من قراءة النص حتى قبل عملية التحويل

كيف تكتب بلغة Markdown؟

يمكن كتابتها باستخدام محررات النصوص الاعتيادية، كما يمكن استخدام برامج خاصة تعرض النتائج مباشرة وتسهل عملية التنسيق لبعض العمليات المعقدة مثل الصور والروابط والجداول والتي تعتبر صعبة نوعا ما مقارنة برموز التنسيق الأخرى. وعادة تحفظ الملفات المستخدم بها تنسيق الماركداون بامتداد .md .

في الأسفل سأقوم بوضع مثال لطريقة الكتابة ويليها الناتج النهائي لكيفية ظهورها في البرامج التي تفهم تلك اللغة:

العناوين

# عنوان 1
## عنوان 2
### عنوان 3
#### عنوان 4
##### عنوان 5

عنوان 1

عنوان 2

عنوان 3

عنوان 4

عنوان 5

تخصيص الكلمات

اكتب بالمائل انا *فهد الدريبي*  أو _فهد الدريبي_
اكتب بالعريض **فهد الدريبي** أو __فهد الدريبي__
لشطب كلمة ~~كلمة مشطوبة~~

اكتب بالمائل انا فهد الدريبي أو فهد الدريبي
اكتب بالعريض فهد الدريبي أو فهد الدريبي
لشطب كلمة كلمة مشطوبة

القوائم

1. واحد
2. اثنان
    2.1 عنصر فرعي
    2.2 عنصر فرعي .2

* عنصر 1
* عنصر 2

- عنصر أ
- عنصر ب

+ عنصر س
+ عنصر ص
  1. واحد
  2. اثنان
    2.1 عنصر فرعي
    2.2 عنصر فرعي .2
  • عنصر 1
  • عنصر 2
  • عنصر أ
  • عنصر ب
  • عنصر س
  • عنصر ص

** استخدام رمز النجمة أو علامة الناقص أو علامة الزائد لهم نفس التأثير والناتج، فتستطيع استخدام ما تشاء منهم.

الروابط

[انا رابط لموقع](https://www.fadvisor.net)

[انا رابط لموقع مع عنوان](https://www.fadvisor.net "مدونة فهد الدريبي")

https://www.fadvisor.net

انا رابط لموقع

انا رابط لموقع مع عنوان

https://www.fadvisor.net

الصور

![نص يشرح الصورة](images/logo.png "شعار")

نص يشرح الصورة

النصوص البرمجية

```c
#include<stdio.h>
int main(){
    printf("Hello FAD!");
    return 0;
}
```
1
2
3
4
5
6
#include<stdio.h>

int main(){
printf("Hello FAD!");
return 0;
}

** لكتابة النصوص البرمجية نستخدم الرمز ` والموجود مع زر حرف ذ لكن في المحارف الانجليزية

المشكلة

مع الانتشار الرهيب لتطبيق الواتساب أصبح هو المنصة الرئيسة لتناقل رسائل الأخبار والطرائف وكذلك الإشاعات، وتتنوع تلك الرسائل ما بين رسائل نصية و صور و مقاطع فيديو. من يستخدم التطبيق ولديهم معارف وأصدقاء سيكتشف عاجلاً أو آجلا أن هاتفه قد اصبح ممتلئ بملفات الوسائط المتعددة والتي استقبلها عبر التطبيق من رسائل مباشرة أو من المجموعات.

عندما يظهر لك الهاتف أن الذاكرة على وشك الامتلاء وأن عليك التخلص من بعض الملفات والتطبيقات التي لا تحتاجها، بالنسبة لي الجأ أولا لحذف ملفات الفيديو التي استقبلها الواتساب منذ فتره طويلة (مثلا قبل 3 أشهر)، لأنها غالبا عديمة الفائدة وتستهلك مساحة كبيرة جدا. وإن كنت مثلي فأعتقد انك اكتشف صعوبة عمل ذلك إذ تحتاج إلى فتح برنامج مدير الملفات أو الاستوديو ثم البحث عن الملفات القديمة وحذفها، أو حذف جميع الملفات ولكن قد تكتشف لاحقاً ان هناك صورة او فيديو قد استقبلته حديثا وتحتاج الرجوع له مره أخرى.

الفكرة والحل

لذلك قررت عمل تطبيق يسهل على عمل ذلك الشي بحيث احدد الزمن الذي أريد وبضغطة زر يحذف جميع الملفات القديمة، فنفذت التطبيق و أطلقت عليه اسم “منظف الواتساب” أو “WhatsCleaner”
واجهة التطبيق الانجليزية

فكرة التطبيق سهله جدا وبسيطة، إذ قمت أولا بحصر مواقع الملفات التي يحفظها التطبيق على الجهاز وهي في مجلدات لكل نوع من أنواع الوسائط مثلا “WhatsApp Images” للصور و “WhatsApp Video ” لمقاطع الفيديو وهكذا وتحفظ جميعها في مجلد خاص بالواتساب تحت المسار التالي WhatsApp/Media/ ويحفظ هذا المجلد اما في الذاكرة الداخلية للجهاز، او في الذاكرة الخارجية (SD Card) اذا كان الجهاز لا يحتوي على ذاكرة داخلية أو ان صاحب الجهاز قد نقل ملفات الواتساب للذاكرة الخارجية

مثال لمواقع المجلدات في جهازي [اضغط على الصورة لتراها بحجم أكبر]:
واجهة التطبيق العربية

بعد ذلك يقوم التطبيق بالبحث في الملفات وفرزها حسب تاريخ إنشاءها (أو استقبالها) ويقوم باختيار الملفات التي تم إنشاءها قبل الزمن الذي حدده مستخدم التطبيق. مثلا: عند اختيار مدة “3 أشهر” فسيقوم التطبيق باختيار جميع الملفات التي استقبلت قبل ثلاث أشهر وسيعرض عددها ومساحتها في واجهة التطبيق، فكما في الصورة أعلاه نجد أن هناك 13 ملف فيديو بمساحة 149 ميقايايت تم استقبالها قبل 6 شهور.

الصورة التالية تبين احدث نسخة من التطبيق وعليها شرح يوضح التغييرات الجديدة التي نفذتها بناء على ملاحظات عدد من المستخدمين:
واجهة التطبيق العربية

رابط التطبيق على متجر الأندرويد

المشكلة الحالية

في فتره العمل على التطبيق كنت أقوم بصيانة خادم النسخ الاحتياطي الخاص بي وفي نفس الوقت كنت اخطط لرفع ملفات التطبيق البرمجية “Source code” على موقع github وجعل التطبيق مفتوح المصدر ودعوة المطورين للمساهمة في تطويره وتحسينه خاصة أنني لا اجيد تصميم الواجهات الرسومية. فقمت بحذف ملفات المصدر الخاصة بالتطبيق اعتقادا مني بأني قد رفعتها على github ولم انتبه لذلك حينها، باختصار ضيعت ملفات المشروع الأساسية و النصوص البرمجية و الصور الأصلية …الخ (حاولت أن استعيد الملفات المحذوفة بعد أن اكتشفت ما حصل لكن ذلك كان بعد فتره طويلة فضاع معها أمل استعادة الملفات).

قمت بمحاولات لفك ملف التطبيق apk الموجود في متجر الاندرويد ومحاولة استخراج النصوص البرمجية بما يسمى بالهندسة العكسية (Reverse engineering) وهي تعتبر نوعا ما سهلة في تطبيقات الجافا لكن تلك الطريقة تصلح لعمل تعديلات بسيطة وليست مناسبة للتعديلات الكبيرة و وجدت انه من الأسهل كتابة التطبيق من الصفر بدل من تعديلة بهذه الطريقة.

لا يزال التطبيق يعمل إلى الآن ويؤدي المطلوب، مع أن لدي عدد من الأفكار للتطوير لكن ليس لدي الوقت الكافي لبدء المشروع من الصفر خاصة أن تصميم الواجهات الرسومية يعتبر من نقاط الضعف لدي وتستغرق مني وقت طويل، لذلك لا أتوقع أن اعمل عليه في الوقت الراهن لكن إذا لدى احد رغبة في العمل فأنا مستعد للمساهمة وتقديم جميع الأفكار اللازمة لتنفيذ التطبيق.

هاتف Nokia 7.2

قبل الحديث عن الهاتف سوف أتحدث عن الشركة، نوكيا شركة غنية عن التعريف لكني بصدد الحديث عنها مع هواتفها التي تعمل بنظام أندرويد. ما يميز أجهزة نوكيا عن غيرها هي اهتمام الشركة بها حتى بعد إصدارها حيث تعتبر الشركة أفضل شركة بعد قووقل في إصدار تحديثات الأجهزة الأمنية وكذلك إصدار تحديثات النظام السنوية، فبناء على تقييم العديد من المواقع تحتل Nokia المركز الأول تليها Samsung ثم Asus ثم OnePlus.
عند تشغيل الجهاز للمرة الأولى وصل تحديث للنظام بحجم 1.5GB ثم تلاه مباشرة تحديث أمني الخاص بشهر فبراير بحجم 64MB [اضغط على الصورة لتكبيرها]
إضافة إلى التحديثات السريعة للأجهزة فأجهزة نوكيا تعتبر من الأجهزة القليلة التي تأتي بنظام أندرويد خام، أي بدون تعديلات الشركات المصنعة التي ما تثقل النظام وتزيد من مشاكلة التقنية والأمنية، هذه الخاصية قد لا تعجب الجميع فهناك من تعجبه التعديلات التي تقوم بها بعض الشركات لكن شخصيا لا احبها واجدها دائما عائق أمام الشركات نفسها في إصدار التحديثات بشكل سريع وكذلك تغيير تجربة المستخدم الموجودة في الأندرويد الخام.
اطلق جهاز Nokia 7.2 بنسخة Android 9.0 (Pie) و تقوم الشركة بدعم التحديثات لمدة سنتين من إطلاق الجهاز فقد وعدت الشركة بإصدار التحديث للنسخة Android 10 في الربع الثاني من عامل 2020 (كان متوقع إصدار التحديث في الربع الأول لكن الشركة أعلنت تأجيل الموعد) ~ وتم إصدار تحديث لنسخة Android 10 ومتوقع كذلك أن يصدر للجهاز التحديث الذي يليه وهو Android 11، كما يتم إصدار التحديثات الأمنية لسنة إضافية (أي ثلاث سنوات منذ إطلاقه) كما تقوم نوكيا بإصدار تحديثات بشكل دوري لحل المشاكل التقنية والأمنية في النظام.

مواصفات الجهاز الفنية

يتمتع الجهاز بمواصفات عالية في الكثير من الخصائص بينما يعتبر المعالج من الفئة المتوسطة ولا يعتبر ذلك عائق عند تشغيل البرامج وحتى الكثير من الألعاب الرسومية. [اضغط على الصورة لتكبيرها]
كما يعتبر تصميم الجهاز قوي وجميل وبسعر جداً مناسب (سعر نسخة 128GB أثناء كتابة هذا التقييم 849 ريال لدى مكتبة جرير).
يوجد في جانب الجهاز الأيمن زري الصوت وزر الطاقة، ويتميز زر الطاقة بوجود ضوء خاصة بالتنبيهات في داخل الزر
وفي الجانب الآخر نجد زر خاص باستدعاء مساعد قووقل (Google Assistant) لتنفيذ بعض الأوامر أو البحث عن معلومات بشكل سريع.
في أعلى الجهاز نجد منفذ السماعات والذي يعتبر شيء نادر وللأسف في الأجهزة الحديثة، كما يستفاد من المنفذ عند تشغيل راديو FM المدمج في الجهاز إذ يستخدم سلك السماعات كهوائي لالتقاط الموجات.

ماذا ينقص الجهاز

المواصفات السابقة التي ذكرتها عند مراعاة سعر الجهاز تعتبر ممتازة جداً لكن لو قارنت الجهاز بأجهزة أخرى أغلى ثمنا فنجد أن الجهاز يفتقد إلى تشغيل الأصوات الثنائي السماعات Stereo إذ يتم استخدام السماعة في الأسفل للأصوات العالية والسماعة في الأعلى للمكالمات فقط، كما يفتقد الجهاز إلى خاصية الشحن السريع إذ تعتبر سرعة الشحن متوسطة. كما أن الجهاز يقوم بخفض سرعته عند تشغيل بعض الألعاب الثقيلة بشكل مطول نظراً لارتفاع حرارة المعالج، مع أن هذا يعتبر شيء طبيعي لكن تتفوق بعض الأجهزة في عملية تصريف الحرارة بحيث يمكن تشغيل الجهاز بسرعته العالية لفترات أطول.

الوان الجهاز

يأتي الجهاز بثلاث ألوان: لون سماوي أخضر يتموج حسب زاوية الرؤية ولون رمادي غامق ولون أبيض ثلجي كما في الصورة [اضغط على الصورة لتكبيرها]

تقييم سرعة الجهاز

كما ذكرت سابقا فالمعالج المستخدم في الجهاز يعتبر من الفئة المتوسطة ومن غير المستغرب أن تكون نتائج أختبارات السرعة متواضعة إذا ما قارناها بالأجهزة الاخرى مثل Oneplus 7T Pro أو Asus ROG Phone 2.
نتائج اختبارات السرعة لهذا الجهاز هي كالتالي:

  • اختبار AnTuTu: 179975
  • اختبار 3DMark: 1346
    وفي الفيديو التالي نرى تجربتي الفعلية مع بعض الألعاب (تم تحديد افضل الخيارات الرسومية في جميعها):
  • إفصاح: الجهاز قدم لي بالمجان لتقييمه، لكن راعيت في ما كتبت هنا الحيادية والإنصاف.

تردني العديد من الاستفسارات خاصة من المبتدئين في مجال الأمن السيبراني عن الشهادات الاحترافية المعترف بها عالميا والتي تخدمهم في الاحتراف في المجال وكذلك زيادة فرص الحصول على وظائف أو ترقيات.
يعتبر مجال اﻷمن السيبراني من أكثر المجالات نمواً وتطوراً هذه الأيام ونسبة الطلب على موظفي هذا المجال عالية جداً لكن في نفس الوقت الأغلب يبحث عن مؤهلين بخبرات مميزة وذلك لحساسية تلك الوظائف والنتائج الوخيمة التي قد تنتج عن أخطاء العاملين فيها. لذلك نجد حالياً عدد كبير من الأشخاص يحملون شهادات في أمن المعلومات (أو الأمن السيبراني كلاهما نفس التخصص) مع أنهم لا يزالون طلاب أو حديثي تخرج.

الشهادة في الحقيقة ليست المغزى الذي تبحث عنه شركات التوظيف، إنما العلم المتوقع من حاملها وقد تجد عدد من الطلاب من من يحمل علم متميز بدون شهادات لكن للأسف يصعب اكتشاف مواهبهم إذا لم يقوموا بأعمال تبرزها كنشاطات داخل الجامعة في أندية ومسابقات أو مشاركات ملموسة على الإنترنت ووسائل التواصل الاجتماعي.

أسهل طريقة لفرز المتقدمين على الوظائف ومقارنتهم قبل المقابلة هي بمستوى التحصيل العلمي والشهادات خاصة كما ذكرت في حال ان المتقدم لم يذكر في سيرته أي خبرات ونشاطات تدعم موقفة مقابل المتقدمين الآخرين.

في الصورة التالية ستجدون تقسيم جميل للتخصصات الفرعية في مجال أمن المعلومات وفي كل تخصص تجدون الشهادات التي تخدم ذلك المجال مرتبة حسب المستوى من الأسفل (المبتدئين) إلى الأعلى (المحترفين) [قم بالضغط على الصورة لفتح النسخة الكبيرة]:
شهادات أمن المعلومات

الترتيب يعبر عن رؤية معد الصورة وقد يختلف البعض معها لكنها بشكل عام ممتازة وانصح بها

إضافة للصورة السابقة هنا ملف بتنسيق سهل يوضح الشهادات المناسبة لكل مجال وحسب مستوى المتعلم، من مرحلة مبتدئ بالأسفل إلى مرحلة الاحترافية في أعلى الملف (اضغط على الصورة لفتح ملف pdf):
شهادات أمن المعلومات

مقدمة

خدمات توزيع المحتوى وتسمى بالانجليزية Content Delivery Network أو Content Distribution Network و اختصارها CDN هي خدمات تسريع التصفح وتقليل الضغط على مواقع المشتركين وكذلك حمايتها ضد هجمات الإغراق وهجمات أخرى.

الفكرة الأساسية خلف هذه التقنية هي إن الشركات التي تقدم هذه الخدمة تمتلك خوادم باتصال إنترنت سريع وموزعة حول العالم، تحتفظ تلك الخوادم بنسخ من الملفات التي يقدمها الموقع المشترك (cache) وتقدمها لمن يطلبها دون الرجوع للخادم الأساسي قدر المستطاع.
تتضح اهمية هذه الخدمة عندنا يحتوي موقع ما على ملفات كثيرة أو كبيرة يحتاجها عديد من زوار الموقع حول العالم، فبدلا من أن يكون الحمل بالكامل على الخادم يتم توزيع الحمل على عدد كبير من الخوادم.
كما توفر هذه الطريقة حماية من هجمات الإغراق، إذ عندما يحاول أحدهم مهاجمة موقع ما فإن هجومه في الحقيقة قد لا يصل للخادم الحقيقي ويتم اعتراضه وإيفاقه لدى خوادم التوزيع. ويحتاج المهاجم إلى هجوم قوي جداً للإطاحة بالمواقع المحمية بهذه التقنيات.

فوائد إضافية

بعض الشركات مثل Cloudflare تقدم خدمة مجانية تناسب المستخدم العادي وبإمكانات محدودة، لكن لديهم باقات باشتراكات للشركات وبمميزات حماية أعلى وبمميزات إضافية. بعض المميزات توفر تقنيات حماية اضافية مثل ايقاف هجمات حقن قواعد البيانات (SQL injection) و هجمات XSS وتقديم إحصائيات الزوار وعدد من التقنيات التي تحاول الشركات التميز عن غيرها بها.

انا استخدم الباقة المجانية مع مدونتي هذه واجدها مناسبة جدا لي وتخفف الحمل عن خادمي لذا لا أحتاج للاشتراك بخادم ذو مواصفات عالية.
وتوجد شركات مختلفة منها Cloudflare و Akamai و BootstrapCDN و CacheFly و Amazon CloudFront

ضروري قبل تطبيقها

نقطة مهمه أرى من الضروري الالتفات لها عند تقرير استخدام التقنية من عدمه ألا وهي أن جميع ما يرسل لموقعك يمر بخوادم الشركة التي تقدم خدمة توزيع المحتوى ويستطيعون الاطلاع عليه.
حتى وإن كان الموقع مشفر (https) إذ أنت أمام خياريين أولها استخدام شهادات التشفير الخاصة بالشركة (وهذا غالبا هو الخيار الوحيد مع الاشتراك المجاني) أو أن تقدم مفتاحك الخاص لهم ليقوموا بفك الطلبات الواردة وفهمها من أجل أن يتمكنوا من الرد عليها. لذلك لا أنصح باستخدام هذه التقنيات اذا كانت الموقع يتعامل مع بيانات سرية أو حساسة أو شخصية.ة

البدايات البسيطة

بداياتي مع المواقع الشخصية كانت من خلال موقع صممته باستخدام ملفات html بسيطة وواجهات وصفحات بدائية لكن سرعان ما اكتشفت وجود تقنيات إدارة المحتوى تسهل العمل وتتولى التصميم وتكوين بنية الموقع وكل ما علي هو كتابة المقالات فقط فكانت بدايتي مع برمجية Mambo وقمت بإعداداتها وتجهيزها وإطلاق مدونتي بشكلها الاحتراف لكن مع مرور الزمن بدأت المشاكل حيث تبين لي انني اقضي معظم الوقت في صيانة وتحديث المدونة بدل من الكتابة بها فكان القرار هو الانتقال إلى برمجية Joomla حيث كما اذكر كانت تتفوق على السابقة بكونها أسهل في عملية تحديث الإضافات لكن ذلك لم يدم طويلا كذلك. كلا البرمجيتين كانتا جيدة لكن مقالاتي لم تكن بذلك التنوع والتفرع الذي يتطلب برمجيات معقدة علاوة على كون أعمال الصيانة لا تزال أكثر عباً من كتابة المقالات.

دخول عالم Wordpress

بعد سنوات سمعت عن برمجية Wordpress وسهولة التعامل معها وبساطة واجهتها وسرعتها كذلك فكانت هي الانتقال التالي حيث بقيت استخدمها لسنوات طويلة، وخلال تلك السنوات قمت بتطوير إضافتين لها لدعم كتابة مقالات باللغة العربية، الأولي كانت WP-RTL لتسهيل كتابة مقالات باللغتين العربية والانجليزية ثم تلتها لاحقا إضافة Per Post Language والتي تمكن مستخدمها من كتابة مقالات بلغات مختلفة في المدونة الواحدة. كانت الأمور تسير على ما يرام نوعا ما، لكن مع الهواجس الأمنية وتعدد الثغرات التي تكتشف في برمجية الووردبريس نفسها أو في إحدى إضافاتها لم أكن مرتاح للوضع وفي نفس الوقت ليس لدي وقت لمتابعة التحديثات أولا بأول. فبعد التفكير اقتنعت أنه قد حان الأوان للتغيير مره أخرى.

العودة للصفحات الثابتة و html

ليس هناك ما هو أفضل من الصفحات الثابتة الغير ديناميكية (static pages) وذلك لعدة اسباب منها:

  • أكثر أماناً وبشكل كبير
  • أسرع في التصفح وأخف على الخادم
  • أسهل في التعامل وتحديث المحتوى والنقل
  • لا تحتاج إلى قاعدة بيانات
  • أسهل في عمليات النسخ الاحتياطي والاسترجاع

لكن في نفس الوقت هي اصعب في تحديث التصميم (theme) في تنسيق المحتوى واضافة الصور والروابط …الخ. لكن وجد حلولا وسطية الاوهي برمجيات ديناميكية تقوم بإنتاج صفحات ثابتة. بمعني أنها مشابهة نوعا ما لأسلوب عمل المدونات الاعتيادية كالووردبريس فاستطاع اختيار التصاميم والتبديل بينها بسهولة، كتابة المقالات بتقنيات سهلة مثل markdown وعند الانتهاء أفوم بإنتاج الملفات النهائية على صيغة html وملحقاتها من ملفات التصاميم والسكربت والصور وارفعها جميعا على الخادم.
فالبرمجية نفسها استطيع تركيبها على حاسوبي الشخصي وفقط ارفع المخرجات على الخادم. وهو ما اقوم به حاليا أثناء كتابة هذه المقالة.

اختيار المدونة المناسبة

يوجد عدد لا بأس به من برمجيات المواقع الثابتة وقمت بمقارنة ثلاث منها وهي Hexo و Hugo و Jekyll. جميعهم مجاني ومفتوح المصدر وبمزايا متشابه لكن بعض الاختلافات البسيطة جعلتني أختار هيكسو (Hexo) واحد اهم هذه الاختلافات هي كون هيكسو مكتوب بلغة جافا سكريبت js وهي لغة اتقنها واجيد التعامل معها في حال احتجت إلى عمل تعديلات أو إصلاح مشاكل بينما الآخرين كتبوا بلغات لا اتقنها. كما أن تثبيتها وتثبيت الإضافات والتحديثات يتم بأوامر سهلة باستخدام npm.

لتثبيت هيكسو من سطر الأوامر اتبع التالي:

1
2
3
4
5
npm install hexo-cli -g
hexo init blog
cd blog
npm install
hexo server
  • تحتاج قبلها إلى تثبيت Node.js و Git

ماهو السيبراني Cyber

قبل الحديث عن الأمن السيبراني لنعد قليلا إلى الوراء لنتعرف على اصل ومعنى كلمة سيبراني. الكلمة تعتبر ترجمة حرفية لكلمة Cyber والمشتقة من كلمة Cybernetics والتي استخدمت في الماضي للدلالة كيفية تواصل اﻵلات والكائنات الحية مع بعض وتحكمها. ومن تلك الكلمة نشأت مصطلحات كثيرة استخدمت في قصص و أفلام الخيال العلمي مثل مصطلح Cyberspace أو الفضاء السيبراني والذي يستخدم عادة للإشارة إلى الإنترنت وشبكات الاتصالات وكأنها فضاء وهمي أو افتراضي. ومؤخرا استحدثت بعض المصطلحات المبنية على كلمة سيبراني مثل:

  • مقهى إنترنت (Cybercafé) وهي المحلات التجارية التي تقدم خدمة الإنترنت.
  • الجرائم السيبرانية (Cybercrimes) ويقصد بها الجرائم التي تحصل عن طريق الإنترنت والحواسيب.
  • الحرب السيبرانية (Cyberwar) أو الهجوم السيبراني (Cyberattack) وتعني التعدي على شبكات وحواسيب ومعلومات بقصد السرقة أو التخريب و التدمير وقد تحصل بين دول أو جماعات أو أفراد كذلك.
  • الإرهاب السيبراني (Cyberterrorism) هو استغلال الإنترنت وتطبيقاتها لتهديد شخصيات معينة أو تدمير بنى تحتية بدوافع سياسية أو عقدية.
  • الأمن السيبراني (Cybersecurity) وهو المصطلح الأكثر تداولا في وقتنا الحاضر والذي يدل على كل ماهو متعلق بحماية الشبكات والبيانات الرقمية والأجهزة المتصلة بها.

* التعاريف السابقة ليست دقيقة 100% فجميعها تم استحداثها من قبل صحفيين أومختصين أو حتى مؤلفي كتب الخيال العلمي، لذلك تجد اختلافات في تحديد وتعريف معانيها بين شخص وآخر.

الفرق بين أمن المعلومات والأمن السيبراني

أمن المعلومات يشمل حماية المعلومات الرقمية وغير الرقمية وحماية جميع ما يتعلق بهما كحماية الحواسيب والشبكات وكذلك غرف حفظ البيانات وكذلك حماية ملفات البيانات الحقيقية (الورقية وليس فقط الرقمية). بينما الأمن السيبراني يهتم فقط بحماية البيانات الرقمية وما يتعلق بها. لذلك نجد أن أمن المعلومات اشمل واعم من الأمن السيبراني في مجال حفظ البيانات. بينما يرى البعض أن الأمن السيبراني يشمل بعض الأمور التي لا تندرج تحت أمن المعلومات كحماية البنى التحتية مثل شبكات الماء والكهرباء والتي تشغل حاليا عن طريق الحواسيب وكذلك الصواريخ الحربية والمعدات الطبية وأيضا السيارات الحديثة خاصة السيارات التي تعمل بدون سائق و التي أصبحت تعتمد على الإنترنت والشبكات بشكل اكبر وكذلك حماية أنترنت الأشياء والتي تشمل مثلا كاميرات المراقبة الرقمية وبعض الأجهزة المنزلية الذكية. فلو افترضنا أن منزلا يحتوي على فرن طبخ ذكي يمكن التحكم به عن طريق الجوال، فأنت في هذه الحالة لا تهتم بحماية معلومات الطبخ الخاصة بالمستخدم بقدر ما تهتم بحماية الفرن نفسه من أن يستغل من قبل المخترقين لإحراق المنزل.

الكثير منا يعرف الصور النقطية لأنها هي الأكثر انتشار والمستخدمة في صور الكاميرات وغيرها خاصة الصور ذات الامتدادات مثل BMP و JPG و GIF و PNG لكن هناك نوع آخر يسمى الصور المتجهة وتستخدم في التصاميم والمنشورات وغالبية المواد المعدة للطباعة وكذلك بعض الرسومات الكرتونية.
هذا الفيديو يبين الفرق بينهما ونقاط القوة لكل منها لكي يتعلم المشاهد متى يستخدم احدهم بدلا من الآخر:

مقارنة بين انواع الصور الرقمية

أنواع المفاتيح العامة (مفتاح خاص و آخر عام ينشأ باستخدام Curve25519)
  • مفتاح التعريف، يتم إنشاؤه أثناء تركيب التطبيق.
  • مفتاح ابتدائي، ينشأ أثناء التركيب و يجدد بشكل دوري وموقع بواسطة مفتاح التعريف.
  • مفاتيح الاستخدام الواحد، تنشأ حسب الحاجة.
أنواع مفاتيح الجلسة (مفاتيح تماثلية)
  • مفتاح رئيس.
  • مفتاح تسلسلي، ينشأ بالمفتاح الرئيس.
  • مفاتيح الرسائل، تنشأ بالمفاتيح التسلسلية.

عند تركيب التطبيق يقوم البرنامج بإرسال المفاتيح العامة لكل من مفتاح التعريف والمفتاح الابتدائي ومجموعة من مفاتيح الاستخدام الواحد لخوادم الواتساب. يحتفظ الخادم بهذه المفاتيح مع حساب المستخدم. المفاتيح الخاصة تبقى دائما مع المستخدم فقط.

إعداد جلسة المحادثات بين طرفين

المراسلات في نظام التشفير الجديد كلها مشفرة وذلك يشمل رسائل الإعداد الأولي ولتحقيق ذلك يقوم المرسل باستخدام المفاتيح العامة للمستقبل والتي يحصل عليها من خادم الواتساب¹. يرسل الخادم للمرسل مفاتيح المستقبل وهي مفتاح التعريف ومفتاح ابتدائي و أحد مفاتيح الاستخدام الواحد². فيقوم المرسل باستخدام مفاتيحه الخاصة و مفاتيح المستقبل العامة لإنشاء المفتاح السري (باستخدام بروتوكول ECDH) ويستخدم المفتاح السري في عملية تشفير الرسائل قبل إرسالها للمستقبل. كما يقوم المرسل بإرفاق مفاتيحه العامة مع الرسائل الأولى إلى أن يتم إنهاء إعداد الجلسة. عندما تصل الرسائل للمستقبل يقوم باستخدام مفاتيحه الخاصة والمفاتيح العامة للمرسل والتي أرسلت له مع الرسالة وينشئ منها نفس المفتاح السري الذي أنشاءه المرسل (هذه هي عبقرية بروتوكول ديفي-هيلمان) ومن ثم يقوم باستخراج المفتاح الرئيس كما فعل المرسل ويستخدمه في عملية فك تشفير الرسائل وبهذا تكون الجلسة قد أعدت بين الطرفين وكلاهما يحمل مفاتيح تشفير الرسائل.

تشفير الرسائل

لكل رسالة تنشأ مفاتيح تشفير جديدة لدى الطرفين ولها هذه المميزات:

  1. المفاتيح لدي الطرفين متشابهة (شكرا لبروتوكول ديفي-هيلمان)و تنشأ من مفاتيحهم العامة والخاصة.
  2. مفتاح كل رسالة مستقل عن ما قبله وما بعده، فضياع الرسالة لا يوثر على سير التراسل. واكتشاف احد المفاتيح لا يمكن من فك تشفير الرسائل السابقة.
  3. لا يمكن استنباط المفاتيح الأصلية من مفاتيح الرسالة.
  4. المفتاح يستخدم لتشفير رسالة واحدة فقط ولا يعاد استخدامه؟

هذه المميزات تجعل عملية ربط رسالة مشفرة بمرسل معين مستحيلة، فالتحقق من صحة الرسالة ممكن لكن التحقق من هوية المرسل مستحيلة وهذه مفيدة في حال المراسلات الحساسة والتي يخشى فيها المرسل مثلا من محاكمته واتهامه بإرسال تلك الرسائل. لكن في نفس الوقت هذه الميزة تجعل عملية التحقق من هوية الطرف الآخر مستحيلة لذلك يتم استخدام مفتاح الاستخدام الواحد** وكذلك خاصية التحقق من خلال تطبيق الواتساب ومطابقة رمز التحقق يدويا مع الطرف الآخر لتجاوز هذه الثغرة. ملفات الوسائط (الفيديو والصور و الصوت) والمستندات يتم تشفيرها بنفس الأسلوب. وعند استقبال ملف من شخص وتمريره لشخص آخر تتم عملية تشفير الملف بمفاتيح خاصة بالشخص اﻵخر وإرسال الملف المشفر من جديد.

تشفير رسائل المجموعات

بأسلوب مشابه تقريباً لطريقة المراسلات بين طرفين يقوم المرسل عند إرسال رسالته الأولى بإنشاء جلسة للمجموعة وذلك بالتخاطب مع جميع أعضاء المجموعة كل على حدة وبتشفير مختلف عن الآخرين ويرسل لهم مفتاح موحد خاص به يسمى مفتاح المرسل. يقوم المرسل بعدها باستخدام ذلك المفتاح لإنشاء مفاتيح التشفير لكل رسالة (مفتاح تسلسلي ومفتاح الرسالة) ويستخدم تلك المفاتيح لتشفير رسائله وإرسالها للخادم والذي بدورة يقوم بتوزيع تلك الرسالة لجميع أعضاء المجموعة. جميع الأعضاء يملكون مفتاح المرسل فيقومون باستخدامه لاستخراج المفاتيح التي تتيح لهم فك تشفير تلك الرسالة والرسائل القادمة. عندما يقوم احدهم بمغادرة المجموعة يقوم بقية الأعضاء بمسح جميع مفاتيح المرسلين وإعادة إنشاء جلسات المجموعة من جديد.

التخاطب مع الخادم

بالإضافة لتشفير الرسائل بين المستخدمين فإن تطبيق الواتساب (في أجهزة الاندرويد والايفون والويندوز فون فقط) يقوم كذلك بتشفير قناة الاتصال مع الخادم وذلك يمنع من لديهم القدرة على التجسس على الشبكة من معرفة مالذي يقوم به المرسل ومع من يتحدث.

هل نثق في التطبيق الآن؟

يوفر تطبيق الواتساب خيار يمكن تفعيلة من خلال صفحة إعدادات الأمان لتنبيه المستخدم عندما يتغير مفتاح التعريف لأي من المستخدمين المعرفين لديه. ومفتاح التعريف يتغير عند تغيير جهاز الهاتف أو إعادة تركيب التطبيق أو قيام احدهم بانتحال شخصية الطرف الآخر لذا يجب التحقق من هوية الطرف الآخر ومطابقة رمز التحقق إذا كانت سرية المحادثة مهمة. * يصعب الوثوق في تطبيق الواتساب وتشفيره لعدة أسباب منها:

  1. كون التطبيق مغلق المصدر مما يصعب عملية التحقق من طريقة عملة ومطابقتها مع ما اعلن عن طريقة عمل بروتوكول التشفير.
  2. كون التطبيق لا يزال يدعم التراسل غير المشفر للتوافق مع الإصدارات القديمة التي لا تدعم التشفير وأن وعملية الانتقال للتشفير تمت بشكل تلقائي من الشركة بدون موافقة المستخدم أو القدرة على اختيار نوع التراسل فهذا يعني أن الشركة قادرة على تعطيل التشفير لشخص معين دون علمه. وبما أن التطبيق يدعم التراسل بالطريقتين فالتحقق من ما يقوم به التطبيق صعب ويحتاج مراقبة مستمرة.
  3. كون بروتوكول Signal مصمم في الأصل ليوفر خاصية الإنكار (repudiation وهو عكس non-repudiation) والتي تمكن المرسل من إنكار علاقته بالرسائل التي قام هو بإرسالها فإن عملية التحقق تعتمد على الثقة بخادم الواتساب بالإضافة لعملية مطابقة رمز التحقق يدويا من كلا الطرفين.

وضع الآمان في التطبيق بعد إضافة خاصية التشفير يعد افضل من السابق بمراحل عدة خصوصا للمستخدم العادي ويعتبر من أكثر الحلول المتوفرة أمناً في تطبيقات المحادثات المشهورة حالياً. أما من يبحث عن أمان مطلق فعليه استخدام أدوات ووسائل أخرى لا تتطلب الثقة بطرف ثالث أو استخدام عدة حلول بتقنيات مختلفة مع بعض.

المصادر: WhatsApp-Security-Whitepaper و whispersystems.org

¹ هذه احد نقاط الضعف في التشفير، إذ يجب الثقة في الخادم وان المفاتيح المرسلة تخص المستقبل الحقيقي.

² يقوم الخادم بحذف المفتاح بعد استخدامه ولا يقبل استخدامه مرة أخرى، وفي حال استنفذت جميع مفاتيح الاستخدام الواحد ولم يستطع الخادم طلب مفاتيح جديدة من المستقبل لعدم وجودة online فإن العملية تتم بدونها. وهذه نقطة ضعف أخرى إذ يستطيع المخترق استغلالها بإنشاء طلبات اتصال وهمية حتى تستنفذ جميع مفاتيح الاستخدام الواحد.

الكثير من الناس قد هجر النظام العجوز ويندوز XP لأسباب عديدة منها انه لم يعد متوفر في السوق والأجهزة الجديدة تأتي محلمة بالإصدارات الحديثة من ذلك النظام وكذلك بسبب إيقاف شركة مايكروسوفت الدعم لذلك النظام فلم يعد يستقبل التحديثات الأمنية وكل من لديه اهتمام ولو بسيط بأمن المعلومات يدرك مدى أهمية تلك التحديثات خصوصا لنظام مثل الويندوز.

لكن البعض قد يفضل استخدام XP بدلا من الإصدارات الأحدث لعدة أسباب منها كونه اخف واقل استهلاك لموارد الجهاز خصوصا في حال استخدامه كنظام وهمي (Virtual system) وكذلك كونه نظام قديم قد تلقى الكثير من التحديثات والاختبارات والترقيعات فغالبا سيكون اكثر أمنا واستقرارا من الإصدارات الجديدة والتي ما زالت تحتوي على العديد من المشاكل والثغرات غير المكتشفة وكذلك كونه لا يحتوي على إضافات مايكروسوفت الجديدة والتي تجمع وترسل بعض المعلومات عن المستخدم إلى خوادم الشركة كما في ويندوز 10.

مهما كانت أسباب اختيارك أو قناعتك بنظام XP فهناك طريقة تجعل النظام يستقبل تحديثات أمنية وبشكل رسمي من الشركة، وهذه الطريقة تعتمد على تغيير قيمة في سجلات النظام لتجعله يعتقد أنه نظام XP المخصص للأنظمة المدمجة كما في أجهزة البيع والأجهزة الطبية (Point of Service) إذ أن مايكروسوفت لا زالت تدعم تلك الإصدارة من النظام وذلك بسبب انتشارها في أجهزة كثيرة واستحالة تحديثها لإصدارات جديدة من نظام الويندوز.

التعديل سيجعل النظام يستقبل التحديثات والترقيعات بدون أن يؤثر في طريقة عمله وأنا شخصيا استخدمها منذ فترة طويلة وبدون مشاكل والكثير كذلك استخدموها ولم يواجهوا أي مشكلة. طريقة التعديل سهلة قم بإنشاء ملف نصي بامتداد reg مثلا xpupdate.reg واكتب بداخلة السطور التالية:

1
2
3
Windows Registry Editor Version 5.00 
[HKEY_LOCAL_MACHINE\SYSTEM\WPA\PosReady]
"Installed"=dword:00000001

ثم قم بتشغيل الملف (بالنقر عليه مرتين) بعدها اذهب لصفحة التحديثات (عن طريق متصفح إنترنت اكسبلورر) وقم بالبحث عن التحديثات (أو اتركها وسيقوم النظام بالبحث بشكل تلقائي فيما بعد) وستلاحظ أن أسماء التحديثات التي ستظهر بها كلمة WEPOS وذلك لأنها موجهة لذلك النظام.

هذه صورة تبين آخر التحديثات التي وصلت لي (بتاريخ اليوم، 22 مايو 2016):

تحديثات نظام ويندوز اكس بيتحديث نوفمبر 2017:

لا زالت التحديثات تصل لوندوز XP المعدل واحدثها وصل لشهر نوفمبر 2017 كما نشاهد في الصورة:

غالبية الألعاب وكذلك بعض التطبيقات تتطلب تحريك صور وشخصيات رسومية خلال الشاشة، تحريك الشخصيات يتم من خلال رسم الشخصية بحالات الحركة المطلوبة (sprite) ثم عرض تلك الرسومات واحدة تلو الأخرى لتعطي إيحاء الحركة كالصورة التالية: Animation Sprite وأما تحريك الخلفيات فغالبا يتم من خلال إنشاء صورة خلفية اكبر من حجم مساحة العرض ثم عرض جزء من الصورة وتغيير احداثياتها لتبدو كأنها تتحرك.

يوفر الاندرويد عنصر للصور (ImageView) لكن ذلك مخصص لعرض الصور الثابتة أو التي لا تتطلب تغييرات سريعة ولا يمكن استخدامه للصور المتحركة لأنه بطيء. للتعامل مع الصور المتحركة نحتاج إلى الرسم مباشرة على canvas (سطح الرسم) لكن توجد طريقة تبسط العملية وهي باستخدام عنصر SurfaceView والذي يمكنك من الرسم المباشر على canvas وبطريقة سهلة. عملية التحريك تحتاج أن تعمل في الخلفية لكي لا تعطل عمل التطبيق (لفهم عمليات الخلفية راجع الشرح السابق). لتنظيم العمل سنجعل النص الخاص بالحركة في كلاس (class) خاص سنسمية AnimGuy:

1
2
3
public class AnimGuy extends SurfaceView implements Runnable {
....
}

عملنا الكلاس كامتداد لكلاس SurfaceView وكذلك واجهة لكلاس Runnable وذلك لتشغيله في الخلفية كما سنرى لاحقا. في البداية نقوم بتحميل الصورة وهي عبارة عن ملف واحد مرسوم به إطارات متساوية في المقاس تمثل مراحل الحركة للشخصية (خطوات الركض). لدينا في تلك الصورة 6 إطارات فنحتاج عرضها واحد تلو الآخر إلى الأخير ثم نعود للإطار الأول وهكذا. الدالة run() هي التي نستخدمها لتحريك تلك الإطارات وهي تعمل في الخلفية. لنلقي نظرة على تلك الدالة:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@Override
public void run() {
while (animate) {
if (surfaceHolder.getSurface().isValid()) {
Canvas canvas = surfaceHolder.lockCanvas();

// Clear any existing drawing from previous run
canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);

x = frame * imgWidth;
Rect src = new Rect(x, 0, x + imgWidth, imgHeight);
Rect dst = new Rect(0, 0, imgWidth, imgHeight);
canvas.drawBitmap(guyImage, src, dst, null);

// This is a modulus operation to loop through all the frames and restart over
frame = ++frame % totalFrames;

surfaceHolder.unlockCanvasAndPost(canvas);
}

try {
Thread.sleep(120);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

نلاحظ أولا أننا نستخدم حلقة while بمتغير ثنائي animation للتحكم باستمرارية الحلقة، ونتحكم بقيمة هذا المتغير كما سنرى لاحقا لبدء ووقف التحريك. في داخل الحلقة نتأكد أولا من جاهزية السطح للرسم isValid() (في بعض الحالات مثل لحظة بدأ التطبيق لا يكون سطح الرسم جاهزاً بعد ومحاولة الرسم عليه ستؤدي إلى فشل التطبيق)، في حال كان جاهزاً نقوم بقفل السطح lockCanvas() لنظمن أن لا احد غير هذه الدالة يستطيع الرسم عليه. بعد ذلك نقوم بمسح محتوى سطح الرسم لكي لا تبقى به رسومات سابقة. نبدأ الآن بالرسم، أولا نحتاج رقم الإطار المراد رسمة وهو محفوظ في المتغير frame وفي البداية فيمته صفر فتكون الإحداثيات على المحور س تساوي صفر أي من أول الصورة. بعد ذلك نقوم بنسخ مساحة مستطيلة Rect من الصورة الأصلية تبدأ من س إلى س+عرض الإطار، أما الارتفاع (محور ص) فهو بكامل ارتفاع الصورة (يبدأ من صفر إلى ارتفاع الصورة). بعد ذلك نحدد المساحة التي سنرسم عليها dst في المثال هذا وللتبسيط جعلنا مساحة سطح الرسم مساوية لمساحة الإطار الواحد، لذلك فإن منطقة الرسم وحجمها يساوي المساحة الكاملة (يبدأ من الصفر إلى طول وعرض الإطار). نقوم الآن بالرسم بالأمر drawBitmap إذ نمرر له الصورة الكاملة ومعها إحداثياتها ومساحة الإطار المراد نسخة وكذلك إحداثياتها ومساحة المنطقة المراد الرسم عليها. نقوم بعدها بزيادة رقم الإطار ليكون جاهزا لعملية الرسم التالية (لحساب رقم الإطار نستخدم طريقة المعامل الرياضي فعدد الإطارات هو 6 فعندما يبلغ العداد ذلك الرقم يعود من جديد للعد من 0). في الأخير نقوم بفك القفل ورسم الإطار unlockCanvasAndPost. للتحكم بسرعة تحريك الإطارات نستخدم Thread.sleep() والتي تجعل عملية الخلفية تنام (أو تتوقف عن العمل) لمدة زمنية تحسب بأجزاء الثانية، فهذه القيمة تعتمد على عدد الإطارات وكذلك السرعة الحركة المناسبة. لرسم الإطار الذي يليه (رقم 1) نقوم بنفس الخطوات وإحداثيات الإطار تبدأ من نهاية الإطار السابق.

لاستخدام هذا الكلاس نهيئه أولا من الكلاس الرئيسي بالأمر التالي:

1
animGuy = new AnimGuy(this);

ويتم تشغيل وايقاف الحركة بالأمرين التاليين:

1
2
animGuy.resume();
animGuy.pause();

التطبيق الكامل (تجده هنا) فيه تنفيذ المثال المشروح هنا وكذلك تجد فيه كلاس لمشهد تحريك متكامل (كما في الفيديو بالأعلى) يشمل الشخصية السابقة وكذلك أرضية تتحرك بالاتجاه المعاكس وخلفية تتحرك كذلك بالاتجاه المعاكس لكن بسرعة اقل لتعطي إيحاء بالبعد. بالنسبة للأرضية فهي صورة لإطار واحد، نقوم أولا بتكراره إلى أن يملا عرض الشاشة ثم نقوم بتحريكه قليلا في الاتجاه المعاكس لحركة الولد إلى أن يصل الإطار الأول لطرف الشاشة ثم نعيده لموقعة الأول. أما بالنسبة للخلفية فنقوم أولا بتعديل حجمها ليناسب حجم سطح الرسم ثم نقوم بعمل مشابه لما قمنا به للأرضية.

للاستفسار عن هذا الشرح أو التطبيق يمكنك مراسلتي على تويتر

مصدر الصور: (الولد ) (الخلفية )

عند تنفيذ تطبيق الاندرويد يتم إنشاء عملية أساسية تسمى UI Thread وهي المسؤولة في تنفيذ أوامر التطبيق وعرض النتائج على الشاشة وكذلك الاستجابة لعمليات المستخدم مثل الضغط على الأزرار والكتابة …الخ. في التطبيقات البسيطة تكون تلك العملية قادرة على أداء المهمة بشكل جيد لكن توجد حالات كثيرة يحتاج فيها مطور التطبيق إلى إنشاء عمليات إضافية لكون العملية الأساسية UI Thread غير كافية.

لنفرض مثلا أن التطبيق يقوم بتحميل ملف ويعرض نسبة التحميل على الشاشة بشكل مباشر فهذا يعني أننا نحتاج إلى مراقبة حالة الملف وتعديل البيانات المعروضة على الشاشة بشكل مستمر، لو نفذنا هذه الخطوات باستخدام العملية الأساسية فستجد أن التطبيق سيصبح مشغول في حلقة برمجية (loop) لمراقبة عملية تحميل الملف وتعديل بيانات العرض ولن يكون هناك وقت للتعامل مع المستخدم أو بقية أجزاء التطبيق بمعنى أن التطبيق سيكون في حالة عدم استجابة إلى أن يكتمل الملف وتنتهي الحلقة البرمجية. وستلاحظ كذلك أن حالة تحميل الملف الظاهرة على الشاشة لن تتحدث وستكون صفر عند البداية وستبقى كذلك إلى أن يكتم التحميل وستقفز فجأة إلى 100% والسبب أن العملية الأساسية كما ذكرنا مشغولة بعملية التحميل ولا تستطيع تحديث شاشة التطبيق ليرى المستخدم نسبة تحميل الملف. نفس المشكلة لو كان البرنامج عبارة عن ساعة زمنية أو يقوم بتحريك رسومات أو لعبة.

الحل سهل، وهو بإنشاء عملية أخرى تعمل في الخلفية تقوم هي بمتابعة عملية تحميل الملف وترسل تحديثات عن حالة التحميل إلى العملية الأساسية وهذه العملية تسمى AsyncTask وتعني العملية غير المتزامنة لأنها تعمل بشكل مستقل عن العملية الأساسية.

عند إنشاء تلك العملية تحتاج أن تحدد لها أنواع القيم المستخدمة حسب الترتيب التالي:

  1. نوع القيم التي سترسل للعملية
  2. نوع القيم التي سترسلها العملية إلى العملية الأساسية
  3. نوع قيم النتيجة النهائية

تلك الأنواع ليست ضرورية بل حسب حاجة التطبيق وفي حال عدم الحاجة نكتب مكانها Void. للعملية التزامنية 4 دوال كالتالي:

  • onPreExecute() تعمل في العملية الأساسية قبل ابتداء العملية الخلفية وهي اختيارية
  • doInBackground(Params) هذه هي الدالة الأهم إذ هنا ننفذ النص الذي نريد أن يعمل في الخلفية ومنه يمكن تنفيذ الأمر publishProgress(Progress) لإرسال التحديثات للعملية الأساسية.
  • onProgressUpdate(Progress) هذه الدالة تعمل في العملية الأساسية وتستقبل ما يتم ارسالة من العملية التي تعمل في الخلفية وتستخدم لتحديث البيانات وعرضها للمستخدم وهي اختيارية.
  • onPostExecute(Result) دالة اختيارية تعمل في العملية الأساسية بعد انتهاء العملية الخلفية وتستخدم الاستقبال الناتج النهائي.

سأعرض مثال بسيط واشرحه، المثال عبارة عن دالة اسمها startAsync يمكن تنفيذها بضغطة زر مثلا. الدالة تتعامل مع ثلاث عناصر في واجهة التطبيق، عنصري (textView3 و textView4) و شريط تقدم (progressBar2).

قبل تنفيذ العملية الخلفية يقوم البرنامج بتغيير عنصر نص3 إلى كلمة “بدأ” ثم يتم إنشاء عملية غير تزامنية جديدة حيث تقوم في الخلفية بالعد من 1 إلى 50 كل 100 جزء من الثانية و وإرسال الرقم الحالي إلى العملية الأساسية عن طريق publishProgress والتي بدورها تستدعي onProgressUpdate لكتابة ذلك الرقم في عنصر نص4 وكذلك تحديث نسبة الشريط المتقدم بنفس قيمة الرقم. ثم بعد النص الخاص بالعملية الخلفية نقوم مرة أخرى بتغيير عنصر نص3 والذي كتبنا به كلمة “بدأ” إلى كلمة “خطوة 2”. هذا هو النص البرمجي واسفل منه سأذكر الناتج من تنفيذه. (رابط مباشر للنص)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public void startAsync(View view) {
final TextView textView3 = (TextView) findViewById(R.id.textView3);
final TextView textView4 = (TextView) findViewById(R.id.textView4);
final ProgressBar progressBar2 = (ProgressBar) findViewById(R.id.progressBar2);

textView3.setText("بدأ");
new AsyncTask<Void, Integer, Void>() {
@Override
protected Void doInBackground(Void...nothing) {
for (int i=1 ; i<51 ; i++) {
publishProgress(i);
SystemClock.sleep(100);
}
return null;
}
protected void onProgressUpdate(Integer... value) {
textView4.setText(value\[0\].toString());
progressBar2.setProgress(value\[0\]);
};
}.execute();

textView3.setText("خطوه 2");
}

عند تنفيذ هذه الدالة ستجد أن عنصر النص4 بدأ بالعد من 1 إلى 50 بشكل منتظم وكذلك شريط التقدم يتزايد إلى أن يصل لقيمته القصوى 50 وكل ذلك دون التأثير على أداء التطبيق العام حيث يمكنك في نفس الوقت التفاعل مع التطبيق وسيستجيب بشكل طبيعي كالضغط على أزرار أو الكتابة …الخ. لكن لو تابعت عنصر نص3 في واجهة التطبيق ففي الغالب أنك لن ترى كلمة “بدأ” بل سترى كلمة “خطوة 2” بمجرد أن تكبس على الزر والسبب هو أن التطبيق كتب كلمة “بدأ” ثم قام بتشغيل العملية الخلفية لكنه لم ينتظر إلى أن تنتهي فلا حاجة لذلك بل قام مباشرة بإكمال تنفيذ النص وكتب كلمة “خطوة 2” لذلك لن تستطيع رؤية كلمة “بدأ” لأنها استبدلت بسرعة.

التطبيق الكامل يحتوي على جزئين، الجزء الاول يقوم بالعد الى 50 لكن باستخدام العملية الأساسية (الواجهة) فتجد التطبيق يتجمد ولا يمكن ضغط اي زر فيه ولا يتم تحديث العداد ولا شريط التقدم. بينما الجزء الثاني من التطبيق يستخدم AsyncTask للعد في الخلفية وارسال حالة العداد الى الواجهة ليتم تحديثها فتجد البرنامج يعمل بشكل تفاعلي كما في الصورة المتحركة التالية:

AsyncTask

النص الكامل للبرنامج موجود هنا https://github.com/fduraibi/AsyncTask_Example

ويمكنك الحصول على البرنامج (ملف apk) للتجربة من هنا https://github.com/fduraibi/AsyncTask_Example/releases/latest

هل تكتب مقالات بلغات متعددة؟
هل ترغب في أن تتغير لغة المدونة لتطابق اللغة المستخدمة في المقالة؟

مع هذه الإضافة يمكنك تغيير لغة المدونة لتطابق اللغة التي تحددها لكل مقالة. ففي حال كانت مدونتك باللغة العربية فستكون الواجهة والقوائم كذلك بالعربي لكن لو كنت تكتب كذلك مقالات بلغة أخرى كالانجليزية مثلا فستظهر المقالة للزوار بالانجليزية لكن قوائم المدونة ستضل باللغة العربية، لكن مع هذه الإضافة يمكنك تغيير ذلك بحيث تتغير لغة المدونة حسب اللغة التي حددتها للمقالة. تغير اللغة كذلك يشمل تغير الاتجاه للقراءة فللغة العربية سيكون الاتجاه من اليمين لليسار وللغات الأجنبية سيكون من اليسار لليمين.
أما الترجمات فستكون من الترجمات المقدمة مع الواجهة المستخدمة والإضافات الأخرى.

  • الإضافة لا تقدم أي ترجمة، إنما فقط تقوم باختيار الترجمة المناسبة والمدرجة مع الواجهة.
  • اللغات المتوفرة هي اللغات التي تتعرف عليها برمجية الووردبريس وتدعمها.
  • الإضافة تمكن من تغيير لغات المقالات (posts) والصفحات (pages) اما لغة الصفحة الرئيسة فهي تتبع اللغة الإفتراضية للمدونة.

رابط تحميل الإضافة من موقع ووردبريس

هذه بعض الصور التي تبين صفحة الإعدادات ونتائج العرض حسب اللغة:



Do you write posts in different languages?
Would you like your blog theme language to be the same as the language in which you wrote your post or page?

With this plugin you can set the language of your blog per post and also per page, that is if your blog is in English and you wrote a post or a page in Spanish or Arabic you can set the language of your blog to match that post’s or page’s language, so when your visitors open that post or page they will see your blog in that language. You don’t have to translate your theme and plugins if they come with translations and even it will change the direction of the view to RTL (Right-to-Left) if your language is RTL based.

  • The plugin does not provide any translations, it only changes the themes and plugins translation language if they provide there own translations.
  • The available languages are only the languages that WordPress already recognizes and supports.
  • The plugin only works for posts and pages, the front page will show in the blog default language.

Download the plugin from Wordpress site

Here are some screenshots of the plugin settings and results: