Mes outils préférés pour le développement agile

Après quelques années dans cette industrie, et si vous, comme moi, un fan de techniques agiles de développement logiciel et qui s'adonne à des tests (tests, les tests, les tests !!!), la simple collecte d'une série d'outils, les bibliothèques et les langues pour faciliter leur travail. J'utilise les personnes réunies ici souvent et se souvenir de ceux qui ont utilisé pour une raison particulière, ils sont dans ma ceinture d'utilité:

  1. JUnit : J'ai commencé par le plus évident, le père de tous. Sauf si vous avez été cachés dans un bunker anti-nucléaire pour l'année écoulée, avez-vous entendu, ou ont utilisé des tests unitaires. Si vous êtes vraiment chanceux, pourrait même avoir joué Test Driven Development. En fait, une bonne référence sur le sujet est Test Driven Development: By Example .
  2. Refactoring : Ok, ok, je vais arrêter avec les lieux communs, mais vous ne pouvez pas parler de développement agile, sans un bon IDE qui permet de refactoring. Tant l'IDE Eclipse et le NetBeans , mon préféré, fournissent un excellent soutien. Je pense que ce n'est pas très répandue et qui est de tomber dans l'oubli le fait que non seulement fourni par votre refactorisation IDE sont celles qui existent, et que le livre qui a popularisé ces techniques a été le Refactoring: amélioration de la conception du code existant . En lui il ya tant d'autres qui ne sont pas mises en œuvre par toute IDE, à plusieurs reprises de ne pas laisser la tâche d'automatisation. Il vaut la peine d'examiner de près.
  3. Maven : La gestion de builds peuvent être complexes et d'erreur liée si elle n'est pas bien gérée, et finalement la livraison au produit du client est un moment crucial, l'aboutissement de plusieurs mois de développement avec leurs meilleurs outils et techniques et vous voulez donner une bonne impression. Pour moi, le Maven est un outil de gestion construit de mon choix, de se débarrasser d'un certain nombre de problèmes qui ne veulent pas connaître les détails, et me donne une série de rapports sur la santé du projet, tels que le rapport de couverture de test, adhésion à la Convention de formatage du code, Javadoc, etc ..., tous rassemblés dans un beau site du projet. Grande pour impressionner votre manager.
  4. EasyMock : Idéalement, l'unité de test doit avoir un temps très court terme, de quelques millisecondes. Si vous commencez à impliquer des bases de données, les services de la plate-forme JEE, I / O en général, le programme boucle de rétroaction refactoriser-front devient très lent, et le programmeur s'arrête tests comme un résultat naturel. Tests unitaires devrait permettre d'exécuter des dizaines de fois par jour. C'est là que le EasyMock, qui vous permet de remplacer des parties de votre système par des objets faux avec la même interface que l'objet réel, et de vérifier que le système est à effectuer les appels attendus. Magique!
  5. DBUnit : Et comment les tableaux populaires pour être utilisé dans la masse d'essai du test? C'est une tâche pour le DBUnit vous permet d'insérer et supprimer des données dans les tables pendant votre cycle de test.
  6. HTTPUnit : le HTTPUnit a d'abord pensé pour permettre les tests unitaires d'applications web. Avec elle, vous pouvez accéder à une URL, remplir les champs des formulaires, envoyer, cocher la bonne réponse, enfin, d'émuler un utilisateur humain. Récemment, j'ai été de donner une autre utilisation pour elle, un accès efficace Reste services et vérifier les données de réponse. Très bon.
  7. Liquibase : Je suis un fan de ce projet. En jouant avec Ruby on Rails, j'ai été vraiment étonné par la base de données de gestion de changement de schéma. Elle le fait par de petits scripts qui font partie du projet lui-même, y compris le suivi de la version installée et fonctionne uniquement nécessaire à chaque nouvelle mise à jour. Pour trouver quelque chose de semblable dans le monde Java, je suis tombé sur cette bibliothèque et l'ont utilisé avec succès dans mes applications. Vous construisez des fichiers XML avec des changements dans la banque, identifié avec l'auteur et la version, et la bibliothèque se charge de mettre à jour la base de données en appliquant uniquement la différence entre les versions. Ou vous pouvez également juste à la fin d'une itération, générant un fichier avec le script doit être exécuté dans un environnement qui nécessitent plus de contrôle par un DBA. Je recommande.
  8. Mercurial : Je suis un utilisateur de longue date de CVS et Subversion. Mais les systèmes de contrôle de version sont distribuées là-bas, et de donner une toute nouvelle gamme de possibilités en plus d'être extrêmement rapide. Mercurial est utilisé en interne par le projet NetBeans, un grand projet, et plusieurs de ses opérations telles que s'engage, mises à jour, roolbacks, diffs sont quasiment instantanées. Et rien à porter la totalité du référentiel, et à s'engager sur le site client.
  9. P6Spy : Ferrara trop simple, utile, aussi, je suis soucieux de ne pas être mis à niveau depuis 2003. Permet de surveiller les communications entre votre code et le serveur de base, branché directement dans votre serveur, l'unité de test, où s'applique un pilote JDBC. Idéal pour tuning et des moments de désespoir total.
  10. OpenEJB : Je dois avouer que j'ai passé beaucoup de temps loin de la plateforme JEE par un traumatisme à la spécification EJB, préférant toujours les options qui m'a permis de tester et d'agilité. A cette époque le projet était en utilisant très Apache Cactus , mais vraiment, ce n'est pas la même chose. Le OpenEJB est le conteneur d'EJB utilisé par le serveur Apache Geronimo , mais peut être utilisée dans n'importe quel JSE demande, dans un autonome ou avec Tomcat, ou dans leurs tests unitaires, permettant notamment de tester des messages asynchrones JMS, EJB Stateless, Stateful, Singleton, Time Service, bref, tout ce que vous attendez d'un vrai serveur. Il fait encore des décisions trop intelligent pour effectivement faciliter son utilisation dans les tests unitaires, telles que la création automatique de sources de données, en utilisant la base de données en mémoire HSQLDB. Malgré l'existence dans les conteneurs EJB 3.1 livré, adapté pour une utilisation dans des applications autonomes et les tests unitaires, les spécifications indique que les prestataires doivent seulement fournir le profil EJB Lite, qui, si vous avez besoin du reste que j'essaie de ne pas trouvés dans le profil, est insuffisante.
  11. HSQLDB : Et rien de mieux pour vos tests unitaires avec une base de données, plutôt que d'une base de données qui vous permet de créer des tables en mémoire seulement. Voilà, simple que cela.
  12. SeleniumHQ : Quiconque a déjà essayé d'automatiser les tests d'interfaces utilisateur, sachez que ce n'est pas une tâche facile. L'interface utilisateur est une cible mouvante, difficile à atteindre. J'admire vraiment ceux qui proposent cette noble tâche. Développer les interfaces il n'est pas mon truc, mais j'ai joué autour avec du sélénium, et a été très impressionné. Il a les mêmes capacités que de tester des outils coûteux, comme l'enregistrement de leur interaction avec le système, et la capacité à exécuter la suite même test sur un réseau de machines avec différentes configurations de systèmes d'exploitation et navigateurs. Assurément, pour votre prochaine killer app web, en vaut la chandelle.
  13. Cruise Control : Pour en savoir rapidement si le code envoyé au référentiel est encore en activité, et d'éviter le cauchemar de la phase d'intégration, rien de mieux qu'un outil d'intégration continue. J'ai connu l' Hudson et le Continuum , mais toujours continuer avec le Cruise Control bonne vieille. Bien qu'il soit plus difficile à configurer que leurs frères et sœurs plus jeunes, permet une plus grande flexibilité dans sa configuration, et possède une grande stabilité. Je garde deux tâches programmées: une construction après chaque code s'engager dans le référentiel, et la construction du site du projet quotidienne.
  14. JMeter : Et le dernier mais non le moindre ... Ne laissez pas vos tests fonctionnels pour plus tard pourquoi, mais il peut être trop tard. Surtout les tests de performance. Le JMeter vous permet de simuler le comportement de centaines d'utilisateurs qui fait rage contre son application, et de trouver les goulots d'étranglement et où ces fuites sont cachés.

