يوليو 16، 2009

تقنية الواقع الزائد Augmented Reality

الواقع الزائد (Augmented Reality) هو مجال في أبحاث الحاسوب يتناول الجمع بين معلومات العالم الحقيقي و بيانات من العالم الإفتراضي حيث يتم دمج الأجسام الرسومية الناتجة عن الحاسوب بالتصوير المرئي الواقعي بشكل آني.







يوليو 11، 2009

أرشيف المدونات و المواقع العربية التقنية

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

و حتى أوفر الوقت على من يريد أن يتابعها من خلال قارئ الخلاصات (RSS) يمكن تحميل ملف OPML الذي يضم كل روابط الخلاصات، ثم إستيراده من خلال القارئ.

ملاحظة: الروابط المعلمة باللون البرتقالي هي آخر المدونات و المواقع المدرجة. آخر تحديث كان بتاريخ 11/07/2009


مدونات تقنية متخصصة:


مواقع و منتديات تقنية متخصصة:


مدونات شخصية أو متخصصة في مجالات أخرى:


مدونات و مواقع بلغات أجنبية:

يوليو 04، 2009

الحصيلة التقنية: 07/2009 - أ

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

تم إصدار كيوت Qt 4.5.2  الذي حصل على تصحيحات عديدة و بعض التحسينات الجديدة. و هو أول إصدار حظي بمساهمة مجتمع كيوت بعد أن تمت إتاحة المجال لمشاركات الأفراد في تحسين الشفرة. كما تم إصدار كيوت كرييَتور Qt Creator 1.2 الذي حصل على مزايا جديدة تجعل منه بئة أكثر جاذبية للمطورين بـ C++/Qt.

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




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

 بالنسبة لقواعد البيانات تم إصدار MySQL 5.1.36 و هو إصدار تصحيحي. كما تم إصدار Workbench 5.1.16 الذي يسمح بتصميم قواعد البينات و تسييرها بطريقة مرئية، و هو متوفر حاليا على منصة جنو/لينوكس و ماك بالإضافة إلى ويندوز.
كما تم إصدار PostgreSQL 8.4 الذي ضم تحسينات مهمة و مزايا جديدة متعلقة بالأداء و الأمان. يمكن الإطلاع على ذلك هنا في جدول المقارنات.

بالنسبة للغة البرمجة php تم إصدار 5.3.0 و ضم أكثر من 140 تصحيح بالإضافة مزايا و وظائف جديدة.

الآلة الإفتراضبة VirtualBox 3.0 ضمت مزايا جديدة يستفاد منها في الأنظمة ذات قدرات الإستخدامات المتوازية، بالإضافة إلى دعم أولي لمكتبة الرسوميات DirectX 8/9 و تسريعها بواسطة معالج الرسوميات لبطائق العرض.

ثم بيئة التطوير NetBeans 6.7 بإصدارها الجديد التي تضم المزيد من التحسينات و دعم لأهم لغات البرمجة مع تحسينات في الأداء العام.

إصدارات أخرى:
نواة لينوكس Linux 2.6.30.1 (إصدار تصحيحي)
سامبا Samba 3.4 لمشاركة الملفات على الشبكة.
جينوم Gnome 2.26.3 و هي وجهة مكتبية لمنصة جنو/لينوكس (إصدار تصحيحي)
الحزمة المكتبية KOffice 2.0.1. (إصدار تصحيحي)

إصدارات مترقبة:
خادم الرسومات X.org 7.5
برنامج البريد ThunderBird 3.0
الواجهة المكتبية لمنصة جنو/لينوكس كيدي 4.3 KDE
برنامج التصميم و الرسومات الثلاثية الابعاد Blender 2.5

