يناير 30، 2009

سلسلة البرمجة الرسومية بواسطة باي كيوت PyQt4 للمبتدئين 02

في أول تدوينة قمنا بإنشاء الواجهة الرسومية لآلتنا الحاسبة بإستخدام Qt Designer (مصمم الواجهات لـ كيوت) ثم قمنا بحفضها تحت إسم PyCalc.ui

إن قمت بفتح ملف الواجهة بواسطة notepad مثلا سترى أن الواجهة حفظت على شكل نصي تراتبي.

لإستخدام تلك الواجهة مع بايثون هنالك طريقتين على حد علمي:
1. القيام بعملية تحويل (compiling) لملف الواجهة حتى يصبح قابل للإستخدام مع بايثون.
2. إستخدام و ربط ملف الواجهة بطريقة ديناميكية. و أنا سأستخدم هذه الأخيرة للمرونتها.

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

أولا، خصص مجلد خاص بالعمل تضع فيه ملف PyCalc.ui و باقي الملفات التي سنظيفها لحقا داخله.

ثانيا يجب أن تنتبه إلى الطريقة التي كتبت بها الشفرة المصدرية Source Code خصوصا الفرق بين الحروف الصغيرة و الكبيرة (q ليست Q) و الفرق بين النقطة (.) و الفاصلة (,)
أيضا يجب عليك أن تفهم أن بايثون يستخدم مفتاح (tab) للتمييز بين أجزاء الشفرة على عكس اللغات الأخرى التي قد تستخدم {} أو begin و end


من هنا تبدأ الرحلة (لا تنسى أن تضع قطعة شوكلاتة في فمك قبل أن تبدأ) :)

سيكون هذفنا هو ربط واجهة الآلة الحاسبة مع بايثون و إظهارها للمستخدم.

1. قم بتشغيل محرر IDLE الذي تم تثبيته مع بايثون و قم بتحرير ملف جديد File->New Window

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

سنحتاج في هذه المرحلة إلى وحدة sys و PyQt4 (لاحظ الفرق في الكتابة بين الحروف الصغيرة و الكبيرة)

من أجل ذلك سنقوم بعملية الإستراد لهذه الوحدات بواسطة

import sys
from PyQt4 import QtCore, QtGui, uic


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

نعم، هذه الطريقة موجودة و تسمى بالأقسام بحيث نعتبر برنامجنا كقسم يمكن إستخدامه في برانامج آخر، و الذي قد يصبح قسم في برنامج آخر ذات يوم. هذا النوع من البرمجة يسمى بالبرمجة الموجهة نحو أو المعتمدة على الكائنات (Object-Oriented Programming) أو (OOP)

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

ستكون الشفرة المصدرية كما يلي:
class CalcApp(QtGui.QDialog):
    def __init__(self, *args):
        QtGui.QWidget.__init__(self, *args)
        uic.loadUi("PyCalc.ui", self)

بحيث نعتبر أن برنامج الآلة الحاسبة سيكون قسم تحت إسم CalcApp (السطر 1) و الذي سيقوم بتحميل ملف الواجهة الرسومية PyCalc.ui (السطر 4) فور تشغيل القسم. بالنسبة للسطر 2 و 3 يمكن إعتبارها صالحة للإستعداد المبدئي لعرض الواجهة و تهيئة البرنامج لذلك.

غير أن قسم CalcApp لا يعمل من تلقاء نفسه بل يحتاج لمن يستدعيه حتى يعمل و هذا ما سنراه بعد قليل.

إذا قلنا أنه يتم الإستعداد للتهيئة و بدأ برنامج أو قسم ما، فهنا يمكن أن نفهم أنه يجب تحديد إسم القسم الذي نريد أن نهيئه. فماذا إن كنا نريد أن نهيئ نفس القسم الذي نعمل عليه؟ هنا نستخدم كلمة self للتعبير عن القسم الذي نعمل عليه، بحيث يغنينا هذا عن ذكر الإسم كل مرة و نكتفي بدكر self=نفسك.

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