Loin d'être une liste complète et définitive, c'est ma liste. Et bien sûr, un dernier outil important est un peu de bon sens, après tout, rien d'essayer d'obtenir une couverture de test dans 100%. Cela peut sembler idéale, mais elle est certainement naïf. Et toujours se rappeler les mots immortels de Dijkstra:

Les tests montrent la présence, non pas l'absence de bugs.

Bookmark and Share
3 commentaires jusqu'ici, ajouter les vôtres

Blog élevée à des citoyens de première classe

Je tiens à avertir tous ceux qui suivent ce blog je viens de faire un citoyen de première classe! Pour ceux qui sont habitués au domaine www.architecteam.com.br / personnes / Frank / blog , et le www.architecteam.net / personnes / Frank / blog , vous pouvez maintenant suivre ce blog à la même www.smallthoughts.com.br . Je veux le blog de croître en importance, et cela ne pourrait pas arriver alors qu'il était si mal traitée. Je vais continuer à travailler les autres adresses indéfiniment, mais si votre seul intérêt est de suivre le blog, je vous suggère de mettre à jour votre lecteur de flux clients vers le nouveau domaine. Pas pressé.

Bookmark and Share
2 commentaires jusqu'ici, ajouter les vôtres

Traduire le livre par les exemples du Pharo pour le portugais!

