Proyectos personales

Casi todos empiezan igual. Pertenezco a algo, a una facultad, a una asociación, a un grupo de amigos con presupuesto de universitarios, y a ese algo le falta una herramienta. Suelen ser sencillas, no cuestan nada al mes y sirven a un grupo concreto de personas.

Cinco de ellos tienen servidor propio y pueden guardar datos de personas reales, así que los enseño pero no los enlazo. No es que estén rotos ni en beta privada.

Para la universidad

  • 01 Horarios de la Facultad de Ciencias

    Un visor alternativo de los horarios de la Facultad. Permite cruzar asignaturas de titulaciones y cursos distintos, filtrar subgrupos y exportar el resultado a un calendario. El servidor de la universidad solo habla HTTP y no permite CORS, así que no se puede consultar desde una página servida por HTTPS: una GitHub Action lo consulta cada seis horas, normaliza lo que devuelve y deja el JSON en el repositorio. El historial de git acaba siendo, sin pretenderlo, el registro de cambios de horario del curso. Lo construí hablando con quien mantiene la página oficial, así que es una mejora consentida y no una protesta.

    Cómo llegan los horarios de un servidor HTTP a una página HTTPS servidor de la Universidad solo HTTP, y sin cabeceras CORS GitHub Action lo consulta cada seis horas JSON en el repositorio el historial de git queda como registro de cambios la página HTTPS, estática, sin servidor propio el navegador no puede hablar con él directamente
    Fig. 1 El rodeo que hace falta para que una página servida por HTTPS pueda leer un servidor que solo habla HTTP.
  • 02 Planificador del doble grado

    Una cuadrícula de cinco cursos donde arrastras asignaturas hasta que el plan cuadra. Conoce el catálogo entero de Física y de Matemáticas, aplica las reglas de convalidación entre ambos grados y avisa cuando un semestre pasa de 30 ECTS o un curso de 72. Lo hice para facilitar a la Comisión Mixta la conciliación de los nuevos planes de estudio.

    La distribución de las asignaturas y de sus créditos es cambiante, porque los dos planes de estudio están en plena reforma, y me falta añadir esa capa de personalización para que sea útil del todo. De momento sirve como prototipo, o para jugar con ello si no estás en la administración de la universidad.

  • 03 Reparto de gastos

    Para la Delegación de Estudiantes. Hay una parte que paga vicedecanato y una parte que paga vicerrectorado, y suele seguir una proporción, pero no se pueden dividir los gastos y ya: hay que cuadrarlo con lo que se tiene. La página se encarga de eso.

  • 04 Generador de exámenes aleatorios

    Un programa de escritorio que compone exámenes distintos a partir de un banco de preguntas, para que dos personas sentadas juntas no tengan el mismo. Lo hice para un amigo que da clase.

    Ventana del generador de exámenes, con los datos del examen, la lista de categorías y los parámetros de generación
    Fig. 2 La ventana del generador antes de cargar un banco de preguntas. La semilla decide si la tanda se puede repetir exactamente o si cada ejecución sale distinta.
  • 05 Bingo musical con cartones identificables

    Para una actividad de la Delegación. Cada cartón lleva un identificador que no es un número de serie: es el producto de los primos asignados a las canciones que contiene. Factorizarlo devuelve el cartón entero, así que se puede comprobar un bingo cantado sin guardar en ninguna parte qué cartón se imprimió. La base de datos es el propio número.

    El identificador de un cartón es el producto de los primos de sus canciones canciones primo asignado 04 7 11 13 19 29 23 41 identificador del cartón 108199 7 · 13 · 29 · 41 factorizar devuelve el cartón entero
    Fig. 3 Esquema del identificador: a cada canción le corresponde un primo y el cartón es su producto.
    Ventana del generador de bingo musical con sus parámetros: número de cartones, canciones por cartón, columnas, índice de inicio y semilla
    Fig. 4 El generador de cartones: cuántos, de cuántas canciones cada uno, y una semilla para poder volver a sacar exactamente la misma tanda.

