بلدي المفضل لتطوير أدوات ذكية

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

  1. JUnit : بدأت مع ما هو واضح ، والد الجميع. إلا إذا كنت قد يختبئ في قبو تابع لالمناهضة للاسلحة النووية في العام الماضي ، كنت قد سمعت أو استخدمت اختبار الوحدة. إذا كنت محظوظا حقا ، قد لعبت حتى التنمية تجارب مدفوعة. في الواقع ، في اشارة جيدة على هذا الموضوع هو اختبار مدفوعة التنمية : حسب المثال .
  2. إعادة بيع ديون : حسنا ، حسنا ، انا ذاهب الى وقف مع الابتذال ، ولكن لا يمكن الحديث عن التنمية دون IDE رشيقة جيدة تتيح إعادة بيع ديون. كلا من IDE الكسوف و ل NetBeans ، المفضلة ، وتوفير الدعم ممتازة. اعتقد انه ليس على نطاق واسع وهذا هو السقوط في غياهب النسيان لحقيقة أنه ليس الوحيد الذي قدمته إعادة بيع ديون IDE الخاص هي تلك التي وجدت ، وبأن الكتاب الذي شاع هذه التقنيات هو إعادة بيع ديون : تحسين تصميم البرمجية الموجودة . في ذلك هناك الكثير من القضايا الأخرى التي لم تنفذ من قبل أي IDE ، مرات عديدة على عدم السماح للمهمة التشغيل الآلي. انها تستحق نظرة فاحصة.
  3. مخضرم : يمكن للإدارة أن يبني مجمعا والخطأ محددة إذا لم يتم إدارتها بشكل جيد ، والتسليم في نهاية المطاف إلى منتج العميل لحظة حاسمة ، وتتويجا لشهور من التنمية مع أفضل الأدوات والتقنيات وأنت تريد أن تعطي الانطباع الصحيح. بالنسبة لي ، ومخضرم هو أداة لإدارة يبني من جهتي ، ويحصل على التخلص من عدد من المشاكل التي لا تريد أن تعرف التفاصيل ، ويعطيني سلسلة من التقارير عن الحالة الصحية للمشروع ، مثل تقرير اختبار التغطية ، الانضمام إلى اتفاقية تنسيق الرمز ، الخ ،... Javadoc ، جمعت كل جميل في موقع المشروع. كبيرة لإقناع مديرك.
  4. EasyMock : مثالي لاختبار وحدة يجب ان يكون وقتا المدى القصير جدا ، وميلي ثانية قليلة. إذا كنت تبدأ لإشراك قواعد البيانات ، والخدمات JEE منصة ، I / O بشكل عام ، وبرنامج حلقة مفرغة refactor - جبين يصبح بطيئا جدا ، ويتوقف اختبار مبرمج كنتيجة طبيعية. الاختبارات وحدة ينبغي أن يسمح لتشغيل عشرات المرات في اليوم. حيث ان EasyMock ، والتي تتيح لك استبدال أجزاء من النظام الخاص بك من قبل كائنات وهمية مع واجهة نفس الكائن الحقيقي ، والتحقق من أن النظام هو جعل المكالمات المتوقعة. السحر!
  5. DBUnit : وكيف شعبية الجداول ليتم استخدامها في اختبار الشامل للتجارب؟ هذه مهمة لDBUnit يسمح لك لإدراج وإزالة البيانات في الجداول أثناء دورة الاختبار الخاصة بك.
  6. HttpUnit : كان يعتقد لأول مرة لتمكين HttpUnit اختبار وحدة من تطبيقات الويب. مع ذلك يمكنك الوصول إلى URL ، وملء الحقول في النماذج وإرسالها ، والتحقق من الإجابة ، وأخيرا ، لمضاهاة مستخدم الإنسان. لقد تم مؤخرا إعطاء استخدام آخر لها ، كفاءة خدمات الراحة والتحقق من وصول البيانات استجابة. جيدة جدا.
  7. Liquibase : أنا من محبي هذا المشروع. من خلال اللعب مع روبي على القضبان ، وأنا مندهش حقا مع إدارة قواعد البيانات مخطط التغيير. لا يفعل ذلك من خلال النصوص الصغيرة التي تشكل جزءا من المشروع نفسه ، بما في ذلك تتبع إصدار مثبتة وقيد التشغيل إلا عند الضرورة مع كل تحديث جديد. عندما جئت أبحث عن شيء مماثل في العالم جاوة ، وعبر هذه المكتبة واستخدمت بنجاح في تطبيقات بلدي. كنت بناء ملفات XML مع التغييرات في البنك ، مع تحديد صاحب البلاغ والإصدار ، ومكتبة يعتني تحديث قاعدة البيانات عن طريق تطبيق سوى الفرق بين الإصدارات. أو يمكنك أيضا فقط في نهاية التكرار ، وتوليد ملف مع البرنامج النصي ليتم تنفيذها في بيئة التي تتطلب مزيدا من السيطرة من قبل ديسيبل. أوصي.
  8. الزئبقي : انا مستخدم منذ فترة طويلة CVS والتخريب. ولكن يتم توزيع أنظمة التحكم الإصدار هناك ، وإعطاء مجموعة جديدة كاملة من الاحتمالات ، بالإضافة إلى كونها سريعة للغاية. الزئبقي يستخدم داخليا من قبل المشروع ل NetBeans ، وهو مشروع كبير ، والعديد من عملياتها مثل يرتكب ، التحديثات ، وroolbacks ، بيانات الاختلاف لحظية تقريبا. وليس للقيام المستودع بأكمله ، والالتزام في موقع العملاء.
  9. P6Spy : فيرارا بسيطة جدا ومفيدة جدا ، وأشعر بالقلق لا يمكن ترقية منذ عام 2003. يسمح لك لمراقبة الاتصالات بين رمز الخاص بك وخادم قاعدة البيانات ، وتوصيله مباشرة الى الخادم الخاص بك ، وحدة الاختبار ، حيثما ينطبق ذلك على برنامج تشغيل JDBC. كبيرة لضبط ولحظات من اليأس التام.
  10. OpenEJB : أود أن أعترف أنني قضيت وقتا طويلا بعيدا عن المنصة التي كتبها JEE الصدمة لمواصفات EJB ، مفضلا دائما الخيارات التي سمحت لي لاختبار وخفة الحركة. في هذا الوقت كان المشروع باستخدام جدا أباتشي الصبار ، ولكن في الحقيقة ، ليست هي الشيء نفسه. وOpenEJB هو EJB الحاويات المستخدمة من قبل خادم الأباتشي جيرونيمو ، ولكن يمكن استخدامها في أي بورصة جوهانسبرج التطبيق ، في قائمة بذاتها أو واحدة مع القط ، أو في اختبار وحدتهم ، والسماح للاختبار JMS الرسائل غير المتزامنة ، EJBs عديمي الجنسية ، جليل ، المفرد ، خدمة الوقت ، في كل شيء ، باختصار كنت تتوقع من خادم حقيقي. انه لا يزال يجعل قرارات ذكية جدا لتسهيل استخدامها في الواقع وحدة الاختبارات ، مثل إنشاء datasources التلقائي ، وذلك باستخدام قاعدة بيانات HSQLDB في الذاكرة. بالرغم من وجود 3.1 في حاوية شحن EJB ، ومناسبة للاستخدام في التطبيقات المستقلة واختبار وحدة ، ويقول ان مواصفات مقدمي تحتاج فقط تقديم ملف EJB لايت ، الذي ، إذا كنت في حاجة إلى الراحة وأنا أحاول ألا وجدت في الوضع ، غير كافية.
  11. HSQLDB : وأفضل شيء لاجراء اختبارات وحدتك مع قاعدة بيانات ، بدلا من قاعدة البيانات التي تمكنك من إنشاء الجداول في الذاكرة فقط. هذا كل شيء ، البساطة.
  12. SeleniumHQ : أي شخص الذي حاول من أي وقت مضى لأتمتة الاختبار من واجهات المستخدم ، ونعرف انها ليست مهمة سهلة. واجهة المستخدم هو هدف متحرك ، من الصعب ضرب. أنا معجب حقا أولئك الذين يقترحون هذه المهمة النبيلة. تطوير واجهات ليس هناك شيء ، لكنني لعبت حوالي مع السيلينيوم ، وأعجبت جدا. لديه قدرات نفس اختبار الأدوات باهظة الثمن ، وتسجيل تفاعلها مع النظام ، والقدرة على تشغيل مجموعة اختبار نفسه على شبكة من الأجهزة مع تكوينات مختلفة من أنظمة التشغيل والمتصفحات. بالتأكيد ، من أجل التطبيق الخاص بك المقبل القاتل على شبكة الإنترنت ، يستحق كل هذا الجهد.
  13. نظام تثبيت السرعة : لمعرفة ما إذا كان رمز بسرعة إرسالها إلى المخزون لا يزال يعمل ، وتجنب كابوس مرحلة الاندماج ، لا شيء أفضل من مجرد أداة للتكامل المستمر. لقد عشت في هدسون و متوالية ، ولكن لا تزال مستمرة مع نظام تثبيت السرعة القديمة الجيدة. على الرغم من أنه من الصعب تكوين من الأشقاء الأصغر سنا ، ويسمح بمزيد من المرونة في التكوين الخاص بها ، ويحتوي على استقرار كبير. وأظل مهمتين المقرر : أ بناء بعد كل رمز الالتزام المستودع ، وبناء على موقع المشروع يوميا.
  14. JMeter :... وأخيرا وليس آخرا لا تدع الخاص الاختبارات الفنية لاحقا لماذا ، ولكنه قد يكون متأخرا جدا. خصوصا أداء الاختبارات. ويسمح لك JMeter لمحاكاة سلوك مئات المستخدمين المستعرة ضد تطبيقه ، والعثور على الاختناقات ، وحيث يتم إخفاء تلك التسريبات.

