2 puntos por GN⁺ 2024-04-22 | 1 comentarios | Compartir por WhatsApp
  • doom-htop es un proyecto experimental que usa la lista de procesos de htop como si fuera una salida gráfica para mostrar una pantalla de juegos tipo Doom en formato ASCII
  • Para ejecutarlo se necesita un archivo de datos del juego WAD; el repositorio incluye freedoom1.wad, y el clásico shareware DOOM1.wad se indica como descarga aparte
  • Funciona haciendo que el proceso de Doom cree procesos hijo equivalentes al número de líneas de la pantalla, y cada proceso escribe en su propio argv[0] una línea recibida desde memoria compartida para componer cada cuadro en el área de nombres de proceso de htop
  • Hay que configurar htop para que actualice siempre los nombres de los procesos; con -d 1 se busca una actualización de alrededor de 10 FPS, y con -s M_VIRT se usa ordenamiento por memoria virtual
  • La entrada de teclado usa un método simple tipo keylogger que abre el dispositivo de teclado, así que puede requerir sudo; solo se probó en Ubuntu 22.04, y en WSL y Arch hace falta ajustar la ruta del dispositivo

Objetivo del proyecto y forma de ejecución

  • doom-htop es un proyecto creado para comprobar si htop puede usarse para renderizar gráficos de videojuegos clásicos
  • El resultado muestra Doom como video ASCII sobre la lista de procesos de htop
  • El proyecto hizo un fork de ozkl/doomgeneric, que se encarga del trabajo pesado relacionado con la ejecución de Doom

Compilación y datos del juego necesarios

  • La compilación se realiza en el directorio doomgeneric con make -j8
cd doomgeneric
make -j8
  • Para ejecutarlo hace falta un archivo de datos del juego WAD
    • El repositorio incluye freedoom1.wad, con créditos para The Freedoom project
    • La versión classic free shareware DOOM1.wad puede descargarse desde Doom Wiki
    • DOOM1.wad no se incluyó porque no había certeza de si era legalmente correcto subirlo a GitHub

Cómo ejecutarlo y configuración de htop

  • Antes de ejecutarlo se recomienda guardar cualquier trabajo importante; el entorno de prueba fue una Lenovo ThinkPad T430s de 12 años, con 8 GB de RAM, Intel Core i7-3520M @ 2.90GHz y Ubuntu 22.04, donde funcionó correctamente
  • El comando básico de ejecución es el siguiente
sed -i 's/update_process_names=0/update_process_names=1/' ~/.config/htop/htoprc
sudo ./doom-htop -iwad freedoom1.wad
htop -d 1 -s M_VIRT
  • No importa si se inicia primero doom-htop o htop
  • sudo solo es necesario para abrir el dispositivo de teclado
    • Si se ejecuta sin sudo, la entrada será difícil, pero la pantalla se podrá ver
  • htop -d 1 es una configuración pensada para apuntar a 10 FPS de actualización
  • htop -s M_VIRT ordena los procesos según la asignación de memoria virtual para que los procesos relacionados queden agrupados de forma más clara
  • Si el orden no queda bien, se puede ajustar el valor de PROCS_MALLOC_SIZE en main.c
  • El comando sed es necesario porque htop no actualiza por defecto el nombre de los procesos en cada refresco

Funcionamiento interno

  • El repositorio añade principalmente tres archivos al doomgeneric original
    • main.c
    • keylogger.c
    • ascii_stuff.c
  • ascii_stuff.c contiene una larga cadena de sentencias if generadas por un conversor simple de imagen a ASCII
  • El proceso principal de Doom crea con fork tantos procesos como líneas tenga la imagen convertida a ASCII
  • El proceso principal crea un segmento de memoria compartida con cada proceso hijo y copia cada línea de la imagen al segmento de memoria del proceso correspondiente
  • Cada proceso hijo copia el contenido de su segmento y sobrescribe su argv[0]
  • htop va actualizando el valor de argv[0], mostrado como nombre del proceso, y así enseña una línea de la pantalla por cada proceso

Idea de ordenamiento y manejo de entrada

  • La idea inicial era ordenar por uso de CPU y crear procesos que consumieran porcentajes específicos de CPU, pero resultó difícil de implementar
  • También se consideró el valor nice de Linux, pero como los usuarios normales solo disponen de 19 valores posibles, se concluyó que no bastaba para obtener mejores gráficos
  • Al final se usó la asignación de memoria virtual, al considerar que podía ajustarse con bastante detalle por proceso
  • Incluso si todos los procesos creados con fork asignan la misma cantidad de memoria, en el sistema de prueba htop muestra los cuadros en el orden correcto
    • Se supone que, en caso de empate, podría ordenarlos por tiempo de creación
    • Aun así, no se depende de valores idénticos porque no hay certeza de cómo se comportará en otros sistemas
  • La entrada de teclado se maneja con un keylogger simple que abre el dispositivo de teclado
    • Gracias a esto, el juego sigue ejecutándose en segundo plano incluso si htop no está abierto

Plataforma y solución de problemas

  • Las pruebas se hicieron solo en Ubuntu 22.04
  • En WSL y Arch el nombre del dispositivo de teclado es distinto, así que hace falta adaptarlo
  • Si el teclado no funciona, hay que revisar el valor de #define KEYBOARD_DEVICE en main.c
    • Se indica buscar en /dev/input/by-path una entrada que contenga kbd y elegirla
  • Si el cuadro se queda congelado, puede que el comando sed no se haya aplicado
    • También puede configurarse manualmente en htop con F2 → “Display options” → “Update process names on every refresh”
  • El error de que no existe ~/.config/htop/htoprc puede aparecer si nunca se ha ejecutado htop
    • Basta con abrir htop, salir y luego volver a ejecutar el comando sed
  • Si el proceso principal de Doom falla y deja muchos procesos zombi, se pueden limpiar con el siguiente comando
