JDBC4 y Class.forName()

Solo una curiosidad con la que me he tropezado hace poco. Hay veces que las cosas se hacen inicialmente por necesidad, pero cuando la cosa deja de ser necesaria, se sigue haciendo por costumbre.

Tradicionalmente, cuando se quería establecer una conexión desde Java contra una base de datos, era necesario provocar que el driver de conexión a la base de datos se registrara de alguna forma en el sistema. Esto se hacía con una llamada a Class.forName()

Class.forName("com.mysql.jdbc.Driver");

y esto a día de hoy sigue viéndose en el código.

Pues bien, a partir de jdbc4 que está disponible ya desde java 6, hay un mecanismo alternativo, el de ServiceLoader. Con este mecanismo, un fichero dentro del jar con un nombre, ubicación y contenido concreto permite que al cargar el jar se registre el driver de base de datos (o cualquier otro servicio) de forma automática.

Pasando el tiempo, la mayoría de los jar con el driver de conexión con las bases de datos más conocidas ya implementan este mecanismo, por lo que en código no necesitamos hacer absolutamente nada para que el driver se registre. La llamada a Class.forName() ya es en la mayoría de los casos totalmente innecesaria.

Publicado en java, MySQL | Deja un comentario

Mis experiencias con el UX

No soy diseñador UX, pero si veo diseños en páginas web que uso habitualmente y también, como desarrollador, veo cómo quedan nuestras aplicaciones con los diseños UX. Cuento aquí mis experiencias con aplicaciones que teóricamente son «user friendly».

UX o User eXperience es la parte de diseñar la aplicación, web, móvil o escritorio, para que sea amigable para un usuario. No se trata de poner colores e iconos bonitos, sino de colocar los distintos botones, menús y elementos que componen la web o la aplicación en sitios que sean fácilmente accesibles para el usuario, que los encuentre sin problemas, que las operaciones más habituales estén más a la vista y requieran pocos clicks de ratón, que la aplicación sea intuitiva de usar, etc, etc.

Es algo que desde hace ya unos años está de moda y hay gente dedicada exclusivamente a esto en sus trabajos.

La idea por supuesta es buena, un buen diseño puede facilitar mucho la vida al usuario. Pero al final, lo que hay es gente detrás, que serán o no buenos en su trabajo y que además no es un trabajo fácil, porque hay usuarios de todo tipo y lo que para uno es evidente o amigable, para otro puede no serlo.

Y yo debo ser de estos últimos, porque lo que me encuentro por ahí para mí deja de ser amigable o intuitivo. Y pongo varios ejemplos.

El banco ING direct ha cambiado hace poco su interfaz de  usuario. Antes tenías un botón de «ahorro e inversión». Le dabas y te salían todos tus productos de ahorro e inversión juntos, en un listado, o en iconos, pero todos en la misma página. De ahí ibas al que querías. En dos clicks tenías accesible el fondo de inversión concreto, o el broker de bolsa, o la cuenta naranja que querías.

Ahora por aquello de ponerlo todo junto de primeras, te pones grupos de paneles (cuentas corrientes, ahorro e inversión y, por supuesto, paneles para lo que ellos les interesa, que pidas una hipoteca o un préstamo), pero pueden no caber todos tus productos dentro de esos paneles, así que hay que desplazarse, como se ve en la siguiente imagenHay más productos a la derecha. Desde móvil o tableta, arrastras con el dedo y vas desplazando. En el ordenador, haces click en el botón «Siguiente ->». Y con eso ves uno más. Si tienes 10 y quieres ver el último, pues 10 clicks. Aquí claramente ING ha empeorado su interface de usuario seguramente teniendo diseñadores UX que lo han pensado muy bien y bonito para móvil, donde no hay mucho sitio para mostrar todo pero tienes un dedo rápido que desplaza cosas. No han pensado mucho en la interface web cuando la ves en un PC normal.

Otro ejemplo es la aplicación del decodificador de TV de Vodafone. Desde que lo tengo, han modificado la interface de usuario dos o tres veces… y cada vez para peor. Más bonita, mas elaborada, pero menos útil.

Actualmente cuando enciendes el decodificador, en vez de ver la tele, ves un panel con un montón de cosas inútiles que siempre tienes que quitar. Esas cosas inútiles son sugerencias de cosas para ver, pero como no tienen ni idea de tus gustos, pues eso, cosas inútiles.

