Mi visión de AOS 2012

El pasado fin de semana estuve en Zaragoza asistiendo al evento Agile Open Space 2012 (AOS2012). Era mi primera vez en un evento de tipo Open Space, con el agravante de que llegué cuando ya se habían seleccionado y presentado todas las charlas. La parte buena es que no era mi primer acercamiento al «mundo ágil», sino que he tenido la suerte de poder usar Scrum en algunos proyectos.
No soy muy evangelizadora-ágil, más bien soy firme convencida de que ciertas prácticas funcionan. Abrazaría el manifiesto ágil si fuera algo abrazable, pero no voy por ahí intentando convencer a los directivos o a mis compañeros de que es el único camino. Realmente si ven que funciona, ya se darán cuenta ellos solos. Pero no es el único camino.

Asistí con Barty (coautor de este blog y twittero), intentamos convencer a más gente de que compartieran experiencia y viaje con nosotros, pero no hubo manera (no sé qué nos dijeron de «agilocos» y «open space»). Llegamos el viernes tarde y cansados, así que preferimos ir despejados a las sesiones que serían el sábado.

Como había 7 charlas cada hora, el problema fue elegir a qué charla asistir cada vez. Por suerte había una aplicación en Android Play (Kit AOS 2012), que pese a estar bastante bien, le faltaba en qué sala era cada evento, así que había que volver al «tocho-tablón» cada vez que había que cambiar de sitio.

Mi Agile Open Space se compuso de:

  • Kaizen + Kaikaku
  • ¿Qué motiva a los programadores?
  • We are at war
  • Code smell y deuda técnica
  • Experiencias, técnicas y herramientas para implementar «continuos delivery»

De este listado, saqué cosas muy buenas. La primera charla me gustó, porque vi que en un mismo mundo conviven diversas opiniones, se puede cambiar de opinión antes, durante y después. Me gusta el concepto de mejora continua, Kaizen, pero a veces hay que impulsar ciertas prácticas haciendo intensivos de algo y siendo rígidos en lugar de hacer las cosas poco a poco, ya que si no la gente se nos relaja.

En la charla sobre ¿qué motiva a los programadores? me sentí que me había colado en un mundo al que no pertenecía. Conocía «12 meses, 12 katas«, pero no había participado, aunque me atrae bastante la idea. Fue la primera vez que oía sobre solveet. Es decir, poco podía aportar, salvo oír y aprender. Lo único que podía haber aportado, y no hice, fue que deberían intentar llegar a más gente en lugar de ser un grupito tan cerrado y que se pueda empezar en cualquier momento. El problema más grande sobre hacer ejercicios de programación como hobby es que al final nunca hay tiempo y hay una tasa de abandono muy grande. La gamificación puede ser una posible solución a este problema. Me queda pendiente probar solveet.

Sobre we are at war vi que puedo aprender mucho de mucha gente que ya ha solucionado trabas con las que nos encontraremos los demás en breve. Me gusta la visión que tiene David Bonilla sobre muchas cosas, y encima le admiro porque es embajador de Atlassian en España. Pero lo que más me gusta es que comparte su visión en un mundo competitivo como el nuestro. Debería haber más gente así.

La charla sobre Code smell y deuda técnica estuvo bien expuesta y explicada, pero me hubiera gustado que se ahondara más sobre el tema, ya que se quedaba en los conceptos básicos que probablemente ya todos conocíamos. Quizá faltó tiempo. El coloquio del final estuvo muy interesante. Y gracias a Barty a partir de ahora voy a decir «tu código huele a cuco» cuando vea algo así.

En la última a la que asistí: Experiencias, técnicas y herramientas para implementar «continuous delivery» vi un nicho de conocimiento que a mí no me ha rozado ni de refilón. Casi todo sobre lo que se habló allí me era desconocido. Quizá me esperaba más una introducción que un ejercicio de ver N terminales abiertas y todo ya ejecutándose. Lo que saqué de ahí es un montón de nombres sobre herramientas que tengo que mirar en un futuro y la idea vaga de qué es «continuous delivery», pero estuve cazando moscas casi toda la charla. El ponente me pareció un fiera técnicamente, pero exponiendo tendría que bajar un poco el nivel para que nos enterásemos un poco.

