Mis herramientas favoritas para el desarrollo ágil

Después de algunos años en esta industria, y si usted, como yo, un fan de técnicas ágiles de desarrollo de software y adicto a las pruebas (exámenes, pruebas, pruebas !!!), sólo recoger una serie de herramientas, bibliotecas y las lenguas para facilitar la su trabajo. Yo uso los reunidos aquí a menudo y recordar a aquellos que han utilizado, por alguna razón particular, se encuentran en el cinturón de utilidad:

  1. JUnit : Empecé con lo más obvio, el padre de todos. A menos que hayan sido escondidos en un bunker antinuclear en el último año, ¿ha oído, o han utilizado las pruebas unitarias. Si tienes suerte, incluso puede haber jugado Test Driven Development. De hecho, una buena referencia sobre el tema es Test Driven Development: Por ejemplo .
  2. Refactoring : Vale, vale, me voy a dejar con los lugares comunes, pero no se puede hablar de desarrollo ágil sin un buen IDE que permite la refactorización. Tanto el IDE Eclipse y NetBeans , mi favorita, proporcionan un excelente apoyo. Creo que no está muy extendida y que se está cayendo en el olvido el hecho de que no sólo proporcionada por su refactorización IDE son las que existen, y que el libro que popularizó estas técnicas fue el Refactoring: Mejorar el diseño del código existente . En él hay otros tantos que no se aplican por cualquier IDE, no muchas veces para que la tarea de automatización. Vale la pena un vistazo.
  3. Maven : La gestión de las composiciones puede ser un proceso complejo y error con destino si no se gestiona, y en última instancia la entrega de los productos del cliente es un momento crucial, la culminación de meses de desarrollo con sus mejores herramientas y técnicas y usted quiere dar una buena impresión. Para mí, el experto es la herramienta de gestión de versiones de mi elección, se deshace de una serie de problemas que no quiere saber los detalles, y me da una serie de informes sobre la salud del proyecto, tales como informe de la prueba de cobertura, la adhesión a la convención de formato de código, javadoc, etc ..., todos reunidos en un hermoso sitio del proyecto. Grandes para impresionar a su jefe.
  4. EasyMock : Lo ideal sería que la unidad de prueba debe tener un tiempo muy corto plazo, de unos pocos milisegundos. Si usted comienza a involucrar a las bases de datos, servicios de la plataforma JEE, I / O, en general, el programa de retroalimentación refactorizar de las cejas se vuelve muy lento, y el programador deja de prueba como un resultado natural. Las pruebas unitarias se debe permitir para ejecutar docenas de veces al día. Ahí es donde el EasyMock, que le permite sustituir las piezas de su sistema de objetos falsos con la misma interfaz que el objeto real, y verificar que el sistema está haciendo las llamadas se esperaba. Magic!
  5. DBUnit : ¿Y cómo populares de las tablas que se utilizarán en la masa de prueba de las pruebas? Esta es una tarea para la DBUnit le permite insertar y extraer datos en las tablas durante su ciclo de prueba.
  6. HttpUnit : la HttpUnit fue el primer pensamiento para que las pruebas unitarias de aplicaciones web. Con ella se puede acceder a una URL, rellenar campos de formularios, enviar, ver la respuesta, finalmente, para emular un usuario humano. Recientemente he estado dando otro uso, el acceso eficiente de los servicios de descanso y comprobar los datos de respuesta. Muy bueno.
  7. Liquibase : Soy un fan de este proyecto. Al jugar con Ruby on Rails, me sorprendió realmente con la base de datos del esquema de gestión del cambio. Lo hace a través de pequeños scripts que forman parte del propio proyecto, incluyendo el seguimiento de la versión instalada y en funcionamiento sólo es necesario con cada nueva actualización. Al buscar algo similar en el mundo Java, me encontré con esta biblioteca y lo han utilizado con éxito en mis aplicaciones. A construir los archivos XML con los cambios en el banco, identificado con el autor y la versión, y la biblioteca se encarga de actualizar la base de datos mediante la aplicación de sólo la diferencia entre las versiones. O también puede simplemente al final de una iteración, lo que genera un archivo con la secuencia de comandos para ser ejecutados en un ambiente que requieren de mayor control por parte de un DBA. Recomiendo.
  8. Mercurial : Soy un usuario veterano de la CVS y Subversion. Pero los sistemas de control de versiones se distribuyan allí, y dar un nuevo abanico de posibilidades, además de ser extremadamente rápido. Mercurial es utilizado internamente por el proyecto de NetBeans, un proyecto grande, y muchas de sus operaciones, tales como las confirmaciones, actualizaciones, roolbacks, diferencias son prácticamente instantáneas. Y nada de llevar a todo el repositorio, y que se comprometan en el sitio del cliente.
  9. P6Spy : Ferrara demasiado simple, útil, también, me preocupa que no se actualiza desde 2003. Le permite controlar la comunicación entre el código y el servidor de base de datos, conectado directamente a su servidor, la unidad de prueba, siempre que sea aplicable un driver JDBC. Grandes para el ajuste y los momentos de desesperación total.
  10. OpenEJB : Confieso que he pasado mucho tiempo lejos de la plataforma JEE por un traumatismo en la especificación EJB, prefiriendo siempre las opciones que me permitió poner a prueba y la agilidad. En este momento el proyecto se utiliza muy Apache Cactus , pero en realidad, no es lo mismo. El OpenEJB es el contenedor EJB que utiliza el servidor Apache Geronimo , pero se puede utilizar en cualquier aplicación de JSE, en forma independiente o incluido con Tomcat, o en su prueba de la unidad, lo que permite la prueba de mensajería JMS asíncrona, EJB Stateless, Stateful, Singleton, Servicio de hora, en fin, todo lo que usted espera de un servidor real. Él todavía toma las decisiones demasiado inteligente para facilitar en realidad su uso en las pruebas unitarias, tales como la creación automática de fuentes de datos, utilizando la base de datos en memoria HSQLDB. A pesar de la existencia en el contenedor de EJB 3.1 enviadas, adecuado para su uso en aplicaciones independientes y las pruebas unitarias, la especificación dice que los proveedores sólo necesitan proporcionar el perfil EJB Lite, que, si necesita el resto, ya que no tratan de En el perfil, no es suficiente.
  11. HSQLDB : Y nada mejor para las pruebas unitarias con una base de datos, en lugar de una base de datos que le permite crear tablas en la memoria solamente. Eso es todo, así de simple.
  12. SeleniumHQ : Cualquiera que haya tratado de automatizar las pruebas de interfaces de usuario, sé que no es una tarea fácil. La interfaz de usuario es un blanco móvil, difícil de golpear. Admiro mucho a los que proponen esta noble tarea. Desarrollar interfaces que no es lo mío, pero yo jugué un poco con el selenio, y estaba muy impresionado. Tiene las mismas capacidades que la prueba de herramientas costosas, como la grabación de su interacción con el sistema, y ​​la capacidad de ejecutar el conjunto de pruebas en el mismo una red de máquinas con varias configuraciones de sistemas operativos y navegadores. Sin duda, para su aplicación web siguiente asesino, vale la pena el esfuerzo.
  13. Control de crucero : Para saber rápidamente si el código enviado al repositorio sigue trabajando, y evitar la pesadilla de la fase de integración, nada mejor que una herramienta de integración continua. He experimentado el Hudson y el continuo , pero aún así continuar con el control de crucero viejos tiempos. Aunque es más difícil de configurar que sus hermanos menores, permite una mayor flexibilidad en su configuración, y tiene una gran estabilidad. Guardo dos tareas programadas: una generación después de cada código al repositorio, y la construcción del sitio del proyecto todos los días.
  14. JMeter : ... Y por último pero no menos importante No deje que sus pruebas funcionales para más adelante por qué, pero puede ser demasiado tarde. En especial las pruebas de rendimiento. El JMeter permite simular el comportamiento de los cientos de usuarios enfurecidos contra su aplicación, y encontrar los cuellos de botella y en donde las fugas están ocultos.

