Acerca de Dani

Soy un ingeniero de software actualmente trabajando como desarrollador freelance. Estoy especializado en desarrollo backend aunque me estoy poniendo al día en cosas en las que antes era bueno y que dejé de lado. Me interesan las buenas prácticas en el desarrollo de aplicaciones, el código bien testado, la usabilidad y la accesibilidad del software. En internet, te enseño a programar a través de mi canal de YouTube, makigas.

Generar AppImages con AppImageKit

Para un proyecto estoy generando ejecutables para GNU/Linux, y el compilador me produce una carpeta con una distribución de archivos. Carpeta bin/ con el ejecutable, carpeta lib/ con las .so… Podría empaquetar eso en un .zip, podría aprender a generar un .deb o un .rpm… o podría aprovechar la ocasión para aprender a crear archivos AppImage.

AppImage es un formato ejecutable autocontenido para GNU/Linux. Es decir, el ejecutable y todas las dependencias (imágenes, bibliotecas dinámicas…) van dentro del propio archivo. La ventaja de esto es que acabas con el conflicto de versiones de bibliotecas dinámicas (la típica de que en GNU/Linux dos programas no se llevan bien porque uno espera que /usr/lib/libwhatever.so sea la versión 1.2.3 y otro espera que /usr/lib/libwhatever.so sea la versión 2.5.8). Al final tienes un único archivo, que haces ejecutable con chmod +x, y que cuando ejecutas funciona normal en cualquier distribución GNU/Linux. Como lo que también buscan conseguir Flatpak y Snap, vaya.

Para crear AppImages, utilicé AppImageKit. Es una herramienta que convierte un directorio en formato AppDir (es decir, con el esqueleto de la aplicación), en un archivo ejecutable de tipo AppImage. Aunque es muy flexible, a la vez es muy sencillo de empezar a usar.

Sigue leyendo

Los formularios en PDF son una mala práctica

Esta es una opinión subjetiva pero me voy a agarrar a ella y pienso morir defendiéndola: los PDF son un formato terrible para representar formularios interactivos. La administración pública parece que se ha agarrado a ellos como una lapa, y es algo que resulta entendible. Si el PDF ya representa de facto un documento digital, un PDF con formularios es visto como el equivalente digital a una hoja de papel que hay que rellenar, pero bajo mi punto de vista esto es un error.

Sigue leyendo

let, apply y similares en Kotlin

De mis características favoritas de Kotlin, una de las más top es que todos los tipos tengan como funciones de extensión una serie de métodos auxiliares: let, apply, also… Son una forma limpia de encadenar código y hasta de transformarlo. El problema es que nunca recuerdo qué diferencia hay entre ellos, así que voy a dejarlo por aquí escrito para la próxima.

Su nombre correcto es scope functions y aceptan como parámetro una lambda con el código que queremos que se evalúe a consecuencia de invocar esa scope function. Su principal gracia, como muestro ahora, es que desde dentro de la lambda se puede referenciar al objeto cuyo método de extensión es invocado. Bajo mi punto de vista, esto está muy bien porque permite no escribir tanto código cuando se usan expresiones largas.

Por ejemplo, supongamos que hay que llamar a varios métodos del objeto accesible desde context.server.settings. Tendríamos que escribir varias veces todo el chorizo de clases. Me invento el código:

context.server.settings.port = 8080
context.server.settings.protocol = Protocols.HTTPS
context.server.settings.resetLogger()

Para no cansarnos de escribir tanto context.server.settings, las opciones serían, o crear una variable local con val sett = context.server.settings para luego hacer sett.port y sett.protocol, o… usar las scope functions y que la variable se declare implícitamente.

Sigue leyendo

Mi experiencia con el Mac Mini M2 Pro

He cambiado mi ordenador del trabajo por un Mac Mini M2 Pro. Ahora más que nunca, es importante que separe el uso que hago de mi ordenador cuando es para trabajar, del uso que hago de mi ordenador cuando no es para trabajar. Estos meses no me ha quedado otra que trabajar desde el ordenador de jugar, porque he descubierto que mi viejo MacBook ya no es definitivamente lo que era, pero no se podía caer en la tentación de simplemente reemplazarlo en frío sabiendo que eventualmente Apple acabaría actualizando su Mac Mini.

