BookinglyTech News
Software

Cómo graficar el sueño sin reloj: un actograma hecho con Deno y metadatos

Sin wearable ni reloj, la autora reconstruye cuándo duerme a partir de las marcas de tiempo de Discord, Twitter, atproto y Akkoma, y lo dibuja en SVG con Deno

2 min de lecturaLobsters0 vistas

La autora tiene un trastorno de sueño no circadiano y no soporta llevar un reloj en la muñeca, así que en lugar de medir cuándo duerme ha hecho lo contrario: reconstruir cuándo está despierta con los rastros con fecha que deja en internet. El resultado es un actograma en SVG generado con Deno a partir de sus exportaciones de Discord, Twitter, atproto y su propia instancia de Akkoma. El corte está en enero de 2021, porque antes de esa fecha los datos no son fiables.

Cuatro fuentes, cuatro formatos

Discord es la fuente más rica y también la más simple de leer. El paquete de datos llega en un zip con un messages.json por canal; el campo de tiempo viene sin zona horaria y, tras compararlo con lo que muestra la aplicación, se interpreta como UTC. Para abrir los zip usa zip.js, que no trae adaptador para Deno, así que hay una subclase de Reader que envuelve Deno.FsFile y resuelve las lecturas con seek.

El export GDPR de Twitter es un JSONP: hay que recortar el prefijo window.YTD.tweet_headers.part0 = antes de parsear el array.

En atproto los registros que interesan llevan una rkey con forma de TID, que es una marca de tiempo codificada en base32 y por tanto ordenable. Los ficheros CAR se parsean con @atcute/repo y las claves se traducen a segundos con @atcute/tid; el valor viene en microsegundos, de ahí la división por un millón.

ActivityPub lo cubre con su instancia Akkoma, que sigue viva. Una consulta a psql contra la base de datos de Postgres saca el epoch de las actividades locales de tipo Create y Like, filtradas por sus dos nicks, y el volcado se ingiere desde TypeScript.

El truco del SVG

Dibujar un rect por cada franja temporal generaría cientos de miles de objetos SVG. En su lugar hay un path por intensidad de actividad, relleno con subcaminos M…z desconectados, y el número de elementos se queda bajo. Como buena parte del tráfico cae al otro lado de la medianoche UTC, el eje se estira hasta las 30時, la notación japonesa para las seis de la mañana del día siguiente, y así la noche no se parte en dos columnas.

Lo interesante no es el insomnio de nadie, sino el método: cualquier export con fecha —un histórico de mensajes, los registros de una red social, una tabla de actividades— se convierte en serie temporal si uno se molesta en pedirlo y esperar los días que tarda cada plataforma. La parte frágil es la interpretación. Aquí actividad equivale a vigilia y el sueño se deduce por espacio negativo: no hay sensor, así que no hay validación posible. Quien quiera repetirlo tiene el código y un SVG estático para cuando no haya JavaScript.