Todos los artículos
-
Evitar la enumeración de cuentas en formularios de inicio de sesión, registro y restablecimiento
Cualquier diferencia entre la respuesta para una cuenta existente y una inexistente (texto del mensaje, estado HTTP, redirección, tiempo de respuesta) permite a un atacante construir una lista de usuarios válidos a los que atacar. Conviene devolver el mismo mensaje y estado genéricos, realizar el mismo trabajo en ambos caminos, trasladar la información distintiva a un correo electrónico, y limitar la tasa de solicitudes para que las diferencias residuales no puedan muestrearse a gran escala.
-
SLI para colas y trabajos por lotes: antigüedad del mensaje más antiguo, frescura, cobertura y último éxito
Los servicios orientados a peticiones miden disponibilidad y latencia; las colas y los trabajos por lotes necesitan indicadores distintos: cuán antiguo es el elemento sin procesar más viejo, qué proporción de los datos es más reciente que un umbral, qué proporción de ejecuciones programadas se completó dentro de su ventana, y cuándo tuvo éxito el trabajo por última vez. Esta metodología los deriva de los SLI de canalización (pipeline) del SRE workbook.
-
Comprobar desde la línea de comandos, con openssl, la cadena de certificados TLS servida y su caducidad
openssl s_client con -servername y -showcerts imprime los certificados que el servidor realmente envía, algo que el manual describe como una cadena no verificada; openssl x509 lee el subject, el issuer, los SAN y la fecha notAfter de cada uno, y openssl verify -untrusted reconstruye la cadena frente a un almacén de confianza. Conviene comprobar cada nombre de host, y IPv4 e IPv6 por separado.
-
Convenciones de esquema para una base de datos PostgreSQL nueva: nombres, identificadores, marcas de tiempo y texto
Conviene decidir un puñado de convenciones antes de la primera migración: nombres en snake_case en minúsculas que nunca necesiten comillas, una única estrategia de id aplicada en todas partes, timestamptz para cada instante con created_at en todas las tablas, text en lugar de varchar(n), y NOT NULL y claves foráneas explícitas; conviene dejarlas por escrito para que toda migración posterior las siga.
-
¿Cuándo conviene que un equipo divida un monolito en servicios?
Pregunta abierta: qué señales observables (acoplamiento en el despliegue, límites entre equipos, necesidades de escalado, patrones de incidentes) han precedido a extracciones exitosas de servicios desde un monolito, y qué extracciones se revirtieron más tarde.
-
Entrenamiento con precisión mixta: autocasting, escalado de la pérdida y límites numéricos
La precisión mixta asigna a cada operación un formato de punto flotante adecuado. El autocasting y el escalado de la pérdida resuelven problemas distintos, y para obtener mejoras de rendimiento hacen falta tanto comprobaciones numéricas como mediciones en el hardware previsto.
-
Cribar los resultados de herramientas y los pasajes recuperados con un modelo de decisión antes de que lleguen al contexto del agente
Un protocolo para interponer un clasificador tipado y rápido entre un agente y sus entradas: puntuar cada pasaje recuperado o resultado de herramienta en cuanto a relevancia, contradicción e instrucciones ocultas en una sola petición, descartar o marcar en código, y verificar las citas textuales frente a su fuente, tratando siempre el filtro como algo que un texto adversarial todavía puede mover.
-
Funciones y decoradores genéricos con TypeVar, ParamSpec y la sintaxis de la PEP 695
Una variable de tipo enlaza los tipos de los parámetros y del valor de retorno; los corchetes de la PEP 695 (def f[T](...)) sustituyen a las declaraciones manuales de TypeVar, los límites (bounds) y las restricciones (constraints) tienen semánticas distintas, y ParamSpec permite que un decorador conserve la firma de la función que envuelve en lugar de reducirla a Callable[..., Any].
-
Convertir las marcas de tiempo a UTC en el límite
Rechazar las marcas de tiempo ambiguas, convertir los instantes con información de zona horaria a UTC, y conservar la zona horaria original cuando importe la semántica de programación local.
-
Un registro de tiempos de entrega de paquetes: pedido, envío, seguimiento y marcas de tiempo en la puerta en una sola fila, manteniendo separados el escaneo del transportista y la llegada observada
Un protocolo propuesto, solo de registro, para anotar la cronología de cada paquete como marcas de tiempo en el formato de fecha y hora de Internet de la RFC 3339 con desfase UTC, tomadas de la confirmación del pedido, el aviso de envío, los eventos de seguimiento del transportista y la propia anotación del hogar sobre la llegada, registrando el transportista, el servicio, el lugar de entrega y cada intento; el escaneo de «entregado» del transportista y la llegada observada son columnas separadas, y no se afirma ninguna comparación entre transportistas ni ningún tiempo de entrega.
-
Consultar el journal de systemd con journalctl: unidad, arranque, prioridad, intervalo de tiempo y salida JSON
journalctl puede filtrar el journal de systemd por unidad, arranque, prioridad e intervalo de tiempo, y generar una salida legible por máquina, pero solo si el journal está configurado para persistir entre reinicios. Esta metodología cubre las consultas precisas, el almacenamiento persistente y los límites de tamaño en journald.conf.
-
Campos nulos frente a campos ausentes en las API JSON
Un campo ausente, un campo con valor null y un campo con un valor vacío son tres afirmaciones distintas, y una API debería indicar cuáles de ellas distingue: el merge patch de la RFC 7396 usa null para significar «eliminar», ProtoJSON trata null como «sin establecer» y no lo emite, y la guía de estilo JSON de Google omite las propiedades vacías o null salvo que exista una razón semántica para conservarlas.
-
Los embeddings como tipo de dato: vectores de longitud fija, una función de distancia y lo que necesita una columna de ellos
Un embedding es un vector de números en coma flotante de longitud fija, producido por un modelo concreto, que solo tiene sentido bajo la distancia para la que se entrenó ese modelo y solo junto a vectores de la misma versión del modelo; almacenarlo requiere registrar la dimensión, el identificador del modelo y la distancia, y consultarlo significa realizar una búsqueda de vecinos más próximos, exacta o aproximada.
-
Trampas de la búsqueda binaria: desbordamiento del punto medio y límites con error de uno
La búsqueda binaria es corta y famosa por lo fácil que es hacerla mal: el punto medio (low + high) / 2 desborda los enteros de ancho fijo, los límites inclusivos y exclusivos se mezclan, y los duplicados plantean la duda de qué índice devolver. Conviene usar una biblioteca o la forma con predicado monótono e intervalos semiabiertos, y probar los casos límite.
-
Verificación de firmas de webhooks de Stripe: Stripe-Signature, tolerancia de marca de tiempo y rotación de secretos
Stripe envía un encabezado Stripe-Signature con la forma t=<timestamp>,v1=<firma hex>, calculado como HMAC-SHA256 sobre la cadena "{timestamp}.{raw body}" con el secreto completo del endpoint whsec_ como clave. Por defecto, las bibliotecas de Stripe rechazan las firmas cuya marca de tiempo tenga más de cinco minutos (300 segundos) de antigüedad y, mientras un secreto rotado sigue activo (hasta 24 horas), el encabezado incluye un valor v1 por cada secreto activo.
-
Comprobar si un ensayo de migración de base de datos representa el estado de destino
Evaluar si una prueba de migración aislada puso a prueba las condiciones de esquema y de datos que importan para el despliegue previsto, en lugar de limitarse a demostrar que la migración funciona en una base de datos vacía.
-
Escribir scripts de shell que fallen de forma segura
Conviene usar set -euo pipefail, entrecomillar toda expansión, preferir [[ ]] y los arreglos, revisar las herramientas con ShellCheck, y evitar analizar la salida de ls; un script que se detiene en el primer error inspira más confianza que uno que continúa.
-
Identificar un host Linux desconocido antes de cambiar nada en él
Antes de que un agente o una persona operadora cambie la configuración de una máquina Linux que no construyó, debería establecer la distribución, el kernel, el estado de virtualización o contenedor, el sistema de init, el gestor de paquetes y el estado del control de acceso obligatorio, cada uno con un comando barato y no destructivo.
-
Claves de caché de CDN y purgado: qué identifica un objeto en caché y cómo invalidarlo
Una caché almacena las respuestas bajo una clave construida, como mínimo, a partir del método y del URI de destino, ampliada con las cabeceras de la petición nombradas en Vary; las CDN añaden el esquema, el host y la cadena de consulta, y permiten personalizar la clave a costa de fragmentar (sharding) la caché. Purgar por URL solo afecta a los objetos cuya clave coincide exactamente, así que conviene etiquetar las respuestas (por ejemplo, con la cabecera Surrogate-Key de Fastly) para purgar grupos de forma fiable.
-
Puntos de control (checkpointing) en una tarea larga de un agente: archivos de progreso, pasos idempotentes y reanudación
Cómo debería un agente que trabaja en una tarea de varios pasos registrar el progreso, de modo que un fallo, un reinicio de contexto o un traspaso se reanuden en el último paso completado sin repetir efectos secundarios: un plan con pasos numerados, un archivo de progreso actualizado tras cada paso con evidencia, claves de idempotencia para las escrituras externas, y un procedimiento de reanudación que verifica el estado antes de continuar.
Legible por máquina: JSON