بالنسبة لي:
مشاغلي على وشك أن تنتهي لأتفرغ لتعلم و تجربة أشياء جديدة. في الوقت الحالي أصمم موقع يدويا بإستخدام XTHML/PHP معتمدا على ما تعلمته قبل سنتين.
تجربتي مع Drupal 6.x كانت جيدة و هو يناسبني. لم أتعلم الشيء الكبير بعد لكن سأخصص له المزيد من الوقت في الفترة المقبلة.
علي أن أجرب إستخدام PyQt 4 مع قواعد البينات و عرض محتواها و هل تدعم الترابط مع مكونات الواجهة بشكل يسهل و يسرع تطوير البرمجيات.
لا أستطيع أن أخرج ruby من تفكيري لأن هذه اللغة  جد معبرة و كأنك تصف أو تتحدث مع الحاسوب على أساس انه يفهم ما تقول.
سأقوم بكتابة الجزء الثاني من مشاكل المشروع Euler Project و بكتابة تدوينة جديدة لتعليم بايثون للمبتدئين. و إذا سار كل شيء على ما يرام سيبقى إهتمام المدونة ببايثون لمدة طويلة و ستشمل تقريبا كل ما أفعل أو أتعلم ببايثون.

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

يونيو 29، 2009

ماهو الموقف من مونو Mono بكل حيادية و موضوعية؟

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

فما هو وضع مونو Mono من كل المخاوف و المخاطر التي تحوم حوله بكل موضوعية و حيادية؟


أولا، ما هو مونو؟
مونو عبارة عن إطار عمل برمجي حر و مفتوح المصدر صمم خصيصا ليكون بديل مفتوح المصدر للإطار البرمجي دوت نت (Net Framework) على منصة جنو/لينوكس، يونكس، ماك و حتى ويندوز.

و أين تكمن المخاوف؟
تقنية دوت نت هي من إبتكار و تطوير مايكروسوفت Microsoft و هذا يجعلها مالكة لتلك المنصة و بالتالي فهي تملك الأحقية في إمتلاك براءات الإختراع (patents). و فعليا في حوزتها العديد منها.

غير أن مايكروسوفت قامت في صيف 2001 بطلب إجتياز و إعتبار لغة سي شارب C# و اللغة العامة للبنية التحتية (Common Language Infrastructure) كمعيار قياسي موحد و معترف به من طرف ECMA و ISO. و للحصول على هذا الإعتراف يجب توفير التقنية بشروط معقولة وغير تمييزية، و فعلا هذا هو ما حصل. الشيء الذي يسمح للأخرين بإمكانية تطوير برمجيات تستخدم هذه المعايير دون تخوف.

لكن

الإطار البرمجي دوت نت يتكون من أجزاء أخرى لا ينطبق عليها هذا المعيار كـ:
  • WinForms: الذي يوفر الأدوات و المكونات المسؤولة عن توفير الواجهة الرسومية.
  • ADO.Net: الذي يوفر مكونات التواصل مع قواعد و خدمات الباينات.
  • ASP.Net: الذي يوفر مكونات تصميم المواقع الدينامكية و خدمات و برمجيات النت.
  • باﻹضافة إلى WPF, WCF, WF و LINQ
و بالتالي فإن هذه الأجزاء المهمة تبقى غير مغطات بأي ضمان أو رخصة تسمح بإستخدامها. و حتى مبادرة المصدر المشترك التي قامت بها مايكرسوفت في 2007 لا تقدم أي ضمان.


أين مونو من كل هذا؟
في البداية كان هذف مونو هو تطوير إطار عمل متوافق للمعيار القياسي الموحد لـدوت نت (ECMA/ISO). و قد تحقق هذا الهذف و هو مغطى بتصريح يسمح بإستخدامه من طرف اي شخص و لأي غاية.
اما اليوم فقد تمكن مونو من توفير دعم للأجزاء الثلاثة الاساسية الأخرى (WinForms و ADO.Net و ASP.Net) بالإضافة إلى مكونات  أخرى (برمجيات و مقاييس مفتوحة المصرد و موحدة) كـ  OpenGL و GTK و Mozilla.
و بما أن تلك الأجزاء الأخرى الخاضعة لمايكروسوفت لا يوجد عليها أي ضمان فإن إستخدامها لتطوير البرمجيات يحمل مجازفة يجب و ضعها في الحسبان.

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

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

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

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