أبعد من أن تكون لائحة كاملة ونهائية ، هو قائمتي. وبطبيعة الحال ، واحد أداة هامة الأخير هو قليلا من الحس السليم ، وبعد كل شيء ، لا شيء من يحاول الحصول على 100 ٪ من التغطية الاختبار. قد يبدو مثاليا ، ولكن من المؤكد أنه من السذاجة. وتذكر دائما الكلمات الخالدة ديكسترا :

الاختبار يبين وجود ، وليس لعدم وجود البق.

المرجعية والاسهم
3 تعليق حتى الآن ، إضافة لكم

ارتفاع بلوق لمواطن من الدرجة الأولى

وأود أن أحذر جميع الذين يتبعون هذا بلوق أطرح مجرد أنها مواطن من الدرجة الأولى! بالنسبة لأولئك الذين اعتادوا على المجال www.architecteam.com.br / الشعب / الصريح / بلوق ، و www.architecteam.net / الشعب / الصريح / بلوق ، يمكنك الآن متابعة هذا بلوق في الوقت نفسه www.smallthoughts.com.br . أريد بلوق تنمو في الأهمية ، وهذا لا يمكن أن يحدث ذلك بينما كان معاملة سيئة. وسوف نستمر في العمل على عناوين أخرى إلى أجل غير مسمى ، ولكن إذا كان اهتمامك فقط هو اتباع بلوق ، وأنا أقترح عليك تحديث العميل الخاص لخدمة القارئ في المجال الجديد. لا امرنا.

المرجعية والاسهم
2 تعليق حتى الآن ، إضافة لكم

ترجمة كتاب أمثلة Pharo للبرتغالي!

في الأشهر المقبلة سوف تؤدي الجهود المبذولة لترجمة هذا الكتاب من قبل أمثلة Pharo للالبرتغالية ، مساهمتي قليلا لجعل هذه اللغة والبيئة أن كلا من الطعم المعروف من قبل الطلاب والناطقة بالبرتغالية المطورين ، الذين قد يشكل عقبة رئيسية أمام اللغة و لم تكن اللغة.

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

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

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

المرجعية والاسهم
مغادرة أول تعليق

الرصيد الثقافي يناير

وينبغي أن يكون هذا الشهر شهر شاذة ، ربما للشعور "عطلة" (على الرغم من عدم وجود لديه اجازة حقيقية...). أشعر بالذنب من قبل تقريبا نتيجة :

  • 13 فيلما
  • 1 الرحلة
  • 1 كتاب

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

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

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

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

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

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

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

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

تروا couleurs : الخمير . أشاهد كل TRILOGY من الألوان. هذا هو الماضي. فإنها قد رمي الحجارة على أولئك الذين الطوائف ، ولكن يجب أن تتحلى بالشجاعة لمشاهدة كل ثلاثة. حسنا ، جميل ، يظهر دائما الجانب الإنساني في والعاطفة الأنانية ، وفقدان ، والحب ، وجيش تحرير بلوشستان جيش تحرير بلوشستان جيش تحرير بلوشستان... ولكن بوصفها سلطة جيدة من الخس والتوفو هو صحي ولكن لا طعم له. فقط لا أنام لأني بين أولئك الذين يريدون معرفة أين يذهب الفيلم ، وحتى أسوأ. إذا كنت تريد إبهار أصدقائك ، والمضي قدما ومشاهدة! أو تحتاج إلى تطوير طعم لهذا النوع من الأفلام ، أو كل cinephiles يجتمعون في العجلات وكذب. حاولت أن أجد حلقة الوصل بين هذه الأفلام الثلاثة ، وفكرت : سيدة تبلغ من العمر أحدب في الخلفية ، والتي تسعى لوضع الزجاجات في سلة إعادة التدوير. انها لعبة تقريبا من أي شخص "أين والدو" رؤيته ، لذلك لا نعتقد يدعي شهدت ثلاثية دون قوله ان سيدة تبلغ من العمر. لا أقول إنني لم يخطر لك.

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

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

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

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

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

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

