الجمعة، 27 أبريل 2012

دليل الملتمس إلى استخدام الماوس بالg4c

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

وظيفتك إذاً كمبرمج ان تفعل الآتي:

1- تعرف دالة جديدة تقوم بدور mouse proc
2- تقوم بتسجيل هذه الدالة في g4c عن طريق اعطاء اسمها (بدون الاقواس) إلى register_mouse_proc
3- تكتب بداخل الـmouseProc الكود التي تريد ان تحدث عند أي حدث للماوس.

الدالة التي تكتبها يمكن ان تأخذ أي اسم، لكن عدد الparameters وانواعها والreturn value يجب ان تطابق الآتي:

int myMouseProc(int x, int y, bool leftButton, bool rightButton, void *)

لاحظ ان تحريك الماوس، الكليك، ...الخ كلهم يتم التعامل معهم عن طريق هذه الدالة. x و y  يدلان دائماً على مكان المؤشر وقت الحدث، leftButton تدل إن كان الزر الأيسر مضغوطا في تلك اللحظة ام مرفوعاً، ويناظره rightButton للزر الأيسر، وآخر parameter غير مستخدم. الآن بعض الامثلة...

كيف اتعامل مع الكليك؟ مثلاً هذا البرنامج يعد الكليكات بالزر الأيسر:

#include "g4c.h"

bool oldLeftButton = false;
int numClicks = 0;

int mouseProc(int x, int y, bool leftButton, bool rightButton, void *)
{
     if(oldLeftButton == false && leftButton == true)
    {
                   numClicks++;
    }
    oldLeftButton = leftButton;
    return 0;
}

void main( )
{
     register_mouse_proc(mouseProc).
}

هذا البرنامج جزءان: اول جزء يخزن دائماً القيمة القديمة لـ leftButton لأننا نريد ان نقارن القيمة القديمة بالجديدة.

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

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

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

الخميس، 26 أبريل 2012

An educational tower of programming features

I've been working on an educational programming language for children called Kalimat. One of the ideas about its design is "different concepts for different levels".

Some languages are quite easy to learn, like 80s Basic, while others try to still be easy but add structure or discipline. There's this famous Dijkstra quote (probably made in jest) about Basic ruining children's minds beyond all repair.

Well, Kalimat goes the other way by assuming "all repair" is possible, even a good thing: it starts with a language very similar to QBasic; a child can write interesting programs using only global variables, If conditions, and goto. They can learn with flowcharts if it benefits them, and they can use graphics routines.

We can call this "Level 1". Gradually, these primitive features are shed in favor of more advanced, more abstract features.

Kalimat is Arabic-based, but I'll use a hypothetical English version for the example. This is the typical 'guess the number' game:

n = random(20)
label begin
read "Guess the number:", #g
if g > n :
    print "too high!"
    goto begin
else if g < n :
    print "too low!"
    goto begin
else
    print "good job!"
done

The benefit of this model is that almost everything is visible. The child doesn't need to know the abstractions of procedure calls, or keep in their head the semantics of such calls when thinking about what to do. Commands are executed, sometimes execution jumps. Variables store numbers and sentences, and that's more or less it. Now let's move stuff on the screen or write short quiz programs.

If the child outgrows the kind of programs this model allows, they can learn looping with for and while, and further learn procedure calls. Procedures are separate from functions: this allows the teacher to talks about procedures as "taking some lines of code and giving them a name", and then enter the realm of local variables and parameter passing, and finally talk about "defining our own functions" similar to built-in functions like sin, cos, or random. Let's call that level 2.

Level 3 is OOP. While OOP is now all about abstraction, there's some bit of "concreteness" left: There is no implicit "this" or "self" reference, and like, say, Python this reference is explicit. We also borrow the "send a message" metaphor from Smalltalk. An object can respond to a message or reply to it. Mirroring procedures and functions (I admit this part looks clumsy, needs experimentation to see if it turns to actually make the teaching easier).


class Point:
    has x, y
    responds to draw( )
end

responseOf Point p to draw( ):
    drawPixel (x of p, y of p)
end 

You've probably noticed the usage of cues from natural language to make reading programs flow more naturally. We are not trying to emulate COBOL or SQL; but we believe such cues in the right dosage could help with teaching and conversations about the code. I intend for Kalimat to have something of a canonical reading form, that is when reading code aloud, there is a known way to voice expressions, definitions, ...etc

Anyway, I like the result in the code snippet:  "the response of a point P to 'draw!' is to invoke drawPixel at the x and y of P".

How about other levels? Now that the child's programming knowledge has matured, they can learn more: like for example concurrency. Kalimat uses the CSP model. First we have the launch command that takes a procedure invocation and runs it separately. It's easy to take a program that draws an animated ball and transform it into 50 concurrently moving balls, with the simple addition of a loop and a launch statement.

To coordinate between processes, we have channels and their usual operations: send, receive, and select. Those same channels are also used for the GUI library; in my opinion this simplifies GUI programming in many situations. For example to create a program where the user draws lines you could do:

while true:
    receive p1 from mouseClickChannel( )
    receive p2 from mouseClickChannel( )
    drawLine (x of p1, y of p1)-(x of p2, y of p2)
loop

The flow of execution matches the flow of user actions, no need to separate program state, and in larger programs the need for some design patterns is minimized.