Para asociaciones y eventos

  • 06 Control de asistencia a eventos

    Varias personas en puertas distintas pasando lista a la vez desde su propio teléfono, contra un único registro que se actualiza solo. El problema no es la lista, es que dos personas no marquen a la misma y que nadie tenga que consolidar nada al final. Empezó en el XXIV ENEM sobre Google Apps Script y esta versión lo rehace entero. La lista completa se guarda en el dispositivo, así que buscar y registrar son instantáneos aunque el local no tenga cobertura, y los registros se envían solos cuando vuelve. Nada se marca como «ha entrado»: cada acceso es una fila inmutable con su hora, de donde salen gratis las franjas horarias, que se pueden inventar después del evento, y una cola sin conexión que se puede reenviar sin duplicar a nadie. El plan gratuito de Cloudflare da 10 ms de CPU por petición, menos de lo que cuesta pasar una contraseña por un hash decente, así que ese trabajo lo hace el navegador y el servidor solo ve el resultado. El QR lleva un código aleatorio y nunca el NIE, porque una acreditación colgada del cuello la lee cualquier móvil de la sala.

    Si dos puertas se quedan sin conexión a la vez, las dos pueden dejar entrar a la misma persona. No hay diseño en el cliente que lo evite, así que el servidor detecta la coincidencia al sincronizar y la enseña como incidencia en vez de elegir un ganador en silencio.

    Vista de voluntario en un teléfono, con el estado de sincronización y las pestañas de escanear, buscar y añadir Vista de voluntario en un teléfono, con el estado de sincronización y las pestañas de escanear, buscar y añadir
    Fig. 5 Lo que ve quien está en la puerta: escanear, buscar por nombre o añadir a quien no estaba en la lista. Arriba, si lo registrado ha llegado ya al servidor o sigue esperando en el teléfono.
    Panel de resumen de un evento, con el recuento de entradas y una lista de incidencias Panel de resumen de un evento, con el recuento de entradas y una lista de incidencias
    Fig. 6 El resumen de la organización, con datos inventados. Las coincidencias entre puertas no se resuelven solas: aparecen aquí, con las dos horas, para que alguien decida.
  • 07 cajut, concursos en directo

    Un Kahoot que se puede alojar uno mismo, pensado para una veintena de personas en una sala con mala cobertura. Cada sala es un Durable Object de Cloudflare con su propia base de datos, lo que evita coordinar estado entre servidores y permite que todo entre en el plan gratuito. Las preguntas las escriben los propios participantes durante la semana previa, y quien propone una no puntúa en ella. Duerme cuando no hay nadie y despierta cuando alguien vuelve.

    Pantalla proyectada de cajut con una pregunta, cuatro respuestas, la cuenta atrás y el número de respuestas recibidas
    Fig. 7 La pantalla proyectada durante una pregunta de la sala de ejemplo: el enunciado, las cuatro respuestas, los segundos que quedan y cuántos han contestado, sin decir quién ni qué. No enlazo la instancia desplegada porque puede contener datos de personas reales.
  • 08 Buzón de cartas para encuentros

    La gente escribe una carta a otra persona del encuentro, alguien de la organización la modera y las aprobadas llegan al Telegram de quien coordina, que las reparte a mano. El bot no escribe nunca a quien la recibe. Sustituyó a un formulario de Google que dejaba las respuestas en una hoja de cálculo compartida.

    Formulario para escribir una carta, con el destinatario elegido y la opción de enviarla de forma anónima Formulario para escribir una carta, con el destinatario elegido y la opción de enviarla de forma anónima
    Fig. 8 El formulario de escritura, vacío. Se elige destinatario y se decide si la carta va firmada.
  • 09 Moderador de asambleas

    Lleva la asistencia por sesión, calcula el cuórum en tiempo real, comprueba que estén los cargos obligatorios, gestiona el turno de palabra y resuelve votaciones con mayorías distintas dentro de un mismo punto del orden del día. Al terminar exporta el registro de intervenciones, que es la mitad del trabajo de redactar el acta.

  • 10 Consulta privada de habitación

    También para el XXIV ENEM. Cada asistente consultaba su habitación identificándose con su DNI, y veía exactamente una fila: la suya. Lo interesante no es la consulta sino la restricción, que es devolver un único registro sin dejar ver nada de lo que hay alrededor, ni el reparto completo, ni con quién duerme nadie más.