وحتى الشهر المقبل...

المرجعية والاسهم
مغادرة أول تعليق

الرصيد الثقافي ديسمبر

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

  • 2 الكتب
  • 5 أفلام

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

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

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

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

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

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

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

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

حتى الشهر القادم!

المرجعية والاسهم
2 تعليق حتى الآن ، إضافة لكم

تذكر أولئك الذين يفتقرون

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

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

وقد أثبت هذا مقتطف قليلا بالفعل عن قلقها لتحقيق الكمال في كل وسعيها لتحقيق التحسين المستمر كباحث.

يا لدي الكثير من الأشياء الجيدة للكتابة عن نفسي لأن هذا العملاق.

المرجعية والاسهم
مغادرة أول تعليق

حبوب منع الحمل في إرلانج -- ترجمة برنامج

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

لقد تم استخدام إيماكس لكتابة برامج بي في إرلانج ، فقد جو ألوان العناصر ويساعد على إغلاق الأقواس والعبارات كاملة.

لغات وظيفية هي العودية في طبيعتها ، ثم شيئا العالمي مرحبا ، لا شيء أفضل من أن تبدأ وظيفة العودية كمثال على ذلك. ماذا عن مضروب :

-module(lib).
-export([fac/1]).

fac(0) ->
    1;
fac(N) ->
    N * fac(N-1).

O código acima pode ser escrito num arquivo e compilado, e demonstra algumas coisas básicas da linguagem. Primeiro, todo comando deve terminar com um ponto ".". Na linha 1 e 2 estão algumas diretivas obrigatórias de todo código fonte, module e export . Toda diretiva de compilação começa com o sinal de "-". A diretiva module declara o nome do módulo deste arquivo. Em Erlang, cada arquivo é um módulo, ou seja, um conjunto coeso de funções. Normalmente se o módulo se chama "lib" como o exemplo, então o arquivo precisa se chamar "lib.erl", porque com esta convenção o compilador consegue encontrá-lo automaticamente. Em Erlang, uma lista de elementos é representada usando colchetes "[]" com cada elemento separado por vírgulas. Alguns exemplos de listas:


[3,78,2,7,3].
["hello", "world"].
[hello, world].

A primeira lista contêm 5 números inteiros, a segunda 2 cadeias de caracteres, e a terceira 2 átomos. Então como podemos perceber a segunda diretiva de compilação export recebe como argumento uma lista, onde cada elemento é o nome de uma função que o módulo exporta para uso externo e o número de argumentos. Em Erlang, funções com mesmo nome mas número diferente de argumentos são funções completamente diferentes. Toda função em Erlang precisa retornar algum valor.

Uma função em Erlang sempre tem o formato Assinatura -> CódigoParaExecução. A primeira parte determina o nome e os argumentos da função, enquanto a segunda contêm o que será executado. Em Erlang a execução de uma função sempre envolve comparação de padrões, e uma função pode declarar vários padrões separados por ";". Cada padrão é testado contra os argumentos, em sequência, até que algum se aplique ou caso contrário, é lançado um erro.

No caso do fatorial, o primeiro padrão é "fac(0) -> 1". Ao se chamar esta função com o primeiro argumento igual a zero, será retornado zero. O segundo padrão é "fac(N) -> N * fac(N - 1)". Ou seja, para qualquer valor de parâmetro diferente de zero, o segundo padrão é invocado, e faz uma chamada recursiva para a mesma função, até que o parâmetro seja igual a zero, e então é executado o código do primeiro padrão, e a recursão pára.

Ok, hora de compilar e executar esse código. Salve um arquivo com o nome "lib.erl" com o conteúdo acima e no mesmo diretório execute:

fbdo@Marvin:~/Projetos/Erlang$ erl
Erlang (BEAM) emulator version 5.5.5 [async-threads:0] [kernel-poll:false]

Eshell V5.5.5 (abort with ^G)
1> c(lib).
{ok,lib}
2> lib:fac(10).
3628800
3>

Como pode ser visto, invoquei o shell usando o comando "erl", compilei o código usando "c(lib)", recebi a mensagem de que a compilação teve sucesso "{ok,lib}" e então invoquei a função que acabei de compilar usando a convenção modulo:função "lib:fac(10)". E agora, para impressionar os amigos, que tal calcular o fatorial de 1000?


3> lib:fac(1000).
402387260077093773543702433923003985719374864210714632543799910429938512398629020592044\\
208486969404800479988610197196058631666872994808558901323829669944590997424504087073759\\
918823627727188732519779505950995276120874975462497043601418278094646496291056393887437\\
886487337119181045825783647849977012476632889835955735432513185323958463075557409114262\\
417474349347553428646576611667797396668820291207379143853719588249808126867838374559731\\
746136085379534524221586593201928090878297308431392844403281231558611036976801357304216\\
168747609675871348312025478589320767169132448426236131412508780208000261683151027341827\\
977704784635868170164365024153691398281264810213092761244896359928705114964975419909342\\
221566832572080821333186116811553615836546984046708975602900950537616475847728421889679\\
646244945160765353408198901385442487984959953319101723355556602139450399736280750137837\\
615307127761926849034352625200015888535147331611702103968175921510907788019393178114194\\
545257223865541461062892187960223838971476088506276862967146674697562911234082439208160\\
153780889893964518263243671616762179168909779911903754031274622289988005195444414282012\\
187361745992642956581746628302955570299024324153181617210465832036786906117260158783520\\
751516284225540265170483304226143974286933061690897968482590125458327168226458066526769\\
958652682272807075781391858178889652208164348344825993266043367660176999612831860788386\\
150279465955131156552036093988180612138558600301435694527224206344631797460594682573103\\
790084024432438465657245014402821885252470935190620929023136493273497565513958720559654\\
228749774011413346962715422845862377387538230483865688976461927383814900140767310446640\\
259899490222221765904339901886018566526485061799702356193897017860040811889729918311021\\
171229845901641921068884387121855646124960798722908519296819372388642614839657382291123\\
125024186649353143970137428531926649875337218940694281434118520158014123344828015051399\\
694290153483077644569099073152433278288269864602789864321139083506217095002597389863554\\
277196742822248757586765752344220207573630569498825087968928162753848863396909959826280\\
956121450994871701244516461260379029309120889086942028510640182154399457156805941872748\\
998094254742173582401063677404595741785160829230135358081840096996372524230560855903700\\
624271243416909004153690105933983835777939410970027753472000000000000000000000000000000\\
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\
000000000000000000000000000000000000000000000
4>

