قدمت اليوم ندوة عن لغة كلمات في كلية الحاسبات والمعلومات/جامعة عين شمس، وكانت فرصة جيدة لكي أقدم عرضاً لإمكانات اللغة كلها، إذ أن الوثائق السابقة كانت قديمة نوعاً ما وكان ينقص اللغة مرجع شامل.
الملف الذي استخدمته في العرض متاح للتحميل بأن تضغط هنا وهو في صيغة PDF
الثلاثاء، 26 يوليو 2011
الأربعاء، 20 يوليو 2011
GP Ideas: 1- Sketchcode
Concept
Let users write programs by sketching; either using paper+scanner or using a tablet computer.
More info
I have an incomplete design of a sketch-based programming language that combines text and graphics elements. Data structures like linked lists or trees would be expressed by their familiar sketch notations, while functions would resemble their familiar text representation enriched by some additional notation gained from using a pen.
I can show my designs to interested teams, but I won't post pictures here on my blog for obvious reasons :)
The project will have two major subsystems and 3 major stages. The subsystems are
(a) Sketch recognizer
(b) Code generator [or interpreter].
The stages are
(a) Language design
(b) Implementing sketch recognizer
(c) Implementing code generation
Stages (b) and (c) could probably be done in parallel assuming a complete language specification was made beforehand.
I cannot officially supervises the project of course, but I am prepared to participate in the design of the full language.
Challenges and risks
The first challenge is in the design of a language that is usable for the sketch medium and expressive enough to represent complex programs without cluttering the area with complex, unclear sketches.
The second is the usual risk of pattern-based projects: The accuracy of recognition, choice of training algorithms, and so on.
Techniques needed
Patterns recognition, image processing, possibly compilers
Notes
This is related to my technology vision of Awraq
Let users write programs by sketching; either using paper+scanner or using a tablet computer.
More info
I have an incomplete design of a sketch-based programming language that combines text and graphics elements. Data structures like linked lists or trees would be expressed by their familiar sketch notations, while functions would resemble their familiar text representation enriched by some additional notation gained from using a pen.
I can show my designs to interested teams, but I won't post pictures here on my blog for obvious reasons :)
The project will have two major subsystems and 3 major stages. The subsystems are
(a) Sketch recognizer
(b) Code generator [or interpreter].
The stages are
(a) Language design
(b) Implementing sketch recognizer
(c) Implementing code generation
Stages (b) and (c) could probably be done in parallel assuming a complete language specification was made beforehand.
I cannot officially supervises the project of course, but I am prepared to participate in the design of the full language.
Challenges and risks
The first challenge is in the design of a language that is usable for the sketch medium and expressive enough to represent complex programs without cluttering the area with complex, unclear sketches.
The second is the usual risk of pattern-based projects: The accuracy of recognition, choice of training algorithms, and so on.
Techniques needed
Patterns recognition, image processing, possibly compilers
Notes
This is related to my technology vision of Awraq
Labels:
awraq,
fcis,
graduation-projects
الأحد، 10 يوليو 2011
الخميس، 7 يوليو 2011
قوائم متسلسلة في كلمات
تريد أن تحل مسألة ACM بكلمات؟ سوف تحتاج بضعة أشياء، منها القوائم المتسلسلة Linked lists. هيا نبدأ في عملها - أول ما نحتاجه هو فصيلة class يعبر عن حلقة في السلسلة. ما يكافيء node في لغات البرمجة الأجنبية :)
فصيلة حلقة :
له بيان
له سابق، تالي
نهاية
هنا لا نعرف methods في فصيلتنا، فقط نعرف مجالات للبيانات data fields.
بالمرة هيا نعرف فصيلة القائمة:
بالمرة هيا نعرف فصيلة القائمة:
فصيلة قائمة :
له أول ، آخر
نهاية
- لإنشاء كائن object من فصيلة معينة نكتب اسم الفصيلة يليه كلمة جديد مثل م = موظف جديد
- للوصول إلى field نكتب اسمه قبل الكائن، أي أن س مركز النقطة في كلمات يكافيء point.center.x في اللغات التقليدية
- الثابت لاشيء يعادل null في اللغات المماثلة للJava أو #C.
الآن نريد أن نضيف إمكانيات الإضافة والمسح من القائمة. هنا ستكون الفصيلة قائمة أكثر من مجرد حاوٍ للبيانات، سوف نضيف إليها methods. قبل أن نضيفها يجب أولاً أن نعرف كيف نستدعيها!
تخيل أن فصيلة القائمة لديها method اسمها اضف(...)، سوف نستدعيها هكذا:
ق : اضف(12)
هذا يكافيء lst.add(12) //add to list في اللغات الأخرى. وهو في كلمات اسمه إرسال رسالة إلى الكائن، والكود التي ستتفذ ستكون استجابة لهذه الرسالة. مثل ال++C لابد أن نعرف الاستجابة على جزئين: نعلن عنها داخل الفصيلة ونكتب تفاصيلها خارج الفصيلة.
أولاً الإعلان:
ثانياً التفصيل:
هنا نعرف method جديدة عن طريق كلمة استجابة. لابد أن نعطي اسماً للكائن متلقي الرسالة هو هنا ق (في اللغات التقليدية يكون الاسم اوتوماتيكيا this ، لكن هنا لابد من إعطاء اسم).
لاحظ كيف أن الكلام يبدو طبيعياً جداً... استجابة قائمة ق لـ"أضف عنصر" هو افعل كذا كذا..نهاية. هذا لأن كلمات لغة برمجة تستمد جمالها من جمال اللغة العربية™
الآن يمككنا أن نكتب الكود أخيراً:
أنظروا! استطيع كتابة كود الإضافة إلى قائمة!! سنترك كود المسح كتمرين للطالب :)
كلمة استجابة في كلمات، مثل كلمة إجراء، تعبر عن void function, void method. ماذا لو أردنا عمل شيء يعود بقيمة؟ هنا بدلاً من استخدام كلمة استجابة سوف نستخدم كلمة رد.
ثم نكتب تنفيذ الرد:
الآن..نستطيع اختبار البرنامج:
قد يهم محبي النحو سبب تسميتنا للرد بإسم عددهم ؛ هذا يجعل التعبير كله يأخذ صورة بدل الجزء من الكل/بدل الاشتمال في اللغة العربية. هل تذكر في المدرسة "أعجبني الخروف صوفه"؟ نحن هنا نقول "اطبع الوجبات عددهم" :)
القائمة طبعاً تنقصها إمكانات كثيرة مثل الإضافة في الأول، المسح من الأول والآخر، ....الخ، لكني لن استأثر بالمتعة كلها لنفسي. ها هي الكود المكتوبة حتى الآن كاملةً:
تخيل أن فصيلة القائمة لديها method اسمها اضف(...)، سوف نستدعيها هكذا:
ق : اضف(12)
هذا يكافيء lst.add(12) //add to list في اللغات الأخرى. وهو في كلمات اسمه إرسال رسالة إلى الكائن، والكود التي ستتفذ ستكون استجابة لهذه الرسالة. مثل ال++C لابد أن نعرف الاستجابة على جزئين: نعلن عنها داخل الفصيلة ونكتب تفاصيلها خارج الفصيلة.
أولاً الإعلان:
فصيلة قائمة :
له أول ، آخر
-- هنا أعلننا عن الاستجابة
يستجيب ل: اضف ( عنصر )
نهاية
استجابة قائمة ق ل: اضف ( عنصر ) :
-- سوف نكتب التنفيذ هنا
نهاية
لاحظ كيف أن الكلام يبدو طبيعياً جداً... استجابة قائمة ق لـ"أضف عنصر" هو افعل كذا كذا..نهاية. هذا لأن كلمات لغة برمجة تستمد جمالها من جمال اللغة العربية™
الآن يمككنا أن نكتب الكود أخيراً:
استجابة قائمة ق ل: اضف ( العنصر ) :
ح = حلقة جديد
بيان ح = العنصر
إذا أول ق = لاشيء :
أول ق = ح
آخر ق = ح
وإلا :
تالي آخر ق = ح
سابق ح = آخر ق
آخر ق = ح
تم
نهاية
كلمة استجابة في كلمات، مثل كلمة إجراء، تعبر عن void function, void method. ماذا لو أردنا عمل شيء يعود بقيمة؟ هنا بدلاً من استخدام كلمة استجابة سوف نستخدم كلمة رد.
فصيلة قائمة :
له أول ، آخر
يستجيب ل: اضف ( عنصر )
-- هنا عرفنا رداً جديداً
يرد على عددهم ( )
نهاية
رد قائمة ق على عددهم ( ) :
إذا أول ق = لاشيء :
ارجع ب: 0
وإلا :
النتيجة = 0
أ = أول ق
طالما ليس أ = لاشيء :
النتيجة = النتيجة + 1
أ = تالي أتابع
ارجع ب: النتيجة
تم
نهاية
الوجبات = قائمة جديد
الوجبات : اضف ( "شاورمة" )
الوجبات : اضف ( "مجبوس" )
الوجبات : اضف ( "فول وطعمية" )
اطبع الوجبات : عددهم ( )
القائمة طبعاً تنقصها إمكانات كثيرة مثل الإضافة في الأول، المسح من الأول والآخر، ....الخ، لكني لن استأثر بالمتعة كلها لنفسي. ها هي الكود المكتوبة حتى الآن كاملةً:
فصيلة حلقة :
له بيان
له تالي ، سابق
نهاية
فصيلة قائمة :
له أول ، آخر
يستجيب ل: اضف ( عنصر )
يرد على عددهم ( )
نهاية
رد قائمة ق على عددهم ( ) :
إذا أول ق = لاشيء :
ارجع ب: 0
وإلا :
النتيجة = 0
أ = أول ق
طالما ليس أ = لاشيء :
النتيجة = النتيجة + 1
أ = تالي أ
تابع
ارجع ب: النتيجة
تم
نهاية
استجابة قائمة ق ل: اضف ( العنصر ) :
ح = حلقة جديد
بيان ح = العنصر
إذا أول ق = لاشيء :
أول ق = ح
آخر ق = ح
وإلا :
تالي آخر ق = ح
سابق ح = آخر ق
آخر ق = ح
تم
نهاية
الوجبات = قائمة جديد
الوجبات : اضف ( "شاورمة" )
الوجبات : اضف ( "مجبوس" )
الوجبات : اضف ( "فول وطعمية" )
اطبع الوجبات : عددهم ( )
فلتكن أشياء حقيقية
من يريد ألا تصبح مملاً عليه ألا يجعل تفكيره يقتصر على الأشياء المجردة؛ بل يفكر في أشياء حقيقية.
من الأشياء المجردة في الحياة: المال، فهو أرقام، والمنصب، فهو كلمة على ورقة. من الأشياء الحقيقية في الحياة: طعم الآيس كريم، يوم من المزاح مع أبنائك، سرير مريح.
لكنك تقول أن المال والمنصب أشياء حقيقية وليست مجردة: المال يستطيع أن يبتاع سيارات وبيوت وكتب وآيس كريم...حتى السرير المريح يستطيع المال أن يشتريه، أليس هذا مذهلاً؟؟؟
نفس الشيء بالنسبة للمنصب، إنه يعطينا قدرة أكبر على التأثير في الناس وإصلاح المجتمع، كيف هو غير حقيقيّ؟
قصدي من هذا المقال ليس الحديث عن طبيعة الأشياء لكن عن نظرتي ونظرتك لها.
هناك من يريد المال لكن حين يفكر فيه لا يفكر في رصيد كبير في البنك: يفكر في الأجهزة الإلكترونية المغرية التي يستطيع أن يشتريها، أو البيت الواسع الذي يريد السكن فيه، أو المصنع التي يريد أن يفتحه..
في مقابل ذلك هناك أشخاص يحبون المال في حد ذاته: يعيشون حياتهم في عمل دؤوب لا هم لهم سوى جمعه، مع أنهم بالفعل قد جمعوا كل ما يحتاجونه وأكثر! لديهم ما يكفي لشراء كل ما يمكن أن يسعدهم وأضعاف ذلك لكنهم لم يكتفوا.
هنا نجد أن الشخص لا يجد السعادة في ما يشتريه المال له بل في أرقام: العشرة ملايين أفضل من المليون، المليار أفضل. والأرقام - كما نعلم - هي أشياء مجردة لا حقيقية.
نفس الشيء بالنسبة للمنصب: هناك من يفرح بمنصب وزير لأنه يجلس على مكتب الوزير، والكروت في محفظته مكتوب عليها وزير، والكل يكلمه باحترام ويفتتح الكلام بعبارة "السيد فلان، وزير كذا". يفكر هو في المجتمع كأنه خط يمتد من الأعلى للأسفل وكل منا نقطة على هذا الخط ، وهو بمنصبه هذا قد زحزح نقطته لمكان أعلى في خط المجتمع. والنقط والخطوط هي كما نعلم....أشياء مجردة.
لكن هناك وزير آخر يحلم أحلاماً مختلفة: يحلم بالفقراء وهم يأكلون خبزاً كثيراً على موائدهم، أوشوارع واسعة غير مزدحمة، أو فدادين وفدادين من أشجار البرتقال تطرح الثمر اللذيذ بوفرة.
هذه أشياء حقيقية
من الأشياء المجردة في الحياة: المال، فهو أرقام، والمنصب، فهو كلمة على ورقة. من الأشياء الحقيقية في الحياة: طعم الآيس كريم، يوم من المزاح مع أبنائك، سرير مريح.
لكنك تقول أن المال والمنصب أشياء حقيقية وليست مجردة: المال يستطيع أن يبتاع سيارات وبيوت وكتب وآيس كريم...حتى السرير المريح يستطيع المال أن يشتريه، أليس هذا مذهلاً؟؟؟
نفس الشيء بالنسبة للمنصب، إنه يعطينا قدرة أكبر على التأثير في الناس وإصلاح المجتمع، كيف هو غير حقيقيّ؟
قصدي من هذا المقال ليس الحديث عن طبيعة الأشياء لكن عن نظرتي ونظرتك لها.
هناك من يريد المال لكن حين يفكر فيه لا يفكر في رصيد كبير في البنك: يفكر في الأجهزة الإلكترونية المغرية التي يستطيع أن يشتريها، أو البيت الواسع الذي يريد السكن فيه، أو المصنع التي يريد أن يفتحه..
في مقابل ذلك هناك أشخاص يحبون المال في حد ذاته: يعيشون حياتهم في عمل دؤوب لا هم لهم سوى جمعه، مع أنهم بالفعل قد جمعوا كل ما يحتاجونه وأكثر! لديهم ما يكفي لشراء كل ما يمكن أن يسعدهم وأضعاف ذلك لكنهم لم يكتفوا.
هنا نجد أن الشخص لا يجد السعادة في ما يشتريه المال له بل في أرقام: العشرة ملايين أفضل من المليون، المليار أفضل. والأرقام - كما نعلم - هي أشياء مجردة لا حقيقية.
نفس الشيء بالنسبة للمنصب: هناك من يفرح بمنصب وزير لأنه يجلس على مكتب الوزير، والكروت في محفظته مكتوب عليها وزير، والكل يكلمه باحترام ويفتتح الكلام بعبارة "السيد فلان، وزير كذا". يفكر هو في المجتمع كأنه خط يمتد من الأعلى للأسفل وكل منا نقطة على هذا الخط ، وهو بمنصبه هذا قد زحزح نقطته لمكان أعلى في خط المجتمع. والنقط والخطوط هي كما نعلم....أشياء مجردة.
لكن هناك وزير آخر يحلم أحلاماً مختلفة: يحلم بالفقراء وهم يأكلون خبزاً كثيراً على موائدهم، أوشوارع واسعة غير مزدحمة، أو فدادين وفدادين من أشجار البرتقال تطرح الثمر اللذيذ بوفرة.
هذه أشياء حقيقية
الخميس، 23 يونيو 2011
الكرات المتحركة - مثال بكلمات
نريد أن نبدأ بتحريك كرة واحدة، ثم بعد ذلك نتصرف في باقي الكرات.
(اعتبر الإجراء مثل void function).
هذا الإجراء يأخذ اربع عوامل:
الأمر هنا بسيط: الأمر ارسم.طيف/في يأخذ طيفاً ويرسمة في نقطة محددة هي هنا نقطة البداية، ثم نغير هذه النقطة كل مرة حسب متجه السرعة، بأن نضيف السرعة في الاتجاه السيني إلى س ونفس الشيء في ص. لاحظ أن المصفوفات في كلمات تبدأ من الواحد.
نكرر هذه العملية باستمرار مع انتظار بسيط - 15 ميلليثانية - بين رسمة والأخرى
المشكلة هنا هي أن الكرة ستخرج من الشاشة بعد قليل وتختفي، نحن نريدها أن "تصطدم" بالشاشة ومن ثم تغير اتجاهها. خطتنا بسيطة:
الحافة اليمنى هي النقطة س=صفر، فأن كانت س أقل من الصفر فمعنى هذا أن الكرة توشك أن تخرج، فنعيدها مرة أخرى إلى الحافة ونعكس إشارة المكون الأول للسرعة. لاحظ أن نظام الإحداثيات يساير الكتابة العربية (س تزداد من اليمين لليسار).
ماذا يحدث لو تجاوزت الكرة يسار الشاشة؟ هذا:
شاشة الرسم في كلمات عرضها 800 نقطة وارتفاعها 600، لذلك النقطة في أقصى اليسار هي النقطة 799 لأن العد يبدأ من الصفر.
إذا تجاوزت حافة الكرة اليسرى (المحددة بقيمة س + عرض الكرة) هذا الحد نعيد الحافة اليسرى للنقطة الأخيرة. لاحظ أن التخصيص
سنفعل نفس الشيء مع قيم ص ليكون الإجراء الكامل كالآتي:
عظيم!! لقد أنهينا الإجراء. لم يتبق سوى استدعاؤه:
هنا قمنا باستخدام الدالة الجاهزة حمل.طيف لنقوم بتحميل صورة للكرة وتكوين طيف منها، ثم ولدنا بعض القيمة العشوائية لمكان الكرة وسرعتها وقمنا بتمريرهم إلى الإجراء. لاحظ كيف يمكن عمل مصفوفة من عنصرين بالتعبير [ أ، ب] كما فعلنا للمتغير السرعة
يمكننا الآن أن ننفذ البرنامج:
للأسف لقطة الشاشة لا تبين روعة الكرة وهي تجري..كان ينبغي أن أضع فيديو لهذا المثال على اليوتيوب :]
الآن نريد أن نجعل البرنامج يتحرك فيه كرات كثيرة...هذا في الواقع أسهل مما نتخيل بسبب إمكانات البرمجة المتوازية في لغة كلمات. الأمر شغل يأخذ الصيغة التالية:
شغل <استدعاء إجراء>
ومعناه "استدع هذا الإجراء بحيث يعمل على التوازي مع باقي البرنامج وأي إجراءات أخرى". كل ما علينا الآن هو تشغيل عدة نسخ من الإجراء على التوازي ليكون لدينا كرات كثيرة!
(ملاحظة: تنفيذ الإجراءات في الواقع لن يكون متوازياً، بل ستقوم الآلة الافتراضية virtual machine الخاصة بكلمات بالانتقال بسرعة بين إجراء والآخر ليبدو الأمر كأنه على التوازي. في المستقبل ننوي تغيير الآلة الافتراضية لتحقيق توازٍ حقيقي).
سيبدو تنفيذ الإجراء الآن كالآتي، لنحرك عشر كرات عشوائياً:
جميل، لكن الكرات كلها من نفس اللون، نريد أن يكون الأمر متنوعاً قليلاً..نرى الآن البرنامج في صورته النهائية:
لتحميل المثال كاملاً:
اضغط هذا الرابط
لتحميل لغة كلمات:
http://code.google.com/p/kalimat/downloads
أو من الموقع الرسمي http://www.kalimat-lang.com
إجراء حرك.الكرة ( طيف ، س ، ص ، السرعة ) : -- سوف نكتب كود هنا نهاية
هذا الإجراء يأخذ اربع عوامل:
- طيف هو الطيف الذي يعبر عن رسمة الكرة؛ الطيف شكل متحرك يرسم على الشاشة (sprite) وسنعرف الآن كيف نتعامل معه
- س، ص هو المكان الذي نريد أن يبدأ فيه رسم الكرة
- السرعة هو مصفوفة (array) من عنصرين يعبر عن متجه vector فيه سرعة الكرة في الاتجاهين السيني والصادي
إجراء حرك.الكرة ( طيف ، س ، ص ، السرعة ) : كرر : ارسم.طيف طيف في ( س ، ص ) س = س + السرعة [ 1 ] ص = ص + السرعة [ 2 ] انتظر(15) تابع نهاية
نكرر هذه العملية باستمرار مع انتظار بسيط - 15 ميلليثانية - بين رسمة والأخرى
المشكلة هنا هي أن الكرة ستخرج من الشاشة بعد قليل وتختفي، نحن نريدها أن "تصطدم" بالشاشة ومن ثم تغير اتجاهها. خطتنا بسيطة:
- إذا اصطدمت الكرة بقمة الشاشة أو قاعها، نقلب إشارة السرعة في الاتجاه الصادي فنحيلها من موجبة لسالبة أو بالعكس، وبذلك تنزل الكرة مثلاً إن كانت تصعد.
- إذا اصطدمت بيمين الشاشة أو يسارها نغير إشارة المكون السيني للسرعة
- في الحالتين إن كانت الكرة تكاد أن تُرسم خارج الشاشة نعيد مكانها لحافة الشاشة
إذا س < 0 : س = 0 السرعة [ 1 ] = - السرعة [ 1 ] تم
ماذا يحدث لو تجاوزت الكرة يسار الشاشة؟ هذا:
إذا س + عرض.الطيف ( طيف ) > 799 : س = 799 - عرض.الطيف ( طيف ) السرعة [ 1 ] = - السرعة [ 1 ] تم
إذا تجاوزت حافة الكرة اليسرى (المحددة بقيمة س + عرض الكرة) هذا الحد نعيد الحافة اليسرى للنقطة الأخيرة. لاحظ أن التخصيص
س = 799 - عرض.الطيف ( طيف )معناه اجعل س + عرض الطيف = 799، أي اجعل الحافة اليسرى بهذه القيمة.
سنفعل نفس الشيء مع قيم ص ليكون الإجراء الكامل كالآتي:
إجراء حرك.الكرة ( طيف ، س ، ص ، السرعة ) : كرر : ارسم.طيف طيف في ( س ، ص ) س = س + السرعة [ 1 ] ص = ص + السرعة [ 2 ] إذا س < 0 : س = 0 السرعة [ 1 ] = - السرعة [ 1 ] وإلا إذا س + عرض.الطيف ( طيف ) > 799 : س = 799 - عرض.الطيف ( طيف ) السرعة [ 1 ] = - السرعة [ 1 ] تم إذا ص < 0 : ص = 0 السرعة [ 2 ] = - السرعة [ 2 ] وإلا إذا ص + ارتفاع.الطيف ( طيف ) > 599 : ص = 599 - ارتفاع.الطيف ( طيف ) السرعة [ 2 ] = - السرعة [ 2 ] تم انتظر ( 15 ) تابع نهاية
ط = حمل.طيف ( "ball1.bmp" )
س = عشوائي ( 800 )
ص = عشوائي ( 600 )
السرعة.س = عشوائي ( 20 ) + 1
السرعة.ص = عشوائي ( 20 ) + 1
السرعة = [ السرعة.س ، السرعة.ص ]
حرك.الكرة ( ط ، س ، ص ، السرعة )
يمكننا الآن أن ننفذ البرنامج:
للأسف لقطة الشاشة لا تبين روعة الكرة وهي تجري..كان ينبغي أن أضع فيديو لهذا المثال على اليوتيوب :]الآن نريد أن نجعل البرنامج يتحرك فيه كرات كثيرة...هذا في الواقع أسهل مما نتخيل بسبب إمكانات البرمجة المتوازية في لغة كلمات. الأمر شغل يأخذ الصيغة التالية:
شغل <استدعاء إجراء>
ومعناه "استدع هذا الإجراء بحيث يعمل على التوازي مع باقي البرنامج وأي إجراءات أخرى". كل ما علينا الآن هو تشغيل عدة نسخ من الإجراء على التوازي ليكون لدينا كرات كثيرة!
(ملاحظة: تنفيذ الإجراءات في الواقع لن يكون متوازياً، بل ستقوم الآلة الافتراضية virtual machine الخاصة بكلمات بالانتقال بسرعة بين إجراء والآخر ليبدو الأمر كأنه على التوازي. في المستقبل ننوي تغيير الآلة الافتراضية لتحقيق توازٍ حقيقي).
سيبدو تنفيذ الإجراء الآن كالآتي، لنحرك عشر كرات عشوائياً:
لكل أ من 1 إلى 10 : ط = حمل.طيف ( "ball1.bmp" ) س = عشوائي ( 800 ) ص = عشوائي ( 600 ) السرعة.س = عشوائي ( 20 ) + 1 السرعة.ص = عشوائي ( 20 ) + 1 السرعة = [ السرعة.س ، السرعة.ص ] شغل حرك.الكرة ( ط ، س ، ص ، السرعة ) تابع
جميل، لكن الكرات كلها من نفس اللون، نريد أن يكون الأمر متنوعاً قليلاً..نرى الآن البرنامج في صورته النهائية:ملفات.الأطياف=["ball4.bmp"،"ball3.bmp"،"ball2.bmp"،"ball1.bmp"] لكل أ من 1 إلى 10 : ط = حمل.طيف ( ملفات.الأطياف [ عشوائي ( 4 ) + 1 ] ) س = عشوائي ( 800 ) ص = عشوائي ( 600 ) السرعة.س = عشوائي ( 20 ) + 1 السرعة.ص = عشوائي ( 20 ) + 1 السرعة = [ السرعة.س ، السرعة.ص ] شغل حرك.الكرة ( ط ، س ، ص ، السرعة ) تابع إجراء حرك.الكرة ( طيف ، س ، ص ، السرعة ) : كرر : ارسم.طيف طيف في ( س ، ص ) س = س + السرعة [ 1 ] ص = ص + السرعة [ 2 ] إذا س < 0 : س = 0 السرعة [ 1 ] = - السرعة [ 1 ] وإلا إذا س + عرض.الطيف ( طيف ) > 799 : س = 799 - عرض.الطيف ( طيف ) السرعة [ 1 ] = - السرعة [ 1 ] تم إذا ص < 0 : ص = 0 السرعة [ 2 ] = - السرعة [ 2 ] وإلا إذا ص + ارتفاع.الطيف ( طيف ) > 599 : ص = 599 - ارتفاع.الطيف ( طيف ) السرعة [ 2 ] = - السرعة [ 2 ] تم انتظر ( 15 ) تابع نهاية
لتحميل المثال كاملاً:اضغط هذا الرابط
لتحميل لغة كلمات:
http://code.google.com/p/kalimat/downloads
أو من الموقع الرسمي http://www.kalimat-lang.com
Labels:
arabic-posts,
kalimat,
programming,
tutorials
الجمعة، 17 يونيو 2011
آلة حاسبة بلغة كلمات
لا تحتاج خبرة سابقة بالبرمجة بلغة كلمات لتتابع هذا المثال (لكن تحتاج لأن تعرف البرمجة بشكل عام). إذا أردت أن تجربه عملياً فيمكنك تحميل أحدث نسخة من اللغة من http://code.google.com/p/kalimat/downloads
هام: هذا المثال يحتاج نسخة يونيو 2011 أو أحدث ليعمل. لو كنت قد حملت نسخة قديمة من كلمات فستحتاج أن تحمل نسخة جديدة.
الآن هيا نبدأ!
رسم الأزرار على الشاشة
زر1 = زر جديد زر1 : حدد.المكان ( 10 ، 10 ) زر1 : حدد.الحجم ( 30 ، 30 ) زر1 : حدد.النص ( "1" ) ن = النافذة.الحالية ( ) ن : اضف ( زر1 )
ستؤدي الكود السابقة لعرض زر على الشاشة. لاحظ ان علامة النقطتين ' : ' معناها method call، مثل علامة النقطة في لغات البرمجة المعروفة. الأمر جديد هنا هو نفسه operator new في اللغات الأخرى.
نحن سنرسم أزراراً كثيرة في البرنامج، لذلك هيا نكتب دالة (function) توفر علينا عناء الكتابة المتكررة:
دالة صنع.زر(س ، ص ، العرض ، الارتفاع ، النص ، النافذة): ز = زر جديد ز : حدد.المكان ( س ، ص ) ز : حدد.الحجم ( العرض ، الارتفاع ) ز : حدد.النص ( النص ) النافذة : اضف ( ز ) ارجع ب: ز نهاية
الآن وقد صار لدينا دالة تسهل وضع الأزرار يمكننا أن نرسم شكل الآلة الحاسبة، نبدأ أولاً بالأزرار ثم نضيف لاحقاً 'شاشة العرض' التي ستظهر عليها النتيجة:
ن = النافذة.الحالية ( ) زر1 = صنع.زر (40 ، 130 ، 30 ، 30 ، "1" ، ن) زر2 = صنع.زر (70 ، 130 ، 30 ، 30 ، "2" ، ن) زر3 = صنع.زر (100، 130 ، 30 ، 30 ، "3" ، ن) زر4 = صنع.زر (40 ، 100 ، 30 ، 30 ، "4" ، ن) زر5 = صنع.زر (70 ، 100 ، 30 ، 30 ، "5" ، ن) زر6 = صنع.زر (100، 100 ، 30 ، 30 ، "6" ، ن) زر7 = صنع.زر (40 ، 70 ، 30 ، 30 ، "7" ، ن) زر8 = صنع.زر (70 ، 70 ، 30 ، 30 ، "8" ، ن) زر9 = صنع.زر (100 ، 70 ، 30 ، 30 ، "9" ، ن) زر0 = صنع.زر (70 ، 160 ، 30 ، 30 ، "0" ، ن) زر.الجمع = صنع.زر (10 ، 70 ، 30 ، 30 ، "+" ، ن) زر.الطرح = صنع.زر (10 ، 100 ، 30 ، 30 ، "-" ، ن) زر.الضرب = صنع.زر (10 ، 130 ، 30 ، 30 ، "×" ، ن) زر.القسمة = صنع.زر(10 ، 160 ، 30 ، 30 ، "÷" ، ن ) زر.يساوي = صنع.زر (40 ، 160 ، 30 ، 30 ، "=" ، ن) زر.الفاصلة.العشرية = صنع.زر(100، 160، 30، 30، "."، ن)
والآن حان دور شاشة العرض:
الشاشة = سطر.نصي جديد الشاشة : حدد.المكان ( 10 ، 30 ) الشاشة : حدد.الحجم ( 120 ، 30 ) الشاشة : حدد.النص ( "" ) ن : اضف ( الشاشة )
الفصيلة سطر.نصي معناها صندوق لتحرير النصوص من سطر واحد، إن أردت تحرير أكثر من سطر في برنامجك يمكنك استخدام الفصيلة صندوق.نصي
الآن يمكننا تجربة البرنامج:

شكله ظريف، لكن هناك مشكلتان: النافذة حجمها الافتراضي أكبر من اللازم، كما أن عنوانها "تنفيذ البرنامج" عام أكثر مما ينبغي...من السهل تغيير ذلك على أية حال. أضف هذه السطور لآخر البرنامج:
ن : حدد.الحجم ( 150 ، 210 )
ن : حدد.العنوان ( "الحاسبة" )

هذا أفضل بكثير!
ادخال المستخدم للأرقام
الآن بعد عمل "شكل" البرنامج حان وقت اضافة "المضمون". أول شيء نريده هو عرض الأرقام حين يدخلها المستخدم. الأمر نلخصه في القواعد الآتية:
1- إذا ضغط المستخدم زر رقمي [0..9]، اضف الرقم المناظر للزر إلى شاشة العرض
2- إذا ضغط المستخدم زر الفاصلة العشرية اضفه لشاشة العرض إذا كانت هذه أول مرة يضغط فيها، وإلا لا تفعل شيئاً.
قبل أن نبدأ بتنفيذ كل ذلك علينا أن نأخذ جانباً ونعرف كيف نتعامل مع الحوادث (events) مثل ضغط زر او اختيار شيء من قائمة أو ما شابه. يحدث ذلك في كلمات عن طريق مفهوم القنوات.
اضف هذا الجزء لنهاية البرنامج:
كرر : تسلم إشارة من ضغط زر1 الشاشة : الحق.نص ( "1" ) تابع
الأمر
تسلم إشارة من ضغط زر1
سوف يؤدي لأن ينتظر البرنامج حتى يرسل الزر الإشارة المطلوبة قبل المتابعة. سوف تأتي تلك الإشارة حين يضغط المستخدم زر ادخال الواحد1، في تلك الحالة سيضيف البرنامج الرمز "1" لشاشة العرض ويعود إلى حالة الانتظار في حلقة لا نهائية.
لو قمت بتجربة البرنامج الآن ستجد أنه يضيف "1" إلى الشاشة كلما ضغطت الزر المطلوب.
(دور القنوات أكثر بكثير مما قيل هنا، لكن لن نتوسع في الحديث عنها في هذا المثال المبدئي)
كيف نجعله يضيف باقي الأرقام؟ المشكلة أن هذه الكود لن تنفع:
كرر : تسلم إشارة من ضغط زر1 الشاشة : الحق.نص ( "1" ) تسلم إشارة من ضغط زر2 الشاشة : الحق.نص ( "2" ) تابع
ما الحل إذاً؟ لابد من طريقة نقول له أنه هناك أكثر من قناة وعليك استلام اشارة من أي واحدة منها حين تأتي. هذا هو دور الأمر تخير
كرر : تخير : تسلم إشارة من ضغط زر1 : الشاشة : الحق.نص ( "1" ) أو تسلم إشارة من ضغط زر2 : الشاشة : الحق.نص ( "2" ) تم تابع
من السهل تعميم ذلك لندخل الأرقام كلها:
كرر : تخير : تسلم إشارة من ضغط زر1 : الشاشة : الحق.نص ( "1" ) أو تسلم إشارة من ضغط زر2 : الشاشة : الحق.نص ( "2" ) أو تسلم إشارة من ضغط زر3 : الشاشة : الحق.نص ( "3" ) أو تسلم إشارة من ضغط زر4 : الشاشة : الحق.نص ( "4" ) أو تسلم إشارة من ضغط زر5 : الشاشة : الحق.نص ( "5" ) أو تسلم إشارة من ضغط زر6 : الشاشة : الحق.نص ( "6" ) أو تسلم إشارة من ضغط زر7 : الشاشة : الحق.نص ( "7" ) أو تسلم إشارة من ضغط زر8 : الشاشة : الحق.نص ( "8" ) أو تسلم إشارة من ضغط زر9 : الشاشة : الحق.نص ( "9" ) أو تسلم إشارة من ضغط زر0 : الشاشة : الحق.نص ( "0" ) تم تابع
الفاصلة العشرية
سوف نستخدم متغيراً منطقياً اسمه كتبنا.فاصلة.عشرية، في بداية البرنامج سوف تكون قيمته خطأ، ثم نجعل قيمته صحيح حين نضغط زر الفاصلة العشرية لأول مرة. لن يضف البرنامج الرمز "." إلى الشاشة إلا مرة واحدة فقط حين تكون قيمة هذا المتغير خطأ في بداية البرنامج.
كتبنا.فاصلة.عشرية = خطأ كرر : تخير : تسلم إشارة من ضغط زر.الفاصلة.العشرية : إذا كتبنا.فاصلة.عشرية = خطأ : الشاشة : الحق.نص ( "." ) كتبنا.فاصلة.عشرية = صحيح تم أو تسلم إشارة من ضغط زر1 : الشاشة : الحق.نص ( "1" ) أو تسلم إشارة من ضغط زر2 : الشاشة : الحق.نص ( "2" ) ........وهكذا وهكذا الخ الخ تم تابع
العمليات
هيا الآن ننفذ عملية الجمع وسيكون من السهل تعميم الطريقة بعد ذلك لتشمل جميع العمليات. سوف نحتاج هنا متغيران جديدان: متغير اسمه العملية والآخر اسمه العدد.الأول
المتغير المسمى العملية يدل على العملية الحسابية الحالية. في البداية ستكون قيمته نصاً فارغاً، فإذا ضغط المستخدم زر الجمع سنعطيه القيمة "+"، بحيث نعرف ما المطلوب من الحاسبة عند ضغط زر 'يساوي'.
ستأخذ الكود الصورة التالية:
كتبنا.فاصلة.عشرية = خطأ العملية = "" العدد.الأول = لاشيء
كرر : تخير : تسلم إشارة من ضغط زر.الجمع : العملية = "+" العدد.الأول = الشاشة : نصه ( ) العدد.الأول = كعدد ( العدد.الأول ) كتبنا.فاصلة.عشرية = خطأ الشاشة : حدد.النص ( "" ) أو تسلم إشارة من ضغط زر.يساوي : العدد.الثاني = الشاشة : نصه ( ) العدد.الثاني = كعدد ( العدد.الثاني ) إذا العملية = "+" : النتيجة = العدد.الأول + العدد.الثاني النتيجة = كنص ( النتيجة ) الشاشة : حدد.النص ( النتيجة ) العملية = "" تم أو تسلم إشارة من ضغط زر.الفاصلة.العشرية : ....وهكذا الكلام السابق الذي نعرفه.... تم تابع
... تسلم إشارة من ضغط زر.الجمع : العملية = "+" العدد.الأول = الشاشة : نصه ( ) العدد.الأول = كعدد ( العدد.الأول ) كتبنا.فاصلة.عشرية = خطأ الشاشة : حدد.النص ( "" ) ...
1- يحدد العملية بأنها "+"
2- يأخذ النص المكتوب على الشاشة، يحوله لعدد، ويخزنه في المتغير العدد.الأول لأننا سنحتاجه بعد ذلك لإجراء عملية الجمع
3- يفرغ الشاشة استعداداً لإدخال رقم جديد
4- يسمح لنا بإدخال فاصلة عشرية (إن أردنا) أثناء إدخال الرقم الثاني وذلك بأن يجعل قيمة كتبنا.فاصلة.عشرية تساوي خطأ
الجزء الآخر عند ضغط زر 'يساوي'
.... أو تسلم إشارة من ضغط زر.يساوي : العدد.الثاني = الشاشة : نصه ( ) العدد.الثاني = كعدد ( العدد.الثاني ) إذا العملية = "+" : النتيجة = العدد.الأول + العدد.الثاني النتيجة = كنص ( النتيجة ) الشاشة : حدد.النص ( النتيجة ) العملية = "" تم ....
1- يأخذ العدد الموجود على الشاشة ويخزنه في المتغير العدد.الثاني
2- يتأكد أن العملية عملية جمع (سيكون هذا مهماً حين نضيف باقي العمليات) ويحسب النتيجة المطلوبة
3- يعرض النتيجة على الشاشة بعد تحويلها إلى صورة نصية
4- يعيد العملية إلى القيمة غير المعرفة "" إلى أن نختار عملية جديدة
هناك فقط مشكلة هي أن البرنامج سيعمل بطريقة صحيحة مرة واحدة فقط: لو أدخلت 12 ثم + ثم 13 ثم = فستجد النتيجة 25، لكن إن ضغطت بعدها 1 فستجد مكتوب على الشاشة 251
هذا خطأ..كان المفروض أن يعتبر البرنامج اننا انتهينا من الحسبة القديمة ويفرّغ الشاشة قبل بدء الحسبة الجديدة، بحيث يظهر على الشاشة 1
أيضاً تصرف آلتنا الحاسبة ليس مثل الآلة العادية. نحن حين نضغط 12 ثم + سوف نجد الشاشة قد مسحت، بينما في الحاسبة العادية سوف نضغط 12 ثم + ولا يتم مسح الشاشة إلا عند بدء إدخال العدد الثاني.
نحن نحتاج طريقة نقول بها للبرنامج "نحن على وشك إدخال عدد جديد، لذلك قم بمسح الشاشة المرة القادمة لو ضغط المستخدم زر عددي، ثم اعرض ما ادخل".
لكي نحل المشكلة نحتاج لمتغير جديد اسمه تفريغ، معناه "هل علينا أن نفرغ الشاشة حين يضغط المستخدم على زر عددي في المرة القادمة"؟
سوف نحتاج أيضاً أن نعدّل البرنامج قليلاً (التعديلات بالخط الثقيل ولونها أحمر):
كتبنا.فاصلة.عشرية = خطأ العملية = "" العدد.الأول = لاشيء تفريغ = خطأ
كرر : تخير : تسلم إشارة من ضغط زر.الجمع : العملية = "+" العدد.الأول = الشاشة : نصه ( ) العدد.الأول = كعدد ( العدد.الأول ) كتبنا.فاصلة.عشرية = خطأ تفريغ = صحيح أو تسلم إشارة من ضغط زر.يساوي : العدد.الثاني = الشاشة : نصه ( ) العدد.الثاني = كعدد ( العدد.الثاني ) إذا العملية = "+" : النتيجة = العدد.الأول + العدد.الثاني النتيجة = كنص ( النتيجة ) الشاشة : حدد.النص ( النتيجة ) العملية = "" تفريغ = صحيح تم أو تسلم إشارة من ضغط زر.الفاصلة.العشرية : إذا كتبنا.فاصلة.عشرية = خطأ : الشاشة : الحق.نص ( "." ) كتبنا.فاصلة.عشرية = صحيح تم أو تسلم إشارة من ضغط زر1 : إذا تفريغ = صحيح : الشاشة : حدد.النص ( "" ) تفريغ = خطأ تم الشاشة : الحق.نص ( "1" ) أو تسلم إشارة من ضغط زر2 : ...باقي الأرقام مثلها مثل 1 تم تابع
1- في نهاية ضغط زر الجمع أو زر يساوي نقوم بتحديد قيمة تفريغ لتكون صحيح.
2- في أزرار الأرقام نتأكد من قيمة ذلك المتغير، فإن كانت صحيح نقوم بمسح الشاشة قبل عرض الرقم المكافيء للزر
يبقى شيء واحد هو تعميم العمليات لتشمل الطرح والقسمة والضرب. سوف نعرض هنا البرنامج كاملاً بعد إضافة هذا الجزء:
دالة صنع.زر(س، ص، العرض، الارتفاع، النص، النافذة): ز = زر جديد ز : حدد.المكان ( س ، ص ) ز : حدد.الحجم ( العرض ، الارتفاع ) ز : حدد.النص ( النص ) النافذة : اضف ( ز ) ارجع ب: ز نهاية ن = النافذة.الحالية ( ) زر1 = صنع.زر (40 ، 130 ، 30 ، 30 ، "1" ، ن) زر2 = صنع.زر (70 ، 130 ، 30 ، 30 ، "2" ، ن) زر3 = صنع.زر (00 ، 130 ، 30 ، 30 ، "3" ، ن) زر4 = صنع.زر (40 ، 100 ، 30 ، 30 ، "4" ، ن) زر5 = صنع.زر (70 ، 100 ، 30 ، 30 ، "5" ، ن) زر6 = صنع.زر (100، 100 ، 30 ، 30 ، "6" ، ن) زر7 = صنع.زر (40 ، 70 ، 30 ، 30 ، "7" ، ن) زر8 = صنع.زر (70 ، 70 ، 30 ، 30 ، "8" ، ن) زر9 = صنع.زر (100، 70 ، 30 ، 30 ، "9" ، ن) زر0 = صنع.زر (70 ، 160 ، 30 ، 30 ، "0" ، ن) زر.الجمع = صنع.زر (10، 70 ، 30 ، 30 ، "+" ، ن) زر.الطرح = صنع.زر (10، 100 ، 30 ، 30 ، "-" ، ن) زر.الضرب = صنع.زر (10، 130 ، 30 ، 30 ، "×" ، ن) زر.القسمة = صنع.زر(10، 160 ، 30 ، 30 ، "÷" ، ن) زر.يساوي = صنع.زر (40، 160 ، 30 ، 30 ، "=" ، ن) زر.الفاصلة.العشرية = صنع.زر(100، 160، 30، 30، "."، ن) الشاشة = سطر.نصي جديد الشاشة : حدد.المكان ( 10 ، 30 ) الشاشة : حدد.الحجم ( 120 ، 30 ) الشاشة : حدد.النص ( "" ) ن : اضف ( الشاشة ) ن : حدد.الحجم ( 150 ، 210 ) ن : حدد.العنوان ( "الحاسبة" ) كتبنا.فاصلة.عشرية = خطأ العملية = "" العدد.الأول = لاشيء تفريغ = خطأ كرر : تخير : تسلم إشارة من ضغط زر.الجمع : العملية = "+" العدد.الأول = الشاشة : نصه ( ) العدد.الأول = كعدد ( العدد.الأول ) كتبنا.فاصلة.عشرية = خطأ تفريغ = صحيح أو تسلم إشارة من ضغط زر.الطرح : العملية = "-" العدد.الأول = الشاشة : نصه ( ) العدد.الأول = كعدد ( العدد.الأول ) كتبنا.فاصلة.عشرية = خطأ تفريغ = صحيح أو تسلم إشارة من ضغط زر.الضرب : العملية = "×" العدد.الأول = الشاشة : نصه ( ) العدد.الأول = كعدد ( العدد.الأول ) كتبنا.فاصلة.عشرية = خطأ تفريغ = صحيح أو تسلم إشارة من ضغط زر.القسمة : العملية = "÷" العدد.الأول = الشاشة : نصه ( ) العدد.الأول = كعدد ( العدد.الأول ) كتبنا.فاصلة.عشرية = خطأ تفريغ = صحيح أو تسلم إشارة من ضغط زر.يساوي : العدد.الثاني = الشاشة : نصه ( ) العدد.الثاني = كعدد ( العدد.الثاني ) النتيجة = لاشيء إذا العملية = "+" : النتيجة = العدد.الأول + العدد.الثاني وإلا إذا العملية = "-" : النتيجة = العدد.الأول - العدد.الثاني وإلا إذا العملية = "×" : النتيجة = العدد.الأول × العدد.الثاني وإلا إذا العملية = "÷" : النتيجة = العدد.الأول ÷ العدد.الثاني تم إذا ليس النتيجة = لاشيء : النتيجة = كنص ( النتيجة ) الشاشة : حدد.النص ( النتيجة ) العملية = "" تفريغ = صحيح تم أو تسلم إشارة من ضغط زر.الفاصلة.العشرية : إذا كتبنا.فاصلة.عشرية = خطأ : الشاشة : الحق.نص (".") كتبنا.فاصلة.عشرية = صحيح تم -------- أو تسلم إشارة من ضغط زر1 : إذا تفريغ : الشاشة : حدد.النص ("") تفريغ = خطأ تم الشاشة : الحق.نص ("1") -------- أو تسلم إشارة من ضغط زر2 : إذا تفريغ : الشاشة : حدد.النص ("") تفريغ = خطأ تم الشاشة : الحق.نص ("2") -------- أو تسلم إشارة من ضغط زر3 : إذا تفريغ : الشاشة : حدد.النص ("") تفريغ = خطأ تم الشاشة : الحق.نص ("3") -------- أو تسلم إشارة من ضغط زر4 : إذا تفريغ : الشاشة : حدد.النص ("") تفريغ = خطأ تم الشاشة : الحق.نص ("4") -------- أو تسلم إشارة من ضغط زر5 : إذا تفريغ : الشاشة : حدد.النص ("") تفريغ = خطأ تم الشاشة : الحق.نص ("5") -------- أو تسلم إشارة من ضغط زر6 : إذا تفريغ : الشاشة : حدد.النص ("") تفريغ = خطأ تم الشاشة : الحق.نص ("6") -------- أو تسلم إشارة من ضغط زر7 : إذا تفريغ : الشاشة : حدد.النص ("") تفريغ = خطأ تم الشاشة : الحق.نص ("7") -------- أو تسلم إشارة من ضغط زر8 : إذا تفريغ : الشاشة : حدد.النص ("") تفريغ = خطأ تم الشاشة : الحق.نص ("8") -------- أو تسلم إشارة من ضغط زر9 : إذا تفريغ : الشاشة : حدد.النص ("") تفريغ = خطأ تم الشاشة : الحق.نص ("9") -------- أو تسلم إشارة من ضغط زر0 : إذا تفريغ : الشاشة : حدد.النص ("") تفريغ = خطأ تم الشاشة : الحق.نص ("0") تم تابع

