الثلاثاء، 27 ديسمبر 2011

التفكير الحوسبي: هل سيغير العلم حقا؟

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

وفي مقالات سابقة لي فإني لم أمل من تكرار جملة أن التفكير الحوسبي يتوقع له تأثير على العلم يشبه تأثير النهضة الأوروبية. المشكلة هي أنني لم اصف قبل ذلك - بالتفصيل - لماذا يتوقع ذلك التأثير! ربما من السهل على المبرمجين او المهتمين بعلوم الحاسب ان يشعروا بهذا الأثر، لكن ماذا عن الأشخاص خارج هذا المجال؟

هذا المقال هو مجموعة من الأفكار حاولت تجميعها لأفسر للقاريء - خاصة خارج المجال - أهمية هذا العلم.

تفاصيل بلا التباس

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

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

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

لغة مشتركة بين العلوم

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

وإن علوم الحاسب لعلها تكون مثل الجبر للقرن الحادي والعشرين، وتكون لغة موحدة لعلوم بشرية اكثر وأعمق، وتقدم لنا أداة مشتركة للتعامل معها جميعاً.

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

لم يبق لنا إذاً سوى استخدام علوم الحاسب لوصف والتفاهم حول هذه المجالات بيننا وبين انفسنا، وليس فقط بيننا وبين الآلة.

لغة لوصف العمليات السارية

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

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

وسيلة للتفكير في الكفاءة بطريقة علمية منظمة

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

اخترعوا مثلاً مقاييس رياضية مثل time complexity ليمكن بها المقارنة بين كفاءة وسيلتين لحل نفس المشكلة، والمشاكل نفسها صنفوها في فصائل حسب كفاءة افضل حل ممكن لكل منهاـ وهناك كتب وابحاث وعلماء لا يعدون قد تخصصوا لأجل هذا الجانب الذي يعد اساسيا في مجالنا.

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

لغة، نَصِف بها تفكيرنا!

وإن نفس الوسائل الفكرية لنجدها تتكرر في كل مشكلة وكل تطبيق: مثلاً فكرة الـgraph، أي مجموعة من العناصر وعلاقات بينها، نجدها في شبكة النقل بالمدن، وفي علم الحديث، وفي الابحاث العلمية التي يتخذ بعضها البعض مراجع، وفي الmind maps، وفي آلاف التطبيقات.

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

هذه الأشياء البسيطة في ظاهرها، الـgraph أو tree أو queue أو stack، هي خبز علماء الحاسوبيات الذي يعيشون عليه: يبحثون فيها ويكتبون الأبحاث عنها منذ عقود، كيفية التعبير عنها رياضياً بكفاءة، كيفية حساب خصائص معينة لها (مثل أقصر طريق بين نقطتين)، وغير ذلك الكثير.

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

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

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

الاثنين، 12 ديسمبر 2011

Dreams about metaprogramming in Kalimat

(Note: These are only design thoughts - I do not promise that all or any of those features will actually be in Kalimat).

I'm a big Lisp fan. It seems I can't create a language without trying to turn it into a Lisp. One of the reasons Kalimat got finished in the first place was that I decided to forget all the macros and metaprogramming and try my best to do a good "normal" language.

But now macros call me again...

The first thing I want to add is reified parse trees. I'll make the examples in Kick - the English version of Kalimat - because the Blogger editor has problems with mixing Arabic and English text. But if I implement this it will probably be implemented in Kalimat first.

Now consider this code:
m = myParseTree( )
print m: toString( )

What should be its expected output? Probably something like this:
Program(
statements = [
assignmentStmt(m, functionCall(myParseTree, [])),
printStmt(methodCall(m, toString, [])) ])

Looks like Lisp already :). The program here can see the objects that represent its own parse trees. This has many benefits. For example I can create automatic documentation tools, write code to convert a program into another language, create programs that do code generation or code verification, all without needing to write a Kalimat parser!


Modifying the trees

In a possible next step, I can make the program modify it own parse trees, and enable something like Lisp macros, C++ template metaprogramming, or MetaLua.

What do I mean? Suppose I could mark some functions as special "compile time code". Then I can write a function like this:
compiletime function const(code ~ expression):
code: replace(evaluationOf(code))
end
...and use this function like so:
x = const(sin(0.5) * cos(3) / factorial(3))                      
This will result in the code becoming like this; before the program is compiled:
x = -0.0791046143
Notice what happened: The program's parse tree was modified to replace an expression without variables with its own result (an optimization called constant-folding). This means that during the program's run the expression won't need to be evaluated.

What other tricks can we do? Imagine:
classFromDbTable("person")
classFromDbTable("department")
...and before compilation this code becomes:
class person:
has name, id, department, salary
responds to save(db), load(db)
end

class department:
has name, location
responds to save(db), load(db)
replies to getEmployees()
end
Here the compiler ran the "classFromDbTable" macro, which made a connection to the database, retrieved the needed information about tables and relations, and generated a class for each of the given table with methods to save a record, load a record, or retrieve related records.


Even more dreams

What can we do next? This is an active research area and I don't know if I can/want to implement this; but we could allow certain Kalimat modules to modify the parser before compilation. It means a Kalimat program can define a special version of Kalimat syntax and then we write the rest of that program in the new syntax! For example, if we are developing a game, we can make special syntax for declaring a game character:
syntax character:
codeForm: ...how it should look...
translation: ...actual kalimat code it should become...
end
...and then use the new syntax as if it were part of the existing Kalimat syntax:
character Ship:
image "ship.png"
control = keyboard
ai attack(enemy), maneuver(map)
end

ai attack for ship(enemy):
...implement attack...
end

ai maneuver for ship(map):
...implement maneuver...
end
So, what's the purpose of this article? First: to show you that compile-time meta-programming is cool. Right? :)

Second, to share with you some features I'm considering for Kalimat and hear any comments or suggestions.

Third, this article also answers a question I sometimes get: Why reinvent the wheel implementing a new language with its own parser, compiler, VM...etc. The answer is because Kalimat is not a translation of an existing language: it is a brand new language with its own features, design, and ideas.

الجمعة، 9 ديسمبر 2011

خطة للنهضة (4): أنا والنهضة

المحتويات: [الجزء الأول، الجزء الثاني، الجزء الثالث، الجزء الرابع هذا المقال]


قلت في المقالات السابقة أنني أريد خطة موزعة يقوم بها المجتمع كله، وليس خطة مركزية ذات قائد وجدول زمني...الخ

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

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

حسناً، ماذا أريد أن افعل إذاً؟

اول اهتماماتي حاليا هو نقطة التفكير الحوسبي، وقد اتعبتكم بالحديث عنها بالفعل فلن أقول المزيد. لو لم تسمع عنها انظر من فضلك للروابط في العمود الأيسر في بداية هذه الصفحة :)

ثاني اهتاماتي، وإن كان للمدى الطويل، هو جهاز أوراق اللوحي: عربيّ، قلميّ، ذكيّ.

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

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

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

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

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

ماذا عنك أنت؟ منذ نشرت الأجزاء الأولى من هذه الخطة ويأتيني السؤال: الخطة تعجبني، لكن ماذا افعل بالضبط؟

كل إنسان له فترة يكتشف فيها اهدافه ووسيلة تحقيقها. انظر إلى رسالة، صناع الحياة، قبيلة TV، سلفيو كوستا، ...الخ...الخ. كل شخص قد جرب وفكر وتناقش حتى وجد "رُكنه" الذي يرتاح له.

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

الجمعة، 2 ديسمبر 2011

مطابقة الأنماط في لغة البرمجة كلمات

ملاحظة: هذه الأمثلة تحتاج نسخة كلمات ديسمبر 2011 أو أحدث. يمكن تحميل أحدث نسخة من هنا أو هنا.

مطابقة الأنماط pattern matching هي خاصية في لغات برمجة كثيرة وهي الآن في كلمات أيضاً. سوف نتعرف عليها الآن.

تخيل أنك تريد كتابة إجراء اسمه اطبع.الأسم، يأخذ اسماً في أحد الصور الآتية:
  • مصفوفة من عنصرين: الاسم واسم الأب
  • مصفوفة من ثلاثة عناصر: الاسم، اسم الأب، واسم العائلة على طريقة أهل الخليج العربي
