domingo, 11 de agosto de 2013

Relaciones en GORM (The Definitive Guide to Grails 2)

Desde que comenzamos en mi empresa con Grails, uno de los puntos donde estábamos un tanto inseguros era el tema de la forma en que se manejan las relaciones con GORM. Por una parte, nunca habíamos usado Hibernate ni ningun otro ORM, y por otro, siempre habíamos diseñado la base de datos y las relaciones entre las entidades de forma manual.

En estos dias de vacaciones estoy leyendo el (muy recomendable) libro "The Definitive Guide to Grails 2", con el que estoy afianzando algunos conceptos que ya he manejado en el ultimo año y estoy aprendiendo algunas otras técnicas que estoy seguro de que me me van a ser muy utiles en el corto plazo.

En particular, el capítulo 3 dedicado a las clases de dominio tiene un apartado sobre las relaciones entre las clases de dominio y el mapeo que se realiza en base de datos que me ha resultado especialmente claro, asi que voy a intentar resumirlo y traducirlo por aqui por si a alguien mas le puede ser de utilidad.

Partamos de las dos siguiente clases simples:

class Car {
  Engine engine
}

class Engine {
  Car car
}

Claramente tenemos una relación one-to-one simple: un coche tiene un motor y un motor tiene un coche. Ninguna de las dos clases es propietaria de la relación. Y probablemente esto no sea lo que necesitemos en nuestra aplicacion.

Si queremos (lo mas probable en el caso anterior) definir cual es la clase propietaria de la relación, deberíamos hacerlo de la siguiente forma, definiendo explicitamente que un motor pertenece a un coche:

class Car {
  Engine engine
}
class Engine {
  static belongsTo = [car:Car]
}

De esta forma decimos a Grails que el coche es la parte propietaria de la relación, que el motor pertenece al coche, y no al revés.

El parámetro [car:Car] de la propiedad belongsTo es un mapa (y podríamos incluir varios valores: [car:Car, otherClass:TheOtherClass, ....]). La clave del mapa (car) representa el nombre de la propiedad que se añadirá (y usaremos luego para recuperar datos) a la clase Engine. Con esta definición, conseguiremos tambien que cuando se realice el mapeo en base de datos, tengamos una foreign-key en la tabla CAR que referencia a la clave primaria (el ID) de la tabla ENGINE

Obviamente, en algunos casos puede ser deseable tambien disponer de la foreign-key en el otro sentido, esto es: tener la foreign-key en la tabla ENGINE referenciando a la clave primaria de CAR. La forma de hacerlo en definiendo la propiedad hasOne en la clase Car, de la siguiente forma:

class Car {
   static hasOne = [engine: Engine]
}


En algunas circunstancias podemos tener situaciones donde la relacion necesita un lado propietario de la misma, pero no se necesita tener la referencia (back-reference: el ID del propietario en la clase debil de la relación). Grails soporta este tipo de relación de forma similar al caso anterior, pero indicanto solamente el nombre de la clase en lugar de usar una mapa:

class Engine {
   static belongsTo = Car
}

Una de las aplicaciones mas claras de esta aproximación es que automatizan los borrados en cascada: cada vez que se borra un coche de la base de datos se borrará el motor asociado.

Las relaciones de uno-a-muchos se representan facilmente tambien en Grails. Supongamos que tenemos una aplicacion con Albums de música que tienen canciones (Song) y que pertenecen a un Artista. La definicion de estas tres clases podría ser algo asi:

class Artist {
  String name
  static hasMany = [albums:Album]
}

class Album {
  String title
  static hasMany = [songs:Song]
  static belongsTo = [artist:Artist]
}

class Song {
  String title
  Integer duration
  static belongsTo = Album
}

En el ejemplo anterior, un Artist tiene muchos Albums, y un Album perteneca a su Artist propietario. De la misma forma, un Album tiene muchas canciones, y cada cancion tiene su Album propietario. En cualquier caso, una canción no tiene referencia a su Album: dada una canción no podremos saber a que Album pertence, aunque desde los Albumes si que podremos obtener su lista de canciones.