هل ستنتهي هذه الأخبار و المخاوف يوما ما؟
لن تزول المخاوف حتى أن تقوم مايكروسوفت بإحدى الخطوات التالية:
  • ترخيص منصة دوت نت تحت رخصة حرة كـ جيبيئل GPL 3
  • الإعلان بشكل رسمي أنها لن تقوم بملاحقة المبرمجين الذي يستخدمون هذه التقنيات في البرمجيات الحرة و المفتوحة المصدر.
تحديث 07/07/2009: أخبرت مايكروسوفت أنها ستعلن على أن تشمل C# و CLI في وعدها للمجتمع (Community Promise). و هو وعد سبق و أن قدمته للمجتمع بعدم ملاحقة من يستخدم بعض تقنيات مايكروسوفت لتطوير البرمجيات دون أي ترخيص. لا يحل هذا كل الخلاف (على ما أعتقد) لكنها خطوة جيدة تشكر عليها.

روابط إضافية:
الأسئلة الأكثر تكرار حول ترخيص مونو.
صفحة الملكية الفكرية و الترخيص لمايكروسوفت.
لماذا لا يجب علة البرمجيات الحرة ان تعتمد على مونو أو سي شارب C#
مشروع مونو.

يونيو 24، 2009

لمحبي تبريد المعالج بالماء، لما لا تضع الحاسوب بأكمله في حوض أسماك؟


شاهد الفيديو بنفسك ليزول العجب :)



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

يونيو 21، 2009

مقارنة بين أداء بايثون و لغات البرمجة الأخرى