Lejos de ser una lista completa y definitiva, es mi lista. Y, por supuesto, una importante herramienta último es un poco de sentido común, después de todo, nada de tratar de obtener cobertura de la prueba en 100%. Puede sonar ideal, pero es ciertamente ingenuo. Y recordar siempre las palabras inmortales de Dijkstra:

Las pruebas muestran la presencia, no la ausencia de errores.

Bookmark and Share
3 comentarios, agrega el tuyo

Blog elevado a los ciudadanos de primera clase

Me gustaría advertir a todos los que siguen este blog que acaba de subir a un ciudadano de primera clase! Para quienes están acostumbrados al dominio www.architecteam.com.br / personas / franco / blog , y el www.architecteam.net / personas / franco / blog , ahora puedes seguir este blog en la misma www.smallthoughts.com.br . Quiero que el blog cada vez más importancia, y esto no puede suceder mientras estaba tan mal tratados. Voy a seguir trabajando las otras direcciones de forma indefinida, pero si su único interés es seguir el blog, te sugiero que actualice su cliente lector de feeds para el nuevo dominio. No hay prisa.

Bookmark and Share
2 comentarios, agrega el tuyo

Traducir el libro de ejemplos Pharo de los portugueses!

En los próximos meses voy a dirigir el esfuerzo para traducir el libro de ejemplos Pharo para los portugueses, mi granito de arena para hacer de este idioma y el medio ambiente que tanto el sabor más conocido por los estudiantes de habla hispana y portuguesa a los desarrolladores, que pueden tener un importante obstáculo a la lengua y no el lenguaje.