ربما يمكن كتابة هذا الإجراء هكذا:
إجراء اطبع.الاسم ( م ) :
    إذا م هو مصفوفة.قيم وأيضا عدد( م ) = 2 :
        الاسم = م [ 1 ] 
        اسم.الأب = م [ 2 ] 
        اطبع الاسم ، " " ، اسم.الأب 
    وإلا إذا م هو مصفوفة.قيم وأيضا عدد( م ) = 3 :
        الاسم = م [ 1 ] 
        اسم.الأب = م [ 2 ] 
        اسم.العائلة = م [ 3 ] 
        اطبع الاسم ، " بن " ، اسم.الأب ، " آل " ، اسم.العائلة 
    تم 
نهاية

لكن هذه الكود تبدو رتيبة ومتكررة، التأكد ان القيمة المقدمة مصفوفة، التأكد من العدد، تفكيك البيانات إلى متغيرات...
هذه النوعية من المهام هي الدور الطبيعي لمطابقة الأنماط! هيا نكتب نفس الإجراء بالطريقة الجديدة:
إجراء اطبع.الاسم ( م ) :
    إذا م ~ [ ؟الاسم ، ؟اسم.الأب ] :
        اطبع الاسم ، " " ، اسم.الأب 
    وإلا إذا م ~ [ ؟الاسم ، ؟اسم.الأب ، ؟اسم.العائلة ] :
        اطبع الاسم ، " بن " ، اسم.الأب ، " آل " ، اسم.العائلة 
    تم 
نهاية

هذه الكود أوضح بكثير، أليس كذلك؟ اقرأ علامة ~ كأنها "يطابق"، وعلامة الاستفهام قبل اسم المتغير معناها "أنا أريد أن أضع القيمة الموجودة هنا بداخل المتغير"، ولولا علامة الاستفهام لكان معنى وجود المتغير "أريد مقارنة قيمة المتغير بالقيمة الموجودة هنا".

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

إجراء اطبع.الاسم ( م ) :
    إذا م ~ [ ؟ الاسم ، ؟ اسم.الأب ] :
        اطبع الاسم ، " " ، اسم.الأب 
     إذا م ~ [ ؟ الاسم ، ؟ اسم.الأب ، ؟ اسم.العائلة ] :
        اطبع الاسم ، " بن " ، اسم.الأب ، " آل " ، اسم.العائلة 
    وإلا إذا م ~ شخص له اسم = ؟ أ ، اسم.أب = ؟ ب :
        اطبع أ ، " " ، ب 
    تم 
نهاية
لاحظ كيف ان قراءة هذا الجزء من البرنامج سلسة جداً: "إذا كان م يطابق شخصاً له اسمٌ يساوي أ، واسم أبٍ يساوي ب، افعل كذا وكذا". شيء جميل جداً في رأيي :)

أخيراً ماذا لو كان يمكن للإجراء أيضاً أن يقبل قاموساً (مثل hashtable) فيه الاسم واسم الأب، وقد يكون أو لا يكون فيه اسم العائلة؟؟
كل مشكلة لها حل :)
إجراء اطبع.الاسم( م ) :
    إذا م ~ [ ؟ الاسم ، ؟ اسم.الأب ] :
        اطبع الاسم ، " " ، اسم.الأب 
    وإلا إذا م ~ [ ؟ الاسم ، ؟ اسم.الأب ، ؟ اسم.العائلة ] :
        اطبع الاسم ، " بن " ، اسم.الأب ، " آل " ، اسم.العائلة 
    وإلا إذا م ~ شخص له اسم = ؟ أ ، اسم.أب = ؟ ب :
        اطبع أ ، " " ، ب 
    وإلا إذا م ~ {"الاسم" => ؟أ، "اسم.الأب" => ؟ب، "اسم.العائلة" => ؟ج}:
        اطبع أ ، " بن " ، ب ، " آل " ، ج 
    وإلا إذا م ~ { "الاسم" => ؟أ ، "اسم.الأب" => ؟ب } :
        اطبع أ ، " " ، ب 
    تم 
نهاية

لاحظ أنه قد كان يجب اختبار حالة اسم العائلة أولاً قبل حالة عدم وجود اسم عائلة، وذلك لأن مطابقة القواميس تتأكد فقط أن القيم المطلوبة موجودة، وليس إذا كانت القيم الوحيدة الموجودة!

هل تبقى شيء؟ أجل:

- يمكن المطابقة بالقيم العادية، مثلاً م ~ 12 ، أو مثل م ~ "مرحبا"

يمكن مطابقة مصفوفة بحيث لا يهم طولها، بل فقط قيم معينة تبدأ بها، هكذا:
إذا م ~ ["شجرة"، ؟ب، ...] :
    <افعل كذا>
تم
 هذا يطابق م مع مصفوفة أول عنصر فيها "شجرة"، ويضع ثاني عنصر في المتغير ب، ولا يهمه باقي العناصر، فقط ينبغي أن يكون عددها اثنان أو أكثر.
- علامة ~ على لوحة المفاتيح العربية هي shift + ئ

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

Hints of pattern matching...


الأربعاء، 9 نوفمبر 2011

عن الكتابة

يقول الكتّاب: Show, don't tell. أترجمها: اظهر ولا تخبر.

ما معنى هذا؟ تماشياً مع سياق هذا المقال لن اخبرك، لكن سأظهر لك :)

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

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

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

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

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

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

بعد
ما ان تبدأ في العمل السياسي فستجد اسمك قد صار تهمة: هناك من سيتهمك انك عميل في مؤامرة امريكية، هناك من سيتهمك أنك مرتشي، ولو تعين أي قريب لك في أي مؤسسة حكومية فبالتأكيد أنت الذي عينته بالواسطة. قد تستطيع الرد على هؤلاء أو لا تستطيع، لكن في الحالتين حاول ألا تكثر من الجلوس حزيناً تتساءل "لماذا يفعلون بي ذلك؟؟".

السبت، 5 نوفمبر 2011

عشان كدة الثورة يا عمنا

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

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

كان ايه اللي جبرنا على ده كله...عيال خايبة...

عاوز احكي لك حكاية: حسني كان عاوز يعمل انتخابات رئاسية في سبتمبر 2011، يعني كان زماننا دلوقتي بيحكمنا راجل ما بين الحياة والموت. أو كان زمان بيحكمنا ابنه دلوقتي.

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

والأنكت من كدة: فاكر لما كانوا بيبيعوا الأراضي في 2007؟ هو ايه اللي يتبقى من البلد غير الأرض؟ عارف -- البلطجية حيقعدوا يبرطعوا كام شهر؟ قول حتى سنة، قول حتى سنتين، انما دول كانوا عاوزين يقعدوا ميت سنة، ويسلموها لبعض كل ما يمشوا.
والبلطجي حيسرق منك بيت والا عربية، والا حتى يخطف واحد، انما ما كانش حيبيع البلد كلها. واحسب عموما الناس اللي ماتوا من الجوع، ومن الأدوية المغشوشة، واللي وقعت عليهم بيوتهم، واللي ماتوا في المعتقلات، واللي غرقوا، وشوف الثورة جابت البلطجية صحيح والا البلطجية كانوا اللي قاعدين من قبلها..

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

طيب ليه بيتظاهروا لغاية دلوقتي؟ مش كان كفاية بقى ويهمدوا؟ حاقول لك...

الحرامي اللي ذاق النهب مش حيهدا، والحزب الوطني نفسه يرجع، والوزرا نفسهم يقعدوا، ولسة فيه ناس ذممهم خربانة؛ واحشهم بيع البلد عشان الفراخ المجمدة. عاوزين يملكوا البلد ويدوسوا علينا وعلى ابو أمنا.

احمد شفيق كان سايب وزرا من النظام القديم؛ وكان تفكيره تفكير نظام قديم، وكان دماغه ناشفة ومايستحملش حد يقول له بم: ولو جينا نشيل الفاسدين من كل حتة كان حيقرفنا في عيشتنا ومش حناخذ منه حاجة في الآخر.

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

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