Uau, isso foi rápido. E o mais impressionante: este número gigante que no meu terminal ocupa 30 linhas e que foi calculado por uma função recursiva não estourou a pilha de execução, nem o tamanho da variável. Para pessoas que, como eu, têm mais experiência com C/C++ ou Java, é quase mágico o que acaba de acontecer. Mas as magias tem nome, e se chamam otimização da recursão em cauda e conversão implícita de tipos.

Em Erlang só existem dois tipos numéricos, o inteiro e o número de ponto flutuante. E eles nunca estouram porque não têm tamanhos fixos, e sim crescem enquanto houver memória disponível.

Para linguagens funcionais, a recursão é parte essencial, já que não existem operadores de laços. Então quase todas otimizam o quanto podem as chamadas recursivas, e no caso do fatorial a otimização é trivial, já que não existem operações a serem realizadas após a chamada recursiva, o que é chamado de recursão em cauda. O que a máquina virtual Erlang faz, ao invés de empilhar a chamada recursiva, é sempre substituir o endereço de retorno da função pelo endereço da função chamada, mantendo a pilha com tamanho constante. Nada de "StackOverflowException". É como se substituíssemos a função recursiva por uma interativa equivalente:


função fatorial(x: inteiro): inteiro
var i, aux: inteiro
inicio
aux <- 1;
para i de 1 até x faça
aux <- aux * i
fim_para
fatorial <- aux
fim

E por hoje chega de diversão com funções recursivas.

المرجعية والاسهم
Leave the first comment

E o reconhecimento de voz/imagem se tornam commodities...

Ao abrir minha Communications ACM deste mês, vi um artigo na sessão BLOG@CACM que me chamou a atenção. O artigo de Tessa Lau Hello Computer comentava sobre sua satisfação com seu novo GPS, um Garmin Nüvi 850. Não por simplesmente ser um excelente GPS, mas sim por ter uma interface ativada por voz.

Isso me fez lembrar de um pequeno projeto em que me envolvi com alguns amigos, a algum tempo, por nós chamado de projeto MONOH (MOmmy, NO Hands!). Resumindo, o objetivo do projeto era criar um plugin para a IDE Netbeans que fornecesse a capacidade da ativação por voz de alguns comandos normalmente acessíveis via teclas de atalho. Cá entre nós, e que ninguém nos ouça, confesso que a razão principal de investir neste projeto era, na época, a de poder ganhar o NetBeans Innovators Grants Contest , o que conseguimos com relativo sucesso. Eu acredito que um fator determinante para nossa vitória foi exatamente o fator coolness da proposta, afinal de contas todo mundo acha muito legal parar de usar o mouse e o teclado e começar a falar com a máquina. De uma forma geral, o que queremos mesmo é parar de ter que nos relacionar com todas as inúmeras máquinas que nos cercam no dia-a-dia usando a linguagem delas, para poder usar a nossa. Acabar de uma vez por todas com este problema de impedância.

O que me deixa mais chateado é ter que confessar também que todo o mérito pelo reconhecimento de voz do nosso projeto não é de ninguém da equipe, e sim do projeto Sphinx4 . Este projeto, apoiado pela Carnegie Mellon University entre outros, é um reconhecedor de voz escrito em Java, estado-da-arte, livre e open source . Nosso mérito foi o de estudar a API NetBeans, estudar a API do Sphinx4, e colar os dois. É assombroso a qualidade do que se tem hoje em dia na forma de software livre e open source . Ou seja, para fazer hoje um aplicativo que reconhece a voz, não é mais necessário um doutorado. Com tempo e paciência qualquer um pode impressionar seus amigos.

Outro exemplo de como o relacionamento homem-máquina tem melhorado, mas é quase bobagem mencionar, são essas máquinas fotográficas que temos hoje que somente batem a foto quando as pessoas focalizadas sorriem. Elas são quase banais, estão a venda em qualquer loja por preços acessíveis a qualquer mortal. Será que somente eu me assombro em como um simplório chip que cabe numa máquina fotográfica é capaz de fazer o reconhecimento de face, e determinar se alguém está sorrindo?!?!

E por último, um vídeo no YouTube também fez minha cabeça explodir. O mundo foi assolado pela febre do Wii, mas isso poderá ser nada comparado ao Project Natal . O Project Natal , que tem seu nome em homenagem a, pasmem, nossa cidade de Natal no Rio Grande do Norte graças ao brasileiro que comanda o projeto, leva a iteratividade a um outro patamar: não há controles! Somente você, balançando suas mãos e pernas na frente do console, tendo seus movimentos reproduzidos na tela. Droga, serei obrigado a comprar um XBox 360 (além de um PS3 quando sair o God of War III).

Tudo isso me faz ver que estamos no momento histórico onde aquelas inúmeras pesquisas que a décadas não passavam de estudo acadêmico estão chegando às prateleiras, estão aí nas ruas, não assombram mais ninguém. Provavelmente nossos filhos vão achar engraçado nossas histórias de como era usar uma bugiganga com 102 teclas e uma outra com 2 teclas que movíamos na mesa pra lá e pra cá para fazer nossos computadores nos entenderem. Finalmente estamos no ponto histórico onde estudos do guarda chuva de inteligência artificial, por muitos considerados distantes e áridos, viraram commodities , na mão de todo mundo, sem que ninguém nem precise saber o quão sofisticado aquilo na verdade é para poder usar, e poder usufruir.

Não espere mais, comece a falar com seu computador hoje! Ele um dia poderá entender.

المرجعية والاسهم
Leave the first comment

Erlang em Pílulas - Entrando e saindo do shell

Como muitas vezes é dito por Andrew Hunt, autor do livro The Pragmatic Programmer: From Journeyman to Master (recomendo!) é muito bom para todo programador aprender pelo menos duas novas linguagens por ano. Já a algum tempo tenho flertado com Erlang, e uma das razões é todo o alvoroço na comunidade de desenvolvedores a volta de linguagens funcionais, e outra pelos meus interesses em desenvolvimento de código paralelo e concorrente.

E é justamente nestes pontos em que Erlang mostra a que veio, e é por este motivo todo o alvoroço. Erlang foi desenvolvido nos laboratórios da Ericsson para o desenvolvimento de centrais telefonicas, num ambiente com requisitos de tempo real mais leves e alta disponibilidade. O fato de ser uma linguagem funcional faz ter uma característica muito comum em muitas linguagens funcionais: a ausência de efeitos colaterais em suas funções, não existindo, com isso, a necessidade da existência de mecanismos de sincronização para áreas de memória compartilhada. Existem primitivas na linguagem que permitem o desenvolvimento de software paralelo e concorrente de forma muito mais simples do que no mundo procedural das principais linguagens como Java, Python ou C/C++, usando passagem de mensagens, implementando o modelo de atores ( Actor Model ). Quem já teve que implementar um programa concorrente usando múltiplas threads sabe que não é uma das tarefas mais triviais. Mas isso tudo é muito bem explicado em qualquer sítio na internet sobre Erlang, o que eu gostaria mesmo é de demonstrar um pouco de como é desenvolver programas usando esta linguagem.

