أغسطس 22، 2009

سلسلة بايثون للمبتدئين - 04

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

المتغيرات ككائنات: المتغيرات النصية
لنقم بتعريف المتغيرة msg كما يلي:
msg = "learning python is fun!"

الآن لنقم بتنفيذ:
print msg
النتيجة هي أننا نقوم بعرض محتوى المتغيرة msg و بما أنه سبق و أن تعلمنا (في التدوينة السابقة) أن هذه المتغيرات يمكن أن نتعامل معها ككائنات فسنقوم بإكتشاف بعض وظائفها. لننفد ما يلي:
print msg.upper()
فتكون النتيجة هي:
LEARNING PYTHON IS FUN!
.upper() هي وظيفة تقوم بتحويل حروف الرسالة النصية إلى الأحرف الكبيرة.

ننفد بعدها:
print msg.title()
.title() وظيفة تقوم بتكبير الحرف الأول من كل كلمة لنحصل على رسالة مكتوبة على شكل عنوان.

بعدها قم بعرض محتوى msg من جديد:
print msg
تظهر الرسالة على شكلها الأصلي و لم تتغير أحرفها رغم تنفيذ .upper() أو .title() لماذا؟ لسبين:
1.  .upper() و .title() من الوظائف، و الوظائف تقوم بإرجاع (returns) نتيجة العملية التي قامت بها و لا تغير الأصل.
2. لأن المتغيرة msg هي من النوع str (متغيرة نصية) و هذا النوع يعتبر immutable بمعنى أن قيمته ثابتة أو غير قابلة للتغيير!

ستتساءل ما هذا الهراء؟ متغيرة غير قابلة للتغيير!؟ *o*
صبرك علي حتى أشرح :)
عندما نكتب
msg = "learning python"
يتبادر إلى دهننا أن المتغيرة msg تحتوي/تساوي تلك القيمة "learning python". في الواقع عند بايثون لا. بايثون ينسب مٌعرف المتغيرة msg إلى القيمة و ليس العكس (ينسب القيمة إلى مٌعرف المتغيرة كما نعتقد).
و عندما نقوم بتغيير القيمة من "learning python" إلى "hello python" مثلا:
msg = "hello python"
فما يطرأ هو أنه يتم حجز مكان جديد من الذاكر يكتب فيه "hello python" ثم يُعرف بـ أو ينسب إليه المُعرف msg، و تترك القيمة الأولى في الذاكرة إلى أن يقوم بايثون بكنسها من خلال garbage collector بطريقة تلقائية (لا نتدخل في ذلك كمبرمجين)

هذه هي الطريقة التي يعمل بها بايثون من الداخل و هذا هو معنى immutability (إنعدام قابلية التغيير) في المتغيرات.

هنالك العديد من وظائف التي يمكن إستخدامها مع النوع string و يمكن الإطلاع عليها على موقع التوثيق الخاص ببايثون


المتغيرات ككائنات: القوائم

نقوم بتعريف المتغيرة names كما يلي:
names = ["Wael", "Farid", "Ali", "Jamal"]
عدد العناصر هو 4 و أول عنصر ترتيبه هو 0
print names[0]

إذا أردنا أن نضيف أي عنصر جديد يمكن إستخدام إحدى هذه الطرق:
names = names + ["Karim"]
أو
names += ["Adel"]
أو
names.append("Amal")
أو
names.extend(["Noura"])

طبعا هنالك إختلاف بسيط بينهم من حيث الطريقة التي يتم بها إضافة العنصر/العناصر إلى القائمة، لكن لا تهمنا تلك التفاصيل. الأفضل من حيث السرعة هي names += ["Adel"]

كل تلك الطرق تقوم بإضافة العنصر الجديد إلى آخر القائمة. أما إدا أردنا إضافة عنصر إلى بداية القائمة مثلا يكفي أن نستخدم .insert() كالتالي:
names.insert(0, "Fouad")
.append() .extend() و .insert() كلها وظائف تعمل مع القوائم أو الكائن list

