lunes, septiembre 26, 2011

The Girl who Played with Fire

The Girl who Played with Fire es el segundo libro de la trilogía Millennium. Los protagonistas vuelven a ser los mismos que en el primer libro aunque en esta ocasión se verán envueltos en una trama de trata de blancas y asesinatos.

Al contrario de lo que ocurría en el libro anterior, en este no tenemos que esperar a la página 200 para que empiecen a ocurrir sucesos interesantes que le darán el libro mayor dinamismo y lo harán mucho más fácil de leer, de hecho me parece que este es un libro muy adictivo.

La historía vuelve a estar entretenida pero me sigue sin parecer tan bueno como la gente dice que son. Para mi las novelas policiacas son las de Agatha Christie, esas donde te presentan a todos los personajes y mientras leer hace conjeturas de cual puede ser la realidad. Un libro donde al final aparecen personajes transcendentales producen cierta frustración si has estado todo el libro haciendo tus conjeturas.

De todas formas como dije del The Girl with the Dragon Tattoo son libros muy recomendables y entretenidos.

Para un resumen más completo y otro punto de vista podéis visitar Libroesfera.

domingo, agosto 21, 2011

Effective Java: Methods Common to All Objects

El capítulo tres de Effective Java explica los métodos que podemos sobrescribir de Object (equals, hashCode, toString, clone y finalize).

En el caso del equals lo más importante es recordar el contrato y las propiedades que este tiene que cumplir lo que provoca que no haya forma de extender una clase instanciable añadiendo un nuevo atributo y seguir cumpliendo el contrato. Para este tipo de situaciones la única solución es optar por la composición en lugar de la herencia (pág 37-41).

El hashCode deberá ser sobrescrito siempre que el equals lo sea y en caso de que este se complicado de calcular podremos optar por usar lazy loading.

El toString debería ser siempre sobrescrito y es aconsejable en según que situaciones explicar claramente en el javadoc del método el formato en el que se devuelve la información. Por ejemplo:
/**

* Returns the string representation of this phone number.
* The string consists of fourteen characters whose format
* is "(XXX) YYY-ZZZZ", where XXX is the area code, YYY is
* the prefix, and ZZZZ is the line number. (Each of the
* capital letters represents a single decimal digit.)
*
* If any of the three parts of this phone number is too small
* to fill up its field, the field is padded with leading zeros.
* For example, if the value of the line number is 123, the last
* four characters of the string representation will be "0123".
*
* Note that there is a single space separating the closing
* parenthesis after the area code from the first digit of the * prefix. */
@Override public String toString() {
return String.format("(%03d) %03d-%04d", areaCode, prefix, lineNumber);
}
En cuanto al clone debemos recordar que si sobrescribimos este método en una clase no-final tendremos que invocar el super.clone(). Otros consejos que da son que las clases inmutables no deberían ofrecer un clone porque generaría otro objecto exactamente igual que el anterior y que no se va a modificar. Y para terminar explica todos los problemas que conlleva este método aconsejando que en ocasiones es más simple ofrecer un copy constructor:
public Yum(Yum yum);
O una copy factory:
public static Yum newInstance(Yum yum);
También hay unas lineas dedicadas al compareTo de la interfaz Comparable y explica el "truco" de devolver la resta cuando comparamos dos números además de explicar que esto no funciona cuando comparamos un números positivo grande y un negativo ya que puede desbordar y devolver un resultado engañoso.

Para terminar finalize no debería ser utilizado.

miércoles, agosto 03, 2011

Effective Java: Creating and destroying objects

En el capítulo dos del libro Effective Java se tratan los temas relacionados con la creación y destrucción de objetos. Es un capítulo bastante básico donde explica que hay que usar Boolean.TRUE en lugar de new Boolean(true) y que nunca hagas un new String("ejemplo").
Podemos destacar dos puntos de este capítulo:
  • A partir de Java 5.0 la mejor forma de crear un singleton es usando un Enum:
public enum Elvis {

INSTANCE;

public void leaveTheBuilding() { ... }
}
  • Cuando tenemos un constructor con muchos parámetros algunos de ellos obligatorios y otros opcionales, la mejor opción es crear un Builder:
// Builder Pattern

