I miei strumenti preferiti per lo sviluppo agile

Dopo alcuni anni in questo settore, e se, come me, un ventaglio di tecniche agili per lo sviluppo software e dipendenti al test (test, test, test !!!), solo raccogliere una serie di strumenti, librerie e linguaggi per facilitare il loro lavoro. Io uso quelli raccolti qui spesso e ricordare coloro che hanno utilizzato per qualche ragione particolare, sono nella mia cintura di utilità:

  1. JUnit : Ho iniziato con l'ovvio, il padre di tutti. Se non è stato nascosto in un bunker anti-nucleare per l'anno passato, ti hanno sentito, o hanno utilizzato test di unità. Se siete veramente fortunati, può anche aver giocato Test Driven Development. In effetti, un buon riferimento in materia è Test Driven Development: By Example .
  2. Refactoring : Okay, okay, ho intenzione di smettere con la banalità, ma non si può parlare di sviluppo agile, senza un buon IDE che permette di refactoring. Sia l'IDE Eclipse e NetBeans , il mio preferito, fornire assistenza eccellente. Penso che non è molto diffuso e che sta cadendo nell'oblio il fatto che non solo fornito dal refactoring IDE sono quelli che esistono, e che il libro che rese popolare queste tecniche è stato il Refactoring: migliorare la progettazione di codice esistente . In esso ci sono tante altre che non sono implementate con qualsiasi IDE, non molte volte per consentire al compito di automazione. Vale la pena di uno sguardo da vicino.
  3. Maven : La gestione di build può essere una complessa ed errori legati, se non ben gestita, e infine la consegna al prodotto del cliente è un momento cruciale, il culmine di mesi di sviluppo con i loro migliori strumenti e le tecniche e si vuole dare l'impressione giusta. Per me, la Maven è lo strumento di gestione si basa della mia scelta, si libera di una serie di problemi che non vogliono conoscere i dettagli, e mi dà una serie di rapporti sulla salute del progetto, come rapporto di prova di copertura, adesione al codice di formattazione convenzione, Javadoc, ecc ..., tutti riuniti in un bellissimo sito del progetto. Grande per impressionare i vostri manager.
  4. EasyMock : Idealmente l'unità di prova deve avere un tempo brevissimo, pochi millisecondi. Se si inizia a coinvolgere banche dati, servizi di piattaforma JEE, I / O in generale, il programma di feedback refactoring-fronte diventa molto lento, e il programmatore si ferma test come risultato naturale. Unit test dovrebbe consentire per eseguire decine di volte al giorno. È lì che il EasyMock, che consente di sostituire le parti del vostro sistema da oggetti falsi con la stessa interfaccia l'oggetto reale, e verificare che il sistema sta facendo le chiamate previsto. Magic!
  5. DBUnit : E come popolare le tabelle da utilizzare per la massa di prova del test? Questo è un compito per il DBUnit consente di inserire e rimuovere i dati in tabelle durante il ciclo di test.
  6. HttpUnit : il HttpUnit è stato pensato per permettere unit testing di applicazioni web. Con esso è possibile accedere a un URL, compilare i campi moduli, inviare, controllare la risposta, infine, per emulare un utente umano. Recentemente sono stato dando un altro uso per questo, efficiente Riposo accedere ai servizi e il controllo dei dati di risposta. Molto buona.
  7. Liquibase : sono un fan di questo progetto. Giocando con Ruby on Rails, ero veramente stupito con il database di gestione dello schema cambiamento. Lo fa attraverso piccoli script che fanno parte del progetto stesso, tra cui tenere traccia della versione installata e funzionante solo necessario, con ogni nuovo aggiornamento. Quando cerchi qualcosa di simile al mondo Java, mi sono imbattuto in questa libreria e lo hanno utilizzato con successo nelle mie applicazioni. Voi costruite file XML con i cambiamenti in banca, identificato con l'autore e la versione, e la libreria si occupa di aggiornamento del database applicando solo la differenza tra le versioni. Oppure si può anche solo al termine di una iterazione, generando un file con lo script da eseguire in un ambiente che richiedono più controllo da parte di un DBA. Vi consiglio.
  8. Mercurial : Sono un utente di lunga data di CVS e Subversion. Ma i sistemi di controllo versione sono distribuiti lì, e dare una nuova gamma di possibilità, oltre ad essere estremamente veloce. Mercurial è utilizzato internamente dal progetto NetBeans, un grande progetto, e molte delle sue operazioni quali si impegna, aggiornamenti, roolbacks, diff sono virtualmente istantanei. E nulla di effettuare il deposito intero, e di impegnarsi presso il cliente.
  9. P6Spy : Ferrara troppo semplice, utile, anche, sono preoccupato di non essere aggiornato dal 2003. Consente di monitorare la comunicazione tra il codice e il server di database, inserito direttamente nel server, l'unità di prova, laddove applicabile un driver JDBC. Grande per la sintonizzazione e momenti di disperazione totale.
  10. OpenEJB : Confesso che ho trascorso un lungo periodo lontano dalla piattaforma JEE dal trauma alla specifica EJB, preferendo sempre le opzioni che mi ha permesso di testare e agilità. In questo momento il progetto è stato molto usando Apache Cactus , ma in realtà, non è la stessa cosa. Il OpenEJB è il contenitore EJB utilizzato dal server Apache Geronimo , ma può essere utilizzato in qualsiasi applicazione JSE, in un alone o in bundle con Tomcat, o in loro testing di unità, permettendo la sperimentazione di messaggistica asincrona JMS, EJB Stateless, Stateful, Singleton, Time Service, in breve, tutto ciò che vi aspettereste da un server reale. Fa ancora le decisioni troppo intelligente per facilitare effettivamente il suo utilizzo nei test di unità, come la creazione automatica di origini dati, utilizzando il database in memoria HSQLDB. Nonostante l'esistenza nel contenitore 3,1 EJB spediti, adatto per l'uso in applicazioni standalone e test di unità, le specifiche dicono che i fornitori devono fornire solo il profilo EJB Lite, che, se avete bisogno, come il resto cerco di non trovato nel profilo, è insufficiente.
  11. HSQLDB : E nulla di meglio per gli unit test con un database, piuttosto che un database che permette di creare tabelle in memoria solo. Questo è tutto, semplice.
  12. SeleniumHQ : Chiunque abbia mai provato per automatizzare i test di interfacce utente, so che non è un compito facile. L'interfaccia utente è un bersaglio mobile, difficile da colpire. Ammiro molto chi propone questo nobile compito. Sviluppare interfacce non è la mia cosa, ma ho giocato in giro con selenio, ed era molto impressionato. Ha le stesse capacità di costosi test di strumenti, come la registrazione della loro interazione con il sistema, e la possibilità di eseguire la stessa suite di test su una rete di macchine con configurazioni diverse dei sistemi operativi e browser. Sicuramente, per la vostra applicazione web prossima killer, vale la pena.
  13. Cruise Control : Per scoprire velocemente se il codice inviato al repository è ancora funzionante, ed evitare l'incubo della fase di integrazione, niente di meglio che uno strumento di integrazione continua. Ho sperimentato la Hudson e il Continuum , ma continuano con il controllo buon vecchio Cruise. Anche se è difficile da configurare rispetto ai loro fratelli più piccoli, consente una maggiore flessibilità nella sua configurazione, e ha una grande stabilità. Continuo a due compiti in programma: un accumulo dopo ogni codice commit al repository, e la costruzione del sito del progetto tutti i giorni.
  14. JMeter : E per ultimo ma non meno importante ... Non lasciate che il vostro test funzionali per poi perché, ma potrebbe essere troppo tardi. In particolare la performance test. Il JMeter permette di simulare il comportamento di centinaia di utenti infuria contro la sua applicazione, e trovare i colli di bottiglia e in cui tali perdite siano nascosti.