بالنسبة لقابلية التغيير (mutability) فإن قوائم تتغير، أي على عكس المتغيرات النصية string. لنقم بتنفيذ ما يلي:
print names
تقوم بعرض محتوى المتغيرة names بأكمله
names.reverse()
تقوم بعكس رتبة كل عنصر داخل القائمة (الأول يصبح الأخير و الأخير يأخذ مكان الأول)
print names
تقوم بعرض المحتوى من جديد و يظهر جليا التغير الذي طرأ على names. ثم إذا قمنا بتنفيذ الأمر التالي نحصل على قائمة بعناصر مرتبة حسب الترتيب الأبجدي.
names.sort()
print names

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


قبل أن نكمل هنالك ملاحظة بسيطة: يمكن تعريف و إستخدام قوائم صالحة للقراءة فقط تسمى بـ tuples و يتم تعريفها بإستخدام الأقواس () بدلا من []
speed = (25, 50, 75, 100)
في هذه الحالة نضمن أن تلك القائمة لن تستطيع إكتساب/إضافة عنصر جديد إليها.


القواميس (dictionaries)

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

المتغيرات/الكائنات على شكل قواميس تتشكل من قسمين القسم الأول يضم القيمة المفتحية و القسم الثاني يضم القيمة أو القيم المعبَر عنها.

و تكتب القواميس بين علامتي {} و يُفصل بين القسمين بعلامة :
مثال:
students = { "id100" : "Youssef", "id120" : "Adel", "id121" : "Noura", "id133" : "Karim" }

في هذا المثال قمنا بتعريف متغيرة على شكل قاموس إسمها students و تضم أربعة عناصر. كل عنصر يضم التسمية المفتحية و قيمتها.
العنصر الأول هو "id100" : "Youssef" تسميته المفتحية هي "id100" و قيمته التي يعبر عنها هي "Youssef"

لعرض محتوى المتغيرة بأكمله ننفد:
print students

لعرض محتوي إحدى التسميات المفتحية، مثلا "id120" ننفد:
print students["id120"]

لعرض كل التسميات المفتحية للمتغيرة students ننفد:
print students.keys()

لعرض كل القيم المتواجدة داخل المتغيرة students ننفد:
print students.values()

لإضافة تسمية مفتحية و قيمتها ننفد:
students["id116"] = "Ayman"
print students

لتعديل أي عنصر "id120" ننفد:
students["id120"] = "Farid"
print students

لحذف أي عنصر "id133" ننفد:
del students["id133"]
print students


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

ملاحظتين بخصوص القواميس:
1. القواميس مثلها مثل القوائم من حيث قابلية التغيير (mutable)
2. القسم الثاني الذي يعبِر عن القيمة يمكن أن يأخذ أي شكل من المتغيرات سواءا كان نصي، عددي، قائمة، كائن، وظيفة أو حتى قاموس آخر.

أغسطس 19، 2009

سلسلة دروس بايثون المرئية

سلسلة دروس بايثون المرئية متوفرة على يوتوب مكونة من 12 جزء و يمكن تحميلها على شكل ملفات wmf من هنا.
شكر خاص للمعد!

أغسطس 16، 2009

Ð0 ¥0µ $p34k £33†?

تحية روبية للصديق كريم عبد المجيد أما بعد، تقبل رسالة l33t على الطريقة البايثونية :)


#!/usr/bin/env python

# -*- coding: UTF-8 -*-

## Released into Public Domain by Mohammed Berdai <stuntgp2000 @t gmail d0t com>
## To know more about Leet visit URL: http://en.wikipedia.org/wiki/Leet
## Thanks flies to Mutati0N for the fun http://mutati0n.wordpress.com/ruby-projects
"""English to l33t Convertor"""
 

alphabet = {'a':'4', 'b':'8', 'c':'[', 'd':'|>', 'e':'3', 'f':'|=', 'g':'6',

            'h':'/-/', 'i':'1', 'j':'_/', 'k':'|<', 'l':'|_', 'm':'(V)',

            'n':'/V', 'o':'0', 'p':'|>', 'q':'<|', 'r':'|?', 's':'$',

            't':'7', 'u':'(_)', 'v':"\/", 'w':'vv', 'x':'}{', 'y':'`/',

            'z':'2'}