Y una vez que estas viendo un canal de televisión, por ejemplo, una película, si quieres ver la info de la película … tres clicks. Uno para abrir lo de la info, que no te muestra la info sino que te muestra lo que ellos creen que te interesa primero, como empezar a ver la película desde el principio, poner/quitar subtítulos, grabar, .. y un «más información». Segundo click para ver más info y ves lo que quieres, el resumen de la película. Que no se quita solo, al igual que no se quita el panel anterior. Y le das un tercer click, que tampoco te quita esa info, sino que te lleva nuevamente a un panel que te dice qué canal estás viendo ¿?. Afortunadamente, ese sí se quita solo.

En cuanto a las aplicaciones del curro que han diseñado con UX, veo siempre el mismo problema. Toda esta gente suele pensar mucho en web, en móviles, en tabletas y tienden a hacer dos cosas que sí son adecuadas para pantallas táctiles y para web

  • Para pantallas táctiles tienden a poner pocos botones y grandes, que se les pueda dar con el dedo.
  • Tanto para web como para móviles/tabletas tienden a hacer que se sucedan pantallas, vas rellenando datos y pasando a la siguiente pantalla.

Pero esto nos mata en aplicaciones de escritorio, en PC normal. En un PC sueles tener una pantalla grande que manejas con un ratón. No es necesario botones grandes ni tienes la limitación en tamaño de una pantalla de móvil/tableta.

Y tampoco es necesario andar pasando de una pantalla a otra, tienes hueco suficiente en general para hacerlo todo en la misma pantalla sin saturar la pantalla de botones chiquititos ni exceso de información.

El resultado es que lo que para un móvil o tableta puede ser más o menos adecuado, para una aplicación de escritorio en PC es bastante incómodo que requiere un exceso de clicks de ratón.

Publicado en varios | Etiquetado | 1 comentario

¿Merece la pena un Chromebook?


No hace mucho y por capricho me agencié un chromebook. Es un portátil «chiquitín» que lleva el sistema operativo ChromeOS, nada de windows o linux, sino uno propio de Google.

Suelen tener teclado al estilo portátil, pero la pantalla es táctil. Permite además darle la vuelta del todo a la pantalla sobre el teclado de forma que queda para usar como una tableta, con el teclado pegado a la parte de atrás.

¿Cual es mi experiencia?

Pues lo veo un poco limitado, no llega a portátil ni a tableta, se queda en tierra de nadie. Y el ChromeOS parece que está todavía un poco en pañales.

Por un lado, lo de dar la vuelta al teclado para uso como tableta no me convence. Esto de tener la tableta con un teclado «pegado» por detrás es un poco «raro» si no incómodo.

En ChromeOS tienes el Google Play de Android y teóricamente puedes descargarte las aplicaciones y usarlas. Mis primeros experimentos:

  • La app de Microsoft Office no está soportada. Tienes que bajarte por separado elas app de word, excel, etc. No es grave, pero que no soporte la primera app que se me ocurre probar no mola.
  • Google authenticator, tampoco. Curioso que una app de Google, en el Google Play no esté soportada en el sistema operativo de Google.
  • El navegador Brave que estoy probando estos días, funciona pero no sale el apartado de recompensas.
  • Juegos, no he probado, pero no he probado porque los juegos que juego con tableta/móvil, estilo Class Royale, no me parecen muy adecuados para jugarlos con teclado directamente o con teclado pegado detrás de la tableta.

Así que por aquí la experiencia no es buena, las app de Android puede no comportarse igual o simplemente no ser compatibles con ChromeOS.

La otra cosa que no me ha convencido es el tema de las barras de scroll en el navegador (Chrome). A veces aparecen por lo que puedes ir con el ratón y arrastrarlas. Otras veces no aparecen, pero si llevas el ratón encima aparecen y puedes arrastrarlas. Y otras veces no aparecen de ninguna manera, no te queda más remedio que llevar el dedo a la pantalla táctil y hacer el scroll a dedo. Me resulta incómodo.

Y otra que me ha molestado. En el teclado no hay una tecla para mantener las mayúsculas. Buscando por google, si encuentras cómo mantener las mayúsculas activadas, pero te preguntas ¿por qué tienen que hacer cosas raras con el teclado?. Si, es cierto, es google, el del buscador web, así que seguramente es más importante una tecla con lupa para buscar en el buscador que una de mantener mayúsculas.