طيب انا باقول لك كدة ليه؟ عشان البلد دي كويسة وتستاهل. عشان عاوزين نخلص بقى. عشان عاوزين نشيل الفاسدين والحال ينضبط ونعيش بقى. طب تعمل ايه؟ اعمل كل حاجة تقدر عليها يا سيدي، وانا حاقول لك شوية افكار آهي:
  • ما تقعدش في البيت يوم الانتخابات، شوف ايه حكاية الدايرة والفرد والقايمة وانتخب؛ بس خلي بالك من بتوع الحزب الوطني!! حتقول لي تعقيد وقرف اقول لك قرف يوم ولا قرف عمر بحاله.
  • لما ييجي وقت الانتخابات الرئاسية ما تنتخبش فلان عشان شكله جدع، أو عشان "قديم"، أو الكلام ده. اللعب بقى على كبير يابا واللي حيحكم حيأثر على مستقبل البلد كلها، لازم تشوف التفاصيل وتفكر وتدقق.
  • تابع الحالة السياسية، شوف ايه القضايا وحاول تفهمها، بس ما تصدقش كل حاجة يقولها الإعلام.
  • اعرف ان الحرية مش كلام فارغ. والديموقراطية مش بس كلام مثقفين: الحرية يعني انك تعرف تقول للحرامي يا حرامي من غير ما تروح المعتقل. الديموقراطية يعني مش اي حمار يحكم ويقول يا ارض اتهدي ما عليكي قدي. عارف؛ من اسبوعين كان فيه انتخابات عمادة في الكلية بتاعتي، كل واحد مرشح لم الدكاترة والمعيدين وقعد - يمكن لأول مرة في حياته - يشرح للناس ليه هو يستاهل يبقى عميد، ويعترف بمشاكل الكلية وحلولها، وحتى عيبوبه الشخصية ممكن يتكلم عنها ويواجهها. تخيل لو البلد كلها بقت كدة ايه اللي حيحصل.
  • دي قيمة الحرية، طب ايه ثمنها؟ انك تقرأ وتفهم وتتابع، انك تنتخب وتشارك، أو حتى بكلمة تقولها: تحذر واحد من انتخاب راجل فاسد، تقول لحد قريبك تعال معايا انتخب، أو حتى ساعات يعني - عارف - مظاهرة لو كانت في الحق.
 البلد ظروفها صعبة قوي. بس هي تستاهل. شد حيلك يا اخي.

الجمعة، 4 نوفمبر 2011

Almost all programming is metaprogramming

Any sufficiently large program involves metaprogramming, whether the program's author meant it or not. By so I mean it:
  • Creates a 'program' in some specialized encoding, or 'language'
  • Writes an interpreter for that language
  • During runtime, creates a new program in the newly created language and executes it.
Or in other words, a sufficiently advanced data structure is indistinguishable from code.

Let's think of this in terms of real-world (and some not so real-world) examples:

1- Think of implementing a word processor; you have a specialized 'language' to describe paragraphs, lines, formatting, and so on and one or more 'interpreters' to take the program and render it to the screen or print it. Sometimes the language is very real, like for example Postscript.

2- Also, parser combinators: You are essentially creating a program out of lambdas or objects. Consider the parsing primitives to be like instructions of a virtual machine, and the resulting parser as an AST that knits those instructions together. Running the parser is passing the instructions calls to the VM.

3- Similarly, the reason a Turing machine is so powerful is because it has an infinite tape that can be freely accessed. If you study TM programs you'd find a lot of them generating intermediate data on the tape and then traversing this intermediate data using fixed circuitry in its transition diagram; so in other words interpreting it.

All of this seems rather obvious, and somewhat too philosophical. What practical benefit do we get out of this? I think if we realize that our programming is mostly about creating and executing more specialized programs; we'd start thinking about tooling support for our specialized programs..

Whether we're programming with C, Java or your favorite functional language, you probably have debugging, refactoring, and other support for the first level program; the (e.g Java code itself) the higher level program, however, is neglected as mere 'data'. So you'd be working on a lower abstraction level.

There's ongoing research about tooling support for domain specific languages and making it easy to integrate them with the host language's debugger...etc. I suggest going to the next level: make it easy to treat any data structure as a DSL..

That would probably require the host language to take homoiconism very seriously: If it's an OOP language the program itself would be composed of object literals. ML-like languages would have their code be composed of calls to data constructors. Prolog-like languages would have the program be a set of program facts. And so on. Basically, if the tools in the IDE work on code they should work similarly on anything else.

After all this is done, imagine again working on our word processor: We could step over the rendering of each paragraph, then step into a given line to troubleshoot a bug. Tracing the running of a parser created from combinators would be on a rule-by-rule basis. The 'safe delete' refactoring could have a lot in common with the language's garbage collector. An error would make the IDE stop and show which piece of input caused the problem instead of the troubled code in the main program.

Or maybe I'm wrong. Maybe no one came with the idea because there's some obvious flaw in this reasoning. Or that the idea is vaguely defined and falls apart if studied in detail..I don't know!

الاثنين، 31 أكتوبر 2011

للديموقراطية صور كثيرة

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

سيطرة رجال الأعمال على الدولة حتى أن القوانين تُفصّل لهم خصيصاً، تفتيش الناس في المطارات، معتقلات جوانتانامو، ضرب المتظاهرين بالرصاص المطاطي في مظاهرات Occupy wall street. طبعاً مازال لديهم نقاط إيجابية كثيرة (ليس هدف مقالي الهجوم عليهم) لكني أريد أن أتساءل: كيف تتآكل الديموقراطية في الأمم؟ وكيف يمكن تحصينها لجعل تآكلها أصعب؟ هذه بالطبع اسئلة لها معنى في الجو السياسي الحالي، جو رسم الصورة المستقبلية للدول العربية، ومن هنا هذا المقال.

تعال نضرب أمثلة على استخدام كلمة "ديموقراطية" في نسق غير سياسي، سنعرف لماذا بعد قليل:
  • الفيسبوك ويوتيوب - ومن قبلهم المدونات - صنعوا ديموقراطية في الإعلام، وصار يمكن لأي شخص أن يصنع بذرة قناة إخبارية (مثل شبكة رصد وغيرهم). وهناك أشخاص مثلي لم يكن ليُسمع لهم صوت بدون هذه الأدوات.
  • المدونات بالذات جعلت إنشاء موقع على الإنترنت بسهولة ملء صندوق نصي. قبل ذلك كان يمكن لمتخصص أن يصنع موقعاً للإنترنت بلغة HTML ويبحث لها عن host، لكن الآن خالتي تستطيع عمل مدونة إن أرادت.
  • لغة Visual basic وبرنامج Microsoft Access صنعوا في عصرهم ديموقراطية برمجية، بحيث يمكن لصيدلي مثلاً أو صاحب سوبر ماركت أن يصنع برنامجاً لمحله دون الحاجة لمبرمج متخصص.
ما الذي يجعلني اطلق كلمة "ديموقراطية" على كل من هذه المواقف؟ الشيء المشترك بين كل من هؤلاء هو فكرة نزع القوة من القلة وإعطاؤها للأكثرية. وللقوة صور عديدة...اقتصادية وفكرية وعلمية وتكنولوجية وسياسية وإعلامية...كل قوة منهم لو تركزت في يد قلة فإن هذه القلة قد تسعى لاستثمار قواها الحالية في اكتساب قوى جديدة. وبهذا تبدأ الديموقراطية في التآكل.

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

