Hace un tiempo tuve necesidad de generar cierto contenido sobre varios writers, la necesidad en concreto era generar un archivo xml en disco y al mismo tiempo el mismo contenido para un correo electrónico. Para no escribir lo mismo en dos Writer diferentes la solución fue crear un writer y este fuese el que escribiese el contenido que se le enviaba sobre varios writers. En la API de Java no hay una clase específica que haga esto pero es muy sencillo hacer una implementación que lo haga, esto va a ser lo que explicaré en el siguiente artículo.
Usar un protocolo seguro garantiza de que los datos intercambiados entre el cliente y el servidor no son leídos ni modificados por una tercera parte además de verificar que la comunicación se está realizando entre las partes que dicen ser. Para usar un protocolo seguro como SSL/TLS debemos disponer de con certificado, con OpenSSL podemos generar y convertirlo al formato que deseemos, sin embargo, para que el usuario tenga garantía de que el certificado es válido este se debe estar firmado por una autoridad de certificación (CA) en la que confíe, generalmente con una de las autoridades de certificación cuyos certificados están preinstalados en el navegador web (en Firefox podemos verlos en Preferencias> Avanzado> Certificados> Ver certificados), los certificados autofirmados son útiles para hacer pruebas pero no son válidos para los usuarios. En este artículo comentaré que tipos de certificados hay y donde podemos obtener o comprar un certificado digital firmado por una CA que sea de confianza para el usuario.
En esta nueva revisión de las opciones de alojamiento que disponemos incluyo algunas nuevas que en su momento no conocía. Dependiendo de las necesidades y del presupuesto que tengamos podemos optar por un servidor propio, un proveedor de hosting, usar alguna de las nubes más utilizadas o algún otro PaaS o IaaS.
Continuar leyendo...
Para cada servicio deberíamos emplear una contraseña de una longitud de al menos 8 caracteres que incluya letras en minúscula, mayúscula, números y símbolos, una herramienta que podemos utilizar para generar contraseñas más seguras con los criterios que indiquemos es Strong Password Generator o Password Generator.
Sin embargo, recordar cada una de estas contraseñas es muy difícil de modo que es habitual que utilicemos la misma contraseña para varios o todos los servicios y no empleando todos los criterios anteriores o usar una herramienta con la que Guardar contraseñas de forma segura con KeePassXC. Por otro lado, los desarrolladores no deberíamos guardar en la base de datos las contraseñas que nos entregan los usuarios en texto plano, para evitar guardalas en texto plano hace un tiempo se utilizaba únicamente una función de hashing unidireccional como MD5 o SHA, de este modo si la base de datos fuese comprometida en teoría no podrían conocer la contraseña original. En este artículo comentaré que aún guardando las contraseñas con una función de hashing no es suficiente para hacerlas seguras y comentaré una implementación con Apache Shiro de una de las ideas propuestas, también con Spring Security es posible.
Si en una aplicación o proyecto tenemos necesidad de ejecutar uno o varios procesos múltiples veces donde únicamente cambian los parámetros, de forma seguida y el tiempo de ejecución de esos procesos es corto probablemente quizá veamos que la mayor parte del tiempo empleado de los procesos sea empleado en iniciar la máquina virtual Java (JVM). Digo quizá porque usando Ubuntu en la nube de Amazon EC2 el tiempo de inicio era de varios segundos, sin embargo, en mi ordenador personal usando Arch Linux y con un disco SSD de Samsung los tiempos que obtengo son de unos pocos milisegundos, quizá la larga lista de dependencias del paquete de Java 7 en Ubuntu (probablemente del paquete openjdk-7-jre) y ocupando considerablemente más megas en disco tenga algo que ver:
Hace ya unos años comentaba varios motivos para elegir Apache Tapestry como framework para desarrollar una aplicación o página web. Entre las varias razones comentaba la productividad como característica destacada. Uno de los motivos de esta productividad era por la alta reutilización de código que se puede conseguir al usar los componentes múltiples veces en un mismo proyecto o en diferentes proyectos creando una librería de componentes como comento más detalladamente en el libro PugIn Tapestry. Otra parte de la productividad que comentaba más ligeramente era poder detectar de forma rápida errores de compilación no solo en el código Java a través del IDE sino porque con Tapestry es posible detectar errores de compilación en todas las plantillas tml que generan el html fácil y rápidamente con un botón sin tener que probar manualmente toda la funcionalidad. El tema de este artículo es mostrar más en detalle como detectar los errores de compilación en las vistas con este framework.
Las aplicaciones están pasando de ser elementos aislados, grandes y monolíticos a ser desarrolladas como varios microservicios que colaboran entre si para en conjunto ofrecer la funcionalidad deseada. Aunque los microservicios presentan sus propias problemáticas resuelven algunas que poseen los sistemas monolíticos, entre algunas de sus características deseables están: mayor cohesión, menor acoplamiento, menor tamaño, mayor independencia de la tecnología usando la más adecuada en cada situación, más fácilmente reemplazables y despliegues más sencillos. También, la funcionalidad ofrecida por una aplicación puede quererse consumirse desde otra aplicación surgiendo de esta forma una API. Para ofrecer una API de una aplicación que pueda consumirse internamente, desde diferentes dispositivos o por terceras partes podemos usar SOAP o REST pero también han surgido algunas alternativas como Apache Thrift supliendo algunas carencias de las anteriores aún basándose en el mismo concepto de llamada a código en una máquina remota (Remote Procedure Call, RPC) ya visto en algunas opciones más antiguas como la misma SOAP, RMI o CORBA. En este artículo explicaré algunas diferencias entre SOAP, REST y Apache Thrift y mostraré un ejemplo sencillo con código de cómo empezar a usar Apache Thrift.
La tendencia de las aplicaciones es que sean construidas como múltiples servicios pequeños que colaboran entre si en vez de consistir en una aplicación grande desplegada en un servidor de aplicaciones. La aparición de nuevas tecnologías como Docker facilitan la construcción y despliegue de los microservicios. Los microservicios con su máxima de bajo acoplamiento y alta cohesión tratan de incluir todo lo necesario para funcionar evitando las dependencias de cualquier tipo de elemento fuera de su ámbito no incluyendo el uso de otros servicios. Con Docker es posible desplegarlos en cualquier máquina que disponga del servicio, esto evita problemas de configuración al pasar la aplicación de un entorno de desarrollo a uno de producción ya que las características del entorno de desarrollo y el de producción pueden ser idénticos.
Por defecto los datos de la sesión de una aplicación web Java se guardan en el servidor de aplicaciones y en memoria, esto produce que al reiniciar el servidor por un despliegue los datos de la sesión se pierdan y provoque en los usuarios alguna molestia como tener que volver a iniciar sesión. En Tomcat existe la posibilidad de que los datos de las sesiones sean persistidas en disco con la opción saveOnRestart del elemento de configuración Manager que evita que los datos de las sesiones se pierdan en los reinicios, al menos para los servicios formados por una única instancia. Para evitar que los usuarios perciban los reinicios o caídas del servidor hay varias soluciones algunas tratando de diferentes formas externalizar las sesiones del servidor de aplicaciones. Con estas soluciones se pueden hacer despliegues sin caídas, sin que las perciban los usuarios, siendo útil para hacer actualizaciones frecuentemente, continuos, y en cualquier momento cuando tengamos una nueva versión de la aplicación.
En el anterior artículo explicaba como crear un listener que reciba eventos de Hibernate pero quizá necesitemos en el listener hacer uso de un servicio de Spring si el proceso de la acción necesita aprovecharse de la funcionalidad proporcionada en los servicios. En este artículo mostraré como crear un listener de Hibernate que use un servicio de Spring, es decir, un listener de Hibernate con la posibilidad de inyectar servicios de Spring.
En alguna ocasión puede que tengamos la necesidad de realizar alguna acción cuando una entidad es guardada en base de datos, actualizada, eliminada, cargada, … . Algunos casos de uso pueden ser:
Establecer la fecha de creación o de actualización del objeto cuando es persistido en base de datos.
Cifrar un dato del objeto al ser persistido en base de datos.
Proporcionar seguridad de modo que un usuario solo pueda modificar o acceder a los objetos a los que tenga acceso.
Al persistir el objeto guardar en un campo el valor calculado resultado de una función.
Cualquier otra restricción, cálculos o acciones.
Para realizar estas operaciones podemos hacerlas de varias formas, una puede ser usando triggers de la base de datos disponibles en Oracle y PostgreSQL. Si usamos Hibernate como librería ORM de persistencia en una aplicación el equivalente a los triggers de BBDD es mediante un listener que sea llamado al ocurrir ciertos eventos. En la clase EventType está la lista completa de los eventos que podemos recibir y la clase listener que debemos implementar para recibir cada uno de los eventos. Esta es la lista de los eventos disponibles según los conceptos que usa Hibernate:
Aunque no es muy utilizada, para tareas de depuración es una ayuda que bien empleada permite descubrir el origen de algún bug en un programa. Los asserts en Java son ignorados, por tanto no suponen ninguna penalización en tiempo de ejecucción, salvo que se indique de forma explicita en la ejecución del programa, esto permite añadirlos al código fuente y activarlos en el momento que se desee realizar una depuración para encontrar errores.
Continuar leyendo...
Arch Linux es un distribución rolling release en la que los paquetes son actualizados constantemente en cuanto sale una nueva versión. Esto tiene la ventaja de que siempre se tiene el sistema actualizado con las versiones más recientes de los programas, en los que se van añadiendo nuevas características y corrigiendo errores de seguridad y funcionales. Sin embargo, en algún momento puede ocurrir que una actualización de algún paquete nos introduzca algún error, en este caso podemos hacer una desactualización o downgrade de paquete y volver a la última versión estable.
Este día 6 cumplo un lustro con las bitácoras El blog de pico.dev y desde hace un año con Blog Bitix. 5 años como blogger en los que normalmente he escrito un artículo cada semana y he publicado los viernes o sábados. 5 años escribiendo artículos en los que comparto el conocimiento que tengo y voy aprendiendo tratando de que sirvan de alguna forma a alguien que los lea.
Después de pasado todos estos años los motivos por los que lo empecé los sigo manteniendo y quizá aún con más ganas de seguir escribiendo para compartir el bueno o malo mucho o poco (trato de que sea bueno) pero tal como es el conocimiento que poseo. En mi caso tener un blog es una de las buenas cosas que me alegro de haber empezado, por el momento no me canso de seguir escribiendo y me permite aprender sobre cualquier cosa que me interese en cada momento. Los artículos que escribo no suelen tratar temas de actualidad salvo algunas ocasiones relevantes como con la nueva versión de Java 8, de vez en cuando hago algún análisis de los productos tecnológicos que pasan por mis manos como un lector de libros electrónicos, el portátil que compré hace unos años o un disco SSD. Últimamente publico pocos artículos sobre linux o el software libre como De Windows a Arch Linux, más tarde De Arch Linux a Arch Linux o instalando linux a un portátil viejo y últimamente más artículos sobre programación con java, desarrollo web, html y javscript. Una amplia colección de artículos que he publicado me han dado incluso para reunirlos y, completándolos con un poco más de contenido, hacer con ellos un libro sobre Apache Tapestry publicado de forma totalmente gratis en varios formatos incluidos de libro electrónico.
Aunque en muchas aplicaciones no será necesario si desarrollamos una aplicación que trabaje con diferentes países y fechas probablemente deberemos tener en cuenta múltiples husos horarios o zonas horarias. Según estos husos horarios, por ejemplo, en el momento que son las 12:00 en Madrid hora local no son las 12:00 en Buenos Aires, si dos ciudades emplean diferente huso horario hay que tenerlo en cuenta para obtener la hora local en cada ciudad.