Lungi dall'essere una lista completa e definitiva, è la mia lista. E, naturalmente, uno strumento di ultima importante è un po 'di buon senso, dopo tutto, non di cercare di entrare in una copertura del 100% di prova. Può sembrare ideale, ma è sicuramente ingenuo. E ricordate sempre le parole immortali di Dijkstra:

Test evidenzia la presenza, non l'assenza di bug.

Bookmark and Share
3 commenti finora, il vostro aggiungere

Blog elevata al cittadino di prima classe

Vorrei mettere in guardia tutti coloro che seguono questo blog ho appena sollevare un cittadino di prima classe! Per chi è abituato al dominio www.architecteam.com.br / people / franco / blog , e il www.architecteam.net / people / franco / blog , ora è possibile seguire questo blog allo stesso www.smallthoughts.com.br . Voglio che il blog a crescere di importanza, e questo non può accadere mentre è stato così maltrattato. Continuerò a lavorare gli altri indirizzi a tempo indeterminato, ma se il tuo unico interesse è quello di seguire il blog, ti suggerisco di aggiornare il client lettore di feed al nuovo dominio. Nessuna fretta.

Bookmark and Share
2 commenti finora, il vostro aggiungere

Traducendo il libro di esempi Pharo per il portoghese!

Nei prossimi mesi che porterà lo sforzo di tradurre il libro da esempi Pharo per i portoghesi, il mio piccolo contributo per rendere questo linguaggio e un ambiente che sia il gusto che meglio conosciuto dagli studenti e di lingua portoghese sviluppatori, che possono avere come uno dei principali ostacoli alla lingua e non linguistiche.