قضيت الفترة الأخيرة في إختبار أداء بايثون خصوصا أداء الحلاقات التسلسلية for و مقارنته بكل من روبي (Ruby)، بيئتشبي (PHP)، جنوا سي بلاس بلاس (GNU C++)، سي شارب (C#)، جافا (Java) و سكالا (Scala)

عند تعلمي لبايثون لاحظت أن مرونته و أدائه جد قويين في مجموعة من المهام، من بينها إنشاء قاموس يحتوي على 1 مليون مفتاح و قيمة في ثانية واحدة و أشياء أخرى. و أثناء حلي لمشاكل المشروع Euler Project لاحظت بعض البطء في الحلاقات التسلسلية for لكن لم أعر الأمر أي اهتمام لأن حاسوبي يعتبر من الديناصورات (P4 2.4Ghz) و عند تجربتي لنفس الكود على حاسوب آخر (Core 2 Duo 2.4Ghz) كان ينجز نفس المهمة 3 مرات أسرع.

و بعد وضعي للمشكلة رقم 5 تفضل الصديق محمد الجوهري بوضع الحل بلغة C# و عند تجربتي لحله تفاجأت من السرعة التي يتم العثور بها على الحل. قرأت الكود و جربته أكثر من مرة محاولا العثور على شيء يميزه، لكنه عادي. من هنا انطلقت رحلتي لفهم ما يجري في الحلاقات التسلسلية for في بايثون 2.6.2

الكود الاول:
في البداية كان الكود كالتالي و يستغرق 55 ثانية ليجد الحل:
n = 20
divs = [x for x in range(n, 0, -1)]
i = 0

while True:
    i = i+1
    nop = False
    for x in divs:      
        if (i*n) % x != 0:
            nop = True
            break

    if nop == False:
        print "\nThe answer is ", i*n
        break

هذا الكود رديء، و غيرته ليصبح كالتالي و هو يستغرق 40 ثانية:
i = 20
done = False
seq = range(2, 20+1)

while not done:
    for j in seq:
        if i % j != 0:
            break
        elif j == 20:
            done = True

    i += 20

print i-20

ثم قرأت حول طرق تحسين كود بايثون و وجدت من ينصح باﻹستخدام الدوال التالية lambda, map و filter بدلا من الحلقة التسلسلية for و كانت النتيجة كالتالي:

الكود الثالث يستغرق 5 دقائق و 34 ثانية:
i = 20
done = False
seq = range(2, 20+1)

while not done:
    if len(filter(None, map(lambda y: i % y == 0, seq))) == len(seq):
        done = True
        break
    i += 20
  
print i

الكود الرابع يستغرق هو أيضا 5 دقائق و 34 ثانية:
i = 20
done = False
seq = range(2, 20+1)

while not done:
    if False in map(lambda x: i % x == 0, seq):
        pass
    else:
        done = True
        break
    i = i + 20

print i

الكود الخامس: ثم بعد ذلك قمت بإدراج الكود الثاني داخل دالة و أصبح على الشكل التالي و يستغرق 24 ثانية:

def euler5():
    i = 20

    seq = range(2, 20+1)
    while True:
        for j in seq:
            if i % j != 0:
                break
            elif j == 20:
                return i

        i += 20

print euler5()



المهم ماذا يجري هنا؟ و لما كل هذا؟
بايثون يعتبر من لغات البرمجة التي تعتمد على التحديد الدينامكي أو المرن للمتغيرات (Dynamically Typed)، بمعنى أن المتغيرة a يمكن أن تحتوي على قيمة رقمية ثم تتحول لتعبر عن قيمة نصية بكل سهولة أثناء عمل البرنامج. و هذا ما يتشابه فيه كل من بايثون python، روبي ruby و بيئيتشبي php. بينما تعتمد كل من لغة سي بلاس بلاس c++ و جافا java و سي شارب c# و سكالا Scala على التحديد الثابت للمتغيرات (Statically Typed). طبعا هنا أقوم بشرح مبسط كما لم أتطرق للأفضلية لأن لكل منها (الغات) نقاط قوتها و ضعفها.

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

اتضح لي فيما بعد أن الفلسفة التي يتبعها مطورو بايثون هي:
1. سهولة قراءة و وضوح الكود أهم من تعقيده لأجل تحسينه (optimization) للإستفادة من أخر جزء من الثانية.
2. هنالك قانون يسمى قانون مور (Moore's law) يقول أن كفائة العتاد تتضاعف كل 18 شهر تقريا. بمعنى أنه مع تطور العتاد سيسبح الفرق بسيطا بين الكود المُحسن و العادي.
3. و إذا كانت السرعة أولوية لا غنى عنها حينها يجب على المبرمج أن يستخدم قاعدة 90/10 بحيث يُفضل أن يكتب الجزء المسرع/المحسن بلغة C أو لغة أخرى.


النقطة المهمة التي تعجبني في مشاكل المشروع يولر Euler Project هي أن كل مشكلة تقريبا يمكن حلها بطريقة تقليدية و أخرى بإستخدام بعض الذكاء و التفكير مع مراعات أن يبقى الحل بسيطا :)
و كما قال لِيُوناردو دا فينشي (Leonardo da Vinci) "البساطة هي منتهى التعقيد"

و هذا هو ما قمت به في الحل الثاني للمشكلة رقم 5 بحيث تظهر النتيجة في جزء من الثانية.


لكن كيف هو أداء باقي لغات البرمجة الأخرى في إيجاد الحل للمشكلة رقم 5؟
1. روبي Ruby 1.8.7 أوجد الحل في دقيقتين و ثلاثين ثانية (2min 30s):
def GetResult()
    n = 20
    i = n
    while true do
        for j in 2..n do
            break if i % j != 0
            if j == n
                return i
            end
        end
        i += n
    end
end

puts GetResult()

ثم بعد تعديل الحلقة التسلسلية for أوجد الحل في دقيقتين و ثانية (2min 1s)
def GetResult()
    n = 20
    i = n
    seq = 2..n
    while true do
        for j in seq do
            break if i % j != 0
            if j == n
                return i
            end
        end
        i = i+n
    end
end

بيئيتشبي PHP 5.2.9 أوجد الحل في 21 ثانية:
$i = 20;
$n = $i;
$Done = false;
while (! $Done) {
    for ($j = 2; $j <= $n; ++$j) {
        if ($i % $j != 0) { break; }
        else {
            if ($j == $n) { $Done = true; }
        }
    }
    $i = $i + $n;
}

print $i - $n . "\n";

من خلال ما سبق يتضح أن php أسرع من python و ruby. و كلها تصنف كلغات ديناميكية النوعية.

لكن كيف هو أداء اللغات الثابتة النوعية ك C#, Scala و GNU C++ ؟ الجواب هو إنها فائقة السرعة مقارنة مع اللغات الديناميكية المجربة أعلاه.

بالنسبة لجنوا سي++ (GNU C++) أوجد الحل في ثاتية و نصف!:
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    int i = 20;
    bool Done = false;
    while (!Done) {
     for (int j = 2; j <= 20; ++j)
     {
         if (i % j != 0) break;
         else
         {
            if (j == 20) Done = true;
         }        
     }
     i += 20;
    }
   
    cout << endl << i-20 << endl;
    return EXIT_SUCCESS;
}

