Apr 27

Tu navegador dice mucho de tí…

 Me ha gustado esta entrada http://www.victorcuervo.com/2011/01/19/tu-navegador-dice-mucho-de-ti/ Según eso, escribiendo cada letra el navegador te completa con la URL que sueles usar que comience por esa letra. Ahí van las mías (las que me salto es porque no sale nada):

A : alcala.chuidiang.org

B : blog.chuidiang.org

C : cinetube.es

E : eltiempo.es

F : facebook.com

G : gettertools.com

H : http://webmail.indra.es

I : imageshack.us

J : javadocx.com

L : localhost:8080

M : micro-blog.chuidiang.org

O : openxmldeveloper.org

P : peliculasyonkis.com

T : travian.net

W : webmail.indra.es

X : xmpp.org

Y : youtube.com

Me gustaría saber a cuántos no les sale facebook en la f, o youtube en la Y…..

Por cierto, en cuanto navegas un poco los resultados cambian…. y la falta de http:// en mis URL revela que uso chrome y el que no haya puesto los enlaces con enlace "pinchable", que soy muy vago 😉

Mar 28

Windows pirated edition

Windows pirated editionEl otro día me tocó hacer una demo delante del cliente. Mi jefa, la jefa de proyecto y yo nos desplazamos a las instalaciones del cliente. Allí, en una sala de reuniones nos esperan dos Capitanes de Fragata (equivalente a Teniente Coronel) y dos capitanes de Corbeta (equivalentes a Comandante).

Ante ese público saco mi portátil, lo conecto al proyector que ya estaba encendido. Enciendo el portátil, aparece en el pantallón el inicio de sesión de Windows. Entro en sesión y lo primero que aparece en grande, delante de todos, mi fondo de escritorio. Sí, ese mismo, el de la foto: Windows pirated edition, service crack 2, right to copy.

En fin, eso me pasa por no ser corporativo y tener mi propio fondo de escritorio en vez de el que nos impone la empresa. Afortunadamente todo el mundo se lo tomó a cachondeo.

Feb 10

Reina el buen humor

 Hudson permite personalizar el título de tu página de compilados con texto html, por lo que permite también poner fotos, y si lo dejas abierto, cualquiera puede poner el texto que quiera. Aquí una foto actual de nuestra instalación de hudson

Captura de hudson

Nov 28

La maldición de las herramientas

web services internet Es bastante habitual que la gente que empieza a aprender java (o cualquier otro lenguaje de programación) coja el IDE correspondiente (eclipse, netbeans o el que sea)  y se ponga a aprender. Esos novatos van programando y con el tiempo van cogiendo ciertos conocimientos y experiencia en java. Pero desgraciadamente, el IDE les hace no aprender ciertas cosas básicas. No es raro encontrarse gente que lleva programando algún tiempo pero que sería incapaz de compilar o ejecutar un programa java desde línea de comandos, usando los comandos java, el compilador javac, o generar su jar con el comando jar.

Y esto no solo pasa con las cosas básicas ni sólo con los novatos. Cuanto más complejo sea el tema y más nos resuelva un IDE o una herramienta/framework cualquiera, menos cosas aprendemos de ese tema y más dependemos del IDE/herramienta/framework. Cuento mi caso de hace un par de días.

Llevo ya unos días trabajando con Web Services con jax-ws. Cuando empecé con ello, no me leí la documentación completa (soy un impaciente) y en seguida me puse a buscar ejemplos de aquí y de allí para ir haciendo mi propio código. Leí en la documentación que para hacer un Web Services bastaba con ponerle unas anotaciones a la clase (@WebService, @WebMethod, etc), compilarla de forma normal, pasarle la herramienta wsgen que viene con jax-ws y listo. Pues bien, eso hice, montando todo desde el principio con maven y plugins de maven. Y desde luego, pasando ese wsgen automáticamente en la fase posterior al compilado.

Hace un par de días me decidí a hacer un tutorial sobre la aprendido y quise hacerlo más de forma manual, dependiendo lo menos posible de herramientas (eclipse, maven, etc). Así que me puse a ello … y empezaron las dudas y a ponerse de manifiesto las grandes lagunas en mi conocimiento.

El problema desencadenante de todo es que hice todos los pasos para el tutorial sin usar la herramienta wsgen y el web service me funciona. Una clase con las anotaciones correspondientes, un main() que arranca un EndPoint, no se pasa el wsgen y funciona, arrancado desde línea de comandos.

