Acerca de Jose Antonio

Yo soy el que manda aqui... ¿Que pasa?

Cerrando el 2021

Dentro de dos meses hará 15 años que llevo manteniendo este blog, una eternidad en cuestión de tiempo tecnológico y una eternidad también en tiempo biológico. Generalmente se usa este último día del año para hacer un resumen de lo que se ha hecho y se ha dejado de hacer en el año saliente y dar la bienvenida a los nuevos planes y deseos para el año que entra… Bien, hoy no estoy de humor para ello (que eso no quita que no lo haga en algún momento), mi retrospectiva será más de estos 15 años de blog que de este año de pandemia continuada. Es más, se cumplen ya 20 desde que se publicó algo bajo este dominio… Y eso requiere un poco de historia.

Compré el dominio yoprogramo.com allá por 2001 poco después de haber contratado mi adsl con terra y con el ánimo de poner una web informativa sobre temas de programación. Yo, como muchos sabréis, me defino como programador, un programador con vocación empresarial y con muchas ganas de hacer cosas útiles por todo el mundo. De hecho, si sentís curiosidad, hay entradas de la web en Internet Archive (os muestro la primera de todas de Agosto de 2001):

En aquel momento firmaba como JaeSoft (Jose Antonio Espinosa) ya que lo que más deseaba era crear mi propia compañía de desarrollo de software, aunque por aquel año yo estaba en otra empresa (Sema Group – SlumbergerSema – Atos) haciendo cosas muy complicadas y muy interesantes para la época.

Intenté reunir personas interesadas en programar y en escribir, muy pocas se apuntaron y mi interés por mantener tantas secciones, incluyendo noticias, trucos y demás cosas que podrían servir para configurar un portal se resintió un tanto cuando perdí parte de los contenidos (aquí una imagen para que veáis como era la cosa en 2004 después de recuperar algunos):

A partir de ese año cambié mi rumbo laboral, abandoné la multinacional en la que había trabajado y me puse por mi cuenta. La web sufrió un hackeo en que, afortunadamente, no perdimos nada (pero publicamos el artículo) y la web pasó a estar patrocinada por la nueva empresa que acababa de fundar (Digimate Computer)… Incluso patrocinaba la web más loca que nunca he publicado, una que se llamaba «quiero mi wii» que me ayudo a conseguir una consola wii en un momento en el que había una escased tremenda de ellas. Fue tanta gente la que quería la wii que tuvimos una avalancha de visitas el poco tiempo que estuvo activa:

Hasta que un día de 2007 decidí cambiar de formato, abandonar el portal para el programador que, aparentemente, no usaban demasiados programadores y me daba muchísimo trabajo mantener y creé (utilizando un wordpress que había aparecido el año pasado) mi blog personal.

Y si hace 15 años que llevo escribiendo en este mi blog, puedo seguir escribiendo algunos más… Intentaré estirar lo más posible mi dedicación al mismo durante este año entrante y, finalmente, os deseo a todos que el año 2022 os sea propicio. Desear es gratis, pero es una buena cosa para variar…

Feliz 2022

Gestión de versiones de Flutter

Flutter es un framework que me está gustando bastante, es muy consistente en cuanto a las distintas versiones, se ve muy similar en todas las plataformas y Dart como lenguaje es bastante interesante y nada esotérico (por eso de que usa cosas que ya manejamos y no se dedica a reinventar la rueda).

Flutter Version Management

Tanto es así que empezamos hace unos meses un proyecto de aplicación móvil con Flutter, coincidiendo con la llegada de la versión 2.0 y las cosas empezaron a ir «demasiado deprisa». La comunidad y los mantenedores del sdk parece que se han puesto las pilas y han decidido incluir mejoras a un ritmo trepidante, cuando escribo estas líneas ya vamos por la versión 2.8.1.

Nosotros estabilizamos la app en un contenedor docker usando la versión 2.5.2 de Flutter y nos encontramos ahora que no hay manera de instalar desde cero esa versión con los sistemas que proporciona Flutter. Todos aquellos sistemas en los que hicimos un upgrade ya no los podemos utilizar para desarrollo porque, entre otras cosas, han cambiado librerías y ya no son compatibles algunas partes de nuestro código.