Como conclusión, desde mi punto de vista de novata, diré que me gustó bastante el acercamiento al Agile Open Space. El año que viene, si la agenda lo permite, iré al Agile Open Space 2013, que es en Canarias, y aunque sea lo haré coincidir con mis vacaciones. Como punto a mejorar sería, como ya he dicho, mejorar la aplicación para que ponga más datos sobre aulas o salas donde se imparten las charlas. Y como punto a mejorar personal intentar participar más en las discusiones abiertas que se generan en las charlas. Pero claro, ni tengo la labia de muchos, ni el nivel de conocimiento.

Muchas gracias a todos los asistentes por hacer un fin de semana inolvidable.

Aquí hay fotos de dos de los asistentes (que no conozco personalmente). ¡Creo que salgo en una!:

Conectar Kindle por WiFi con Router Comtrend de Telefónica

Si tienes un kindle 3 ó 4 y cuando intentas conectar a la WiFi cifrada con WPA, WPA2, o cualquier cosa que no sea WEP te dice que has metido mal la contraseña. Podría ser que la hayas metido mal, o podría ser lo que he denominado «el estúpido caso de los routers de telefónica vs. Amazon Kindle».
Hay dos soluciones a esto y sólo recomiendo la segunda:

  1. Poner el encriptado WEP, y dejar que te crezcan los cotillas y pseudo-hackers.
  2. O ir al menú Advanced, dentro de la configuración Wireless y poner la opción WMM(Wi-Fi Multimedia) a Enabled.

Si no sabes qué es esa opción, exactamente igual que yo hasta hace 7 minutos, recomiendo la entrada WMM en IEEE 802.11N : ¿Qué es el WMM (Wi-Fi Multimedia)? donde lo explican.

Login desplegable con jQuery

Resulta bastante sencillo hacer un menú desplegable con jQuery que además de funcional sea bonito. En este caso vamos a ver un menú que se despliega hacia abajo cuando pulsamos sobre «Login».

Lo primero es crear un div con el contenido. Tendremos un link con «Login» y una flechita hacia abajo. Al pulsar sobre login se abrirá el div loginpanel mostrando los campos para el usuario y contraseña, además del botón de Entrar. El HTML es el siguiente:

[sourcecode language=html]


Login


[/sourcecode]

Para poder utilizar jQuery importamos la librería javascript desde googleapis.

[sourcecode language=html]

Login desplegable jQuery

[/sourcecode]

Por último tenemos el código que controlará cuándo se abre la capa del login, se cambia la flecha y/o se cierra la capa al volver a pulsar sobre el login.

[sourcecode language=html]

[/sourcecode]

Cuando se pulsa sobre el div con id «showlogin», se muestra la capa de login cuyo identificador es «loginpanel» con un efecto deslizante (slide). Si la capa ya estuviera abierta, haría lo contrario (se cerraría), por eso se utiliza toggle.
Además, como bonus, se cambia la flecha para indicar que se puede desplegar o plegar el login.

Os podéis descargar el contenido del menú desplegable y utilizarlo donde queráis. Se han añadido unos estilos css para que sea un poco más amigable.

Creación de validadores con anotaciones

Este va a ser un ejemplo rápido sobre cómo crear validaciones con anotaciones a medida del estilo:

@NotEmpty
private String name;