كما سبق و أن أشرنا أنه من الممكن أن يحتوي قسم على قسم أخر عندما قدمنا مثال برنامج المحاسبة الذي يستخدم الآلة الحاسبة لإجراء عملية حسابية ما. فكيف ننادي على قسم الآلة الحاسبة لإجراء حساب معين و نحن نعمل أو متواجدين في برنامج المحاسبة؟ للقيام بدلك نستخدم رمز (.) النقطة للفصل بين الأقسام مثل QtGui.QWidget.__init__ بحيث نستدعي __init__ التي تتواجد بقسم QWidget الذي بدوره يتواجد بقسم QtGui

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

app = QtGui.QApplication(sys.argv)

widget = CalcApp()
widget.show()

sys.exit(app.exec_())


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

سيكون شكل الشفرة المصدرية عند الإنتهاء على هذا الشكل:

import sys
from PyQt4 import QtCore, QtGui, uic

class CalcApp(QtGui.QDialog):
    def __init__(self, *args):
        QtGui.QWidget.__init__(self, *args)
        uic.loadUi("PyCalc.ui", self)


app = QtGui.QApplication(sys.argv)

widget = CalcApp()
widget.show()

sys.exit(app.exec_())

قم بحفظه تحت إسم PyCalc.py ثم قم بتشغيله من خلال قائمة run->run module أو بالضغط مباشرة على مفتاح F5.
بالتوفيق :)

يناير 23، 2009

سلسلة البرمجة الرسومية بواسطة باي كيوت PyQt4 للمبتدئين

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

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

إن كنت من مستخدمي جنو/لينوكس إستخدم مدير الحزم لتثبيت PyQt ، Qt، و محرر IDLE، أما بالنسبة لبايثون فأغلب الظن أنه مثبت مسبقا.

و إن كنت من مستخدمي ويندوز فقم بتحمل بايثون من هنا و باي كيوت من هنا.

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

هنالك ملاحظة بسيطة و هي أن بايثون 2.6 و مكتبة PyQt المتوافقة معها يحصلان على تحديثات تصحيحية دورية بإستمرار لذلك إن أصبح رابط التحميل لا يعمل يكفي أن تزور صفحة التحميل لكل من بايثون و باي كيوت و تقوم بتحميلهما.

بعد التحميل، قم بتثبيت بايثون أولا ثم باي كيوت ثانيا.

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

1. بعد الإنتهاء من التثبيت قم بتشغيل Qt Designer و اختر إنشاء Dialog without Buttons، بعدها ستحصل على واجهة رسومية فارغة.


2. قم بسحب Line Edit فوق الواجهة، ثم قم بتغير خاصية الإسم objectName إلى value1 من خلال شريط/نافدة Property Editor كما في الصورة.

ملاحظة سريعة: Line Edit و كل الأشكال المتواجدة فوق Qt Designer تسمى في معجم المبرمجين بالكائنات أو كائن، و في باي كيوت تحديدا يسمى ب وِيجِدْ (Widget). لتسهيل هذه التدوينة سنسمي هذه الأشكال بالكائنات الرسومية.


3. الآن سنضيف كائنين رسوميين من نوع Line Edit على الواجهة، تماما مثلما في الصورة. ثم نسمي الثاني ب value2 في خاصية objectName و الثالث ب valresult في objectName كذلك.


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

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


5. الآن لا نرى مكتوبا إلى TextLabel و هذا ليفيد المستخدم بشيء. علينا كتابة نص دو معنى. لفعل ذلك قم بتغير خاصية text من شريط/نافدة Property Editor. النص الأول سيكون First Value و الثاني Second Value و الثالث Result، تماما كما في الصورة.


6. حان الوقت لإضافة الأزرار. قم سحب الكائن الرسومي Push Button على الواجهة. ثم قم بتغير إسمه من خلال خاصية objectName إلى c0. ثم بعد ذلك تغيير النص الذي يظهر للمستخدم من خلال خاصية text تماما كما في الصورة.


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

7. ستكرر نفس العملية بالنسبة لباقي الأزرار التسع. حيث ستضيف الزر، ثم تغير إسم الكائن إلى c1, c2 و هكذا، ثم تغير نص كل زر إلى الرقم الذي يعبر عنه مثلا c1 مع 1 و c2 مع 2 و هكذا. ستكون النتيجة كما في الصورة التالية.


