Archive for the ‘Programación’ Category

Primera versión de Grails Localizable Plugin

Tuesday, April 5th, 2011

Hacía un par de meses que tenía medio terminado un plugin de grails llamado localizable, y al fin he limpiado un poco las dependencias para que cumpla unos mínimos antes de hacerlo público.

Es una pequeña utilidad para facilitar la integración con el API del servicio de Geocoding de Google Maps para los proyectos desarrollados con grails.

Se puede obtener la latitud y longitud a raíz de una dirección, o las direcciones a partir de la latitud y longitud.

Para instalarlo:
grails install-plugin localizable

Tras haberlo instalado, tendremos a nuestra disposición un servicio de grails(geocodingService) que nos facilitará el trabajo de geolocalización a partir de un puñado de métodos:

findLatLngsByAddress(address) //Devuelve un array con las posiciones encontradas a partir de una posición.

findLatLngByAddress(address) //Devuelve sólo la primera posición encontrada a raíz de una posición.

findAddressesByLatLng(lat, lng) //Devuelve un array con las diferentes direcciones coincidentes con una latitud y longitud.

findAddressByLatLng(lat, lng) //Devuelve la dirección más completa que coincida con la latitud y longitud.

findPointsByAddress(address) //Devuelve un array de JSONObject que representan los puntos coincidentes con la dirección.

findPointsByLatLng(lat, lng) //Devuelve un array de JSONObject que representan los puntos coincidentes con la latitud y longitud.

Podéis ver un pequeño ejemplo de uso en el código que utilizamos para un taller de hace unas semanas con primerviernes

Próximos pasos: Preparar la documentación de uso del plugin en inglés, espero que me cueste menos tiempo :P .

No entra en mis planes añadirle más funcionalidades, pero por supuesto que estoy abierto a sugerencias y/o contribuciones.

Desarrollando UniversalPlaces

Thursday, March 31st, 2011

Ando metido en un proyecto muy chulo llamado UniversalPlaces, TorresBurriel ya publicó un post hablando sobre el lanzamiento inicial y el equipo(equipazo!).

UniversalPlaces es una web donde se pueden reservar estancias en hoteles. A día de hoy todavía en fases iniciales de lo que se pretende que llegue a ser, pero seguro que en los próximos meses dará mucho que hablar :)

Si indagáis un poco, veréis que el equipo es de todo menos convencional. Y no me refiero a que el equipo esté por encima de la media(que lo está!), si no a que es un equipo “a medida” para el proyecto. Cada miembro del equipo trabajamos independientemente a los demás, y aunque alguna vez hayamos podido/podemos/podamos coincidir, tenemos otros jaleos :) . Una apuesta diferente a la habitual por parte de Javier Mcallan, para entrar a competir en un sector tan duro como es el del turismo en internet.

Mi rol dentro del equipo ha resultado ser programador y algo así como el responsable(o irresponsable :P ) de la parte técnica. Nuestro objetivo desde la parte técnica, es que la tecnología existente resulte la menor limitación posible para ofrecer una mejor experiencia de usuario, y os aseguro que está siendo todo un reto!

UniversalPlaces

Bueno, y cómo imagino que no esperaríais otra cosa de mi, os voy a contar un poco acerca de que tecnologías estamos utilizando(por ahora nada excesivamente especial):

  • Es una aplicación web hecha con Grails. Es el framework que más domino a día de hoy, y para este proyecto encaja perfectamente. Como se puede suponer, también hay un trabajo muy importante de integración, y la plataforma Java tiene multitud de herramientas para ello.
  • Corre sobre un Apache Tomcat 6 en producción.
  • Usamos MySQL y MongoDB para las bases de datos. La primera para guardar lo relacionado con reservas, clientes… Y la segunda a día de hoy es poco más que una caché de búsquedas de estancias, para lo que podríamos estar utilizando otras muchas herramientas tipo clave/valor, pero mientras ganamos experiencia para experimentar con algunas características de Mongo que pueden encajar muy bien con funcionalidades que están en el roadmap.
  • El servidor es un dedicado bastante resultón, que ahora mismo va bastante sobrado.
  • También estamos utilizando Amazon S3 para servir las imágenes y Postmark para mandar por email la confirmación de las reservas. Son servicios que hemos externalizado desde ya.

Y como curiosidad una métrica, a día de hoy, con la funcionalidad que se puede ver, tenemos poco más de 2200 líneas de código groovy y java.

No todos los programadores son iguales

Wednesday, March 16th, 2011

