Alba on Tech

Talking about technology

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

ninja1

memory1

dance1

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

30 December, 2014 Posted by | Software | Leave a comment

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.

10 October, 2013 Posted by | Software | 5 Comments