public class NutritionFacts {
private final int servingSize;
private final int servings;
private final int calories;
private final int fat;
private final int sodium;
private final int carbohydrate;

public static class Builder {
// Required parameters
private final int servingSize;
private final int servings;
// Optional parameters - initialized to default values
private int calories = 0;
private int fat = 0;
private int carbohydrate = 0;
private int sodium = 0;

public Builder(int servingSize, int servings) {
this.servingSize = servingSize;
this.servings = servings;
}

public Builder calories(int val)
{ calories = val; return this; }
public Builder fat(int val)
{ fat = val; return this; }
public Builder carbohydrate(int val)
{ carbohydrate = val; return this; }
public Builder sodium(int val)
{ sodium = val; return this; }

public NutritionFacts build() {
return new NutritionFacts(this);
}
}

private NutritionFacts(Builder builder) {
servingSize = builder.servingSize;
servings = builder.servings;
calories = builder.calories;
fat = builder.fat;
sodium = builder.sodium;
carbohydrate = builder.carbohydrate;
}
}

sábado, julio 30, 2011

Effective Java Second Edition

Ayer terminé de leer Effective Java (2nd Edition), el libro de Joshua J. Bloch.
El libro no resulta cómodo de leer de principio a fin, a veces pienso que es mejor leer el índice para saber que contiene y usarlo como libro de referencia. No es que el libro sea denso o aburrido, es que simplemente te explica y comenta puntos que ya te has encontrado y con los que has peleado en tu día a día. Otros capítulos sí que son interesantes porque te ofrecen soluciones efectivas a problemas muy comunes. Ese tipo de problemas que sabes que tienen varias soluciones cada una con sus pros y sus contras y no sabes muy bien por cual decidirte.

El punto clave de leer este libro fue el autor. Saber la respuesta que da el hombre que diseño el API de Collections a ciertos problemas es muy útil para ganar discusiones en la oficina. La típica cuestión de poner las constantes en una clase o en una interfaz se soluciona con el comodín del: "Joshua Bloch dice que en una clase con el contructor privado". Se acabó la discusión.

En definitiva me parece un libro imprescindible si tienes poca o ninguna experiencia profesional, de lo contrario podrás encontrar capítulos curiosos e interesantes pero otros te resultarán obvios porque ya los has aprendido con el tiempo.

Resumen de los diferentes capítulos (iré actualizando la lista conforme los vaya escribiendo):

lunes, junio 06, 2011

Start Small, Stay Small: A Developer´s Guide to Launching a Startup

Start Small, Stay Small: A Developer´s Guide to Launching a Startup es un libro de Rob Walling que sirve como guía para quien quiera crear su propia Startup.
Es un libro corto, unas 200 páginas, que abarca todo el proceso desde como tener las ideas hasta como terminarlas (o vendiendo la empresa o manteniéndola generando beneficios).
Si bien me parece un libro bastante básico (cualquiera que haya estudiado Administración de empresas, un MBA o un diploma sabe mucho más de alguno de los puntos que el libro cita) por otro lado al cubrir todo el proceso siempre hay algún cápitulo del que desconocías o sabías poco.
Lo que más me gusta de este libro es que no se trata de otro vendedor de mapas del tesoro, sino que Rob ya encontró el tesoro y ahora explica como otros pueden también lograrlo; habla constantemente de sus propias experiencias
Y para terminar os comento algunos de los consejos que destacaría de este libro:
  • Ir a por nichos pequeños donde las grandes empresas no puedan entrar a competir.
  • Delegar, delegar y delegar (el recomienda y usa VA´s)
  • En cuanto puedas lanza un Micro sitio para ver si funciona
  • No quieras vender a la primera visita... fideliza
  • Lista de correo... imprescindible para un buen marketing (el marketing en Facebook, Twitter, etc son mitos que a ti como pequeño emprendedor no te van a servir)
  • Tener varios productos te ayudará diversificar riesgo y reutilizar lo aprendido (con menos inversión generas más retorno)
Es un libro que recomendaría a todo programador que quiera lanzar una startup y que crea que con tener un código de calidad ya va a triunfar.

martes, febrero 22, 2011

Java Dynamic Proxies

No siempre tenemos la posibilidad de usar aspectos para hacer logging the nuestra aplicación y el comenzar todos los métodos con un log.debug() es algo que querremos evitar. Para esos casos podemos echar mano de los proxies dinámicos.

Lo que haremos será "engañar" a la aplicación dándole un proxy en lugar del objeto real y dicho proxy se encargará de hacer el logging y de delegar en el objeto real la lógica de negocio.