Other than concurrency, Kalimat has (explicit) tail-call elimination for any ambitious teacher who wants to go into functional directions, and currently I'm working an a language-hosted PEG parsing, for people who want the children to create e.g NLP user interfaces, text-adventure games, or whatever they fancy. Kalimat is all about teaching thinking, computer science, and the fun of programming.

I did the design of Kalimat on intuition and from memories from my childhood days of programming, but I've recently found out about Piaget's well-know theory of child intellectual development stages. I'm not so sure about this, since I'm far from being a development psychologist, but there might be some fit between Kalimat's primary, abstraction-free, levels and the operational model of early childhood learning. This might be able to explain the exploding success of 80s Basic among children and allow us to take advantage of some of its characteristics.

Kalimat is open source, hosted on http://code.google.com/p/kalimat

It is Arabic-based, but I hope to have an English version for better discussion and experimentation with the global programming education community, if anyone turns to be interested.

I once made a buggy, half complete English release (here's a screenshot of it). I don't want to publicly release it at this stage, but I'd be happy to give it to anyone who requests. My email ID is samy2004 on Gmail.

حزمة معلومات مكثفة عن برنامج د.ابو الفتوح

هذه تجميعة مني لبعض الوسائل التي يمكنك استخدامها (لو كنت مؤيداً لد. ابو الفتوح) في تعريف الآخرين به.

لن اقول حتى تسويق - انا ارى ان برنامجه يسوق نفسه اصلاً - لكن لو يعرف به الناس.

أولاً: المشاريع القومية والخبراء

اكبر مزايا برنامج د. ابو الفتوح انه ليس برنامجه الشخصي بقدر ما هو مشروع مشترك بين عشرات الخبراء والمفكرين. تقديراً لدور هؤلاء الخبراء كان هناك مؤتمر خصيصاً لهم يناقشون مشاريعهم ويعرضوها.

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




(بالمناسبة، لو نفسك تشوف المشاريع كلها، وهي اكثر بكثير من هؤلاء، الفيديو الكامل هنا: http://www.youtube.com/watch?v=pJkqxBYZaTs
)

بعد كدة ده البرنامج الرئاسي كاملاً بصورة PDF (نسخة المناقشة المجتمعية). حتى اسم النسخة يوحي بنوع شخصية المرشح الذي نتحدث عنه http://www.mediafire.com/?bc96l5ysu7dx8f2

دي حتة عاجباني، برضه فيديو لمدة دقائق، عن جزء من البرنامج الانتخابي لحل عجز الموازنة، من الخبير الاقتصادي سامر عطا الله احد خبراء البرنامج: http://www.youtube.com/watch?v=DKpR6DrVgUM

وده ملخص في صفحة واحدة عشان اللي انتباهه قصير او اللي بيقول اشمعنى مرشح الحرية والعدالة عامل كدة :)) 

وهذه الوعود الرئاسية التي قدمها، بناء على التنسيق مع الخبراء الذين معه:

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

الأربعاء، 25 أبريل 2012

شوف اللي ينفعك

كيف اذاكر؟ كيف اقرأ؟ كيف أتعلم؟
هل اعمل في الاكاديميا ام القطاع الخاص؟
هل اتخصص في مجال معين واحترفه، ام اعرف في كل شيء؟

توجد ردود تقليدية على هذه الأمور. مثلاً الرد التقليدي في موضوع المذاكرة يكون شيء مثل الآتي:

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

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

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

إنه التنوع يا سادة

لكن الناصحون ينسون كلمة اسمها diversity. ليس كل الناس يفكرون بنفس الطريقة (ليس لديهم نفس الsoftware على رأي التفكير الحوسبي)، وليست كل البيئات مثل بعضها. القطاع الخاص في Microsoft غير Google غير Makesense. الاكاديميا في MIT غير جامعة النيل. هناك اهداف في الحياة تحتاج لتخصص واهداف يضرها التخصص.

وانا مختلف عن الصورة التي يتوقعها الناس (كفى اتهاماً لي بالاستعلاء، "مختلف" غير "افضل"). ربما جزء من رسالتي في الحياة ان انبه الناس لموضوع الـdiversity هذا.. مهلاً يا أخي وانت تنصح! نصيحتك غالباً لن تنطبق علي! فكر في الظروف قبل ان تتكلم!

حتة نرجسية برمجية

كيف ابرمج؟ حين كنت اعمل في لغة كلمات كانت طريقتي هي اربع ايام من التفكير ويوم من التكويد. اما التفكير فكان يجري في دماغي بينما الف وادور في البيت: لا استخدم UML، لا diagrams، لا شيء. ثم حين اكود يكون الحل شبه محدد في دماغي فاجد الكود تكتب نفسها إلا في مواقف معينة يكون الحل المفترض مخالفاً للواقع العملي؛ وقتها نعود لمرحلة التفكير.

لكن من عدم الحكمة ان اصنع من هذه الطريقة methodology جديدة اسميها اسماً خلاباً - مثلاً طريقة 4+1 ، واسوقها على انها الحل النموذجي للمشاريع البرمجية مثل الـagile وما سبقها..الطريقة ببساطة نفعت معي في مشروع معين. لا يوجد اي سبب علمي لأن اقول انها ستنفع لو تعممت. هي بالتأكيد تنفع مع آخرين، لكن مع الآخرين؟ هذا أمر مختلف.