Así que veo útil un Chromebook solo si quieres moverte bastante (viajar) y necesitas consultar cosas en internet y tienes que escribir con frecuencia (correos o documentos), por lo que necesitas un teclado decente. Tendrías que buscar un Chromebook que sea más barato que un portátil, porque si el precio es similar, seguramente le saques más partido al portátil.

Y por supuesto, si lo vas a coger pensando en una app de Google Play concreta, primero entérate si funciona bien.

Y si te decices a comprarlo por amazón, haciéndolo a través de este enlace me ayudas un poco 🙂

Publicado en compras | Etiquetado , | Deja un comentario

Navegador Brave

Logo de BraveAndo últimamente echando un ojo al mundo de las criptomonedas y me he encontrado, de rebote, con el navegador Brave.

Es un navegador basado en Chromium, navegador de código abierto liberado por google y en el que se basa Google Chrome y otro montón de navegadores.

Brave se centra principalmente en la privacidad, seguridad y experiencia de usuario, haciendo básicamente dos cosas

  • Bloquea todo tipo de anuncios intrusivos y molestos. Hay extensiones para Chrome y otros navegadores que bloquean anuncios, pero con Brave viene por defecto.
  • Bloquea cookies de terceros, de forma que nuestros datos no se andan cediendo por ahí.

Todo esto hace que la navegación sea mejor, al no tener que aguantar popups de anuncios y siendo más rápida la carga de páginas, tanto por el bloqueo de anuncios como de cookies de terceros.

Además, al basarse el Chromium, es compatible con todas las extensiones de Google Chrome y ofrece facilidades para importar favoritos y otros datos que tengamos en Google Chrome.

¿Y qué tiene que ver Brave con Criptomonedas?

Pues que es un proyecto que se ha financiado como se financian ahora muchas startups. Publican su idea de proyecto, crean su propia criptomoneda (el BAT o Basic Attention Token), la ponen a la venta y si convencen a la gente en general para que la compren, tienen su financiación.

Y en su idea de proyecto está hacer un navegador seguro y financiarse cobrando a los anunciantes, mostrando anuncios en su navegador Brave. Pero con unas diferencias importantes respecto al método tradicional de anuncios:

  • Tú decides si quieres o no ver anuncios. Para motivarte a que los veas, te pagan con su criptomoneda si permites que Brave te muestre anuncios. No mucho, pero sí algo.
  • Los anuncios no son intrusivos. En mi caso y de momento sale de vez en cuando una notificación de windows en la esquina inferior derecha de mi pantalla, o una notificación de android. De vez en cuando quiere decir que tú eliges, entre un anuncio a la hora y 10 anuncios a la hora
  • Si eres un publicador de contenido, puedes registrar tu sitio en Brave, permitiéndoles poner anuncios cuando se visualice tu página. Te pagarán entonces, también con su criptomoneda. No tengo muy claro si esta funcionalidad ya está en marcha o de momento sólo es una intención.
  • Y lo más importante, qué anuncios se te muestran se decide en función de las páginas que visitas, pero toda esa info de qué páginas visitas está en tu navegador, en tu PC y no sale a los servidores de nadie, preservando tu anonimato/confidencialidad.

En fin, un descubrimiento. Aunque solo sea por ver las páginas sin popups de anuncios molestos merece la pena. Lo de las criptomonedas es un pequeño plus que puede resultar intersante a algunos.

Publicado en Uncategorized | Etiquetado , | Deja un comentario

Desarrollador viendo como se testea el producto

Una idiotez que me ha gustado 🙂

Pongo el enlace, que no deja poner aquí el vídeo. Devs watching QA test the product.

 

 

Publicado en anécdotas | Etiquetado | 2 comentarios

Spam en el foro SMF. Anti-Spam

logo SMF Desde hace ya mogollón de años, tengo un foro de java con SMF (Simple Machines Forum). Y desde hace ya mogollón de años vengo sufriendo el spam. Montones de «bots» registrados al día y algunos consiguen llegar a meter mensajes de spam en el foro.