public class LoggingHandler implements InvocationHandler {

private final Logger LOG;

private Object delegate;

public LoggingHandler(Object delegate) {
this.delegate = delegate;
this.LOG = Logger.getLogger(delegate.getClass());
}

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
try {
LOG.debug(">>" + method.getName());

Object result = method.invoke(delegate, args);
return result;
} catch (InvocationTargetException e) {
throw e.getTargetException();
} finally {
LOG.debug("<<" + method.getName());
}
}
}
Utilizarlo es realmente simple:

Test t = new TestImpl();

InvocationHandler handler = new LoggingHandler(t);

Test proxy = (Test) Proxy.newProxyInstance(
t.getClass().getClassLoader(),
t.getClass().getInterfaces(),
handler);

proxy.echo("hello world");
Se da por supuesto que como buenos programadores estáis programando usando interfaces en caso contrario no podréis "dar el cambiazo".

lunes, febrero 21, 2011

Spring I/O

El jueves y viernes de la semana pasada tuvo lugar en Madrid el Spring I/O 2011, un evento relacionado con las tecnologías de SpringSource (Spring Framework, Grails, Groovy...), así que cogí la mochila y me fuí un par de días para allí.

Tengo que decir que había tres tracks simultáneos (dos de conferencias y uno de talleres) así que sólo pude asistir a algunas charlas y ningún taller (que como iba con el equipaje justo no pude llevar el portátil).

Lo primero de todo fue registrarse, momento en el cual nos dieron un bolsa con un par de barajas para hacer planning poker, una pegatina de Masterbranch, una camiseta del evento (la cual hubiera sido más chula y más llevable si hubiera sido más minimalista) y alguna cosilla más.
Después comenzamos con la keynote de Juergen Holler. Nos contó una visión general de la situación y de lo que nos venía en el futuro próximo, me quedé con el tema de Java 7 y la concurrencia para tartar de utilizar los diferentes cores que ya todas las CPU´s tienen.
Al terminar, la gente de Escuela de Groovy hicieron unos minutos de publicidad (que para algo eran Platinum Sponsors y costeaban gran parte de las conferencias). También hicieron notar que más de la mitad de las conferencias eran sobre el ecosistema Groovy & Grails, algo que es para reflexionar.

Spring Data fue la conferencia que siguió al descanso para el café. El producto me resulto decepcionante. No acabo de ver que ventaja tiene usar Spring Data para acceder a los bases de datos NoSQL, lo único la jerarquía de excepciones. Sinceramente si no estas usando Spring, ni te plantees usar Spring Data. Si ya estás usando el core del framework pues quizá te aporte algo.
En la conferencia sobre Spring AMQP Sergi Almar nos explicó: porqué usar mensajeria asíncrona, porqué usar un protocolo como AMQP en lugar de JMS y finalmente nos habló de RabbitMQ. Salí convencido. Si puedes usar un protocolo que te permite comunicar con .Net u otras tecnologías para que vas a cerrate sólo a Java, que es lo que hace JMS.

Por la tarde tuvimos otras cuatro conferencias. La primera "De cero a multinacional con Grails y EC2" en la que si bien es cierto que sus números no me impresionaron (picos de 40.000 usuarios) me quedé con el hecho de que más y más compañías con productos reales están apostando por Grails. El usar Amazon EC2 no me sorprendió, me parece que son los que mejor están haciendo las cosas en el mundo "cloud".
Y después llegó la primera decepción: Pruebas de aplicaciones web con Selenium 2 y Webdriver. Si pones en el título Selenium 2 ciñete a él. Los que allí estabamos ya conociamos Selenium y lo estamos usando, al menos en mi caso quería ver lo nuevo de la siguiente versión. Al final nos hablo de Webdriver y los Page Objects (el primero me gustó mucho y el segundo me pareció matar moscas a cañonazos).
De vuelta al mundo Grails, Aitor nos habló sobre Probando con Grails. Un poco básico, al final todo se resumía en TATFT.
Y para terminar el día que mejor que cuatro Spring Puzzles con Erick Camacho y Sergi Almar. Fue algo entretenido y curioso, que a las 18:30 de la tarde no se hizo nada aburrido. Habría que señalar que el primer puzzle (una variable static no inicializada por el contenedor) era fácil, y el último era demasiado grande como para enterarte de donde estaba el truco (muchas clases y líneas que tener en cuenta), pero estuvo bien.

