إرشيف شهر February, 2010

نهاية الفصل الأول من : كيف تفكر كعالم كمبيوتر بإستخدام لغة بايثون

http://farm3.static.flickr.com/2104/2053402123_171fa3ff41.jpg

تحدثنا سابقا في كتابنا “كيف تفكر كعالم كمبيوتر بإستخدام لغة بايثون” عن مقدمة اللغة و كيف تعمل و الجزء الثاني من المقدمة

و ما هي عملية إصلاح الأخطاء البرمجية Debugging ؟ واليوم سأتحدث معك قليلا عن نهاية الفصل الأول وهو :

اللغات الطبيعية واللغات الرمزية

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

اللغات الشكلية Formal Languages (أفضل أكثر لفظ الرمزية للتوضيح) : وهي اللغات المصنعة بواسطة البشر ولها نظرية خاصة تسمى نظرية اللغات الرمزية ولها إستخدامات في مجالات متعددة مثل رموز علم الرياضيات .. والكيميائيون أيضا يستخدمون اللغات الرمزية للتدليل على العناصر الكيميائية في المعادلات ..
والذي يهمنا في علوم الكمبيوتر هو أن لغات البرمجة عموما هي نوع اخر من اللغات الرمزية صممت خصيصا للتعبير عن العمليات الحسابية التي يقوم بها الكمبيوتر
أما عن وظيفة اللغات الرمزية فيمكننا تلخيصها أنها تضع القواعد الكتابية للغات العلمية بمعنى أننا لو نتحدث عن معادلة رياضية وقلت لك أن 3+3 = 6 هي معادلة صحيحة في التركيب اللغوي الرياضي (إن إعتبرنا المعادلة هي جملة في لغة الرياضيات) لكن إن قلت لك أن 3=+6$ فهي جملة غير مفهومة رياضيا .. وأيضا لو تحدثنا عن رمز كيميائي وقلت لك H2O فأنت تعرف عن ماذا أتحدث لكن لو قلت لك 2Zz فهي بالنسبالك رمز غير مفهوم على الأقل كيميائيا .. ربما عند سكان الكواكب الأخرى يكون عنوان البريد الإلكتروني لشخص ما ! :)

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

النوع الثاني هو الترتيب المنطقي للكلمات والرموز في الجملة البرمجية أو المعادلة الكيميائية أو الرياضية .. فغير مفهوم (بالنسبة لنا على الأقل) أن نقول 3+-=5 ! فلعلامة + أو – أو = مكان محدد في المعادلات الرياضية وما غير ذلك غير منطقي رياضيا .

ولكن رغم أن اللغات البشرية واللغات الرمزية يشتركون في النقاط السابقة لكنها أيضا تختلف في أشياء أخرى :

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

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

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

الشعر والكلام الموسيقي

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

يمكنك إستعراض تمارين هذا الفصل من هنا .. شاركني بحلهم ! :) ..

الأن نكون قد إنتهينا من الفصل الأول في كتاب “كيف تفكر كعالم كمبيوتر بإستخدام لغة بايثون”

مصدر الصورة

برمجة سعيدة ! :)

التعليقات: 1 | الزيارات: 759 views | التاريخ: 2010/02/21

؟Debugging ما هي عملية إصلاح الأخطاء البرمجية

http://karimali.net/images/error.jpg

عملية البرمجة هي عملية معقدة .. ولأنها تنفذ دائما بأيدي بشرية فينتج عنها دائما أخطاء .. والخطأ البرمجي له إسم شائع باللغة الإنجليزية يسمى Bug أو حشرة ! وقد سميت بهذا الإسم بسبب موقف حدث في عام 1947 في جامعة هارفارد في أحد المشاريع الواعدة لتصنيع كمبيوتر كانت المهندسة Grace Murray Hopper تخطط للمشروع وما إلى ذلك ثم إلتصقت حشرة في مكان مهم من الورقة التي تعمل عليها جريس ! ومن وقتها سميت الأخطاء البرمجية بهذا الإسم نسبة لها .. (يمكنك مشاهدة الورقة الحقيقة التي نتحدث عنها من هنا حشرة تاريخية ! :)