Dans les prochains mois je vais diriger l'effort de traduire le livre par des exemples du Pharo pour les Portugais, ma petite contribution pour faire de cette langue et l'environnement que les deux goûts mieux connu par les étudiants et de langue portugaise développeurs, qui peuvent avoir comme un obstacle majeur à la langue et pas la langue.

Je crois que la fois l'environnement et de la langue est complètement différent de tout ce que nous avons dans l'environnement de l'entreprise, et bien que beaucoup des idées soulevées dans cet environnement ont plus de 30 ans, est toujours un environnement stimulant pour rester en contact.

Comme tout le code est ouvert et en Smalltalk, tout est accessible et capable d'être changé. Tout est objet. Chercheurs principaux dans des langues, des compilateurs et génie logiciel de test de leurs premières idées dans ce milieu et ses variantes, comme avec les tests unitaires, la programmation orientée aspect, et autres fermetures. Votre communauté est certainement passionnant et qu'il a à dire.

J'ai créé une nouvelle page de garder à jour avec le résultat partiel du travail de traduction. Toute personne qui veut contribuer, se sentent invités. Sont tous les bienvenus.

Bookmark and Share
Laissez le premier commentaire

Équilibre culturel Janvier

Ce mois-ci devrait être un mois atypique, peut-être pour le sens de «vacances» (en dépit de ne pas avoir eu de vraies vacances ...). Je suis presque un sentiment de culpabilité par le score de:

  • 13 films
  • 1 voyage
  • 1 livre

En commençant par les films, quelque chose comme un ordre chronologique ... J'ai vu Norbit , et a donné quelques bons rires ... J'ai pensé que ce serait un gros gâchis, mais c'était une bonne merde. Drôle. L'histoire d'un pauvre orphelin qui découvre l'amour de sa vie à l'orphelinat, mais perd bientôt une chance et le destin d'une femme géante, laid colle sur elle, et ne croient qu'une vie d'humiliation et de soumission est ce qu'il mérite. Mais bientôt son amour autour de la ville, plus belle que jamais, mais avec quelques problèmes que le chevalier aura pour contribuer à résoudre. Beaucoup de blagues au sujet de sa femme et ses frères géants tyrans, politiquement incorrect contre les gens gras et noirs. Prenez un grand seau de pop-corn et regarder sans compromis.

El Orphanato est plus un morceau riche avec la participation de pas plus, pas moins de Guillermo del Toro . Un thriller à être collé sur la chaise, tenant la main de sa femme / copine / whatever. Sans recourir à gore et de monstres, parvient à surprendre et ravir ceux qui sont fatigués du genre. Il a un goût d' El Laberinto del Faun , où le réel et l'imaginaire sont confondus perdu dans l'imagination enfantine. Je recommande fortement ce doit être une partie de la culture générale de l'amant film entier digne de ce nom!

007 Casino Royale . Mon père possède une collection très complète de tous les anciens 007S, et mes favoris sont avec notre ami Sean Connery. Après avoir visionné plus tard avec Pierce Brosnan, honnêtement, j'étais fatigué de la surdose de séquences d'action complètement improbable et irréel, où James Bond était pratiquement un super-héros dont le super-pouvoir a été la chance infinie. L'accent a également été n'est plus l'histoire, de souligner l'attirail électronique qui je le jure, j'ai été excité dans les vieux films, mais a commencé à être irrité par l'excès. Je pense que les administrateurs ont capturé ce mécontentement des fans, et a créé un film d'action grand, plus brut, où Bond est blessé, tombe, prend une raclée, c'est mal, et ne fait bien que par leurs capacités plutôt que sur leurs gadgets de haute technologie. Thumbs up! Popcorn dans la veine!