El segundo día comenzamos con una keynote de Graeme Rocher. De nuevo te presenta lo que viene en el futuro próximo pero para mi que no uso Grails no me resulto muy útil.
Y seguido me fuí a ver a @gimenete hablar de Redis. Cual talibán, me dio la impresión de que defendía Redis como base de datos o caché en cualquier situación. Fue la charla donde más preguntas se hizo de todas en las que estuve. Me gustó mucho como la estructuró, fue muy dinámica y didáctica aunque mi conclusión final fue que no voy a usar bases de datos NoSQL mientras pueda seguir con las relacionales. Las NoSQL están muy bien con unos requerimientos más o menos cerrados pero creo que instalar una nueva versión de una aplicación que corre sobre Redis en un cliente que usaba una versión anterior debe ser muy doloroso... no podemos hacer el Alter Table, tenemos que meter código en nuestra aplicación que maneje las situaciones y eso no me gusta. Fue una de las conferencias más chulas y eso que poco tenía que ver con SpringSource.

En Effective Groovy volvimos a ver las virtudes de ese lenguaje. Te das cuenta de lo verbose que es Java y de que los closures son una maravilla. Increible el tener una lista de personas y con un simple .collect() puedes recuperar las personas que cumplen ciertas condiciones. Otra cosa que me gustó muchísimo es la anotación @Equalsandhashcode. Se acabó el botón derecho generar equals() y hashcode().

Sin embargo la conferencia Spring Web Services volvió a decepcionarme. Muy básica, lo que allí nos contaron lo puedes encontrar buscando en google "spring web services" y leyendo un par de parrafos. No estuvo mal la conferencia ni Sam Brannen, simplemente esperaba más.

Con Spring Hadoop me paso lo contario. Como no sabía que era Hadoop pero había oido hablar mucho de él tenía ganas de ir a ver que nos contaban. Supongo que para alguien que sabía de Hadoop le parecería básica pero para mi me resultó muy útil y aclaratoria. Por cierto, si un día tengo que trabajar con Hadoop tengo claro que usaré Spring Hadoop para simplificar el código ¡vaya diferencia!.

Y la última conferencia a la que pude ir fue Introducing Summer - The HTML5 Library for Java and Scala. Y fue la peor pero con mucha diferencia, la única a la que me arrepiento de haber ido. El tipo, Rostilav Hristov no tenía ninguna gana de hablar, su inglés era bueno, no es excusa, era sencillamente como si a un programador que no sabe que contar de su librería le dices que hable de ella. No lo vi nada motivado y cuando miré las caras del resto de la gente (la sala estaba llena) ni uno atendía.

Si habéis leido hasta aquí pues vais a tener premio, vamos a criticar y dar algún palo: la comida. Me pareció vergonzoso. Primero tengo que decir que pagamos 20 euros por todo, lo cual es una cifra ridícula pero eso no da derecho a que te den una bolsa con un par de sándwich, un batido, etc. Para empezar porque estoy seguro de que esa bolsa costaría los 4-5 euros que costaba el menú en la cafetería de forma que estoy convencido que la razón de darnos esa bolsa no eran los costes sino evitar que la gente fuera al comedor de la universidad. Eramos más de 300 personas y puede que saturaramos el comedor no lo se, pero me habría gustado una explicación. O quizá la razón era la conferencia que Leche Pascual y un montón de encorbatados tenían el viernes a la vez que el Spring I/O, ellos sí comieron en el comedor e incluso se quejaron de compartir comedor con estudiantes (lo se por fuentes fidedignas, me encanta esa palabra!).

Si se da el palo habrá que dar también la zanahoria: me parece un trabajo increible el que ha hecho Sergi Almar (y el resto de la organización: Javahispano, etc) organizando todo esto. Hemos tenido gente importantísima, conferencias muy interesantes, diferentes tracks para poder elegir lo que más te interesaba... en fin, no entiendo como no va más gente, es la mejor forma de estar al día, de saber de primera mano que están haciendo otros programadores o empresas... De hecho mi crítica a la comida es debido a que es el único "pero" que se le puede hacer a este evento. Nunca faltaron las botellas de agua gratis, café, galletas, voluntarios a los que preguntar cuando no sabías donde era un taller, etc.

Y para acabar, volver a felicitar a Sergi y el resto de la organización por el BeerWorking que organizaron el jueves por la tarde, algo que se echaba de menos en otros eventos.

De nuevo, como dos años atrás, un diez para las instalaciones de la Universidad San Pablo CEU y un cuatro para la localización (aunque debo aclarar que la organización puso autobuses gratuitos).

Y aquí tenéis una foto de los dos cracks de la programación que coincidieron en el Spring I/O:


Actualización: Una pena perderme el taller de @dani_latorre del que la gente habló muy bien. Espero que lo repita algún día dentro del Cachirulo Valley.