Creo que tanto el medio ambiente y el lenguaje es totalmente diferente a todo lo que tenemos en el entorno corporativo, y aunque muchas de las ideas planteadas en este entorno con más de 30 años, es siempre un ambiente estimulante para mantenerse en contacto.

Como todo el código está abierto y en Smalltalk, todo es accesible y capaz de ser cambiado. Todo lo que es objeto. Los investigadores principales en los idiomas, los compiladores e ingeniería de software a prueba sus ideas por primera vez en este entorno y sus variantes, al igual que con las pruebas unitarias, programación orientada a aspectos, y demás dispositivos de cierre. Su comunidad es sin duda interesante y que tiene que decir.

He creado una nueva página para estar al día con el resultado parcial del trabajo de traducción. Todo aquel que quiera contribuir, se sienten invitados. Son todos bienvenidos.

Bookmark and Share
Deja el primer comentario

Balance de enero culturales

Este mes, debe ser un mes atípico, tal vez por el sentido de "vacaciones" (a pesar de no haber tenido unas vacaciones de verdad ...). Estoy casi sintiéndose culpable por el resultado:

  • 13 películas
  • Un viaje
  • Un libro

A partir de las películas, algo así como un orden cronológico ... Vi a Norbit , y le dio unas buenas carcajadas ... Pensé que sería un gran lío, pero fue una buena mierda. Divertido. La historia de un pobre huérfano que descubre el amor de su vida en el orfanato, pero pronto se pierde la oportunidad y la suerte de una mujer gigante, feo pegamento en ella, y cree que una vida de humillación y sumisión es lo que se merece. Pero pronto su amor por la ciudad, más bella que nunca, pero con algunos problemas que el caballero tendrá que ayudar a resolver. Muchas bromas acerca de su esposa y sus hermanos gigantes matones, políticamente incorrecto contra los gordos y negros. Toma un gran cubo de palomitas de maíz y ver sin compromiso.

El Orphanato es más una parte rica, con la participación de ni más ni menos que Guillermo del Toro . Un thriller para ser pegada en la silla, de la mano de su esposa / novia / lo que sea. Sin recurrir a la sangre y monstruos, se las arregla para sorprender y deleitar incluso a aquellos que están cansados ​​del género. Tiene un sabor de El laberinto del fauno , donde lo real y lo imaginario se confunden perdido en la imaginación infantil. Recomiendo altamente este debe ser parte de la cultura general de la amante de toda la película que se precie!