Como vemos, la clase Artist tiene una propiedad, albums, que es una coleccion de objetos Album. El tipo de coleccion que Grails usa por defecto en estos casos es un java.util.Set , que es una coleccion sin orden. Si necesitas otro tipo de coleccion (por ejemplo: List o SortedSet que mantienen un orden, lo que puede penalizar el rendimiento) puedes hacerlo pero tendrás que declararlo explícitamente, por ejemplo:

class Album {
  String title
  static hasMany = [songs:Song]
  static belongsTo = [artist:Artist]
  SortedSet songs
}

Nota: para que este comportamiento funcione, la clase Song tiene que implementar el interface Comparable

No voy a entrar en la problemática del rendimiento que puede provocar el uso de estas propiedades, pero si que recomiendo echar un vistazo a estas dos entradas ( 1 y 2) de Burt Beckwith sobre las recomendaciones de usar el concepto de Bag de Hibernate para estas relaciones u otro tipo de técnicas.

viernes, 14 de junio de 2013

Steve Wozniak sobre iOS7, las libertades y mas cosas

Imperdible este video de Steve Wozniak hablando sobre algunos de los temas no ya de actualidad, sino de ayer mismo (claro, que cuando estes leyendo esto... a saber).

Es una excelente noticia el que haya gente con conocimiento técnico que se de cuenta de lo que esta pasando con tal claridad.



Cita para enmarcar:

Cuando yo era pequeño nos contaban que los comunistas rusos iban a matarnos, lanzarnos bombas… Que torturaban a la gente, la arrestaban, las metían en cárceles y todo eso. Ahora los Estados Unidos nos parecemos cada vez más a esa Rusia comunista.

Y no solo en Estados Unidos. Al hilo del tema de PRISM me hacia mucha gracia el otro dia escuchar en los telediarios a los expertos legales diciendo que eso no podia pasar en España. ¡Ja!


Via Microsiervos

 


lunes, 4 de marzo de 2013

Mi primera experiencia con youzee

Noche de sábado. 23:30. Los niños recién acostados y helado en la nevera. De las películas descargadas hace tiempo ninguna apetecible en el disco duro.

Entonces recuerdo un mensaje que me llegó durante la semana, de Youzee con el imaginativo asunto de Jmiguelweenie, tenemos ARGO pa' ti ;-). Asi que no lo pienso dos veces, conecto con el iPad enchufado a la tele y como tengo pendiente de ver la ganadora del Oscar a la mejor película, que además dicen que estan bien, pago 3.99€ sin despeinarme para ver Argo. Me parece un precio muy razonable para ver una película prácticamente de estreno sin tener que ponerme a buscarla a estas horas por los bajos fondos de la red.

Bien... pago sin problemas desde el iPad pero ... Oh!. necesito Flash para verla. Mierda. Mal asunto en el iPad. ¿No podian haber detectado el dispositivo antes de pagar?. Sin problema. Seguro que hay alguna App para verlo directamente. A ver.... aqui está. Oops!. Es para iPhone, no para iPad. Bueno, probemos a ver que tal se ve... Mierda2. La App solo es una especie de mando a distancia para manejar el ordenador. Supongo que mientras ves la película.

23:45. El helado vuelve a la nevera. Me empiezo a cabrear. Desenchufo el portatil del lugar de trabajo y lo llevo a la tele. Con la salida HDMI lo puedo contectar tal cual. Arranco en mi Ubuntu habitual y al menos la película me la reconoce como comprada. Entro. Play. Espero. Espero. Espero mas. Ningún mensaje de error, simplemente la pelicula no empieza. Reintento. Goto Play. Nada.
Mi mujer sugiere que tal vez sea cosa de Linux, pero digo yo que en algun sitio deberian dar algun mensaje de error, ¿no?.

00:15 Recuerdo que tengo la particion original del portatil con el Windows 7 que venia de serie. Por probar... Arranco en W7 y me acuerdo de todos los ancestros y descendientes de Steve Ballmer mientras intento configurar la conexion Wifi, me bajo el Chrome (que bien funciona Internet Explorer en la tarea de descargar otros navegadores!. Deberian poner en los favoritos por defecto el enlace para bajar Firefox y Chrome para ayudar a los usuarios novatos). 10 minutos después estoy de nuevo en Youzee desde Windows. Entro a la película y veo que ademas del dominio donde estoy hace una conexión que en Linux no hizo -o no vi- a algo como drm.youzee.com. Acabáramos. El put* DRM que no debe funcionar en Linux.