Pero no soy el único con ese problema. Varios de los desarrolladores de Flutter se han encontrado con la misma situación y, afortunadamente, han desarrollado una manera de poder disponer de una versión propia de flutter para cada proyecto… Mediante FVM.

Os cuento los pasos básicos para tener FVM funcionando (partiendo de que has instalado flutter en tu sistema) y cómo usarlo para cada proyecto:

1. Instalar FVM

dart pub global activate fvm

Esto te instala el paquete, pero tendrás que cambiar el entorno para poder acceder al comando fvm cada vez, en mi caso es algo como:

export PATH="$PATH":"$HOME/.pub-cache/bin"

Añadiendo esta línea al final del ~/.bashrc conseguiréis meter en el path el comando FVM

2. Instalar una versión de flutter para su uso posterior

En mi caso quería instalar la versión 2.5.2 y tuve que ejecutar esto:

fvm install 2.5.2

Puedes instalar tantas como quieras (o necesites), puedes conseguir la lista de todas las instaladas con el comando fvm list

3. Usar una versión concreta en tu proyecto

Dentro del directorio del proyecto en el que quieras usar esta versión puedes sustituir el uso del comando flutter por el comando fvm flutter que te ejecutará la versión correspondiente, para indicar qué versión quieres usar debes escribir:

fvm use 2.5.2

Esto te genera un directorio .fvm en donde se almacenarán los enlaces correspondientes, no olvides incluir en tu .gitignore el directorio .fvm/flutter_sdk

Con esto y algunas cosillas más (os dejo consultar la documentación) ya podréis desarrollar y depurar con la versión de flutter que queráis.

log4j, las vulnerabilidades, los parches y la sobre-ingeniería

Durante estos días si te dedicas mínimamente a esto de la informática y has creado algún sistema con Java habras sufrido el problema del log4jshell. Si es que no, pues te lo explico:

log4j es una librería de Java que lleva existiendo desde hace innumerables años y que es muy utilizada para registrar los eventos que tienen lugar en un sistema y poder controlar qué se registra y qué no. Pues bien, la versión 2 de esta librería incluía funcionalidades para hacer sustituciones en las cadenas que se guardan en el log y, continuando con la tradición más añeja de Java, se les ocurrió que sería buena idea que esas cadenas a sustituir pudiesen hacer llamadas a sistemas externos y recibir objetos completos. Utilizando el estandar jndi permitían incluso hacer llamadas RMI o acceder a servidores LDAP. Supongo que el programador que añadió estas funcionalidades vería su utilidad en algún momento, pero también es cierto que yo nunca he visto a nadie usarla.