007 Casino Royale . Mi padre tiene una colección muy completa de todos los 007 de edad, y mis favoritos son con nuestro amigo Sean Connery. Después de ver a más tardar, con Pierce Brosnan, honestamente, yo estaba cansado de la sobredosis de escenas de acción totalmente improbable e irreal, donde James Bond era prácticamente un superhéroe cuyo poder era súper suerte infinita. El enfoque también ya no era la historia, para enfatizar la parafernalia electrónica que te lo juro, me ha emocionado en las viejas películas, pero comenzó a ser irritado por el exceso. Creo que los directores han capturado este descontento de los aficionados, y ha creado una película de mucha acción, más cruda, en la que Bond se lesiona, cae, toma una paliza, está mal, y sólo así por sus habilidades en lugar de sus gadgets de alta tecnología. Pulgares para arriba! Palomitas de maíz en la vena!

Final Fantasy VII: Advent Children . Yo soy un amante de la saga RPG de video juego Final Fantasy siempre de excelente calidad y gráficos espectaculares. He jugado en el equipo sin el Final Fantasy VII sin embargo completar el juego. Trabajo, siempre funciona. Cuando vi este título en el alquiler, la nostalgia se rompió, y quería ver el tiempo basado en el juego. De hecho, la historia va más o menos como una continuación de los acontecimientos del juego en el mismo entorno y con los mismos personajes. A pesar de los excelentes gráficos (bueno, siempre le damos las proporciones adecuadas de acuerdo al tiempo de la producción, no esperes un Avatar ...) la historia es aburrida, ni emociones, no mantener un buen ritmo, diálogos aburridos ... finalmente, aburrido. Una decepción. Si usted es como un nostálgico y gráficos por ordenador y no tienen nada mejor que hacer, ir a ver, de lo contrario pasar.

Slumdog millonario . O el portugués, ¿Quién quiere ser millonario? Un pobre indio empieza a resolver cuestiones de un programa como el juego de nuestros millones, y es arrestado bajo sospecha de hacer trampa. Y entonces empieza a contar su saga, y como usted sabe la respuesta a todas las preguntas, y por qué están participando: la búsqueda del amor de su vida. La película tiene una imagen muy bonita, su historia es muy hermosa, pero de oír hablar de ella, esperaba más. Sin embargo, asegúrese de ver, sin duda es una película que hace la diferencia.

Kalifornia . Otra película en la que Brad Pitt trata de mostrar que no sólo sirve para papeles de rompecorazones. Y él puede. Una película fascinante, donde una pareja comienza su viaje a California, detrás de material para un libro sobre asesinos en serie. Y se encuentran con que sus paseos son, ellos mismos, asesinos a sangre fría. Un thriller inquietante, más una pregunta que nos hace la naturaleza humana. Recomienda a sus amigos.

El último rey de Escocia , una película que le dio el Oscar al mejor actor para Forest Whitaker, presidente de la del dictador de Uganda Idi Amin Dada. Creo que la película es pseudo-histórica, las libertades poéticas con lo necesario, pero de cualquier manera también es una excelente película, que también muestra la preocupante realidad siempre ha vivido en el continente africano. Muy bueno.

Hasta , High Adventure! ¿Quién dice que la historieta es sólo para niños? Desde hace algún tiempo, los grandes estudios sabemos que la verdadera fórmula para el éxito de la animación es la participación de los sectores público y los adultos y niños. Tengo mis dudas acerca de si estaba bien equilibrado en Up, Pensé que el guión es muy apreciada por un adulto que un niño. Por supuesto que hay escenas tontas y divertidas para hacer reír a los chicos, aunque en cantidades mucho más pequeñas que, por ejemplo, edad de hielo o Los Increíbles . Sin duda muy divertido de ver, con escenas que componen un nodo cierto es esto lo que llaman el corazón seco. Vale la pena.

Trois couleurs: Rouge . Veo todos los TRILOGÍA DE COLORES. Esta es la última. Pueden tirar piedras a los que son cultos, sino que debe tener el coraje de ver los tres. Bueno, bonito, siempre mostrando el lado humano de la pasión, el egoísmo, el amor, la pérdida, y bla bla bla ... pero como una buena ensalada de lechuga y tofu es saludable, pero sin sabor. Eso sí, no dormir, porque yo soy de los que quieren ver a donde va la película, incluso el peor. Si quieres impresionar a tus amigos, seguir adelante y ver! O la necesidad de desarrollar un gusto por este tipo de películas, o todos los cinéfilos se reúnen en sus ruedas y mintió. Traté de encontrar un enlace entre las tres películas, y pensé: señora vieja jorobada en el fondo, que está tratando de poner las botellas en el contenedor de reciclaje. Es casi un juego de "¿Dónde está Wally" que ver, así que no creo que alguien que dice haber visto la trilogía de decir que la anciana. No digas que no te lo advertí.