Final Fantasy VII: Advent Children . Je suis un amoureux de la saga de jeu vidéo RPG Final Fantasy toujours d'excellente qualité et des graphismes époustouflants. J'ai joué sur l'ordinateur sans le Final Fantasy VII toutefois terminer la partie. Travailler, toujours travailler. Quand j'ai vu ce titre dans la location, la nostalgie a éclaté, et je voulais regarder cette longue basé sur le jeu. En fait, l'histoire va plus ou moins comme un prolongement des événements du jeu dans le même environnement et avec les mêmes caractères. Malgré les excellents graphismes (ok, nous donnons toujours les bonnes proportions en fonction du temps de production, ne vous attendez pas un avatar ...) l'histoire est ennuyeuse, pas de sensations fortes, ne pas garder un bon rythme, des dialogues ennuyeux ... Enfin, ennuyeux. Une déception. Si vous êtes nostalgique et comme une infographie et n'ont rien de mieux à faire, aller voir, sinon passer.

Slumdog Millionaire . Ou en portugais, Qui veut gagner des millions? Un pauvre Indien commence à régler les questions d'un programme comme le nôtre jeu Million, et est arrêté sur des soupçons de tricherie. Et commence alors à raconter son épopée, et que vous connaissez la réponse à toutes les questions, et pourquoi ils y participent: la recherche de l'amour de sa vie. Le film a une image très belle, son histoire est très belle, mais d'en entendre parler, s'attendait à plus. Mais n'oubliez pas de regarder, il est certainement un film qui fait la différence.

Kalifornia . Un autre film où Brad Pitt tente de montrer que non seulement sert à des rôles de bourreau des cœurs. Et il peut. Un film fascinant où un couple commence leur voyage vers la Californie, derrière matériel pour un livre sur les tueurs en série. Et ils constatent que leurs manèges sont, eux-mêmes, des tueurs de sang-froid. Un thriller inquiétant, plus d'une question qui nous rend la nature humaine. Recommandé à des amis.

Le Dernier roi d'Ecosse , un film qui a donné l'Oscar du meilleur acteur pour Forest Whitaker, président de l'dictateur ougandais Idi Amin Dada. Je pense que le film est pseudo-historiques, les libertés poétiques avec le besoin, mais de toute façon est aussi un excellent film, montrant également la réalité troublante a toujours vécu sur le continent africain. Très bon.

Jusqu'à , High Adventure! Qui a dit bande dessinée est juste pour les enfants? Depuis quelque temps déjà les grands studios savent que la vraie formule de la réussite d'une animation est de faire participer le public et l'enfant devenu adulte. J'ai mes doutes si elle était bien équilibrée en haut, je pensais que le script est très apprécié par un adulte qu'un enfant. Bien sûr, il ya des scènes ridicules et drôles pour faire rire les enfants, mais en quantités beaucoup plus petites que, par exemple, Ice Age ou Les Indestructibles . Certes, beaucoup de plaisir à regarder, avec des scènes qui composent un certain nœud est-ce que vous appelez un cœur sec. Vaut la peine.

Trois couleurs: Rouge . Je regarde toutes les TRILOGIE DES COULEURS. Ceci est le dernier. Ils peuvent jeter des pierres sur ceux qui sont cultes, mais faut avoir le courage de regarder tous les trois. Bon, beau, montrant toujours le côté humain de la passion, l'égoïsme, l'amour, la perte, et bla bla bla ... mais comme une bonne salade de laitue et le tofu est sain, mais sans saveur. Il suffit de ne pas dormir parce que je suis parmi ceux qui veulent voir où le film va, même le pire. Si vous voulez impressionner vos amis, allez-y et regardez! Ou besoin de développer un goût pour ce genre de film, ou tous les cinéphiles se rassemblent dans leurs roues et ont menti. J'ai essayé de trouver une liaison entre les trois films, et j'ai pensé: bossus vieille dame dans le fond, qui tente de mettre les bouteilles dans le bac de recyclage. C'est presque un jeu de "Où est Charlie», il voit, il ne faut pas croire quelqu'un qui prétend avoir vu la trilogie sans dire que la vieille dame. Ne dites pas que je ne t'ai pas prévenu.