أين الأساس العلمي لهذه النصائح؟

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

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

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

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

عودة إلى النرجسية

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

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

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

تخصص ام لا تخصص؟

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

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

او تخيل التفكير الحوسبي مثلاً. إن كان هناك عكس لكلمة "تخصص" فهو غالباً هذا.

هل معنى هذا انه لا فائدة من النصح؟

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

بعد كل ما قلته - صدق او لا تصدق - انا مؤمن انه هناك مفاهيم ثابتة يمكن النصح بها :)

مثلاً: اهم نصيحة اقولها لمن يذاكر هي انك لم تذاكر حقاً بمجرد انك شعرت بالفهم؛ لابد من موقف اختبار تتأكد فيه انك فهمت حقاً. لو كانت المادة نظرية فلابد من حل اسئلة والتأكد من انك كتبت الحل الصحيح. لو كانت المادة برمجية فاكتب كود عن الذي درسته ولا تترك الـIDE إلا والكود تعمل بصورة صحيحة. النفس خداعة جداً ولو قلت "انا خلاص فهمت" فـ 99.999% ان هذا ليس صحيحاً.

ايضاً المذاكرة أولاً بأول مهمة. في افضل فترات حياتي دراسياً (الفرقة الاولى بالكلية) كنت لا اترك الاسبوع يمر بدون (1) مذاكرة المحاضرات (2) حل الاسئلة. هذا جعل الحياة سهلة، والمذاكرة ليست هماً. كانت فترة طيبة في الحياة.

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

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

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

الأربعاء، 18 أبريل 2012

ارسطو وصدام والثورة المصرية

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

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

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

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

So first fundamental difference between Plato and Aristotle: the first thinks the difference as inherent to humanity, the second thinks equality. This starting point radiates the rest of their political thought.

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

طب واحنا مالنا؟؟ فكر في هذه المقولات التي قد سمعتها في مصر قبل وبعد الثورة:
  • احنا شعب ابن ^%$#^ ما يلمناش الا الكرباج
  • حانتخب شفيق/عمر سليمان عشان راجل يعرف يلم البلد دي
  • ما ينفعش اتنحى، كدة حاسيب مصر للاخوان
  • الشعب المصري ليس مستعداً للديموقراطية. انها سوف تأتي، لكن متى؟؟؟
  • نطالب المجلس العسكري بإعلان دستوري بضع مباديء فوق دستورية!
  • ينبغي للمرأة من الإخوان أن تفضل الزواج من شخص داخل الجماعة
  • البرادعي خسارة في بلد مثل مصر
  • حازموووون
هل تعرف ما الشيء المشترك بين كل هذه النقاط؟ كل واحدة منهم تقسم مصر إلى فئات اعلى وفئات اقل..وللفئة الأعلى امتيازات عن الاشخاص العاديين.

هل ترى ان مصر لا امل فيها لأن الناس جهلة متخلفون ينساقون وراء الشعارات الدينية؟ هل ترى مؤامرة امريكية لن يخرجنا منها إلا البطل الهمام؟ هل ترى مصر مثل الطفل الذي يتنازع عليه ابواه - مبارك والاخوان - بدون ان يكون له اختيار في مصيره؟

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


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

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

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

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

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

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

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

المشكلة - مرة اخرى - ان هذا النظام لم يقس على فرص متكافئة. ماذا عن الذين ولدوا في غنى فتعلموا افضل تعليم، واخذوا مالاً من ابائهم لكي يفتحوا شركات. وتحملوا بسهولة الخسارة في اول شركتين فتحوهم حتى تعلموا حسن الإدارة؟ هل نقارن هؤلاء مع الذين ولدوا في فقر مدقع؟

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

الثلاثاء، 17 أبريل 2012

قالوا البرمجة صعبة

احيانا اتحدث عن تعليم الاطفال البرمجة فيقولون: اطفال؟؟ برمجة؟؟

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

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


ملخص الطريقة:
  • ارسم الشكل في ورقة مربعات 8×8
  • حول كل صف في الرسمة إلى binary
  • حول الارقام إلى hexadecimal باستخدام الجدول المرفق
  • اصنع string مكون من ثمان حروف، كل حرف له ASCII code يمثلها الرقم الhex
  • حول هذا الstring إلى sprite عن طريق الدالة (..)$sprite
نعم يا سيدي، كان الاطفال في سن 12 سنة - ومنهم كاتب هذه السطور - يرسمون على الشاشة بالاكواد الستعشرية.

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

لا احد يقدرني ابداً :]

لم اكن فلتة. كان هناك الاف الاطفال المبرمجين في الوطن العربي وخارجه. اشتريت مرة مجلة برمجة للاطفال اسمها ميكرو، وكانوا يتحدثون عن ماوس من ماركة معينة في product review..كانت معها بعض البرامج منها...محرر للاشباح..

تقول المجلة: "لقد انتهى عصر رسم الاشكال الشبحية بواسطة الاكواد الستعشرية؛ الآن يمكنك فتح البرنامج والتكتكة بالفارة في النقطة التي تريد الرسم فيها."

إنه التقدم يا سادة! إنه التقدم!

ويقول لك البرمجة صعبة..ركزوا يا جماعة البرمجة مش صعبة ولا حاجة :)

الاثنين، 16 أبريل 2012