En fin, que esto llevaba ahí un tiempo y a algún «hacker malvado» se le ocurrió probar qué pasaba si en la url que le pasaba a la cadena a loguear incluía la dirección de un servidor que él controlaba y que permitía descargarse un objeto que hacía «cosas malas» en el sistema… Y la prueba funcionó y en cuanto alguien se dió cuenta que había cadenas extrañas que empezaban por ${jndi:ldap:// y que provocaban funcionamientos anómalos se dio la voz de alarma y se creó un registro de vulnerabilidad (CVE-2021-44228) y con un exploit super-sencillo y que mostraba que había cientos de miles de sistemas afectados.

El parche a esa vulnerabilidad llegó pronto (y eso que log4j está mantenido solo por voluntarios) y mucha gente se pasó buna parte del fin de semana parcheando los sistemas (alguno tardó algo más), aunque sin tener muy claro si el sistema había sido comprometido y modificado antes, cosa que requiere otras medidas adicionales y muy costosas. A día de hoy se ha encontrado que el parche que se hizo no contempla todos los casos y se ha registrado otra vulnerabilidad (CVE-2021-45046) que requiere otro parche… Parches, que, al fin y al cabo lo único que hacen es deshabilitar esa funcionalidad que, en algún momento, a alguien, le pareció interesante.

Son incontables el número de horas que el personal de IT (desde programadores hasta técnicos de sistemas) se han dedicado a tapar este agujero (y seguro que habrá muchos agujeros sin tapar todavía). Eso se traduce en muchos millones de Euros de dinero gastado sin sentido… Y todo porque a alguién «le pareció una buena idea esa funcionalidad» y porque todo el mundo usa componentes que no conoce, en los que «confía», aunque no poga un duro para su desarrollo…

Por cierto… Hay por ahí ya los «negacionistas de los parches» que van diciendo que si los parches son malos, que no saben lo que hay dentro, que todo es parte de una conspiración y esas cositas… En fin, el ser humano es lo que tiene (o no).

ACTUALIZACIÓN 17-12-2021: Hay todavía otro parche que meter, el 2.17.0 ya que hay una cadena especial que puede dar como resultado un DDoS… A ver lo que nos dura.

node.js: no, no y no…

Llevo en esto de la programación desde que tenía 11 años (y ya tengo casi 51) por lo que he tenido que aprenderme muchos lenguajes y trabajar con muchos entornos en mi carrera (Vale, de los 11 a los 18 todo era BASIC, pero luego…). Por poner un ejemplo, aprendí C en 1989 y sigo usándolo a día de hoy ¡Bendita IoT! y siempre he sido partidario de respetar todos los lenguajes y todos los entornos, ya que si alguien se ha tomado la molestia de crear un nuevo lenguaje, bueno, pues por algo será…

Lo que vengo a decir aquí es que no todos los lenguajes, frameworks o entornos sirven para todo y eso es algo que hay que evaluar antes de meterse a implementar un proyecto con todo lo que ello conlleva. Yo, particularmente, he hecho proyectos (que algunos siguen en producción a día de hoy) en casi cualquier lenguaje, desde cy c++ hasta Dart pasando por objective-c (sniff), java, javascript, python, php, swift y cosas más raras con usos más limitados (mira que se han hecho maravillas con ruby y no le encuentro todavía el punto), el caso es que no tengo una especial predilección por ninguno y programo en lo que creo más adecuado para el proyecto… Y aquí viene el tema, si quieres hacer un proyecto que envejezca bien NO LO HAGAS EN NODE

Entendedme bien, el concepto de node es brillante, el tomar un lenguaje construido en base a ñapas, una encima de otra, que tarda decenios en estandarizar las cosas más básicas y que tiene a una legión incansable de programadores generando frameworks y librerías que se pueden medir en frameworks por hora y sacarlo del navegador me parece bien. Hacer un repositorio central del librerías que cualquiera puede utilizar y que permita respetar las dependencias me parece bien también y te permite hacer cosas muy complejas en muy poco tiempo… Eso si, no quieras hacerlas durar en el tiempo…

Yo no tengo muchos proyectos en node (¡Gracias a Dios!) pero os pondré como ejemplo uno que terminé hace tres años… O eso creía yo. Es un proyecto hecho en node para el escritorio, que usa electron como motor (y se han hecho cosas simplemente magistrales con electron, como visual studio code) y unas pocas librerías de criptografía y acceso a blockchain (si, habéis acertado, es una aplicación de criptomonedas). Este proyecto, muy bien programado y probado en 2019 lo dejé aparcado (pero disponible para quien quisiera usarlo) y con el boom de las criptomonedas en 2020 quise volver a usarlo… Pero resulta que no solo ya no compilaba sino que no ejecutaba porque las librerías subyacentes se habían actualizado y sin ningún criterio de compatibilidad hacían que objetos que antes tenían ciertos métodos ahora no los tuviesen o la forma de llamar a las cosas en alguna librerías fuesen distnitas… Bueno, cosas que pasan, me pongo a intentar actualizar las dependencias de esas librerías y a cambiar el código afectado (cosa nada fácil lidiando con un año de cambios en el universo js) y consigo volver a compilar y empaquetar el programa (mediados de 2020)… Dejamos todo funcionando y, como somos gente de pocos recursos y trabajamos lo justo con criptomonedas, no volvemos a tocarlo hasta hoy… Dia en el que me encuentro que una librería de mi sistema no funciona con el electron de antes… Y el electron nuevo ha cambiado cosas fundamentales que me obligaran a cambiar todo el código… Y ya no se si estoy con ánimos para hacerlo.

Y esto es así porque el sistema de npm y node no exigen nada a nadie y hay muchos programadores (muchos más en el mundo js que en el resto del universo conocido) que tienen la santa manía de refactorizar cosas y no pensar en el mantenimiento de lo que se ha escrito sino en la virguería que se conseguirá con la siguiente versión…. Así pues, si queréis crear un sistema mantenible que no tenga que actualizarse cada semana con las últimas librerías y tengas que estar investigando qué es lo que han cambiado los mantenedores de ese paquete, por faor, usa cualquier otra cosa que no sea node

Para un prototipo está bien, para todo lo demás, usa algo distinto.

¿Para qué sirven los bancos?

Hace tiempo que no escribo nada del mundo del emprendedor, pero ahora, más que del emprendedor, me toca hablar del empresario… Porque emprender una aventura es algo emocionante y motivador, pero mantener una empresa es algo que requiere mucho más tesón y resiliencia de lo que nunca te han contado. En esta ocasión vengo a hablaros de un elemento empresarial básico: «los bancos».

Cierta vez que estuve a punto de cerrar la venta de una empresa (más bien un traspaso), la dueña de la empresa que iba a comprar (spoiler, no lo hizo) se preguntaba porqué no teníamos cierto nivel de inversión en la empresa y yo le dije que no teníamos suficientes beneficios para poder hacer inversiones. En ese momento ella me dijo que el dinero no teníamos que ponerlo nosotros, que para eso estaban los bancos. Ahí descubrí que el elemento básico de toda empresa que se precie debería ser un director financiero que pudiese lidiar con los bancos.

Por desgracia en mis empresas no he tenido oportunidad de contratar a un buen director financiero porque estaba demasiado ocupado haciendo buenos productos para mis clientes que, además, nunca he sabido cobrar a su precio y, por tanto, tampoco he tenido demasiado dinero para servicios generales (y por eso llevo 17 años haciendo de hombre orquesta de la empresa)… El caso es que generalmente mi trato con los bancos es bastante breve, no suelo pedir dinero y solo me encargo de mantener la liquidez al nivel que me permite el negocio… Bueno, hasta ahora.

El caso es que pedimos y conseguimos un proyecto de I+D para desarrollar una cerradura inteligente con llaves electrónicas interoperables… Una idea muy ligada a nomorepass y que al CDTI le gustó lo suficiente para aprobarnos la ayuda. Aunque esto de llamarlo ayuda es un poco optimista, el caso es que el CDTI te da un adelanto y cuando terminas el proyecto y te gastas todo el presupuesto, revisa los resultados y si les parece bien te presta el resto del dinero del presupuesto. Es un poco locura, pero si el proyecto es lo suficientemente novedoso y hay mercado puede suponer un empujón interesante. Yo creí que así sería y cometí el tremendo error de solicitarlo, pagar unos carísimos avales a traves de una SGR (ya hablaremos de eso otro día) y contratar a una empresa que nos ayude a conseguir la ayuda y, lo que es peor, poner todo el interés y mis recursos en llevar a término el proyecto.

Estos dos últimos años no han sido los más interesantes para hacer I+D (ni para nada), y los clientes de mi empresa han terminado por ir reduciendo su negocio (al menos con nosotros) y/o retrasando pagos, esto combinado con la inversión que tuvimos que realizar para terminar la cerradura inteligente (nomorekeys se llama por ahora) nos dejó la tesorería temblando… Tanto es así que me vi en la tesitura de buscar financiación, y recordé eso de que los bancos justo dan ese servicio… Pues va a ser que no…

Pedí una línea de crédito (que es una cosa en la que te cobran si no necesitas el dinero y te cobran si lo necesitas, pero que te da la seguridad de poder afrontar pagos extras), no pedí demasiado, 20k que es más o menos el máximo que calculaba que iba a necesitar para poder soportar sin tener que echar a nadie… Y resulta que ahora el banco no da créditos a las empresas si no hay avalistas. ¿¿¡¡!!?? Pero, vamos a ver, ¿No es una empresa? ¿No se supone que pagamos al banco, usemos o no la línea de crédito, precisamente por el riesgo que asume? Da igual que hayas tenido beneficios durante los últimos cinco años, que tengas proyectos aprobados y previsiones de ingresos seguros, el banco no corre NINGÚN riesgo y, lo que es peor, te cobra por no correr riesgos. Entonces, ¿para qué sirven los bancos?

Al final si que he tenido que reducir la plantilla, trago amargo a más no poder en cualquier empresario (de los que se lo curran, no de los que lo heredaron de papá) y, aún así, tendré que seguir buscando fuentes de financiación o inversores ya que aparentemente los bancos ya solo sirven para venderte seguros, alquilarte cosas o ponerte alarmas que nos has pedido (y freírte a comisiones cuando te descuidas)… En fin.