"El Radiaktivo Newz, [mes] [año]. Número [n], Año [I/II]" — de los créditos originales de cada número
El Radiaktivo Newz (también conocida en sus primeros números como El Radiactivo News) fue una e-zine hacker mexicana publicada entre 1998 y 2000. Se distribuía como un ejecutable autocontenido hecho en Visual Basic 4 / Visual Basic 6: una pequeña aplicación de escritorio, con su propio look Win95, menús, botones y ventanas, en lugar de un simple documento de texto. Se publicaron 11 números (Año I, números 1 a 6, y Año II, números 1 a 5).
Este repositorio es un port funcional a Python 3 / Tkinter de esos 11 números, hecho en 2026 como trabajo de preservación histórica: el objetivo no es "modernizar" la revista ni reinterpretarla, sino conseguir que vuelva a arrancar, tal cual era, en un sistema operativo actual —sin máquina virtual de Windows, sin VB6 Runtime, sin depender de que Windows 9x siga vivo en algún disco duro.
El port preserva con fidelidad el original:
- Los layouts de cada ventana, con las mismas coordenadas, tamaños y proporciones que el .frm original (convertidas de twips a píxeles).
- Los textos, incluido el arte ASCII de los artículos, carácter por carácter — no se re-envuelven líneas ni se "limpian" espacios.
- Los easter eggs y comportamientos de la interfaz (botones que hacen
cosas raras, mensajes ocultos, etc.), traducidos del código VB original a
un pequeño lenguaje de acciones declarativas (ver
docs/PORTING.md). - Los colores de la época: la paleta gris/azul marino de Windows 95/98,
reproducida tal cual el .frm la definía (incluyendo colores de sistema
como
ButtonFaceoHighlight).
Nada de esto se ha "arreglado" ni embellecido. Si un número tenía un botón que no hacía nada o un texto con una errata, sigue teniéndolo aquí.
Requisitos en cualquier plataforma: Python 3.10 o superior y la librería Pillow (la única dependencia externa; Tkinter viene incluido en Python salvo en algunas distribuciones de Linux, ver más abajo).
En la mayoría de distribuciones, Python 3 ya viene instalado, pero Tkinter suele empaquetarse aparte:
# Debian / Ubuntu / Mint
sudo apt install python3 python3-tk python3-pip
# Fedora
sudo dnf install python3 python3-tkinter python3-pip
# Arch / Manjaro
sudo pacman -S python tk python-pipDespués, desde la raíz del repositorio:
python3 -m pip install --user -r requirements.txt
python3 -m ernreaderTambién se puede instalar como aplicación. El paquete incluye la colección completa, así que el comando funciona desde cualquier directorio:
python3 -m pip install .
ernreaderO, más cómodo, usando el script de arranque incluido (detecta Python, comprueba Pillow y la instala si hace falta, preguntando primero):
./run.sh-
Instala Python 3.10+ desde python.org. Durante la instalación, marca la casilla "Add python.exe to PATH". El instalador oficial de Windows ya incluye Tkinter (Tcl/Tk), no hace falta nada aparte.
-
Instala Pillow (o deja que
run.batlo haga por ti):py -3 -m pip install --user -r requirements.txt -
Ejecuta:
py -3 -m ernreaderO simplemente haz doble clic en
run.bat(detecta Python, revisa Pillow y te pregunta antes de instalar nada).
El Python del sistema en macOS moderno no siempre trae Tkinter con buen soporte; se recomienda instalar Python vía Homebrew, que sí lo incluye:
brew install python-tk
python3 -m pip install --user -r requirements.txt
python3 -m ernreaderO bien:
./run.shPor defecto el lanzador busca los números en data/. Para usar otra
carpeta de datos (por ejemplo al probar una extracción parcial):
python3 -m ernreader --data dataOtros flags: --scale FACTOR|auto fuerza el escalado de la interfaz (útil en
pantallas HiDPI si la detección automática no acierta) y --no-restore
desactiva el aviso de "continuar donde te quedaste" al arrancar (ver más
abajo).
El lanzador (la ventana de "elige un número") tiene dos ayudas que no existían en el original de 1998-2000, pensadas para navegar más rápido por los 11 números sin cambiar nada de su contenido:
- Buscar… (botón junto a "Salir", o
Ctrl+F): abre una ventana de búsqueda de texto completo sobre los artículos de todos los números. Escribe uno o más términos (todos deben aparecer, sin importar mayúsculas ni acentos) y pulsa Buscar o Enter; haz doble clic o Enter sobre un resultado para abrir ese artículo directamente. La ventana no es modal: puede quedarse abierta mientras lees. - Continuar donde te quedaste: si la última vez que usaste el lector
tenías un número abierto, al volver a arrancar aparece una fila destacada
arriba de la lista con ese número; un clic (o Enter, si le das foco) lo
reabre con los formularios que tenías abiertos. Nunca se reabre nada
automáticamente sin ese clic explícito. Se puede desactivar por completo
con
--no-restore.
ern/
├── ERNSC1-1 … ERNSC2-5/ # Material original (VB; ERNSC2-1 conserva el EXE)
├── docs/PORTING.md # Arquitectura completa del pipeline de port
├── tools/ # Extracción y validación (no se ejecutan al leer la revista)
│ ├── extract_vb.py # .vbp/.frm/.frx -> data/<ISSUE>/manifest.json + assets/ + text/
│ ├── extract_exe.py # reconstruye los textos de ERNSC2-1 desde el EXE
│ ├── convert_emf.py # post-proceso: rasteriza fondos EMF/WMF que Pillow no soporta
│ └── validate.py # comprueba consistencia de todo lo extraído
├── data/ # Los 11 números ya extraídos (esto es lo que lee ernreader)
│ └── <ISSUE>/
│ ├── manifest.json # formularios, controles, menús y código VB por número
│ ├── behavior.json # eventos VB traducidos a acciones declarativas
│ ├── assets/ # imágenes (iconos, fondos) convertidas a PNG
│ └── text/ # artículos largos y arte ASCII, en UTF-8
├── ernreader/ # El lector en sí (Python 3 / Tkinter)
│ ├── __main__.py # `python -m ernreader` -> abre el lanzador
│ ├── launcher.py # ventana de colección: elige uno de los 11 números
│ ├── engine.py # renderiza formularios Win95 desde manifest.json
│ ├── actions.py # intérprete de behavior.json (los "easter eggs")
│ └── theme.py # colores de sistema Win95, mapeo de fuentes, estilos
├── tests/ # Suite de pruebas del motor
└── README.md # Este documento
tools/solo hace falta si quieres regenerardata/desde las carpetasERNSC*; para leer la revista no se necesita.ernreader/es la aplicación: no conoce Visual Basic, solo sabe leer elmanifest.json/behavior.jsonde cada número.data/es, en la práctica, el contenido de la revista ya extraído: se versiona en el repositorio junto con el código porque es parte del producto final, no un artefacto de compilación.
Para el detalle técnico completo del formato de manifest.json,
behavior.json y las decisiones de mapeo VB → Tkinter, ver
docs/PORTING.md.
Los 11 números ya vienen extraídos en data/, pero si tocas el extractor
o quieres reproducir el proceso desde cero:
# 1. Extraer los 10 números que conservan proyecto VB
python3 tools/extract_vb.py --all
# (o un solo número, para iterar más rápido)
python3 tools/extract_vb.py --issue ERNSC1-1
# 2. Reconstruir los 17 artículos de Año II Nº1 desde el EXE preservado
python3 tools/extract_exe.py
# 3. Post-proceso: rasterizar los fondos en formato EMF/WMF que Pillow no
# sabe abrir directamente. Requiere LibreOffice instalado (usa su modo
# headless para la conversión); si no lo tienes, este paso se puede
# omitir y esos fondos concretos quedarán sin imagen.
python3 tools/convert_emf.pyEl extractor VB publica cada número mediante un directorio temporal: un
fallo no deja una extracción parcial. Además conserva el behavior.json y
los assets EMF/WMF ya postprocesados, por lo que es idempotente y se puede
volver a ejecutar sin borrar la traducción manual de eventos.
Nota: no existe fuente para el Año II Nº1 — del autor solo se
conserva el .exe compilado, no el proyecto VB. Su manifest se reconstruyó
a partir del binario y tools/extract_exe.py extrae sus 17 artículos de
forma determinista. El número sí está incluido en el lanzador.
# Suite de pruebas del motor (mapeo de controles, intérprete de acciones,
# ciclo de vida de ventanas, etc.)
python3 tests/test_engine.py
python3 tests/test_features.py
python3 tests/test_interactive.py
# Validación de consistencia de los datos extraídos: formularios, texto
# y assets referenciados existen en disco, offsets .frx resueltos, eventos
# de behavior.json apuntan a controles/formularios reales, etc.
python3 tools/validate.py
# Verificación reproducible del extractor del número sin fuentes VB
python3 tools/extract_exe.py --dry-runvalidate.py termina con código de salida distinto de cero si encuentra
algo roto; las advertencias informativas (código huérfano de VB que
referencia controles que ya no existen, herencia real de los .frm
originales) no cuentan como fallo.
Funciona: los 11 números arrancan, el lanzador lista los números
leyendo version_comments de cada manifest.json, se navega entre
formularios, los textos largos y el arte ASCII se muestran íntegros, los
menús y atajos de teclado están operativos, y el intérprete de
behavior.json cubre la gran mayoría de los eventos originales (mostrar
formularios, guardar texto, cambiar propiedades, relojes, animaciones,
MsgBox, abrir URLs, etc.). Lo que no se pudo traducir a una acción
declarativa queda marcado como unsupported con el código VB crudo
adjunto, y se loguea por stderr sin interrumpir la ejecución.
Limitaciones conocidas:
- En algunos números, el bitmap de título estilizado (el logo/banner hecho a mano en el .frm original) aparece recortado respecto al original.
- En los números Año II Nº4 y Nº5, algunas ventanas de splash/intro se solapan en vez de mostrarse en la secuencia exacta del original.
- Los controles habituales y varios OCX (
SSTab,StatusBar,ProgressBar,Slidery barras de desplazamiento) tienen adaptación funcional. Algunos controles muy específicos, como el reproductor multimedia y OLE/Data, siguen mostrándose como un placeholder visible ([NombreDelTipo]) en lugar de fallar o desaparecer silenciosamente. - El código VB que depende de APIs de Windows, cálculos dinámicos de pantalla
o inicialización de componentes externos continúa marcado como
unsupported: se conserva completo y se registra por stderr, sin detener la lectura. Algunas listas alimentadas por ese código quedan vacías. - La transparencia de controles con
BackStyle=0se aproxima heredando el color de fondo del contenedor padre, en vez de un compositing real; en la mayoría de los casos es indistinguible del original, pero puede notarse sobre fondos con imagen.
Ninguna de estas limitaciones impide leer o navegar ningún número completo; son matices visuales de fidelidad, documentados aquí para quien quiera seguir puliéndolos.
El lanzador se puede manejar enteramente con teclado:
- Tab recorre las filas de números (y la fila de "continuar" si aparece); cada fila muestra un marco de foco visible (borde azul marino) además de resaltarse al pasar el ratón.
- Flechas arriba/abajo mueven el foco entre filas sin necesidad de soltar el teclado; Enter abre el número enfocado (equivalente a hacer clic).
- La ventana de búsqueda abre con el foco ya puesto en el campo de texto; Enter busca, flecha abajo pasa el foco a la lista de resultados, Enter/doble clic sobre un resultado lo abre, y Escape cierra la ventana de búsqueda (que no es modal, así que también se puede dejar abierta y seguir navegando el lanzador).
- Dentro de un número, los cuadros de texto de los artículos (
tk.Text) aceptan foco por Tab y se pueden desplazar con teclado (flechas, Página arriba/abajo) como cualquierTextde Tkinter.
Limitación conocida: el contenido de los artículos es en buena parte arte ASCII (dibujado carácter por carácter para verse como un dibujo, no como texto corrido) y el port lo preserva intacto a propósito — alterarlo rompería la fidelidad al original. Un lector de pantalla leerá ese arte carácter por carácter o línea por línea, lo cual no transmite el dibujo y puede ser ruidoso; no hay, dentro del alcance de este proyecto, una forma de "traducir" arte ASCII a una descripción accesible sin inventar contenido que el original no tenía. El texto en prosa de los artículos (que también abunda) sí es perfectamente legible por un lector de pantalla, al ser texto plano normal en un widget estándar de Tkinter.
El Radiaktivo Newz es obra de BadBit y el resto del El
Radiaktivo Newz Team, autores originales de la revista entre 1998 y
2000 (créditos tomados de los propios proyectos VB: VersionCompanyName,
VersionLegalCopyright y VersionProductName de cada .vbp, que a lo
largo de los números citan variamente "BadBit.net", "BadBit Corp." y "El
Radiaktivo Newz Team").
El port a Python 3 / Tkinter para sistemas operativos modernos (Linux, Windows, macOS) se realizó en 2026, como proyecto de preservación de este pedazo de historia de la escena hacker mexicana.
Licencia: GNU General Public License v2.0 (GPLv2), la misma con la que
BadBit / El Radiaktivo Newz Team publicó originalmente el código fuente
de esta revista. Ver el archivo LICENSE.