Credo che sia l'ambiente e la lingua è completamente diverso da qualsiasi cosa abbiamo in ambiente aziendale, e anche se molte delle idee proposte in questo ambiente hanno più di 30 anni, è sempre un ambiente stimolante per tenersi in contatto.

Come tutto il codice è aperto e in Smalltalk, tutto è accessibile e in grado di essere modificato. Tutto è oggetti. Ricercatori principali linguaggi, compilatori e ingegneria del software prova le loro prime idee in questo ambiente e le sue varianti, come unit testing, programmazione orientata agli aspetti, e altri dispositivi di chiusura. La vostra comunità è sicuramente emozionante e che ha da dire.

Ho creato una nuova pagina per rimanere aggiornati con il risultato parziale del lavoro di traduzione. Chiunque voglia contribuire, si sentono invitati. Sono tutti benvenuti.

Bookmark and Share
Lascia il primo commento

Equilibrio culturale gennaio

Questo mese dovrebbe essere un mese atipico, forse per il senso di "vacanza" (pur non avendo avuto una vera vacanza ...). Sono quasi sentirsi in colpa per il punteggio:

  • 13 film
  • 1 viaggio
  • 1 libro

A partire dal film, qualcosa come un ordine cronologico ... Ho visto Norbit , e ha dato alcune risate ... Ho pensato che sarebbe stato un gran casino, ma è stata una merda buona. Divertente. La storia di un povero orfano che scopre l'amore della sua vita in orfanotrofio, ma perde presto la possibilità e il destino di una donna gigante, brutto colla su di esso, e crede che una vita di umiliazione e sottomissione è ciò che merita. Ma presto il suo amore per la città, più bella che mai, ma con alcuni problemi che il cavaliere dovrà aiutare a risolvere. Molti scherzi di sua moglie ei suoi fratelli giganti prepotenti, politicamente scorretto nei confronti delle persone grasse e neri. Prendete un grande secchio di pop-corn e guardare senza compromessi.

El Orphanato più un pezzo ricco con la partecipazione di non più, non meno di Guillermo del Toro . Un thriller per essere incollato sulla sedia, tenendo la mano di sua moglie / fidanzata / qualcosa. Senza ricorrere a sangue e mostri, riesce a sorprendere e deliziare anche coloro che sono stanchi del genere. Ha un sapore di El laberinto del fauno , in cui sono confusi il reale e immaginario perso in fantasia infantile. Consiglio vivamente questo deve essere parte della cultura generale del cinefilo tutto degno di questo nome!

