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.

Abrir en una ventana nueva

Minientrada

Dentro del marketing de «lo que hace que un Mac sea un Mac», una de las cosas que bajo mi punto de vista hace que un Mac sea un Mac es el hecho de que tantas partes del sistema operativo soporten desacoplar elementos de la interfaz y abrirlos en una ventana nueva. Doble clic en el e-mail y se abre en una ventana nueva. Lo mismo si haces doble clic en un nombre en la aplicación de Contactos, o en una lista de Recordatorios, o en una nota de Notas.

El proceso está tan integrado que cuando agregaron soporte para múltiples ventanas en iPadOS, esta función también fue portada. Arrastrar una nota en Notas para iPad hacia el borde de la pantalla permite desacoplar la nota y abrirla como una ventana separada. Por supuesto, Correo para iPad también soporta esta función. Incluso las listas de reproducción de Apple Music o iTunes se pueden abrir en una ventana nueva.

Permitir desacoplar en ventanas nuevas es un acto de respeto a los power users. Es reconocer que habrá personas que tengan interés en trabajar de forma simultánea con múltiples fragmentos de información procedentes de la misma app y facilitarles el poder escanear de forma simultánea todos esos fragmentos a la vez.

Acentos en la consola de FreeBSD

Minientrada

Tenía problemas para escribir acentos y eñes una vez enciendo mi ordenador en FreeBSD. Tengo configurado mi ordenador para arrancar manualmente el entorno gráfico, por lo que cuando enciendo el sistema lo primero que veo es una consola de vt pidiéndome el usuario y la contraseña. En este punto, todavía puedo teclear la letra ñ en el campo de nombre de usuario, pero después de hacer login, soy incapaz. Tampoco logro hacerlo si arranco X11 y abro terminales.

La razón de esto parece estar en que no se activa el soporte para caracteres extranjeros si no está establecida la variable de entorno $LANG. Aquí un hilo en el foro donde dicen que la solución es esa. Si tal cual en tcsh ejecuto setenv LANG es_ES.UTF-8, a partir de ese momento puedo escribir caracteres españoles en la consola.

Para persistirlo entre sesión y sesión, dentro del archivo ~/.login_conf introduje lo siguiente:

me:\
	:charset=UTF-8:\
	:lang=en_US.UTF-8:

Con esto queda establecido el charset a UTF-8 y la variable de entorno LANG la dejo preparada con el valor en_US.UTF-8. Si quisiese que mi ordenador estuviese en español podría utilizar es_ES.UTF-8 en su lugar, pero considero que es más valioso poder buscar el mensaje exacto en inglés que una traducción.

Por cierto, el archivo .login_conf no puede ser un enlace simbólico. Tuve la genial idea de tratar de mover ese archivo a mi repositorio de dotfiles una vez lo dejé funcionando para poder incluirlo en mi copia de seguridad, pero se conoce que, por cuestiones de seguridad, este es uno de esos archivos en el que el sistema no resuelve los enlaces simbólicos cuando se pretende utilizar a través de la API del sistema operativo, para evitar posibles problemas de seguridad. Por eso también lo subo íntegro a este post: aparte de para ayudar a posibles almas perdidas desorientadas con esto, para hacer backup en alguna parte, visto que no se integra bien con el resto de mi repo de dotfiles todavía.

GNU Guile

Minientrada

Al hilo del programa que escribí hace poco para visualizar el fractal de Mandelbrot, puede resultar interesante a simple vista que haya escogido Racket como lenguaje de programación. Fundamentalmente lo elegí porque quería hacer programación visual, y en Racket esto resulta fácil de hacer desde su GUI de forma interactiva. Se puede hacer un (require racket/draw), y ya se pueden usar funciones para dibujar sobre mapas de bits que hasta se pueden visualizar dentro del propio DrRacket. Tengo un curso de Racket en mi canal de YouTube, pero está a medias.

Racket es una implementación de Scheme, pero existen muchas otras. GNU Emacs es conocido por tener una implementación de Scheme (Emacs Lisp), con la que se pueden hacer hasta plugins; como una alternativa al Vimscript. También se puede activar el modo scratch y programar en Emacs Lisp desde dentro de Emacs, para darle más lore al meme de que GNU Emacs es un propio sistema operativo dentro de otro.

