انتقال المدونة إلى العنوان الجديد

مايو 14, 2010

السلام عليكم ورحمة الله وبركاته

يتم حالياً نقل محتويات المدونة الى العنوان التالي

www.mathaheb.com

واية مواضيع جديدة سيتم إضافتها في الموقع الجديد , وأي تعليقات أو تساؤلات حول المواضيع المطروحة في هذه المدونة الرجاء طرحها في الموقع الجديد

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

وإلى لقاء قريب بإذن الله تعالى في الموقع الجديد

وإلى ذلك الحين , استودعكم الله والسلام عليكم ورحمة الله وبركاته


الميزات الجديدة للبرمجة غرضية التوجه المدعومة في الإصدار php5 الحلقة الأولى

ديسمبر 11, 2009

السلام عليكم ورحمة الله وبركاته

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

لن أطيل عليكم بالمقدمة وإليكم التفاصيل

مقدمة :

فقط مع الوقت سوف تدرك بأن php5  أفضل بكثير من الإصدارات السابقة لها.

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

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

سوف يغطي هذا الجزء كل من ا لنقاط التالية:

  • الميزات الجديدة المدرجة في اللغة
  • التمديدات المهمة المضافة إلى php – new concerning php extensions
  • بعض التغيرات الطفيفة التي تم إجرائها في الإصدار الجديد ولم تكن موجودة في الإصدار القديم.

ميزات اللغة

النموذج غرضي التوجه new object oriented model

لقد تم فعليا من الإصدارات السابقة وتحديداً من php3 إضافة مفاهيم البرمجة غرضية التوجه إلى اللغة لكنها لم تكن مدعومة بشكل جيد .

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

إن هذا الاستخدام الواسع النطاق  للبرمجة غرضية التوجه الموجودة في php4  بالرغم من ضعفها جعلها من أهم النقاط التي وجب التركيز عليها في الإصدار الحديث من php  أي في  php5.

من أهم نقاط الضغف التي كانت موجودة في النموذج القديم غرضي التوجه تكمن فيمايلي :

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

على سبيل المثال :

في الإصدار الرابع من php  ستكون النتيجة Andi . وذلك لأننا قد مررنا الغرض بالقيمة وليس بالمرجع ( عبر التابع changeName() ) , ولذلك فعليا سيتم نسخ نسخة مستقلة من ا لغرض والعمل عليها , وبالتالي فإن تأثير ا لتابع سيكون محصور فقط على نسخة من الغرض $person.

حيث أن السلوك المتبع فعليا في اللغة ليس سلوكاً بديهياً مثلما يتوقع أغلب المبرمجين الذين يتبعون أسلوب البرمجة غرضية التوجه – مثل مبرمجي جافا- حيث أنه في جافا يتم فعليا رصد مرجع – مؤشر – إلى ذلك الغرض , ولذلك فعندما يتم نسخه فإن المؤشر فقط هو الذي سيتم نسخه.

هنالك عدد من مستخدمي لغة البرمجة php 4  الذين كانوا مدركين لواقع هذه المشكلة ومتنبهين لها , ولكن كان في المقابل عدد اخر من المبرمجين غير منتبهين لهذه المشكلة  فتسببت لهم بالكثير من الارهاق وهم يحاولون البحث عن الأخطاء في زمازهم تلك الاخطاء التي لم يكونوا يعرفون مصدرها , وفي الواقع مصدرها كان تلك الثغرة في php 4

أما في php 5  فقد تمت عملية إعادة كتابة البنية التحتية للنموذج الغرضي ليتعامل مع مقابض الأغراض object handles  . أي اصبحنا نتعامل مع الأغراض باستخدام مؤشرات تشير اليها دون الحاجة إلى نسخ الغرض بشكل كامل من أجل العمل عليه , باستثناء الحالة التي نقوم بها بصراحة باستخدام الكلمة المفتاحية clone  التي نحصل بنتيجتها وباتباع عمليات معينة على نسخة مستقلة عن الغرض الأصلي الذي نتعامل معه.

في php 5  لا توجد حاجة إلى تمرير الأغراض بالمرجع أ و إسنادهم بالمرجع.

ملاحظة:

لا تزال كل من عمليتي إسناد الأغراض بالمرجع أو تمريرهم بالمرجع مدعومة في php 5  وذلك في الحالة التي ترغب فيها فعلياً بتغير محتوى المتحول ( سواء كان غرض أو نمط).

بعض الميزات الغرضية التوجه الجديدة.

إن عدد الميزات غرضية التوجه الجديدة التي تم إضافتها واسع جداً , لذلك فيما يلي سنقوم فقط بتعداد قائمة بالميزات الأساسية الجديدة فقط :

1 : معدلات النفاذ public / private /protected   بالمستخدمة بالنسبة لكل من الطرائق methods  والخواص properties .

مثال

2 : الباني __construct()

فبدلاً من أن يكون اسم الباني هو نفسه اسم الصف , فيجب التصريح عنه الآن بالكلمة __construct() ,

3: دعم تعريف عملية هدم الغرض عبر تعريف طريقة الهادم __destructor() method

تمكننا من تعريف الهادم الذي يعمل عندما يتم تهديم الغرض

4: الواجهات interfaces

مما يمكن الصف من تحقيق أكثر من علاقة واحدة من نمط is_a  .

حيث أن الصف يستطيع أن يرث من صف واحد فقط , ولكنه يستطيع أن يقوم بتحقيق implement  أكثر من واجهة واحدة.

5: عملية نسخة من instnaceof operator :

إن مستوى اللغة هنا يمكننا من القيام بالتحقق من العلاقات التي من النمط is_a   . حيث أن التابع  is_a() الذي كان مستخدما في php 4  قد تم شجبه الآن لتحل العملية التالية بداله:

وبهدا القدر ننهي الحلقة الأولى على أن نتابع لاحقا إن شاء الله

وإلى ذلك الحين نستودعكم الله والسلام عليكم ورحمة الله وبركاته


البرمجة غرضية التوجه مع php و mysql

يوليو 5, 2009

 

السلام عليكم ورحمة الله وبركاته

عملياً وبشكل أساسي أستخدم البرمجة غرضية التوجه أثناء برمجتي لمواقع الوب , فإذا ما اطلعتم على الكود البرمجي الخاص بأحد المواقع التي برمجتها لوجتموه بشكل أساسي مؤلف من مجموعة من الصفوف الخاصة بالتعامل مع الكتل الأساسية في الموقع , وقبل عدة أيام كنت أبحث عن بعض المواضيع المتقدمة في البرمجة غرضية التوجه وبشكل خاص بالنسبة ل php  , فوقعت يداي على بعض المواقع الرائعة التي تتحدث عن هذا الموضوع وتطبقه بشكل فعلي , وقد قمت بقرائتها بشكل مفصل وأعجبتني كثيراً , وجعلتني أغير كودي البرمجي الذي استخدمه في العادة بنسبة 80% ووفرت علي الكثير من الوقت والجهد, لذا فقد ارتأيت بأنه من واجبي أن أترجم لكم هذه المواضيع التي قرأتها , عسى ولعل أن يستفيد منها أحد غيري.

الموضوع السابق كان يتحدث عن البرمجة غرضية التوجه المتقدمة في php  , أما الموضوع الحالي فيتحدث عن تطبيق هام جداً يخدم البرمجة غرضية التوجه في التعامل مع قاعدة المعطيات mysql , وقد قمت فعليا في برامجي بالاستفادة من الافكار المطروحة في المقالتين عبر الدمج بينهما.

لن أطيل عليكم في المقدمة وسأبدأ بطرح المقالة التي قمت بترجمتها وصياغتها , مع خالص تمنياتي لكم بالفائدة.

 

المقالة:

هنالك على الوب الكثير من المقالات التي تتحدث عن البرمجة غرضية التوجه وتطرح الكثير من الأمثلة الشهيرة عليها مثل (مثال الدراجة …وغيره), ولكننا هنا فضلنا أن نشرح البرمجة غرضية التوجه في php   و mysql عبر عدد من الأمثلة التطبيقية الواقعية المفيدة للمبرمج بشكل فعلي ومباشر.

يقوم المثال المفيد الذي سنطرحه بإنشاء صف ذو علاقة بالعمليات الأساسية التي تنفذ على قاعدة المعطيات mysql ويدعى هذا الصف CRUD class (create,read,update,delete) حيث يقوم هذا الصف بتنفيذ عملية الإنشاء والقراءة والتعديل والحذف على مداخل السجلات الموجودة في قاعدة المعطيات, وذلك بغض النظر عن كيفية تصميم قاعدة المعطيات .

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

في البداية نحن بحاجة للتأكد من قدرتنا على تنفيذ التوابع الأساسية في mysql . وحتى نستطيع القيام بذلك , نحتاج إلى كل من التوابع التالية:

 وإليكم الشكل العام للصف الذي يقوم بتنجيز- تحقيق – كل من هذه التوابع الأساسية:

selInserD

لاحظوا بأنني حرصت على أن تسبق هذه التوابع المعرفة بالكلمة المفتاحية public

dbclass

التابع function connect()

يعتبر هذا التابع بمثابة تابع function أساسي , وعملية تنجيزه – تحققه- ستكون بسيطة وسهلة , لكن في البداية نحن بحاجة إلى إنشاء وتعريف عدد من المتحولات variables. وحتى نضمن بأن لا يتم النفاذ لهذه المتحولات من خارج هذا الصف class, سنقوم بإسباق كل من هذه المتحولات بمعرف النفاذ private  وبذلك نضمن بأن فضاء رؤية هذه المتحولات أصبح محصوراً ضمن فضاء الصف الذي نقوم بتعريفه.

ستستخدم هذه المتحولات من أجل حفظ قيم كل من : المضيف host, اسم المستخدم username, كلمة المرور password, وقاعدة المعطيات database , هذه المعلومات المستخدمة بشكل أساسي من أجل إنشاء الإتصال مع قاعدة المعطيات.

وبما أن المتحولات السابقة , عملياً لا تتغير قيمها ,فنحن لسنا بحاجة إلى إنشاء توابع معدلة لقيم هذه المتحولات سابقة الذكر.

ومن ثم نحن بحاجة فقط إلى إنشاء عبارة اتصال بسيطة بلغة تقوم بربطنا مع قاعدة المعطيات mysql .

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

 connect  

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

في حال تم الاتصال بقاعدة المعطيات , فسيعيد التابع (تابع الاتصال ) القيمة المنطقية true  وإلا false .

وكنقطة إضافة سيقوم بتغير قيمة متحول الاتصال إلى القيمة true  في حال نجاح الاتصال.

 تابع فصل الاتصال public function disconnect()

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

public function disconnect()   

 disconnect    

تابع الاختيار public function select()

مع هذا التابع سنلاحظ بأن الأمور لن تعود ببساطة تعريفات التوابع السابقة , وستصبح أكثر تعقيداً.

سنتعامل الآن مع معاملات المستخدم التي سيمررها , ونعيد النتيجة بشكل مناسب.

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

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

سنعرض فيما يلي الكود – الرماز – الخاص بتعريف المتحول الخاص بالنتيجة , بالإضافة إلى الكود الخاص بتعريف تابع التحقق من تواجد جدول ما في قاعدة المعطيات

 table exists  

ببساطة يقوم هذا التابع بالتحقق من قاعدة المعطيات والتأكد من تواجد الجدول الممرر كمعامل دخل لهذا التابع .ويعيد هذا التابع القيمة المنطقية true  في حال تواجد الجدول , وإلا فإنه سيعيد القيمة المنطقية false .

select

للوهلة الأولى يبدو تعريف تابع الاختيار select function  مخيفاً قليلاً, ولكن عملياً , وإذا أمعنا النظر في الرماز , سنلاحظ بأنه بسيط , ويقوم بعدد من الخطوات . في البداية يتقبل هذا التابع 4 معاملات دخل  , الأول منهم مطلوب ولا يوجد له قيمة افتراضية , أم البقية فيوجد لهم قيم افتراضية . المعامل الأول , يمثل أسم الجدول. أما معامل rows فيحدد أسماء الأعمدة التي نريد احضارها من الجدول ضمن استعلامنا , أما المعامل where  فيفيد في وضع بعض الشروط على الاستعلام المطلوب تنفيذه على قاعدة المعطيات .

وكما هو واضح من الرماز , فقبل تنفيذ الاستعلام على قاعدة المعطيات , يتم التحقق من تواجد الجدول – المعامل الأول الممرر لهذه الاجرائية – في قاعدة المعطيات . في حال تواجده , عندها يتم تنفيذ الاستعلام , وإلا فنعيد عندها القيمة المنطقية false  التي تدل على الفشل.

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

في حال حصولك على أكثر من سجل – سطر-  نتيجة الاستعلام , عندها سيتم تخزين النتيجة في مصفوفة ثنائية الأبعاد, حيث يمثل المفتاح الأول فيها ترقيم لسطر النتيجة , والمفتاح الثاني يمثل اسم العمود.

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

أما في حال عدم وجود أي نتيجة , عندها تسند القيمة الخالية null   إلى متحول النتيجة.

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

تابع الإضافة في قاعدة المعطيات public function insert()

هذا التابع أبسط بكثير من التابع المعرف سابقاً. وهو ببساطة يمكننا من إضافة المعلومات – السجلات – إلى قاعدة المعطيات.

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

insert  

وكما تر, فإن هذا التابع اسهل بكثير من التابع المسؤول عن إنشاء تعليمة select .

كما أن التابع الذي يقوم بعملية الحذف من قاعدة المعطيات أسهل بكثير من كل ماسبق.

تابع الحذف من قاعدة المعطيات public function delete()

يقوم هذا التابع ببساطة إما بحذف كل سطور الجدول من قاعدة المعطيات , أو يقوم بحذف سطور محددة.

وكما اعتدنا سابقاً , فإننا نمرر اسم الجدول , وعبارة where وكما هو واضح فهي اختيارية.

إن عبارة where تمكننا من تحديد الأسطر التي نرغب في حذفها من الجدول ككل. في حال تمرير عبارة where , فإن كل السطور التي تحقق الشروط  المحددة في عبارة where يتم حذفها من قاعدة المعطيات. ومن ثم لا يتبق علينا سوى تنفيذ عبارة الحذف .

delete 

وأخيراً , وصلنا الآن إلى أخر تابع في جعبتنا.

تابع التعديل public update function

هذا التابع ببساطة يقوم بتعديل سطر – أو سطور – في قاعدة المعطيات بالمعلومات الجديدة الممررة له.

على كل الأحوال, بسبب طبيعة تعريف هذا التابع التي تحوي القليل من التعقيد , لذلك سيكون سرده أطول قليلاً , ومربك قليلاً.

ولكنه بالنهاية يملك الكثير من الأعراف المستخدمة في تعريف التوابع السابقة.في البداية , سنقوم باستخدام المعاملات الممررة لهذه الإجرائية بهدف تشكيل عبارة التعديل المطلوبة update statement.

وكما اعتدنا في تعريف التوابع السابقة , فإننا في البداية نتحقق من تواجد الجدول أصلاً في قاعدة المعطيات. في حال تواجده سنقوم عندها ببساطة بتعديل السطور المطلوبة . يكمن الجزء الأصعب ,في إنشاء عبارة التعديل المطلوبة وصياغتها بالشكل السليم .

عبارة where ببساطة تحوي على الشروط التي تحدد السطور التي من المطلوب إجراء التعديلات عليها.