Primeiro, instale uma versão de Erlang na sua plataforma preferida. Eu uso linux/Ubuntu, então meus exemplos vão ter a cara desta plataforma. Ao executar o comando erl na linha de comando, você verá algo como isto:


Erlang (BEAM) emulator version 5.5.5

[/source]

[async-threads:0] [kernel-poll:false]

Eshell V5.5.5 (abort with ^G)
1>

Agora digite o seguinte:


1> 2 + 5.
7
2>

Primeira coisa a perceber é que o shell do Erlang numera as linhas conforme você dá entrada. Todo comando em Erlang deve terminar com ponto "." e um enter . Todo comando devolve alguma coisa, e ao digitar 2 + 5 ele corretamente devolveu 7.

Para terminar com o shell do Erlang, basta um Control-C. Você verá a seguinte saída:


BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
(v)ersion (k)ill (D)b-tables (d)istribution

Digite "a" para deixar o shell.

Outra forma de deixar o sistema, é digitando "halt()":


1> halt().
fbdo@Marvin:~$

Na próxima pílula de Erlang, vou falar um pouco sobre como compilar um programa nesta linguagem.

المرجعية والاسهم
3 comments so far, add yours

Usos de Computação Paralela e Distribuída em Computação Evolutiva

Evolution, from Man to Evolutionary Algorithms

Evolution, from Man to Evolutionary Algorithms

O texto abaixo foi apresentado pelo grupo Ariel Malves, Rodrigo Marques e Fabio Oliveira como trabalho final no curso de Algoritmos Evolutivos, sigla IA770, ministrado no Departamento de Engenharia da Computação e Automação Industrial da Universidade Estadual de Campinas (Unicamp).

Resumo: Os Algoritmos Evolutivos(AEs) têm se mostrado muito eficientes em diversos problemas extremamente difíceis de serem atacados por métodos mais clássicos, e por serem naturalmente paralelizáveis e necessitarem de muitos recursos computacionais, diversas técnicas estão sendo utilizadas para melhorar seu desempenho, elevando ainda mais a utilidade prática desta ferramenta. No entanto, muitas vezes a paralelização do algoritmo leva a alterações estruturais que mudam o seu comportamento comparado a um AE seqüencial, ou então aumentam mais ainda o leque já vasto de parâmetros para ajuste do mesmo. Pretendemos mostrar uma taxonomia dos AEs paralelos e distribuídos, suas principais diferenças, parâmetros e ganhos com relação aos seqüenciais, e construir um arcabouço para comparação do desempenho de um algoritmo representativo contra um semelhante porém seqüencial, demonstrando com um exemplo prático suas características.

Introdução

Os Algoritmos Evolutivos(AEs) mantêm uma população de possíveis soluções que competem entre si seguindo a metáfora da Teoria Evolutiva Moderna. Os operadores envolvidos em AEs para problemas não triviais precisam de muitos recursos computacionais, e por isso a busca por melhores técnicas para a melhora de seu desempenho, como o uso de computação paralela e distribuída.

Em geral, os operadores dos AEs como a recombinação e a mutação, e mesmo a avaliação do fitness , se concentram em um ou em alguns poucos indivíduos da população, tornando os AEs muito propícios a paralelização. Mesmo o operador seleção, que em geral avalia todos os indivíduos simultaneamente, e por isso mesmo seria um gargalo a paralelização, pode ser alterado para se adaptar melhor a este paradigma, ou então podemos nos ater a somente ao subconjunto das suas variantes que se utilizam da informação de poucos indivíduos, como por exemplo o operador torneio.

Normalmente, quando se aplica técnicas de paralelização, busca-se tão e somente diminuição do tempo necessário para a execução do algoritmo. No entanto, no caso de AEs, há evidências [ 1 ][ 2 ] não somente da redução do tempo necessário, mas também da maior manutenção da diversidade, da melhora na capacidade de busca de múltiplas soluções em problemas multi-modais, e na maior qualidade do resultado.

A melhora da qualidade do resultado merece uma discussão mais detalhada. Ao se executar um algoritmo usando N threads de execução ou então ao se executar em N nós (máquinas) diferentes em uma rede no caso de sua distribuição, pode-se esperar uma redução no tempo de execução proporcional a N. No entanto, esta expectativa idealizada é muitas vezes ingênua, já que tanto uma técnica quanto a outra dependem de instrumentos de comunicação e sincronização que no caso seqüencial não são necessários, e sobrecarregam a execução do algoritmo. Mas no caso dos AEs, ao se executar o mesmo algoritmo de forma seqüencial e de forma paralela até que encontrem uma solução de mesma qualidade, muitos experimentos têm mostrado uma melhora super linear do tempo de execução [ 3 ][ 4 ].

Taxonomia

De acordo com o trabalho de Erick Cantú-Paz [ 5 ], há três tipos principais de AEs paralelos:

  1. População única, mestre/escravo: A população é única como nos AEs seqüenciais, mas a avaliação do fitness é distribuída em múltiplos processadores. Como os operadores consideram a população inteira, também são conhecidos como AEs paralelos globais.
  2. População única, modelo celular: Muito utilizado em computadores massivamente paralelos, consiste de uma população estruturada distribuída. A seleção e a recombinação são restritas a uma pequena vizinhança, mas como há a sobreposição de vizinhanças, há iterações entre todos os indivíduos. Busca ter idealmente um único indivíduo por processo.
  3. Múltiplas populações, modelo ilha: Consiste em sub-populações que trocam indivíduos ocasionalmente. Esta troca de indivíduos é chamada migração. É o tipo mais popular por permitir o uso de hardware comum e acessível, porém não é completamente compreendido, e introduz mudanças fundamentais na operação dos AEs.

É claro que neste espectro, existem muitas abordagens híbridas, como por exemplo com arquiteturas combinando múltiplas populações com mestre/escravo. Estas abordagens híbridas são também chamadas de AEs paralelos hierárquicos.

Modelo Mestre/Escravo

O modelo mestre/escravo sugere que a cada geração o processo mestre contendo a população delegue a tarefa de cálculo do fitness para cada um dos processos escravos (ver figura 1) para então devolver esta informação para o mestre. Cabe então ao mestre, assim que todos os escravos retornarem suas informações, as tarefas de seleção dos pais para a próxima geração e criação de novos indivíduos utilizando operadores de recombinação e mutação. É uma técnica simples, que pode ser aplicada em problemas onde a avaliação do fitness no problema atacado seja computacionalmente onerosa.

Figura 1. Modelo Mestre/Escravo