Leía anoche el post de mi amigo (y gran profesional :) ) Carlos Ble, ¿Todavía crees en los mitos?. La verdad que mientras lo leía me encontraba con sentimientos encontrados, en cierto modo entiendo por donde van los tiros respecto al exceso de expectativas que a veces generan las celebrities del software (entiéndase por desarrolladores, que por alguna razón, son conocidos en algunos círculos) a su alrededor de forma voluntaria o involuntaria.

Me viene a la mente una conversación que tuve hace 2 o 3 años con Alberto Molpeceres, que se hizo muy conocido por ser fundador de javaHispano. De algo parecido a lo que comenta Carlos en su post, que por la visibilidad que había conseguido por ser el fundador de esa gran comunidad de desarrolladores, se había encontrado por parte de algunos programadores un trato de algo parecido a un gurú/celebrity, cosa con la que él tampoco se sentía nada identificado.

Sé que conversaciones de este tipo las he tenido con más gente además de con Carlos y Alberto, pero disculpad que ahora mismo no recuerde nombres concretos :P

Está claro que por el hecho de alguien sea conocido, no quiere decir que sea un guía espiritual que va a resolver todos tus problemas como por arte de magia, igual que tampoco tiene que ser necesariamente mejor que otro que no sea conocido (sí, como en cualquier otra profesión). Aunque hay que tener en cuenta que si alguien se expone ante gente de su gremio, a las críticas o alagos que puede suponer eso, seguramente un paquete tampoco será :D

Pero hay una cosa que se desprende del post de Carlos, hablando de que todos somos iguales, cosa con la que no podría estar nunca de acuerdo. Se suele decir que 1 buen programador es unas 10 veces más productivo que uno mediocre(no recuerdo quién es el autor de esta afirmación cita del libro The Mythical Man-Month), y si el programador bueno resulta ser un fuera de serie la diferencia puede ser aún más exagerada! Mi humilde experiencia también me dice que los proyectos salen mejor de pequeños equipos con gente buena y motivada(o no-desmotivada).

Code Ninja

Como podéis ver, también creo que entre buenos programadores hay algunos que están por encima de otros. Aunque no me sienta capaz de ponerme a hacer rankings ni nada por el estilo, sí que hay gente con la que he trabajado que tengo la sensación de que están por encima de otros, que son auténticos cracks(algunos los llamarían ninjas).

Eso sí, todos los buenos programadores que conozco a los que admiro y tomo de algún modo como referencias, lo son porque además de atesorar mucho talento, se han ido preocupando de mejorar sus conocimientos y habilidades con el tiempo… y eso que casi todos son conscientes de que son buenos! :D

En fin, que ni por ser una celebrity vas a saber de todo y solucionarás los problemas mágicamente; ni todo el mundo tiene el mismo talento, capacidad de trabajo y de cintura para ser mejores programadores (cámbiese programadores por cualquier otro oficio).

Taller de Grails en Madrid On Rails

Wednesday, March 9th, 2011

Supongo que algunos ya lo sabréis, este Viernes 11 de marzo a partir de las 16:00 voy a impartir un taller de Grails que ha organizado primerViernes.

El taller durará 4 horas, tiene un coste de 100€ y lo llevaremos a cabo en las instalaciones de Madrid On Rails.

El taller está enfocado a gente que ya conoce el framework y quiere acelerar su aprendizaje. En el taller veremos ejemplos en código y trabajaremos sobre distintos tipos de caché, plugins propios y de terceros, sistemas de colas… vamos, que NO va a ser introductorio.

¿Que aún no conoces primerViernes?

primerViernes es un grupo organizado para el lanzamiento de proyectos en Internet que se basa en la idea de “más hacer y menos hablar”.

Logo de Primer Viernes

Con esa declaración de intenciones, ya supondréis que soy simpatizante de este grupo que se concentra en Madrid, y con el que vemos un espíritu muy similar al que nos ha empujado a mover la iniciativa CachiruloValley en Aragón.

Además, habiendo estado en uno de los primerViernes, tengo la sensación que del grupo saldrán algunas empresas interneteras que van a dar guerra :)

Configuración de Tomcat para trabajar con UTF8

Saturday, March 5th, 2011

Me ha vuelto a pasar… otra vez! La configuración por defecto de Apache Tomcat 6 me ha dado problemas con la codificación de carácteres.

encoding

Mientras que en el servidor embebido de Grails funciona todo perfectamente con UTF8, siempre que no la líes gracias a a causa tu IDE/editor favorito, claro. Al poner en una instalación de tomcat el war que quería desplegar, los carácteres no-ascii(eñes, tildes, etc) no se pasaban con la codificación correcta cuando los parámetros iban por GET.