print "\t\tWellcome to the l33t Converter V1.0\n"

phrase = raw_input('Please enter the phrase: ').lower()



leetphrase = ''

for char in phrase:

    leet = alphabet[char] if char in alphabet else char

    leetphrase += leet



print leetphrase



و حتى أجيبك K.O  إليك:


#!/usr/bin/env python

# -*- coding: UTF-8 -*-

## Released into Public Domain by Mohammed Berdai <stuntgp2000 @t gmail d0t com>
## Leet URL: http://en.wikipedia.org/wiki/Leet
## Thanks flies to Mutati0N for the fun http://mutati0n.wordpress.com/ruby-projects


alphabet = {'a':'4', 'c':'ç', 'd':'Ð',  'e':'3', 'f':'ƒ', 'g':'9', 'i':'1',

            'l':'£', 'o':'0', 's':'$', 't':'†', 'u':'µ', 'y':'¥', 'z':'2'}


print ''.join([(alphabet[c] if c in alphabet else c) for c in raw_input('Your phrase: ').lower()])

لا تقلقوا أنا بخير :)

l33t هي لغة يستخدم فيها الرموز و الأرقام للكتابة باللغة الإنجليزية متداولة بين مستخدمي الحاسوب الذين يعتقدون أنهم متميزون عن البقية :)

و هذا المساء دخلت إلى قسم مشاريع بروبي Ruby على مدونة Mutati0N و لتسلية فقط أردت أن اكتب سكريبت ببايثون Python يقوم بنفس العملية (تحويل الجمل من الإنجليزية إلى l33t) بأقل عدد من الأسطر و كانت النتيجة كما رأيتم :)

جيد، الشرح:
في الكود المصدر الأول إستخدمت متغيرة على شكل قاموس (سنرى القواميس لاحقا في سلسلة بايثون للمبتدئين) إسمها alphabet و هي تضم كل أحرف اللغة الإنجليزية و مقابلها من أحرف l33t. بعد ذلك نقوم بعرض رسالة تتضمن إسم السكريبت و رقم إصداره، ثم نطلب من المستخدم أن يدخل جملته التي سيتم تحويلها إلى الأحرف الصغيرة قبل أن يتم الإحتفاظ بها في المتغيرة phrase
بعد ذلك نحدد متغيرة إسمها leetphrase و محتواها في البداية يكون فارغ.
الآن سنقوم بقراءة كل حرف (معبَر عنه بالمتغيرة char) في الحملة التي أدخلها المستخدم (معبَر عنها بالمتغيرة phrase) بإستخدام الحلقة التسلسلية for. و في كل دورة من دورات الحلقة يتم إختبار هل الحرف الحالي يوجد مقابل له في القاموس أما لا (و ذالك بالإستخدام الجملة الشرطية if). إذا كان موجودا كُتب الحرف المقابل له في المتغيرة leet، أما إذا لم يكن موجود كُتب الحرف الحالي (الأصلي) في المتغيرة leet. ثم بعد ذلك يتم إضافة قيمة المتغيرة leet إلى الجملة التي ستظهر للمستخدم لاحقا (المعبر عنها بالمتغيرة leetphrase) بعد إنتهاء الحلقة من المرور على كل حرف في الجملة التي أدخلها المستخدم.
في النهاية يتم عرض محتوى المتغيرة leetphrase التي تضم مقابل الجملة الأصلية بلغة l33t


أما الكود الثني فهو يقوم بنفس عمل الكود الاول لكن في سطرين. الأول يٌعرف القاموس و الثاني:
يطلب من المستخدم أن يدخل الجملة و يقوم بتصغير حروفها من خلال الجزء التالي raw_input('Your phrase: ').lower()
يقرأ كل حرف (معبر عنه بـ c) من خلال الحلقة التسلسلية for، ثم يتم إختباره من خلال الجملة الشرطية if هل موجود في القاموس أم لا. إذا كان موجود عُوض بمقابله، إذا لم يكن موجود ترك الحرف الأصلي على حالته.
كل ذلك يتم داخل قائمة [] يتم تحويل كل عناصرها إلى جملة نصية واحدة من خلال ''.join() و في النهاية يتم عرض النتيجة للمستخدم :)

