Acerca de Dani

Soy un ingeniero de software actualmente trabajando como desarrollador web que vive en la zona del Valle del Henares, una comarca situada al este de Madrid, España. 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.

Re: Lista de deseos para la WWDC21

Minientrada

Parece que he acertado unas cuantas.

Espero seriamente que iPadOS 15 sea una versión cargada de mejoras para los power users.

Aquí no puedo dar el punto completo. He mirado las notas de la previa y la mayoría de funciones que veo son para consumo, no para creación. Poder integrar mejor una segunda pantalla hubiese estado bien que lo que se ofrece actualmente podría estar mejor…

No obstante, Swift Playgrounds va a pasar de ser una aplicación para “aprender a programar” a ser un entorno donde se va a poder programar de verdad (en Swift) y hasta enviar apps directamente a la AppStore desde iPadOS. Medio punto mientras le hago un seguimiento a esto.

Una mejor forma de lanzar aplicaciones en iPad.

Con lo del cajón de aplicaciones y el nuevo menú para la multitarea esto va a ser una realidad, o al menos mejor que lo que hay ahora mismo. También la llegada a iPadOS del directorio de aplicaciones, para poder eliminar iconos inútiles de la pantalla de inicio o del dock sin recurrir al viejo truco de empujarlos en una carpeta.

En iPadOS e iOS, más atajos para las opciones.

Opinaré sobre esto cuando vea los nuevos atajos. El nuevo modo Focus (que ya veremos cómo se llama en español) podría facilitar una forma flexible de configurar el dispositivo de distintas formas según la hora y el lugar. Es el caso de uso que más se le parece (poder silenciar el móvil en algunos momentos, por ejemplo), por lo que habrá que prestar atención a esto.

Ojalá una versión de Atajos para macOS.

A la orden. Aunque de poco me va a servir porque esta va a ser la primera versión de macOS que no se podrá instalar en mi mid-2014. (No es que me haga mucha falta…)

Lista de deseos para la WWDC21

Minientrada

Resulta que la WWDC21 es hoy. La verdad es que yo ya estaba acostumbrado a que estos eventos cayesen en martes, pero… ya.

Admito que últimamente no le presto mucha atención a las WWDC y conferencias de este estilo. Creo que estaban mejor con público, aunque tengo la ligera sospecha de que con lo que se ahorra Apple en concepto de organizar un evento con público*, no creo que regresen cuando pase la pandemia.

Sin embargo, me gusta luego leer titulares y estos son los titulares que me gustaría leer:

  • Apple presentó hace poco un iPad equipado con un procesador M1, que es su procesador de ordenadores. Hasta ahora siempre tenían procesadores A, que son los de la serie móvil. Tener un procesador tan potente sin exprimir suena mal, por lo que espero seriamente que iPadOS 15 sea una versión cargada de mejoras para los power users.
  • Una mejor forma de lanzar aplicaciones en iPad. Ahora mismo, para exprimir al máximo la multitarea y las múltiples aplicaciones a la vez, es necesario tener todas las apps (o al menos las más esenciales) en el dock, porque es el único punto de partida desde el cual se puede arrastrar un icono de aplicación sobre una aplicación abierta para iniciar un modo de pantalla dividida.
  • En iPadOS e iOS, más atajos para las opciones. La mayoría de mis ideas para crear atajos se frustran cuando veo que se trata de usar una opción dentro de los Ajustes del sistema que no está expuesta en Atajos.
  • Ojalá una versión de Atajos para macOS. Existe Automator, pero las aplicaciones de terceros nunca le han hecho mucho caso.

(*) Juraría haber leído esto hace poco, pero ahora no encuentro los enlaces que lo prueben.

Notas sobre el conjunto de Mandelbrot

Minientrada

Ayer cerré un stream en Twitch en el que intenté programar la típica representación gráfica del conjunto de Mandelbrot. No lo terminé porque se me alargó, pero lo continuaré. Dejo aquí algunas notas para cuando haga la segunda parte.

El conjunto de Mandelbrot es el conjunto de números complejos donde se cumple que la evolución de la serie definida por la función f(c, n) = f(c, n-1) + c, siendo f(c, 0) = 0, no tiende al infinito. Por ejemplo, para c=1 se obtiene la serie 0,1,2,5,26…, no acotada, pero para c=-1 se obtiene la serie 0,-1,0,-1,…, que sí está acotada. (Por supuesto, c=1 y c=-1 son ejemplos muy simples, pero esta fórmula se usará con números con parte imaginaria como 0.2265+0.331i.)

Para facilitar las cosas, lo normal es asumir que si la magnitud del número complejo supera en algún punto de la serie el valor 4, entonces con seguridad no se acota. Como no podemos pedirle al ordenador precisión infinita, si después de un número máximo de iteraciones sigue sin tender al infinito, podemos asumir que sí se acota.

O sea, que al final en un programa de ordenador repetiremos la función hasta que se superen 50, 100, 1000 iteraciones (lo cual nos diría que está acotada), o hasta obtener algún valor con un absoluto mayor a 4, lo que nos deja interrumpir la ejecución asumiendo que no se acota. Cuantas más iteraciones apliquemos, más precisa será la evaluación, ya que puede ocurrir que una serie para un complejo tarde más tiempo en divergir, aunque también tomará más tiempo.