محوران واربع اصناف

هناك محوران قد نصنف بها الناس:

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

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

concept-driven مقابل pragmatic: هذه مقابلة بين الشخص الذي يحكم سلوكه مجموعة من المفاهيم لابد وأن يسير عليها. مثلا كلما فعل شيء يسأل "هل تصرفي ديموقراطي" أو "هل تصرفي متفق مع مباديء الرأسمالية" أو"...الاشتراكية"؛ الخ. يقابل ذلك الشخص البراجماتي الذي يسأل "هل هذا سيحقق لي اهدافي؟ هل هذا في عداد الممكن؟".

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

وهذا بيت القصيد من هذا المقال: اني لا ارى تناقضاً بين أن يكون الشخص يسعى للإصلاح والتغيير والوصول لأفضل الحالات، وبين أن يكون عملياً يعرف ما ينبغي عمله وكيف يحصل على ما يريد (بلا تعديات اخلاقية). اريد ان اقول ان ما اسميه idealist و concept-driven هما شيئان لا شيئاً واحداً.

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

فماذا فعل عمرو بن العاص؟ يبدو انه كان بذكاءه المعروف قد خمن محتوى الخطاب؛ فلم يفتحه حتى وصل لداخل الحدود المصرية؛ ثم فتحه.

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

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

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

ثم ننظر للشارع السياسي: بعد انتهاء الثورة بقليل في 2011 كان هناك خلافات كثيرة حول شكل الدستور، شكل الدولة رئاسية ام برلمانية، وخلافات ايديولوجية كثيرة انستنا جانب براجماتي مهم جداً: اعضاء النظام القديم مازالوا يحكمون!

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

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

لكن التخلي عن المفاهيم/الconcepts لابد ان يكون بحساب وحذر..هناك فرق بين "كسر القاعدة في الحالات الخاصة" وبين "تجاهل القاعدة تماما". وقتها سنجد انفسنا نكذب، ونتلاعب، ونفصّل عشرات القوانين لاشخاص معينين بمناسبة وبدون مناسبة...لهذا اكتسبت البراجماتية سمعة سيئة كأنها صفة للمستغلين عديمي الاخلاق بينما هي ليست كذلك.

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

السبت، 14 أبريل 2012

لعبة الطيور السعيدة بواسطة مكتبة g4c

صنعت منذ مدة مكتبة اسمها g4c لبرمجة الالعاب. هذا درس سريع فيها. تحتاج إلى Visual C++ لتجرب ويمكنك تحميل المكتبة نفسها هنا:


سوف نصنع اليوم لعبة happy bird..البعض يحب الطيور الغاضبة لكننا نسمع دائما نصائح على غرار "كن ايجابيا"، "تفاءل" لذلك لن نقلد هؤلاء :)

تجهيز البرنامج


أولاً، خذ نسخة من الdirectory المسمى g4c empty project وسمها بإسم مشروعك. هذه هي الطريقة الرسمية لعمل مشروع جديد.

ثانياً، افتح المشروع (اسمه ينتهي بـ .sln) في الفجوال سي++.

ثالثاً: اذهب إلى مربع solution explorer في يسار الشاشة، أو اختر view -> solution explorer، افتح جزء source files، واختر empty.cpp

سوف تجد دالة main فارغة..سوف تكون هذه برنامجنا بعد قليل.

الرسومات


ارسم طائراً وتفاحة وضعهما في ملفين بإسم bird.bmp و apple.bmp وخزنهما في مكان سهل الوصول اليه مثل c:\img

لاحظ ان الملف يجب ان يكون من نوع BMP وليس أي نوع آخر.لو كانت مواهبك الفنية ضعيفة يمكنك الحصول على الصور من الكود الكاملة الخاصة بهذا المثال.

وضع الشخصيات على الشاشة


يوجد في g4c مفهوم الsprites (الأشكال الطيفية)؛ وهي صور يمكن تحريكها على الشاشة تمثل شخصيات الالعاب (طائرة، كرة، ثائر، ...). يوجد لديك 30 sprite في البرنامج ارقامهم من 0 إلى 29. لتحميل صورة في احدهم تستخدم الدالة load_sprite.
هذه الدالة تأخذ (1) اسم الملف الذي يحتوي الصورة (2) رقم الsprite المطلوب تحميل الصورة فيه.
void main()
{
 load_sprite("c:/img/bird.bmp", 0);
 load_sprite("c:/img/apple.bmp", 1);
}
لكننا لم نرسم هذه الأطياف بعد! لنفعل ذلك نستخدم الدالة put_sprite، وهي تأخذ رقم الشكل الطيفي وقيم x,y الخاصة بالنقطة التي سيوضع فيها. (x من اليسار، y من الأعلى).
void main()
{
 //write your program ;)
 load_sprite("c:/img/bird.bmp", 0);
 load_sprite("c:/img/apple.bmp", 1);

 int x = rand() % 640;
 int y = rand() % 480;

 put_sprite(0, x, y);
 put_sprite(1, 150, 150);
}


هنا اخترنا قيمة عشوائية من صفر إلى 633 للمتغير x (عن طريق عملية mod)، ومثلها للy من 0 إلى 479 (لأن الشاشة دائما 640×480). ثم نادينا put_sprite لنضع الطيف رقم صفر (الطائر) في المكان العشوائي، بينما التفاحة دائما في المكان 150، 150.