007 Casino Royale . Mio padre ha una collezione completa di tutti i 007 vecchi, ei miei preferiti sono con il nostro amico Sean Connery. Dopo aver visto l'ultimo con Pierce Brosnan, onestamente, ero stanco di overdose di sequenze d'azione del tutto improbabile e irreale, in cui James Bond era praticamente un supereroe la cui super-potere è stato la fortuna infinita. L'attenzione inoltre non era più la storia, per sottolineare armamentario elettronico che giuro, ero eccitata nei vecchi film, ma ha cominciato ad essere irritati dalla eccesso. Credo che i registi hanno catturato questo malcontento da parte dei tifosi, e ha creato un grande film d'azione, più grezzo, dove è infortunato Bond, scende, prende un pestaggio, è sbagliato, e solo fare bene per la loro abilità piuttosto che la loro gadget alta tecnologia. Thumbs up! Popcorn nelle vene!

Final Fantasy VII: Advent Children . Io sono un amante della saga di RPG Fantasy Video gioco finale sempre di ottima qualità e una grafica stupefacente. Ho giocato al computer senza l'Final Fantasy VII comunque completare il gioco. Lavoro, sempre lavoro. Quando ho visto questo titolo in affitto, la nostalgia ha rotto, e voleva per vedere il lungo basato sul gioco. In realtà, la storia va più o meno come una continuazione delle vicende del gioco nello stesso ambiente e con gli stessi personaggi. Nonostante la grafica eccellente (ok, diamo sempre giuste proporzioni a seconda del tempo di produzione, non aspettatevi un Avatar ...) la storia è noiosa, senza emozioni, non tenere un buon ritmo, dialoghi noiosi ... infine, noioso. Una delusione. Se siete nostalgici e, come un computer grafica e niente di meglio da fare, andare a guardare, altrimenti passano.

The Millionaire millionare . O portoghese, Chi vuol essere milionario? Un povero indiano comincia a risolvere questioni di un programma come il nostro gioco Million, e viene arrestato per sospetto di truffa. E poi comincia a raccontare la sua saga, e come sapete la risposta a tutte le domande, e perché partecipano: la ricerca per l'amore della sua vita. Il film ha una fotografia molto bella, la sua storia è molto bella, ma di sentirne parlare, ci aspettavamo di più. Ma essere sicuri di vedere, è certamente un film che fa la differenza.

Kalifornia . Un altro film in cui Brad Pitt cerca di mostrare che non solo serve a ruoli rubacuori. E che può. Un film intrigante dove una coppia inizia il loro viaggio verso la California, alle spalle di materiale per un libro sul serial killer. E scoprono che i loro giri sono, essi stessi, assassini a sangue freddo. Un thriller inquietante, più una domanda che ci rende la natura umana. Consigliato agli amici.

L'ultimo re di Scozia , un film che ha dato l'oscar come miglior attore per Forest Whitaker, presidente del dittatore ugandese Idi Amin Dada. Penso che il film è pseudo-storica, poetica libertà con il necessario, ma in ogni modo è anche un eccellente film, anche mostrando la realtà inquietante ha sempre vissuto nel continente africano. Molto buona.

Up , High Adventure! Chi dice che cartone animato è solo per bambini? Da qualche tempo gli studi più importanti sanno che la vera formula del successo di un'animazione è quello di coinvolgere sia il pubblico adulto e il bambino. Ho i miei dubbi se sia stato ben equilibrato in su, ho pensato che lo script è molto apprezzato da un adulto di un bambino. Naturalmente ci sono scene stupide e divertenti per far ridere i bambini, ma in quantità molto minore rispetto, ad esempio, era glaciale o Gli Incredibili . Sicuramente molto divertente da guardare, con scene che compongono un determinato nodo è questo quello che si chiama un cuore arido. Vale la pena.

Trois couleurs: Rouge . Guardo tutte le TRILOGIA DEI COLORI. Questo è l'ultimo. Essi possono lanciare pietre contro quelli che sono sette, ma deve avere il coraggio di guardare tutti e tre. Ok, bello, sempre mostrando il lato umano della passione, egoismo, amore, perdita e bla bla bla ... ma come una buona insalata di lattuga e tofu è sano, ma insapore. Basta non dormire perché io sono tra coloro che vogliono vedere dove il film va, anche i peggiori. Se volete stupire i vostri amici, andare avanti e guardare! O la necessità di sviluppare un gusto per questo genere di film, o tutti i cinefili si riuniscono nelle loro ruote e ha mentito. Ho cercato di trovare un collegamento tra i tre film, e ho pensato: gobbo vecchia signora sullo sfondo, che sta cercando di mettere le bottiglie nel cestino. E 'quasi un gioco di "Dov'è Waldo" lo vedo, quindi non credo che chi sostiene di aver visto la trilogia senza dire che la vecchia signora. Non dire che non ti avevo avvertito.