فكيف نحافظ على الديموقراطية إذاً؟ أشياء كثيرة، لكن من ضمنها فكرة "توزيع القوة على الأكثرية":
  • المعلومات قوة، لذلك لابد أن يكون هناك شفافية ويستطيع المواطن أن يعرف كل صغيرة وكبيرة تحدث في إداريات وحكم الدولة. لو تركزت هذه المعلومات في يد قلة فسيكون من الصعب محسابتهم أو وقف الفساد.
  • التكنولوجيا قوة، لذلك لابد أن يكون استخدام الإنترنت مثلاً متاحاً للجميع بلا قيود، وبسعر رخيص وفي كل مكان، وإلا فسيكون السبيل الوحيد للحصول على المعلومات هو الوسائل التقليدية وهي سهل السيطرة عليها. كل تكنولوجيا يملكها قلة ولا يملكها كثرة هي نقطة يمكن إساءة استغلالها.
  • الفكر قوة، ولو لم يكن الشعب كله على مستوى فكري عالٍ فسيمكن في أية لحظة أن يأتي من يسمون أنفسهم النخبة ويدّعوا - ولو زيفاً - أن الجميع لابد أن يستمع لهم لأن التفكير حكراً عليهم.
  • المال قوة، وفي غياب العدالة الاجتماعية وتكافؤ الفرص والحراك الاجتماعي - أي وجود فرصة للفقير لكي يعمل ويرفع مستواه - ستجد دولة رجال الأعمال.
  • الوظائف قوة، وأرى أنه لابد من تسهيل عملية أن يفتح من يريد شركته أو عمله الخاص ونشر تلك الثقافة، لكي يزيد استقلال كل شخص اقتصادياً ولا يجد نفسه معتمداً على الحكومة أو المؤسسات الكبيرة يعينونه متى شاووا ويتخلصوا منه متى شاؤوا.
  • اللغة قوة، ولو تعلم الأكثرية فن الخطابة والتفاوض والإقناع لكان ذلك ايسر للحوار القومي بدلاً من أن يحتكر ذوو الكلام المزخرف التأثير على الآخرين.
وهكذا وهكذا..إن كنت تريد ترسيخ الديموقراطية في المجتمع عليك أن تسأل نفسك: ما هي صور القوة؟ وكيف يمكن كسر احتكارها؟

بالمناسبة، هل تذكر خطة النهضة التي ذكرتها من قبل على تلك المدونة؟ اسلوبها هو "رفع المستوى الفكري، تغيير القيم الاجتماعية" ومحاورها "العمل بالاسلام، طبقة وسطى قوية، علم مستشري".

الخطة في اساسها اجتماعية، لكن مثل كل شيء لها جوانب سياسية أيضاً!

السبت، 29 أكتوبر 2011

Kalimat-related open source project ideas


Do you like open source and want to create your own project? Do you like Kalimat? Do you want to contribute something to the future of programming in the Arab world?

Here are some new projects that I would love to see for the Kalimat programming language, and which can be done independently of the main Kalimat package of you want to 'own' your project:

Kalimat for .Net

If you write a .Net implementation for SmallVM (the virtual machine of Kalimat & Kick) then the rest would be easy: Just recreate the compiler that translates from Kalimat to SmallVM, or even use the original compiler.

Why Kalimat for .net? It would make Kalimat both usable as an educational language and a professional one; opening the door for libraries that wrap ASP.net, ADO.net, ...etc into an Arabised API and make it available for Arab programmers; kids and adults alike.

Automatic code documentation

The CoffeeScript language has a tool called Docco, that takes commented source code and generates documentation that puts the code and the explanation side by side like this

I really want a tool that works the same way; it would make it so much easier for educators to write Kalimat tutorials with heavy source code and notes, which is why the language was created in the first place!

Kalimat environment on the web

This would make trying the language much easier without needing to download anything and make Linux users happier (since currently Kalimat for Linux has an Ubuntu-only ready made package and other Linux users have to compile from source).

Again, the secret is in SmallVM: If you write it using JavaScript and implement the run-time library (Graphics, Sprites, ...etc) with HTML5 then the IDE itself would probably not be too hard.

More platforms

In addition to .Net, Kalimat could be ported to other platforms. If done right we could have some sort of a "Kalimat everywhere" ecosystem:
  • SmallVM could be translated to, or interpreted by, ActionScript bytecode (ABC) to enable running Kalimat programs as Flash applications (suggested by Issam Elbaytam in the comments)
  • Could similarly be translated to Java, to use the Java platform or to create Android programs
  • Or perhaps translated to Objective-C, to create iOS applications ;)

الاثنين، 24 أكتوبر 2011

حكاية التلميذ الملول، والعملاق، والشراب المنوم

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

ووضع المدرّس أمامنا مجموعة من الصور كما يلي:
1- عملاق اسطوري يحطم القرية
2- شاب يحمل زجاجة شراب منوم
3- العملاق يأكل عشاءه
4- العملاق نائم
5- سكان القرية يحتفلون

وكان "الواجب" ذلك اليوم هو ان نكتب قصة مستوحاة من تلك الصور. لكني لم أرض أن أكتب تلك القصة..

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

"كان هناك عالِم يعيش في المستقبل البعيد، وكان هناك مسابقة للأشياء الغريبة، وفكر العالم أن يعود إلى الماضي لكي يحضر شيئا من هناك يشارك به في المسابقة..."

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

وهذا ما اكتشفه المدرس طبعاً، لذلك وضع دائرة حول الثلاثة اسطر إياها وكتب بخط كبير: "The real story only begins here"

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

من الناحية "التقنية"، أنا فعلاً لم اقم بعمل الواجب كما ينبغي، لكن من اهتم بالطفل الذي شعر أن الواجب مستواه اقل مما يحب، وكتب بدلاً منه قصة للخيال العلمي؟

الأربعاء، 12 أكتوبر 2011

A pony for Amina



يوم في حياة اعضاء بمركز التفكير الحوسبي

نحن في فترة ما في المستقبل القريب، وقد تم إقامة مركز التفكير الحوسبي. تهانينا؛ لقد اجتزت الinterview وتم قبولك للعمل فيه. اليوم ستأخذ جولة لترى شكله من الداخل.

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

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

ماذا عنك أنت؟ أول مهمة سنكلفك بها هي موقع برمجة على الانترنت، يسمح للطفل - أو أي شخص - أن يكتب الكود ويراها تنفّذ فوراً. سوف يكون مكتوبا بتكنولوجيا HTML5، ويحتاج لحيل كثيرة بالـ Ajax ليقوم بدوره. أيضاً يمكنك إن أردت أن تبدأ القراءة عن MindStorms و Adruino، لأن مهمتك التالية ستكون دراسة فكرة عمل لعب الكترونية صغيرة يمكن برمجتها.

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

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

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

(هذه الرؤية لم تتحقق بعد. تريد لها أن تتحقق؟ لماذا لا نفتح حواراً عن تمويل المركز؟ لو لم تراها بعد، هذه رؤية للمركز من زاوية أخرى)

الخميس، 15 سبتمبر 2011

أهمية علم لغات البرمجة

My area of interest is programming language theory (PLT). This is an area separate from compilers, but related.

It discusses things like programming paradigms (imperative, logic, functional, object oriented,...), language semantics, type systems, programming language features, and other things.

The problem is; most programmers think 'languages' are a solved problem. They think that the best possible languages are the familiar ones like C++ or Java, and that effort should now focus on e.g the libraries. That is completely not true!

So, let's discuss some lesser-known languages and how they offer completely new ways to programming.

There is a new language called OPA - derived from the ML family - that makes web application development significantly faster. Projects that take months to develop can be made in OPA in weeks.

A large part of the power of this language comes from its type system, Which lets you describe only once the shape of your data and then generates client-side (running on the web browser) and server-side code from the same description, thus eliminating many causes for error.

Or how about Google's Go language, which focuses on speed of compilation, safety, simplicity and concurrency?

Then we have Subtext, a language (part of a series) that attempts to simplify the reading and understanding of programs?

Or Lisp, where you can define new syntax for the language, having components written with "mini-languages" inside a larger program?

Or...we know that C is fast and powerful, but very unsafe and hard-to-debug. How about a language that has the same speed and low level capabilities, but much more safe and expressive? Enter BitC.

Speaking of low-level; Mozilla (the creators of Firefox) are working on a new language for systems programming called Rust. It should be useful for the same type of programs that are written in C++ but with features like this (from their site):
  • Memory safe. No null pointers, wild pointers, etc. Automatic storage management.
  • Dynamic execution safety: task failure / unwinding, trapping, logging.RAII / dtors.
  • Typestate system: ability to define complex invariants that hold over data structures.
  • Very lightweight tasks (coroutines). Cheap to spawn thousands-to-millions.