أغسطس 15، 2009

سلسلة بايثون للمبتدئين - 03

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

المتغيرات قد تتخذ شكل مركب كالقوائم (lists) أو القواميس (dictionaries). و في بايثون كما أغلب لغات البرمجة الحديثة يمكن للمتغيرات أن تعبر و تستوعب أي شيء. و هذا ما سيدفعنا إلى التطرق إلى مفاهيم البرمجة الكائنية التوجه (Object-oriented programming) و التي يعتبر كل شيء فيها كائن.

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

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

الآن سنعود إلى ذلك الجزء .upper() في آخر المتغيرة lastname في التدوينة السابقة.

lastname هي متغيرة، و القيمة التي تعبر عنها هي نصية (string)، و بما أن بايثون لغة برمجة كائنية التوجه فهذا يجعل من تلك المتغيرة كائن و خصائصه يستدمها من القيمة الني يعبر عنها، و بما أن هذه القيمة هي نصية فإن خصائصها مستمدة من كائن إسمه str و هذا الأخير واحد من كائات بايثون.

upper() هي من وظائف الكائن str، و تسمى أيضا بالدوال. إكتسبت المتغيرة lastname تلك الوظيفة لأنها إكتسبت خصائص الكائن str

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

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

أغسطس 11، 2009

سلسلة التوزيعات و نظم التشغيل المفتوحة المصدر: نظام PC-BSD 7.1 - ج 02

تتمة لتدوينة نظام PC-BSD 7.1 سنتعرف اليوم أكثر على هذا النظام و مزاياه.
PC-BSD هو نظام موجه للإستخدام المكتبي و يحاول القائمون عليه أن يجعلوا منه سهل التثبيت و الإستخدام و ذلك عن طريق:
  • تثبيت النظام يتم بإستخدام واجهة رسومية.
  • توفير واجهة رسومية لكل أدوات تسيير و تخصيص النظام.
  • توفير الدعم التلقائي للوسائط المتعددة كفلاش و mp3
  • توفير تعريفات (drivers) لكروت العرض nVidia و Intel حتى يسهل الحصول على واجهة رسومية ثلاثية الأبعاد مسرعة.
  • تعرف على مختلف أنواع الشاشات و إعدادها تلقائيا
  • توفير عدد من التطبيقات المجهزة للتثبيت على شكل ملف PBI يمكن الحصول عليها من pbidir.com و تثبيتها بكل سهولة

نظام تسير الملفات على القرص هو UFS 2 بخاصية Soft Updates و هو مُفعل بشكل إفتراضي. نظام UFS2 يعتبر من النظم المتطورة صممت لإستخدام و دعم مساحات شاسعة مع توفير حماية للبيانات في حالات الأعطاب و تجمد النظام من خلال Journaling أو Soft Updates، و كذا دعم لصور المجلدات و الملفات (snapshots)

من أهم البرامج التي يمكن تثبيتها من خلال القرص المدمج هي:
  • برنامج Amarok للإستيماع إلى الموسيقى و تنظيمها
  • برنامج Gimp لتعديل الصور
  • برنامج K3B لحرق الأقراص المدمجة
  • الحزمة المكتبية OpenOffice.org
  • برنامج VLC لمشاهدة الفيديو
  • برنامج Pidgin للمحادثة الآنية
  • المتصفح Firefox و قارئ الرسائل الإلكترونية ThunderBird
  • برنامج Wine لتشغيل برمجيات نظام ويندوز


بعض الملاحظات
الواجهة الرسومية المعتمدة هي كيدي KDE 4.2 و لا يوجد أي دعم رسمي لواجهة جينوم Gnome

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

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

