Este es un blog realmente entretenido para explorar a fondo — documenta de todo, desde microcontroladores PIC y el hackeo de cartuchos de Sega hasta curiosidades de redes y scripts ingeniosos, todo con la misma energía de «vamos a comprobar esta afirmación de verdad». Abarca décadas de proyectos paralelos: hardware retro (un flash cart para la Sega Master System, la construcción de una microcomputadora i8085), historias de guerra sobre programación embebida, análisis profundos de redes (WiFi en aviones, congestión de proveedores de internet, WireGuard vs OpenVPN) y curiosidades de software puntuales como un generador de códigos QR o un servidor HTTP de una sola línea. Se lee como el auténtico cuaderno de bitácora de un hacker — práctico, escéptico ante el bombo publicitario y siempre respaldado por datos o código funcional en lugar de simples afirmaciones sin fundamento.
La publicación destacada: «Sorteos demostrablemente justos»
El planteamiento es entrañablemente humano: un grupo de vacaciones tenía más personas que habitaciones, así que necesitaban un sorteo en el que confiaran incluso 40 amigos suspicaces. En lugar de simplemente decir «confía en mí, es aleatorio», la solución utiliza un sorteo de lotería real como semilla impredecible y la combina mediante HMAC con la identidad fija de cada participante (nombre, apellido, fecha de nacimiento), para luego ordenar a todos según el hash resultante. Es realmente elegante:
- Nadie puede amañarlo de antemano (la semilla todavía no existe)
- Nadie puede manipularlo después (la lista de participantes se publica de antemano)
- Todo el proceso es reproducible de forma independiente por cualquiera que tenga una calculadora y los datos publicados
El código
import hmac
SEED=bytes('5495993812', 'utf-8')
DIGEST='sha3_224'
if __name__ == '__main__':
draws = {}
keys = []
with open('people.csv', 'r') as in_f:
for l in in_f.readlines():
l = l.replace('\r', '').replace('\n', '')
h = hmac.new(SEED, bytes(l, 'utf-8'), DIGEST)
key = int.from_bytes(h.digest(), 'big')
keys.append(key)
draws[key] = l + ";" + h.hexdigest()
keys.sort()
with open('draw.csv', 'w') as out_f:
for key in keys:
out_f.write(draws[key] + '\n')
Lo que lo hace impresionante no es la complejidad, sino la contención. Una docena de líneas resuelven un problema real de confianza de forma criptográfica en lugar de procedimental, y no se limita a afirmar que es justo: lo ejecutó un millón de veces con distintas semillas y graficó la distribución de la tasa de victorias por participante para demostrar que es estadísticamente uniforme.
El patrón a lo largo del sitio
Ese patrón de «explicar el problema, construir la solución mínima y luego verificarla empíricamente» aparece una y otra vez — ya sea comparando scp con tar en escala logarítmica, comparando compresión de imágenes sin pérdida, o midiendo la latencia UART en un microcontrolador frente a un PC. Es un blog para quienes prefieren que las afirmaciones vengan con pruebas.
Vale la pena echarle un vistazo si te interesa el hardware, las redes o el código conciso pero correcto.