سيقوم المقطع التالي بإنشاء الجزء من عبارة التعديل الذي يتعامل مع توضيع القيم المراد تعديلها في مكانها المناسب.

حيث تحوي المصفوفة $rows على القيم الجديدة , وبنية المصفوفة $rows هي على الشكل التالي : الأدلة فيها تمثل أسماء الأعمدة المراد تعديلها , أما القيم فتمثل القيم الجديدة لتلك الأعمدة الموافقة لها.

والرماز أدناه يوضح آلية صياغة جزء من عبارة التعديل , حيث يتم وضع الفواصل في الأماكن المناسبة لها.

getkeys

وسنعرض الآن التابع الذي يقوم بعملية التعديل بشكل كامل:   

 update

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

وفي الختام , أتمنى للجميع الفائدة , وفي حال وجود أي تساؤلات عن الموضوع أرجو ألا تترددوا في طرحها حتى نناقشها سوية .

وإلى أن ألقاكم قريباً , استودعكم الله والسلام عليكم ورحمة الله وبركاته.

 

المرجع

http://net.tutsplus.com/tutorials/php/real-world-oop-with-php-and-mysql/


البرمجة غرضية التوجه المتقدمة في php

يوليو 4, 2009

البرمجة غرضية التوجه المتقدمة في php

 

السلام عليكم ورحمة الله وبركاته

كثيراً ما نبحر بعيداً عن شطئاننا وأراضينا وقٌرانا , بحثاً عن عالم جديد وأفكار جديدة وأفق آخر , وقد تطول غربتنا عن أرضنا التي نعشق , ولكننا في النهاية نجد أنفسنا رهيني شوقنا لتلك الأرض , ولم نعد نطيق الابتعاد عنها أكثر من ذلك .

تمر بنا أحيان كثيرة ننكر فيها رغبتنا في العودة …ونتحدى أنفسنا ولهفتنا لذلك , ونكابر ونراهن على ذلك …في تلك اللحظات – التي قد تكون مصطنعة أو حالة راهنة واقعية – نعتقد بأن ما نقوله هو الذي سيتم فعليا ً. ولكن ما إن ينبض الشوق الحقيقي في عروقنا , حتى نجد أنفسنا تحترق بحرارة الشوق …شوق العودة , وتكسر كل القوانين والضوابط التي وضعتها سابقاً تحسباً من هكذا مرحلة ….

وهذا هو حالي مع تدوينتي هذه , فقد تأخذني فورة الحياة , وروتين العمل , وضيق الوقت بعيداً عن مدونتي التي أحب , ولكن ما ألبث أن أعود إليها وكلي شوق وحنين لأن أغنيها بما هو جديد , وبالأشياء التي علمتني إياها الحياة ,عسى ولعل أن يستفيد منها أحد آخر.

أما الآن , وبعد هذه المقدمة التي أستمتع دوماً بكتابتها في مقدمة أي موضوع , سنباشر الآن رحلتنا الممتعة في مجال البرمجة غرضية التوجه المتقدمة  و php  …

 

البرمجة غرضية التوجه مع مكتبة php  النظامية  SPL (standered php library )في الإصدار الخامس من php  

مقدمة :

تغطي هذه المقالة كل التوسعات المضافة إلى البرمجة غرضية التوجه في الإصدار الخامس من PHP بما فيها من SPL (مكتبة php  النظامية Standard PHP Library ) وكيفية استخدامهم في تطبيقاتنا الفعلية, وذلك حتى لا يبق الموضوع قيد الدراسة النظرية.

ملاحظة :

حتى تستطيع الاستفادة من قراءة هذه المقالة , يجب أن يكون لديك فكرة عن الصفوف classes, والواجهات interfaces , والأعضاء السكونين –الثابتين – static members , والمراجع references. أي باختصار يجب أن يكون لديك فكرة بشكل عام عن مفاهيم البرمجة غرضية التوجه.

كما يتوجب أن يكون لديك فكرة وفهم عن بعض قوالب التصميم الأساسية basic design patterns مثل قالب المعمل Factory.

سيتم استعراض هذه المفاهيم وشرحها من خلال استخدام طبقة قاعدة المعطيات المفاهيمية conceptual database layer.

 

غالباُ في برمجة تطبيقات الوب , يكون هنالك ميل كبير ونزعة لدى المبرمجين لكتابة وبرمجة طبقة مجردة ومنفصلة خاصة بقاعدة المعطيات , وذلك لأهداف تتعلق بسهولة نقل البرنامج – تطبيق الوب – من بيئة لأخرى database portability , وكمثال عليها PEAR::DB abstraction.

ولكن لسوء الحظ , فإن لا يمكن كتابة كود عام يتعامل مع كل قواعد المعطيات , وبالتالي فهو سيكون موافقاً للعمل مع قاعدة معطيات وحيدة .

والسؤال هنا هو التالي:

كيف بإمكاننا التخلص من هذه المحدودية ؟

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

الواجهات في PHP5 PHP5 Interfaces in- 

مع وجود عدد من الابتكارات المترافقة في PHP5 و SPL ( مكتبة PHP النظامية),أصبح الآن بإمكانك استخدام المفاهيم المتقدمة للبرمجة غرضية التوجه, مثل الصفوف classes, الواجهات interfaces, والدلائل indexers, والعدادات iterators, بطريقة لم تكن تحلم بها من قبل , ولم تكن متاحة أصلاً.

إن SPL ( اختصار لمكتبة PHP النظامية Standard PHP Library) هي بمثابة تمديد ل php , حيث تضيف لنواة php كل من الواجهات interfaces والصفوف classes والتوابع functions.

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

الواجهات الثلاث هي التالية:

The ArrayAccess interface

The Countable interface

The Iterator interface

وسنبدأ ب

The ArrayAccess interface 

عندما تم تنجيز implement هذه الواجهة , فقد تم تمكين المبرمجين من استخدام الدلائل indexers عليها (أي استخدام عمليات دليل المصفوفة [])وذلك بالنسبة لأي غرض لا على التعينن ( أي بإمكاننا النظر إليها على أنها مصفوفة وعناصرها هي الأغرض وبالتالي بإمكاننا الوصول إلى هذه الأغراض عبر اسخدام العمليات المتاحة على الأدلة index operators []).

كل الأغراض المفهرسة indexed objects  في PHP تحتاج بشكل أساسي إلى 4 طرائق methods  حتى تستطيع التعامل معها كمصفوفة , ويجب أن تصرح على أنها تحقق الواجهة ArrayAccess (implement the ArrayAccess interface).

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

offsetExists($offset)

تستخدم هذه الطريقة لأخبار php عن وجود قيمة value   (أو عدم وجودها )بالنسبة للمفتاح key  المحدد عبر الإزاحة المعطاة والممرة كعنصر دخل لهذه الطريقة ($offset)

القيمة المرجعة من هذه الطريقة هي إما القيمة المنطقية true أو false.

offsetGet($offset)
تستخدم هذه الطريقة لإعادة القيمة value  المحددة عبر المعامل –المفتاح key – الممر كدخل لهذه الطريقة offset.

offsetSet($offset, $value)

تقوم هذه الطريقة بتوضيع القيمة value  الممرره كمعامل دخل لهذه الطريقة ضمن الغرض وذلك في المكان المحدد لها عبر المفتاح offset  الممرر أيضاً كمعامل دخل .

بالإمكان إطلاق استثناء من هذه الطريقة في حال كانت هذه المجموعة للقراءة فقط read-only collection, وبالتالي ليس بإمكانك تعديلها بكتابة قيم جديدة فيها.

offsetUnset($offset)
تستخدم هذه الطريقة في الحالات التي يتم فيها إزالة قيمة من المصفوفة , إما عن طريق unset() أو  عبر إسناد قيمة اللاشيء value of null إلى المفتاح key الخاص بقيمة ما.

