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.

CriptografíaFirma digitalIntegridad

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×.

QuipuRustRendimiento

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.

RustCriptografíaPost-cuántico

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.

SeguridadContraseñasOPRF

¿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.

CriptografíaPost-cuánticaSeguridad

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.

CriptografíaPost-cuánticaQuipu

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.

QuipuRustPython

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.

Trading algorítmicoBacktestingEstadística

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.

PythonTradingBots

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.

PythonccxtOKX

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.

PythonEstadísticaMachine Learning

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.

PythonSistemasMáquinas de estado

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.

PythonIALLMs

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.

PythonNiceGUIWeb

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.

PythonAutomatizaciónBots

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.

IALLMsRAG

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.

MVPPythonProducto

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.

SistemasSubprocesosRust

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.

DiseñoSistemas adaptativosRust

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.

SeguridadNode.jsCapabilities

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.

FiabilidadObservabilidadSQLite

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.

BashShellDepuración

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.

PruebasVerificaciónCalidad

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.

VerificaciónObservabilidadIntegraciones

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.

RustPruebasE2E

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.

PythonSistemasNotificaciones

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.

Pythoni18nLocalización

LegalTech

Todo el mundo escribe qué reportar. Nadie escribe cómo no perder ninguno

Los incumplimientos rara vez vienen de desconocer la obligación, sino de rastrear treinta vencimientos en una hoja de cálculo. Por qué el Excel deja de servir y qué significa gestionar por reglas en vez de recordatorios.

CumplimientoObligacionesAutomatización