Tous sobre mi madre . Et bienvenue dans le monde d'Almodóvar! Et en parlant du droit d'auteur du film, un gars qui est ici chaque film est une invitation pour une promenade dans sa tête. J'ai peur de lui. J'ai vu des films avec des hommes homosexuels, les travestis, les prêtres qui violent les petits garçons, des nonnes travesti qui tombent enceintes et attraper le sida ... Qu'est-ce tordus petit monde. Mais vous ne pouvez pas nier que le gars sait comment raconter une histoire et lui montrer l'humanité de ses personnages, souvent dans des situations extrêmes. Ce film n'est pas différent. Mais je sais que beaucoup de gens qui n'auraient pas l'estomac pour le regarder, alors allez avec prudence. C'est la plus grande claque dans le style Almodovar visage.

Gran Torino . Que puis-je dire à propos de Clint Eastwood? Je pense que le monde a perdu un acteur discutable, mais a gagné un réalisateur / producteur / scénariste de la première. Ses histoires sont simples, d'attaquer les questions controversées comme l'euthanasie dans Million Dollar Baby , une vision plus humaine des vaincus dans les Lettres d'Iwo Jima , et ce, sur les erreurs causées par des préjugés raciaux. Je ne sais pas pourquoi, a eu une mauvaise impression du scénario, je pensais que Clint serait le méchant, mais il est difficile de ne pas s'attacher à l'badassmotherfucker vieillard plus que le cinéma ait jamais vu. Je recommande!

Le dernier film Star Trek m'a donné l'impression, corrigez-moi trekkeurs sur le devoir, d'être un film bien digne de ce nom. J'ai le plus grand nombre dans mon compte, en dépit de ne pas aller au cinéma porter des oreilles pointues ... J'ai aimé le rythme, j'ai bien aimé l'action, et toutes les références à la série TV. Sans parler de la joie de voir mes héros, les adolescents, et le début de tout. Film + popcorn plaisir à coup sûr!

Paris, je t'aime . Que puis-je dire ... Film français à être peu nombreux, et j'exclus du groupe. Dans ce film, un groupe de réalisateurs de renom racontent des histoires d'amour à Paris. Très bon film pour les agences de voyage ou si vous envisagez d'aller à la capitale du monde plus beau, mais pas si vous voulez plaisir. Cinéphiles Sado maso, ceci est pour vous.

Et il arrive un film, je crois que j'ai exagéré ce mois-ci, j'ai besoin d'en savoir plus et passer moins de temps devant l'écran ... Tous bien pour compenser, j'ai fait mon premier voyage grosse moto, à travers Jaguariúna, Quarry, Amparo et enfin, de la Montagne Noire. Ce voyage a généré de bonnes photos , et m'a montré qu'il était prêt pour les longs trajets. En fait, nous n'avons vu en passant autant Jaguariúna Amparo, a même cessé de carrière et de la Montagne Noire. Carrière a toutes sortes de produits artisanaux faits de ... pierres (verre, porcelaine, en pierre ollaire, du fer), et de l'artisanat en bois et objets décoratifs. Bien que n'étant pas, comme les foires d'artisanat, le matériel était vraiment très sympa et bon marché, et malgré le peu de place, juste apporter un lustre là, en fer en forme de tulipe. C'est une table basse. Black Mountain est une ville à fort potentiel touristique, ils m'ont dit d'être une ville romantique. Je ne sais pas si à un moment donné ou par ignorance, j'ai manqué de voir la beauté plus naturelle, il était mon attente. Même ainsi, suivie d'un bitume routier secondaire, puis la terre, et d'arriver à une propriété particulière, qui, malheureusement facturé pour les visiteurs d'avoir accès à Cascade des rêves ... Il valait le déplacement.

Et enfin, pour mettre fin au programme culturel, lisez pensée pragmatique et l'apprentissage: Refactor Votre Wetware (Pragmatic Programmers) . Dernièrement, j'ai été attiré par le thème de l'auto-compréhension et d'accéder à de nouvelles façons créatives de penser. Je suis un homme d'exacte, j'ai été formé à la pensée logique, analytique et non de faire des erreurs (ou au moins me pousser ...). Mais à cette date tardive, certaines de mes activités ont perdu leur couleur et de saveur, comme si la vie était un grand goûter de la restauration rapide fade. Ce livre suggère que pour atteindre de nouveaux niveaux de productivité, nous exatóides, nous devons développer notre créativité et permettre à nos modes de pensée et d'apprentissage impliquent à la fois la pensée analytique et logique, comme holistique et créative. Pour beaucoup, il peut sembler un bla bla bla de l'auto-assistance livre, mais j'ai décidé de vaincre mon scepticisme et a commencé à pratiquer le dessin comme un hobby. J'ai commencé à lire un livre qui faisait partie de la référence: le nouveau dessin est du côté droit du cerveau , et nous allons voir où je vais. Après tout, la spécialisation de la machine, et les fourmis.