مازال هناك بعض الإمكانات التي يمكن إضافتها:
- السماح بإدخال سلسلة مثل 12 / + / 13 / + / 15 بحيث تظهر نتيجة "12+13" عند ضغط علامة زائد الثانية قبل استمرار العمليات
- إجراء العمليات بالترتيب الرياضي الصحيح، يعني لو أدخل المستخدم 7+5×2 تكون النتيجة 17 وليس 24
- تدارك أخطاء المستخدم المحتملة
السبت، 21 مايو 2011
تحذير: ساحكي قصة حياتي!
جانب علمي
ما تريد أن تكون عندما تكبر؟ رائد فضاء....لا! لا! أريد أن أكون مخترعاً!
ماذا كان يعمل عبقرينو بالضبط؟ في القصص كان عمله أشبه بمخترع freelancer يأتيه الزبون ليخترع له حزام الطيران أو سائل نمو النباتات السريع ثم يأخذ أجره. ظننتها وظيفة حقيقية منتشرة. ربما ستكون كذلك يوماً.
بعدها تعلمت البرمجة وصارت اهتمامي الأساسي. لم أكن أدري وقتها أن البرمجة هي اختراع لكن بطريقة أخرى. ثم دخلت الجامعة وصرت أتساءل: ما مجال البرمجة الذي أفضلة؟
جربت برمجة الألعاب. قرأت في الرياضيات. نصحني أستاذ لي بالقراءة في الArtificial intelligence، قرأت فيه من كتاب، ثم مللته وقرأت من كتاب آخر. كان ذلك الكتاب الآخر فيه مقدمة للغة Lisp...شدتني اللغة ربما أكثر من الAI نفسه.
بعدها قرأت عن لغة Haskell. وبدأت افهم أنه هناك عالم أكبر بكثير من الC والJava وما شابه. مجالي المفضل هو...لغات البرمجة!
(من فضلكم: لا يقولن أحد أن مجالي هو الcompilers! هناك فرق بين compilers وبين programming language theory).
جانب عملي
بعد التخرج صار السؤال: ماذا أريد أن أفعل؟ قبلت وظيفة المعيد. بعدها بسنين تركتها. قبل أن أدخل في وظيفة أخرى كان لابد أن أقف وقفة مع نفسي: ماذا أريد بالضبط؟ ما الذي جعلني اختار تلك الوظيفة؟ (لابد من سبب منطقي)، وما الذي جعلني أتركها؟ ما هدفي؟
بعد التأمل خرجت بالاستنتاج الآتي: أنا أريد بيئة أخترع فيها. ظننت أن الماجستير وماشابه سيوفر تلك البيئة لكني فشلت في ذلك. إذاً فليكن سؤالي عند التقدم لأية وظيفة هو "هل ستقدم لي، عاجلاً أو آجلاً، بيئة للاختراع؟".
في النهاية قررت أن أبني تلك البيئة لنفسي: شركة وظيفتها تحويل الcomputer science إلى أرباح، شركة ما هي إلا حجة للمخترعين كي يخترعوا.
(مازال السعي لتلك الشركة مستمراً.)
في تلك الأثناء صرت أقرأ كثيراً جداً. تاريخ، لغة، القليل من علم اجتماع...صارت هناك فكرة تتشكل في ذهني عن الأمة الإسلامية واوروبا والمستوى الفكري. صرت يوماً بعد يوم أفكر في النهضة وكيفية المشاركة في دفعها للأمام.
شيء آخر: بعد تركي للكلية وجدت طالباً يقول لي أنه يريدني أن القي بعض المحاضرات عن الLisp.
قلت له: لكني لم أعد معيداً رسمياً.
قال: لا بأس، سوف نأخذ إذناً من الكلية ونعطيك إطاراً تقدم فيه الندوات.
هنا اكتشفت شيئاً جديداً؛ أنني لا أحتاج أن أكون عضو هيئة تدريس لأقدم علماً لمن يريده!
منذ ذلك الحين قدمت ندوات عن ال
في 2010 حدث شيء جديد: بدأت أقابل أطفالاً في عائلتنا لم أكن قد رأيتهم من قبل (كنت منعزلاً نوعاً ما) وأطفال لمعارف.اكتشفت معلومة جديدة: إن الطفل لهو شيء مذهل.
هل تظن أن اللعب مع الأطفال شيء سهل؟ هذه عينة مما كنت أفعله معهم:
وهنا كنت قد كونت فكرة لا بأس بها عما أريد لنفسي من الدنيا:
وفي يوم كنت أقرأ كتاباً عن الثقوب السوداء. كتاب ظريف جداً يجمع بين المعلومات نفسها وبين بيئة البحث العلمي التي أدت لاكتشاف هذه المعلومات. قرأت فيه عن Oppenheimer وكيف كان يجتمع بطلاب البحث في الجامعة التي كان يدرّس فيها، ويتناقشون "دردشة" علمية عن الفيزياء والكونيات، ثم إذا رأى اهتمام طالب معين بموضوع معين عرض عليه نقطة في ذلك المجال ليشرف عليه فيها.
هذا هو الهدف الناقص!!
لنعدّل الخطة إذاً:
ما أريد لنفسي من الدنيا:
جانب فلسفي
حتى الآن الأمور مستقرة. قد عرفت أخيراً ماذا أريد بالضبط من الدنيا. لكن في الأيام الحالية هناك شيء أفكر فيه: هذه الأهداف "حقيقية" أكثر من اللازم. الجانب الفلسفي عندي يريد مجموعة من المباديء التي توحّد بين كل الأهداف. ما الذي يربط بين النهضة والأطفال والبرمجة و...و...؟
شيئاً فشيئاً أحاول التوصل لإجابة هذا السؤال:
لو أردت عدداً أكبر من الكلمات:
ما تريد أن تكون عندما تكبر؟ رائد فضاء....لا! لا! أريد أن أكون مخترعاً!
ماذا كان يعمل عبقرينو بالضبط؟ في القصص كان عمله أشبه بمخترع freelancer يأتيه الزبون ليخترع له حزام الطيران أو سائل نمو النباتات السريع ثم يأخذ أجره. ظننتها وظيفة حقيقية منتشرة. ربما ستكون كذلك يوماً.
بعدها تعلمت البرمجة وصارت اهتمامي الأساسي. لم أكن أدري وقتها أن البرمجة هي اختراع لكن بطريقة أخرى. ثم دخلت الجامعة وصرت أتساءل: ما مجال البرمجة الذي أفضلة؟
جربت برمجة الألعاب. قرأت في الرياضيات. نصحني أستاذ لي بالقراءة في الArtificial intelligence، قرأت فيه من كتاب، ثم مللته وقرأت من كتاب آخر. كان ذلك الكتاب الآخر فيه مقدمة للغة Lisp...شدتني اللغة ربما أكثر من الAI نفسه.
بعدها قرأت عن لغة Haskell. وبدأت افهم أنه هناك عالم أكبر بكثير من الC والJava وما شابه. مجالي المفضل هو...لغات البرمجة!
(من فضلكم: لا يقولن أحد أن مجالي هو الcompilers! هناك فرق بين compilers وبين programming language theory).
جانب عملي
بعد التخرج صار السؤال: ماذا أريد أن أفعل؟ قبلت وظيفة المعيد. بعدها بسنين تركتها. قبل أن أدخل في وظيفة أخرى كان لابد أن أقف وقفة مع نفسي: ماذا أريد بالضبط؟ ما الذي جعلني اختار تلك الوظيفة؟ (لابد من سبب منطقي)، وما الذي جعلني أتركها؟ ما هدفي؟
بعد التأمل خرجت بالاستنتاج الآتي: أنا أريد بيئة أخترع فيها. ظننت أن الماجستير وماشابه سيوفر تلك البيئة لكني فشلت في ذلك. إذاً فليكن سؤالي عند التقدم لأية وظيفة هو "هل ستقدم لي، عاجلاً أو آجلاً، بيئة للاختراع؟".
في النهاية قررت أن أبني تلك البيئة لنفسي: شركة وظيفتها تحويل الcomputer science إلى أرباح، شركة ما هي إلا حجة للمخترعين كي يخترعوا.
(مازال السعي لتلك الشركة مستمراً.)
في تلك الأثناء صرت أقرأ كثيراً جداً. تاريخ، لغة، القليل من علم اجتماع...صارت هناك فكرة تتشكل في ذهني عن الأمة الإسلامية واوروبا والمستوى الفكري. صرت يوماً بعد يوم أفكر في النهضة وكيفية المشاركة في دفعها للأمام.
شيء آخر: بعد تركي للكلية وجدت طالباً يقول لي أنه يريدني أن القي بعض المحاضرات عن الLisp.
قلت له: لكني لم أعد معيداً رسمياً.
قال: لا بأس، سوف نأخذ إذناً من الكلية ونعطيك إطاراً تقدم فيه الندوات.
هنا اكتشفت شيئاً جديداً؛ أنني لا أحتاج أن أكون عضو هيئة تدريس لأقدم علماً لمن يريده!
منذ ذلك الحين قدمت ندوات عن ال
- Lisp
- Languages and interpreters
- Ruby
- Erlang
- #C
- دور كلية الحاسبات العلمي
- مجلسي علم
في 2010 حدث شيء جديد: بدأت أقابل أطفالاً في عائلتنا لم أكن قد رأيتهم من قبل (كنت منعزلاً نوعاً ما) وأطفال لمعارف.اكتشفت معلومة جديدة: إن الطفل لهو شيء مذهل.
هل تظن أن اللعب مع الأطفال شيء سهل؟ هذه عينة مما كنت أفعله معهم:
- رسم قصص مصورة
- تأليف شعر
- كتابة رسائل بالشفرة وإعطائها له ليحلها
- تجارب علمية
- محاولات لتعليمهم البرمجة
وهنا كنت قد كونت فكرة لا بأس بها عما أريد لنفسي من الدنيا:
- ورشة عمل أخترع فيها
- اطفال لي ألعب معهم
- خطة لدفع النهضة تركز على المستوى الفكري للمجتمع والعلم المستشري.
وفي يوم كنت أقرأ كتاباً عن الثقوب السوداء. كتاب ظريف جداً يجمع بين المعلومات نفسها وبين بيئة البحث العلمي التي أدت لاكتشاف هذه المعلومات. قرأت فيه عن Oppenheimer وكيف كان يجتمع بطلاب البحث في الجامعة التي كان يدرّس فيها، ويتناقشون "دردشة" علمية عن الفيزياء والكونيات، ثم إذا رأى اهتمام طالب معين بموضوع معين عرض عليه نقطة في ذلك المجال ليشرف عليه فيها.
هذا هو الهدف الناقص!!
لنعدّل الخطة إذاً:
ما أريد لنفسي من الدنيا:
- ورشة عمل أخترع فيها
- طلبة علم اتعاون معهم
- اطفال لي ألعب معهم
- خطة لدفع النهضة تركز على المستوى الفكري للمجتمع والعلم المستشري.
جانب فلسفي
حتى الآن الأمور مستقرة. قد عرفت أخيراً ماذا أريد بالضبط من الدنيا. لكن في الأيام الحالية هناك شيء أفكر فيه: هذه الأهداف "حقيقية" أكثر من اللازم. الجانب الفلسفي عندي يريد مجموعة من المباديء التي توحّد بين كل الأهداف. ما الذي يربط بين النهضة والأطفال والبرمجة و...و...؟
شيئاً فشيئاً أحاول التوصل لإجابة هذا السؤال:
- لكي تخترع لابد (1) أن تفهم قوانين الطبيعة ثم (2) تفكر كيف تطوع تلك القوانين لتحقيق أهداف بطرق جديدة.
- لكي تبرمج لابد أن تفهم الsyntax/semantics الخاصة بلغة البرمجة ثم تصنع بها شيئا جديدا.
- لكي تلعب مع الطفل [بطريقتي] لابد (1) أن تكون مثقفا و (2) أن تفكر في طرق لشرح ما تعلم بطريقة تناسب سن الطفل.
- لكي تسعى للمشاركة في إحداث نهضة عليك أن تفهم كيف يتغير المجتمع وكيف تنتشر الأفكار، ثم تخطط لنشر الأفكار التي تراها صحيحة.
- كل هذه الأشياء مرتبطة ببعضها: اهتمامي باللغة العربية ينعكس على البرمجة ينعكس على الأطفال ينعكس على النهضة.
Explore. Understand. Invent
لو أردت عدداً أكبر من الكلمات:
Search, understand, create. Try to do things no one did before you.
Whether it's programming, a business, or society.
Whether it's programming, a business, or society.
هذا يفسر أشياء كثيرة؛ أليس كذلك؟ هل تذكر اقتراحاتي لتطوير الACM؟ كنت أقول أننا نحتاج إلى "Creation, Diversity, Depth". الآن انظر:
Search / Understand / Create <==> Diversity/ Depth / Creation
ماذا عن فكرة مركز التفكير الحوسبي؟ هدف إنشاء المركز جزئين: (1) البحث عن طريقة متطورة لتعليم البرمجة/علوم الحاسب (2) اقتراح هذه الطريقة للمدارس والمؤسسات التعليمية. أي نفس فكرة الفهم ثم التطبيق.
ماذا عن فكرة مركز التفكير الحوسبي؟ هدف إنشاء المركز جزئين: (1) البحث عن طريقة متطورة لتعليم البرمجة/علوم الحاسب (2) اقتراح هذه الطريقة للمدارس والمؤسسات التعليمية. أي نفس فكرة الفهم ثم التطبيق.
إن استكشاف الإنسان لنفسه لشيء صعب حقاً...
(هل تشعر أن هذه التدوينة علمية أكثر من اللازم؟ استرخ قليلاً هنا)
(هل تشعر أن هذه التدوينة علمية أكثر من اللازم؟ استرخ قليلاً هنا)
لك ولأطفالك :)
ماما جابت لي معزة
ماما جابت لي معزة
ماما جابت لي معزة
المعزة مستفزة...
بس أنا باحب المعزة،
اللي جابتها ماما
ماما جابت لي سمنة
ماما جابت لي سمنة
انا واختي سلمى
مش بنحب السمنة
اللي جابتها ماما
ماما جابت لي جزمة
ماما جابت لي جزمة
جزمة مالهاش لازمة...
بس انا باحب الجزمة
اللي جابتها ماما
ماما جابت لي نملة
ماما جابت لي نملة
نملة متكاملة
وانا باحب النملة
اللي جابتها ماما
ماما جابت لي فرخة
ماما جابت لي فرخة
فرخة لابسة طرحة
وانا باحب الفرخة
اللي جابتها ماما
ماما جابت لي وزة
ماما جابت لي وزة
الوزة مشمئزة...
بس انا باحب الوزة
اللي جابتها ماما
ماما جابت لي زبدة
ماما جابت لي زبدة
زبدة بطعم الكبدة
وانا باحب الزبدة
اللي جابتها ماما
يوم الجمعة
بابا راح يصلّي
واخويا بيشد ودني
وانا قلت يا أمي:
اخويا شد ودني again.
انا باحب السمك
واخويا بيحب السمك
بابا في عمل السمك انهمك
وماما عملت آيس كريم.
عايزة اروح النادي
واخويا عايز النادي
ومامي قالت لdaddy:
ماتوديهم النادي يا حسين.
ماما جابت لي معزة
ماما جابت لي معزة
المعزة مستفزة...
بس أنا باحب المعزة،
اللي جابتها ماما
ماما جابت لي سمنة
ماما جابت لي سمنة
انا واختي سلمى
مش بنحب السمنة
اللي جابتها ماما
ماما جابت لي جزمة
ماما جابت لي جزمة
جزمة مالهاش لازمة...
بس انا باحب الجزمة
اللي جابتها ماما
ماما جابت لي نملة
ماما جابت لي نملة
نملة متكاملة
وانا باحب النملة
اللي جابتها ماما
ماما جابت لي فرخة
ماما جابت لي فرخة
فرخة لابسة طرحة
وانا باحب الفرخة
اللي جابتها ماما
ماما جابت لي وزة
ماما جابت لي وزة
الوزة مشمئزة...
بس انا باحب الوزة
اللي جابتها ماما
ماما جابت لي زبدة
ماما جابت لي زبدة
زبدة بطعم الكبدة
وانا باحب الزبدة
اللي جابتها ماما
يوم الجمعة
بابا راح يصلّي
واخويا بيشد ودني
وانا قلت يا أمي:
اخويا شد ودني again.
انا باحب السمك
واخويا بيحب السمك
بابا في عمل السمك انهمك
وماما عملت آيس كريم.
عايزة اروح النادي
واخويا عايز النادي
ومامي قالت لdaddy:
ماتوديهم النادي يا حسين.
الاشتراك في:
الرسائل (Atom)