Sigue leyendo

Cómo importar un paquete de Go usando un dominio propio

La idea final es explicar cómo se puede hacer para importar un paquete de Go usando una construcción como import "example.com/package/foobar/lib" y que funcione bien, en el sentido de que la ruta que se le pone en el import es una ruta que resuelve y desde la que se puede descargar el paquete correspondiente, pero sin tener que poner explícitamente github.com o gitlab.com en la ruta del import.

Sigue leyendo

Mi experiencia con Vaultwarden

En abril del año pasado, migré mi gestor de contraseñas desde KeePassXC a Vaultwarden. Mi objetivo en esta entrada de blog es hablar de mi experiencia con este software y cómo me he adaptado a él en los últimos meses, desventajas y también ventajas de haber migrado a Vaultwarden.

Bitwarden es una solución cloud para guardar contraseñas en línea. Siempre he sido escéptico ante este tipo de herramientas cloud, debido al riesgo que podría suponer colocar las llaves que protegen toda tu vida digital en una máquina que no controlas. Incluso aunque Bitwarden sea abierto y hable de las formas que tienen de cifrar la información, me resulta un poco incómoda la idea de que los datos se guarden fuera de mi control.

Vaultwarden es una reimplementación alternativa de toda la API de Bitwarden en Rust. Bitwarden dispone de varias aplicaciones oficiales para PC, móvil, tablet y navegador que interactúan con la nube de Bitwarden usando distintas APIs, y Vaultwarden se ocupa de volver a implementar toda esa capa de servicios. De este modo, si configuramos un cliente o extensión de Bitwarden para que, en vez de hablar con el servidor central, hable con nuestro servidor alternativo, todo funcionará, porque el cliente no sabrá que está hablando con un Vaultwarden en vez de con un Bitwarden normal. Además, es mucho más ligera en consumo de recursos que una instalación on-premises de Bitwarden.

Sigue leyendo

El fin de mis streams grupales de pomodoro

El 28 de febrero de 2023 transmitiré mi último stream de cowork o pomodoro grupal en Twitch. En esta ocasión no es un parón temporal, es un parón definitivo. Seré la primera persona que echará de menos los lazos que se han formado en el chat de mi canal de Twitch, donde este tipo de streams se ha mantenido a modo de servicio público durante más de un año por la labor que hacía y por la comunidad de estudiantes y trabajadores remotos que se ha formado, pero creo que es necesario dejar de hacerlo por varias razones.

Sigue leyendo

Dejo Twitter

Antes que nada, decir que esto no tiene nada que ver necesariamente con el cambio de rumbo que ha tomado Twitter desde que Elon está al mando. Esto lo podría haber hecho en noviembre, cuando todo el mundo anunciaba que esto es el fin y ponía su handle de Mastodon. No soy tan catastrofista.

Sigue leyendo

Mi opinión después de probar Miniflux (RSS)

El mes pasado, durante mis vacaciones, reemplacé mi instancia local de TinyTinyRSS por una instancia de Miniflux. Ambas son aplicaciones cloud que actúan como lector RSS. Ya hablé la semana pasada sobre las razones por las cuales prefiero mantener mi cliente RSS en un servidor, pero se resume en que la falta de sincronización entre dispositivos que tienen Mozilla Thunderbird o QuiteRSS los hace inaceptables si unas veces leo cosas con mi PC y otras con mi móvil.

TinyTinyRSS es un pepino de software. No tiene otro calificativo. Es un software que voy a seguir recomendando y del que voy a seguir hablando bien. Es flexible, potente y tiene una interfaz de usuario web avanzada que recuerda a la de otros clientes RSS mayores y llenos de funciones. Tiene filtros con los que se pueden marcar como leídas o borrar entradas que cumplan unas condiciones (ideal para filtrar ruido), y también tiene un sistema de plugins extensible para agregarle nuevas funciones.