Figura 1. Modelo Mestre/Escravo

Como a população é única e os operadores consideram a população total para atuar, esta é a técnica de paralelismo que mais se assemelha a abordagem clássica de um AE seqüencial e uma aplicação pouco cuidadosa dessa abordagem pode levar a uma imprecisa interpretação dos ganhos em desempenho ou precisão.

Entre o processo mestre e os escravos podemos ter uma comunicação síncrona, onde o mestre interrompe sua execução e aguarda que os escravos retornem a ele todos os resultados, mesmo que existam diferenças de desempenho entre os nós. Obviamente, este tipo de implementação resulta em tempo ocioso de máquina, aproveitando inadequadamente o hardware disponível.

Sempre temos duas comunicações entre mestre-escravo para cada nó adicional, primeiramente no envio da fração da população para avaliação e depois no retorno do fitness avaliado.

Este tempo de comunicação gasto proporcional ao número de escravos pode, dependendo da infra-estrutura utilizada, ser inclusive maior que o ganho efetivo de desempenho conseguido pelo paralelismo. Podemos então ver que quanto maior o número de escravos nesta topologia, melhor a distribuição da tarefa de avaliação de fitness e portanto menor tempo computacional gasto na mesma. Por outro lado, a mesma condição implica em um maior tempo gasto na comunicação entre mestre e escravos.

Este é um compromisso que depende do tempo necessário para avaliar um indivíduo, da quantidade de escravos utilizada e de constantes que dependem do hardware utilizado, mas sugere que existe um número ótimo de escravos que minimize este tempo de execução [ 6 ].

Uma implementação assíncrona pode ser considerada, embora perca um pouco da analogia e das características que assemelham o algoritmo a um AE seqüencial, introduzindo outros fatores que podem ser benéficos de acordo com a classe do problema minimizando os gastos com o tempo de comunicação.

Numa implementação assíncrona o mestre não esperaria pela resposta dos escravos, e trabalharia com as informações que estivessem disponíveis no momento. Cada escravo ainda teria uma fração de população a avaliar mas devolveria os valores de fitness assim que o processamento estivesse concluído. Neste caso a avaliação em um processador mais lento atuaria em gerações espaçadas de acordo com a velocidade do mestre.

Outros operadores como a recombinação e a mutação também são sugeridos como passíveis de execução paralela por terem as mesmas características de independência entre indivíduos, mas por serem operadores normalmente pouco custosos a perda com o aumento das comunicações entre mestre-escravo faz com que esta abordagem seja pouco promissora na maioria dos casos.

Modelo Celular

Um AE celular ou de paralelismo massivo é uma proposta que difere significativamente de um AE tradicional. Neste modelo temos uma população distribuída em uma rede, um indivíduo por nó, como por exemplo num espaço bidimensional, formando uma grade que limita as interações entre os indivíduos, permitindo apenas a interação entre elementos vizinhos (ver figura 2). Como vimos no caso mestre-escravo, existe um custo alto na comunicação entre nós, e esta abordagem só se mostra vantajosa com o uso de hardware específico, como computadores ou processadores massivamente paralelos.

Figura 2. Modelo Celular

Figura 2. Modelo Celular

Os operadores genéticos de seleção e recombinação ocorrem apenas entre indivíduos próximos. Por esta característica, e por representar cada indivíduo na forma de um processo independente interagindo com o meio, oferece uma metáfora mais próxima da real para pesquisadores interessados no estudo de vida artificial.

A forma de implementação varia de acordo com a aplicação de interesse, podendo ter regiões de vizinhança sobrepostas, estruturas multidimensionais, ou mesmo migrações distantes ou disseminação dos melhores indivíduos de forma que não se limitem apenas a sua vizinhança.

Podemos pensar no AE celular como sendo uma adaptação de um AE tradicional que tenha em paralelo componentes do algoritmo como seleção dos indivíduos para recombinação, a própria recombinação, mutação, e a avaliação de fitness . Neste caso o modelo muito se assemelha aos outros modelos propostos tendo um foco maior na topologia e na distância relativa entre os indivíduos.

Portando uma mudança fundamental no AE é remoção da seleção global dos pais para recombinação, limitando-os a vizinhança. O comportamento é alterado significantemente com novos resultados e novos parâmetros como o tamanho da população e as fronteiras de vizinhança, que assumem papel importante nesta abordagem, controlando inclusive a pressão seletiva do algoritmo.

A parametrização ainda contaria com a topologia da rede, os métodos de seleção, recombinação, mutação, tamanho da população e sua distribuição entre múltiplos processadores e número de novos indivíduos gerados a cada iteração, considerando seu espaço de atuação.

Modelo Ilha

A característica fundamental deste modelo é o uso de algumas poucas populações relativamente grandes e do operador de migração. Cada sub-população é processada por um nó e atua como se fosse uma população totalmente independente, mas de acordo com uma política de migração, recebe e envia indivíduos de/para outros nós, distribuindo as informações sobre as soluções candidatas até o momento (ver figura 3).

distribuido

Figura 3. Modelo Ilha

Experimentos considerando a razão de migração mostraram que para populações isoladas (sem migração), a qualidade do resultado final era pior do que o de uma única população. Para taxas de migração altas, a qualidade era igual a de uma única população.

O excesso de comunicação, da mesma forma como no caso mestre/escravo, degrada o tempo de execução do algoritmo. Existem também indícios de que existe para cada problema e tamanho da população, uma quantidade ideal de nós.

Olhando pela ótica da metáfora natural, pode-se dizer que o modelo ilha reproduz o comportamento e a comunicação entre ecossistemas separados por barreiras naturais, e o resultado se assemelha a teoria do equilíbrio pontual ( punctuated equilibria ) da biologia evolutiva [ 2 ], onde os diversos ecossistemas e seus organismos vivem em equilíbrio a maior parte do tempo, e a alteração do ambiente produz um rápido movimento evolucionário. O modelo ilha adiciona um novo operador de migração aos demais operadores clássicos, e este operador, ao trazer novos indivíduos a uma população estável, gera um impulso evolucionário semelhante. O aumento da capacidade de exploração deste modelo, a evolução de sub-populações isoladas e este mecanismo de perturbação por migração são as chaves para explicar referências apontando melhoras de desempenho super lineares [ 3 ].

A popularidade desse modelo advém da sua simplicidade, facilidade de implementação e possibilidade de aplicação em hardware acessível, como em uma rede de estações de trabalho comuns.

Este modelo ainda oferece muita área para estudo, com muitas questões ainda não respondidas, como por exemplo qual a melhor forma da topologia de rede, ou então qual a melhor taxa e o intervalo de migração.

Migração

