Grails 3 gotchas
La versión 3 de Grails salió hace pocos meses, pero no había tenido oportunidad de probarla hasta ahora. Aprovechando un hueco entre proyectos, y que quería reescribir una aplicación interna para ver si la sacamos al mundo, decidí darle una oportunidad.
Las primeras impresiones han sido buenas: Está basado en spring boot, es más modular, me da la impresión de que arranca antes y consume menos RAM (no lo he verificado), y en general es muy prometedor. Pero sin embargo tiene algunos “gotchas” que hacen que empezar sea un poco más complicado de lo que debería.
Groovy no es java sin puntos y comas
En noviembre asistí al Codemotion 2014. Se trata de un evento anual donde nos juntamos un montón de apasionados del desarrollo de software, de muchas disciplinas distintas, y se dan charlas sobre temas muy diversos. Llevo asistirndo varios años, y me parece una de las conferencias imprescindibles.
Este año además me decidí a dar un paso más, y pasé al bando de los ponentes. Di una charla titulada “Groovy Goodness. Porque Groovy no es Java sin puntos y comas”. Se trata de una charla de iniciación a Groovy, dirigida a desarrolladores de Java. El objetivo es claro: que los javeros que la vean piensen “oye, eso mola mucho, tengo que probarlo”, y decidan cacharrear un poco y darle una oportunidad a Groovy.
Reconozco que estaba un poco nervioso antes de darla, pero el el momento en que el púbico se rió con el primer chiste de la presentación, me relajé y acabé bastante satisfecho con el resultado: Gente interesada, preguntas al final, varios que se acercaron después a comentarme algo… Una buena experiencia.
Con este recuerdo en la cabeza, cuando en febrero nos planteamos qué hacer en nuestra reunión mensual del GUG, me ofrecí a repetirla. Es un grupo modesto, solemos asistir 10-15 personas a las reuniones, y nos conocemos bien todos. Pensé que era un poco básica para ellos, pero podía ser interesante…
Pues bien, aún no sé qué pasó. Puede ser porque fuera una charla de iniciación, o porque fuese en las oficinas de Tuenti que son más céntricas, o porque tengo un club de fans y no lo sabía. Pero el caso es que en la convocatoria de la charla se apuntaron más de 60 personas. ¡Record histórico para el GUG!
Total, que repetí la charla con un par de cambios menores. Esta vez quedé mucho menos contento con el resultado, estuve mucho menos inspirado y no la di demasiado bien. Pero bueno, alguno me ha dicho que le he dado ganas de probar Groovy, así que he cumplido mi objetivo.
Como parece que es un tema que provoca interés, quiero dejar aquí los enlaces tanto a las slides, cómo a los vídeos de las charlas (cortesía de Autentia).
Office linux distribution wars
Discutiendo el otro día sobre qué distribucion poner en los portátiles, sólo fuimos capaces de llegar a una conclusión: Cómo se ven los usuarios de Arch y Debian entre sí:
DEBIAN | ARCH | |
DEBIAN | ![]() |
![]() |
ARCH | ![]() |
![]() |
ΠWEEK: Kam-Fu
TL;DR He hecho un juego que se maneja con la webcam. Tienes el link para jugar al final 🙂
[Publicado originalmente en el blog de Kaleidos]
Probablemente el hardware más comúnmente infrautilizado es la webcam. Hoy en día todos los portátiles llevan una cámara, que todo el mundo tapa para evitar a los ‘hackers’, o la enciende para hacer una videoconferencia… sólo para apagarla a los pocos minutos porque el ancho de banda no es suficiente para el vídeo.
Así que esta piweek he decidido darle una oportunidad para hacer algo más. ¿Y qué mejor que convertirla en un interfaz para un videojuego?. Además, con la potencia actual de los navegadores, y las capacidades de html5 para acceder a la cámara, debería ser posible hacerlo en html y javascript. Así surgió la idea de Kam-Fu.
La verdad es que no he dedicado tiempo a investigar sobre visión artificial. Seguro que hay muchas ideas muy buenas por ahí. Pero yo tenía una teoría, que quería probar. Si se hace una foto estática al principio, y luego se compara esa foto con cada fotograma, se pueden obtener las diferencias (con un cierto umbral). Cualquier pixel que sea diferente, es un sitio que el jugador está “tocando”. Parecía una buena teoría, así que busqué alguna biblioteca de comparación de imágenes, y llegué a Resembe.js, que hacía justo lo que yo quería. Comencé las primeras pruebas, y el lunes por la mañana ya conseguía “tocar” botones en el aire. ¡El primer día tenía funcionando lo que esparaba que me llevase casi toda la semana!.