Et avant le mois prochain ...

Bookmark and Share
Laissez le premier commentaire

Équilibre culturel Décembre

Je vais essayer de commencer une saine habitude que j'ai vu sur certains blogs, le bilan du mois culturel. Ce mois a été très faible, le score est de:

  • 2 livres
  • 5 films

J'ai commencé à lire le modulaire Java: Création d'applications flexibles avec Spring et OSGi (Pragmatic Programmers) , un livre sur la modularisation des applications utilisant le framework OSGi. J'ai trouvé le livre très bon, a de nombreux conseils pratiques, il enseigne les avantages du modèle et n'est pas un livre fait pour annoncer un acteur majeur dans la région, comme le diabète ou le framework Spring Equinox. Il montre toutes les options et la façon de migrer d'une application à l'autre. J'ai commencé à travailler sur un de mes projets, afin de tester ces idées, comme je suis très traumatisée par le poids des solutions utilisant des serveurs JEE et long travail uniquement avec des techniques et des cadres qui me permettra plus de flexibilité et de testabilité.

J'ai aussi lu, en fait, très rapidement, car il est très facile à lire, le livre Le programmeur passionné: Création d'une carrière remarquable dans le développement logiciel (Vie pragmatique) , partie de la collection de Bibliothèque pragmatique, qui a une excellente le livre le plus célèbre The Pragmatic Programmer: Du compagnon au maître . Ce livre est presque un livre d'auto-assistance pour les programmeurs, les personnes ayant un biais techniques qui ont perdu la foi dans sa profession. Je n'aime pas particulièrement l'auto-assistance des livres, généralement la seule personne qu'ils aident les auteurs sont eux-mêmes, mais cela en particulier a attiré mon attention immédiatement. Peut-être parce qu'elle est une période de réflexion collective, ou j'ai personnellement dans mon moment de réflexion, ce livre apporte quelques truismes qui sont bonnes à entendre des autres, et quelques autres choses pas si évident. Il incite le lecteur à réfléchir sur votre carrière, vos décisions sur elle, et quels chemins à suivre si vous voulez une carrière fantastique ce que vous aimez, et pas seulement apporter du riz et des haricots à la table de tous les jours. Je recommande!

Passant à des films, certains bons et d'autres moins bons. Enfin, après tout le monde, regardé Transformers: Revenge of the Fallen . Très bien! Pour les nostalgiques comme moi, qui a grandi en regardant les dessins, un presentaos, battant robotique d'excellente qualité, d'excellents effets, tout bon. L'histoire est une sorte de mauviette, et le battre, mais alors quoi? C'est popcorn et amusant pour ceux qui aiment un certain style. Il a même une scène avec une petite série de robots qui se réunissent pour créer un robot plus grand et plus complexe, qui a tout à voir avec les matériaux que j'ai vu le maître en intelligence et en essaim robotique conférence. Jetez un oeil à ce vidéo et les associés et voir ce que je veux parler.

Ce mois-ci a également vu le film Solaris , une vedette de science-fiction, étonner, George Clooney. Honnêtement, mes sentiments sur ce film étaient un peu confus. Le script est bon, mais donne l'impression que pourrait être mieux exploitée. Il a un soupçon de Bienvenue à Gattaca , un film que j'aime, dans le sens où il s'agit d'un film de fiction sans effets spéciaux à gros budget, puis se concentre sur l'histoire. Et avoir assez de Sphère , un autre film tout à fait comme cela, sur le scénario. Mais George Clooney n'a pas convaincu une fiction, il est préférable de continuer en tant que médecin dans ER ou dans de nombreux films d'action d'autres faits. Placez l'extrémité de votre liste.

Aussi regardé Yes Man , et ne fait que confirmer mes impressions plus tôt, je préfère faire comédie où Jim Carrey n'a pas à grimace. Bonne petit film, mais faible, je préfère Bruce tout-puissant ou Me, Myself & Irene Jim la BD ou des illustrations Eternal Sunshine of Spotless Mind , qui est Jim, mais explore sa veine dramatique. Si le magasin de vidéo et n'ont rien de mieux que vous pouvez choisir ce qui donne un éclat de rire.