Finally, how about F# from Microsoft, a functional programming language that is now part of Visual Studio, described on its site as "...It is a simple and pragmatic language, and has particular strengths in data-oriented programming, parallel I/O programming, parallel CPU programming, scripting and algorithmic development"

In summary, programming language theory is not simply about academic research: real companies like Google, Mozilla, and Microsoft are working on serious projects that help them in making money or beating their competition.

I think this field is very worthy of study, even if so few people pay attention to it...

الجمعة، 9 سبتمبر 2011

يوم في حياة أطفال مبرمجين

نحن في عام 2018. محسن لديه ثلاثة أبناء: مروة (13 عاماً)، منى (8 سنوات) ومصطفى (5 سنوات).

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

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

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

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

مع الوقت لن تكتفي منى بالرسم على الpaintbrush، بل سوف تكتب برامج لرسم مربعات ونجوم وزخارف كالزخارف الإسلامية، وفي كل مرة سوف تسير السيارة بها لتنفذ ما قد خُطّط لها.

لكن اليوم سوف تلهو قليلاً، بينما أختها الكبرى تتقدم قليلاً في مشروع الروبوت ثم تذهب لأخذ محاضرة في خوارزمية Depth first search.

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

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

قال بصوت رفيع: آه! أنا تائهة! أريد أن أعود إلى أمي!

ثم غير صوته لصوت أكثر غلظة (على الأقل بالنسبة لطفل في الخامسة) وحرك صورة الرجل قليلاً وقال: لا تخافي أيتها القطة الصغيرة! أنا أعرف أين هي أمك! تعالي معي!

ثم بصوت القطة: أصحيح هذا؟؟ حسناً أيها الرجل الطيب! سوف آتي معك.

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

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

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

كانت زوجة محسن تعمل معلّمة، وكانت مهمتها حالياً تحضير درس النحو الجديد، وقد تم تعديل منهج النحو ليستفيد من الطرق الحوسبية؛ مثلاً الإعراب يُكتب الآن في صورة شجرة إعرابية parse tree. بدايات صغيرة لكنها تنمو مع الوقت.

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

كانت نهاية القصة سعيدة، إذ قبض الشرطي على لص القطط وأعاد القطة الصغيرة لأمها، بينما عادت مروة ومنى من المركز. قال الأب لمنى: هل كنت سعيدة اليوم؟

قالت منى: نعم!

قال لها: وهل تريدين الذهاب غداً؟

قاطعته مروة: ولكنها سوف تعطلني عما أفعل يا أبي!

قال محسن: لا تقلقي، سوف أذهب معها أنا.

الا تريد لهذا أن يصبح حقيقة؟ يمكننا أن نبدأ بحوار عن الفكرة (بريدي الاكتروني هو samy2004 على gmail.com )، ولديّ خطة أعمال مبدئية هنا.

الثلاثاء، 6 سبتمبر 2011

Concept: The Whisper programming language

I'm thinking up of a new programming language, heavily derived from Smalltalk and called 'Whisper'. This is an outline of my current thoughts -- I don't know when or if I'd actually implement the language.

Syntax

Like Smalltalk, almost everything is a message send. There are two kinds of message send in Whisper: binary operators and keyword messages. Binary operators follow the usual Smalltalk tradition:

12 + 8 * 2 -- returns 40

Keyword messages follow syntax like this:

myWindow : drawCircleAt(100, 100) withRadius(50)

Some notes:
  • A colon after the object indicates the start of a message send
  • A keyword can have zero, one or more values acting as positional arguments
  • Normal C-like positional arguments are a special case of this syntax
  • The syntax is heavily inspired by the Grace educational programming language, itself inspired - again- by Smalltalk
We have the traditional ST blocks:

myFunc = { x, y | x + y }


When sending a keyword message, and a block is the only argument between parenthesis, the parens can be omitted like so

(x > 5) ifTrue { out : print("yes") } else { out : print("no") }

IDE & Image

As an experiment, the main IDE for Whisper would be completely browser-based with IDE logic running from a web server. Local applications can be written that access local files...etc but the application's UI would still be browser based.

Another, for me much harder experiment is to make everything persistent all the time on an Sqlite database: All program state changes would be by writing to slots in objects, even function activation records or global variables (an idea taken from Self and others), and all slot writes would be trapped and written in the DB.

This would have a very high performance cost, so a lot of design thought should be put into this; by thinking about how to use memory for cache, possibly marking special object as transient, or some other clever method. I'm sure the Lispers, Smalltalkers, Selfers...etc have probably already "killed this problem from research", as the Arabic saying goes, and that I could find an ideal solution in some paper published in 1989..we'll see!

Gradual typing

Fields, method arguments and return values can have optional type declarations, this would allow the JIT compiler to better optimize things and (more importantly for me) allow autocomplete to work. It would also make refactoring safer, for example renaming a method would change the identifiers in all known calls to that method.

This should not change the dynamic nature of the language: The IDE and program are still 'live' and programs are still assembled piecemeal without an edit/compile cycle. There will be situations when calling a method with wrong argument types throws a runtime exception instead of a compiler error, and that's fine for me.

Other goodies

Since I'm now in the dreaming phase and not serious work phase, let's steal some ideas from Lisp, while we're at it:

The first is multiple dispatch. I think this will be useful in certain types of applications like compilers, allow us to think about libraries in new ways (I can imagine a GUI library inspired by the 'lenses' concept from MIT's Haystack project) and allows niceties like the return of traditional syntax:

if(x > 5) do { out: print("yes") } else { out: print("no") }

We can almost fool users into thinking it's Java or C#!

Also, since the syntax is nicely minimal, we could think about adding some metaprogramming...

Since Smalltalk tries to make as much of the program be represented as objects, we can do the same with the program syntax tree itself; and have the AST of each method be a public property of that method.

This would allow us to write code in our own DSL inside a method, code which looks like gibberish to the interpreter but useful for us, since we can write procedures to read the tree from the method and process it in whatever way we like. Possibly layer Common Lisp-style macros on top of this feature.

Looks like a nice language, right? I wish it were already available so that I didn't have to develop it :(

الأربعاء، 31 أغسطس 2011

Graduation project themes and ideas - 2010

In 2010 I suggested the idea of having multiple graduation projects with a common topic or 'theme'. My hope from this was to:
  • Give students the feelings that their projects are part of a larger goal
  • Give opportunity for different teams to cooperate and share e.g research papers they found on the topic
  • Possibly plant the seed of 'research departments' in FCIS, where multiple MS.c or Ph.D researchers work on common topics instead of each doing an independent topic.
That year I gave a presentation outlining two themes: Arabic natural language processing and Pen computing , and giving a lot of ideas for each theme (and some outside the themes).

Here's the presentation slides, in case they might be useful: Themes for Graduation projects - 2010

الأحد، 21 أغسطس 2011

How Kalimat produces EXE files


Everyone tells me Kalimat is a toy language since it doesn't produce .exe files.

At first, I didn't pay attention since my main goal was teaching children programming. I mean, does Smallbasic produce exe's? Does Scratch?

But gradually, I changed my mind
  • Many children would feel patronized if they have a perception of being taught with a "kiddy" language, even if the language is actually powerful - if it seems kiddy, that's bad.
  • Being an Arabic-based language means it's under more scrutiny, since a lot of people will have the "Arabs can't make a real language" point of view, and will find any reason to say so
  • There is a real technical need for making .exe files from programs, so that users - kid or adult - can distribute their programs to others.
So started the journey of making executables. I began considering my options:
  1. Generate assembly code or machine code from Kalimat, perhaps using something like LLVM or C--
  2. Generate code in another language like C++ or Go, and use e.g a C++ compiler to create the .exe
  3. Cheat
Cheating sounds good, right? What does that mean exactly? Well, in early versions of Visual Basic (far before VB6 or .Net) the IDE could create exe files, but not exactly the way you know: The file contained a bytecode version of your program, and you had to include a DLL that came with VB and contained an interpreter for this bytecode. All your exe had to do was to load the DLL and tell it: "Here, take this program and run it for me, will you?".

This is also how py2exe works: It bundles your python program and a python interpreter into one package, and that is your executable.

Kalimat has already taken a lot of ideas from Basic and Python, so I decided to go this route and quickly add that feature, and in the long term consider adding the capability of making real, 'respectful' .exe files.

(I do mean 'quickly', it was done in ~ 3 days).

Step 1: Separate SmallVM into its own DLL

The Kalimat IDE and SmallVM (the virtual machine that runs Kalimat programs) were very tightly coupled in the source code. I had to spend some times moving all runtime code from the IDE to the VM, making small changes as I go, and export some VM functions.

Now I have an independent smallvm.dll which exports a function that your programs can send code to execute.

Even better: smallvm.dll does not take Kalimat code, but takes code in the form of its own assembly. That means if you're creating your own programming language you can use it.

Step 2: Generate the "driver" program

Now suppose the user typed this program and wants to create an .exe from it:
اطبع 12
First the Kalimat IDE will generate this assembly:

.method main
pushv 12
callex print
ret
.endmethod
This is good. Now we need a program that does something like this:
#include "smallvm.h"

int main( )
{
char *program =".method main\npushv 12\n\callex print\nret\n.endmethod";
SmallVMRunCode(program);
}
If this program is then made to .exe, then we're done!

Notice that I've simplified a lot of details here. For example the char *program is actually not a direct representation of the program but a base64 encoding of it. Also notice that I could've used a technique called 'binary blobs' to bypass the need for repeatedly compiling C++ code and just use a linker to combine object files.

So far so good, but that means I need to include a C or C++ compiler (or a linker) with Kalimat. On the Linux version of Kalimat that's easy: Just add gcc or g++ as a dependency and the package manager would take care of the job.

On Windows I'd have to manually bundle a compiler. The standard Open Source C++ compiler on Windows is MinGW. Its a little more than 120 megabytes...

Ouch. Remember that Kalimat's download is currently about 5.4 megabytes.

I tried to take only the necessary files in MinGW and include them, but failed. I don't know what little stuff depends on other little stuff.. It might be possible, even easy, but I don't want to keep trying out things aimlessly, and I don't want to study - right now- the structure of the GNU toolchain. Let's find another way.

No problem, I thought: I'll use Google's Go language. The compiler and linker (8g.exe, 8l.exe) are 1.8 megabytes together, and they don't need anything else to work. Excellent! All I need to do is generate a small Go program that calls a function from a C dll.

To do this, I think you use a tool called cgo that's bundled with Go. I tried for some time to use cgo but failed. I didn't spend a long time doing that; maybe I'm too lazy, maybe if I spent a little more time I'd have figured it out, but anyway...

What other languages produce native .exe's these days? I know: Free Pascal.

I'll spoil the surprise for you: this is the current solution. Yup! Good ole' Pascal :)