Tutti sobre mi madre . E benvenuti nel mondo di Almodóvar! E a proposito di cinema d'autore, un ragazzo che qui ogni film è un invito a fare un giro nella sua testa. Ho paura di lui. Ho visto i film con i gay, travestiti, preti che violentano i ragazzini, suore travestito che rimanere incinta e prendere l'AIDS ... Che cosa contorta piccolo mondo. Ma non si può negare che il ragazzo sa come raccontare una storia e mostrare l'umanità dei suoi personaggi, spesso in situazioni estreme. Questo film non è diverso. Ma so che molte persone che non avrebbero lo stomaco di vederlo, in modo da andare con cautela. E 'il più grande schiaffo in pieno stile Almodovar viso.

Gran Torino . Cosa posso dire di Clint Eastwood? Penso che il mondo ha perso un attore discutibile, ma ha vinto un regista / produttore / sceneggiatore del primo. Le sue storie sono semplici, attaccando questioni controverse come l'eutanasia in Million Dollar Baby , una visione più umana dei vinti in Lettere da Iwo Jima , e questo, sugli errori causati dal pregiudizio razziale. Non so perché, ha avuto una impressione sbagliata del copione, ho pensato Clint sarebbe il cattivo, ma è difficile non farsi collegato al badassmotherfucker vecchio più che il cinema abbia mai visto. Raccomando!

L'ultimo film di Star Trek mi ha dato l'impressione, correggimi escursionisti in servizio, per essere un film merita il nome. Ho il numero più alto nel mio account, anche se non andare al cinema con le orecchie a punta ... Mi è piaciuto il ritmo, mi piaceva l'azione, e tutti i riferimenti alla serie TV. Per non parlare l'emozione di vedere i miei eroi, gli adolescenti, e l'inizio di tutto. + Popcorn movie divertente di sicuro!

Paris, je t'aime . Cosa posso dire ... Film francese di essere pochi, e io escludere il gruppo. In questo film, un gruppo di famosi registi raccontano storie d'amore a Parigi. Grande film per le agenzie di viaggio o se avete intenzione di recarsi nella capitale del mondo più bello, ma non se si vuole divertirsi. Spettatori sadomasochistico, questo è per te.

E arriva un film, credo di aver esagerato questo mese, ho bisogno di saperne di più e spendere meno tempo davanti allo schermo ... Tutti però, per compensare, ho fatto il mio primo viaggio in moto grandi, attraverso Jaguariúna, Cava, Amparo e, infine, Black Mountain. Questo viaggio ha generato buone immagini , e mi ha mostrato che egli era pronto per i viaggi più lunghi. In realtà, abbiamo visto solo di sfuggita il più Jaguariúna Amparo, anche smesso di Cava e Black Mountain. Cava ha tutti i tipi di artigianato realizzati in ... pietre (vetro, porcellana, pietra ollare, ferro), e l'artigianato in legno e oggetti decorativi. Anche se non come fiere d'artigianato, il materiale è stato in realtà molto piacevole e conveniente, e nonostante il poco spazio, solo portando un lampadario lì, in ferro a forma di tulipano. E 'tavolino da caffè. Black Mountain è una città con un potenziale turistico, mi hanno detto di essere una città romantica. Non so se a un certo momento o per ignoranza, ho mancato di vedere la bellezza più naturale, è stata la mia aspettativa. Anche così, seguita da una strada asfaltata secondaria e poi terra, e arrivare a una particolare proprietà, che purtroppo paga per i visitatori di avere accesso a cascata dei sogni ... Valeva la pena del viaggio.