Bueno, según la documentación, después de pasar el wsgen se hace el war para desplegarlo en Tomcat o similar. Será entonces que si usas EndPoint no necesitas pasar wsgen, quizás EndPoint hace todo eso que hace wsgen de forma automática. Pero lo grave de todo es que sí, se supone que hay que pasar wsgen, pero realmente no sé qué hace wsgen (sí lo sé, genera unos fuentes java que no sé exactamente para qué sirven).

Así que nada, seguiré de forma manual, intentaré montar el "hola mundo" en un tomcat y veré si ahí es necesario o no el wsgen… Y luego a pelearse con la parte del cliente, que aunque también la se hacer con herramientas, tampoco entiendo el fondo de todo.

Jul 31

Patrón de diseño “calzador”

Head First Pattern Design Tengo un compañero, informático, que es de los que lleva ya muchos años en la empresa. Hace ya bastante que dejó de codificar y se dedica a llevar proyectos, o sea, Power Points, Project, Word …

El otro día, a primera hora de la mañana, le veo por el pasillo con el libro "Head Firts Design Patterns" y extrañado, medio en broma medio en serio, le pregunto " ¿Qué?, ¿Te vas a poner ahora con los patrones de diseño ?". No me contestó, sólo echó una sonrisa de oreja a oreja y siguió su camino.

A última hora del día me encuentro con uno de los compañeros que trabaja con él, este sí, más joven y que todavía se dedica a programar. Extrañado por lo de los patrones de diseño, le pregunto "¿Qué pasa con Dani? ¿Se ha puesto ahora con los patrones de diseño ?". A este también se le puso una sonrisa de oreja a oreja, pero contestó … "Es que hemos tenido una demo con el cliente y necesitaba algo para calzar el proyector"

Bueno, con esta chorrada, aprovecho para despedirme el periodo de vacaciones. Buenas vacaciones a todos.

Jun 28

Amortizando la web de bicicletas

bicicleta en el arbolLa aplicación de bicis a la carta que le estoy haciendo al de la tienda de bicis todavía no está en marcha, falta básicamente subir un catálogo de piezas y clasificarlas (depende más de él que de mí), aparte de arreglillos/añadidos que vaya haciendo. De todas formas, ya he empezado a amortizarla.

El otro día se me ocurrió dejarle la bici a mi hija de 13 años y se ve que se le cruzó un árbol en el camino y se dio contra él. Un rasguño en el brazo, uno de los cables del freno a la porra, tirita a la niña y la bici a la tienda.

Pues nada, le ha cambiado el cable del freno, la probó, le cambió también los cables de los cambios, un buen engrase, la ha tratado con cariño y me ha hecho un buen descuento: no me ha cobrado. Voy a tener que ir poniendo alguna cosa más en la web.

May 26

Auditoría de software

hudson-chicasEntre las herramientas que usamos habitualmente, está Hudson como herramienta de integración continua. Tiene un montón de plugins para instalar y de vez en cuando me dedico a jugar con ellos, para ver qué hacen, alegrar un poco el día a la gente poniendo algún plugin divertido, o haciéndoles tirarse de los pelos cuando necesitan hudson y no está disponible porque le he instalado una cosa que no va.

Entre los plugins, recientemente instalé dos, el de Chuck Norris, que hace que aparezcan fotos de Chuck Norris contento si la compilación ha ido bien, o cabreado si ha ido mal, aparte de poner frases aleatorias estilo "Chuck Norris’s first program was kill -9". También puse otro similar, pero con fotos de chicas.

Pues bien, justo ayer, cinco minutos antes, me llaman por teléfono que van a venir de una auditoría de software para ver, entre otras cosas precisamente el Hudson. Así que, como un loco, mirando qué fotos salían en los proyectos para enseñar sólo proyectos de Chuck Norris, no vaya a ser que algún auditor/a se me mosqueara o mosquease.

May 17

Me aburro

aburridoEs increíble, pero si me pongo a programar de acuerdo a las buenas costumbres (TDD, DRY, métricas, clases pequeñas, código reutilizable, etc), el trabajo de programador se me hace aburrido y pesado. Pierdo más tiempo pensando cómo debería ser el código que en hacerlo.

Me divierto más cuando me lanzo a lo loco, sin pensar y programo/corrijo código según salen las cosas, veo rápidamente resultados y juego sobre ellos.

Pobre del que coja mi código después….

May 03

No han captado la indirecta

Me van a dar un ordenador nuevo y para dármelo configurado, me ha llamado por teléfono uno del departamento de informática, que si le podía dar mi contraseña corporativa. Le he contestado que esperara tres segunditos, que estaba poniendo el pin de mi tarjeta de crédito en un correo de caja Madrid que me lo solicitaban.

Creo que no entendió la indirecta…

Apr 26

Verlo para creerlo