الخلاصة
PC-BSD نظام يستحق التجربة، يحظى بتوثيق جيد يجيب على كل الأسئلة و يشرح تفاصيل التعامل مع النظام جيد! قد لا يكون بديل لنظامك الأساسي لكنه سيعطيك لمحة عن أنظمة BSDs. شخصيا ترك إنطباعا جيدا خصوصا مدير تسيير الحزم PBI

سلسلة بايثون للمبتدئين - 02

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

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

لكن ما نوع هذه العمليات؟
على سبيل المثال يمكن أن نطلب من المستخدم أن يدخل نسبه بالعجمية. لكنه عند إدخاله قد يكتبه بالأحرف الصغيرة (abcd) أو الكبيرة (ABCD)، و نحن نريد أن نعرض إسمه دائما بالأحرف الكبيرة فكيف نفعل ذلك؟
سنكتب ما يلي:
lastname = raw_input("Please enter your last name: ")
print  "Welcome back " + lastname.upper()

في السطر الأول تقوم raw_input() بعرض رسالة "Please enter your last name: " ثم تنتظر من المستخدم أن يدخل المعلومة المطلوبة. و بعد التوصل بها يتم حفض النتيجة داخل المتغيرة lastname
في السطر الثاني تقوم print بعرض رسالة تتألف من جزء ثابت و محدد هو "Welcome back " و جزء متغير متواجد داخل lastname.upper()
ملاحظتين:
1. يسمى جزء متغير لأن محتواه يتغير بحسب محتوى المتغيرة، و هذه الأخيرة محتواها يتغير حسب المعلومة التي توصلت بها (النسب في هذه الحالة)
2. لاحظ أن lastname أصبحت lastname.upper() لماذا؟. upper() هي وظيفة يمكن تطبيقها على المتغيرات النصية. سنرى الوظائف لاحقا، المهم أن هذه الوظيفة هي نوع من أنواع العمليات التي يمكن تطبيقها على المحتوى/المتغيرات النصية. العملية التي تقوم بها upper() هي تكبير حروف المتغيرة lastname و بذلك نضمن أن النسب سيظهر دائما بالأحرف الكبيرة.


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

سؤالي إدا كنا نريد الحصول على أسماء 5 أشخاص فهل يجب إستخدام 5 متغيرات؟ ماذا لو كان عدد الأشخاص 100؟ أو عدد الأشخاص غير معروف كعدد الزبائن مثلا؟
في هذه الحالة يفضل أن نستخدم القوائم (Lists)

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

قم بتحرير ما يلي:
countries = []
ثم
countries = ["Algeria", "Palestine", "UK", "France"]
ثم
countries.append("China")
ثم
countries.append("Germany")
ثم
print countries[1]
ثم
print countries[0]
ثم
print countries[-1]
ثم
print countries[2:4]
ثم
print countries
الشرح:
أولا نقوم بتحديد متغيرة بإسم countries و محتواها سيكون على شكل قائمة. المعقوفات [] تستخدم لتعبير على أن المتغيرة هي قائمة فارغة (لا تحتوي على شيء بعد)
ثانيا، المتغيرة countries ستعبر عن قائمة تتكون من 4 عناصر، كل عنصر منهم هو محتوى نصي لأنه داخل "" و يتم التمييز بينهم بإستخدام الفاصلة ,
ثالثا، بما أن المتغيرة countries تعبر عن قائمة (list) فيمكن إستخدام الوظائف التي تستخدم على القوائم تماما كما رأينا في حالة المتغيرات العادية. الوظيفة التي سنستخدمها هي append() و ستقوم بإضافة المعلومة النصية بين قوسين ("China") إلى القائمة countries ثم نكرر نفس الشيء بالنسبة ل "Germany"

بعد ذلك نبدأ بعرض محتوى القائمة:
أولا، print countries[1] تقوم بعرض المعلومة صاحبة الرتبة الثانية. نعم الثانية و ليست الأولى، لماذا؟ لأن أول عنصر في القوائم يعبر عليه بالرتبة صفر 0 و ليس 1، و بالتالي فإن العنصر 1 يعبر عن الرتبة 2