في حالة المصفوفات العددية,لا يتوجب حذف المفتاح منها , ولا يتوجب إعادة فهرسة تلك المصفوفات ,إلا في حال كان ذلك لغاية مدروسة في نفسك.

 The Countable interface

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

تعتمد هذه الواجهة على الإصدار PHP 5.1.

ملاحظة: حتى يقوم الصف الذي عرفته بتحقيق الواجهة Countable يتوجب عليك تعريف طريقة باسم count() تعيد عدد صحيح , ويجب أن يقوم الصف أيضاً بالإشارة بشكل صريح إلى تحقيق الواجهة Countable.

The Iterator interface 

تعتبر العدادات Iterators بمثالة أكثر الأجزاء أهمية في SPL , حيث تمكننا من أستخدام الأغراض ( التي نعرفها )ضمن الحلقات البرمجية loops.

قد تتسائل , لماذا لم تضمن الواجهة Iterator ضمن الواجهة ArrayAccess ؟

يعود السبب في ذلك بسبب عدم توفيرها للآلية مناسبة تخبر فيها PHP عن المفاتيح keys المحتملة وترتيبهم الموافق.

إذا كنت ترغب في الأستفادة من حلقات foreach loop في التعامل مع الأغراض التي قمت بتعريفها , يتوجب عليك القيام بتحقيق الواجهة Iterator. 

حتى تستطيع تحقيق implement الواجهة Iterator , تحتاج إلى كتابة كل من الطرق الخمس التالية:

current()

تعيد هذه الطريقة القيمة الموافقة للدليل الحالي current index’s value

أنت المسؤول الوحيد عن عملية تتبع الدليل الحالي , ولن تقوم الواجهة بتحقيق هذه العملية لك ما لم تعرفها أنت بنفسك.

key()

تقوم هذه الطريقة بإعادة القيمة الموافقةللمفتاح الحالي .

تعتبر هذه الطريقة مهمة جداً بالنسبة لحلقات foreach , حيث يصبح عندها باستطاعتنا الحصول على كل المفاتيح والقيم الحالية  المشار إليها في كل دورة من دورات الحلقة على الغرض الممرر لها.

next()

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

rewind()

تقوم هذه الطريقة بإعادة تهيئة الدليل الداخلي , وتوضيعه ليشير إلى العنصر الأول (المدخل الأول ضمن الغرض).

valid()
تقوم هذه الطريقة بإعادة إحدى القيمتين المنطقيتين true أو false , في حال وجود عنصر في المكان الذي نقف عنده الآن.

تستخدم هذه الطريقة عادة بعد استدعاء إحدا الطريقتين التاليتين rewind() أو next().

تجدر الإشارة إلى أن هنالك عدة أنماط من العدادات iterators التي تقدمها المكتبة النظامية في PHP, ولكننا سنقتصر في مثالنا المطروح على ذكر نمط واحد فقط  ألا وهو  Iterator  ونقوم بتحقيقه implement.

إنشاء وبرمجة أول واجهة خاصة بنا- أي من كودنا الخاص-

حتى تستطيع إنشاء تطبيق محمول portable application , يتوجب عليك في البداية تحديد الآلية التي سيتخاطب عبرها تطبيقك مع قاعدة المعطيات.

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

وكبداية , سنقوم بإنشاء ملف يدعى IDataBaseBindings.php.

ستبدو محتويات هذا الملف مشابهة للكود الموجود أدناه:

 

  

Listing 1 IDataBaseBindings.php
<?php    /**     * IDataBaseBindings interface     *

     * This interface contains the standarized implementation point for all

     * database methods.

     *

     */

 

    interface IDataBaseBindings

    {

        /**

         * getCustomerDetails

         *

         * Returns an UnbufferedAsociativeResultSet containing all

         * detailed information about a user from the userDetails table.

         *

         * @param   int     $userid     A user identification number like 12345

         * @return  UnbufferedAsociativeResultSet    All relevant data from userDetails

         * @throws  ReadOnlyException

         */

        public function getCustomerDetails($userid);

    }

?>

 

 

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

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

بالنسبة لقواعد معطيات PostgreSQL التي تحقق هذه الواجهة , فإنه بإمكانها استخدام CIDR كنمط معطيات , أما بالنسبة لقواعد معطيات MySQL فإنك ستستخدم القيم البوليانية الرياضية Boolean math من أجل تحديد المعلومات.

كان ذلك مجرد مثال بسيط جداً , ولكن هنالك حالات كثيرة تتطلب منك رفع قدرات قاعدة معطيات معينة لأسباب تتعلق بالإنجاز performance reasons, وبشكل خاص عند التعامل مع الإجرائيات المخزنة stored procedures, أو الإستعلامات المعدة مسبقاً , prepared queries والمعطيات ذات الحجوم الكبيرة .

تحقيق الواجهة IDataBaseBindings التي قمنا بتعريفها سابقاً:

حتى نستطيع القيام بتحقيق الواجهة المعرفة سابقاً , سوف نقوم بإنشاء ملف جديد يدعى PostgreSQL.php. ستبدو محتوياته على الشكل التالي:

 

 

   

Listing 2 PostgreSQL.php

<?php    /**     * PostgreSQL implementer for IDataBaseBindings.     *

     * Implements all members indicated by the interface and

     * optimizes queries for the PostgreSQL database.

     *

     * @author      Kevin McArthur

     * @depends     UnbufferedAssociativeResultSet, IDataBaseBindings

     * @implements  IDataBaseBindings

     */

    class PostgreSQL implements IDataBaseBindings

    {

        public function __construct() {

            // Create Database Connections

        }

 

        /**

         * getCustomerDetails

         *

         * Gets customer data from userDetails specified by userid

         *

         * @see IDatabaseBindings

         */

        public function getCustomerDetails($userid)

        {

            $queryResult = pg_query(‘select * from userDetails where userid = ‘. $userid . ‘;’);

            return new UnbufferedAssociativeResultSet($queryResult);

        }

 

        public function __destruct()

        {

            // Destroy Database Connections

        }

    }

?>

   

يقوم الرماز السابق بإنشاء صف class جديد يدعى PostgreSQL الذي يقوم بدوره بتحقيق implements الطريقة getCustomerDetails() المعرفة سابقاً- بشكل مجرد – ضمن الواجهة IDataBaseBindings التي نقوم بتحقيقها عبر هذا الصف.

يجب أن تكون هذه الطريقة مسؤولة عن القيام بكل الاستعلامات. القيام مباشرةً بوضع واستعادة القيم من قاعدة المعطيات.

إنشاء معمل خاص بقاعدة المعطيات Creating a Database Factory

قد تطرح في نفسك بعض التساؤلات: كيف تكون التعريفات السابقة قد قامت بوضع مفهوم مجرد للواجهة في حال قمنا بإنشاء أغراض جديدة مثل PostgreSQL  بشكل مباشرمنها؟

حتى نحل هذه المشكلة سنقوم باستخدام نموذج المعمل Factory Pattern , والذي يعرف بالشكل التالي:

Listing 3 DatabaseFactory.php
<?php    /**     * DatabaseFactory     *

     * Creates an IDataBaseBindings object for use from the application layer

     *

     * @depends    PostgreSQL, MySQL

     */

    class DatabaseFactory

    {

        /**

         * factory

         *

         * Returns an IDataBaseBindings compatible object based on the type of database

         * defined in $configuration['databasetype']

         */

        public static function factory()

        {

            switch($configuration['databasetype']) {

                case ‘PostgreSQL’:

                    return new PostgreSQL();

                    break;

                case ‘MySQL’:

                    return new MySQL();

                    break;

                default:

                    throw new Exception(‘Database implementer not found’);

            }

        }

    }

?>

 

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