Fui poniendo lo que permite SMF como anti-spam. Un captcha y preguntas que el usuario que quiere registrarse debe contestar. Las preguntas deben ser sencillas para que un usuario normal no tenga problemas, pero que un bot no pueda constestar fácilmente. Mis preguntas eran estilo de qué color es el caballo blanco de Santiago o cuanto es 2+3.

Pues nada, sigue habiendo problemas, así que me he puesto a buscar alternativas. Y encontré esta lectura que me ha llamado la atención «Qué puedo hacer contra el spam»

Resulta que los bots en general pueden con los captchas y según dice ese artículo, un captcha da más problemas a un usuario legítimo al registrarse que a un bot. Desde luego, el captcha más complejo de SMF a mi me cuesta o no puedo leerlo y no ha conseguido parar a los bots.

Resulta también que los bots saben hacer cuentas en las preguntas estilo cuánto es 2+3 y resulta que también prueban a poner todas las palabras de la pregunta como respuesta, con lo que lo de qué color es el caballo blanco de Santiago tampoco es una buena opción.

En este hilo leo posibles buenas preguntas para hacer. Algo que nadie necesita saber puesto que la respuesta se busca en la pregunta y que teóricamente dificulta el asunto a los bots. Preguntas estilo «Pon los tres últimos números que hay en la cadena dg7564gh»

Así que he cambiado las preguntas a preguntas de este estilo. A ver qué pasa.

Publicado en Uncategorized | Etiquetado , , | Deja un comentario

Spring y JMS

Usamos Spring Framework (no Boot) yJMS (ActiveMQ). Y le estamos dando bastante caña, por lo que empezamos a sospechar si algunos de nuestros problemas de rendimiento pueden venir por ahí.

Spring trae por defecto un conversor de las clases java a XML para el envío del mensaje por JMS y luego el desparseo correspondiente en la parte de recepción. Son las clases MarshallingMessageConverter y XStreamMarshaller actuando conjuntas.

Por ver si afecta a la eficiencia y aprovechando que Spring, quizás no de forma fácil o evidente, es bastante configurable, me he hecho un par de conversores de mensajes JMS/Spring pero usando Jackson para convertir a JSON en vez de XML y otro usando Kryo para convertir a bytes de forma eficiente y ver si afectan o no al rendimiento global de la aplicación.

No tengo todavía resultados que mostrar aquí, actualizaré este post cuando corresponda, pero ambas clases de conversión las tienes en el ejemplo de spring y jms. Bastaría instanciarlas en spring y meterlas como messageConverter en los jms:listener o jmsTemplate de Spring.

Mi segunda intención, independientemente del resultado, es ver qué me cuesta cambiar la aplicación para que use la nueva versión de ActiveMQ ( ActiveMQ Artemis ) que como dice su propia página web

Apache ActiveMQ Artemis is an open source project to build a multi-protocol, embeddable, very high performance, clustered, asynchronous messaging system

Vamos, «high performance» entre otras cosas. Espero que junto con Spring sea tan sencillo como cambiar dependencias de compilado y algo de los ficheros de configuración.

Empezamos también a cambiar ActiveMQ por Hazelcast. Pero no sé si me ha convencido. Hazelcast es una de las primeras cosas que de forma extraña se nos cae cuando hay problemas de red entre los distintos PCs y por otro lado, me he encontrado con cosas como que un Map.size() devuelve números negativos en ocasiones. Se «arregló» actualizando versión de Hazelcast, pero este tipo de cosas no sé si me convencen.

Así que nada, siguen los experimentos en busca de la «high performance» 🙂

Publicado en ActiveMQ, Hazelcast, SpringFramework | Etiquetado , , , | Deja un comentario

Lombok, una pequeña maravilla

Hace tiempo descubrí lombok  Empecé a encontrármelo en muchos códigos de ejemplo que iba mirando por ahí. Primero eché pestes ¿Por qué tengo que andar bajándome librerías extrañas para ejecutar pequeños códigos de ejemplo tontos?

Sin embargo, veía que se usaba bastante en muchos sitios y yo no la conocía, así que me puse a mirar qué demonios hacía … Y me encantó, descubrí por qué la gente la usa tanto.

En nuestro código java siempre tenemos que andar poniendo métodos set y métodos get, son las buenas costumbres. También constructores con parámetros para rellenar esos atributos de las clases. El famoso método toString() que saca esos atributos por pantalla y que muchas veces nos ayuda en depuración. Los métodos hashcode y equals que siempre van de la mano. Y un largo etcétera.