At first, the generated .pas file looked something like this:
program RunSmallVM;

procedure RunSmallVMCodeBase64(A:PChar;B:PChar);
stdcall ;external 'smallvm.dll';
begin
RunSmallVMCodeBase64('','2e6d657468');
end.
This is good as long as your encoded program is small. Once it gets a little large you find out that traditional Pascal string can't go more than 255 characters. What?

Ok, you can add a compiler directive to make the language use another type of string (AnsiStrings), but string literals maintain the 255 character limit. Sigh :(

No problem: I made the code generator make a series of string concatenations to form the final program form. This would slow down the time from loading the .exe to running the program, but it now works. I can speed things up later, by embedding binary blobs in the .exe or something.

Also I had trouble with base64 encoding of programs: Parts of the SmallVM assembly program are themselves encoded in base64. It seems the encoding in this case messes up. This is what happened with me:

programHeader = encode64(stuff)
program = programHeader + restOfCode
stringToSend = encode64(program)

originalProgram = decode64(stringToSend)

To my surprise, the string originalProgram is not equal to programHeader+restOfCode as expectd, but instead it is equal to stuff+restOfCode. It seems the base64 decoder is too eager to decode anything that seems like base64 characters :(

As a hack I used different functions in the .DLL to send different parts of the program. I'll figure out a proper solution later.

There is a lesson to be learned here: It pays to diversify your knowledge! In order to create an actual useful product, I went through a journey of old and new technology: VB, py2exe, MinGW, Go, and even Pascal. You don't know what knowledge will finally solve the problem.

So it's buggy, it's hacky, it's unstable, but it's there! Kalimat can now generate .exe files! And with a few iterations I hope it works well enough for day to day usage.

الجمعة، 19 أغسطس 2011

Roadmap for Kalimat

What's the whole plan, present and future, for the Kalimat programming language? Here's a rough outline.

These goals are listed roughly from "Immediate future" to "long term", but they are not strictly in order: Some things are done in parallel, some of the 'long term' items have actually started now, the important part here is the ideas, not the order of their execution.

More stable language
  • Make FFI work correctly, fix memory leaks, pointer issues...etc
  • Fix odds & ends in the language, like e.g missing graphics commands
  • Make it produce independent applications, either by separating the VM from the IDE or by compiling to .exe (note: work already started)
Children & Education
  • A site "trykalimat.com" where users can type and run Kalimat programs directly in the web browser, to test the language without downloading.
  • A Youtube-like site where children can upload their programs for others to see (the idea comes from MIT Scratch) and a 'share' button in the IDE for automatic uploads
  • Integrated tutorials, labs and exercises in the IDE itself
  • Social ecosystem of books, online communities, training...etc
  • Programmable toys that have an interface to Kalimat...OOP with real physical objects!
  • Research and computational thinking
A professional language
  • Add more libraries, support for web applications, (perhaps also iPhone or Android applications)
  • Optional static type checking
  • A online repository for installing libraries and components from the IDE
  • Faster VM, better garbage collection, running concurrent processes in parallel
  • 'Sister' Compilers for the Java VM or .Net CLR
  • A book "Kalimat internals" to explain design & architecture behind Kalimat, to help contributors to the project, beginner compiler writers, and people who want to create their own Arabic PLs
  • Transform Kalimat from "Mohamed Samy's project" into "Kalimat team project"
Let's hope at least a significant portion of this is somehow accomplished, إن شاء الله.

الجمعة، 12 أغسطس 2011

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

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

الslides المقدمة في الفيديو تجدها هنا

(لو أعجبك هذا البوست فقد يعجبك أيضاً هذا: حاسبات للقرن الواحد والعشرين)

مفاتيح للنهضة

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

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


[من مقدمة كتاب "حضارة الوسط: نحو أصولية جديدة" للدكتور رفيق حبيب]

وذلك أنا لا نعلم شيئاً يبتغيه الناظم بنظمه غير أن ينظر في وجوه كل باب وفروقه‏.‏فينظر في الخبر إلى الوجوه التي تراها في قولك‏:‏ "زيد منطلق" و "زيد ينطلق" و"ينطلق زيد" و"منطلق زيد" و"زيد المنطلق" و"المنطلق زيد" و"زيد هو المنطلق" و"زيد هو منطلق‏".‏

وفي الشرط والجزاء إلى الوجوه التي تراها في قولك‏:‏ "إن تخرج أخرج" و"إن خرجتَ خرجتُ" و"إن تخرج فأنا خارج" و"أنا خارج إن خرجت" و"أنا إن خرجت خارج‏".‏

وفي الحال إلى الوجوه التي تراها في قولك‏:‏ "جاءني زيد مسرعاً" و"جاءني يسرع" و"جاءني وهو مسرع" (أو هو يسرع) و"جاءني قد أسرع" و"جاءني وقد أسرع‏".‏

فيعرف لكل من ذلك موضعه ويجيء به حيث ينبغي له‏.‏

[من كتاب "دلائل الإعجاز"، للعالم عبد القاهر الجرجاني]


Oppenheimer's way of working with his research students was also original. His group consisted of 8 or 10 graduate students and about half a dozen postdoctoral fellows. He met the group once a day in his office. A little before the appointed time, the members straggled in and and disposed themselves on the tables and about the walls.

Oppenheimer came in and discussed with one after another the status of the student's research problem while the others listened and offered comments. All were exposed to a broad range of topics. Oppenheimer was interested in everything; one subject after another was introduced and coexisted with all the others. In an afternoon they might discuss electrodynamics, cosmic rays, astrophysics and nuclear physics.

[.....] For each problem that interested him, Oppenheimer would select a student or postdoc to work out the details.

[from "Black holes and time warps" by Kip S. Thorne"]

الخميس، 11 أغسطس 2011

كلمات: استدعاء إجراءات سي

إمكانات كثيرة يريدها المبرمج: رسومات ثلاثية الأبعاد، مؤثرات صوتية، اتصال بالإنترنت، تعامل مع نظام التشغيل... حين اضفت إمكانيات الGUI كان لابد أن أغير المفسر interpreter، لأن مفسر كلمات كان حلقة الاتصال الوحيدة بين اللغة وبين العالم الخارجي. هل سيحدث نفس الشيء مع كل الإمكانيات الأخرى؟

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

[ملاحظة هامة: لن تعمل هذه الأمثلة إلا على إصدار اغسطس 2011 أو أحدث. يمكنك تحميل أحدث إصدارة من هنا أو هنا].

كل اللغات المعروفة تقريباً فيها إمكانية التعامل مع الدوال الخارجية (Foreign function interface) أو FFI، وهذا في أغلب الأحيان يساوي إمكانية للتعامل مع مكتبات الربط DLL المكتوبة بالسي. هذه الإمكانية الآن موجودة في كلمات أيضاً. مثال بسيط على هذا؛ دالة MessageBox:
مكتبة "user32.dll" :

دالة رسالة برمز "MessageBoxW" ( مشير.سي،
نص.سي،
نص.سي،
صحيح32.سي ) صحيح32.سي
نهاية
م = رسالة ( 0 ، "هذه العملية سوف تدمر كل شيء!!"،
"هل أنت متأكد؟" ، 3 )

هذه أول مرة نرى فيها Type declarations في كلمات! نحن لا نستخدمها إلا في حالة الـFFI لكن من يدري؟ قد نراها مستقبلاً في أدوار أخرى...

لاحظ في المثال السابق أن نوع القيمة القيمة الراجعة من الدالة (وهو صحيح32.سي) مكتوب في آخر السطر المعرفة فيه الدالة نفسها. ماذا لو كنا نريد استدعاء void function؟ في تلك الحالة نعرف إجراء بدلا من دالة ولا نذكر القيمة الراجعة.

قبل أن نكمل هذا مرجع سريع لأنواع البيانات المستخدمة في التعامل مع إجراءات السي:
النوع في لغة سي
النوع في كلمات
int
صحيح32.سي
float
طفوي.سي
long
طويل.سي
double
مزدوج.سي
char
حرفي.سي
char *
نص.آسكي.سي
wchar_t *
نص.سي
void *
مشير.سي

لاحظ أن نص.آسكي.سي يعمل مع الحروف الانجليزية، بينما نص.سي يقبل حروف اليونيكود - ومنها الحروف العربية، والموضوع يعتمد بالطبع على نوع البيانات الذي تقبله الدالة: مثلاً في ويندوز الدالة MessageBoxA تستخدم آسكي بينما MessageBoxW تستخدم يونيكود.

ها هنا مثال آخر، لكن هذه المرة على نسخة كلمات على لينكس، يوضح استخدام دالة getenv:
مكتبة "libc.so.6" :

دالة بيئة برمز "getenv" ( نص.آسكي.سي ) نص.آسكي.سي
نهاية
م = بيئة ( "PATH" )
اطبع م
يحاول مفسر كلمات التصرف "بعقل" قدر الإمكان، فمثلاً قام بتحويل النص المقدم للدالة من يونيكود (وهو الصيغة الداخلية لكل نصوص كلمات) إلى آسكي قبل استدعاء الدالة. نفس الشيء يحدث لو كانت الدالة تريد قيمة عدد حقيقي وأرسل لها مثلاً عدد صحيح.

ماذا عن الدوال التي تأخد قيماً أعقد من integer أو نص؟ تعال نتخيل أن لدينا مكتبة DLL فيها دالة اسمها TestPoint تأخذ عاملاً بهذا الشكل:
struct POINT
{
long x; long y;
};

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

هذا بسبب أن معلومات POINT موجودة لدى مترجم السي وحده، ولو أردنا استخدامها من كلمات سيكون علينا إعادة تعريف هذه المعلومات:
فصيلة نقطة :

له س تسييره طويل.سي
له ص تسييره طويل.سي
نهاية

مكتبة "simple_dll.dll" :
دالة اختبر.نقطة برمز "TestPoint" ( نقطة ) صحيح32.سي
نهاية

ن = نقطة جديد
س ن = 130
ص ن = 180
ذ = اختبر.نقطة ( ن )
اطبع ذ
هنا فصيلة نقطة هي فصيلة عادية جدا، فقط أضفنا معلومات عن كيفية استخدام قيم س، ص عند ارسال نقطة لدالة سي. يمكننا - إن أردنا - أن نضيف المزيد من الfields أو الmethods لفصيلتنا، ولكن عند تقديمها لدالة سي لن يتم التعامل إلا مع البيانات المعرف لها "تسيير".

هيا نكتب الآن مثالاً أطول يستخدم Windows API. سوف نكتب برنامجاً يرسم مستطيلاً أسوداً في منتصف الشاشة - في منتصف الشاشة الحقيقية وليس نافذة كلمات.

أولاً نكتب هذا البرنامج بلغة سي ثم "نترجمه" خطوة خطوة:
HDC dc = GetDC(0); // Retrieve device context of whole screen
HBRUSH brush = GetStockObject(BLACK_BRUSH);
RECT r;
r.left = 800;
r.top = 600;
r.right = 1000;
r.bottom = 700;
FillRect(dc, &r, brush);

يستخدم البرنامج هنا ثلاث دوال سي: GetDC، GetStockObject، FillRect

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

له يسار تسييره طويل.سي
له قمة تسييره طويل.سي
له يمين تسييره طويل.سي
له قاع تسييره طويل.سي
نهاية
الآن نعرف الدوال المطلوبة:
مكتبة "user32.dll" :

دالة مجال.رسم برمز "GetDC" ( مشير.سي ) مشير.سي
    دالة املأ.مستطيل برمز "FillRect" ( مشير.سي ، مشير ( مستطيل ) ، مشير.سي ) صحيح32.سي

نهاية

مكتبة "gdi32.dll" :
دالة عنصر.رسم.جاهز برمز "GetStockObject" ( صحيح32.سي ) مشير.سي
نهاية
لاحظ أننا في الدالة FillRect لا نرسل مستطيلاً، بل نرسل مشير pointer إلى مستطيل..وحين استدعينا الدالة في السي لم نرسل المستطيل r بل أرسلنا عنوانه في الذاكرة r&..سينعكس هذا على كود كلمات أيضاً.

لاحظ أيضاً أننا في الأنواع تحت صنف HANDLE مثل HDC أو HBRSUH نستخدم مشير.سي

(تسيير..مشير..لقد صارت اللغة سياسية أكثر من اللازم. الإصدارة القادمة لابد من أمر اسمه أجندة لتكتمل الصورة)

الآن نكتب برنامجنا:
ط = مستطيل جديد

يسار ط = 800
قمة ط = 600
يمين ط = 1000
قاع ط = 700

م = مجال.رسم ( 0 )
الفرشاة = عنصر.رسم.جاهز ( 4 )
املأ.مستطيل ( م ، عنوان ( ط ) ، الفرشاة )
عند تنفيذ البرنامج سوف يظهر مستطيل أسود على الشاشة. قد لا يظهر المستطيل كاملاً لو تقاطع مع نافذة البرنامج، لأن تلك النافذة ترسم نفسها باستمرار.

ليس أكثر عرض شيق في العالم، كما أن إمكانية FFI في صورتها الحالية لم تكتمل، ومليئة بالأخطاء، وتسبب memory leaks مثل المصفاة...لكن الكود، حتى في تلك الصورة، تثبت أننا نسير في الطريق الصحيح: لقد بدأت لغة كلمات تقترب من اللغات الإحترافية. من يدري ماذا يمكن أن يُعمل بها الآن..ربما يضيف أحد مكتبة تستخدم OpenGL.

أو ربما تتصل بقواعد بيانات. أو يصمم بها برامج شبكية. لا أدري - لقد صار الباب مفتوحاً لغيري الآن :)

الاثنين، 1 أغسطس 2011

أنت والمغالطات المنطقية

صار الحوار السياسي مزعجا هذه الأيام؛ أشبه بصورة كاريكاتيرية عبارة عن وجهين يصرخان في بعضهما.

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

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

الآن نأتي للكتالوج...

اسم المغالطة: Ad-hominem
الاسم العربي: هجوم تجاه الشخص لا الحجة

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

كيف تتصرف: نبه الطرف الآخر أنه بهجومه الشخصي عليك يحاول أن يفلت من الرد على حجتك، واطلب منه رداً محدداً على كلامك

اسم المغالطة: Strawman argument
الاسم العربي: استبدال حجة أسهل

هذه أيضاً ذائعة هذه الأيام؛ أن تفسر كلام خصمك تفسيراً ليس بالضبط ما قصده لكن شيئاً له علاقة ما بما قاله، ويكون شيء أسهل بكثير في الرد. مثلاً:

يقول طرف من الأطراف "أنا مع الحكم الإسلامي"
فيرد الطرف الآخر "هل تريد ولاية الفقيه مثل إيران؟؟؟؟"

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

اسمها بالانجليزية "مغالطة رجل القش" تشبيها بشخص خاف من مواجهة رجل حقيقي فصنع رجلاً ضعيفا من القش وهزمه :)

كيف تتصرف: قل "كلامي لا يُستدلّ منه بالضرورة ما تقول، أنت فسرت كلامي بشكل خاطيء، وغيرت الموضوع إلى نقطة كذا بدلاً من معنى كلامي الأصلي".

اسم المغالطة: Non-sequiter
الاسم العربي: لا يتبع

هنا يقول المتحدث أنه هناك معلومة حقيقية (أ) ثم يستنتج منها نتيجة (ب)، مع أن ب ليست بالضرورة نتيجة منطقية تتبع أ

مثلاً:
- هناك تأخير في محاكمة مبارك، ومعنى ذلك أن المجلس العسكري متواطيء مع مبارك نفسه
- فلان سافر إلى أمريكا ويعمل في شركة أمريكية، إذاً هو عميل أمريكي
- تم تعيين فلان في لجنة كذا وهو من الإخوان المسلمين، إذاً المجلس العسكري متواطيء مع الإخوان

...وهكذا

اسم المغالطة: False dilemma
الاسم العربي: الاختيارات المزيفة، الزنقة الإجبارية

هنا يضع المتحدث أمامك بديلان أو أكثر ويجبرك أن تختار بينهما، بينما في الواقع هناك اختيارات أخرى لم يذكرها قد تخرج من "الزنقة" الي يحاول أن يضعك فيها.

مثلاً:
- "لماذا لم ترشح فلاناً؟ هل تريدها دولة علمانية؟"
- "كيف تترك الإسلاميين يفعلون ما يريدون؟ هل تريدها دولة كهنوتية؟"
- "لماذا تعارض إمساك أحمد شفيق بمنصب رئيس الوزراء؟ ألا تعلم أن البديل هو الفوضى؟"

كيف تتصرف: وضح أن الطرف الآخر صاغ كلامه بحيث لا يكون أمامك سوى هذه الاختيارات، اقترح بدائل أخرى إن أمكن.

اسم المغالطة: Appeal to emotions
الاسم العربي: اللجوء للعاطفة، التماس عاطفي

هنا يحاول الطرف الآخر أن يضع الموضوع في قالب عاطفي جداً لكي يطفيء أي ردود على كلامه، مثلاً:
- كيف لا تريد الانضمام للمسيرة من التحرير للعباسية؟ ألا تذكر دماء الشهداء؟ ألا تدرك معاناة أهلهم الذين لم يروا القصاص لأبنائهم؟
- لماذا تصر على محاكمة مبارك؟ انه رجل كبير في الثمانين وتعبان صحياً، كما أنه حارب وخدم الوطن..ارحموا الناس يا ناس!

اسم المغالطة: "Fallacy fallacy" (لا أعرف إن كان هذا اسماً رسمياً/دارجاً أم لا)
الاسم العربي: مغالطة "كلامك فيه مغالطة، إذن أنت على خطأ"

حين تجد مغالطة في كلام الطرف الآخر فليس معنى هذا أن رأيه الأصلي خطأ بالضرورة، فقط معناه أن هذه الحجة بالذات ليست دليلاً منطقياً على كلامه. قد يكون هناك أو لا يكون دليل آخر حقيقيّ. تذكر أن هدفنا هو المحافظة على مصداقية الحوار وليس "سحق" الخصم بأي وسيلة كانت ولو غير عادلة!

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

هذه كانت عينة من المغالطات المنطقية. ربما أستطيع أن أقدم المزيد من النماذج في مقال مستقبليّ.

الجمعة، 29 يوليو 2011

حاسبات للقرن الواحد والعشرين

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

تقليل العدد

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

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

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

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

صورة الكلية أمام المجتمع

مشكلة كلية الحاسبات أنه من الصعب تعريفها لدى الشخص العادي: الطبيب يعالج، المهندس يبني، ماذا يفعل المبرمج؟ لهذا يأتي كل شخص بنظريته الخاصة [المبرمج يستخدم فوتوشوب، المبرمج يبيع هارد ديسكات، المبرمج يجلس أمام الفيسبوك...الخ].

المشكلة الثانية أن الكلية لا توجد لها قصص نجاح معلنة بما يكفي (أقصد أن لها قصص نجاح كثيرة لكن المعلن منها قليل) هذا يؤدي للحوار الآتي:
  • فلان دخل هندسة بترول وتوظف في شركة باشو للبترول بمرتب 10،000 جنيه! لماذا لا تصبح مثله؟
  • فلانة دخلت طب وفتح لها أبوها عيادة، أنت لست أقل من ذلك وأنا أدخر لك ثمن العيادة من الآن!

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

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

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

[لم أقصد انتقاد صاحب المشروع في هندسة أو شيء من هذا، المشروع محترم لكن كلامي هنا عن المستوى العلمي لكليتي أنا]

لدينا مشاريع تتعامل مع اللغة العربية، لغات برمجة جديدة، مشاريع روبوت، مشاريع علمية، لكن المجتمع لا يعرف. ويظنون البلد متخلّفة :(

ماذا يكلفنا أن نأتي بكاميرا فيديو ونصور كل هذه المشاريع التي تبدو كالخيال العلمي ونضع كتالوج بكل هذا على موقع Youtube؟ ماذا يضيرنا أن نكلم كل الصحف والمحطات التلفزيونية لتأتي أيام المشاريع وترى؟ لا أتوقع أن يكلف هذا مالاً في إعلانات، بل يكون الموضوع خبراً لا إعلاناً لأن الصحفيون أنفسهم يبحثون عن مثل هذه النوعية من الإنجازات. أتخيل الآن العناوين:
  • "مصر مازالت بخير، مشروعات تخرج في كلية الحاسبات تضاهي الاختراعات الأجنبية"
  • "المبدعون الشباب ينقلون المجتمع المصري إلى القرن الواحد والعشرين"
  • "الاختراعات تتوالى في الجامعات المصرية"

أريد أن يصير اسم حاسبات مرتبطاً بالاختراع، هذا هو التعريف الذي أريده في ذهن المجتمع.

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

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

لدينا من الخريجين في شركة مايكروسوفت بالولايات المتحدة وكندا حتى لتظن انه هناك فرع من الكلية هناك، لمَ لا يعرف أحد شيئاً عنهم؟

ماذا عن الخريجين الذين قد أسسوا شركات؟

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

[تعقيب: قد أتبعت كلامي بعمل وبدأت خطوة صغيرة في هذا الاتجاه.]

العامل البشري

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

كفاءات عالية + بيئة إدارية مشجعة = مؤسسة ناجحة.

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

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

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

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

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