Awesome! Image diferences detector on the first morning!
Una vez tenía el interfaz para detectar los movimientos del usuario, era la hora de hacer algo chulo con ello. Lo primero que hice el martes fue el “minijuego” del menú, desde el que poder elegir otros juegos. Una vez lo tuve funcionando, tocó refactorizar todo, para extraer las partes comunes a cualquier juego. Una vez conseguido, tocaba lo que de verdad me apetecía… ¡El juego de matar ninjas!.
Pero en ese punto me dí cuenta de que mi sistema de comparación de imágenes era muy poco eficiente. ¿Para qué quería detectar todas las diferencias entre un frame y la imagen original? En realidad sólo me interesaba si había diferencias sobre alguno de los sprites del juego. Así que me deshice de Resemble.js, y me escribí mi propia biblioteca de comparación de imágenes, que permitía comparar un pixel concreto.
Una vez resuelto esto, ya estaba on-fire. Los siguientes días llegaron no sólo el juego de los ninjas, sino también el de memoria, y el de baile.
Cosas que he aprendido:
- Desarrollar juegos es muy divertido, tanto como jugarlos.
- Para hacer juegos, es indispensable un diseñador gráfico. He dedicado demasiadas horas al Gimp para el resultado visual obtenido.
- Las capacidades multimedia de html5 son impresionantes.
- Con la potencia de hardware actual, hasta con un portatil modesto, la optimización ya no es algo vital. Tras invertir muchas horas en mejorar la eficiencia de código que se ejecuta varias veces por segundo, el resultado apreciable no era diferente.
Por supuesto, Kam-Fu es software libre, puedes acceder a su código fuente. Pero lo más importante es que ¡puedes jugar! (por ahora, sólo para chrome): Kam-Fu
Aplicaciones imprescindibles en Android
Comic Magic Reader
Una de las mejores cosas que tiene Kaleidos son las PI WEEKs (Personal Innovation Week). Se trata de una idea original nuestra, que consiste en permitir a los empleados de las diferentes empresas que participan dejar de lado su trabajo del día a día, y dedicar una semana a proyectos personales. Como resultado de la PIWEEK de diciembre del 2013, y de un montón de horas adicionales, estoy muy contento de tener por fin mi primer proyecto en Google Play: Mi lector de comics Comic Magic Reader.
Kata: Intercambio de variables
Es de sobra conocido el mito de que las personas ciegas agudizan el resto de sentidos para compensar su ceguera. En realidad, el resto de sus sentidos no están más agudizados. Simplemente, les prestan mayor atención, trabajan más con ellos, y los exprimen al máximo. Eso mismo ocurre en muchos aspectos de la vida. Cuando tenemos una carencia, optimizamos los recursos que tenemos. En nuestra profesión nos encontramos con carencias con frecuencia: consumo de memoria, velocidad de procesador, transmisión de datos… Hay muchos aspectos que pueden provocar un problema, y nos vemos forzados con frecuencia a utilizar el ingenio para solventarlos. Un ejemplo que me gusta mucho es este artículo: 1500 Archers on a 28.8: Network Programming in Age of Empires and Beyond, donde explican como solventaron los problemas de sincronización del juego Age of Empires frente a las carencias de red. Es largo, pero merece la pena, os lo recomiendo.
Así que, para aguzar un poco nuestro ingenio, os propongo una Kata con una carencia artificial. Es un problema clásico, así que puede que ya lo conozcáis. Se trata de intercambiar dos variables. Lo habitual es hacer esto de la siguiente forma:
a = 2
b = 3
temp = a
a = b
b = temp
Lo que os propongo es que penséis la forma de conseguir esto mismo, pero sin usar ninguna variable adicional. En los comentarios pondré las dos soluciones que conozco, pero seguro que hay más. ¿Se te ocurre alguna?
Y recuerda, no se trata de un concurso. Se trata de una kata. Practica y mejora. Siempre
Soy un ingeniero, no un artesano
Últimamente está muy de moda la expresión “artesano de software”. Desde la primera vez que la leí, esa expresión me chirrió. Entiendo que es una idea romántica, que suena bien, y se refiere a la parte del cuidado y el cariño que ponen los artesanos en su trabajo. No obstante, creo que hay algo fundamentalmente erróneo en ese concepto.
Según la wikipedia, artesanía se refiere al trabajo del artesano (normalmente realizado de forma manual por una persona sin el auxilio de maquinaria o automatizaciones). Dejando de lado el oxímoron de hacer software sin maquinaria, quiero centrarme en la parte de automatizaciones.
Salvo en raras ocasiones, los proyectos grandes los abordo utilizando un framework de desarrollo. En Kaleidos usamos principalmente python/django y groovy/grails. Obviamente, utilizamos cientos de bibliotecas de software que nos proporcionan piezas comunes, como envío de mails, abstracciones de la base de datos, o comunicaciones remotas. Además, seguimos convenciones de código, para crear un resultado lo más mantenible y uniforme posible. Por supuesto, utilizamos un sistema de control de versiones distribuido, git, con un protocolo de ramas que nos permite trabajar en paralelo con máxima eficiencia. Ni que decir tiene que somos grandes defensores de los test automáticos, de forma que nuestros proyectos rebosan de test unitarios y de integración. Eso nos lleva al uso de herramientas de integración continua, como Jenkins, que no sólo se encarga de pasar los tests en las diferentes ramas, sino que incluso realiza despliegues automáticos a preproducción.
Claramente, ¡las automatizaciones son básicas para el desarrollo de software de calidad!. Permiten no sólo ser muchísimo más eficiente, sino, y esto es lo más importante, ser consistente en el desarrollo. Y eso lleva a una calidad claramente superior. Hace el código mantenible, legible, y permite el trabajo en equipo.
¿Sabéis cómo se llama al proceso de creación, perfeccionamiento e implementación de estructuras para la resolución de problemas? Ingeniería.
Estoy muy orgulloso de todas las automatizaciones que utilizo al desarrollar software. Y siempre estoy en el proceso de mejorar aún más el sistema. Y por supuesto, le pongo mucho cariño y cuidado a lo que hago. Pero el cariño y el cuidado por sí solos no bastan. Hay que hacer las cosas bien. Hay que tener procesos claros, y estar siempre dispuestos a refactorizarlos y mejorarlos. Hay que automatizar las tareas para mejorar la calidad. Hay que ser ingenieros1.
Así que lo digo convencido: Soy un ingeniero, no un artesano.
(1) Disclaimer: Estoy hablando de la forma de trabajar y abordar los problemas, no de titulaciones. Conozco gente que ha estudiado módulos de FP y son magníficos ingenieros, y gente con titulación superior en informática a los que no les dejaría acercarse a un teclado.
Kata: Media inversa
Todo el mundo sabe hacer una media. Es uno de los primeros ejercicios de programación que se hacen. Pero en un caso real he tenido que calcular una media inversa, y me ha parecido muy interesante para plantearlo aquí como kata.
Continue reading
Un scriptillo para renombrar subtítulos
Una de las formas más agradables de aprender inglés es viendo series en inglés. Y como reconozco que mi oido no es lo bueno que debería ser, me apoyo en subtítulos (también en inglés). Pero para que el reproductor muestre el subtítulo adecuado, tanto el archivo de vídeo como el de subtítulos deben tener el mismo nombre, con distinta extensión.
Continue reading