Para mí y los míos

  • 11 Orla fractal

    Las herramientas para diseñar la orla de mis compañeros de Matemáticas y Física. Son dos páginas. La primera es una galería de marcos fractales: 33 bandas que encajan consigo mismas al repetirse y 22 esquinas, que se exportan a 6804 × 4694 px con el hueco de la foto transparente. La segunda es un visor 3D de atractores extraños para la imagen del centro: 25 sistemas integrados con RK4 en un Web Worker, y cada vista se guarda en el enlace, así que basta con copiarlo para reabrirla exacta. Ningún sistema llega al visor sin pasar antes un script que lo integra y comprueba que no diverge ni se queda en un punto fijo. Lo que ese script no ve es una ecuación mal copiada que siga siendo caótica: Sprott B tenía un parámetro en la ecuación equivocada y dibujaba un atractor perfectamente razonable que no era el suyo.

    Visor de atractores extraños: panel lateral con el sistema Sprott B, sus tres ecuaciones y los deslizadores de a, b y c, y a la derecha el atractor dibujado en azul y verde sobre fondo blanco Visor de atractores extraños: panel lateral con el sistema Sprott B, sus tres ecuaciones y los deslizadores de a, b y c, y a la derecha el atractor dibujado en azul y verde sobre fondo blanco
    Fig. 9 El visor de atractores con Sprott B en sus valores por defecto: a la izquierda las ecuaciones y los parámetros, a la derecha la imagen tal y como se exportaría.
  • 12 Home base, un panel personal

    Un panel para el portátil, el móvil y una pantalla que se queda encendida en la mesa: agenda, los dos correos, tareas, gastos, cuentas atrás y el tiempo, de un vistazo. Tiene tres reglas: cuesta 0 €, nadie más puede leerlo y nunca escribe en los servicios que consulta. La tercera decide los detalles. De Google solo pide permisos de lectura, y en Gmail únicamente las cabeceras, nunca el cuerpo de un correo; con ese permiso Google no deja buscar, así que el buzón se filtra por etiquetas. Delante está Cloudflare Access, y aun así el Worker comprueba la firma de cada petición y, si le falta configuración, lo cierra todo en vez de abrirlo. La pantalla fija se oscurece al anochecer y desplaza su contenido unos píxeles cada diez minutos para no marcar el monitor.

    Panel con la hora, el tiempo, la agenda del día, próximos pasos, dos buzones de correo, el ritmo de gasto del mes, cuentas atrás, lecturas en curso y uso de Claude Panel con la hora, el tiempo, la agenda del día, próximos pasos, dos buzones de correo, el ritmo de gasto del mes, cuentas atrás, lecturas en curso y uso de Claude
    Fig. 10 La pantalla de hoy en el portátil, con datos inventados de principio a fin: agenda, los dos correos, tareas, presupuesto del mes y cuentas atrás.
  • 13 Presentador de diapositivas

    La vista del ponente que un PDF no trae: diapositiva actual y siguiente, notas, cronómetro con un objetivo por diapositiva, parciales y una ventana aparte para el proyector. Lo hice para ensayar la defensa del trabajo de fin de grado y después lo generalicé a cualquier PDF. Lo difícil es que un PDF de beamer no sabe qué es una diapositiva: cada \pause es una página más. Así que las agrupa leyendo las etiquetas de página, detecta las portadillas de sección y pasa su tiempo a la diapositiva siguiente, y reconoce el apéndice porque la numeración vuelve a empezar. Si se compila con las notas de beamer, las lee del propio PDF, objetivos de tiempo incluidos, y nunca las manda a la ventana del público. El PDF no sale del navegador, y hay una versión en un único archivo HTML que funciona sin conexión.

    Vista del ponente del presentador: cronómetros arriba, diapositiva actual con sus notas a la izquierda, y a la derecha la siguiente y la tabla de tiempos por diapositiva Vista del ponente del presentador: cronómetros arriba, diapositiva actual con sus notas a la izquierda, y a la derecha la siguiente y la tabla de tiempos por diapositiva
    Fig. 11 La vista del ponente con el ejemplo del cielo azul: el cronómetro contra el objetivo de cada diapositiva, las notas leídas del PDF y, a la derecha, lo siguiente. Aquí lo siguiente es la misma diapositiva con un punto más, porque sus overlays cuentan como una sola.
  • 14 Organizador de vacaciones

    Gastos compartidos para viajes en grupo. Existía antes como una hoja de cálculo con Apps Script detrás, y lo reescribí por tres razones: tardaba, la dirección era impresentable, y cada visita empezaba con un aviso de Google diciendo que la página la había hecho un usuario, que había que cerrar a mano. Soy bastante perfeccionista y aguanté ese banner más tiempo del razonable. Además aproveché e integré el paso final, hacerlo tipo TriCount, aprendiendo también sobre el problema de minimizar el número de pagos sobre la marcha (¡y resulta que era un NP-completo!).

    Balance de gastos de un viaje en el organizador
    Fig. 12 Balance de un viaje, con datos de ejemplo.
  • 15 Diario multimedia

    Un registro de libros, películas, series, videojuegos y artículos. Sin cuenta, sin nube y sin conexión: todo vive en el navegador de quien lo usa. Puede usarlo cualquiera tal y como está, y quien quiera conservar su registro fuera del navegador puede sincronizarlo con un repositorio propio de GitHub, de modo que los datos siguen siendo suyos y no míos. No tiene proceso de compilación, así que dentro de diez años seguirá abriéndose.

  • 16 Ayudante de narración para Blood on the Clocktower

    La parte que las herramientas existentes no cubren. No el grimorio, que está bien resuelto, sino la noche: qué ficha se coloca, dónde, en qué orden, y qué personajes de tu guion se llevan mal entre sí. Pensado para tener abierto en una segunda pestaña mientras narras.

  • 17 Ayudante del narrador para Los Hombres Lobo de Castronegro

    Hermano del ayudante de Blood on the Clocktower, pero para el móvil y para narrar con la luz bajada. El centro es la noche guiada: una pantalla por paso, que llama solo a los personajes que están en juego, siguen vivos y conservan su poder, en el orden correcto, y apunta lo que se decide. Después calcula las muertes del amanecer, lleva las votaciones del día y deja deshacer cualquier cosa. Lo que más cuidado pide es lo que la noche no puede saltarse: un personaje que ha perdido su poder en secreto se sigue llamando, con un paso que no hace nada, porque si el narrador deja de nombrarlo se entera toda la mesa. Tampoco hace falta saber quién tiene cada carta: si se reparte boca abajo, la primera noche cada paso pregunta quién ha despertado, y una carta solo se asigna sola cuando ya no queda duda. Trae además los 30 personajes con consejos para narrarlos, cuántos lobos poner según el número de jugadores y preguntas frecuentes. No tiene compilación ni dependencias, funciona sin conexión y las reglas viven en un motor aparte cubierto por pruebas.

    Pantalla de móvil con el paso de los Hombres Lobo: la frase para narrar, la rejilla de jugadores y el botón Devorar
    Fig. 13 Un paso de la noche guiada, con nombres inventados: la frase que hay que decir, quién despierta y la víctima elegida. Los lobos salen atenuados porque no pueden elegirse entre ellos.

Una cosa que sé hacer pero no hice

El reparto de asistentes a las charlas del XXVII ENEM (2026, Universidade de Santiago de Compostela) se resolvió como un problema de optimización entera con Gurobi: maximizar las preferencias de cada persona, obligar a que todo el mundo pase por el foro de empresas en al menos un turno, y fijar a quien da una charla en su propio turno. No lo programé yo. Me lo explicaron, sé plantearlo y sé resolverlo, y me parece la forma correcta de atacarlo, que no es lo mismo que haberlo hecho.