Una de las tareas más importante que realizan algunas aplicaciones es el manejo de la entrada y salida ya sea al sistema de ficheros o a la red. Desde las versiones iniciales de Java se ha mejorado soporte añadiendo programación asíncrona de E/S, permitir obtener información de atributos propios del sistema de archivos, reconocimiento de enlaces simbólicos y facilitado de algunas operaciones básicas.
Continuar leyendo...
Ya he comentado que a mi los Mac ni macOS me convencen por varios motivos, por su precio, por el software libre y porque lo que he podido comprobar no me ha parecido que tenga nada de lo que GNU/Linux hoy en día tenga algo que envidiar, algunas cosas en macOS quizá sean algo mejor pero otras en GNU/Linux también en él lo son.
Tras regalar mi antiguo portátil Sony VAIO ahora estoy buscando nuevo equipo y barajando opciones. El Sony era y es un buen equipo con el que he estado muy contento, tenía un Intel Core i5 3210M Ivy Bridge de 22 nanómetros con dos núcleos y 4 hilos con el bug Meltdown y Spectre, 8 GiB de memoria RAM, almacenamiento SSD de 256 GiB SATA de almacenamiento y una pantalla de resolución 1600x900, la gráfica era un integrada Intel HD 4000 básica pero más que suficiente para un entorno de escritorio y con buen soporte en GNU/Linux por sus controladores de código abierto. Sin embargo, aunque era un portátil lo usaba únicamente como equipo de escritorio sin moverlo en ningún momento y en cuanto a memoria los 8 GiB de memoria sigue siendo perfectamente útiles pero en mi uso en algunos casos se me quedaban cortos al virtualizar o usar varios contenedores Docker.
Los tipos genéricos en Java se implementaron usando type erasure por simplicidad en la implementación, no incurrir en penalizaciones de rendimiento o memoria y por mantener la compatibilidad con versiones anteriores de Java. Son varios los conceptos que están asociados a la implementación de los tipos genéricos en Java que es recomendable conocer como type erasure y métodos bridge de este artículo pero también heap pollution, non-reifiable, wildcards y bound type parameters.
Continuar leyendo...
En versiones anteriores de Java 9 había un único runtime para ejecutar cualquier aplicación que debía ser instalado previamente para la ejecución de la aplicación. Aunque la aplicación no usase Swing por ser una aplicación web o cosas como CORBA ya en desuso aún estaban disponibles en el runtime por motivos de no romper la compatibilidad con versiones anteriores.
Esto hacía que las aplicaciones no fuesen lo más eficiente posible y aumenta el tamaño necesario ahora de las imágenes de contenedores como Docker estas tuviesen un tamaño mayor del imprescindible, además de hacer que el tiempo de arranque sea algo mayor e incluir clases que aumentan la superficie de ataque ante un fallo de seguridad. Entre las novedades de Java 8 se añadieron los compact profiles que eran subconjuntos más reducidos del runtime pero eran conjuntos prefijados, las aplicaciones debían usar el mínimo que necesitasen si querían usar alguno. La solución de Java 8 fue una solución intermedia, los módulos de Java 9 han sido la solución completa.
Oracle y los ingenieros a cargo del desarrollo de Java están haciendo en mi opinión un buen trabajo que se han materializado en las versiones Java 8 con las lambdas, en Java 9 con los módulos y en Java 10 con la mejora en la inferencia de tipos. Todo ello está haciendo que la plataforma evolucione más rápido y significativamente que lo que hasta hace unos años estábamos acostumbrados.
Continuar leyendo...
Por motivos laborales y por política de la empresa tuve que elegir como equipo un portátil de Apple, en concreto un MacBook Pro con procesador Intel Core i5, 16 GiB de memoria y 512 GiB de almacenamiento SSD. Prácticamente el mejor portátil que había en su momento en el catálogo de la manzana que tendría un precio seguro más de 2000 € y quizá 2500 €. Este cambio me ha permitido poder comparar con mi propio portátil, un Sony Vaio con procesador Intel Core i5 3210, 8 GiB de memoria y 250 GiB de almacenamiento SSD y la distribución Arch Linux de GNU/Linux.
Una de las tendencias de la tecnología desde sus inicios es que en todo momento está en constante evolución y mejora. Cada vez es más potente, más pequeña y más barata. Hay multitud de ejemplos en cualquier dispositivo electrónico que se use para ver su evolución desde discos duros de 5 megas que ocupaban un armario y pesaban varias decenas de kilos a ahora las tarjetas microSD del tamaño de una uña con una capacidad de 256 GiB, de procesadores que en los años 70 funcionaban a una frecuencia de unos pocos megahercios a ahora varios gigahercios, de memorias RAM de unos pocos kilobytes a ahora varios gigabytes, de chips con unos miles de transistores, ya no digamos válvulas de vacío, a varios miles de millones de transistores que emplean ahora las GPU de las tarjetas gráficas.
Junto con los ejemplos de la cena de los filósofos y la barbería el de los fumadores es otro ejemplo clásico que se estudia en las asignaturas de sistemas operativos. Estos ejemplos necesitan de mecanismos de sincronización y concurrencia para su correcto funcionamiento al haber varios procesos y recursos compartidos que los procesos intentan utilizar de forma concurrente pero que no se debe permitir utilizando notificaciones entre procesos o algunas primitivas de sincronización, concurrencia e hilos que posee Java como mutex, locks o semáforos.
En un artículo de introducción sobre la programación concurrente en Java explicaba cuales eran la facilidades que proporciona este lenguaje para la programación concurrente en múltiples hilos. En él exponía dos ejemplos clásicos que se estudian en las asignaturas de sistemas operativos, uno de ellos era el de la cena de los filósofos donde varios filósofos sentados en una tabla durante una cena se dedican a pensar y cuando tienen hambre comen usando para ello dos tenedores que comparten con sus compañeros que se sientan a la izquierda y derecha.
El propósito original de las Raspberry Pi era educativo y se ha hecho muy popular debido a su bajo precio y un buen trabajo de marketing. Sin embargo, puede utilizarse para muchos otros propósitos desde aprendizaje a programación, electrónica, servidor de archivos personales, descarga de películas, series y libros con torrent y también como una consola de juegos antiguos de arcade.
Continuar leyendo...
Las expresiones regulares definen un patrón que permite encontrar coincidencias en cadenas de caracteres, reemplazar coincidencias o validar que las cadenas de caracteres cumplen el patrón. Las expresiones regulares son potentes expresiones que resultan útiles en muchos casos pero son expresiones que pueden llegar a ser complejas cuyo uso se aprende con la experiencia. Una de las funcionalidades que poseen es hacer referencia a grupos de captura anteriores en la propia expresión regular o en la cadena de reemplazo.
En la universidad se explican las formas normales, en mi caso que yo recuerde hasta la tercera forma normal. Conocer la tercera forma normal suele ser suficiente pero en la teoría existe hasta la sexta forma normal. Cumplir las formas normales evita redundancias e inconsistencias en los datos a costa de crear más tablas que en algunos consultas puede hacerlas lentas. El proceso contrario de la normalización es la desnormalización, puede producir inconsistencias pero los datos son más sencillos y en algunos casos más rápido de consultar.
Continuar leyendo...
Hoy se cumplen 8 años desde que creé y empecé a escribir en un blog, primeramente El blog de pico.dev y más tarde en Blog Bitix. Durante este tiempo he escrito 485 artículos entre ambos blogs, en Blog Bitix ya tengo más artículos escritos y publicados de los que he tenido en El blog de pico.dev. Ocho años ya son una cifra considerable y requiere gran constancia, dedicación, motivación, perseverancia y gran cantidad de tiempo. Muchos blogs no llegan a esta cifra.
El mantenimiento de un programa es la parte que más tiempo consume en su desarrollo y realmente son más los proyectos que hay que mantener que los que se empiezan desde cero. Por lo tanto el software se debe diseñar además de para funcionar correctamente y de forma suficientemente eficiente de tal forma que los futuros cambios sean en la medida de lo posible sencillos de realizar. Hay varios motivos por los que un software necesita mantenimiento según sus categorías:
A diferencia de los seis años anteriores este la BilboStack ha tenido lugar en el Palacio Euskalduna en vez de la Universidad de Deusto permitiendo un aforo aún mayor que el de la universidad y con unas salas más grandes y butacas más cómodas que las espartanas sillas de la uni en las que igualmente si se ponía atención y luego esfuerzo se aprendían cosas interesantes, muchos hemos pasado varios años en ellas.