No pretende ser una explicación rigurosa de todas las opciones (para eso existen unos manuales y unas referencias técnicas fabulosas.

Usamos la validación de beans Bean Validation JSR 303, en su implementación de Hibernate (Hibernate validator 4.1.0.Final)

Si, por ejemplo, al dar de alta un usuario, queremos comprobar que el usuario es único, y no queremos meternos en engorrosas comprobaciones e if’s anidados para ver si un usuario está o no dado de alta, podemos querer crear la anotación siguiente dentro del bean que nos interese:

@UniqueUser
private String username;

Y si no pasa la validación, podremos dar un error de validación sin necesidad de ensuciar el código.

Para ello primero se crea la anotación propiamente dicha, por ejemplo «UniqueUser.java».

@Target({ FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = UniqueUserConstraintValidator.class)
@Documented
public @interface UniqueUser {
	String message() default "{user.exists}";
	Class<?>[] groups() default {};
	Class<? extends Payload>[] payload() default {};
}

Lo interesante de aquí es:

  • El nombre que sigue a @interface UniqueUser, que será como llamaremos a la anotación, es decir, utilizaremos @UniqueUser cuando queramos usarla.
  • La línea @Target({ FIELD, ANNOTATION_TYPE }) dice que se podrán anotar campos, pero por ejemplo no métodos (que sería tan sencillo como añadir METHOD)
  • @Retention(RUNTIME) indica que la anotación se aplicará en tiempo de ejecución por reflection. Se escapa de este mini-manual explicarlo en profundidad.
  • @Constraint(validatedBy = UniqueUserConstraintValidator.class) nos indica que la anotación se validará con la clase UniqueUserConstraintValidator, que veremos a continuación.
  • El message es el texto del error. Puede estar internacionalizado en messages_i18n.properties, donde i18n es el locale pertinente.
  • Groups y payload se dejan como arrays vacíos.

La clase UniqueUserConstraintValidator tiene que implementar un ConstraintValidator, y quedaría de la siguiente manera:

public class UniqueUserConstraintValidator implements ConstraintValidator<UniqueUser, String> {

	@Inject
	private UserService userService;

	public void initialize(UniqueUser constraintAnnotation) {
		// No hacemos nada
	}

	public boolean isValid(String username,	ConstraintValidatorContext constraintContext) {

		if (userService.existsUserByUsername(username)) {
			return false;
		} else {
			return true;
		}
	}
}

Como puede verse, hemos inyectado (gracias a Spring) el servicio de usuarios que será el que compruebe si ya existe ese nombre de usuario en el sistema. En el método isValid es donde se valida realmente si el campo username cumple o no la validación, devolviendo true si pasa la validación y false en caso contrario.

Y de esta manera ya tendremos nuestra brand-new anotación @UniqueUser lista para comprobar si el usuario es único.

Android Training

Parece ser que los desarrolladores de Android se han dado cuenta de que era necesario algo más que unos cuantos tutoriales sueltos, así que de la mano de Reto Meier y el equipo de Android de Google, tenemos un curso online: Android Training (Beta). Donde se nos enseñarán las mejores prácticas para crear aplicaciones para android y optimizarlas.

Modo abuela cebolleta ON. Recuerdo en el Google Developer Day de Madrid, allá por el 2008, en el que asistimos a una charla de Reto Meier, donde estuvo bastante insistente con temas para ahorrar batería, buenas prácticas y demás. Por aquel entonces yo no tenía ni idea de nada sobre Android, de hecho los únicos móviles con android los traían ellos desde Estados Unidos, y unos cuantos metidos en el mundillo. Pero molaba mucho. Y sabía que yo quería eso en un futuro… Modo abuela cebolleta OFF.

Por ahora empieza como una beta, pero espero que le den un poco de vidilla, ya que ese es uno de los puntos débiles de Android. Ese y el escaso caso que hacen en el Android Team a los desarrolladores.

Los 7 pecados capitales en programación

Intentando clasificar a los malos profesionales del software se me ocurrió un crossover entre los 7 pecados y la programación. Ahí es nada. Ante todo decir que no pretendo con esto agredir/molestar a nadie. Yo me tomaría este post como lo que es: de humor. Cualquier parecido con la realidad es pura coincidencia.

Lujuria
Reconozco que este es el pecado al que más me ha costado encontrar similitud con la programación. Había pensado incluso hablar de los «tecnosexuales» (o geeks) y ampliar el campo de estudio a los informáticos en general, pero no. Un programador lujurioso es una persona que disfruta con su trabajo hasta extremos inimaginables. Se despiertan a media noche para terminar algo, enseñan código hasta a sus sobrinos de 3 meses, ven belleza en un bucle o en una llamada recursiva. Hay momentos en los que de no ser porque tienen las manos sobre el teclado, parecería que se están tocando. Y sí, su código les gusta más que su pareja.

Gula:
El que sufre de gula en programación probablemente también sufrirá algo parecido a la lujuria. Son personas que quieren leer todo del tema en el que se estén metiendo, intentando digerir cuantas más cosas mejor. Se leen libros, manuales, papers en el transporte, en la cama, en el baño, en clase (así aprenden el doble)… Son ávidos de conocimiento, sobreaprenden cualquier tecnología y, a veces, pueden ser afiliados a los «peros» y a las explicaciones rocambolescas para sacar todo el ansia que llevan dentro.

Avaricia
Hay una subespecie de programadores que tienen algo que llamaremos el síndrome del «héroe de chichinabo». Siempre que se pide a un experto en algo ahí están, siempre que se pide un voluntario, se ofrecen. Son capaces de cargarse de trabajo, coger el departamento de calidad, el de desarrollo, subir a preproducción, empollarse una nueva API y tirar el cableado de la empresa. A la pregunta de «¿Alguien sabe esta nueva tecnología?» Siempre sonríen de medio lado y dicen: «¡Yo, yo, yo!». Son los más peligrosos en empresas pequeñas, porque se terminan convirtiendo en el «héroe apagaincendios» alejando a la empresa de cualquier número CMMI superior a 0.

Pereza
La monotonía no a todo el mundo le aburre. Hay un tipo de programadores que como llevan toda la vida haciendo las cosas de una manera (¡Algunos hasta 30 años!), no quieren salirse de su «zona de comodidad» y probar cosas nuevas. Son personas que rehúyen de nuevas tecnologías, nuevos enfoques, nuevas metodologías e incluso de nuevo sabor de pasta de dientes. Se acomodan tanto que algunos llegan a visitar el peligroso país de la procrastinación. Si te sientas a hacer pair-programming con ellos probablemente acabarás con una úlcera del tamaño del Samsung Galaxy S2.

Ira
Hay programadores que según ponen sus morcillitas sobre el teclado empiezan a echar pestes. Nunca están contentos con nada, siempre hay pegas. Si se cambia de tecnología porque se estaba muy bien con la antigua (en este caso son perezosos), si se mantiene la tecnología que si nos vamos a quedar obsoletos programando en Cobol. Se rebelan contra jefes y compañeros, llevan el mal humor allá donde van y suelen plantar un germen de la desconfianza que puede hacer que el mejor equipo del mundo se tambalee. Son capaces de pelearse con su propia sombra o refunfuñar si les suben el sueldo porque debía haber sido más… Estos tienen más peligro que el equipo de waterpolo de los Gremlins, así que cuidado.

Envidia
Si hay una cosa que hacemos muy bien los españoles es ser unos envidiosos. La envidia es otro germen que va creciendo y que algún día sale convertido en un alien, escupiendo tus entrañas desde dentro (qué gráfico ¿no?). No hay cosa más tonta que compararse con otro porque sabe más que tú, cobra más, es más listo o más guapo. Si la envidia es sana, no pasa nada, todos admiramos a alguien. Pero si en lugar de admirarle le odiamos, ahí es donde entra el problema. De la envidia a la ira a veces hay una delgada línea.

Soberbia
Yo a estos me los imagino sentados en su trono de huesos con mirada altiva y una ceja subida, mientras piensan «pobres mequetrefes, no tenéis derecho a mirarme a la cara si no sabéis qué es la cena de los filósofos». Creen que saben más de cualquier cosa que cualquier otra persona, y lo peor es que no pierden oportunidad de demostrarlo, muchas veces desacreditando a otros o riéndose de ellos. Nota curiosa: un envidioso y un soberbio pueden hacer hervir el agua si están a menos de un metro. Así que ya lo sabéis cuando queráis calentar comida y el microondas esté ocupado.

¿Os incluís dentro de alguna categoría o de varias? Es difícil ponerse la etiqueta de «yo soy así de malo» ¿Eh?

A menéame que lo parta un rayo

Bueno, lo de las caídas de Amazon ya no es trending topic, pero quería hablar sobre ello, más por Amazon que por otra cosa. Y porque lo tenía como borrador cogiendo polvo…

Leí en meneame.net (en uno de esos post recursivos) que un rayo caído en las dependencias de Amazon WS en Irlanda fue la causa de la web llevara caída un tiempo (3 días, sin ir más lejos). Existen otras webs que se vieron afectadas, pero me interesa menéame porque a raíz de esa noticia he encontrado un caso práctico de Amazon Web Services, que es en el mundillo en el que estoy medio metida ahora.

Menéame, tras pasar por varios servicios de hosting, finalmente se pasó a «la nube» de Amazon hace algún tiempo. Concretamente utilizan instancias EC2 (Amazon Elastic Compute Cloud). Es decir, utilizan servidores virtuales de diferentes capacidades, algunos persistentes y otros que utilizan las capacidades de crecimiento bajo demanda, para las peticiones web. Además para los backups utilizan S3 (Amazon Simple Storage Service).

No voy a contar detalladamente su arquitectura, que eso ya lo cuenta uno de los creadores, Ricardo Galli, de meneame.net en su blog, en el fabuloso post «Cómo montamos Menéame en Amazon EC2«.

De lo que quiero hablar es de si los 3 días que perdieron levantando la Web tuvieron que ver con Amazon o también con la arquitectura que han elegido, como algunos trolls les han echado en cara. Dicen que su mayor problema se lo ha dado el servicio EBS (Elastic Block Storage). ¿Y qué es EBS? Pues son volúmenes de almacenamiento a nivel de bloque diseñados para utilizarlos con las instancias de Amazon EC2 a modo de volúmenes persistentes (si muere la instancia el volumen persistente se mantiene y se puede volver a montar en ella o en otra).
Al parecer, Amazon descubrió poco después del rayo que tenían un bug en la gestión de la copia de seguridad de los volúmenes EBS ¡Ole!.

Partimos de la base que Amazon tiene que ser fiable y profesional, ya que muchos externalizamos la complejidad apoyándonos en que ellos pueden darnos servicios que para nosotros serían impensables: por lo caro y complejo. No nos hacemos la idea de que sus copias de seguridad fallen y que se puedan perder datos. Y esto es justo lo que ha pasado en algunos casos.

¿Es culpa de meneame.net no haberlo previsto? En este caso creo que no, precisamente por la premisa del párrafo anterior: Ey tíos, que vosotros lo sabéis hacer mucho mejor, tenéis recursos «casi infinitos», sois más guapos y ¡leche! Sois Amazon. Pero sí sería su culpa si vuelve a pasar y no han creado un plan alternativo.

En mi empresa hemos tenido una experiencia agridulce estos últimos meses con algunos servicios de Amazon. Más dulce que agria, eso también es verdad. Usamos, entre otras cosas, EC2, S3, SimpleDB y el servicio AIM (AWS Identity and Access Management) que permite tener múltiples usuarios pertenecientes a una misma cuenta de Amazon.

A raíz de agunos problemas con AIM nos hemos encontrado con un servicio técnico bastante regular, pocas soluciones a nuestros problemas y, lo que es peor, datos inconsistentes entre fuentes internas. Seguimos una arquitectura basándonos precisamente en datos dados por ellos, y en su promesa de que «Oye, que si quieres más sólo tienes que pedírnoslo (y pagárnoslo)«. Eso hicimos, pero ¡Oh, sorpresa! ¡Oh, campos de soledad! Resulta que ESO no se lo podíamos pedir. Ni pagando.
Veredicto: Cambio de arquitectura en el último momento y esperando a su promesa de «Estamos preparando una cosa genial que será mejor que IAM«.

Siento ser tan críptica, pero la empresa no es mía y no creo que dar detalles de arquitecturas y demás aclare mucho.

Para finalizar: creo que Amazon está muy bien, aunque es algo inmaduro. Madura a base de sus clientes, del dinero de éstos y de sus férreas claúsulas legales por las que si pierden cosas tuyas te tienen que indemnizar realmente poco. Así que si estais pensando en usar AmazonWS, tened claro un plan B, y bastante dinerito.

Microsoft, eres muy raro

Hace algún tiempo aprendí algo muy curioso sobre los ficheros separados por comas (csv) en Windows. Un extraño error que aparecía al intentar abrirlos con excel si tenían algo parecido al siguiente contenido:

ID, NAME, PHONE
1234, Pepe, 915555555
1235, Ana, 915555556

El error que daba era «Se ha detectado que ‘nombrefichero’ es un archivo SYLK, pero no se puede cargar. Puede que el archivo contenga errores o no tenga formato de archivo SYLK. Haga clic en Aceptar para intentar abrirlo con otro formato.«.

¿Qué tiene de especial el fichero anterior? Aparentemente es bastante normal. Pues no, resulta que tiene una particularidad. Si cambiamos el contenido por:

id, name, phone
1234, Pepe, 915555555
1235, Ana, 915555556

Lo abrimos con excel y ¡funciona! No da el error extraño y nadie se queja de nada.

La respuésta la encontramos en lá página de soporte de Microsoft en español o en inglés. En ella se explica el bug: «Cuando Excel identifica este texto al principio de un archivo de texto, interpreta el archivo como un archivo SYLK. Excel intenta convertir el archivo desde el formato SYLK, pero no puede hacerlo porque no hay códigos SYLK válidos después de los caracteres ‘ID’.»

La solución se puede conseguir de tres maneras:

  • Poner «id» en minúsculas.
  • Poner un apóstrofe delante de «ID»
  • Pasarse a LibreOffice

Evidentemente yo recomiendo la última.

Otro de los Expedientes X que me he encontrado es que no se pueden crear ficheros, ni directorios de nombre «con» (o «CON»). Si indagamos un poco, veremos que «con» es una palabra reservada que, junto a unas cuantas más, no se pueden usar desde el pleistoceno hasta Windows 7 (¿y las siguientes versiones? Pues ni idea…).

¿Conocéis alguna otra cosa «rarita» sobre Windows o sus programas?

Cosas básicas que [quizá] no sabías sobre Java (III)

En los anteriores posts pudimos ver algunas curiosidades sobre Java básico, ahora toca el turno a los arrays y operadores.

Arrays

Un array se puede declarar de estas dos maneras, aunque la segunda está desaconsejada:
[sourcecode language=»java»]
int[] anArray;
int anArray[];
[/sourcecode]

Operadores

Veamos algunos conceptos sobre operadores en Java.

[sourcecode language=»java»]
int i = 1;
System.out.println(++i);
System.out.println(i++);
System.out.println(i);
[/sourcecode]

¿Qué salida da este código? Esta quizá es una demasiado fácil… ¿No? Pues hay mucha gente que no tiene muy claro el funcionamiento de ese operador unario de suma como prefijo o sufijo, es decir, antes o después de la variable i. La respuesta aquí es 2, 2, 3 (en distintas lineas, claro).

Y por último ¿Cuál es el operador binario de nombre más largo en Java? Esta pregunta hecha así os llevará probablemente a la solución directamente: instanceof. Comprueba si un objeto es de un determinado tipo (clase, subclase o si su clase implementa una determinada interfaz).
[sourcecode language=»java»]
// Declaración de objeto
System.out.println(objeto instanceof Clase);
[/sourcecode]
Devolvería true si el objeto es del tipo Clase, hijo de Clase o implementa la interfaz Clase y false en otro caso. La idea aquí no es ver qué es instanceof, sino aclarar que es un operador binario cosa que, curiosamente, no sabe todo el mundo. Incluso programadores añejos.

¡Hasta el próximo capítulo!