Sin embargo, no todo es bonito. TinyTinyRSS también es desafortunadamente un software que tiene bugs. En particular, dos veces se me ha corrompido la instalación y he tenido que tirar de copia de seguridad para rescatar mi lista de feeds y vaciar la base de datos, perdiendo el historial, las entradas marcadas como favoritas, y también parte de mi tiempo. 2 veces en 4 años tampoco es demasiado desde el punto de vista estadístico, pero sí es cierto que es una molestia que preferiría evitar.

Existen otras razones por las cuales he acabado cansándome del comportamiento de este software. Fundamentalmente tiene que ver con el proceso de instalación, especialmente ahora que está basado en Docker. Iba a contarlas aquí, pero son muchas y por otra parte se supone que quiero hablar de Miniflux hoy, así que corto y pego en otro borrador y ya lo dejo para otro día.


Miniflux es otro lector RSS cloud que puedes ejecutar en un servidor y ponerle a cargo de revisar periódicamente si los sitios que sigues tienen novedades, dejándolas en una base de datos para que las puedas leer cuando puedas.

Su interfaz web es excesivamente minimalista, pero a cambio esto le permite ser compatible con teléfonos móviles y otro tipo de pantallas táctiles, e incluso se puede instalar como PWA para un acceso más conveniente en la pantalla de iOS o Android. Tiene las funciones que se pueden esperar de este tipo de programas, e incluso tiene un sistema que permite ajustar dinámicamente la frecuencia con la que mira si una web tiene novedades según la cantidad de posts que publica a la semana (para sitios de noticias diarias cambia la frecuencia a 1 hora como mucho, y para sitios personales no suele mirar más allá de una vez cada pocos días).

Además, se puede desplegar en un único binario de Go. En mi caso, lo corro desde Docker y consume bastante menos recursos que lo que consumía TT-RSS, lo que permite aliviar la carga del servidor y lo que espero que en algún momento me ayude a ahorrar recursos y tal vez hacer downgrade a una máquina más pequeña si veo que no me hace falta tener una máquina tan potente.

También tiene APIs que me permiten usar Miniflux como un backend cuya interfaz web apenas reviso, sino que me conecto desde mi propio cliente de escritorio o de móvil como quien lee el correo. En este caso, Miniflux implementa la GReader API. Es una API mucho más flexible y potente y que me permite hacer cosas que antes no podía hacer, como suscribirme rápidamente a una fuente desde mi móvil o cancelar una suscripción si deja de interesarme un sitio web. Antes, tenía que entrar al panel de control web para poder hacer esto.

Al haber pasado a usar la GReader API, ahora puedo usar más clientes de escritorio, por lo que también he cambiado los programas que uso para leer mis noticias. En Mac y en iOS/iPad, me he pasado a NetNewsWire, que es un cliente libre y gratuito. NewsFlash también es compatible con la GReader API, de modo que en GNU/Linux he podido seguir usando NewsFlash cambiando únicamente una cuenta online por otra.

Sigo pensando que para meterse en el mundo del RSS existen opciones mucho más accesibles, como Feedly, y como he dicho varias veces, es mi opción recomendada. No obstante, para alguien que quiera ensuciarse las manos y ocuparse de instalar servicios autoalojados en su VPS o en su nube propia, Miniflux es fácil de instalar y depende únicamente de si mismo y de una base de datos PostgreSQL en la que volcar el estado de la aplicación, y que aunque tiene una interfaz web que no a todo el mundo le va a gustar, tiene más formas de ser accesible desde otras aplicaciones para no sufrirla tanto.

¿Por qué utilizo un lector RSS cloud?

De cara a un futuro post que quiero hacer sobre clientes RSS y algunos cambios que he hecho en mis flujos de lectura durante estas vacaciones, he querido hacer un post de preámbulo. Si hago posts más cortos y centrados en un tema, me será más sencillo de escribir y revisar, y también más fáciles de referenciar en el futuro.