E infine, per terminare il programma culturale, leggere pensiero pragmatico e apprendimento: refactoring del wetware (Pragmatic Programmers) . Ultimamente sono stato attratto dal tema della comprensione di sé e l'accesso a nuovi modi creativi di pensare. Sono un uomo di preciso, sono stato addestrato a essere pensiero logico, analitico e non commettere errori (o almeno tirarmi ...). Ma a questa data in ritardo, alcune delle mie attività hanno perso il loro colore e sapore, come se la vita fosse una grande merenda fast food blando. Questo libro suggerisce che per raggiungere nuovi livelli di produttività, ci exatóides, dobbiamo sviluppare la nostra creatività e permettere ai nostri modi di pensare e di apprendimento coinvolgono sia il pensiero analitico e logico, come olistica e creativa. Per molti può sembrare un bla bla bla di auto-aiuto libro, ma ho deciso di superare il mio scetticismo e cominciò a praticare disegno come un hobby. Ho iniziato a leggere un libro che faceva parte del riferimento: il nuovo disegno con la parte destra del cervello , e vedremo dove vado. Dopo tutto, la specializzazione è per la macchina e formiche.

E fino al mese prossimo ...

Bookmark and Share
Lascia il primo commento

Culturale Balance dicembre

Cercherò di avviare una sana abitudine che ho visto su alcuni blog, fare l'inventario del mese culturali. Questo mese è stato molto debole, il punteggio è:

  • 2 libri
  • 5 film

Ho iniziato a leggere il Modular Java: Creazione di applicazioni flessibili con Primavera e OSGi (Pragmatic Programmers) , un libro sulla modularizzazione di applicazioni utilizzando il framework OSGi. Ho trovato il libro molto buona, ha molti consigli pratici, insegna i vantaggi del modello e non è un libro fatto per pubblicizzare uno dei principali attori della zona, come il diabete o il framework Spring Equinox. Mostra tutte le opzioni e come migrare da un applicazione all'altra. Ho iniziato a lavorare su uno dei miei progetti al fine di testare queste idee, come io sono molto traumatizzati dal peso di soluzioni che utilizzano server JEE e lungo lavoro solo con tecniche e quadri che mi permetterà una maggiore flessibilità e testabilità.

Ho anche letto, in realtà, molto rapidamente in quanto è molto facile da leggere, il libro Il programmatore Passionate: Creazione di una straordinaria carriera nello sviluppo di software (Vita pragmatico) , parte della collezione Pragmatic Bookshelf, che ha eccellenti il libro più famoso Il Pragmatic Programmer: From Journeyman al Maestro . Questo libro è quasi un libro di auto-aiuto per i programmatori, le persone con un bias tecniche che hanno perso la fede nella sua professione. In particolare non mi piacciono libri di autoaiuto, di solito l'unica persona che aiutare gli autori sono le loro, ma questa in particolare ha attirato la mia attenzione subito. Forse perché è un periodo di riflessione collettiva, o io personalmente nel mio momento di riflessione, questo libro porta con sé alcune ovvietà che è bene sentire da altri, e alcune altre cose non così ovvio. Fa riflettere il lettore sulla tua carriera, le vostre decisioni sul e quali le vie da seguire se si vuole una carriera fantastica a fare quello che ami, e non solo portare il riso e fagioli in tavola ogni giorno. Raccomando!

Passando al cinema, alcuni buoni e altri meno buoni. Infine, dopo tutti gli altri, visto Transformers: La Vendetta del Caduto . Molto bene! Per i nostalgici come me, che sono cresciuti guardando i disegni, un presentaos, battendo robotica di ottima qualità, ottimi effetti, tutto bene. La storia è una specie di Wimpy, e batterlo, ma e allora? E 'popcorn e divertente per chi ama un certo stile. Ha anche una scena con una piccola serie di robot che si uniscono per creare un robot più grande e più complesso, che ha a che fare con i materiali che ho visto il maestro di intelligenza e di sciame conferenza robotica. Date un'occhiata a questo video e gli associati e vedrete di cosa sto parlando.

Questo mese ha visto anche il film Solaris , un protagonista di fantascienza, stupire, George Clooney. Onestamente, i miei sentimenti di questo film erano un po 'confuso. La sceneggiatura è buona, ma dà l'impressione che potrebbe essere sfruttato meglio. Ha un accenno di Gattaca , un film che amo, nel senso che è un film di fantascienza senza effetti speciali grosso budget, e poi si concentra sulla storia. E hanno abbastanza di Sphere , un altro film proprio così, sulla sceneggiatura. Ma George Clooney non ha convinto una finzione, è meglio continuare come medico in pronto soccorso o in molti altri film d'azione fatto. Mettere la fine della vostra lista.

