Todos los artículos
-
Diseñar una rotación de guardia y su traspaso
Una rotación de guardia necesita una persona titular y una de respaldo, una porción acotada del tiempo del personal de ingeniería, duraciones de turno y reglas de intercambio que se puedan planificar, un presupuesto de avisos que desencadene trabajo correctivo al superarse, y un traspaso escrito en cada cambio de turno; el libro de SRE de Google y la documentación pública de respuesta de PagerDuty describen estas restricciones.
-
Nombrar identificadores: según su rol, con el vocabulario del dominio, tan largos como su alcance
Un nombre dice qué es o qué hace una cosa dentro del dominio, no qué tipo tiene ni cómo está implementada. La longitud crece con el alcance, cada concepto tiene exactamente una palabra, los valores booleanos se leen como una afirmación y las colecciones van en plural. Las convenciones del lenguaje (PEP 8, Effective Go) prevalecen sobre el gusto personal, y renombrar es barato siempre que se haga con herramientas y en un commit propio.
-
Probar código que depende del tiempo y del azar
Inyectar un reloj y una fuente de aleatoriedad en lugar de llamar directamente a time.time() o a random; así las pruebas pasan valores fijos, y el código se mantiene determinista y reproducible.
-
Deserialización de datos no confiables: pickle y la serialización de Java
Los formatos nativos de serialización de objetos indican al receptor que construya objetos arbitrarios, y construir objetos ejecuta código; la documentación de pickle de Python afirma sin rodeos que el módulo no es seguro. No deserializar nunca estos formatos a partir de una entrada no confiable; donde una interfaz heredada lo obligue, restringir las clases que el flujo puede nombrar y firmar la carga útil.
-
Rotación de registros y límites de retención
Los registros deben tener un límite de tamaño y de antigüedad en cada capa (aplicación, runtime de contenedores, proxy, journal del sistema), con una retención elegida según las necesidades de depuración y legales, en lugar de «conservarlo todo».
-
Actualizar FreeBSD: freebsd-update para el sistema base, pkg upgrade para los paquetes y pkg audit para las vulnerabilidades conocidas
FreeBSD divide la aplicación de parches en dos herramientas independientes: freebsd-update fetch/install para el sistema base (con upgrade -r para un cambio de versión mayor), y pkg upgrade para los paquetes instalados. pkgbase —instalar el propio sistema base como paquetes pkg(8)— está documentado como experimental en FreeBSD 14 y como vista previa tecnológica para FreeBSD 15.0, todavía no como la vía por defecto.
-
La cadena de arranque de Linux para diagnóstico: firmware, gestor de arranque, kernel, initramfs y systemd
Un arranque de Linux pasa por el firmware, un gestor de arranque, el kernel, un initramfs y, por último, el gestor del sistema, y cada etapa cede el control a la siguiente. Saber qué hace cada una y dónde registra sus mensajes permite a un administrador acotar un arranque fallido a una sola etapa antes de modificar nada.
-
Registros de acceso a datos personales: registrar quién leyó qué registro
Un registro de acceso para datos personales registra las lecturas, no solo las escrituras: actor, sujeto, objeto, motivo y momento, emitido en la ruta de lectura de la aplicación y conciliado con el registro de sentencias a nivel de base de datos para las rutas que lo eluden; debe responder preguntas centradas en el sujeto, como quién consultó el registro de esta persona en el último año.
-
Aprender una base de código desconocida en un día: un protocolo de exploración con un mapa escrito
Un protocolo con tiempo acotado para el primer día en una base de código: compilar y ejecutar las pruebas antes de leer, leer el historial con git shortlog y git log para localizar dónde está la actividad, seguir una solicitud o un comando de principio a fin, y escribir un mapa de una página con los puntos de entrada, el modelo de datos, los invariantes y las preguntas abiertas; el resultado es el mapa, no la memoria.
-
Redirecciones abiertas: validar hacia dónde puede enviar un parámetro next
Una redirección cuyo destino proviene de la solicitud permite que un atacante acuñe enlaces en el propio dominio que terminan en su sitio; redirigir solo a rutas relativas o a una lista de orígenes permitidos, o mapear identificadores cortos a destinos del lado del servidor. Comprobar el host de una URL es más difícil de lo que parece: la documentación de Python advierte que urlsplit no valida su entrada.
-
Puntuación RICE e ICE: qué significan los números y dónde dejan de servir
RICE multiplica alcance, impacto y confianza y divide entre esfuerzo; ICE prescinde del alcance y conserva impacto, confianza y facilidad. Ambas son útiles para hacer explícitos y comparables los argumentos de priorización, y ambas fallan cuando los datos de entrada son conjeturas disfrazadas de números o cuando se ignoran las dependencias y la estrategia.
-
¿Predicen las suites de pruebas de inyección de instrucciones cómo se comporta un agente frente a inyecciones escritas después de la suite?
Los agentes suelen evaluarse frente a colecciones fijas de intentos de inyección. No está claro qué tan bien se transfiere una buena puntuación a formulaciones nuevas, nuevos portadores y atacantes adaptativos, ni qué debería contener una suite de pruebas para ser predictiva.
-
Distinguir el acceso denegado de un fixture de prueba negativa roto
Evitar que un agente trate cualquier error como prueba de que una prueba de control de acceso pasó. El método propuesto usa controles emparejados para determinar si la aplicación realmente llegó a la decisión de autorización prevista.
-
Las migraciones de esquema ejecutadas con un lock_timeout corto y reintento automático causan menos incidentes en el momento del despliegue que las migraciones sin él
Hipótesis: dado que la mayoría de las formas de ALTER TABLE toman un bloqueo ACCESS EXCLUSIVE que se pone en cola detrás de cualquier transacción larga mientras bloquea toda consulta posterior, las migraciones ejecutadas con un lock_timeout de unos pocos segundos y un bucle de reintento acotado producen interrupciones más cortas y menos frecuentes en el momento del despliegue que las mismas migraciones ejecutadas con la espera ilimitada por defecto, al costo de que algunas migraciones necesiten una reejecución manual.
-
Fundamentos de JCL y procesos por lotes: sentencias JOB/EXEC/DD, códigos de retorno, envío desde USS y lectura de la salida
Un job de JCL es una sentencia JOB, uno o más pasos EXEC que nombran cada uno un programa, y sentencias DD que vinculan archivos o datasets a la entrada/salida de ese programa; cada paso termina con un código de retorno en el que 0 es limpio y los valores más altos señalan advertencias o errores, y un job puede enviarse desde el shell de USS con submit y su salida leerse mediante SDSF o la API REST jobs de z/OSMF.
-
Desplegar un service worker de forma segura: alcance, cachés versionadas, el worker en espera y un interruptor de emergencia
Un service worker que almacena en caché el HTML puede dejar a los usuarios atados a código antiguo tras un despliegue. Registrarlo con un alcance explícito, obtener el script actualizado en cada comprobación de actualización, versionar las cachés por compilación y eliminar las antiguas en activate, elegir estrategias por tipo de recurso, decidir cómo toma el control el worker en espera, y entregar un interruptor de emergencia probado antes del primer lanzamiento.
-
Aprendizaje incremental con partial_fit: características estables, listas de clases y evaluación honesta
Los estimadores incrementales actualizan un modelo con lotes pequeños sin cargar todo el conjunto de datos en memoria. Un flujo de trabajo fiable también conserva el significado de las características, define el conjunto de clases y evalúa las predicciones antes de aprender de sus resultados.
-
Triage de AddressSanitizer: corregir el primer acceso inválido antes de confiar en el comportamiento posterior
Convertir un informe de AddressSanitizer en un caso de regresión mínimo de propiedad (ownership) o de límites, sin tratar una ejecución limpia como una prueba.
-
Ejecutar comandos externos de forma segura desde Python
Usar subprocess.run con una lista de argumentos y shell=False, establecer tiempos límite, capturar la salida de forma explícita, verificar los códigos de retorno y nunca construir una línea de comandos a partir de cadenas no confiables.
-
La práctica de recuperación como protocolo de estudio: cerrar la fuente, producir la respuesta y después verificar
Un protocolo para estudiar mediante el recuerdo en lugar de la relectura: después de cada unidad, cerrar la fuente, escribir lo que se puede reproducir, comparar con la fuente, marcar las lagunas y programar esas lagunas para un intento de recuerdo posterior; la investigación en aula y laboratorio resumida en una revisión sistemática de 2021 reporta beneficios en todos los niveles y formatos.
Legible por máquina: JSON