Sin embargo, GNU tiene otra implementación alternativa de Scheme llamada GNU Guile, que también tiene características interesantes. Guile es como Lua. Se puede incrustar soporte para Guile en otro programa y utilizarlo como una herramienta para fabricar plugins o extensiones. Se puede pedir a código C que interactúe con Guile.

Además, también Guile tiene un modo independiente para usarlo como una herramienta de línea de comandos más, e incluso para interpretar programas escritos en archivos de código fuente. Lo normal es que tengan la extension .scm (aunque, como siempre, en un entorno GNU esto suele dar igual), y que se invoque GNU Guile en este caso con guile -s codigo.scm.

~ $ guile
GNU Guile 2.2.4
Copyright (C) 1995-2017 Free Software Foundation, Inc.

Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'.
This program is free software, and you are welcome to redistribute it
under certain conditions; type `,show c' for details.

Enter `,help' for help.
scheme@(guile-user)> (+ 2 2)
$1 = 4
scheme@(guile-user)>

Existen algunas cosas que me gustan de GNU Guile viniendo de Racket. La mayoría de palabras clave funcionan igual. En GNU Guile existe la primitiva define y la primitiva let. No tienen nombres especiales o diferentes. También existen algunas carencias en GNU Guile, pero son fáciles de subsanar. Por ejemplo, muchas de las funciones para trabajar con listas (foldl o reduce) están declaradas en la librería SRFI-1, por lo que tienen que ser importadas antes de poder usarse con un (use-modules (srfi srfi-1)).