Hoy quiero hablar sobre por qué mi forma de consumir feeds RSS es la que es. En mi servidor web tengo instalado un cliente RSS que se ocupa de comprobar los blogs a los que estoy suscrito, 24×7, y almacenar las novedades en una base de datos a la espera de que las lea cuando tenga tiempo.

Y aquí lo que quiero es explicar por qué trabajo así y no simplemente descargo en mi ordenador una aplicación como QuiteRSS o NetNewsWire, o alguna de las que encuentre en la tienda de aplicaciones de mi móvil. Ya me ocupé de contar en un post anterior por qué no uso Feedly, pese a que me sigue pareciendo la forma más sencilla de no complicarse tanto la vida, y a que lo sigo recomendando para que alguien que quiere meterse en el mundo del RSS pueda tener un primer contacto sin pegarse cabezazos contra la pared.


Sobre por qué utilizar un servidor para mis feeds RSS y no simplemente descargar una aplicación en mis dispositivos, precisamente la razón es porque utilizo varios dispositivos. Si usase simplemente una aplicación de escritorio o una aplicación de móvil que no esté sincronizada con ninguna nube, acabaría teniendo cuatro aplicaciones RSS diferentes con cuatro listas de blogs diferentes y donde habría que marcar cuatro veces cada cosa que vea como leída.

Si utilizo una aplicación cloud, como es TinyTinyRSS en mi caso, puedo tener un único cliente RSS en un servidor, al que accedo desde todas mis pantallas. Por la mañana en el PC leo un artículo y lo marco como leído, y por la noche desde el móvil aparecen más artículos nuevos pero no el que ya he leído por la mañana.

Hasta ahora he venido usando TinyTinyRSS. Es una de las aplicaciones web de software libre más usadas de cara a lanzar un lector RSS en un servidor, y también una de las más veteranas. Tiene una interfaz web que permite leer artículos desde cualquier navegador web y es lo suficientemente avanzada como para cubrir los casos de las personas más «power users», que se parece a lo que era en su momento Google Reader (porque, de nuevo, la única forma de medir un cliente RSS es compararse a Google Reader, incluso aunque hayan pasado 10 años desde su cierre).

Sin embargo, una de las cosas que valoro de TinyTinyRSS es que tiene una serie de APIs que permiten crear integraciones con otras aplicaciones. Con ellas, es posible utilizar algo que no sea el navegador web para leer noticias de una forma más flexible y bonita según las circunstancias. Por ejemplo, la interfa web original de TT-RSS es un poco complicada de usar en teléfonos móviles, precisamente porque está pensada para ser usada en aplicaciones de escritorio.

De modo que en mi móvil tengo una aplicación aparte, que se parece a una aplicación de teléfono móvil normal, con letras y botones grandes, pero que cuando se abre, se comunica con mi servidor para ver qué noticias hay descargadas ahí y mostrármelas como si fuese un cliente de correo. A medida que las voy leyendo, va empujando esa información al servidor para que luego me salgan como leídas en el resto de dispositivos que uso.

En MacOS he venido usando Reeder. Normalmente sería de pago, pero he tenido la suerte de pillar en el pasado tanto la versión 3 como la versión 4 en momentos en los que estaban temporalmente gratis. En mi móvil y en mi tablet también tengo Reeder. Juraría que por Reeder para iOS sí he pagado en el pasado, aunque ahora no lo recuerdo.

Cuando uso GNU/Linux, NewsFlash también tiene conector para interactuar con mi instancia, y es la aplicación que utilizo para interactuar con mi servidor y leer mis noticias desde una aplicación con el look and feel de GNOME.

O al menos así ha sido hasta esta navidad, pero esto es algo que dejo para otro día. Entre tanto, aquí he hecho un diagrama para resumir este lío.

La estrambótica arquitectura RSS de Dani
La estrambótica arquitectura RSS de Dani
TinyTinyRSS
TinyTinyRSS
Servidor
Servidor
Feeds RSS
Feeds RSS
Navegador web
Navegador web
Reeder para Mac
Reeder para Mac
NewsFlash para Linux
NewsFlash para Linux
Reeder para iOS/iPad
Reeder para iOS/iPad
Text is not SVG – cannot display