Todos sobre mi madre . Y bienvenido al mundo de Almodóvar! Y hablando de los derechos de autor de cine, un tipo que está aquí, cada película es una invitación a dar una vuelta en su cabeza. Yo le tengo miedo. He visto películas con hombres gays, travestis, sacerdotes violación niños pequeños, las monjas travestis que se quedan embarazadas y contraer el SIDA ... ¿Qué trenzado pequeño mundo. Pero no se puede negar que el tipo sabe cómo contar una historia y mostrar la humanidad de sus personajes, a menudo en situaciones extremas. Esta película no es diferente. Pero yo conozco mucha gente que no tiene el estómago para verlo, así que vaya con cuidado. Es la mayor bofetada en la cara al estilo Almodóvar.

Gran Torino . ¿Qué puedo decir acerca de Clint Eastwood? Creo que el mundo ha perdido a un actor discutible, pero ganó un director / productor / guionista de la primera. Sus historias son simples, atacando temas polémicos como la eutanasia en Million Dollar Baby , una visión más humana de los vencidos en Cartas desde Iwo Jima , y esto, en los errores causados ​​por el prejuicio racial. No sé por qué, tenía una impresión equivocada del guión, pensé Clint sería el malo de la película, pero es difícil no quedar atado a la badassmotherfucker más viejo que el cine haya visto jamás. Yo recomiendo!

La última película de Star Trek me dio la impresión, corríjame excursionistas en el servicio, a ser una película bien vale la pena el nombre. Tengo el mayor número de mi cuenta, a pesar de no ir al cine con orejas puntiagudas ... Me gustó el ritmo, me gustó la acción, y todas las referencias a la serie de televisión. Por no hablar de la emoción de ver a mis héroes, los adolescentes, y el comienzo de todo. Diversión + palomitas película con seguridad!

Paris, je t'aime . ¿Qué puedo decir ... Cine francés a unos pocos, y que excluye del grupo. En esta película, un grupo de directores famosos cuentan historias de amor en París. Gran película para agencias de viajes o si va a ir a la capital del mundo más hermoso, pero no si quieres diversión. Los aficionados al cine sadomasoquista, esto es para ti.

Y llega una película, creo que fue la mano de este mes, tengo que leer más y gastar menos tiempo delante de la pantalla ... Todos, aunque para compensar, hice mi primer viaje moto grande, a través de Jaguariúna, Cantera, Amparo y, por último, Cerro Negro. Este viaje ha generado buenas fotos , y me mostró que estaba listo para viajes más largos. De hecho, sólo vimos de paso, tanto Amparo Jaguariúna, incluso dejó de cantera y Cerro Negro. Cantera tiene todo tipo de artesanías hechas de ... piedras (vidrio, porcelana, piedra de jabón, hierro), y artesanías de madera y objetos de decoración. Aunque no como las ferias de artesanía, el material fue realmente muy agradable y barato, ya pesar de la pequeña habitación, sólo llevando un candelabro de ahí, el hierro en forma de tulipán. Es mesa de café. Negro Montaña es una ciudad con potencial turístico, me dijeron que para ser una ciudad romántica. No sé si en algún momento o por ignorancia, me perdí de ver la belleza más natural, era mi expectativa. Aún así, seguida por una carretera de asfalto secundaria y luego la tierra, y llegar a una propiedad particular, que por desgracia cargada para que los visitantes tienen acceso a la Cascada de los sueños ... Valió la pena el viaje.

