السبت، 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). إن الامور تتغير.

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

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

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

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

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

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

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