Na maioria dos esquemas de migração, ela é síncrona, ocorrendo em intervalo constante. Nesta forma de implementação, todos os nós pulsam numa mesma geração, parando no ponto de sincronização onde ocorre a troca de indivíduos. Pode também ser assíncrono, e neste caso cada nó mantêm uma fila de indivíduos recebidos, numa metáfora de caixa postal, nunca tendo que aguardar o envio/recebimento de indivíduos para continuar com o processamento, perdendo-se com isso o conceito de geração da população como um todo. Alguns esquemas aplicam a migração somente quando a sub-população está próxima de convergir, restaurando a diversidade.

Aliás, uma questão recorrente é de quando deve ocorrer a migração. Ocorrendo muito cedo, os migrantes podem ter building blocks pequenos demais para influenciar a população. Ocorrendo tardiamente, cada nó pode perder diversidade e estagnar num ótimo local, também consumindo preciosos recursos computacionais.

Há referências de um esquema diferente desenvolvido [ 5 ], onde processadores escravos evoluíam suas sub-populações e enviavam seus melhores indivíduos para o mestre, e este então aplicava a seleção com viés para os melhores, e enviava os selecionados para os escravos. Mostrou aumento de desempenho super-linear.

Topologia de rede

A topologia da rede do modelo ilha determina o quão rápido ou quão devagar uma boa solução é disseminada para as demais populações. Também determina o custo de comunicação da rede.

Normalmente são usadas topologias estáticas, que são usadas do começo ao fim do algoritmo, mas já foram feitos experimentos com topologias dinâmicas, onde a migração é realizada entre populações de acordo com algum critério, como diversidade da população, ou então a distância genotípica entre populações, ou até mesmo de forma aleatória.

Híbridos

E, como não poderia deixar de ser, como com os demais parâmetros dos AEs seqüenciais, existe muito espaço para a criatividade em termos de topologias e hibridizações.

Na figura 4, podemos ver um modelo híbrido ilha/celular, onde computadores massivamente paralelos desenvolvem suas sub-populações de forma quase independente, trocando informações de seus indivíduos de tempos em tempos como no modelo ilha.

Figura 4. Modelo Híbrido Ilha + Celular

Figura 4. Modelo Híbrido Ilha + Celular

Já na figura 5 podemos ver um modelo híbrido ilha/mestre-escravo, onde cada nó do modelo ilha delega a tarefa do cálculo da função de avaliação para uma outra coleção de computadores.

Figura 5. Modelo Híbrido Ilha + Mestre/Escravo

Figura 5. Modelo Híbrido Ilha + Mestre/Escravo

E finalmente, na figura 6 uma possível configuração ilha/ilha, onde em cada nó do modelo ilha existe um outro modelo ilha, com uma rede mais densa e de maior velocidade.

Figura 6. Modelo Ilha + Ilha

Figura 6. Modelo Ilha + Ilha

Cada modelo e suas variantes sempre devem ser criados e parametrizados de acordo com o problema atacado, como já é hábito no modelo seqüencial.

Problema de Teste

Para confirmar os dados teóricos até agora expostos, realizamos alguns experimentos. E para tanto buscamos na literatura um problema conhecido usado para realizar a comparação entre as diversas implementações.

Usamos o problema subset sum como detalhado em [ 9 ]. O problema subset sum é NP-Completo, e tem diversas formas, entre elas as mais conhecidas são: dado um conjunto de números W = \ {w_1 ، w_2 ،...، w_n \} de n inteiros e uma constante M, encontrar um subconjunto V \ subseteq W tal que a soma dos elementos em V é igual a M. Esta versão é basicamente um problema de decisão. Já um problema de otimização seria o de encontrar V tal que a soma dos elementos em V se aproxime de M, sem nunca ultrapassá-lo. A segunda forma será a usada por nós em nossos experimentos.

Nossas instâncias do problema foram criadas com 100000 elementos que foram aleatoriamente escolhidos com distribuição uniforme no intervalo [0.10 ^ 6] . Como pode ser notado, nossa variante é maior do que descrito em [ 9 ], e isto foi feito propositalmente pois as instâncias na forma descritas não se mostraram desafiadoras tanto para o algoritmo seqüencial quanto para o distribuído, obrigando-nos a aumentar seu tamanho e usar o procedimento de criação descrito como inspiração.

Para podermos comparar a nossa implementação quanto a eficiência contra metodologias clássicas, implementamos também um algoritmo para cálculo exato e outro para cálculo aproximado dado um percentual de erro aceitável, como descrito em [ 10 ]. Como o algoritmo para cálculo exato precisa de tempo e memória exponenciais em relação ao tamanho do problema, e lembrando que no caso do subset sum estamos falando de 2 ^ ن possíveis subconjuntos, o algoritmo exato só é viável para instâncias muito pequenas. Em estações de trabalho típicas de hoje, fomos capazes de resolver instâncias com até 40 elementos, para instâncias maiores não houve memória suficiente. Já o algoritmo aproximado precisa de tempo e memória polinomiais, e resolveu uma instância com 10000 elementos em 68 minutos em uma estação de trabalho típica. Para uma instância de 100000 elementos, dois dias de execução não foram suficientes para se encontrar uma boa solução com o algoritmo aproximado.

Detalhes de implementação

De todos os modelos apresentados, escolhemos o modelo ilha para ser implementado, por ser bem diferente do AE seqüencial, e ao mesmo permitir a implementação em hardware facilmente acessível.

A representação escolhida foi de uma cadeia binária C com 100000 bits. Cada n-ésimo bit ativo indicava o uso do elemento n do conjunto original. Seja C = (\ مركزنا {X} = (x_1 ، x_2 ،...، x_ {100000})) e ف (\ مركزنا {س}) = \ sum_ {ط = 1} ^ {100000} w_i x_i , a função objetivo utilizada foi:

و (\ {س} مركزنا) = أ \ cdot ف (\ {س} مركزنا) + (1 -- أ) \ cdot \ lfloor (M -- 0.1 \ cdot ف (\ {س} مركزنا)) \ rfloor

onde (أ) 1 = quando \ مركزنا {X} é factível, i.e., quando م -- ف (\ {س} مركزنا) \ geq 0 , e على 0 = nos outros casos. Dessa maneira, o valor obtido como fitness é a própria soma do sub-conjunto representado por C, ou então o valor objetivo e uma penalidade de um décimo de ف (\ مركزنا {س}) para soluções infactíveis.

Para que obtivéssemos um maior controle do processo de seleção, usamos o operador de torneio para escolha dos indivíduos que iriam compor a lista de pais para criação de uma nova geração.

Importante também salientar que, no processo de seleção, os filhos substituem os pais em uma configuração (\ مو \ امدا) . Através de testes preliminares, fora constado que o tempo de convergência estava sendo excessivamente prejudicado pela perda de boas soluções, fato que nos motivou a implementar o operador de elitismo, que mantinha na população a melhor solução encontrada.