Anche visto Yes Man , e solo confermato le mie impressioni prima, io preferisco fare commedia in cui Jim Carrey non ha bisogno di smorfia. Buona piccolo film, ma debole, preferisco Una settimana da Dio o Me, Myself & Irene Jim il fumetto, o opere d'arte lasci della mente senza macchia , che è Jim, ma esplora la sua vena drammatica. Se il negozio di video e hanno nulla di meglio si può scegliere che produce una risata.

Sono andato con alcuni cugini guardare la Avatar , senza grandi aspettative, pensando che sarebbe stato anche un film / disegno infantile. Che errore. Incredibili effetti visivi, sceneggiatura emozionante, superba! In realtà, gli effetti visivi, come descritto parte successiva ... Sono riusciti a fare tutti la flora e la fauna erano coeso, con simili elementi anatomici tra le creature più alto (dopo tutto, tutte le stringhe hanno il corpo simmetrico, ha lo stesso numero di occhi, polmoni, e abbassare i membri superioes, ecc ...) caratteri jolly e caratteri, accidenti, era sempre il dubbio se fosse attori CGI o in costume. Ho ancora bisogno di ricerca che la tecnica utilizzata. Se non lo avete visto, correte! Ma provate a vedere una di queste camere 3D, purtroppo non ero uno di questi, ma credo che l'esperienza dovrebbe essere molto più ricco.

E, infine, Il bambino con il pigiama a righe , molto buono, si può guardare senza paura, ma mi aspettavo qualcosa di ... Non lo so, di più. Più dramma che comportano un seconda guerra mondiale, ma ora che coinvolgono i bambini, il che rende ancora più triste, e così via. Sentivo che ho provato a tirare qualche lacrima, ma ha funzionato per me. Se un dramma che coinvolge i bambini nella seconda guerra, è sorprendente sia in sceneggiatura e la visuale? Guarda El laberinto del fauno , un altro grande regista Guillermo del Toro.

Anche cercato di vedere Disaster Movie , ma non potevo, mi sono fermato nei primi 15 min. del film. Avevo paura che qualcuno avrebbe visto che lo stavo guardando. Stare alla larga da questo titolo, o se lasciato in affitto, deve uccidere alcuni neuroni nel processo. Che brutto film! Da slapstick, insignificante e noioso.

Fino al mese prossimo!

Bookmark and Share
2 commenti finora, il vostro aggiungere

Ricordando Coloro che mancano

Non posso fare a meno di ammirare gente come Edsger Dijkstra , che come ha fatto la differenza nella zona in cui lavoro e di studio. Queste persone sono una fonte di ispirazione e deve essere sempre ricordato. Dijkstra una volta scrisse nel suo Diario di programmazione strutturata :

Queste note hanno lo status di "Lettere scritte a me" Loro Io ho scritto perché, senza fare così, mi sono ritrovato a ripetere le stesse argomentazioni più e più volte. Durante la lettura di quello che avevo scritto, anch'io non è sempre stato soddisfatto.

Questo piccolo frammento ha già dimostrato tutta la sua preoccupazione per la perfezione e la sua ricerca per il miglioramento continuo come ricercatore.

Oh, io sono tante cose buone a scrivere per me stesso come questo gigante.

Bookmark and Share
Lascia il primo commento

Pillole in Erlang - compilazione di un programma

Sapere entrare e uscire dalla shell di Erlang è il primo passo, ma non molto utile. Il divertimento inizia quando costruiamo i nostri programmi.

Sto usando Emacs per scrivere i miei programmi in Erlang, ha un atmosfera che i colori degli elementi e aiuta a chiudere parentesi ed espressioni complete.

Linguaggi funzionali sono di tipo ricorsivo, allora niente Mondiale Ciao, niente di meglio che iniziare con una funzione ricorsiva come esempio. Come circa il fattoriale:

-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 \ 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 ^ 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