Todos los artículos
-
Números en coma flotante: por qué 0.1 + 0.2 no es 0.3
La coma flotante binaria representa la mayoría de las fracciones decimales de forma aproximada, por lo que la aritmética acumula error de redondeo; conviene comparar con tolerancias, sumar con cuidado, usar enteros o tipos decimales para dinero y recuentos, e imprimir con suficientes dígitos para permitir una reconversión exacta (round-trip).
-
Llamar a la API de TypeSafe desde un agente: forma de la solicitud, errores, reintentos y fijación de versión
El contrato documentado que necesita un agente para llamar a Jev sin una capa de chat: POST /v1/systemone con una clave Bearer, un estado, un nombre de modelo y un mapa de preguntas tipadas; las respuestas se indexan igual que las preguntas, más un bloque de uso; los códigos 401, 422, 429 y 529 con backoff exponencial; alias que cambian de versión frente a identificadores versionados que no cambian; los valores por defecto del SDK para los reintentos y la skill del agente para agentes de codificación.
-
Diseñar un panel de operaciones: una pregunta por panel, una pantalla por audiencia
Partir de las preguntas que debe responder quien atiende un incidente, asignar un panel a cada pregunta, ordenar los paneles de lo general a lo específico, normalizar unidades y ejes, usar variables de plantilla en lugar de copias, enlazar cada alerta de aviso al panel que necesita y mantener la definición del panel bajo control de versiones.
-
Modos de simulación (dry-run) para acciones de agentes: mostrar el plan antes del cambio
Dotar a cada herramienta que cambia el estado de un modo que calcula y devuelve el plan concreto (qué objetos, qué campos, cuántos) sin aplicarlo, validar el plan en el lado del servidor cuando el sistema lo permita, exigir que el plan se produzca y se revise antes de la llamada real, y comparar después el resultado real con ese plan.
-
Bases de datos efímeras en contenedores para pruebas de integración
Iniciar el motor de base de datos real en un contenedor desechable por cada ejecución de pruebas, mantener sus datos en memoria, aplicar las migraciones una sola vez a una base de datos plantilla y copiarla por cada archivo de pruebas; así las pruebas ejercitan el planificador real, las restricciones y el comportamiento de aislamiento en lugar de un sustituto en memoria.
-
Apagado ordenado: gestión de SIGTERM en los servicios
Los entornos de ejecución de contenedores envían SIGTERM y esperan un período de gracia antes de SIGKILL; un servicio debe dejar de aceptar trabajo nuevo, terminar o devolver el trabajo en curso, cerrar las conexiones y finalizar dentro de ese período. Ignorar la señal convierte cada despliegue en una interrupción del servicio.
-
Los formularios que declaran restricciones nativas de HTML producen menos rechazos de validación en el servidor por envío que los formularios validados solo con JavaScript personalizado
Hipótesis: el navegador bloquea el envío interactivo de un formulario cuyas restricciones nativas (required, pattern, type, min y max) no se cumplen, mientras que MDN señala que llamar a submit() evita esto y que novalidate lo desactiva; la propuesta es que los formularios que incorporan restricciones nativas que reflejan las reglas del servidor llegan al servidor con menos rechazos por envío que los formularios cuyas comprobaciones residen solo en scripts personalizados, porque las comprobaciones nativas siguen funcionando cuando el script no se carga o falla; se propone una prueba A/B, sin que se afirme ningún resultado.
-
Upsert, row limits and identifier quoting across PostgreSQL, MySQL, SQLite and SQL Server
PostgreSQL's ON CONFLICT, MySQL's ON DUPLICATE KEY UPDATE, SQLite's PostgreSQL-style ON CONFLICT and SQL Server's MERGE are three families of upsert syntax, LIMIT/OFFSET has at least three shapes, and a quoted identifier means double quotes, backticks or square brackets depending on the engine.
-
Códigos de salida de find y xargs: el 0/>0 básico de find frente a la escala 123-127 de xargs
find solo garantiza 0 si todo salió bien y un valor mayor que 0 si hubo errores, sin más detalle a propósito. xargs, en cambio, define una escala concreta de cómo falló el comando invocado: 123 para una salida distinta de cero ordinaria, 124 para la salida 255, 125 si lo mató una señal, 126 si no se puede ejecutar y 127 si no se encuentra. Al canalizar find hacia xargs hay que comprobar dos filosofías distintas de códigos de salida en un mismo pipeline.
-
Explicarlo de vuelta como comprobación de comprensión: explicarlo a un lector determinado y luego compararlo con la fuente
Escribir o pronunciar una explicación dirigida a un lector concreto y menos informado deja al descubierto lagunas que una relectura oculta; un experimento publicado en 2014 halló que la mera expectativa de enseñar un pasaje producía un recuerdo más completo y mejor organizado que la expectativa de un examen, y la explicación escrita puede comprobarse frase por frase contra la fuente.
-
Dónde residen las credenciales en una máquina de desarrollo que un proceso agente puede leer
Un agente que se ejecuta como el usuario puede leer lo que el usuario puede leer: variables de entorno, archivos de credenciales de herramientas de línea de comandos, inicios de sesión de registros de contenedores, claves SSH, historial de shell y almacenes cercanos al navegador. Conocer estas ubicaciones permite a quien opera el sistema decidir qué mantener fuera del alcance del agente y qué rotar tras un incidente.
-
Confusión de dependencias: cuando un paquete público eclipsa a uno privado
Si una compilación resuelve los nombres de paquete a la vez en un índice privado y en uno público, un atacante que publique el nombre privado en público con una versión superior puede conseguir que se instale su código; la documentación de pip califica de insegura la opción --extra-index-url para paquetes privados precisamente por esta razón. Las defensas son espacios de nombres vinculados a un único registro, un índice único que actúa de proxy, la fijación por hash y la reserva de nombres.
-
Cargar YAML de forma segura
Los cargadores completos de YAML pueden instanciar objetos arbitrarios a partir de nodos etiquetados; conviene usar siempre un cargador seguro, fijar la semántica de versión de YAML y validar el resultado contra un esquema antes de usarlo.
-
Dialectos de patrones glob: qué significan * y ** en .gitignore, .dockerignore, bash, Python y GitHub Actions
Los mismos caracteres de asterisco simple y doble significan cosas distintas según dónde se evalúe el patrón: un patrón de .gitignore sin barra coincide a cualquier profundidad, mientras que la misma línea en .dockerignore solo coincide en la raíz del contexto; la recursión con globstar de bash es opcional y fnmatch de Python ni siquiera reconoce rutas.
-
La cabecera Link y los tipos de relación de enlace
El RFC 8288 permite que cualquier respuesta HTTP incluya enlaces tipados en una cabecera Link: <destino>; rel="relación" más los parámetros opcionales anchor, hreflang, type, title y media. Los nombres de relación proceden del registro de la IANA (next, prev, canonical, alternate, describedby, preload) o son URI absolutas para extensiones privadas. Es el modo en que las respuestas no HTML señalan a sus vecinas y en que el código 103 Early Hints indica a un navegador qué obtener por adelantado.
-
Añadir un repositorio APT de terceros de la forma actual: archivos .sources deb822 y llaveros con Signed-By
apt-key está obsoleto; la forma admitida de añadir un repositorio de terceros firmado es un archivo de llavero bajo /etc/apt/keyrings referenciado con una opción Signed-By, escrito bien en el formato clásico de una línea o en el nuevo formato deb822 .sources que analizan tanto Debian 12/13 como las versiones actuales de Ubuntu.
-
Revisar envoltorios de órdenes con un sustituto que registra argumentos
Comprobar cómo el envoltorio de órdenes de un agente de codificación convierte valores controlados por el usuario en una intención ejecutable. Este método original sustituye el programa real por un registrador de argumentos inocuo y examina directamente el límite.
-
Planificar una actualización mayor in situ de RHEL con Leapp
Leapp actualiza RHEL 8 a 9, o 9 a 10, in situ, pero solo después de resolver todos los hallazgos del informe de preactualización que bloquean la actualización. Esta metodología cubre ejecutar la evaluación, registrar las respuestas a sus preguntas, y por qué una copia de seguridad debe preceder al propio paso de actualización.
-
Renderizado indirecto dirigido por GPU: generar la carga de dibujo en el dispositivo
Usa los resultados de visibilidad de la GPU para generar dibujos indirectos, con capacidad de búfer explícita, reinicio de contadores, sincronización y una referencia en CPU para validar.
-
Una zona de intercambio (swap) pequeña con swappiness bajo reduce las terminaciones por falta de memoria (OOM) del servicio principal en servidores con memoria ajustada
Hipótesis: en servidores de propósito único cuyo conjunto de trabajo llena casi toda la RAM, una zona de intercambio modesta combinada con un vm.swappiness bajo permite al núcleo paginar a disco la memoria anónima fría durante picos breves, de modo que el servicio principal sufre menos terminaciones por falta de memoria (OOM) que en el mismo host sin intercambio, a costa de una latencia ocasional.
Legible por máquina: JSON