بالنسبة لسي شارب C# أوجد الحل في ثانيتين. (بإستخدام كود الصديق محمد الجوهري)

بالنسبة لجافا (java) أوجدت الحل في ثانية و ثمانية أعشار الثانية (1.8s)
public class Main {
    public static void main(String[] args) {
        int i = 20;
        boolean Done = false;
        while (!Done) {
            for (int j = 2; j <= 20; ++j) {
                if (i % j != 0) {
                    break;
                } else {
                    if ( j == 20) {
                        Done = true;
                    }
                }
            }
            i=i+1;
        }

        System.out.println(i-1);
    }
}

و أخيرا لغة سكالا (Scala) التي أوجدت الحل في ثانيتين و أربعة أعشار الثانية (2.4s)
def euler5(): Int = {
  var n = 20
  var i = n
  var done = true
  while (done)
  {
    var j = 2
    var iter = true
    while (iter && j < n+1)
    {
      if (i % j != 0) iter = false
      else j += 1
    }
    if (iter == true) done = false
    i += n
  }
  i-n
}

println(euler5())

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

الخلاصة:
1. أكتب دائما كود بسيط و تسهل قرائته.
2. الحلاقات التسلسلية for تستهلك الكثير من وقت المعالج، و يمكن تحسينها بإتباع بعض النصائح.
3. إدا كانت السرعة جد ضرورية في منطقة معينة من برنامجك حينها قم ببرمجة ذلك الجزء بلغة سي أو سي ++
4. سيحصل بايثون على آلة إفتراضية محسنة (LLVM) ستجعل أداءه مشابه للغة سي و سي++


تحديث 1: قمت بتجربة الكود الخامس بإستخدام الإصدار الجديد لبايثون 3.1 الذي توصل إلى الحل في 32 ثانية. (مازل أبطأ في هذا الإختبار لكن أفضل من الإصدار 3.0)

يونيو 14، 2009

مشروع Euler project: المشكلة رقم 10

المشكلة رقم 10:
مجموع العداد الأولية تحت 10 هو: 2 + 3 + 5 + 7 = 17

المطلوب:
أجد مجموع كل الأعداد الأولية تحت مليونين.

الحل:
import math

def isPrime(n):
    nbrs = [2] + range(3, int(math.sqrt(n))+1, 2)   
    for i in nbrs:
        if n % i == 0:
            return False
    return True

def sumPrimes(n):
    primes = [2] + [x for x in range(3, n, 2) if isPrime(x)]
    return sum(primes)

print sumPrimes(2000000)

الشرح:
1. نستدعي وحدة الرياضيات math بواسطة التعليمة import
2. نكتب دالة isPrime وظيفتها إختبار العدد الذي تتوصل به كمعيار n هل هو أولي أم لا. ذاخل هذه الذالة ننشئ قائمة بكل العداد بداية من 2 حتى جدع تربيع العدد n مع تفادي كل مضاعفات العدد 2
3. نكتب دالة وظيفتها إنشاء قائمة primes بكل الأعداد من 2 حتى n مع إجتناب مضاعفات العدد 2 و بشرط أن يكون أوليا، ثم بعد ذلك نستخدم الدالة sum حتى تحسب مجموع أعداد هذه القائمة.
4. يتم عرض النتيجة بإستخدام print