No tengo muy claro cómo comentar esto para que no sea muy rollo y se pueda apreciar en toda su magnitud, pero voy a intentarlo.

Hoy he estado revisando algo de código que me han pasado (de otra empresa, afortunadamente). Se supone que ese software debe hacer lo siguiente

El software tiene 16 puertos abiertos, todos ellos conectados a equipos iguales, por lo que su mensajería y comportamiento es igual en todos ellos. La idea del software es que el usuario pueda elegir uno de los puertos y hacerle un prueba apretando un botón. La prueba consiste en enviar un mensaje concreto (codificado en el código) y ver si la respuesta tarda menos de un minuto en llegar. Cuando el usuario ha elegido el puerto y pulsa el botón, se abre una ventana con un contador que comienza en 1:00 y va hacia atrás. Si la respuesta llega antes de que termine el contador, se oculta la ventana y se le dice al usuario que el puerto está bien. Si no llega, se cierra igualmente la ventana y se le dice al usuario que el puerto está mal.

¿Y cómo hace esto el software que me han pasado?

Pues se ponen 16 botones en 16 variables boton1, boton2, etc. Se guardan en otra clase 16 atributos estáticos boolean etiquetados testeandoPuerto1, testeandoPuerto2, testeandoPuerto3,…. para indicar qué puerto está bajo test. Por supuesto, los puertos también están guardados en 16 variables estáticas puerto1, puerto2, … Cada botón tiene su ActionListener (16 ActionListener) de forma que cada uno de ellos marca su atributo estático testeandoPuerto correspondiente y abre la ventana con la cuenta atrás.

Por si no fuera poco todo esto, lo bueno empieza ahora. Para la ventana con cuenta atrás se hacen 16 clases Ventana1, Ventana2, etc, una para cada botón. Estas ventanas, en su constructor, miran si se está testeando el puerto que les corresponde para arrancar la cuenta atrás. Y durante la cuenta atrás mira el puerto que le toca a ver si llega la respuesta. Por ejemplo, la Ventana7 en su constructor mirar si testeandoPuerto7 es true para arrancar o no la cuenta atrás. Y si la arranca, en la cuenta atrás se mira puerto7 para ver si llega la respuesta. Es decir, las 16 ventanas son exactamente iguales, salvo la variable testeandoPuerto y puerto, que cada ventana mira las suyas.

Y como todos sabemos que si quieres hacer algo bien es mejor hacerlo uno mismo, para la cuenta atrás no usaremos los Timer de java ni para pintar los minutos:segundos que quedan las clases Date, Calendar, SimpleDateFormat ni similares. Lo mejor es hacerse un hilo "vulgaris", guardándose previamente el currentTimeMillis(), haciendo sleeps de 1000 milisegundos, viendo el tiempo transcurrido respecto al currentTimeMillis() que guardamos al principio y multiplicar/dividir por 1000 milisegundos/segundo, 60 segundos/minuto, cogiendo los restos y las divisiones enteras para separar minutos de segundos.

Y claro, como el arrancar o no el Timer está en el constructor de la ventana y no hemos puesto métodos de arrancar/parar/resetear, pues cada vez que se pulse uno de los botones, se hace new de su ventana correspondiente, haya sido o no creada previamente, ya que si no se hace así no hay forma de rearrancar la cuenta atrás una segunda vez.

Resumiendo, 16 variables botón, con 16 ActionListener, 16 variables estáticas, 16 clases Ventanas exactamente iguales salvo por la variable que miran, y news por doquier.

Si soy bueno, puedo entender que quizás le encargaron esto a alguien que no sabe nada de java, quizás es alguien de perfil hardware que se dedica a testear los equipos con osciloscopios y voltímetros, que a su jefe se le ocurrió la brillante idea de hacer un software que ayude a testear, que a él le ha caído el marrón y que quizás incluso le han apretado en tiempo e hizo el copy-paste de las 16 clases Ventana un Domingo a las cuatro de la madrugada porque el Lunes tenía que estar todo a primera hora.

Pero hay que ver estas cosas para entender realmente lo que se dice en muchos posts y de lo que otros países más avanzados en software que España ya se han dado cuenta. Es mejor pagar el doble, el triple (o incluso 16 veces más) a un programador bueno y con experiencia, que pagar cuatro cuartos a dos o tres sin conocimientos ni experiencia ninguna. Imagino, con los conocimientos de java que demuestra, a la persona que ha hecho este código tardando dos o tres semanas en hacerlo, e imagino a algún programador bueno y con experiencia haciéndolo en una tarde, con 16 veces menos de líneas de código. La pena es que los jefes que contratan o encargan estos "marrones" al primero que pillan, no ven estas cosas, ni posiblemente quieren verlas.