~ $ guile
GNU Guile 2.2.4
Copyright (C) 1995-2017 Free Software Foundation, Inc.

Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'.
This program is free software, and you are welcome to redistribute it
under certain conditions; type `,show c' for details.

Enter `,help' for help.
scheme@(guile-user)> (use-modules (srfi srfi-1))
scheme@(guile-user)> (reduce (lambda (x a) (+ x a)) 0 '(1 2 3 4 5))
$1 = 15

La barra de tareas de la 21H1

Minientrada

1995. Microsoft presenta Windows 95, con la barra de tareas como una de sus principales características rompedoras, para hacer más productiva la experiencia ofreciendo botones que permitan cambiar de ventana mucho más rápido, junto con un menú inicio para abrir programas y documentos de una forma mucho más eficiente.

Barra de tareas de Windows 95.

2021. Mi gaming rig se actualiza a Windows 10 21H1, que introduce la sección Noticias e intereses, porque la tecnología hoy día no distrae lo suficiente de cara a completar las tareas del día a día.

Menú Noticias e intereses.

Borrando ramas locales de Git que ya no existen en remoto

Minientrada

En la mayoría de mis repositorios Git, correr git branch suele suponer abrir un cubo de basura bien grande. Cuando una rama de Git desaparece en el remoto (por ejemplo, en GitHub cuando se borra desde la interfaz web automáticamente), luego te tienes que acordar en local de borrar también tu rama. De lo contrario, vas a acabar con ramas stale que son aquellas de las que se hizo git push para abrir PR y que quedan ahí.

Una forma de identificar estas ramas es hacer un git fetch --prune, manteniendo ese prune para que se ocupe de detectar qué ramas han desaparecido del remoto, seguido de git branch -vv | grep gone. En el modo verbose de branch, las ramas locales que hacen tracking de un remoto que ya no está se identifican porque aparece [gone] en su línea de terminal. Por lo que esta pipeline lista únicamente esas ramas locales que han desaparecido del repositorio remoto.

Cortando la primera columna (mejor con awk '{ print $1 }' aunque con cut también se pueda hacer), puedes listar únicamente los nombres de las ramas. Y si estás de acuerdo con la salida de git branch -vv | grep gone | awk '{ print $1 }', (y sólo si estás de acuerdo, porque ya sabes, no refunds), entonces puedes envolver todo en un git branch -D $(git branch -vv | grep gone | awk '{ print $1 }') para cargarte todas esas ramas de un plumazo.

Follow-up sobre el portapapeles de Vim

Minientrada

Compartí por el Discord de mi comunidad de YouTube mi post del otro día en el que compartía un atajo para copiar y pegar de Vim al portapapeles. Aparentemente no a todo el mundo le funcionó a la primera.

Para poder utilizar compartir el portapapeles, Vim tiene que haber sido compilado con soporte para el mismo. Esto se puede saber ejecutando vim --version y comprobando que en la salida del comando aparece la opción +clipboard (tiene que ser un +, porque un -clipoboard precisamente avisa que no). Las versiones de Vim que trae Homebrew en macOS lo suelen tener. En otros UNIX y en GNU/Linux, es posible que haya que cambiar el paquete vim por vim-x11 o por una versión de Vim más completa.

Probando en mi instalación de FreeBSD con X11, funciona tanto para el portapapeles CLIPBOARD ("+) como para el portapapeles PRIMARY (el del botón central del ratón, "*).

eMule en 2021

Estuve jugando este fin de semana con eMule, como en los viejos tiempos. En líneas generales, abrir el programa parece lanzar una máquina del tiempo contra 2007, y es que todo sigue exactamente igual que hace una década (y pico). Cosa que tampoco es difícil, porque la última versión para descargar, la v0.50a, salió en abril de 2010.

Captura de pantalla de eMule
eMule 0.50a recién abierto

Mi crónica del proceso

Conectarlo a las redes fue complicado. Recordaba eMule como un software más plug and play. Instalar, pulsar Conectar y entrar a la red. Admisiblemente fue más dificil que en otros tiempos, imagino que porque la lista de servidores que se preinstala está anticuada. La sección Kad me sale en blanco.

Tras un poco de lectura de guías que no recuerdo si el Dani del pasado leería o no, me encuentro descargando un nodes.dat y un server.met que de repente llenan de vida ambas pestañas. O eso pienso yo. Aunque soy capaz de conectarme a un servidor eD2K, no consigo inicialmente entrar a la red Kad. De hecho, ninguna flecha se pone verde y el icono de la mula aparece con los ojos vendados. Creo recordar que eso quería decir que no está correctamente conectado. Supongo que el que mi proveedor de internet use CG-NAT y por lo tanto convierta abrir puertos a internet en todo un trámite burocrático que no sé si estoy dispuesto a hacer, tendrá que ver.

Buscador de eMule
No sé si es que ya no queda nadie compartiendo archivos, o si es que no tengo bien configurado el programa.

Salto a la sección Buscar y pienso en algo que buscar. Apple Music, Steam, Netflix y Prime Video han convertido la piratería en una cosa del pasado, así que no se me ocurre nada que tenga necesidad de obtener digitalmente. Que alguien busque una máquina del tiempo y se lo diga al Dani de otros tiempos: algún día no necesitarás nada de esto. Por poner algo, pongo «debian 10» en el buscador y le doy a Buscar. Obtengo pocos resultados pero aparecen un par de CDs. (También un par de archivos .torrent, curiosamente.)

En algún momento, mientras estoy haciendo todo esto, mi cliente se conecta finalmente a la red Kad. Doble flecha amarilla (que no verde). Aprovecho para buscar en la red Kad pero no encuentro resultados. Hago un par de búsquedas más. Encuentro bastantes CDs y DVDs de FreeBSD 13. En el momento de escribir esto, no hace ni dos meses que ha visto la luz, así que lo considero también un indicador de que al menos hay gente que hoy día sigue subiendo contenido actualizado. Lo trato de descargar también.

Y entonces es cuando empiezan los flashbacks intensos.

Sección de descargas de eMule
Hacía años que no veía esta pantalla.

Hacía años que no veía la pantalla de descargas. La recordaba más colorida, aunque también es cierto que por entonces tendría más uso que ahora, tanto por mi como por otros pares. La única descarga que parece avanzar es la de FreeBSD. La otra permanece en un azul claro simbolizando que dependo de una única fuente que no se digna a compartir conmigo.

Recuerdo que en otros tiempos, una vez que aparecían fuentes suficientes, uno se podía ir a las propiedades de cada descarga para ver como esos pares habían decidido llamar a los archivos que estaba descargando. Era una forma inteligente de prevenir sustos y de no perder el tiempo, porque si descargabas un archivo y al ver cómo lo llamaban los demás te encontrabas con otro, sabías que estabas descargando otra cosa que no fuese lo que habías buscado.

Ahora mismo, poco hay que consultar. Me vuelvo al buscador, busco más cosas. Encuentro PDFs para descargar (posiblemente de forma no muy legal) libros que han sido descatalogados de Amazon. Pongo a descargar un PDF, pero se mantiene de color rojo por minutos, indicando que no hay nadie que pueda compartir conmigo en este momento.

Pasa el rato y veo que mi descarga de FreeBSD continúa lentamente a ritmo de 100 kB/s. Como en los viejos tiempos, ponías a descargar algo por la noche y te ibas a dormir con la esperanza de tenerlo completo a la mañana siguiente. Excepto que hoy día, con una conexión de fibra de 500 MB/s, podría haber tenido este archivo descargado hace ya un buen rato si lo hubiese descargado desde el sitio web oficial.

Cancelo las descargas, cierro el software y lo desinstalo.

¿Y bien?

Es bonito ver que sigue habiendo gente todavía conectada a esta red, esforzándose por compartir contenido. Sin embargo, muchos de nosotros ya pasamos página, dado el abanico de posibilidades legales que tenemos hoy en día, sin estar dispuestos a volver atrás. A tiempos más simples, tal vez también más nostálgicos de otra época que no va a volver, pero también menos avanzados que lo que tenemos hoy en día.

En defensa de SQLite

Minientrada

Recientemente en Ruby on Rails incorporaron un cambio que genera un aviso al arrancar la aplicación en modo producción si el driver de base de datos que está configurado es el de SQLite. El aviso se puede desactivar cambiando un flag de configuración en el production.rb para confirmar que no es un accidente, sino una decisión.

You are running SQLite in production, this is generally not recommended.

Debo romper una lanza a favor de SQLite. Tiene sus issues, claro está, pero muchos de ellos pueden entenderse si se lee la documentación técnica.

Por ejemplo, si nunca te has leído su guía sobre tipos de datos y afinidad de columnas probablemente te sorprenda lo blando que es para validar los tipos de datos durante el INSERT (puedes guardar enteros en columnas creadas como VARCHAR, y viceversa).

No vale para todo, pero lo he visto muchas veces en producción en circunstancias en las que tiene sentido que esté en producción, y si está justificado, seguiré defendiéndolo con fuerza como alternativa ligera.

¿Qué hacemos cuando hay conflicto en el Gemfile.lock?

Minientrada

Pues esta es fácil pero como todo en Git nunca aparente. Va a pasar cuando haga cambios al Gemfile en dos ramas a la vez.

git checkout HEAD -- Gemfile.lock

Esto es para traerme el Gemfile.lock que había antes de obtener mi conflicto. Lo importante es que podemos confirmar con un git status que se preserva el Gemfile, así que los cambios en las versiones o librerías siguen ahí.

Si he metido o quitado una dependencia del Gemfile, ahora ejecuto bundle para que se descargue o se retire del lock por encima de la última versión que había en la rama en la que estoy intentando hacer el merge.

Si he actualizado la versión de una dependencia del Gemfile, ahora ejecuto bundle update para que se vuelva a reflejar ese cambio en el lock por encima de la última versión que había en la rama en la que estoy intentando hacer el merge.

La caída de Freenode

Minientrada

Veo estos días la caída de Freenode como quien ve la caída del imperio romano. Cuando empecé a programar, Freenode era el lugar en el que todo proyecto abierto que se precie debía participar. Hoy muchos proyectos ya no están en IRC: migraron a Matrix, Discord o Slack, y los que aún quedan, huyen estos días de FreeNode como gacelas ante los leones.

Nunca me gustó la interfaz de IRC. Siempre tuve miedo de equivocarme y mandarle un mensaje privado a alguien con mi contraseña intentándome comunicar con NickServ. Los modos, las contraseñas en plano, ChanServ. Admito que IRC es de las pocas tecnologías «clásicas» que menos pena me da que desaparezcan.