تحريك الطائر


لكي نحرك الطائر سنصنع حلقة متكررة كالآتي:

استمر في الآتي:
اقرأ المفتاح
لو المفتاح المضغوط يمين، حرك الطائر لليمين
لو المفتاح المضغوط يسار، حرك الطائر لليسار

لكي نقرأ المفتاح نستخدم الدالة inkey، وهي تعيد -1 لو لم يكن هناك مفتاح مضغوطا لحظة ندائها، أو تعيد كود لو كان زر مضغوط. ما هي الأكواد؟ هي ثوابت في الويندوز (رقم لكل مفتاح) تجدها هنا

حسناً إذاً...
void main()
{
 load_sprite("c:/img/bird.bmp", 0);
 load_sprite("c:/img/apple.bmp", 1);

 int x = rand() % 640;
 int y = rand() % 480;

 put_sprite(0, x, y);
 put_sprite(1, 150, 150);
 while(true)
 {
  int k = inkey();
  switch(k)
  {
  case VK_UP:
   y -= 3;
   break;
  case VK_DOWN:
   y += 3;
   break;
  case VK_LEFT:
   x -= 3;
   break;
  case VK_RIGHT:
   x += 3;
   break;
  }
  put_sprite(0, x, y);
 }
}
الثوابت VK_... هي الأكواد التي حدثتك عنها. لاحظ ان تغيير قيم الx, y لا تكفي! يجب أن آمر البرنامج ان يعيد رسم الطيف في المكان x,y بواسطة الدالة put_sprite

الآن لو قمنا بتشغيل البرنامج يمكننا تحريك الطائر بالأسهم.
التصادم

كيف نعرف ان الطائر وصل للتفاحة؟ هناك دالة في الg4c اسمها register_sprite_proc، هذه تأخذ اسم دالة اخرى (يجب ان تكون موجودة) وتقوم باستدعاها اوتوماتيكيا في حالة تصادم طيفين مع بعضهما.

يعني لو قلت مثلا
register_sprite_proc(myFunc);


فسوف يقوم الg4c - وليس انت - باستدعاء myFunc في حالة أي تلامس لاشكال sprite أثناء تنفيذ البرنامج. لابد لهذه الدالة ان يكون لها مواصفات محددة:
  • Can have any name
  • Return value always of type int
  • Parameters always of types (int, int, void *)
القيمة من نوع * void يمكن تجاهلها، أما الparameters من نوع int, int فهي ارقام الsprites المتصادمة. يعني لو اثناء تشغيل البرنامج تلامس الاطياف 3، 22 فسوف يتم استدعاء هذه الدالة بحيث يكون اول اثنان من الparameters هما [3، 22] أو [22، 3].

لكننا في لعبتنا لن نحتاج لفحص هذه القيم لأنه في حالة تلامس اطياف فليس لدينا اصلا سوى الطائر والتفاحة!
ها هي الكود الجديدة، لاحظ الاجزاء باللون الأحمر!
int myFunc(int s1, int s2, void *)
{
// حنكتب هنا ايه اللي المفروض يحصل لما الطائر يوصل للتفاحة
 return 0;
}

void main()
{
 //write your program ;)
 load_sprite("c:/img/bird.bmp", 0);
 load_sprite("c:/img/apple.bmp", 1);

 register_sprite_proc(myFunc);

 int x = rand() % 640;
 int y = rand() % 480;

 put_sprite(0, x, y);
 put_sprite(1, 150, 150);
 while(true)
 {
  int k = inkey();
  switch(k)
  {
  case VK_UP:
   y -= 3;
   break;
  case VK_DOWN:
   y += 3;
   break;
  case VK_LEFT:
   x -= 3;
   break;
  case VK_RIGHT:
   x += 3;
   break;
  }
  put_sprite(0, x, y);
 }
}
ماذا سيحدث في الدالة myFunc؟ نريد ان نخبر المستخدم انه فاز في اللعبة. لكي نعرض رسالة على الشاشة لابد من استخدام دالة text_out، وهي تأخذ string + مكان x, y الذي سيظهر فيه الكلام. نعدل الدالة myFucn ونترك باقي البرنامج كما هو


int myFunc(int s1, int s2, void *)
{
 text_out("You won!!", 5, 5);
 return 0;
}
ربما تريد أيضاً قراءة دليل الملتمس إلى استخدام الماوس.

الخميس، 12 أبريل 2012

لولا

لولا ام مقتول ابنها
ودولة محتلة
وبنت صغيرة جعانة
وكلاب مش لاقية اللي يلمها
وحرامية بترعى
وشاب بياخذ علقة
ماكنتش عمري اهتم بالسياسة

الأربعاء، 11 أبريل 2012

قطفات من برنامج د.ابو الفتوح [بصورة مبسطة]

الديموقراطية التشاركية

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

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

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

[المرجع: صفحة 13، البرنامج الانتخابي للتحميل من هنا]

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

غير ان كل حاجة كبيرة وصغيرة تبقى بالانتخاب. العمدة، رئيس الجامعة، رئيس الحي. عشان ما يجيش واحد الناس كلها مش طايقاه وهو قاعد على قلبهم. يا يتعدل يا يمشي!

مكافحة الفساد

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

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

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

[المرجع: صفحة 17]