00:30 Empieza la pelicul.... ¿eh?. ¿que mierda3 es esto?. La película va a (como mucho) 10 frames por segundo. En las escenas con un poco de movimiento de cámara se ve una imagen por segundo... y ¡a saltos!. ¿45 Megas de ancho de banda para esto?. Pruebo un test de velocidad. Perfecto. Otro. Tambien bien. No me lo puedo creer. Vuelvo a poner la película... y asi no hay que la vea.

Es casi la 1:00 y abandono. Me quejo cabreado por twitter (al vacio, porque veo que la cuenta de youzee lleva mas de 120 dias sin escribir nada) y consigo un par de respuestas en la linea de 'quien te mandaria no irte a por un torrent'.. Lo normal.

Ya es domingo, 10:00. Me pongo delante del ordenador a currar un poco. Antes, sin complicarme mucho (vamos, en ThePirateBay) veo 3 versiones para bajar. En la mula otras dos. Pongo las 5 a bajar como si no hubiera un mañana y en 1 hora tengo 4 variantes de Argo (una de ella doblada en mexicano). A mediodia me da por ver si con la conexion ethernet por cable va mejor que por Wifi. Nada, va exactamente igual.

Ya por curiosidad (y porque no me puedo creer que la gente vea asi una película) busco algo de información.

Me entero de que Youzee pertenece a los cines Yelmo CinePlex. Que hace un año tenia a 50 trabajadores y que echó a 40. Lo que se viene llamando apostar por el futuro. Por eso pararon la version de iPad. Por eso, teniendo a punto la parte técnica y los acuerdos con las distribuidoras, no funciona en Linux. Por eso no responden en Twitter. Por eso, cuando empecé a tener problemas, el sitio de soporte estaba caido y no pude ni dejar un mensaje.

Sigo buscando y veo que algunos usuarios (con anchos de banda por debajo de 6Mb) han mejorado la calidad de video cambiando la configuracion del Plugin de Flash subiendo el tamaño del caché. Lo pruebo. Ahora si. Ahora funciona a una velocidad razonable como para ver una película. Me gustaria saber como lo hubiera solucionado un usuario sin unos minimos conocimientos técnicos.

Para ser sinceros, se ve mejor en una de las copias del torrent, pero la calidad es mas que razonable para que, 12 horas antes, hubiera tenido una buena experiencia de usuario y aqui, hoy, hubiera escrito otra cosa.

Y mientras, en mi cabeza, resuenan las palabras del presidente de la academia del cine, en su discurso de los premios Goya de hace unos dias:


Y ya que hablamos de dinero y de recaudación, denunciemos una vez más el dinero que pierde la Cultura con la piratería. Tan sólo en la industria cinematográfica la piratería ha supuesto la enorme cifra de 3.000 millones de euros.

[...]

Ya no vale la excusa de que no hay una oferta legal en la red. Hoy en día existen más de 20 portales que ofrecen miles de películas a precios muy asequibles.

No me voy a cansar preguntando al vacio de donde sale la enorme cifra de 3.000 millones. ¿Cuentan como 5 las 5 peliculas que me he bajado hoy?. Ridiculo, ¿no?. ¿Cual es la forma que tienen de calcular esa cifra?. Seria muy interesante conocer los cálculos que hacen y el metodo cientifico que aplican para esa deduccion. ¿Restan a la pirateria los 4€ que me he gastado en una película que no he visto?.

¿20 portales?. ¿Que ha fumado, caballero?. Aparte de Youzee tenemos Wuaki, Filmin, Voddler, Filmotech y ... ¿quien mas?


En Youzee tengo 48 horas para ver la película, asi que con suerte esta noche la veré. La duda es, ¿volveré a coger el portatil, lo conectaré a la tele, arrancaré Windows .. para no estar seguro de si funcionará bien?. O tal vez copie la película bajada por torrent a un pendrive y la pinche en el TDT con entrada USB, que nunca me ha fallado y se ve mejor?. Y mirando mas alla, ¿volveré a confiar en Youzee?. ¿Probaré otro de los portales?.