فعلياً نجد , ومن خلال الرمازالسابق بأن تطبيقك لا يعلم ولا يهتم حول قاعدة المعطيات التي سيتم استخدامها.وإنما فقط يهتم بتلبية المتطلبات المعرفة في الواجهة .

أي باختصار , توحيد واجهة التخاطب البرمجية – مع اختلاف قواعد المعطيات التي من الممكن التعامل معها – قد حل لنا مسألة المحمولية وجعلها متاحة وممكنة لأقصى الدرجات وعبر أكثر الوسائل البرمجية تقدماً (البرمجة غرضية التوجه)

التعامل مع المعطيات المعادة :

UnbufferedAssociativeResultSet 

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

فعلى سبيل المثال نجد بإن الصف PostgreSQL يستخدم الغرض UnbufferedAssociativeResultSet.

Listing 4 UnbufferedAssociativeResultSet.php 

<?php 
    /**
     * UnbufferedAssociativeResultSet
     *
     * Allows for unified access to a database result set
     *
     * @implements  ArrayAccess, Iterator, Countable
     * @remarks     If not using 5.1, implementing countable can be and count() used directly.
     * @see         SPL Documentation For Interface Declarations.
     */ 
    class UnbufferedAssociativeResultSet implements ArrayAccess, Iterator, Countable 
    { 
        private $currentIndex, $result;
 
        function __construct($result) 
        {
            $this->currentIndex = 0;
            $this->result = $result;
        }
         //Region ArrayAccess
        function offsetExists($offset)
        {
            switch($configuration['databasetype']) {
                case 'PostgreSQL':
                    if(pg_fetch_assoc($this->result, $offset)) {
                        return true;
                    } else {
                        return false;
                    }
                default:
                    throw new Exception("No Database Handler");
            }
        }
 
        function offsetGet($offset)
        {
            switch($configuration['databasetype']) {
                case 'PostgreSQL':
                    if($row = pg_fetch_assoc($this->result, $offset)) {
                        return $row;
                    } else {
                        throw new Exception("No row at ". $offset);
                    }
                default:
                    throw new Exception("No Database Handler");
            }
        }
         function offsetSet($offset,$value)
        {
            throw new Exception("This collection is read only.");
        }
         function offsetUnset($offset)
        {
            throw new Exception("This collection is read only.");
        }
        //EndRegion
         //Region Countable
        function count()
        {
            switch($configuration['databasetype']) {
                case 'PostgreSQL':
                    if($rows = pg_num_rows($this->result)) {
                        return $rows;
                    } else {
                        throw new Exception("Could not fetch the number of rows in resultset");
                    }
                default:
                    throw new Exception("No Database Handler");
            }
        }
        //EndRegion
         //Region Iterator
        function current()
        {
            return $this->offsetGet($this->currentIndex);
        }
         function key()
        {
            return $this->currentIndex;
        }
         function next()
        {
            return $this->currentIndex++;
        }
 
        function rewind()
        {
            $this->currentIndex = 0;
        }
         function valid()
        {
            if($this->offsetExists($this->currentIndex)) {
                return true;
            } else {
                return false;
            }
        }
         function append($value)
        {
            throw new Exception("This collection is read only");
        }
         function getIterator()
        {
            return $this;
        }
        //EndRegion
    }
?>

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

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

ملاحظة:

1: من أجل الاختصار , قد قمت بإهمال كتابة التعليقات على هذا الصف , واستخدمت استثناءات exceptions  بسيطة.

2:أنت بحاجة لاستخدام الأغراض المشتقة من الصف Exception حتى تستطيع إطلاق استثناءات مثل الاستثناء ReadOnlyException.

يقوم هذا الصف باستخدام switch وذلك من أجل تحديد التوابع المستعملة في قاعدة المعطيات وذلك تبعاً لقاعدة المعطيات التي سيتم التعامل معها.

مثال تطبيقي:

Listing 5 listing-5.php

<?php
    $uid = 12345;
    $db = DatabaseFactory::factory();
    $ubars = $db->getCustomerDetails($uid);
 
    if($ubars[0]['property'] == "Name") {
    echo "The first property was 'name'";
    }
 
    foreach($ubars as $values) {
        foreach($values as $key=>$value) {
            echo $key . '=' . $value;
        }
    }
 
    $rows = count($ubars);
?>

 

الخلاصة :

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

وكل ما هو مطلوب منا برمجياً وفق إطار العمل المعرف سابقاً , هو كتابة الرماز المرتبط بالعمليات الخاصة بقاعدة معطيات معينة ليس إلا. وستكون تطبيقاتنا المعدة للانترنت تتميزبكونها قابلة للعمل على منصات التشغيل المختلفة .والتعامل مع قواعد معطيات مختلفة .

 

وبالختام أتمنى لكم الفائدة عبر هذه الترجمة لمقالة بعنوان البرمجة غرضية التوجه المتقدمة في PHP  

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

في حال وجود أي من التساؤلات حول البرمجة غرضية التوجه , أرجو عدم التردد أبداً في طرحها.

وبعد فترة قليلة سأدرج مواضيع أخرى قيمة حول البرمجة غرضية التوجه في PHP   و mysql فقد قرأت منذ فترة قريبة مقالة رهيبة في هذا الصدد , وعلى أساسها وأساس الأفكار التي استوحتها منها فقد قمت بتغير أسلوبي البرمجي بشكل كامل عند التعامل مع قاعدة المعطيات .

وإلى ذلك الحين أسألكم الدعاء و استودعكم الله , والسلام عليكم ورحمة الله وبركاته.

 

المرجع :

http://www.phpriot.com/articles/oop-with-spl-php-5

 

   

 


خدماتنا

مايو 9, 2009
  • برمجة كافة أنواع المواقع الديناميكية والستاتيكية التي تخدم كافة أنواع الشركات أو الأفراد أو نظم العمل, وبحرفية عالية , مع ضمان الدعم الفني والصيانة – إن تطلب الأمر
  • تصاميم فنية مبتكرة ذات جودة عالية ….
  • ترجمة من اللغة الانلكيزية للغة العربية بحرفية عالية , ولمجال وطيف واسع من المواضيع – معلوماتية , فلكية , برمجية ,طبية …
  • رسم صور شخصية صغيرة بأحجام كبيرة وبجودة عالية

وكل ذلك بأسعار منافسة

راسلونا على البريد التالي:schwarzd.tiger@gmail.com


الثقب الأسود – الحلقة 3

أبريل 30, 2009

السلام عليكم ورحمة الله وبركاته

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

 

1.      كيف يبدو الثقب الأسود – ماهو شكله؟

يعتبر الثقب الأسود بحد ذاته غير مرئي وذلك بسبب عدم قدرة الضوء على الانفلات منه.

في الواقع , عندما ظهرت في البدايات النظريات التي تتحدث عن الثقوب السوداء ,كانت الثقوب السوداء تسمى بالنجوم غير المرئية “invisible stars.” .

حسناً, بما أن الثقوب السوداء غير مرئية , فكيف عرفنا إذن بوجودها؟

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

على سبيل المثال , لنفترض حالة نظام نجمي مزدوج  a double-star system حيث تكون النجوم فيه قريبة جداً من بعضها البعض. في حال انفجار أحد النجوم على شكل سوبرنوفا supernova  وتحوله إلى ثقب أسود , عندها فإنه من المتوقع من الغاز والغبار الصادر عن النجم المرافق بأن تسحب باتجاه الثقب الأسود – وذلك في حال كان هذا النجم المرافق قريب لدرجة كافية.في تلك الحالة , يبدأ كل من الغاز والغبار بالانسحاب باتجاه الثقب الأسود ويشرع بالدوران حول الأفق الزوجي event horizon ومن ثم يدور وفق مدارات حول الثقب الأسود .وخلال ذلك يزداد تضاغط الغاز لدرجة كبيرة , ويقوم الاحتكاك المتولد بين الذرات بتحويل الطاقة الحركية kinetic energy  في الغاز والغبار إلى حرارة, وبالتالي يتم إصدار وبث أشعة x x-rays.  وبالاستفادة والأستعانة بالأشعة القادمة من تلك المواد التي تدور حول الثقب الأسود , يتمكن العلماء من قياس درجة حرارتها وسرعتها.