النهضة الاقتصادية

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

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

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

المصريون في الخارج

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

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

ولما نعرف المصريين برة توزيعهم عامل ازاي نقدر نكلم الخبراء والباحثين ونعرف نربطهم مع الجامعات هنا، ونعرف نخليهم يعلموا ولاد البلد ويخترعوا لها.[صفحة 40]

هذه مجرد عينة

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

البرنامج الانتخابي للتحميل من هنا

الثلاثاء، 10 أبريل 2012

الكذب التربوي بين الكبار

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

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

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

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

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

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

يذكرني هذا الكلام بنكتة في "فلاش":

ميدو: ماذا تريد ان تصبح عندما تكبر؟
علام: للاسف مش حيتحقق.
ميدو: ليه؟ بالعزم والاصرار كل شيء ممكن!
علام: يعني ينفع اكون فتاة اعلانات؟؟

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

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

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

لكن الذكاء؟ كيف يجرؤون أن يقولوا هذا!! يا لهؤلاء المتكبرين المعقدين نفسياً الذين يظنون انفسهم افضل من غيرهم، بينما ينبغي ان يظن الجميع ان الفرص متساوية!!

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

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

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

لا يا سادة. لن اكذب انا عليكم. هناك شيء اسمه الحظ، ولكن من يتوقف عن العمل والسعي فهو لا يفقه شيئاً.

فكر في شيء مثل مايكروسوفت: لقد كان للحظ دور كبير في تحولها الى الشركة العملاقة التي نعرفها:
  • وجود Bill Gates في مكتب احد مديري IBM في اللحظة المناسبة ادى لصفقة توزيع DOS مع كل جهاز أي بي ام.
  • نظام DOS نفسه لم يكن موجوداً بعد، لكن مايكروسوفت اشترته من شركة اخرى صغيرة وطورته.
  • مايكروسوفت جاءت في لحظة تحول العالم من الحواسيب العملاقة للكمبيوتر الشخصي، فنمت كشركة بنفس سرعة نمو الكمبيوتر الشخصي.
لكن الحظ لم يكن السبب الوحيد في نجاحهم:
  • بيل جيتس مدمن عمل. يقال انه كان يعمل 20 ساعة في اليوم ويأخذ اجازات قليلة جداً.
  • مايكروسوفت كانوا يحرصون على تعيين افضل المبرمجين واجتذاب افضل الكفاءات، حتى انهم ارسلوا ذات مرة سيارة ليموزين لاستقبال مبرمج وافق على العمل عندهم [هو Anders Hejlsberg المهندس الاساسي وراء دوت نت/لغة سي شارب].
  • مايكروسوفت تفادوا اخطاء كثيرة استراتيجية وقعت فيها الشركات الاخرى.
ما سبب نجاحهم إذاً؟ الحظ ام الشطارة؟ السؤال نفسه - عذراً - ساذج. يذكرنا هذا بالصراعات المزيفة على غرار الصراع بين الرجل والمرأة أو الصراع بين الاجيال...ان الامر كمن يسأل: أيهما أهم للحياة، القلب ام الرئة؟؟ سؤال فلسفي جداً بلا فائدة عملية.

لو كانت ميكروسوفت تدار بغباء لفشلت ولصعدت شركة اخرى مكانها. ولو لم تكن محظوظة فلا احد يعلم مستقبلها، ربما كانت قد صارت شركة قوية لكن ليست عملاقة، او ربما اندثرت، او ربما وجدت فرصة اخرى وصارت عملاقة برضه...او ربما كان ملّها بيل جيتس وعمل في مجال آخر. لا احد يعلم.

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

لكن لن اوهمك ان اي شركة تفتحها لابد ان تكون مثل مايكروسوفت. انت وحظك :)

اما تحرير فلسطين فهو بتدارك عيوبنا ونواقصنا والتغلب عليها، وليس بإنكارها.

الاثنين، 9 أبريل 2012

Where is the casual programming?

I did not learn to program to have a software development job. True story.

I learned it for two reasons: (1) To have an aid for thinking and expressing ideas. What Steve Jobs called "A bicycle for the mind". (2) To automate repetitive tasks. Unfortunately, I don't seem to be doing much of either.

Perhaps some people are doing more than me. The Unix/Linux fans - some of them - write adhoc shell scripts or one-liners to solve casual problems. Perl and Python were created for such tasks. I suppose I could be complaining of a non-problem, except it is a problem. Programming is not casual enough.

The first barrier to casual programming is that you've got to learn too much stuff (too much to call it casual). This is the first and only shell script I wrote:

#!/bin/bash
cp -R Program ProgramCopy
cd ProgramCopy
find . -name bin -exec rm -rf '{}' \;
find . -name obj -exec rm -rf '{}' \;
zip -r ../Program`date +%d%B%y`.zip * -x \*~
cd ..
rm -rf ProgramCopy

It takes a program directory, removes temporary compiler generated files, and puts the code in a zip file with today's date. I made it with by trial, error, and Googling. It made me not want to write shell scripts again; feels too much like piecing together jigsaw puzzles where you first have to know which pieces actually exist.

Would I read a book about shell scripting? Nope. It's too much of a hassle for solving only one bit of the casual programming problem. Wouldn't help me much with writing a quick GUI or Web app to solve the problem, or to pull some data from Excel and write them into a .pdf