La solución es bastante simple.

A la línea del server.xml de la configuración de nuestro/s tomcat/s:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>

Añadirle URIEncoding=”UTF-8″, para que quede algo como esto:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>

Y ya :)

Un repaso del Spring I/O 2011

Monday, February 28th, 2011

Ya hace casi un par de semanas que se celebró el Spring I/O 2011, y algunos ya han escrito sobre ello.

Iba a hacer un resumen completo del evento, pero visto que otros ya han hecho muy buenos resúmenes y que me he enfriado sólo destacaré lo que me resultó más interesante de las charlas y talleres que pude asistir. Estaba muy difícil elegir entre los 3 tracks, se veía que iba a haber nivel… a ver si este año suben los videos para ver charlas que me perdí de las que me hablaron muy bien.

- Lo que más me gustó:

De cero a multinacional con Grails y EC2, de Jorge Uriarte y Eloy García-Borreguero. Siempre es interesante ver como otra gente soluciona sus problemas y más cuando usan un framework que tú mismo usas, en cierto modo me recordó un poco a nuestra charla de jobsket del año pasado. No por el contenido ni por el producto, si no por ver un caso real y que el caso fuera un negocio en internet.

Conociendo Griffon a fondo, de Andrés Almiray. La verdad que no le había prestado demasiada atención a griffon por que estoy bastante alejado de las aplicaciones de escritorio desde que me pagan por programar :P . Pero vi que era una buena oportunidad de aprender un poco de la mano de Andrés(entre otras muchas cosas, uno de los fundadores de griffon), ya que posiblemente desarrolle en el futuro un pequeño proyecto de escritorio y quería conocer que me ofrecía el framework. Como mínimo debería hacer un hola mundo :)

Aplicaciones web ultraescalables con Redis de Alberto Gimeno. No es colegeo(que podría serlo :P ), ya sabía por donde iban a ir los tiros de su presentación porque fuimos hablando sobre el evento desde días antes, y precisamente fui porque sabía de antemano que iba a resultar interesante. No decepcionó, asistió mucha gente y fue la charla en la que más gente vi preguntar; les descubrió a mucha gente una alternativa a las típicas bases de datos relacionales.

Tuning your Grails applications, de Peter Ledbrook. Que sin descubrir grandes cosas, hizo un interesante repaso a las buenas prácticas que deberíamos utilizar en el desarrollo web para que nuestras webs sean más rápidas(empezando por evitar optimizaciones prematuras :) ), y algunas formas de hacerlo con Grails.

Esto fue lo que más me gustó, otras cosas que me resultaron muy interesantes fueron las keynotes de Juergen Holler y Graeme Rocher, la charla de pruebas de Aitor Alzola, el taller de Geb con Fátima Casaú

Por otro lado, el primer día hice de facilitador(que dicen los agilistas :P ) de un taller de groovy koans. Vamos, que hice una pequeña introducción-presentación de que son los koans, la gente se puso a programar y yo echaba una mano a quien me pidiera ayuda o tuviera alguna duda.

Esta fue la mini presentación que preparé:

Los koans recortados que hicimos en el taller están en github.

Personalmente me gustó mucho el evento, se notó que se aprovechó el rodaje y experiencia de los eventos de México DF y de Madrid y que habían más medios que el año pasado. También un WIN montar fiesta la primera noche para que la gente se relacionara distendidamente tras el duro día :)

Al final lo mejor, como siempre, es reencontrarte con amiguetes y conocidos; desvirtualizar o conocer gente nueva. Si al final lo bueno siempre está en el cara a cara :)

Nos vemos en otra ;)

Autentificación HTTP con Grails

Friday, February 11th, 2011

Todo el mundo en algún momento ha necesitado implementar autentificación HTTP en una aplicación o página web(o no :D ).

Con grails me ha vuelto a tocar hacerlo, por medio de un filtro para que fuera muy fácil de poner o quitar. El código queda como algo así:


class AuthFilters {
 def USERNAME = "user"
 def PASSWORD = "pass"

 static filters = {
  httpAuth(uri:"/**") {
   before = {
   def authHeader = request.getHeader('Authorization')
   if (authHeader) {
    def usernamePassword = new String(authHeader.split(' ')[1].decodeBase64())
    if (usernamePassword == "$USERNAME:$PASSWORD") {
     return true
    }
   }
   response.setHeader('WWW-Authenticate', 'basic realm="myRealm"')
   response.sendError(response.SC_UNAUTHORIZED)
   return false
   }
  }
 }
}

