Blog
Guías prácticas sobre criptografía post-cuántica, trading algorítmico, Python e IA — cada una escrita desde el código que la respalda.
Criptografía post-cuántica
Un hash no es una cadena de custodia, y «la firma valida» prueba dos cosas de tres
Verificar una firma digital exige tres cosas: la forma, la clave pública y la confianza en que esa clave es de esa persona. La tercera no la comprueba ninguna máquina. Qué prueba de verdad un hash, qué prueba una firma, y dónde se cae un informe de integridad.
Cincuenta segundos para medio megabyte: la optimización que arreglaba la constante y no el orden
Una conversión de base cuadrática sobrevivió meses en una librería de criptografía con todas las pruebas en verde. El comentario que la documentaba convencía de que el problema estaba resuelto. Medición, causa y el algoritmo clásico que lo bajó 111×.
Sellar un archivo para que nadie pueda discutir que no lo tocaste
Un hash único obliga a exhibir todo el conjunto para probar un solo archivo. Un árbol de Merkle, no. Cómo funciona Tunjo: raíz de integridad, firma triple post-cuántica y un verificador que puede ejecutar cualquiera.
Te roban la base de datos y no pueden crackear ni una contraseña
Argon2 encarece cada intento, pero el atacante que se lleva tu tabla de usuarios tiene tiempo infinito y GPUs. Un OPRF cambia el juego: el hash depende de una clave que no viaja con la base de datos. Cómo funciona, qué cuesta y qué se rompe.
¿Qué es la criptografía post-cuántica y por qué deberías migrar ya?
Explicación clara de la amenaza cuántica, el ataque 'harvest now, decrypt later', los estándares ML-KEM y ML-DSA del NIST, y por qué la migración empieza hoy.
Cifrado híbrido: por qué combinar criptografía clásica y post-cuántica
Qué es el cifrado híbrido, por qué combinar X25519 con ML-KEM-1024 (y Ed25519 con ML-DSA-87) es más seguro que elegir uno solo, y cómo lo aplica Quipu.
Quipu: cifrado post-cuántico en Rust puro, con una rueda para Python
Quipu es una librería de cifrado híbrido post-cuántico para datos en reposo, escrita en Rust puro. Para quien no programa en Rust, se distribuye como rueda nativa de Python (PyO3). Por qué dejamos atrás la C ABI y los bindings de varios lenguajes, con ejemplos.
Trading algorítmico fiable
Apagué el bot: cinco estrategias, 77.000 velas y cero ventaja neta de comisiones
Medí cinco estrategias de trading sobre 77.000 velas de un minuto de BTC y ETH, descontando comisiones. La mejor daba +0,0135 % con un estadístico t de 0,16. Por qué eso es cero, y por qué apagar fue la decisión correcta.
El redondeo que hace que tu bot arriesgue 10 veces lo que crees
Dimensionar una posición parece una división, pero hacerla caber en los mínimos del exchange es donde se pierde dinero. El patrón max(1, int(...)) y cómo evitarlo con Decimal y redondeo hacia abajo.
Por qué tu bot recibe 403 de Cloudflare (y cómo endurecer un cliente ccxt)
Muchos exchanges ponen Cloudflare delante de su API y, a ratos, challenguean con 403 a peticiones legítimas de tu propia cuenta. Cómo mitigarlo sin evadir nada: hardening de cabeceras y retry selectivo con backoff.
Dos formas en que un backtest te miente (y cómo evitarlas)
Casi todo el edge que se mide en un backtest es una de dos ilusiones: el modelo vio el futuro, o la variante ganadora ganó por ruido. Dos primitivas en Python puro para descartar ambas antes de arriesgar nada.
Cuando tu clasificador parpadea: histéresis para señales que oscilan
Una señal que cerca del umbral hace OK, CAÍDO, OK, CAÍDO dispara alertas o failovers en cada tembleque. La solución es vieja y elegante: no cambiar de estado hasta que el nuevo se sostenga.
Python, IA y desarrollo
Cómo integrar un LLM (Claude o GPT) en tu aplicación Python
Guía práctica y con código para conectar un modelo de lenguaje a tu app Python: llamadas a la API, streaming, salidas estructuradas y buenas prácticas para producción.
NiceGUI: crea una aplicación web en Python sin escribir JavaScript
Qué es NiceGUI, cómo funciona y por qué es ideal para MVPs, dashboards y herramientas internas hechas 100% en Python. Con ejemplo de código.
Automatiza tareas repetitivas con un bot en Python
Cómo identificar qué automatizar y construir un bot o script en Python que te ahorre horas: scraping, informes, notificaciones y ejecución programada.
RAG explicado: cómo darle a un LLM tu propia información
Qué es Retrieval-Augmented Generation, por qué evita las alucinaciones y cómo construir un asistente que responde con TUS documentos. Con el patrón en Python.
De la idea al MVP: lanza tu producto en 2 semanas con Python
Qué es un MVP, qué NO debe incluir, y cómo un stack Python moderno (FastAPI, NiceGUI, SQLite) permite validar tu idea en semanas en lugar de meses.
Micro-librerías fiables
Maté al proceso y el drenaje siguió colgado: un nieto tenía la tubería
Un subproceso se cuelga, lo mato con SIGKILL, y aun así mi programa se queda esperando su salida para siempre —a 0% de CPU—. La tubería no la tenía el hijo: la heredó un nieto, y mientras él viva el EOF no llega.
Mi memoria adaptativa quedó vacía en producción, y no era un bug
Un sistema que debía aprender de sus propios fracasos acumuló cero registros, mientras una tabla vecina crecía. No había error en el código —los logs estaban limpios—. Era un punto muerto: dos mecanismos de seguridad que se mataban de hambre.
No afirmes que una frontera de seguridad aguanta: demuéstrala
Confinar qué puede tocar un trozo de código —el sistema de archivos, lanzar procesos— es un problema de capabilities. Y hay una diferencia enorme entre diseñar la frontera y PROBAR que aguanta: la primera es una afirmación; la segunda, un arnés que ataca su propia frontera y guarda la evidencia.
29 tareas zombis: el trabajo que nunca termina no da ningún error
Un orquestador tenía 29 tareas en estado «ejecutándose» desde hacía días. Nadie se enteró, porque una tarea colgada y una tarea lenta se ven exactamente igual. La causa, la reconciliación al arrancar, y por qué el registro no servía para detectarlo.
Seis horas esperando a un proceso que era él mismo
Un bucle de espera que buscaba un proceso por su línea de órdenes giró seis horas y doce minutos. El patrón estaba escrito en el propio shell, así que se encontraba a sí mismo y la condición no podía volverse falsa nunca. Las formas correctas de escribirlo.
Mi detector estaba ciego en 1.029 de 6.309 líneas y sus tres pruebas seguían en verde
Un banco de pruebas hecho solo de casos negativos sobre archivos que hoy están limpios no distingue una regla correcta de una regla ciega: los dos devuelven vacío. Cómo se detecta, y las tres condiciones que hacen que una pareja de pruebas discrimine de verdad.
Dije que no salían datos. Al primer envío bueno, salieron dos
Un cero, un silencio o un «no encontrado» son indistinguibles del negativo real cuando el código que los produciría nunca llegó a ejecutarse — y encima dan la confianza de haber verificado. El control positivo, y por qué hay que volver a mirar después del primer éxito.
Tu banco de pruebas E2E mide el códec, no el producto
Cien pruebas en verde y la pantalla rota. Por qué afirmar sobre el HTML que devuelve el servidor no prueba nada en cuanto el navegador construye parte de la interfaz — y cómo dibujarla de verdad, incluidas las pantallas con sesión.
Notificar a varios canales sin que un fallo tumbe al resto
Mandar lo mismo a Slack, Discord, un webhook y un email parece un for de tres líneas. Lo es, hasta que el primer canal lanza una excepción y los demás se quedan sin enviar.
i18n sin gettext: traducciones en JSON con claves de punto
Para una app pequeña o mediana, gettext y Babel son un peaje de ficheros .po y un paso de compilación. A veces solo quieres un t() honesto sobre unos JSON.
Xiliux