So how about Python? It has lots of libraries to do all of that and more. The problem is twofold:
1- The user needs to find the required libraries.
2- The user needs to read the documentation of those libraries.
3- The user usually does this with little less than an editor and an open browser tab.

That's the real problem with dynamic typing: With Java, C# and C++ I learn APIs on the go. I use autocomplete and when in doubt I point to the function invocation and press F1 to read the manual entry about this function. If I feel I need more background information, I follow the links higher in the doc hierarchy and begin learning about the big picture the exact moment I realize I need to learn this stuff.

I always wonder how Lisp and Python fans go along. They actually remember the difference between mapcar, mapcan, mapc...maybe I'm stupid or something.

But with the big three static languages, I have another problem: The IDEs take toooo long to load. If I need to write a utility to rename files in a certain way; I don't think "sure, I'll fire Eclipse, create a new Java project in the workspace, create a new run entry, & write and test the code".

Visual Studio? Qt Creator? the same.

What else? I wish everything had an easy to access API. If I can do it as a user, I want my code to do it. You know those cool hacks where people program small robot cars to bring them coffee? They should be trivial to write. I want to write a utility to, say, extract my old blog posts and find all posts written in Arabic, and tag them with "arabic-posts", and I want it running in a time comparable to what it took to describe it.

func isArabic(str)
...
end
blogger.blog("iamsamy", pw="*****").posts.contents.filter(isArabic).tag("arabic-posts")


You know what? Maybe there's a library that actually does this; but I need to find a "gem" or "egg" or "crate" or whatever to do it. And I need to read the docs. And the library may be out of date. And I'd be writing this in a command line window or an editor without autocomplete. And when I have a different casual, trivial, task, I'll need to do so all again.

Oh man. And I'm a professional and experienced programmer. How about the grocer or pharmacist or school student? We need things to be better!

Ok, we can start with a decent language with excellent library support (or we can develop a new one if we feel we have too much time on our hands). Maybe Rebol or Python or Ruby; they seem to be created by people who like to write code for solving casual problems.

If the language is dynamically typed, we could use some sort of technique to enable auto complete, like type inference or such. Otherwise use a fun but statically typed language, maybe C#.

Now we need an IDE that
  • Loads fast
  • Has very tight integration with a library repository, with a catalog of only the best libraries, easily searchable. I should type "blogger", find at most one or two working options, and press "add". I should be able to see the documentation before pressing add.
  • The documentation should have working examples for the top 10 casual tasks usually done with this library. If I'm lucky I'd press "copy this example", "run", and be done.
  • The IDE should have little cues in the code, like allowing me to select a directory from a dialog then use it as a file name in the File object's constructor, or choose a URL from my current browser tabs...etc
  • There should also be some form of API discoverability. I should search for "convert jpg" and find a class to do the task, even if the name doesn't neccessarily include "convert" or "jpg".
  • There should be a trivial to use GUI kit - like say Shoes - and a similar web kit.
I could go on and on....

الأحد، 8 أبريل 2012

الاستقرار مش جاي من عمر سليمان

بيقولوا ان اللي ماعندوش ولاد ولا مسؤولية هو اللي مش حينتخب عمر سليمان.

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

انت فكرك الثورة حتقف لو عمر سليمان والا شفيق مسكوا؟ دي حتولع عشر مرات. الاستقرار ما بيجيش من القسوة، الاستقرار بييجي من العدل.

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

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

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

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

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

وحيحارب الفقر ليه؟ هو لولا الفقر كان عرف يشتري الاصوات؟ كل ما الفقر زاد كل ما الناس باعت كرامتها. ده شكل البلد اللي هو عايزه طبعاً.

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

الجمعة، 6 أبريل 2012

انزلوا الشارع مستنيين ايه؟

هناك سلاح فتاك يستخدمه الثوريون: اظهار عدم منطقية الطرف المخطيء في بوست ساخر على تويتر.

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

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

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

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

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

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

الخميس، 5 أبريل 2012

ثلاث قصص قصيرة بطولة "شلبي فوقوا يا بشر"

= 1 =
شلبي: انتي لسة بتلبسي النقاب وامريكا طلعوا القمر؟؟

الفتاة: هو الخريطة الفلكية مكتوبة على وشي مثلاً؟

شلبي: ليه لاغية تفكيرك؟ ليه بتتبعي الدوجماتية؟ ليه بتردي ردود غير عقلانية؟؟
مش حتفوقوا بقى يا بشر؟؟؟؟؟؟؟؟؟

= 2 =
شلبي: كل المرشحين زبالة. مافيش حد عدل. كلهم طمعانين في المنصب

الصديق: ليه بتقول كدة؟ هل فحصت كل واحد وبرنامجه؟

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

= 3 =
شلبي: البلد دي مش حتتصلح. مافيش فيها امل. الناس جهلة وحيقاوموا اي محاولة للتغيير.

الصديق: ليه؟ مش فيه ناس بيصلحوا؟ مش فيه ناس بيطوروا العلم؟ مش فيه مؤسسات وجمعيات اهلية؟

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

الصديق: عندك ابحاث مثلاً او دراسات عن الكلام ده؟

شلبي: ايوة، امريكا طلعوا القمر وانتو مش حتفوقوا يا بشر.

الثلاثاء، 3 أبريل 2012

