تدوينة اليوم ستكون طويلة و الصراحة لا أدري من أين سأبدئها، و عموما سأتطرق فيها إلى البرمجة. حسننا اعتقد أنني سأبدأ بالحديث عن منصة جنو/لينوكس كأفضل منصة برمجية.
في الفترة الاخيرة إستخدمت منصة ويندوز Windows و منصة Mac OS X بشكل مطول للقيام ببعض الأعمال البرمجية، و تلك كانت المناسبة للنظر إليهما من جديد من منظور مبرمج. لن أدعي أن هتين المنصتين لا يصلحن لشيء و أنهما من شركتين احتكاريتين ووو (كما يتصور بعض المتعصبون)، بل بالعكس الأدوات المتاحة على هتين المنصتين جذابة و متميزة و يكفي أن أغلب البرامج المسوقة موجهة لهتين المنصتين، لكن ثم لكن :) لم أنجذب إليهما و لم أشعر بنفس الغنى البرمجي الذي تتيحه منصة جنو/لينوكس و في النهاية زاد إحساسي بالسعادة لأنني اخترت الإنتقال إلى منصة جنو/لينوكس يوما. نعم يمكنني القول بان منصة جنو/لينوكس هي أفضل منصة برمجية لكن لا ينطبق نفس الأمر بالنسبة للإستخدام المكتبي اليومي، ليس لأنها تعاني من خصاص ما بل لأنها ستدفعك و أحيانا ستفرض عليك تعلم أشياء جديدة أنت (من منظورك كمستخدم) في غنى عنها و هدا ما لا يقبله البعض ممن يحملون شعار "لا تجعلني أفكر!" أو "don't make me think!"
قبل أن انتقل إلى نقطة أخرى لذي ملاحظتين: الاولى ويندوز7 أفضل بكثير من Vista و أفضل من XP. و الثانية محرر Eclipse أفضل من TextMate و يعوضه في كل شيء بالنسبة لمستخدمي Mac OS X. و الملاحظة الثالثة :) خط monaco يناسب البرمجة للوضوح معالم حروفه.
الآن لندخل إلى صلب التدوينة، سبق و أن كتبت تدوينة بخصوص لغة البرمجة سكالا Scala و محاولتي لإستكشافها، اليوم سأكتب عن إطلالتي الثانية عليها مستخدما مكتبة QtJambi الرسومية. للتذكير فقط مكتبة QtJambi تحاول تقديم مكتبة كيوت Qt لمستخدمي لغة الجافا Java و اللغات المبنية على هده الاخيرة. مع الأسف أعلنت شركت Qt (نوكيا Nokia حاليا) عن توقفها عن تطوير المشروع بعد إصداره 4.5.2 و أخرجته إلى المجتمع الحر حتى يتابع تطويره. لذلك فإن مستقبل QtJambi يتعلق بمدى نشاط مجتمعه. و يمنكن تحميله من موقع qt.nokia.com/downloads
كما تعودنا من Qt يحظى QtJambi بتوثيق جيد يمكن الإطلاع عليه هنا و هنا. كما يمكن الحصول على شرح إضافي من هنا و هنا إدا كنت عازما على تجربته.
كل، ما أردت أن أقوم به هو ربط Scala بـ QtJambi و كتابة مثال بسيط. لم تأخذ العملية الوقت الكثير و كانت النتيجة كما يلي:
المثال يقوم بعرض نافذة بها حقلين لإدخال إسم المستخدم و زرين واحد للخروج من البرنامج و الثاني يعرض رسالة بعد التحقق من أن كلى الحقلين ليس فارغا.
بعد إنتهائي من كتابة بعض الأمثلة توقفت لحظة لأفكر هل سأخصص لسكالا بعض الوقت لتعلمها؟ ربما نعم ربما لا، لا أرها كلغتي البرمجية اليومية، ربما لأنه ليست لي أصول جافوية :) رغم رغبتي للإنتقال إليها مند أواخر التسعينيات. كل مرة أبدأ بتعلمها أتركها بعد دقائق، كتابة أي شيء بسيط في جافا يأخد عدد لا متناهي من الأسطر :) و كل سطر تقريبا عليه أن ينتهي بتلك النقطة الفاصلة (;) البئيسة، ألم نكتفي بـ Pascal، C و C++ ؟ :) . هذه النقطة يدركها البعض (خصوصا عند المقارنة مع اللغات الحديثة) لكن ليس باليد حيلة لأن جافا منتشرة في كل مكان و التطبيقات المصممة بها تستخدم داخل الشركات بشكل كبير لدلك الإنتقال إلى لغة أخرى عند البعض لا يعتبر إختيارا، برمجة التطبيقات و المكتبات تتطلب وقت و مجهود و تكلف الكثير. بالإضافة إلى ذالك فإن الآلة اللإفتراضية لجافا JVM في غاية القوة و الكفاءة و قد أثبتت نفسها بكل جدارة و هذا ما دفع البعض إلى تطوير لغات جديدة كـ سكالا Scala أو إعادة كتابة لغات برمجية موجودة كـ JRuby و Jython بإستخدامها و الإعتماد عليها. في الواقع هذا هو ما يميز Scala لأنها متوافقة تماما مع Java و في نفس الوقت تقدم العديد من ميزات و خصائص اللغات البرمجية الحديثة و الديناميكية. كما أن توثيقها جيد و تشهد تزايد مستمر للإستخدام داخل الشركات. بالإختصار إن كنت من مبرمجي java عليك بإستخدامها، أعدك أنك لن تندم :)
الآن لما لا أجرب JRuby و Jython مع QtJambi؟ نعم هنالك ربط (bindings) بين Python و Qt من خلال PyQt4، و هنالك ربط بين Ruby و Qt من خلال Qt4-QtRuby، لكن إستخدام هدا الأخير (Qt4-QtRuby) على منصة ويندوز رديء للغاية و لا يوجد للحظة أي تطبيق جاهز لتثبيت الإصدار المتوافق مع Ruby 1.9.1 و Qt 4.5 على منصة ويندوز، كما لن تصدقوا كم خصصت من الوقت و المجهود لإعداد نسخة قابلة للتثبيت دون الوصول إلى أية نتيجة. (إن كان أحدكم عازم على إعداد نسخة تقبل التثبيت أنا مستعد للمساعدة)
بالنسبة ل JRuby كنت أكثر من سعيد لخوض التجربة مع QtJambi، لأن لغة روبي ممتعة للغاية و تعتمد على مبدأ "إن كان شكلها كبطة و تمشي كبطة فهي إدن بطة" :) هذا ما يعرف بـ Duck typing.
المحاولة الأولى كانت كالتالي:
هدا المثال أبسط من مثال scala فهو يعرض نافدة بزرين الأول للخروج من البرنامج و الأخر يعرض رسالة، لكن هدا الأخير لم أجد سبيلا لجعله يعمل لأن QtJambi لا يستطيع رؤية الدالة عندما يريد تشغيل الكود المتعلق بالحدث في Slot "clicked()". الحل كان من خلال إستخدام gem (مكتبة) تدعى qtjruby-core. و بعد ذلك قمت بتعديل الكود فأسبح كما يلي:
توثيق Ruby و توثيق JRuby ممتاز، يكفي البحث قليلا على الشبكة لتجد موارد لا حصر لها على سبيل المثال كتاب JRuby Cookbook.
لماذا تتعلم JRuby؟ لأن روبي مغنية أقصد لغة :) جدابة، ممتعة و قوية و في نفس الوقت يمنكن ربطها بمكتبات الجافا. لن تكلفك التجربة و لا تعلم روبي أي شيء و ستستفيد الكثير. أعدك بدالك.
الآن حان وقت Jython، نفس المثال الذي كتبته بـ JRuby أعدت صياغته بـ Jython. و أيضا نفس المشكلة مع slots. و رغم وجود مشروع QtJambi Jython bindings لم أصل إلى أية نتيجة إلا بعد التواصل مع صديق جديد إسمه Olli Wang مدني بتعديلاته على إمتدادات Jython Extensions for QtJambi. التعديلات موجود بالملف المرفق هنا و هي مرخصة تحت رخصة GPL.
الكود المصدري كان كتالي:
من خلال هذه التجربة البسيطة مع QtJambi, Scala, JRuby و Jython يتضح جليا ما يلي:
أنك دائما رابح مع إختيارك للغات البرمجية المفتوحة المصدر.
يسهل عليك إستغلال مهاراتك السابقة لتطوير الأخرى و إستخدامها في أكثر من مجال.
يسهل إستغلال الآلة الإفتراضية لجافا JVM للوصول إلى الإستفادة من اللغات البرمجية الحديثة كروبي، بايثون وسكالا.
يسهل إستغلال لغة روبي و بايثون مع مكتبات جافا.
هذه هي القوة الحقيقية لفكرة البرمجيات الحرة و المصادر المفتوحة، فهي تسهل إنتقال الخبرات و تبادل موارد.
و رغم ذلك قد يتساءل البعض لما كل هذا؟ لماذا تتعلم أو تجرب لغات برمجية مختلفة ما دامت التحاليل البرمجية و الخورزميات هي نفسها أو مشابهة مع بعضها مهما إختلفت اللغات؟
الجواب بالإختصار هو أن لكل لغة برمجية ما يميزها و أحيانا هذه الميزات ترفع من منظورك البرمجي و تجعلك تفكر بشكل مختلف و هدا ينعكس على مستواك البرمجي بشكل عام.
في آخر اليوم وجدت نفسي أكتب مثال لبرنامج بلغة بايثون على منصة جايثون و يستخدم الأدوات الرسومية للوجهات بـ Swing
في الفترة الاخيرة إستخدمت منصة ويندوز Windows و منصة Mac OS X بشكل مطول للقيام ببعض الأعمال البرمجية، و تلك كانت المناسبة للنظر إليهما من جديد من منظور مبرمج. لن أدعي أن هتين المنصتين لا يصلحن لشيء و أنهما من شركتين احتكاريتين ووو (كما يتصور بعض المتعصبون)، بل بالعكس الأدوات المتاحة على هتين المنصتين جذابة و متميزة و يكفي أن أغلب البرامج المسوقة موجهة لهتين المنصتين، لكن ثم لكن :) لم أنجذب إليهما و لم أشعر بنفس الغنى البرمجي الذي تتيحه منصة جنو/لينوكس و في النهاية زاد إحساسي بالسعادة لأنني اخترت الإنتقال إلى منصة جنو/لينوكس يوما. نعم يمكنني القول بان منصة جنو/لينوكس هي أفضل منصة برمجية لكن لا ينطبق نفس الأمر بالنسبة للإستخدام المكتبي اليومي، ليس لأنها تعاني من خصاص ما بل لأنها ستدفعك و أحيانا ستفرض عليك تعلم أشياء جديدة أنت (من منظورك كمستخدم) في غنى عنها و هدا ما لا يقبله البعض ممن يحملون شعار "لا تجعلني أفكر!" أو "don't make me think!"
قبل أن انتقل إلى نقطة أخرى لذي ملاحظتين: الاولى ويندوز7 أفضل بكثير من Vista و أفضل من XP. و الثانية محرر Eclipse أفضل من TextMate و يعوضه في كل شيء بالنسبة لمستخدمي Mac OS X. و الملاحظة الثالثة :) خط monaco يناسب البرمجة للوضوح معالم حروفه.
الآن لندخل إلى صلب التدوينة، سبق و أن كتبت تدوينة بخصوص لغة البرمجة سكالا Scala و محاولتي لإستكشافها، اليوم سأكتب عن إطلالتي الثانية عليها مستخدما مكتبة QtJambi الرسومية. للتذكير فقط مكتبة QtJambi تحاول تقديم مكتبة كيوت Qt لمستخدمي لغة الجافا Java و اللغات المبنية على هده الاخيرة. مع الأسف أعلنت شركت Qt (نوكيا Nokia حاليا) عن توقفها عن تطوير المشروع بعد إصداره 4.5.2 و أخرجته إلى المجتمع الحر حتى يتابع تطويره. لذلك فإن مستقبل QtJambi يتعلق بمدى نشاط مجتمعه. و يمنكن تحميله من موقع qt.nokia.com/downloads
كما تعودنا من Qt يحظى QtJambi بتوثيق جيد يمكن الإطلاع عليه هنا و هنا. كما يمكن الحصول على شرح إضافي من هنا و هنا إدا كنت عازما على تجربته.
كل، ما أردت أن أقوم به هو ربط Scala بـ QtJambi و كتابة مثال بسيط. لم تأخذ العملية الوقت الكثير و كانت النتيجة كما يلي:
المثال يقوم بعرض نافذة بها حقلين لإدخال إسم المستخدم و زرين واحد للخروج من البرنامج و الثاني يعرض رسالة بعد التحقق من أن كلى الحقلين ليس فارغا.
بعد إنتهائي من كتابة بعض الأمثلة توقفت لحظة لأفكر هل سأخصص لسكالا بعض الوقت لتعلمها؟ ربما نعم ربما لا، لا أرها كلغتي البرمجية اليومية، ربما لأنه ليست لي أصول جافوية :) رغم رغبتي للإنتقال إليها مند أواخر التسعينيات. كل مرة أبدأ بتعلمها أتركها بعد دقائق، كتابة أي شيء بسيط في جافا يأخد عدد لا متناهي من الأسطر :) و كل سطر تقريبا عليه أن ينتهي بتلك النقطة الفاصلة (;) البئيسة، ألم نكتفي بـ Pascal، C و C++ ؟ :) . هذه النقطة يدركها البعض (خصوصا عند المقارنة مع اللغات الحديثة) لكن ليس باليد حيلة لأن جافا منتشرة في كل مكان و التطبيقات المصممة بها تستخدم داخل الشركات بشكل كبير لدلك الإنتقال إلى لغة أخرى عند البعض لا يعتبر إختيارا، برمجة التطبيقات و المكتبات تتطلب وقت و مجهود و تكلف الكثير. بالإضافة إلى ذالك فإن الآلة اللإفتراضية لجافا JVM في غاية القوة و الكفاءة و قد أثبتت نفسها بكل جدارة و هذا ما دفع البعض إلى تطوير لغات جديدة كـ سكالا Scala أو إعادة كتابة لغات برمجية موجودة كـ JRuby و Jython بإستخدامها و الإعتماد عليها. في الواقع هذا هو ما يميز Scala لأنها متوافقة تماما مع Java و في نفس الوقت تقدم العديد من ميزات و خصائص اللغات البرمجية الحديثة و الديناميكية. كما أن توثيقها جيد و تشهد تزايد مستمر للإستخدام داخل الشركات. بالإختصار إن كنت من مبرمجي java عليك بإستخدامها، أعدك أنك لن تندم :)
الآن لما لا أجرب JRuby و Jython مع QtJambi؟ نعم هنالك ربط (bindings) بين Python و Qt من خلال PyQt4، و هنالك ربط بين Ruby و Qt من خلال Qt4-QtRuby، لكن إستخدام هدا الأخير (Qt4-QtRuby) على منصة ويندوز رديء للغاية و لا يوجد للحظة أي تطبيق جاهز لتثبيت الإصدار المتوافق مع Ruby 1.9.1 و Qt 4.5 على منصة ويندوز، كما لن تصدقوا كم خصصت من الوقت و المجهود لإعداد نسخة قابلة للتثبيت دون الوصول إلى أية نتيجة. (إن كان أحدكم عازم على إعداد نسخة تقبل التثبيت أنا مستعد للمساعدة)
بالنسبة ل JRuby كنت أكثر من سعيد لخوض التجربة مع QtJambi، لأن لغة روبي ممتعة للغاية و تعتمد على مبدأ "إن كان شكلها كبطة و تمشي كبطة فهي إدن بطة" :) هذا ما يعرف بـ Duck typing.
المحاولة الأولى كانت كالتالي:
هدا المثال أبسط من مثال scala فهو يعرض نافدة بزرين الأول للخروج من البرنامج و الأخر يعرض رسالة، لكن هدا الأخير لم أجد سبيلا لجعله يعمل لأن QtJambi لا يستطيع رؤية الدالة عندما يريد تشغيل الكود المتعلق بالحدث في Slot "clicked()". الحل كان من خلال إستخدام gem (مكتبة) تدعى qtjruby-core. و بعد ذلك قمت بتعديل الكود فأسبح كما يلي:
توثيق Ruby و توثيق JRuby ممتاز، يكفي البحث قليلا على الشبكة لتجد موارد لا حصر لها على سبيل المثال كتاب JRuby Cookbook.
لماذا تتعلم JRuby؟ لأن روبي مغنية أقصد لغة :) جدابة، ممتعة و قوية و في نفس الوقت يمنكن ربطها بمكتبات الجافا. لن تكلفك التجربة و لا تعلم روبي أي شيء و ستستفيد الكثير. أعدك بدالك.
الآن حان وقت Jython، نفس المثال الذي كتبته بـ JRuby أعدت صياغته بـ Jython. و أيضا نفس المشكلة مع slots. و رغم وجود مشروع QtJambi Jython bindings لم أصل إلى أية نتيجة إلا بعد التواصل مع صديق جديد إسمه Olli Wang مدني بتعديلاته على إمتدادات Jython Extensions for QtJambi. التعديلات موجود بالملف المرفق هنا و هي مرخصة تحت رخصة GPL.
الكود المصدري كان كتالي:
من خلال هذه التجربة البسيطة مع QtJambi, Scala, JRuby و Jython يتضح جليا ما يلي:
أنك دائما رابح مع إختيارك للغات البرمجية المفتوحة المصدر.
يسهل عليك إستغلال مهاراتك السابقة لتطوير الأخرى و إستخدامها في أكثر من مجال.
يسهل إستغلال الآلة الإفتراضية لجافا JVM للوصول إلى الإستفادة من اللغات البرمجية الحديثة كروبي، بايثون وسكالا.
يسهل إستغلال لغة روبي و بايثون مع مكتبات جافا.
هذه هي القوة الحقيقية لفكرة البرمجيات الحرة و المصادر المفتوحة، فهي تسهل إنتقال الخبرات و تبادل موارد.
و رغم ذلك قد يتساءل البعض لما كل هذا؟ لماذا تتعلم أو تجرب لغات برمجية مختلفة ما دامت التحاليل البرمجية و الخورزميات هي نفسها أو مشابهة مع بعضها مهما إختلفت اللغات؟
الجواب بالإختصار هو أن لكل لغة برمجية ما يميزها و أحيانا هذه الميزات ترفع من منظورك البرمجي و تجعلك تفكر بشكل مختلف و هدا ينعكس على مستواك البرمجي بشكل عام.
في آخر اليوم وجدت نفسي أكتب مثال لبرنامج بلغة بايثون على منصة جايثون و يستخدم الأدوات الرسومية للوجهات بـ Swing
ليست هناك تعليقات:
إرسال تعليق