¿Hace falta explicar algo? :P

Groovy Koans en el Spring I/O

Tuesday, January 25th, 2011

Este año se repite el Spring I/O, bajo el nuevo nombre, que es el evento de SpringSource y javaHispano promovido por Sergi Almar. Y este año, a diferencia del anterior, me toca estar sólo ante el peligro con un taller de Groovy Koans.

Spring I/O

Groovy Koans es un proyecto para ayudar a introducirse al lenguaje Groovy utilizando tests unitarios, conocí el proyecto un poco de rebote gracias a Amalia, y me pareció interesante proponerlo como taller para ayudar a conocer los fundamentos del lenguaje. Todavía tengo que ver que subconjunto de los koans selecciono para el taller, ya que no veo posible hacerlos todos en un par de horas.

En el taller realmente espero hablar muy poco, prefiero dedicarme a dar apoyo y a resolver las dudas que puedan surgir cuando la gente se ponga manos a la obra.

Sin estar del todo cerrada la agenda, la verdad es que el cartel es impresionante, con ponentes internacionales y nacionales de muchísimo nivel. Si os interesa groovy, grails, spring o el ecosistema java en general yo no dudaría en registrarme :)

Por cierto, las fechas son 17 y 18 de Febrero, y el lugar la Universidad CEU San Pablo en Boadilla del Monte (Madrid).

Groovy scripting: migrando de base de datos

Tuesday, January 11th, 2011

Como algunos ya sabréis, una de las cosas que podemos hacer con Groovy es escribir scripts al estilo de Ruby, Perl, Python… para realizar alguna tarea repetitiva. Desde mi humilde punto de vista(y de gente que sabe mucho más que yo), un programador debe tener en su caja de herramientas un lenguaje para escribir scripts que sirva para automatizar tareas.

Hace poco he estado haciendo unos retoques a uno que tenía casi olvidado, cuya responsabilidad era hacer una migración de una base de datos a otra, con esquemas muy distintos(por lo que tocó sudar sangre :P ). Para esto me ayudé de un par de scripts escritos en groovy que cumplieron perfectamente con su función.

Hablando ya del código, una de las cosas interesantes que tiene groovy en sus últimas versiones es la incorporación de Grape en el lenguaje. Con Grape podemos manejar las dependencias a librerías externas utilizando los mismos repositorios que hay para maven, por ejemplo yo necesitaba el driver jdbc de mysql:

import groovy.grape.Grape
Grape.grab(group:'mysql', module:'mysql-connector-java', version:'5.1.6',classLoader: this.class.classLoader.rootLoader)

Otra cosa que está muy bien es lo que facilita el trabajo con bases de datos, groovy nos da el paquete groovy.sql.* para ello. Un ejemplo con código limpiado para que sea más fácilmente legible:

def sql = Sql.newInstance("jdbc:mysql://localhost:3306/vieja", "root","pass", "com.mysql.jdbc.Driver")

sql.eachRow("select * from contenidos_secciones where seccionId = 2"){
println it.id
println it.titulo
//acciones reales a ejecutar
}

El it dentro de eachRow, efectivamente representa una fila del resultado obtenido de la consulta.

En mis scripts en los eachRow trataba los datos recibidos para finalmente generar los inserts sql para el esquema de la base de datos nueva y los escribía en un fichero. Para tratar ficheros groovy también nos simplifica la vida, en mi caso tenía por ahí una función tal que así:

def writeToAFile(query, fileName){
def file = new File("${fileName}.sql")
file.append(query+"\n","UTF-8")
}

A este código habría que añadirles muchas líneas pero no quiero aburrir con cosas genéricas que no aportan gran cosa, como el porrón de consultas y subconsultas diferentes, cambios de estructuras, tratamientos de cadenas para generar inserts…

En fin, que si no tienes ningún lenguaje para escribir scripts, ya puedes dejar las excusas/pereza y empezar a aprender uno!

Y si eres programador Java, groovy es el que resulta tener una menor barrera de entrada que los lenguajes sospechosos habituales para esas tareas, la mayoría de la sintaxis ya la conoces :)

Screencasts de Mockito

Monday, December 27th, 2010

Hace un poco que he empezado a trastear Mockito para utilizarlo en un proyectillo que llevo entre manos. Por si hay algún javero despistado, es una librería para ayudarnos a hacer mocks y stubs de las dependencias de código que queramos testear.

Pues hace unos días que encontré unos screencasts sobre Mockito que me resultaron muy aclaratorios de como puedo aprovechar la librería. Como me resultaron útiles, simplemente los comparto :) :