Es que mira que somos malos, que cuando queremos ver una película, la queremos ver ahora, y no al dia siguiente.




 

sábado, 23 de febrero de 2013

Solo un año

En mi memoria parece muchísimo mas. Pero sólo ha pasado un año desde que por una de esas casualidades (y por escuchar los podcast de Javahispano) un compañero y yo fuimos a Spring IO, una serie de conferencias que a priori trataban sobre el framework de desarrollo Spring MVC.

En aquella época, yo estaba dándo vueltas sobre si merecia o no la pena el cambiar nuestro sistema de desarrollo tradicional y buscando cual podia ser la alternativa. En ratos libres habia echado un vistazo a Spring MVC y GWT,  así que como una de las conferencias era la clásica de Matt Raible sobre la comparativa de frameworks basados en Java en la que se hablaría de otras alternativas al J2EE mas tradicional, parecia claro que no deberiamos perdernos el evento.

Al final, como sucede muchas veces, te encuentras con que aquello para lo que estabas preparado no era lo mas interesante que sucedió en esos dias. La charla de Matt fue impecable pero no fue lo que mas nos marcó. Muchos de los ponentes hablaron sobre un entorno de desarrollo que no habia considerado y del que ni siquiera habia oido hablar, Grails, pero del que muchos de ellos (Tomas Lin, Domingo Suarez, ) hablaban maravillas. Tambien estuvieron implicados algunos de los (en aquel momento yo ni siquiera o sabia) máximos pesos pesados creadores del framework, como Graeme Rocher o Peter Ledbrook.

Pero no sólo (que hubiera sido mas que importante) descubrí Grails. Tambien nuevos conceptos como Agilismo o Scrum. Herramientas como las de Atlassian o JRebel. Empresas que estaban haciendo cosas que me llamaron la atencion, como Salenda, los vecinos de Kaleidos o gente como el propio Alvaro Sánchez-Mariscal, Alberto Vilches o el inimitable David Bonilla. Esos dos dias de hace un año, maltraduciendo del inglés, volaron mi mente. Tuve la sensación de haber pasado los ultimos 10 años metido en una caja. Si: mi propia caja, muy cómoda pero muy limitada. Y nuestra empresa, de la que soy el responsable de tecnología (CIO o CTO, dirían algunos), conmigo.

A partir de ese momento de hace casi exáctamente un año empezó el camino que estamos recorriendo hoy en Virtual Software y en que se esta involucrando toda la empresa para reinventarnos. Un camino hacia una estructura menos jerarquizada -que no menos organizada- con menos compartimentos estancos en lo referente a tecnologia y con la mirada puesta en el futuro.

Un año después estamos preparando a toda la empresa para que todos seamos capaces de realizar desarrollos con Grails. Hemos abrazado (seria mas realista decir “estamos abrazando”) el agilismo y estamos buscando la forma de incorporarlo a nuestros métodos de trabajo diarios. Tenemos nuestro propio scrum-master certificado. Hemos cambiado nuestra obsoleta herramienta de incidencias y control de tareas (desarrollada internamente y que nos ha servido durante unos cuantos años) por Jira + Greenhopper que nos permite tener un control mas certero de lo que realmente está pasando. Estamos  integrando en nuestro método de trabajo la Integracion Continua con Bamboo. Estamos aprendiendo TDD y la realización de tests con Spock o Geb. Ha sido un año duro y cansado, pero no me cabe ninguna duda de que está mereciendo la pena




Este Kanji de arriba representa el concepto crisis en japonés. Esta compuesto de los sinogramas “Peligro” y “Oportunidad”. Nuestra empresa, como tantas en España, está pasando una época de crisis que, al menos en nuestro caso, ha sido motivada en gran medida porque algunos de nuestros clientes pertenecían a sectores que han sido golpeados fuertemente. No solo ese ha sido el motivo, y tenemos que buscar, reconocer y corregir nuestro errores. Pero creemos que estamos en el mejor momento para aprovechar la segunda parte: oportunidad, y darle la vuelta a nuestra empresa a todos los niveles para comenzar, 21 años despues, un nuevo camino.

(Esta anotación se publica simultánemente en el recién creado blog de Virtual Software).