Los IDE dan soporte para esto. Siempre tienen opciones para generar todo este código automáticamente. Sin embargo, eso tiene una pega. Aparte de la «molestia» de andar por los menús del IDE para encontrar la opción, el código suele quedar muy extenso. Imagina una simple clase con cuatro o cinco atributos que simplemente es una estructura de datos. Hay que meterle cuatro métodos set, cuatro métodos get, el toString, el hashcode y equals de aquellos atributos que consideremos relevantes para decidir si dos estructuras de datos son iguales, constructores. Lo que era una clase de algo más de cuatro líneas puede llegar a tener .. ¿30 líneas? ¿40 líneas? de código generado por el IDE y cuya lectura no nos aporta nada. Solo «complica» la lectura de la clase.

Y eso es lo que evita lombok. Tiene muchas opciones, pero por ejemplo, si a la clase anterior le ponemos la anotación @Data, esa clase automáticamente al compilar tiene todos los métodos que hemos dicho. El código fuente queda solo con sus algo más de cuatro líneas de código, pero tenemos todos estos métodos disponibles.

El código adicional se mete en el .class al compilar. No estará en el .java. Y de aquí las pequeñas pegas de lombok, pero que, en mi opinión, creo que se pueden llevar bien:

  • Como es un proceso de compilado adicional, se suele hacer con lo que se llaman annotation processor. Son procesos que durante el compilado revisan las anotaciones de las clases para hacer «cosas» adicionales. Así que requiere que habilitemos esto en maven/gradle o nuestro IDE favorito.
  • Al no estar el código en los fuentes, el IDE no lo encuentra, por lo que nos dará error si intentamos usar por ejemplo un método set generado por lombok. Afortunadamente los IDE contemplan a lombok. No he mirado el caso de eclipse, pero en idea existe un plugin de lombok y tiene las opciones de habilitar el annotation processor.

Si quieres, aquí tienes más detalles y ejemplos de lombok.

 

 

Publicado en java | Etiquetado | Deja un comentario

Jugando con Mockito

A veces me da por hacer test de Junit, sobre todo con código nuevo o cuando tengo que tocar código existente del que no me fio mucho o no tengo controlado.

Y en esta me he tropezado y me ha encantado Mockito.

En el proyecto en el que ando metido se usa mucho Spring Framework y hay muchas clases ya hechas que son instanciadas por Spring y que reciben por inyección otras clases también instanciadas por Spring. Spring ofrece un entorno de test para poder instanciar esta clase con todas sus inyecciones, pero el asunto se complica si estas inyecciones tienen a su vez otras y los test se hacen lentos si por cada test hay que levantar un entorno de Spring.

Y aqui es donde me ha gustado Mockito. Sin entorno Spring, levanto mi clase bajo test y todo lo que spring le inyecta, lo hago con Mocks de mockito. Es bastante inmediato y rápido.

Luego ya queda en los test ir diciéndolo a Mockito qué debe devolver cuando llaman a sus métodos con determinados parámetros (eso se puede liar) y capturar las llamadas a otros métodos para ver si se les ha llamado con los parámetros correctos.

Así que he escrito un ejemplo sencillo con mockito.

Por cierto, mi idea inicial era aprovechar y escribir el ejemplo con Junit5, pero he desistido. Poniendo las dependencias de JUnit5 que se me ocurrieron, no conseguí que al ejecutar los test desde Intellij IDEA detectara que había test. Ejecutando con gradle ni idea si ha detectado o no test, porque no he visto nada relativo a test.

Supongo que es cuestión de leer un poco y funcionará, pero no me ha gustado lo no intuitivo que es. En documentación no dice cuales son las dependencias básicas a poner para que funcione y yo poniendo las que  me ha parecido no lo he conseguido rápidamente.

Publicado en junit, mockito | Etiquetado , | 1 comentario

Maven: Parent, Module y BOM (Bill of Materials)

Aunque últimamente ando con gradle y en gradle he resuelto el tema que comento aquí, quería ver si podía hacer algo similar con maven.

¿Cual es el tema?