بإمكاننا من المعلومات القادمة عن حركة وحرارة المواد الدوارة , استنتاج وجود الثقوب السوداء .

تدعى المادة الحارة التي تدور بالقرب من ا لأفق الزوجي التابع للثقب الأسود بالأقراص الملتحمة accretion disk.

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

إن عملية البحث عن النجوم التي تتأثر حركتها تبعاً لشريك غير مرئي , هي إحدى الطرق الممكنة لدى الفلكيين للبحث عن ثقوب سوداء محتملة.

 

2.      هل تتحول كل النجوم إلى ثقوب سوداء؟

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

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

إن مثل هذا النوع من النجوم تنتهي على شكل نجوم قزمية بيضاء white dwarf stars.

أما بالنسبة للنجوم ذات الكتل الكبيرة, تلك التي تكون كتلتها على سبيل المثال , أكثر ب20 مرة من كتلة شمسنا,ربما تتحول في النهاية إلى ثقوب سوداء.

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

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

تدعى الثقوب السوداء المشكلة من النجوم بالثقوب السوداء النجمية a stellar black hole .

3.      ما هو عدد الأنماط والأنواع المتواجدة من الثقوب السوداء؟

تبعاً للنظرية , فإنه يوجد ثلاثة أنواع من الثقوب السوداء:

الثقوب السوداء النجمية stellar black holes

الثقوب السوداء ذات الكتلة الخارقة supermassive black holes

الثقوب السوداء المصغرة  black holes miniature

وهذا التصنيف يعتمد على أحجام  الثقوب السوداء.

كما أن هذه الأنواع المختلفة من الثقوب السوداء يتم تشكلها بطرق مختلفة.

بالنسبة للثقوب السوداء النجمية فقد تم توضيح آلية تشكلها سابقاً.

أما بالنسبة للثقوب السوداء ذات الكتل الهائلة – الخارقة – supermassive black holes ,فهي غالباً ما تتواجد في مراكز أغلب المجرات , بما فيها مجرتنا – درب التبانة.

من الممكن لمثل هذه الثقوب السوداء أن تملك كتلة مساوية لبلايين أضعاف كتلة شمسنا.

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

بشكل معامد للأقراص الملتحمة accretion disk التابعة لثقب أسود ذو كتلة خارقة supermassive black holes , وفي أغلب الأحيان , هنالك دفقان من الغاز الساخن two jets of hot gas .

bh22gas-jet-1

الصور أعلاه توضح لنا كل من الأقراص الملتحمة accretion disk التي تدور حول الثقب الأسود , ودفقا الغاز الذان يتوضعان بشكل معامد بالنسبة لهذه الأقراص الملتحمة.

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

هنالك عدد من الملاحظات التي تمت عبر تلسكوب هبل الفضائي Hubble Space Telescope التي استطاعت أن تثبت , وبدليل جيد , تواجد مثل هذه الثقوب السوداء ذات الكتلة المهولة supermassive black holes.

لم يتم لحد الآن بشكل دقيق تحديد الآلية الفعلية التي ينتج عنها الثقوب السوداء المصغرة miniature black holes , ولكن قد تم وضع عدد من الفرضيات.

تقترح الفكرة الأساسية احتمال تشكل الثقوب السوداء المصغرة بعد وقت قصير من حدوث “الانفجار الكبير” “Big Bang,” , الذي يعتقد بأنه بمثابة بداية الكون وحدث قبل حوالي 15 بليون سنة مضت.

على كل الأحوال, ولحد الآن , لا يوجد أي دليل على وجود الثقوب السوداء المصغرة.

المراجع:

http://amazing-space.stsci.edu/resources/explorations/blackholes/teacher/sciencebackground.html

http://en.wikipedia.org/wiki/Black_holes

مع خالص تمنياتي لكم بالتوفيق, وإلى لقاء قريب بإذن الله مع موضوع جديد , وإلى ذلك الحين استودعكم الله والسلام عليكم ورحمة الله وبركاته


الثقب الأسود – الحلقة 2 –

أبريل 19, 2009

بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

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

وأتمنى لك الاستمتاع بهذه المعلومات:

الثقب الأسود : ببساطة هو عبارة عن منطقة من الفضاء تكون فيها قوة السحب الجاذبي باتجاه مركزها قوية جداً جداً, لدرجة بأنه لا يوجد شئ قادر على الافلات من الانجذاب باتجاه الثقب الأسود بعد أن يصبح ضمن حدود معينة تحيط بالثقب الأسود, تدعى هذه الحدود “بالأفق الزوجي” event horizon – والتي سنعكف على شرحها فيما بعد.

  1. ما هو الثقب الأسود؟

يعرف الثقب الأسود عملياً عبر سرعة الانفلات escape velocity  التي تحدد المقدار الذي ضمنه تكون عملية الهرب والانفلات من السحب الجاذبي الصارد عن غرض ما ممكنة. على سبيل المثال , تقدر سرعة انفلات الأرض ب   11 km/s.

لذلك فإن أي شئ يريد أن ينفذ – ينفلت – من قوة السحب الجاذبي التابعة للأرض يتوجب عليه أن يتحرك بسرعة بالحد الأدنى مساوية ل 11 km/s , وذلك بغض النظر عن ماهية ذلك الشئ – مركبة فضائية , أو حتى كرة.

تعتمد سرعة الانفلات لغرض ما على مدى انضغاط هذا الغرض , أي على نسبة كتلته إلى نصف قطره.

يعتبر الثقب الأسود عبارة عن غرض مضغوط لدرجة كبيرة جداً, وحتى على مسافة محددة بعيداً عنه , فإن سرعة الضوء لا تعتبر سريعة كفاية حتى تستطيع الانفلات منه ومن قوة جذبه.

كيف ينشأ ويتشكل الثقب الأسود النجمي ؟

إن النمط الشائع والمألوف من الثقوب السوداء هو ذلك النمط الناتج عن موت النجوم. حيث أن نجم ذو كتلة كبيرة أكبر بمقدار 20 مرة من شمسنا , يمكن أن يتحول إلى ثقب أسود في نهاية حياته.

    خلال الحياة العادية لنجم ما , هنالك صراع دائم بين قوة الجاذبية الساحبة للداخل , وقوة الضغط الدافعة للخارج , ويكون النجم في حالة توازن نتيجة التوازن بين هاتين القوتين.

تولد التفاعلات النووية الموجودة في لب النجم طاقة كافية مندفعة نحو الخارج.

بالنسبة لمعظم النجوم – خلال حياتها – تكون قوة كل من الضغط والجاذبية متوازنتين تماماً, وبذلك يكون النجم مستقراً.

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

وكلما ازدادت كتلة نواة النجم , ازدادت معها قوة الجذب التي تقوم بضغط المادة , وبالتالي يزداد تضاغط النجم ضمن وزنه الحالي.

بالنسبة للنجوم الصغيرة , عندما يستنفذ الوقود النووي , تنتهي التفاعلات النووية nuclear reactions التي كانت تقوم بمقام القوة التي تحفظ توازن النجم بتأمينها القوة التي توفر الدفع الخارجي مقابل قوة الجاذبية, وبالتالي وبالتدريج , تولد القوة المنفرة المتواجدة بين الالكترونات في النجم ضغط كافي مندفع نحو الخارج , وبذلك تستطيع أن تنفذ من عملية الانهيار والانخساف الجاذبي gravitational collapse.  بعد ذلك يبرد النجم تدريجياً ويموت بسلام . يسمى هذا النمط من النجوم “الأقزام البيضاء” “white dwarf.” .

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