Je suis allé avec quelques cousins ​​regarder les avatars , sans grandes attentes, pensant que ce serait même un film / dessin enfantin. Quelle erreur. Des effets visuels incroyables, un script passionnant, superbe! En fait, les effets visuels, tels que décrits prochaine partie ... Ils ont réussi à faire toute la flore et la faune ont été cohérent, avec les mêmes éléments anatomiques entre les créatures supérieures (après tout, toutes les chaînes ont le corps symétrique, a le même nombre d'yeux, des poumons et des membres inférieurs superioes, etc ...) des caractères génériques et, bon sang, était toujours le doute qu'il a été acteurs CGI ou costumés. J'ai encore besoin de la recherche ce que la technique utilisée. Si vous ne l'avez pas vu, courrez! Mais essayez de voir une de ces chambres 3D, malheureusement je n'étais pas un de ceux-ci, mais je pense que l'expérience devrait être beaucoup plus riche.

Et enfin, Le Garçon au pyjama rayé , très bon, vous pouvez regarder sans crainte, mais je m'attendais à quelque chose ... Je ne sais pas, plus. Plus drame impliquant une Seconde Guerre mondiale, mais maintenant, impliquant des enfants, ce qui rend encore plus triste, et autres. J'ai senti que j'ai essayé de tirer quelques larmes, mais il a travaillé pour moi. Que ce soit un drame impliquant des enfants dans la deuxième guerre, il est surprenant à la fois dans le script et le visuel? Regarder El Laberinto del Faun , un autre grand réalisateur Guillermo del Toro.

Aussi essayé de regarder Disaster Movie , mais je ne pouvais pas, je me suis arrêté les 15 premières minutes. du film. J'avais peur que quelqu'un aurait vu que je regarde. Éloignez-vous de ce titre, ou s'il est laissé dans la location, doit tuer certains neurones dans le processus. Qu'est-ce un mauvais film! Du burlesque, de sens et ennuyeux.

Jusqu'au mois prochain!

Bookmark and Share
2 commentaires jusqu'ici, ajouter les vôtres

Se souvenir de ceux qui manquent de

Je ne peux pas m'empêcher d'admirer des gens comme Edsger Dijkstra , qui comme il a fait une différence dans la zone où travailler et étudier. Ces gens sont une source d'inspiration et devrait toujours se rappeler. Dijkstra a écrit dans sa note sur la programmation structurée :

Ces notes ont le statut de «Lettres écrites de me« Eux j'ai écrit parce que, sans le faire, je me suis retrouvé de répéter les mêmes arguments encore et encore. Lors de la lecture ce que j'avais écrit, moi aussi, je ne fut pas toujours satisfaits.

Ce petit extrait a déjà montré toute sa préoccupation pour la perfection et sa quête d'amélioration continue en tant que chercheur.

Oh, j'ai tellement de bonnes choses à écrire pour moi-même comme ce géant.

Bookmark and Share
Laissez le premier commentaire

Pilules en Erlang - Compilation d'un programme

Sachant entrer et sortir du shell Erlang est la première étape, mais pas très utile. Le plaisir commence lorsque nous construisons nos propres programmes.

J'utilise Emacs pour écrire mes programmes en Erlang, il a une atmosphère qui colore les éléments et contribue à proximité des parenthèses et des expressions complètes.

Les langages fonctionnels sont récursives dans la nature, alors rien du Monde Bonjour, rien de mieux que de commencer avec une fonction récursive comme un exemple. Que diriez-vous de la factorielle:

-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.

Bookmark and Share
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.

Bookmark and Share
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.

Bookmark and Share
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 \ W subseteq 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 ^ n 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 = (\ vec {x} = (x_1, x_2 ,..., x_ {100000})) e P (\ vec {x}) = \ sum_ {i = 1} ^ {} 100 000 w_i x_i , a função objetivo utilizada foi:

f (\ vec {x}) = a \ cdot P (\ vec {x}) + (1 - a) \ cdot \ lfloor (M - 0,1 \ cdot P (\ vec {x})) \ rfloor

onde a = 1 quando \ Vec {x} é factível, i.e., quando M - P (\ vec {x}) \ geq 0 , e a = 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 P (\ vec {x}) 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 (\ Mu, \ lambda) . 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.

Bookmark and Share
One comment so far, add another