إذا كما إتفقنا الخطأ البرمجي يسمى بـ Bug وعملية اللحاق بهم وتصحيحهم تسمى Debugging .. أو ملاحقة الحشرات !! :)

وهناك 3 أنواع من الأخطاء البرمجية :-

Syntax errors الأخطاء الكتابية :

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

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

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

عملية إصلاح الأخطاء البرمجية :

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

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

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

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

على سبيل المثال نظام التشغيل لينوكس Linux يحتوي على الملايين من سطور الأكواد البرمجية ولكن الفكرة بدأت ببرنامج بسيط جدا (بالمقارنة) كتبه Linus Torvalds وكانت وظيفته العمل على الدائرة الإلكترونية في معالج إنتل Intel 80386 chip .. ويمكن تصويره ببرنامج يقوم بطباعة أأأ و بـ بـ بـ .. هذا البرنامج تتطور حتى أصبح نظام التشغيل لينوكس في يومنا .. فهل يمكن أن نطلق على نظام التشغيل هذا أنه عملية إصلاح أخطاء برمجية ؟!  (مقتبس من دليل مستخدم لينوكس) ..

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

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

والسلام عليكم لحين التدوينة القادمة :) ..
التعليقات: 2 | الزيارات: 865 views | التاريخ: 2010/02/13

! إخترق برامجك

http://karimali.net/images/funnyhacker.jpg
الإسبوع الماضي كان أسبوعاً مشغول جدا جدا .. ربما لم يكن كذلك لولا خطأ يدوي إرتكبته أخر الإسبوع الماضي بحذفي لمشروع كامل في عملي مع عدد لا بأس به من النسخ الإحتياطية .. مما جعل عرض البرنامج على العميل يومها شيئا مستحيلا !! ولم يكن من الممكن في هذا المشروع أن أستخدم برامج VCS للعمل من على كمبيوتر أخر والإحتفاظ بالنسخة الأصلية مهما حدث لبعض إحتياطات السرية من قبل العميل ..

طبعا الحمد لله قدر الله وما شاء فعل ..

المهم الأن نقطتين .. هو ما نستفيد من التجربة؟

أولا ما كان يجب أن أفعله ؟
لكي لا أتعرض لمشكلة مثل هذه هو الإحتفاظ بنسخة إحتياطية خارج الكمبيوتر تماما .. هناك عدة أفكار ربما يمكنني تنفيذها في الفترة القادمة منها الإحتفاظ بنسخة إحتياطية على مكان ما على الإنترنت كملف مضغوط واحد للإحتفاظ بالسرية في بعض المشاريع .. الحل الأخر الذي مايزال مقلقا هو الإحتفاظ بالبيانات على Hard Disk خارجي أو على Flash Memory ولكنها بالنسبالي ما تزال غير مريحة فهي معرضة للتلف في أي وقت بشكل كامل ! (هل عندك أفكار تشاركني بها؟)

ثانيا ما فعلته ؟
هو إستخدام طرق تقصير مسافات .. وتقليل الوقت الذي إحتجته لتطوير البرنامج من البداية بشكل كوميدي ! هو إختراق برنامجي في حد ذاته ! كيف؟
ما إستطعت إنقاذه من بيانات مشروعي هو النسخة الكاملة التجريبية التي تعمل على الـ Server الخاص بالعميل .. والمشكلة الموجودة في برامج الويب Web Apps المطورة بـ ASP.NET (وهي مشكلة في عملية الإختراق فقط لحد الأن) هي في حالة إغلاق البرنامج وتحويل ملفاته إلى DLL مغلقة أكود المصدر .. في هذه الحالة يمكننا إختراق البرنامج وإعادة الملفات المغلقة هذه لهيئتها الأولية التي طورتها عليها بإستخدام برنامج NET Reflector. .. كل ما عليك هو إعطائه ملف الـ DLL وهو يرجعه إلى صورته الأصلية من جديد ! :) .. كل هذا إختصر علي فترة طويلة جدا إلى إسبوع واحد لإسترجاع كل ما فقدته الحمد لله ..

أتمنى أن لا تسىء إستخدامه !

مصدر الصورة

والسلام عليكم لحين التدوينة القادمة :)

التعليقات: 3 | الزيارات: 327 views | التاريخ: 2010/02/06

Switch to our mobile site