En cuanto a la clásica imagen del fractal generado a partir del conjunto de Mandelbrot, que seguramente muchos habremos visto alguna vez, lo que vemos es la representación en un sistema de coordenadas 2D del valor de esta función para todos los números complejos. El eje X representa la parte real del complejo y el eje Y, la parte imaginaria.

En el programa de ordenador generaríamos la imagen transformando del sistema de coordenadas de la imagen (por ejemplo píxeles del (0,0) al (640,480)) a una interpolación más aceptable en el rango de los complejos que vayamos a comprobar (como (-1,-1) a (1,1), aunque podríamos reducir el área para hacer zoom), y luego consultando si ese número complejo está en el conjunto o no. Si está en el conjunto, lo podemos representar de negro. Si no está en el conjunto, lo típico es crear algún tipo de paleta de colores para representar con un color diferente aquellos complejos que escapen antes al infinito de aquellos que escapan más tarde.

 Representación del conjunto de Mandelbrot
La clásica foto del conjunto de Mandelbrot tomada de Wikipedia.

Invirtiendo esferas

Enlace

Las recomendaciones de YouTube me han lanzado este vídeo que me deja tan fascinado como confuso sobre cómo se pueden invertir círculos y esferas, y toda la matemática y condiciones que hay detrás de este proceso.

(No, no puedes darle la vuelta como un calcetín a un balón de baloncesto; se conoce que esto sólo se puede hacer con esferas hipotéticas hechas de un material hipotético que puede atravesarse a sí mismo.)

El vídeo es de 1994 y está subido a YouTube en 2011, y debe estar en esa lista que se hace el algoritmo de YouTube cada mes de «vídeos viejos que deben resurgir en el feed de recomendados sin razón alguna»…

Importando de redes sociales con XML-RPC

Minientrada

Una de las cosas bonitas de la GDPR es que casi obliga a las redes sociales y sitios similares a tener un sistema de exportado de datos. Y casi siempre lo hacen con algún formato estructurado como CSV, JSON o XML, fácil de procesar por un ordenador.

Paralelamente, WordPress tiene el viejo confiable XML-RPC para crear posts de forma programática. Si no tienes mucha idea, recomiendan cerrar ese endpoint al exterior para evitar problemas. Pero en verdad, si sabes protegerlo, resulta muy práctico para crear posts a golpe de petición HTTP. (En teoría existe la API REST, pero bueno…)

Con la ayuda de un cliente XML-RPC para WordPress que hay en NPM y de la API de Hacker News, hice en Node.js un script de un solo uso que crease una entrada por cada comentario y enlace enviado para enlazar hacia el comentario o la historia, siguiendo el modelo de sindicación PESOS de IndieWeb (Publish Elsewhere, Syndicate to Own Site). Le he puesto la etiqueta hn-import a la colección. ¿Cuál será el próximo archivo que importe?

En sí la librería no es muy complicada de utilizar. Una vez tienes un cliente conectado es muy fácil chutarle un array de posts a crear (por ejemplo, procesar fila a fila un CSV o item a item un JSON o un XML). Primero se crea un cliente:

const { createClient } = require("wordpress")

const client = createClient({
  url: "https://example.com",
  username: "mi user",
  password: "mi password"
})

Luego definiendo el payload. Aquí es donde encuentro más cómodo crear un objeto JSON que declarar todo el chorizo XML de XML-RPC:

const payload = {
  title: "El título de mi entrada",
  content: `
    <p>El contenido de mi entrada.</p>
    <blockquote>Aceptamos HTML.</blockquote>
    <p><a href="https://www.example.com">Y enlaces</a></p>
  `.trim(),
  status: 'publish', // podría ser 'draft' o 'private'
  termNames: {
    category: ['Categoría'],
    post_tag: ['tag 1', 'tag 2', 'tag 3'],
  },
  date: '2006-01-02 15:04:05',
  format: 'link' // podría ser 'aside', 'status', 'photo', ...
}

Y ya postear usando newPost. La librería es previa a promesas así que su único punto malo es que está orientada a callbacks.

client.newPost(payload, (err, id) => {
  if (err) {
    console.error(err)
  } else {
    console.log(`ID del nuevo post: ${id}`)
  }
})

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.

WordPress vintage

Imagen

Aprovechando que WordPress cumplió 18 años la semana pasada, me he decidido a instalar el clásico tema Default, el que fue el tema por defecto hasta la llegada de los temas “Twenty”.

Por supuesto, Default no es un tema pensado para móviles. No tiene menús integrados (he tenido que traerme la navegación a la sección widgets). Sorprendentemente, se lleva bien con Gutenberg, aunque no tiene soporte para post formats por lo que no puedo marcar una entrada como “Minientrada”, ni como “Estado”, ni como ninguna de esas cosas que vinieron después, ya en la era Twenty, con temas compatibles con móvil, y con un diseño que roza lo brutalista, basado en colores fuertes, pocas decoraciones y tipografías grandes.

Pongo esta captura de pantalla como evidencia por si en algún momento decido regresar a algo un poco más moderno.

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.