Modo nocturno de iOS

Minientrada

iOS tiene varias funciones de bienestal digital relacionadas con lo que ocurre cuando llega la hora de irse a la cama.

Su existencia en mi móvil siempre me ha resultado curiosa e intrigante. Naturalmente que me parece positivo que el sistema operativo intente proteger la salud de su usuario impidiendo usar ciertas aplicaciones a partir de cierta hora; seguro que habría menos doomscrolling nocturno. Pero el sistema es muy poco flexible.

Tengo activas pocas opciones del modo nocturno en mi móvil. Las que activan el modo no molestar a partir de cierta hora, y un atajo para activar el modo bajo consumo durante la noche, por si no pongo a cargar el móvil. La idea es que al menos no vibre durante la noche si entran mensajes y ya estoy durmiendo.

No obstante, es muy complicado declarar excepciones, y esa es la razón por la que no logro terminar de apreciarlo. El modo no molestar y el modo sueño saltan están programados para iniciarse a las 23:00. Es una programación que tengo activa para no lamentarlo si el móvil empieza a vibrar una noche porque alguien decide mandar un mensaje en un mal momento.

Pero si no estoy en casa porque esa noche estoy fuera, o todavía no he regresado a casa porque lo he estado, es complicado decirle de antemano «hoy voy a llegar tarde, no te actives». La única forma es desactivar manualmente el Modo Sueño una vez ya ha saltado. Y lo mismo se puede decir realmente de Tiempo de inactividad. Seguramente sea buena idea apagar las aplicaciones de mensajería a partir de cierta hora en condiciones normales, pero no creo que sea buena idea dejarme incomunicado si una noche estoy fuera.

Ordenar archivos por una columna específica en Bash

Minientrada

Es posible especificarle al comando sort la columna por la que se quiere ordenar un archivo, en vez de utilizar el criterio por defecto, el de ordenar al fabéticamente por el contenido de toda la fila. Esto resulta útil, por ejemplo, para ordenar archivos de log tabulares por una columna concreta que no sea la primera. Hay que usar la opción -k, que tiene un comportamiento similar a la opción -f de cut cuando se delimita por espacio.

cat prueba.txt
3 miércoles
1 lunes
2 martes
4 jueves

sort prueba.txt
1 lunes
2 martes
3 miércoles
4 jueves

sort -k2 prueba.txt
4 jueves
1 lunes
2 martes
3 miércoles

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.