حتى يكون لدينا نجم يتميز بلب ذو كتلة كبيرة جداً, عندها يتوجب أن تكون كتلة النجم – بالحد الأدنى – أكبر بمقدار 20 مرة من الشمس .

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

عندما يتحقق الكلام السابق , فإن سرعة الانفلات المطلوبة لغرض ما يجب أن تكون أكبر من سرعة الضوء – حتى يستطيع هذا الغرض الانفلات من تأثير الثقب الأسود. فعلياً , لا يمكن لأي غرض أن يصل لسرعة الضوء.

تسمى المسافة الفاصلة بين أي غرض والثقب الأسود والتي تكون فيها سرعة الانفلات مساوية لسرعة الضوء ” بالأفق الزوجي”   event horizon .

event-horizon

 يتم احتباس أي شيء يمر ضمن الأفق الزوجي التابع للثقب الأسود للأبد – حتى لو كان هذا الشيء ضوءاً –.

bh3

3.      كيف يمكن للضوء أن يتم احتباسه عبر السحب الجاذبي الصادر عن ثقب أسود مع العلم بأنه لا يوجد للضوء أي كتلة؟

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

حيث أكتشف أولاً بأنه يتم توليد الجاذبية عبر الزملكان(زمان – مكان) المنحني curved space-time . ومن ثم ظهر بنظرية تقول بأن الكتلة ونصف القطر التابعيين لغرض ما قادرين على حني الزملكان space-time

Einstein theorized that the mass and radius of an object actually curves space-time

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

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

وبما أن الضوء يسافر عبرمسار خطوط مستقيمة , فإنه سيتبع مساراً منحنياً في حال مر بالقرب من حقل جاذبية كبير.   هذا ما كنا نقصده أثناء قولنا ” فضاء منحني ” “curved space,” وهذا هو السبب نفسه الذي يسبب احتباس الضوء في الثقب الأسود .

وفي عام 1920 استطاع السيد ارثر ايدنغتون Sir Arthur Eddington إثبات نظرية انشتاين عندما لاحظ انحناء ضوء النجم عندما يسافر – أي يمر – بالقرب من الشمس. وبالتالي , كان ذلك أول تنبؤ صحيح تابع لنظرية إنشتاين في النسبية العامة Einstein’s General Theory of Relativity.

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

 وبهذا القدر نكتفي في هذه الحلقة , على أن نتابع الأجابة على بقية الأسئلة المطروحة في الحلقة القادمة,وحتى نفسح مجالاً للتفكر في هذه المعلومات وطرح أي تساؤلات عنها .

وإلى ذلك الحين ,استودعكم الله , والسلام عليكم ورحمة الله وبركاته.

 

 


الثقب الأسود Black Hole – الحلقة 1 –

أبريل 17, 2009

الثقب الأسود Black Hole

الثقب الأسود

بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

المواضيع والنقاط التي سنناقشها في الحلقات القادمة:

سنتناول في الحلقات القادمة موضوع الثقب الأسود ونناقشه عبر الإجابة على مجموعة من التساؤلات المطروحة, والتي وبالإجابة عنها ينفتح أمامنا أفق التفكير بشكل واسع وتطرح أسئلة ومواضيع ذات أفق أبعد من ذلك , لتكون إن شاء الله أحد المواضيع المدرجة لاحقاً.

1. ما هو الثقب الأسود؟

2. كيف تنشأ وتتشكل الثقوب السوداء النجمية ؟

3. كيف يمكن للضوء أن يتم احتباسه عبر السحب الجاذبي الصادر عن ثقب أسود مع العلم بأنه لا يوجد للضوء أي كتلة؟

4. كيف يبدو الثقب الأسود – ماهو شكله؟

5. هل تتحول كل النجوم إلى ثقوب سوداء؟

6. ما هو عدد الأنماط والأنواع المتواجدة من الثقوب السوداء؟

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


رسالة المدونة

أبريل 16, 2009

 

بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

أخوتي إخواني الأعزاء , كلنا يعرف التاريخ , وكلنا يعرف كيف كان العلم والحضارة العلمية في أيدي العرب , وكيف كان الغرب في الماضي يرتع في غياهب الجهل والخرافات , بينما كان العالم العربي في أوج تقدمه وإزدهاره.

دوماً نتذكر الماضي …ونتفاخر فيه أحياناً…ونتحسر على حالنا أحياناً أخرى…

لكن دعونا الآن ننظر إلى الموضوع نظرة مفكرة علمية جادة…هل تفاخرنا أو تحسرنا كافي؟؟ هل هذا هو جلّ ما نستطيع القيام به …هل هذه هي رسالتنا في الحياة – النظر إلى إنجازات أجدادنا وأسلافنا دون أن نحرك قيد أنملة للتحرر من واقعنا المتخلف هذا , أو القيام بحركة جادة مفيدة تغيير وجه التاريخ ؟!

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

حسناً ما الذي بإمكاننا القيام به الآن , كلنا يعرف بأن طريق الألف ميل يبدأ بخطوة , وأول ما سنقوم به الآن هو الاستفادة من التاريخ بحد ذاته, ولنمحص النظر في صلب القضية, كيف انتقلت الحضارة للغرب؟؟

ببساطة :

1:  كان الغرب يؤمنون بقدرتهم على تغيير واقعهم بالدرجة الأولى .

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

أما بالنظر إلى العامل الأول ,فنجد بأنه بالأجدر بنا أن نملك هذا الإيمان بالقدرة على التغيير الإيجابي , ألا وربنا الله وهو ثقتنا وعليه توكلنا , وما خاب من توكل على الله وجعل جل ثقته وإيمانه بالله.

وبالنسبة للعامل الثاني,فما شاء الله عليكم كلكم مثقفون ومتعلمون , وقد حباكم الله بعقول نيرة أنتم مسائلون فيما بعد عن استخدامكم لها.

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


تعرف الأشخاص من خلال شكل الجسم وطريقة المشي :Human Identification from Body Shape and Gait

أبريل 16, 2009

 walking-human













 




   Entity authentication   وثوقية الكيان


  هي أحد المواضيع الهامة التي نحاول دوماً إيجاد حلول مناسبة لتحقيقها ,وهنالك عدة أساليب للتحقق من وثوقية الكيان ,ومن أشهر تلك الطرق في التحقق هي التالية:



  1: اعتماداً على شيء تملكه Something that you have


 Something that you know2:اعتماداً على شيء تعرفة


 Something that you are3:اعتماداً على شيء يمثلك أنت بحد ذاتك 


وغالباً مايستخدم للتوثق من كيان ما اعتماداً على مزيج من الطرق السابقةً


   بالنسبة للطريقة الأولى (شيء تملكه) فخير مثال عليها البطاقات الذكية Smart cards   وغالباً ما تستعمل


بكثرة في العمليات المصرفية ,وتطبيقات حجز البطاقات الالكترونية.


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


الطريقة الثالثة التي يعتمد عليها في تحقيق وثوقية الكيان هي اعتماداً على شئ يمثلك أنت بحداتك    


 ,وفي هذا الأسلوب يتم الاعتماد على تحويل الخواص الفيزيائية لجسم الإنسان (Something you are)


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


 ومثال على الطريقة السابقة ,تطبيقات التعرف على الوجه Face identification


بصمة شبكية العين, بصمة الأصابع,وتتميز بأنها ثابتة وغير متغيرة وتميّز كل شخص بشكل فريد,لذلك تصنف static measurementsضمن  المقاييس الثابتة