8. الآن سنضيف أزرار للوظائف. بحيث سنضيف:
زر ل "يساوي"، خاصية text هي = و خاصية objectName هي opequal
زر ل "الجمع"، خاصية text هي + و خاصية objectName هي opplus
زر ل "الطرح"، خاصية text هي - و خاصية objectName هي opminus
زر ل "الضرب"، خاصية text هي x و خاصية objectName هي opmulti
زر ل "القسمة"، خاصية text هي / و خاصية objectName هي opdiv
زر ل "الفاصلة"، خاصية text هي . و خاصية objectName هي opdot
زر ل "المسح"، خاصية text هي C و خاصية objectName هي opclear

تماما مثلما في الصورة.


إنتهينا من تصميم الواجهة الرسومية لآلتنا الحاسبة، الآن قم بحفظ الواجهة تحت إسم PyCalc.ui و سأكمل في تدوينة لاحقة.

يناير 22، 2009

نحو عالم البرمجيات الحرة و المفتوحة المصدر: المتصفحات

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

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


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

المتصفحات الأساسية الأكثر إستخداما هي:
انترنت إكسبلورر Internet Explorer
فايرفوكس Firefox
أوبرا Opera
سفاري Safari
كروم Chrome

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

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

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


حاليا لا يوجد أي متصفح من المتصفحات الأساسية في إصدار نهائي قادر على إجتياز ACID3.

يكفي هذا اليوم، و سأكمل حديثي في تدوينات لاحقة.

إصدار تصحيحي جديد ل فيرتول بوكس 2.1.2

قمت مؤخرا بالإنتقال من الإصدار 1.6.6 للآلة الإفتراضية فيرتول بوكس Virtual Box إلى الإصدار 2.1.0. و ها أنا اليوم أنتقل إلى الإصدار التصحيحي الجديد 2.1.2. و ألاحظ أن المشروع يسرع في وتيرة إكتساب الخصائص و الوظائف الجديدة و هذا سيجعل منه منافس قوي للباقي العروض الحالية من الشركات المنافسة في فترة قصيرة، حيث على سبيل المثال فالإصدار الحالي يستطيع أن يشغل 1023 آلة إفتراضية في نفس الوقت بدلا من 127 في الإصدار السابق.

يمكن تحميل الإصدار الجديد من موقع المشروع.

لكن مازالت أنتظر خاصية ضغط الأقراص الصلبة الإفتراضية بطريقة تلقائية رغم وجود بعض الطرق المختصرة لفعل ذلك يدويا من بينها:
إستخدام برنامج sdelete -c -z داخل ويندوز (كضيف إفتراضي) لملء الفراغ و المساحة الغير مستعملة بالأصفار (Zeroing) ثم عدها إستخدام أمر :
VBoxManage modifyhd XP-Guest.vdi compact
في النظام المضيف من أجل التخلص من المساحة المحجوزة الزائدة.

يناير 12، 2009

نجاح ويندوز 7 Windows يحتاج أكثر مما هو تقني

على ما يبدوا فإن نظام التشغيل ويندوز 7 Windows يحظى بإهتمام و إعجاب العديد و بتغطية إعلامية جيدة على الشبكة حتى أن بعض كتاب المقالات التقنية يتحدثون أن ويندوز 7 هو الذي سيقضي على جنو/لينوكس :)

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

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

لينجح ويندوز 7 يجب على مايكروسوفت أن تدخل بعض التعديلات على سياسة التراخيص و الأثمنة أكثر من تركيزها على التقنية. كما أن من يتتبع عالم التقنية يعرف أن ما سيقدمه ويندوز 7 ليس بالجديد على المستوى التقني بل هو ويندوز فيستا الذي وعدت باصداره حسب المخططات الأصلية. بل إن ويندوز 7 لا يضم حتى ما كان مقررا بالنسبة لفيستا (أين نظام الملفات WinFS؟)

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

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

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

يناير 01، 2009

نحو عالم البرمجيات الحرة و المفتوحة المصدر: البداية

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

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

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

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

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

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