تجربة: لغة برمجة غير مألوفة سهلة التعلم

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

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

حسناً..اولا سيكون امر التخصيص في صورة ->، بدلا من علامة =، لتحديد اتجاه ذهاب البيانات. أيضاً سيتم تبديل الاتجاهات

س -> ص معناها "ضع س في ص".

ايضاً لن يكون هناك امر اقرأ ولا اطبع، لكن سيكون هناك كائنات Objects تعبر عن الشاشة، لوحة المفاتيح،...الخ

"مرحبا" -> الشاشة
المفاتيح -> س
الماوس ->(س1، ص1)
الماوس ->(س2، ص2)
ارسم.خط (س1،ص1)-(س2،ص2)

هل لاحظت (س1،ص1)؟ هذا لأن اللغة ستدعم تجميعات من القيم tuples. بالمناسبة هكذا تكون عملية التبديل مثلاً سهلة جداً:
(أ، ب) -> (ب، أ)

"خلي أ تبقى ب، وب تبقى أ"

لو أردت ان تكون اللغة object oriented جداً فيمكنني اصلا ان ارسل قيماً كما اريد للشاشة وما شابه..

خ = خط(100، 100، 200، 200)
د = دائرة(100، 100، 75)
خ -> الشاشة
د -> الشاشة

هذه الطريقة تجعل امور معينة سهلة جداً..ماذا لو اردت برنامج يرسم خطوطا باستمرار؟

كرر:
خط(الماوس، الماوس) -> الشاشة
تابع

حسناً....كفانا لعباً بالمعامل ->، ماذا نفعل أيضا؟؟

تعال نصنع طريقة بسيطة لعمل الدوال:

مجموع(أ، ب) = أ + ب.

وطريقة لتعريف الاجراءات:

حرك(أ، بداية، نهاية) =
ارسم(أ، بداية)
انتظر(30)
ارسم(أ، نهاية).

تبدو اللغة نوعاً ما مثل لغة prolog..أليس كذلك؟

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

نوع شخص(اسم، سن، عنوان).

شخص(اسم: "حمدي"، سن: 12، عنوان: "الجيزة") -> ح
اسم ح -> الشاشة

ماذا عن الOOP؟ سوف نعرف كل الmethods كأنها رسائل للانواع المختلفة بكلمة في اللغة اسمها معنى

معنى شخص(أ، ب، ج) -> الشاشة =
("هذا شخص اسمه "، أ، "وسنه "، ب) -> الشاشة.

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

هل هذه اللغة ابسط فعلاً أم هي فقط ازالت بعض الصعوبات ووضعت مكانها صعوبات جديدة؟ ماذا عن سطر مثل خط(الماوس، الماوس) -> الشاشة هل هة مفهوم؟ وهل هذه طريقة جيدة للبرمجة اصلاً؟

يحتاج الامر لتجربة. ما رأيك أن تنفذ انت هذه اللغة وتجرب على اطفال؟

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

الاثنين، 2 أبريل 2012

إنما هي صورة كلية

ومعنى قاطيغورياس باليونانية، يقع على المقولات. والمقولات عشر، وتسمى: القاطاغوريات.

(من "مفاتيح العلوم" للخوارزمي)

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

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

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

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

الشرق لا يهتم بكل جزئية على حدى. بل بالكل مع بعضه.

حين تأتي لغات البرمجة من الغرب تجدها - الا قليلاً - جافة ومليئة بأشياء عجيبة مثل static, void, x++, protected

بينما اللغات من الشرق تأتي مثل Ruby، يقول مبرمجها انه اراد لغة يستمتع الناس وهم يبرمجون بها. ياللهول! بينما الجميع يتحدث عن الperformance، maintainability نجد شخصاً يتحدث عن حالة المبرمج النفسية! الا ينبغي ان يسخر المبرمجون - هذه الكائنات العقلانية - من سفاهته؟ ومع ذلك فهي اللغة الناجحة التي تكتب لها الكتب وتعقد لها المؤتمرات.
5.times { print "hello" } if x == 5

كذلك لغة كلمات لو لم تلاحظ..لا اقصد الكتب والمؤتمرات (هذه لعلها آتية) بل الاهتمام بالحس البشري والشكل الجمالي.

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

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

لقد صارت فكرة "الكلية" جزء من فلسفة العلم نفسه. نظرية dual nature of electron التي تجمع بين نظريتين عن طبيعة الالكترون. فكرة ان المادة والطاقة شيء واحد بصور مختلفة (معادلة آينشتين الشهيرة). حتى المنطق: لم يعد يكفي دائماً الحد الفاصل بين "صواب" و"خطأ" بل صار هناك تطبيقات تحتاج مستويات بين ذلك (مثلاً fuzzy logic). إن الامور تتغير.

حين تقدم نظرية علمية، حاول ان تفكر في صياغتها والفهم البشري لها، وليس فقط الدقة والشمول.

حين تقدم مواد تعليمية، لا تجعلها مواد جافة صماء، ولا تجعلها مجرد صور جميلة، ولا تجعلها مواد جافة صماء معها صور جميلة..بل اجعل الجمال والعلم ممتزجان...

هذه فكرة الكلية: انها ليست ان اجمع "أ" مع "ب"، وإنما ان اجعل "أ" و "ب" كل منهما يغذي الآخر ويعتمد عليه.

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

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

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

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