Imagina que tienes un «producto» SW en tu empresa, algo como el control de una flotilla de camiones, que vendes a distintos clientes que tienen camiones y necesidad de controlar su flotilla. ¿Y por qué «producto» entre comillas?. Aunque tu producto está guay, cada cliente siempre quiere algunas funcionalidades adicionales que tu producto no tiene, o modificación de las que ya existen y la política de tu empresa es hacerle caso al cliente.

Así que tienes tu proyecto organizado en un montón de proyectos maven (o gradle):

  • Uno o más proyectos maven con el «core» de tu producto donde está lo que sabes que siempre va a ir a cualquier cliente.
  • Varios proyectos maven con «plugins» con funcionalidad adicional que puedes añadir o no a tu core según el cliente los pida o no.
  • Varios proyectos maven con librerías tuyas propias de utilidades, relativas a o no a tu producto. Por ejemplo, si tu producto lee de alguna forma los GPS de los camiones para saber por dónde andan, puedes tener varias librerías para leer distintos modelos de GPS.

Ahora imagina que tienes que trabajar en tu producto para hacerle modificaciones al cliente «Fulanito Logistic» que quiere determinados plugins, alguno más que tienes que desarrollar, te ha pedido además algo que te interesa meter en el core porque lo ves útil para siempre, etc.

Y encima, tienes otro proyecto en paralelo para «Menganito Logistic» que quiere otros plugins distintos y también quiere ciertas modificaciones, pero que mira tú que cosas, no son las mismas que quiere «Fulanito Logistic».

¿Cómo montas esto en tu IDE favorito? ¿Y tu compañero que está trabajando para la otra compañía?

Pues bien, inicialmente, montábamos todo (core, todos los plugins y todas las librerías), pero eso hace que el proyecto crezca cada vez más, se haga más inmanejable y los compilados sean cada vez más costosos. Además, empiezan a proliferar en el código como como «if es para fulanito ….», o algo más elaborado porque tenemos bastante friki como anotaciones en las clases estilo @Menganito.

Así que al final, montamos algo un poco más complejo, pero que permite que nuestro IDE y nuestros jenkins cojan solo lo que es necesario en cada caso.

En algún sitio de la estructura de git, metemos un pom.xml parent con las cosas que son comunes en nuestro producto. Por ejemplo, dependencyManagment con las versiones de spring-framework, junit, slf4j/logback, etc. También  properties que necesitemos, etc, etc.

En la misma estructura de git, tenemos un directorio plugins y debajo de el un proyecto maven para cada plugin. Justo debajo de plugins, tenemos un pom.xml con module para cada plugin, algo así

plugins/pom.xml
plugins/plugin1/pom.xml
plugins/plugin2/pom.xml

Cada plugin tiene como padre al plugins/pom.xml y el plugins/pom.xml tiene a su vez como padre al parent común que tenemos por ahí.

plugins/pom..xml tiene como module a todos los plugins y al core de nuestra aplicación. Este pom.xml es el que montamos en el IDE si estamos trabajando en el producto en general y no para un cliente concreto. Además, es el que metemos en jenkins para asegurarnos que los plugins y el core siempre son compatibles.

Por otro lado, para trabajar para un cliente concreto, creamos en el mismo git un directorio proyectos con dos subdirectorios, menganito y fulanito. Todos con su pom.xml de forma similar al de plugins

proyectos/pom.xml
proyectos/menganito/pom.xml
proyectos/fulanito/pom.xml

proyectos/pom.xml tiene como padre al padre común que habíamos hecho por ahí y menganito/pom.xml y fulanito/pom.xml tienen como padre a proyectos/pom.xml

A su vez, menganito y fulanito pom.xml tienen «module».que con path relativo, incluye los plugins necesarios para ese cliente concreto, así como el core. Tambien, debajo de menganito y fulanito se crean subproyectos con código que es específico para ese cliente y que no tenemos previsto reutilizar más.

El que trabaje para menganito, monta en su IDE el menganito/pom.xml y así solo tiene el core, los plugins específicos y el código específico para menganito, ganando tiempo de compilado, menos complejidad de clases/proyectos en el IDE, etc. También esto facilita el hacer el zip/instalado específico, vía maven, para este cliente concreto. Y un jenkins que solo compila lo de ese cliente.

En parent y modules con maven tienes un ejemplo y detalles de como montar todo esto.

Publicado en maven | Etiquetado | 1 comentario