sudo pkill doom-htop

Trabajo pendiente y licencia

  • htop puede mover la pantalla al usar las flechas de dirección, lo que puede volver incómodo el control del juego
    • Se propone una solución simple: después de iniciar el juego, pulsar a para cambiar el foco al menú de selección de procesadores
  • La razón de crear esto fue funny
  • Freedoom se distribuye bajo una licencia similar a BSD, indicada en freedoom-license.txt dentro del directorio principal
  • Se indica que el resto del código parece estar bajo GPL

1 comentarios

 
GN⁺ 2024-04-22
Opiniones en Hacker News
  • Si uno lo piensa, renderizar “video” en ASCII y luego ponerlo en los nombres de los procesos parece bastante fácil
    Es parecido a esos proyectos de juguete que corren sobre DNS y, como el README dice que la mayor parte del trabajo la hicieron otros proyectos, podría no parecer tan especial
    Por otro lado, creo que jamás se me habría ocurrido ver htop como un motor de renderizado para algo, así que es un hack de software realmente sorprendente e impresionante

    • Pensándolo por encima parece fácil, pero en la práctica conseguir buen contraste y rendimiento no es tan trivial
      Basta ver libaa o libcaca: hay ejemplos de cientos de horas invertidas en este tema
    • Conceptualmente puede ser fácil de entender, pero la implementación se ve bastante difícil
  • Supongo que es como PSDoom[1], pero al revés
    En este envío juegas Doom con un gestor de procesos, y PSDoom es gestionar procesos con Doom
    [1]: https://psdoom.sourceforge.net

    • Iba a escribir que quería ver la dirección opuesta, pero no me sorprende que ya exista
      También hay un video de una adaptación que corre en Linux actual: https://youtu.be/Pf7rpde49NU
      Eso sí, me gustaría que fuera un poco más útil de verdad como reemplazo de top. El tamaño de los monstruos podría basarse en el uso de memoria, la agresividad en el uso de CPU, las salas separarse por usuario, y también se podrían mostrar las relaciones entre hilos y procesos padre/hijo
      Los procesos dormidos, obviamente, estarían dormidos; los procesos zombis podrían quedar congelados en el espacio o ser transparentes para poder atravesarlos. Las armas se mapearían a señales kill
      Hay muchas cosas más que se podrían agregar, pero entonces se iría alejando cada vez más de Doom
    • Sería divertido usarlo junto con rm -rf
  • De verdad me pregunto de dónde saca la gente tiempo para hacer cosas así
    Mientras más cosas geniales veo como esta, menos seguro me siento de mis propias capacidades
    Aunque se dijo que aprovecharon trabajo previo para volver a renderizar en ASCII y mapearlo a procesos, eso de ningún modo es poco trabajo
    Me pregunto cuánto habrá tomado; llevo bastante tiempo en esta industria y aun así siento que no sé nada. Es genial, pero me hace sentir tremendamente tonto

    • Gracias por las palabras cálidas, y no hace falta que te castigues tanto
      Es muy probable que sepas muchísimo más de lo que crees
      Esto lo hice durante todo un fin de semana y más o menos un día, y luego trabajé un poco más durante algunos días cuando tenía tiempo
      Como escribí en algún comentario y también en el README, el trabajo difícil de hacer que Doom fuera más portable ya lo hizo el proyecto doom-generic del que hice fork: https://github.com/ozkl/doomgeneric
    • Si trabajas 8 horas al día y el traslado toma 1 hora, te quedan 15 horas
      Hay que comer, dormir, bañarse y hacer otras cosas, pero si no les prestas atención, siguen quedando esas 15 horas
      En 3 años hay tiempo de sobra para hacerlo
      Ahora debería terminar de una vez mi raycaster para 6502
    • Es una sensación demasiado familiar
      Es como la versión para programadores de bajarse la autoestima viendo en Instagram las fotos de las casas perfectas de tus amigos
      La mayoría probablemente se siente así de vez en cuando, y hay formas de lidiar con ello, pero es un efecto secundario muy normal de estar rodeado de gente inteligente
    • Cada vez que veo algo así, me acuerdo de la época en que no tenía hijos
  • Siento que la tendencia de “meter Doom en algo” ya está casi completa, y ahora es momento de empezar a meter cosas cotidianas dentro de Doom
    Imaginen una lista de pendientes o un calendario dentro de Doom

    • Estrictamente hablando, eso no sería una lista de pendientes o un calendario dentro de Doom, sino Doom corriendo dentro de una lista de pendientes o un calendario
      Del lado de las apps de tareas ya existe Doom renderizado con casillas de verificación[1], así que integrar eso en una app de tareas queda como ejercicio para el lector
      [1]: https://healeycodes.github.io/doom-checkboxes/
    • Si sientes que la tendencia de “meter Doom en algo” se está acabando, parece que eres nuevo en este mundo
    • Pensé exactamente lo mismo cuando vi “un ave juega DOOM”
  • Me topé con este proyecto hace más o menos una semana y lo publiqué aquí, pero no tuvo reacción
    Me alegra verlo ahora en la portada, y me gusta que suban este tipo de proyectos hacky centrados en la diversión

  • Excelente hack
    Da gusto ver que el espíritu hacker sigue vivo

  • A veces la gente lleva la tecnología demasiado lejos, pero este no es uno de esos casos

  • Me recordó a Bad Apple corriendo en el Administrador de tareas de Windows
    https://youtu.be/sBeI30ccb6g

  • Locura pura y maravillosa. A+

  • Ya ni puedo imaginar dónde va a correr este juego la próxima vez