بينما هنالك مقاييس تتغير بشكل ديناميكي , مثل التعرف على خط الكتابة , والتعرف على الصوت.


  وقد تم عملياً تنجيز كل أساليب التعرف السابقة واستخدامها بشكل واسع, ولكن مع تطورأساليب وتقنيات التعرف السابقة, كانت تتطور أساليب وطرق أخرى –سواء كانت بشرية أو الكترونية- بشكل متزامن معها, ألا وهي أساليب تهدف إلى محاولة كسر وتحدي درجة وثوقية تلك التقنيات .


  مثال : انتشار عمليات النتكر الاحترافي لدى المجرمين ,وعمليات التجميل التي جعلت عملية التعرف عليهم عبر تطبيقات التعرف على الوجه غير كافية, وكذلك الأساليب المختلفة لتشويه بصمات الأصابع عبر حرقها مثلاً بمادة مذيبة,بالإضافة إلى الأجهزة التقنية المتوافرة حالياً والتي تمكن من تغيير وتقليد الأصوات,وغير ذلك…


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


 [4]تعرف الأشخاص من خلال شكل الجسم وطريقة المشي 


Human Identification from Body Shape and Gait


 لنبدأ في البداية بتعريف ما يعرف ب


(طريقة المشي المميزة للشخص) Person’s gait[1]


و تعتمد على عدة عوامل منها البنية الفيزيائية ووزن الجسم, ارتفاع كعب القدم,و الحالة الشعورية للعقل .


      وقد وجد أن طريقة المشي تقريباً تميّز الأشخاص إلى حدٍ ما ,وهنالك الكثير من الدراسات الطبية التي تؤكد


 بعد تحليل طريقة المشي لعدد كبير من الأشخاص – بأنها تكاد تكون مميزة لكل شخص على حدى.-


وحتى أننا أنفسنا نعتمد غالباً على هذه الخاصية في تميز أصدقائنا ومعارفنا عن بعد من خلال هيئتهم أثناء المشي,فغالباً ماترانا نقول:”هه…هاقد جاء فلان ” وذلك عند رؤيته من بعيد وعلى مسافة تكاد تكون ملامح وجهه غير واضحة أبداً, أو في ظروف تكون فيها الإضاءة سيئة جداً بحيث يستحيل علينا تميّزه من خلال ملامح وجهه,وغالباً ما يكون الشخص هو فعلاً الشخص الذي ذكرنا اسمه.


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


 غير واضحة و غير قابلة للقياس,Biometrics


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


وإليكم المثال التالي الذي يوضح مجال فعال لاستخدام هذه التقنية في التعرف:


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


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


أيضاً في الكثير من الجرائم نلاحظ أن المجرمين يخفون وجوههم, لكنه من الصعب إخفاء مشيتهم.


 


*   تعتمد الطريقة المذكورة على تقنيات بسيطة في مجال الرؤية الحاسوبية لتوصيف شكل الجسم و نمذجة حركته.


  ويتميز تنجيز هذه الطريقة في التوثق بمايلي :


      1 : سهلة الفهم و التنجيز (التطبيق).


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


      3:لاتحتاج لمعطيات كبيرة من الصور (تعتبر الصور التي تمثل شخص و هو يمشي فقط بمقدار خطوة واحدة, كافية)


         4:غير حساسة للون الثياب .


ولكن من مساوئ هذه الطريقة:


       بأنها حساسة للزاوية التي يتم التقاط الصورة منها(الصور تم التقاطها بشكل مباشر أم جانبي), تماماً مثل المشكلة التي نواجهها في تطبيقات التعرف على الوجه.


(في الصورة ( a ) أدناه توضيح للزوايا المختلفة التي يمكن التقاط الصور منها )


 


 


steps-patterns


 


 


 


 


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


وصف التفاصيل التقنية باختصار


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


إذ يتم مقارنة هذه الأطر المفتاحية مع الأطر الموجودة في مجموعة التدريب ,إذ يتم  فعلياً استخدام خوارزمية تصنيف للأطر, تصنف الأطر التي نختبرها ,مع الأطر الأقرب لها في مجموعة التدريب,وذلك باعتماد معيارمعين لقياس البعد.


 [1]   خطوات الخوارزمية هي كالتالي:


1 : يتم استخلاص صورة مظللة للشخص من الصورة .


2 :يتم تحليل دورة المشي بهدف استحصال الأطر المفتاحية منها.


3:استخلاص النموذج(القالب).


4:مطابقة النماذج بهدف التحقق من شخص ما.


تتضمن الخطوة الأخيرة عملية تصنيف للنماذج و اختيار النموذج الأقرب اعتماداً على مفاهيم رياضية في قياس البعد .


                                                                                                                            


وفيما يلي شرح تقني مبسط جداً لخطوات الخوارزمية السابقة :


 


1 – يتم استخلاص صورة مظللة للشخص من الصورة .


(Silhouette Extraction)


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


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




 1


الصورة على اليمين تمثل الصورة المظللة المستحصلة من الصورة اليسارية.   نجد في الشكل( d)


 


والصورة التالية تمثل بعض الصور المظللة المستحصلة ,والحاوية على بعض الضجيج الناتج من ظلال الأشخاص المنعكسة على الأرضية.


 


2 


2 – يتم تحليل دورة المشي بهدف استحصال الأطر المفتاحية منها.


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


 


يتم حساب هذه الوقفات العلامة من خلال ملاحظة الدورية في الصور المظللة.


3 


وكما نلاحظ في الصورة أعلاه


 بأن هنالك 4 وقفات علامة يمكن استحصالها من الصور المظللة, ألا و هي :


    Double support1+2: وضعية الدعم المزدوج (


         عندما تكون القدمان على الأرض و القدم اليمينية/اليسارية في المقدمة.


 3+4: وضعية التوسط اليميني اليساري  Right/Left midstance


        عندما تكون القدمان قريبتان من بعضهما البعض مع القدم   اليمنى/ اليسرى المتأرجحة تمر للتو من مستوى القدم  اليسرى / اليمنى.


 


3- استخلاص النموذج(القالب).


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


4



بعد ذلك ثم يتم تعليم كل قالب بحسب نوع الإطار الممثل له (الدعم المزدوج أم التوسط اليميني/ اليساري)


       ومن ثم يتم تشكيل مجموعة التدريب  لتكون مؤلفة من كل قوالب الأطر المفتاحية المستخلصة من كل تتالي لطريقة مشي معدة لتضمن ضمن مجموعة التدريب.


 


4-:مطابقة النماذج بهدف التحقق من شخص ما.


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


خاتمة:


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


ونعيد ونؤكد بأن هدفنا في هذه المقالة هو التنويه عن هذه الطريقة والإشارة إلى وجودها لاأكثر


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




























جدول المصطلحات المستخدمة


Silhouette


Dark image outlined against lighter background


صورة مُظللة


Gait


way of walking


طريقة المشي


Biometrics


Branch of biology that studies the statistics of living organisms


مقاييس


Classification


sorting, systematic arranging


تصنيف


Key frames


 


أطر مفتاحية


 




















 


مراجع للاستزادة


[1]


 Robert T.Collins,Ralph Gross and Jianbo Shi Robotics Institute, Carnegie Mellon University Email:


_ rcollins,rgross,jshi_ @cs.cmu.edu


Silhouette-based Human Identification from Body Shape


And Gait


[2]


Ralph Gross and Jianbo Shi from


Robotics Institute Carnegie Mellon University


‘The CMU Motion of Body ( MoBo) Database’


 


[3]


James J. Little
Department of Computer Science
University of British Columbia


Jeffrey E. Boyd
Department of Electrical and Computer Engineering
University of California at San Diego


‘Recognizing People by Their Gait: The Shape of Motion


[4]


Mark S.Nixon   and John N.Carter


Michael G.Grant and Layla Gordon


‘Automatic recognition by gait: progress and prospects’


 


Follow

Get every new post delivered to your Inbox.