Y, por último, para finalizar el programa cultural, leer el pensamiento pragmático y el aprendizaje: refactorizar Wetware (programadores pragmáticos) . Últimamente me he sentido atraído por el tema de la auto-comprensión y el acceso a nuevas formas creativas de pensar. Soy un hombre de Ciencias Exactas, que fue entrenado para ser el pensamiento lógico, analítico y no cometer errores (o al menos esforzarme ...). Pero a estas alturas, algunas de mis actividades han perdido su color y sabor, como si la vida fuera un gran bocado rápido suave alimentos. Este libro sugiere que para lograr nuevos niveles de productividad, que exatóides, tenemos que desarrollar nuestra creatividad y permitir que nuestros modos de pensar y aprender implican tanto el pensamiento analítico y la lógica, como holístico y creativo. Para muchos puede parecer un bla bla bla de libro de autoayuda, pero me decidí a vencer mi escepticismo y comenzó a practicar el dibujo como un hobby. Empecé a leer un libro que fue parte de la referencia: El dibujo nuevo en el lado derecho del cerebro , y vamos a ver a dónde voy. Después de todo, la especialización es para la máquina y las hormigas.

Y hasta el próximo mes ...

Bookmark and Share
Deja el primer comentario

Balance de diciembre Cultural

Voy a tratar de iniciar una sana costumbre que he visto en algunos blogs, hacer un balance del mes cultural. Este mes fue muy débil, la puntuación es la siguiente:

  • 2 libros
  • 5 películas

Empecé a leer el Modular Java: Creación de aplicaciones flexible con la primavera y OSGi (programadores pragmáticos) , un libro sobre la modularización de las aplicaciones que utilizan el marco de OSGi. He encontrado el libro muy bueno, tiene muchos consejos prácticos, que enseña las ventajas del modelo y no es un libro hecho para anunciar un jugador importante en la zona, como la diabetes o el marco del Equinoccio de Primavera. Se muestran todas las opciones y cómo migrar de una implementación a otra. Empecé a trabajar en uno de mis proyectos con el fin de poner a prueba estas ideas, ya que estoy muy traumatizada por el peso de las soluciones con servidores JEE y largo trabajo sólo con las técnicas y los marcos que me va a permitir una mayor flexibilidad y capacidad de prueba.

Yo también he leído, de hecho, muy rápidamente, ya que es muy fácil de leer, el libro del programador apasionado: Creación de una notable carrera en el desarrollo de software (La vida pragmático) , que forma parte de la colección de biblioteca pragmático, que tiene excelente el libro más famoso El programador pragmático: A partir del oficial de Maestro . Este libro es casi un libro de auto-ayuda para los programadores, las personas con una orientación técnica que han perdido la fe en su profesión. Yo particularmente no me gustan los libros de autoayuda, por lo general la única persona que ayudar a los autores son los suyos, pero este en particular me llamó la atención de inmediato. Tal vez porque se trata de un período de reflexión colectiva, o yo personalmente en mi momento de reflexión, este libro aporta algunos lugares comunes que son buenos para escuchar a los demás, y algunas otras cosas no tan obvio. Esto hace que el lector reflexione sobre su carrera, sus decisiones que en adelante, y cuáles son los caminos a seguir si quieres una fantástica carrera haciendo lo que amas, y no sólo para llevar el arroz y los frijoles a la mesa todos los días. Yo recomiendo!

Pasando a las películas, algunas buenas y otras no tan buenas. Finalmente, después de todo el mundo, visto Transformers: La venganza de los caídos . ¡Muy bien! Para los nostálgicos como yo, que crecí viendo los dibujos, presentaos uno, batiendo robótico de excelente calidad, excelentes efectos, todo bien. La historia es una especie de cobarde, y golpearon a él, pero ¿y qué? Es palomitas de maíz y diversión para aquellos que gustan de un estilo determinado. Incluso tiene una escena con un pequeño grupo de robots que se unen para crear un robot más grande y complejo, que tiene todo que ver con los materiales que he visto al maestro en la inteligencia y la conferencia de enjambre robótica. Echa un vistazo a este vídeo y los asociados y ver lo que estoy hablando.