Na recombinação utilizamos o operador de crossover de pois pontos e a mutação pontual. A importância do operador de crossover em um AE distribuído não pode ser ignorado, especialmente quando se usa um operador de migração para disseminar a informação genotípica dos elementos através das ilhas.

Nesse experimento utilizamos o operador de migração para transportar os n melhores indivíduos de uma ilha para outra. A ilha receptora elimina seus n piores indivíduos para receber os migrantes. Nos testes, o valor que mostrou melhores resultados foi de n = 2.

A topologia implementada foi a anel com passagem de token . Cada ilha possui outra como destino de suas migrações, mas a todo momento apenas uma ilha pode realizar o processo de migração, exatamente aquela que possuir o token . O token é enviado a ilha alvo junto com os indivíduos migrantes. Essa topologia apresentou-se interessante pois conseguimos ajustar a periodicidade da migração para que ocorresse quando as ilhas já estivessem perto de, ou já estivessem entrado em um estado de equilíbrio, quando atingiam um máximo local.

O software desenvolvido para os testes foi dividido em dois componentes: o AE propriamente dito, realizando o processo de seleção, recombinação, mutação, migração, etc..., e um controlador, um componente que servia para registrar os nós (instâncias dos AEs), configurá-los remotamente, iniciá-los, finalizá-los e coletar dados estatísticos. Este segundo componente proporcionou uma grande versatilidade, possibilitando inúmeras execuções a fim de se testar diferentes parâmetros.

Vale ressaltar também que foram implementados outros operadores e topologias que não foram utilizados na execução final. Um dos operadores criados implementava um algoritmo greedy (guloso) que basicamente colocava os organismos em ótimos locais de maneira bem rápida. Tal operador pode ser muito interessante para resolver instâncias do problema subset sum cujo conjunto possua uma boa quantidade de números de pequena ordem, mas ineficaz para outros tipos de instâncias.

Como topologias adicionais, foram implementadas a dinâmica, onde cada ilha migrava organismos para outra escolhida de forma aleatória, podendo todas as ilhas efetuar o processo de migração de forma simultânea, e o anel sem passagem de token , que é a mesma que a topologia utilizada em nossos experimentos, porém possibilitando migrações simultâneas. Tanto uma como outra forma se mostraram densas demais, fazendo surgir um comportamento de população única.

Ambiente de testes

Foram utilizados 17 computadores, cada qual com CPUs de dois núcleos a 2,2 GHz e 2Gb de memória RAM.

Em cada computador executamos uma instância do AE (ilha). O fato dos computadores possuírem um núcleo adicional auxiliou o transporte dos indivíduos migrantes e do envio de estatísticas para o controlador, visto que essas operações foram concebidas de forma assíncrona, e em threads de execução separadas.

A rede local tinha a velocidade de 100 Mbits/s e cada computador estava ligado a um switch também de 100Mbits/s.

Análise

Para averiguar os ganhos obtidos com as técnicas de paralelização e distribuição descritas, comparamos os tempos de execução para a obtenção de resultados de mesma qualidade confrontando a versão paralela contra sua versão seqüencial com parametrização similar. Obtemos os resultados mostrados na tabela 1.

Execução Seqüencial Modelo Ilha
1 4m50s 2m03s
2 12m41s 2m04s
3 25m16s 1m15s
4 8m42s 1m12s
5 5m37s 0m42s
6 6m36s 0m29s
7 32m54s 0m25s
8 33m18s 0m32s
9 38m17s 1m25s
10 18m14s 0m59s
11 5m25s 1m11s
12 15m47s 1m11s
13 24m22s 2m28s

Nas execuções seqüenciais, a mais rápida execução obteve uma solução em 4m50s, e a mais lenta levou 38m17s. O tempo médio para obtenção de uma solução foi de 17m51s.

Para as execuções em paralelo temos um ganho considerável, onde a mais rápida execução concluiu em 25s e a mais lenta em 2m28s, com tempo médio de execução de 1m10s.

A análise dos resultados visivelmente satisfatórios leva ainda a um Speedup alcançado de 15.28 (praticamente linear), que é definido como sendo o tempo médio das execuções seqüenciais dividido pelo tempo médio das execuções paralelas, neste caso específico utilizando 17 nós.

Conclusões

Foi visto durante o experimento que múltiplas populações isoladas ajudam a manter a diversidade.

O operador de migração, ao disseminar a informação dos indivíduos de melhor fitness gera perturbações na ilha receptora, fazendo com que esta realize um salto para um novo ótimo local.

Foi observado que as sob-populações colaboram entre si para a fuga de máximos locais.

Foi constatado um aumento significativo no número de parâmetros do AE, o que dificulta ainda mais o acerto para um problema específico. O novo parâmetro de periodicidade de migração se mostrou fundamental para alcançar o resultado favorável.

Referências

[ 1 ] E. Alba and J. M. Troya, “An analysis of synchronous and asynchronous parallel distributed genetic algorithms with structured and panmictic islands,” in Parallel and Distributed Processing, ser. Lectures Notes in Computer Science. Berlin: Springer, oct 1999, pp. 248–256.
[ 2 ] T. Baeck, D. B. Foegel, and Z. Michalewicz, Eds., Evolutionary Computation: Advanced Algorithms and Operators, 1st ed. Dirac House, Temple Back, Bristol BS1 6BE, United Kingdom: Institute of Physics Publishing, November 2000, vol. 2, ch. 15, 16, 26, pp. 101–124; 125–133; 253–263.
[ 3 ] S. R., “Parallel genetic algorithms,” in Proceedings of the Fifth International Conference on Genetic Algorithms. San Mateo, CA: Morgan Kaufmann, 1993, pp. 334–341.
[ 4 ] “Speedup,” 2009. [Online]. Available: http://en.wikipedia.org/wiki/Speedup
[ 5 ] E. Cant ́ -Paz, “A survey of parallel genetic algorithms,” Calculateurs Paralleles, vol. 10, 1998.
[ 6 ] ——, “Designing efficient master-slave parallel genetic algorithms,” Illinois Genetic Algorithms Laboratory, University of Illinois at Urbana-Champaign, Tech. Rep. 97004, May 1997.
[7] ——, “Efficient and accurate parallel genetic algorithms.”
[8] X. Li and M. Kirley, “The effects of varying population density in a fine-grained parallel genetic algorithm.”
[ 9 ] M. Jelasity, “A wave analysis of the subset sum problem,” in Proceedings of the Seventh International Conference on Genetic Algorithms, T. Baeck, Ed. San Francisco, CA: Morgan Kaufmann, 1997, pp. 89–96.
[ 10 ] T. H. Cormen, C. E. Leiserson, R. L. Rivest, and C. Stein, Introduction to Algorithms, 2nd ed. Cambridge, Massachusetts 02142: MIT Press, 2001, pp. 1043–1049.

المرجعية والاسهم
One comment so far, add another