lunes, febrero 07, 2011

El viento en Dublín

Pues así es como ha quedado un árbol al lado de mi casa. Este fin de semana ha sido muy duro, una mujer ha muerto al caerle un árbol encima. El viento aquí en Dublín no tiene nada que envidiar al de Zaragoza pero a eso añadirle que no es un viento seco pues está lloviendo.
Espero que pasen pronto estos días y volvamos a la normalidad (que haga frio, viento o lluvia pero no los tres a la vez).

martes, febrero 01, 2011

domingo, enero 30, 2011

The Grand Canal

Existen dos canales en Dublín. Uno al norte del río (Royal Canal) y otro al sur (Grand Canal). Yo vivo cerca del Grand Canal y desde hace unos días lo están vaciando (haciendo un bypass) supongo y espero que para limpiarlo.

En la foto podéis ver como está el fondo ahora que se ve perfectamente con menos agua. No se la cantidad de latas de cerveza que debe haber allí pero lo que sí se es que hay lo menos 10 conos de obra de esos naranjas en un espacio de 50 metros.

Espero que lo limpien y podamos volver a darnos paseos por la orilla con los patos.

lunes, enero 17, 2011

Principios FIRST

Hace ya bastante tiempo oí hablar de los principios FIRST enunciados por Robert Martin sobre las condiciones que tenía que cumplir un buen test. Muchas veces recuerdo la palabra FIRST pero no recuerdo el significado de alguna de las letras así que para tenerlo a mano y compartirlo con todos vosotros allá va:
  • Fast
  • Independent
  • Repeatable
  • Self-Validating
  • Timely

martes, enero 04, 2011

New year´s resolutions

Parece que otro año más tendré que proponerme algún objetivo... siempre hace gracia buscar en el blog para ver si he cumplido o no los del los últimos años. Por ejemplo, hace dos años me puse una lista de libros para leerme:
  • Un mundo sin fin
  • Spring in Action
  • Testigo de cargo
  • The Pragmatic Programmer
  • Head First Servlets and JSP
  • Freakonomics
  • La catedral del mar
  • El fuego
  • Cinco cerditos y/o Muerte en el Nilo
  • El inversor inteligente
Por lo que veo todavía tengo unos cuantos pendientes por leer de aquella lista. Quizá lea El Fuego en su versión original...

Para este año voy a seguir insistiendo en algunos del año pasado:
  • Hacer deporte: cuando pase el invierno volveré con el 5-a-side.
  • Programar para iOS
  • Java: nunca hay que dejar de mejorar en lo que me da de comer. Para empezar en febrero iré al Spring I/O.
  • Inglés: hace unas semanas terminé de leer la que fué mi primera novela en inglés (550 páginas). Este año me gustaría leerme tres más. No sólo de libros técnicos vive el hombre. Además me gustaría sacarme el CAE antes de fin de año.
  • Diploma en International Business: la semana que viene tengo los examenes del primer cuatrimestre... no se que hago escribiendo esto en vez de estar estudiando.

domingo, enero 02, 2011

The Girl with the Dragon Tattoo

The Girl with the Dragon Tattoo, cuyo título original traducido sería más o menos Los hombres que odian a las mujeres (vamos, que no se parece en nada), es el primer libro de la trilogía Millennium. Es una novela policiaca escrita por el difunto Stieg Larsson.

Empecé el libro con muchas ganas porque me gusta este tipo de libros y porque todo el mundo hablaba del fenómeno Millennium además de que están las películas suecas (que he evitado ver) y están haciendo el remake americano. El comienzo del libro es muy lento, casi podría decir que hasta la página 200 (de 550) no empiezan a suceder hechos interesantes, pero una vez pasas la mitad del libro te enganchas por saber más y acabas el libro del tirón.

El libro trata sobre el misterio de una chica desparecida mucho tiempo atrás y que es familiar de un anciano magnate que quiere resolver el asunto de una vez por todas. Un periodista con problemas y una investigadora privada con todavía más problemas se ven envueltos en la misma aventura.

Le veo dos problemas al libro. El primero es el nombre de los sitios y ciudades ya que excepto Estocolmo no hay forma de aclararse con el resto. Y el segundo es, como he dicho antes, que el comienzo es muy lento.

Me ha gustado el libro pero no creo que sea tan bueno como la gente dice. Me ha parecido un libro más, decente sí, pero uno más. Supongo que tendré que leer el siguiente a ver si mejora la cosa...

Actualizado: Si queréis saber más sobre el libro podéis echar un ojo aquí.