ثانيا print countries[-1] العنصر -1 هو العنصر الأخير، لماذا؟ لأن القوائم قد تختلف عن بعضها البعض من حيث عدد العناصر التي قد تعبر عنها. فإذا كان عدد العناصر مختلف كبف يمكن عرض آخر عنصر في كل قائمة؟ نستخدم [-1] لتعبير عليه.

ملاحظة: الطريقة الأخرى لعرض آخر عنصر هي print countries[len(countries)-1] في هذه الحالة ما نقوم به هو أننا نطلب حساب عدد العناصر الموجودة داخل القائمة ثم ننقص منه -1 حتى نستطيع التعبير عن آخر عنصر. لماذا نقوم بالنقص -1 لأنه إذا كانت القائمة تضم 6 عناصر مثلا و العنصر الأول يعبر عنه بـ 0 فإن آخر عنصر في القائمة سيكون 5 و ليس 6. لما كل هذا و الطريقة الأولى أبسط :)

ثالثا، print countries[2:4] تقوم بعرض كل عناصر القائمة بدءا من العنصر الثاني و حتى العنصر ما قبل الرابع.
و حتى يتضح الأمر أكثر فإن:
"Algeria" هو العنصر 0 و رتبته عندنا نحن هي 1
"Palestine" هو العنصر 1 و رتبته عندنا نحن هي 2
"UK" هو العنصر 2 و رتبته عندنا نحن هي 3
"France" هو العنصر 3 و رتبته عندنا نحن هي 4
"China" هو العنصر 4 و رتبته عندنا نحن هي 5
"Germany" هو العنصر -1 أو 5 و رتبته عندنا نحن هي 6

رابعا، print countries تقوم بعرض محتوى القائمة بأكمله


الآن ماذا لو أردنا حذف العنصر 0 من القائمة؟
نستخدم الأمر del و هو من الكلمات المفتحية/المحجوزة. سيكتب الأمر بهذه الطريقة:
del countries[0]

و هنا نقوم بحذف العنصر 0 الذي يحتوي المعلومات التي أردنا حذفها و هذا يتطلب منا معرفة مسبقة بمكانها، لكن ماذا لو أردنا حذف المعلومة أينما وجدة دون معرفة مسبقة بمكانا؟ في هذه الحالة نستخدم وظيفة remove() و ستكتب كما يلي:
countries.remove("China")
بحيث نطلب حذف أول عنصر من القائمة يحتوي على تلك المعلومة. لاحظ معي جيدا أول عنصر و ليس كل العناصر.

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

أغسطس 10، 2009

ROS نظام تشغيل الرويوتات المفتوح المصدر

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


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




الإطار البرمجي و الأدوات متوفرة على منصة جنو/لينوكس و ماك.

روابط إضافية:
صفحة المشروع على سورس فورج (sourceforge).
صفحة الأدوات على سورس فورج.
صفحة التحميل.

أغسطس 04، 2009

إصدار KDE 4.3

قمت بتحديث اليوم الذي شمل الإصدار النهائي لكيدي KDE 4.3 و هي بيئة سطح المكتب لأنظمة يونكس unix و الشبيهة بيوكس unix-like كمنصة جنو/ليوكس GNU/Linux.

لم يتم الإعلان عنها بشكل رسمي بعد لكن على حسب ما لاحظت بعد التحديث أن هذا الإصدار يحمل الكثير من التحديثات التي مست كل الجوانب. و أهم ما يلاحظ هو:
  • تحديثات و تحسينات في الواجهة الرسومية و الإستخدامية.
  • سرعة و إستجابة أكبر.
  • مزايا أمان جديدة.
  • تخصيصات إضافية.
 و حسب ما إطلعت عليه من خلال موقع كيدي فإن هذا الإصدار يضم هذا الإصدار أكثر من 2.000 خاصية جديدة و 60.000 تحديث و 10.000 علة تم تصحيحها. كل ذلك تم في 6 أشهر.

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

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

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

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