Este mes también vio la película Solaris , protagonizada por una ciencia ficción, asombrar, George Clooney. Honestamente, mis sentimientos acerca de esta película fueron un poco confundido. El guión es bueno, pero da la impresión de que podría ser mejor explotado. Tiene un toque de Gattaca , una película que me encanta, en el sentido de que es una película de ficción sin efectos especiales presupuesto grande, y luego se centra en la historia. Y tiene suficiente cantidad de Esfera , otra película tan así, sobre el guión. Pero George Clooney no convenció a una ficción, lo mejor es seguir como médico en urgencias o en muchas otras películas de acción hizo. Ponga el final de la lista.

También vimos que sí , y sólo confirmó mis primeras impresiones, yo prefiero la comedia donde Jim Carrey no tiene por qué mueca. Buena película pequeña, pero débil, prefiero Bruce Almighty o Me, Myself & Irene Jim el cómic o el diseño gráfico Eterno resplandor de una mente sin recuerdos , que es Jim, sino que explora su vena dramática. Si la tienda de videos y no tienen nada mejor que puede escoger que produce una risa.

Fui con unos primos ver el Avatar , sin grandes expectativas, pensando que sería incluso una película / dibujo infantil. ¡Qué gran error. Increíbles efectos visuales, guión emocionante, magnífico! De hecho, los efectos visuales, como se describe parte de la próxima ... Se las arreglaron para hacer que toda la flora y la fauna se cohesionada, con similares elementos anatómicos entre las criaturas más alto (después de todo, todas las cadenas tienen cuerpo simétrico, tiene el mismo número de ojos, los pulmones, y los miembros inferiores superioes, etc ...) comodines y caracteres, maldita sea, era siempre la duda de si se trataba de actores CGI o disfrazados. Tengo que investigar lo que la técnica utilizada. Si no lo has visto, corre! Pero trata de ver una de estas habitaciones en 3D, por desgracia, yo no era uno de ellos, pero creo que la experiencia debe ser mucho más rica.

Y, por último, El niño con el pijama de rayas , muy bueno, se puede ver sin miedo, pero me esperaba algo ... No lo sé, más. Más drama de una Segunda Guerra Mundial, pero ahora con niños, lo que hace aún más triste, y tal. Sentí que trató de sacar algunas lágrimas, pero funcionó para mí. Ya sea un drama de los niños en la segunda guerra, es sorprendente tanto en la escritura y lo visual? Ver El laberinto del fauno , otro gran director de cine Guillermo del Toro.

También trató de ver la película de desastres , pero no pude, me detuve en los primeros 15 min. de la película. Tenía miedo de que alguien vea que lo estaba mirando. Mantente alejado de este título, o si se deja en el alquiler, debe matar a algunas neuronas en el proceso. Lo que es una mala película! De slapstick, sin sentido y aburrida.

Hasta el próximo mes!

Bookmark and Share
2 comentarios, agrega el tuyo

Recordar a aquellos que carecen de

No puedo dejar de admirar a gente como Edsger Dijkstra , quien, como él hizo una diferencia en el área donde el trabajo y estudio. Estas personas son una inspiración y siempre debe ser recordado. Dijkstra, una vez escribió en su Notas sobre la programación estructurada :

Estas notas tienen la condición de "Cartas escritas a mí mismo" Les he escrito porque, de no hacerlo, me encontré a mí mismo repitiendo los mismos argumentos una y otra vez. Al leer lo que había escrito, yo también no siempre ha sido satisfecho.

Este pequeño fragmento ya ha mostrado toda su preocupación por la perfección y su búsqueda de la mejora continua como investigador.

Oh, tengo tantas cosas buenas que escribir para mí mismo como este gigante.

Bookmark and Share
Deja el primer comentario

Píldoras en Erlang - Compilación de un Programa de

Saber entrar y salir del shell de Erlang es el primer paso, pero no es muy útil. La diversión comienza cuando construimos nuestros propios programas.

He estado usando Emacs para escribir mis programas en Erlang, tiene una atmósfera que los colores de los elementos y ayuda a cerca de paréntesis y expresiones completas.

Los lenguajes funcionales son de naturaleza recursiva, entonces nada Hola Mundo, nada mejor que comenzar con una función recursiva como un ejemplo. ¿Qué te parece el factorial:

-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