<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: lu1tr0n</title>
    <description>The latest articles on DEV Community by lu1tr0n (@lu1tr0n).</description>
    <link>https://dev.to/lu1tr0n</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F806044%2F070ecfe6-05a6-44e1-95e3-81211fc13ab4.png</url>
      <title>DEV Community: lu1tr0n</title>
      <link>https://dev.to/lu1tr0n</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lu1tr0n"/>
    <language>en</language>
    <item>
      <title>D2 libera TALA, su algoritmo de autolayout, bajo licencia MPL-2.0</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Tue, 08 Sep 2026 08:28:37 +0000</pubDate>
      <link>https://dev.to/lu1tr0n/d2-libera-tala-su-algoritmo-de-autolayout-bajo-licencia-mpl-20-4h</link>
      <guid>https://dev.to/lu1tr0n/d2-libera-tala-su-algoritmo-de-autolayout-bajo-licencia-mpl-20-4h</guid>
      <description>&lt;p&gt;Terrastruct acaba de liberar el código fuente de &lt;strong&gt;TALA&lt;/strong&gt;, el algoritmo de autolayout que usa D2 para acomodar diagramas de arquitectura sin que nadie mueva cajas a mano. Ahora corre bajo licencia MPL-2.0, la misma que D2, y ya viene incluido de fábrica desde la &lt;a href="https://d2lang.com" rel="noopener noreferrer"&gt;versión 0.9.0&lt;/a&gt; del lenguaje.&lt;/p&gt;

&lt;p&gt;Hasta ahora TALA era la pieza propietaria de un proyecto por lo demás abierto. Con este anuncio, D2 queda completamente open source de punta a punta: del parser al renderizado final.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;TALA (Terrastruct's AutoLayout Algorithm) es ahora open source bajo licencia MPL-2.0, la misma que D2.- Viene incluido en D2 desde la versión 0.9.0 y se activa con el flag --layout=tala.- Es un motor de layout ortogonal pensado para diagramas de arquitectura tipo pizarra, no para grafos DAG largos.- Permite fijar coordenadas top y left en nodos específicos y dejar el resto al motor automático (posicionamiento híbrido).- Usa 3 semillas aleatorias por defecto y elige el layout con mejor puntaje: mismo input y semillas producen el mismo diagrama.- El playground &lt;a href="https://play.d2lang.com" rel="noopener noreferrer"&gt;https://play.d2lang.com&lt;/a&gt; corre 100% en el navegador y permite probar TALA sin instalar nada.- El repositorio de benchmarks de rendimiento está publicado en github.com/d2lang/d2-benchmarks.- Gavin Nishizawa y Júlio César Batista lideraron buena parte del desarrollo, según el anuncio oficial de Terrastruct.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Introducción
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://d2lang.com" rel="noopener noreferrer"&gt;D2&lt;/a&gt; es un lenguaje de diagramación por texto: escribís unas líneas describiendo cajas y flechas, y D2 genera el SVG. La competencia directa es Mermaid, pero D2 se diferenció desde el principio por la calidad visual de sus layouts automáticos.&lt;/p&gt;

&lt;p&gt;Esa calidad venía en gran parte de &lt;strong&gt;TALA&lt;/strong&gt;, un motor de autolayout que Terrastruct desarrolló puertas adentro y mantuvo cerrado mientras el resto de D2 ya era MIT. Eso cambió esta semana.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué pasó
&lt;/h2&gt;

&lt;p&gt;Terrastruct publicó el código de TALA en el mismo repositorio de &lt;a href="https://github.com/terrastruct/d2" rel="noopener noreferrer"&gt;D2 en GitHub&lt;/a&gt;, bajo licencia &lt;a href="https://www.mozilla.org/en-US/MPL/2.0/" rel="noopener noreferrer"&gt;Mozilla Public License 2.0&lt;/a&gt;. Es la continuación de un anuncio previo donde la empresa ya había adelantado que esto venía.&lt;/p&gt;

&lt;p&gt;El repositorio explica que TALA combina ideas de varios papers de graph drawing (citados directamente en el código fuente) con técnicas propias para lograr diagramas más legibles. El objetivo declarado es optimizar varias métricas de "estética" a la vez: simetría, distancia mediana entre nodos conectados, dirección del flujo y agrupamiento de nodos similares.&lt;/p&gt;

&lt;p&gt;Terrastruct agradece explícitamente a Gavin Nishizawa por contribuciones amplias a TALA y a Júlio César Batista por su trabajo en los algoritmos de jerarquía. El proyecto pasa ahora a aceptar contribuciones externas de la comunidad de D2.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contexto e historia
&lt;/h2&gt;

&lt;p&gt;D2 ya incluía dos motores de layout desde el principio: &lt;strong&gt;Dagre&lt;/strong&gt; y &lt;strong&gt;ELK&lt;/strong&gt;, ambos basados en grafos dirigidos acíclicos (DAG). Funcionan bien para diagramas que crecen en una dirección: pipelines, flujos de datos, árboles de dependencias.&lt;/p&gt;

&lt;p&gt;El problema es que un diagrama de arquitectura de software real casi nunca crece en una sola dirección. Se parece más a lo que dibujarías en un pizarrón: cajas por todos lados, conexiones que cruzan en varios sentidos. Para ese caso, Terrastruct construyó TALA como motor de layout &lt;strong&gt;ortogonal&lt;/strong&gt;, diseñado desde cero pensando en software architecture diagrams.&lt;br&gt;
TALA prioriza simetría y clustering; Dagre y ELK priorizan dirección de flujo.&lt;br&gt;
Terrastruct probó TALA contra archivos D2 públicos tomados de GitHub, sin selección manual. La empresa aclara que en algunos casos el layout de Dagre o ELK puede seguir siendo preferible: no es que TALA gane siempre, es que ataca un problema distinto.&lt;/p&gt;
&lt;h2&gt;
  
  
  Detalles técnicos y rendimiento
&lt;/h2&gt;

&lt;p&gt;TALA no produce un único layout determinista por diagrama. Por defecto prueba &lt;strong&gt;3 semillas&lt;/strong&gt; aleatorias, genera un layout candidato por cada una, les asigna un puntaje según las métricas de estética mencionadas arriba, y se queda con el mejor. Mismo input y mismas semillas producen siempre el mismo resultado.&lt;/p&gt;

&lt;p&gt;El punto incómodo: agregar un solo nodo puede cambiar por completo la disposición del diagrama, porque las semillas exploran el espacio de soluciones de nuevo. Dagre y ELK, en cambio, tienden a mantener el layout previo y solo acomodar el nodo nuevo en su lugar.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Ojo:&lt;/strong&gt; si necesitás que un diagrama grande mantenga su forma estable a medida que le agregás nodos con el tiempo (por ejemplo, documentación que se actualiza seguido), Dagre o ELK son más predecibles que TALA.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Otra capacidad exclusiva de TALA es fijar la posición de nodos individuales con las claves &lt;code&gt;top&lt;/code&gt; y &lt;code&gt;left&lt;/code&gt;, dejando que el motor resuelva el resto (incluido el &lt;strong&gt;routing&lt;/strong&gt; de las conexiones). Terrastruct señala un uso concreto: modelos de IA generativa pueden ubicar cajas razonablemente bien en un plano 2D, pero fallan al trazar las líneas que las conectan sin que se crucen. TALA resuelve justo esa segunda parte.&lt;br&gt;
MotorCuándo usarloVentajaLimitaciónDagrePipelines, flujos CI/CD, grafos que crecen en una direcciónLayout estable al agregar nodos nuevosPoco control estético en diagramas no linealesELKJerarquías grandes con muchos niveles anidadosBuen manejo de subgrafos jerárquicosPrioriza dirección sobre estética tipo pizarraTALADiagramas de arquitectura con conexiones cruzadasOptimiza simetría, clustering y permite fijar coordenadasAleatoriedad entre ejecuciones; más lento en diagramas grandes&lt;br&gt;
Sobre rendimiento, Terrastruct es honesto: TALA &lt;strong&gt;escala de forma no lineal&lt;/strong&gt; y tarda más que Dagre o ELK en diagramas grandes. El benchmark de referencia está publicado en &lt;a href="https://github.com/d2lang/d2-benchmarks" rel="noopener noreferrer"&gt;github.com/d2lang/d2-benchmarks&lt;/a&gt;, donde cualquiera puede correr sus propias mediciones contra su hardware.&lt;/p&gt;
&lt;h2&gt;
  
  
  Cómo empezar
&lt;/h2&gt;

&lt;p&gt;TALA no se instala aparte: viene empaquetado dentro de D2 desde la versión 0.9.0. Basta con instalar D2 y pasar el flag correspondiente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# macOS (Homebrew)&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;d2

&lt;span class="c"&gt;# Linux&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://d2lang.com/install.sh | sh &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt;

&lt;span class="c"&gt;# Windows (con Scoop)&lt;/span&gt;
scoop &lt;span class="nb"&gt;install &lt;/span&gt;d2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con D2 instalado, un diagrama mínimo se ve así. Guardalo como &lt;code&gt;arquitectura.d2&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;frontend -&amp;gt; api_gateway: peticion HTTP
api_gateway -&amp;gt; auth_service: valida token
api_gateway -&amp;gt; orders_service: crea orden
orders_service -&amp;gt; database: INSERT
orders_service -&amp;gt; cache: invalida clave
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y para renderizarlo usando TALA en vez del motor por defecto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;d2 &lt;span class="nt"&gt;--layout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;tala arquitectura.d2 arquitectura.svg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este comando genera &lt;code&gt;arquitectura.svg&lt;/code&gt; con el layout ortogonal de TALA, en lugar del Dagre por defecto. Para el posicionamiento híbrido (algunos nodos fijos, el resto automático), D2 admite fijar coordenadas directamente en el nodo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;estacion_cyan: {
  top: 0
  left: 0
}
estacion_magenta: {
  top: 0
  left: 200
}
estacion_amarillo: {
  top: 0
  left: 400
}
estacion_negro: {
  top: 0
  left: 600
}
controlador_registro -&amp;gt; estacion_cyan
controlador_registro -&amp;gt; estacion_magenta
controlador_registro -&amp;gt; estacion_amarillo
controlador_registro -&amp;gt; estacion_negro
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fijar top y left en algunos nodos deja el routing en manos de TALA.&lt;br&gt;
Acá los cuatro nodos superiores quedan clavados en su fila, mientras que TALA calcula solo el trazado de las conexiones hacia el controlador. Es exactamente el patrón que Terrastruct describe para diagramas generados por agentes de IA.&lt;/p&gt;

&lt;p&gt;Para confirmar que tu instalación efectivamente usa TALA (y no cae de nuevo a Dagre por versión vieja), revisá la versión de D2 antes de renderizar:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;d2 &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="c"&gt;# debe reportar 0.9.0 o superior&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si el binario reporta una versión anterior a 0.9.0, el flag &lt;code&gt;--layout=tala&lt;/code&gt; no existe todavía y hay que actualizar D2 primero.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Tip:&lt;/strong&gt; si querés probar TALA sin instalar nada, el playground &lt;a href="https://play.d2lang.com" rel="noopener noreferrer"&gt;play.d2lang.com&lt;/a&gt; corre el compilador completo en el navegador, incluido TALA.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Impacto y análisis
&lt;/h2&gt;

&lt;p&gt;El cambio más relevante no es de licencia sino de mantenimiento: hasta ahora, cualquier bug o mejora en TALA dependía exclusivamente del equipo de Terrastruct. Con el código abierto, la comunidad de D2 puede enviar pull requests directamente sobre el motor de layout, algo que antes era imposible.&lt;/p&gt;

&lt;p&gt;También reduce el riesgo típico de las herramientas con núcleo propietario: si Terrastruct como empresa cambiara de rumbo, D2 ya no dependería de una pieza cerrada para su funcionalidad más distintiva. Es el mismo argumento que sostuvo la migración completa de proyectos como &lt;a href="https://developer.mozilla.org/en-US/docs/MDN/Writing_guidelines/Page_structures/" rel="noopener noreferrer"&gt;herramientas de código abierto&lt;/a&gt; en general: menos punto único de fallo organizacional.&lt;/p&gt;

&lt;p&gt;El caso de uso agéntico que menciona Terrastruct merece atención aparte. A medida que más equipos generan diagramas de arquitectura con asistentes de IA a partir de una descripción en texto, la parte difícil deja de ser "dónde poner cada caja" y pasa a ser "cómo trazar las conexiones sin que se crucen". TALA ataca justamente ese segundo problema, dejando la ubicación gruesa en manos del modelo y el routing fino en manos del algoritmo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué sigue
&lt;/h2&gt;

&lt;p&gt;Terrastruct dice esperar con interés las mejoras que la comunidad proponga ahora que el código es público, en particular sobre el manejo de diagramas grandes, donde el rendimiento no lineal de TALA sigue siendo su punto más débil frente a Dagre y ELK.&lt;/p&gt;

&lt;p&gt;No hay un roadmap con fechas públicas más allá de eso. La vía más directa para seguir el desarrollo es el propio repositorio de D2 en GitHub, donde TALA ahora vive junto al resto del compilador.&lt;/p&gt;

&lt;p&gt;📖 Resumen en Telegram: Ver resumen&lt;/p&gt;

&lt;p&gt;Probalo vos: instalá D2 con &lt;code&gt;brew install d2&lt;/code&gt; (o el script de Linux) y corré tu primer diagrama con &lt;code&gt;d2 --layout=tala&lt;/code&gt; para comparar el resultado contra Dagre.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Qué significa TALA?
&lt;/h3&gt;

&lt;p&gt;Son las siglas de Terrastruct's AutoLayout Algorithm, el motor de layout ortogonal que Terrastruct construyó para D2.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Necesito instalar TALA por separado?
&lt;/h3&gt;

&lt;p&gt;No. Viene incluido dentro de D2 desde la versión 0.9.0 y se activa con el flag &lt;code&gt;--layout=tala&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿TALA reemplaza a Dagre y ELK?
&lt;/h3&gt;

&lt;p&gt;No. D2 sigue soportando los tres motores. TALA conviene para diagramas de arquitectura con conexiones cruzadas; Dagre y ELK siguen siendo mejores para grafos que crecen en una sola dirección.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué el mismo diagrama se ve distinto cada vez que agrego un nodo?
&lt;/h3&gt;

&lt;p&gt;Porque TALA prueba 3 semillas aleatorias por defecto y elige la de mejor puntaje. Agregar un nodo cambia el espacio de búsqueda y puede producir un layout completamente distinto.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Sirve TALA para diagramas generados por IA?
&lt;/h3&gt;

&lt;p&gt;Sí, es uno de los casos de uso que Terrastruct destaca: un modelo puede ubicar nodos en coordenadas 2D y dejar que TALA resuelva el routing de las conexiones, tarea en la que los modelos suelen fallar.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Bajo qué licencia quedó TALA?
&lt;/h3&gt;

&lt;p&gt;MPL-2.0, la misma licencia que ya usaba el resto de D2.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://d2lang.com/blog/tala-is-open-source/" rel="noopener noreferrer"&gt;Anuncio oficial de Terrastruct&lt;/a&gt;: publicación original donde se confirma la apertura del código de TALA.- &lt;a href="https://github.com/terrastruct/d2" rel="noopener noreferrer"&gt;Repositorio de D2 en GitHub&lt;/a&gt;: código fuente completo del lenguaje y de TALA.- &lt;a href="https://github.com/d2lang/d2-benchmarks" rel="noopener noreferrer"&gt;d2-benchmarks&lt;/a&gt;: comparativas de rendimiento entre TALA, Dagre y ELK.- &lt;a href="https://play.d2lang.com" rel="noopener noreferrer"&gt;D2 Playground&lt;/a&gt;: entorno para probar D2 y TALA sin instalar nada, corre 100% en el navegador.- &lt;a href="https://www.mozilla.org/en-US/MPL/2.0/" rel="noopener noreferrer"&gt;Mozilla Public License 2.0&lt;/a&gt;: texto completo de la licencia bajo la que se liberó TALA.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📱 &lt;strong&gt;¿Te gusta este contenido?&lt;/strong&gt; Únete a nuestro canal de Telegram &lt;a href="https://t.me/programacion" rel="noopener noreferrer"&gt;@programacion&lt;/a&gt; donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>linux</category>
      <category>programming</category>
      <category>devops</category>
    </item>
    <item>
      <title>CADO-NFS factoriza una clave RSA de 512 bits de una CA de 1999</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Tue, 08 Sep 2026 02:30:31 +0000</pubDate>
      <link>https://dev.to/lu1tr0n/cado-nfs-factoriza-una-clave-rsa-de-512-bits-de-una-ca-de-1999-4e51</link>
      <guid>https://dev.to/lu1tr0n/cado-nfs-factoriza-una-clave-rsa-de-512-bits-de-una-ca-de-1999-4e51</guid>
      <description>&lt;p&gt;Un investigador reconstruyó en su propio escritorio la clave privada RSA de 512 bits de una autoridad certificadora real: una que Netscape 4.51 marcó como confiable para SSL en marzo de 1999. El hallazgo no pone en riesgo a nadie hoy, porque esa raíz expiró en 2003 y fue retirada de los navegadores en 2002.&lt;/p&gt;

&lt;p&gt;Pero el experimento pone números concretos sobre la mesa: cuántas horas de cómputo hacen falta hoy para romper lo que hace 25 años se consideraba seguro. La respuesta, en este caso, cabe en un fin de semana largo con un solo procesador de escritorio.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Matthew McPherrin factorizó dos claves RSA de 512 bits de la CA canadiense E-Certify, confiable en Netscape 4.51 desde marzo de 1999.- Usó CADO-NFS en un Ryzen 9 5950X: 32 horas para la clave "Gold Server" (SSL) y 29 horas para "Gold Client" (S/MIME).- La RSA-155, también de 512 bits, ya había sido factorizada en 1999, el mismo año en que Netscape emitió estas raíces.- Netscape retiró las raíces de E-Certify en 2002; el certificado expiró el 16 de octubre de 2003.- Internet Explorer nunca distribuyó raíces SSL de 512 bits, así que el experimento queda limitado a esa ventana de Netscape.- McPherrin publicó las claves privadas, los certificados y el código en GitHub, en mcpherrinm/ancientroots.- Para verificarlo montó un servidor TLS a medida en Go, publicado en e-certify.fly.dev, compatible solo con Netscape 4.51.- Las raíces se hallaron extrayendo certificados de instaladores históricos archivados, con ayuda de Claude Code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Qué pasó
&lt;/h2&gt;

&lt;p&gt;El 7 de septiembre de 2026, el desarrollador &lt;strong&gt;Matthew McPherrin&lt;/strong&gt; publicó en su blog personal el relato completo de cómo &lt;a href="https://mcpherrin.ca/2026/09/07/rsa.html" rel="noopener noreferrer"&gt;factorizó las claves RSA de una autoridad certificadora real de los años noventa&lt;/a&gt;. Todo empezó con una pregunta simple: ¿existe algún certificado raíz lo bastante débil como para romperlo con una computadora de escritorio actual?&lt;/p&gt;

&lt;p&gt;Para responderla, descargó los instaladores históricos de Netscape e Internet Explorer alojados en el Internet Archive y usó Claude Code para extraer de forma automática todas las raíces incluidas en cada versión, publicando el resultado en una página web filtrable. Buscando por tamaño de clave encontró el objetivo: en marzo de 1999, &lt;strong&gt;Netscape 4.51&lt;/strong&gt; distribuyó dos certificados raíz de 512 bits de la desaparecida autoridad canadiense &lt;strong&gt;E-Certify&lt;/strong&gt;, uno habilitado para SSL ("Gold Server") y otro para S/MIME ("Gold Client").&lt;/p&gt;

&lt;p&gt;Internet Explorer, en cambio, nunca llegó a incluir raíces de 512 bits para SSL, así que la ventana de este experimento quedó acotada a una etapa muy específica de Netscape entre 1999 y 2002.&lt;/p&gt;

&lt;p&gt;El siguiente diagrama resume el proceso completo, desde la extracción de las raíces archivadas hasta la carga de una página firmada por la clave reconstruida en el navegador original de 1999:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TD
A["Instaladores archivados de Netscape e IE"] --&amp;gt; B["Extraccion de raices con Claude Code"]
B --&amp;gt; C["Filtro: certificados RSA de 512 bits"]
C --&amp;gt; D["CADO-NFS factoriza el modulo"]
D --&amp;gt; E["Reconstruccion de la clave privada"]
E --&amp;gt; F["Emision de un certificado firmado"]
F --&amp;gt; G[("Servidor TLS a medida en Go")]
G --&amp;gt; H["Netscape 4.51 carga la pagina"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Contexto e historia
&lt;/h2&gt;

&lt;p&gt;La seguridad de RSA depende de que factorizar un número semiprimo grande sea computacionalmente costoso, pero qué tan grande debe ser esa clave cambia con el tiempo. En 1999, el mismo año en que Netscape emitía las raíces de E-Certify, un equipo internacional ya había factorizado &lt;a href="https://en.wikipedia.org/wiki/RSA_Factoring_Challenge" rel="noopener noreferrer"&gt;RSA-155&lt;/a&gt;, un semiprimo de 512 bits del RSA Factoring Challenge. Es decir: la clave que Netscape marcó como confiable para cifrar tráfico ya era, en teoría, insegura desde su nacimiento.&lt;/p&gt;

&lt;p&gt;El límite sigue subiendo con el tiempo. Hace apenas unos días, alguien completó la factorización de &lt;strong&gt;RSA-260&lt;/strong&gt;, un semiprimo de 862 bits y la mayor factorización pública conocida hasta ahora. El Web PKI, el sistema de confianza que usan los navegadores, dejó de aceptar claves RSA de 1024 bits hace más de una década. Hoy el estándar mínimo son 2048 bits, aunque ese tamaño también tiene fecha de vencimiento ante la eventual llegada de computadoras cuánticas capaces de correr el algoritmo de Shor.&lt;/p&gt;

&lt;p&gt;Ese contexto histórico importa para entender por qué existía siquiera una raíz de 512 bits en 1999: Netscape lanzó soporte para SSL en 1994, en plena era de &lt;strong&gt;restricciones de exportación de criptografía&lt;/strong&gt; impuestas por Estados Unidos, cuando la industria todavía no tenía estándares mínimos de tamaño de clave para autoridades certificadoras.&lt;br&gt;
En 1999, 512 bits ya no alcanzaba: RSA-155 cayó ese mismo año.&lt;/p&gt;
&lt;h2&gt;
  
  
  Detalles técnicos: cómo se factorizó la RSA de 512 bits
&lt;/h2&gt;

&lt;p&gt;Para reconstruir la clave privada a partir de la pública, McPherrin corrió &lt;a href="https://cado-nfs.gitlabpages.inria.fr/" rel="noopener noreferrer"&gt;CADO-NFS&lt;/a&gt;, una implementación open source de la criba general del cuerpo de números (GNFS), el algoritmo clásico para factorizar semiprimos grandes. El proceso consta de varias fases: selección de polinomio, criba, filtrado de relaciones, álgebra lineal y raíz cuadrada final. Para un módulo de 512 bits, la fase de criba es la que más tiempo consume en hardware de escritorio.&lt;/p&gt;

&lt;p&gt;El trabajo corrió en un &lt;strong&gt;Ryzen 9 5950X&lt;/strong&gt; de escritorio, sin clúster ni GPU: 32 horas para factorizar la clave "E-Certify RSA 512 Gold Server" y 29 horas para "E-Certify RSA 512 Gold Client". La siguiente tabla ubica ese resultado dentro de la escala histórica de factorizaciones RSA conocidas:&lt;br&gt;
ClaveTamañoEstadoTiempo o hitoRSA-155512 bitsFactorizada en 1999Esfuerzo distribuido internacionalE-Certify Gold Server512 bitsFactorizada en 202632 horas en un Ryzen 9 5950XE-Certify Gold Client512 bitsFactorizada en 202629 horas en un Ryzen 9 5950XRSA-260862 bitsFactorizada recientementeMayor factorización pública conocidaRSA de 1024 bits1024 bitsDeprecada por el Web PKISin factorización pública confirmadaRSA de 2048 bits2048 bitsEstándar mínimo actualVigente en certificados TLS modernos&lt;br&gt;
Un ejemplo simplificado de cómo se invoca CADO-NFS sobre un número compuesto (un semiprimo de juguete para ilustrar la sintaxis, no la clave real):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./cado-nfs.py 2087213345157128459857544877488990849241708931948717
&lt;span class="c"&gt;# la herramienta corre las fases de criba, filtrado y algebra lineal,&lt;/span&gt;
&lt;span class="c"&gt;# y al final imprime los dos factores primos encontrados&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con el módulo público del certificado real el comando es el mismo, pero el número tiene 512 bits: la diferencia está en el tiempo de cómputo, no en el algoritmo. Para confirmar que una clave privada reconstruida corresponde de verdad al certificado público, se compara el módulo de ambos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openssl x509 &lt;span class="nt"&gt;-noout&lt;/span&gt; &lt;span class="nt"&gt;-modulus&lt;/span&gt; &lt;span class="nt"&gt;-in&lt;/span&gt; e-certify-gold-server.pem | openssl md5
openssl rsa &lt;span class="nt"&gt;-noout&lt;/span&gt; &lt;span class="nt"&gt;-modulus&lt;/span&gt; &lt;span class="nt"&gt;-in&lt;/span&gt; e-certify-gold-server-key.pem | openssl md5
&lt;span class="c"&gt;# si los dos hashes coinciden, la clave privada es valida para ese certificado&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Cómo probarlo
&lt;/h2&gt;

&lt;p&gt;McPherrin publicó las claves privadas, los certificados originales y las herramientas usadas en el repositorio &lt;a href="https://github.com/mcpherrinm/ancientroots" rel="noopener noreferrer"&gt;github.com/mcpherrinm/ancientroots&lt;/a&gt;. Cualquiera con Netscape 4.51 corriendo en una máquina virtual con el reloj atrasado a antes de octubre de 2003 puede usarlas para emitir certificados y probarlos contra e-certify.fly.dev, un servidor TLS a medida escrito en Go que McPherrin tuvo que construir porque ningún stack TLS moderno comparte cifrados con ese navegador de 1999.&lt;/p&gt;

&lt;p&gt;Para instalar CADO-NFS y reproducir la parte de factorización en tu propia máquina, usando un número más chico salvo que tengas varios días libres de CPU:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Linux (Debian/Ubuntu)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;build-essential cmake libgmp-dev
git clone https://gitlab.inria.fr/cado-nfs/cado-nfs.git
&lt;span class="nb"&gt;cd &lt;/span&gt;cado-nfs &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# macOS (Homebrew)&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;cmake gmp
git clone https://gitlab.inria.fr/cado-nfs/cado-nfs.git
&lt;span class="nb"&gt;cd &lt;/span&gt;cado-nfs &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Windows (via WSL2; CADO-NFS no tiene build nativo para Windows)&lt;/span&gt;
wsl &lt;span class="nt"&gt;--install&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; Ubuntu
wsl
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;build-essential cmake libgmp-dev
git clone https://gitlab.inria.fr/cado-nfs/cado-nfs.git
&lt;span class="nb"&gt;cd &lt;/span&gt;cado-nfs &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Impacto y análisis
&lt;/h2&gt;

&lt;p&gt;El resultado no reabre ningún riesgo real: la raíz de E-Certify fue eliminada de Netscape en 2002 y el certificado expiró en 2003, así que ningún tráfico moderno depende de esa cadena de confianza. El valor del experimento está en otro lado: muestra, con horas y hardware concretos, la brecha entre lo que se consideraba seguro en 1999 y lo que exige hoy el Web PKI.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💭 Clave:&lt;/strong&gt; el mismo año en que Netscape emitía una raíz de 512 bits, RSA-155, también de 512 bits, ya había caído. La debilidad no era un secreto técnico oculto: era pública desde el primer día.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;El caso también ilustra cómo cambió la disponibilidad de herramientas de cómputo. En 1999, factorizar RSA-155 exigió un esfuerzo internacional distribuido entre varios grupos de investigación durante meses. En 2026, un desktop con un solo procesador Ryzen hizo el mismo trabajo, para una clave del mismo tamaño, en menos de un día y medio.&lt;br&gt;
Un Ryzen 9 5950X de escritorio bastó: sin clústeres ni GPU dedicada.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Ojo:&lt;/strong&gt; replicar pruebas con stacks TLS antiguos, como el servidor a medida para Netscape 4.51, debe hacerse siempre en entornos aislados, nunca contra tráfico de producción o usuarios reales.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para las autoridades certificadoras actuales, el mensaje de fondo es el mismo que exige hoy el CA/Browser Forum: el tamaño mínimo de clave no es una preferencia estética, es una fecha de vencimiento calculada según el poder de cómputo disponible en cada época.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué sigue
&lt;/h2&gt;

&lt;p&gt;Según el propio McPherrin, el margen para repetir este experimento es angosto: Internet Explorer nunca distribuyó raíces SSL de 512 bits, así que la ventana queda limitada a esa etapa muy específica de Netscape entre 1999 y 2002. El catálogo de raíces antiguas que generó con Claude Code queda disponible igualmente, para que otros investigadores sigan buscando casos similares en instaladores de esa época.&lt;/p&gt;

&lt;p&gt;En paralelo, la migración hacia criptografía poscuántica avanza por el mismo motivo que hizo caer a estas raíces de 512 bits: el poder de cómputo disponible solo crece. El NIST ya estandarizó &lt;a href="https://csrc.nist.gov/pubs/fips/203/final" rel="noopener noreferrer"&gt;ML-KEM (FIPS 203)&lt;/a&gt; como reemplazo de los esquemas de intercambio de claves basados en factorización y logaritmo discreto, anticipando el día en que una computadora cuántica suficientemente grande haga con RSA de 2048 bits lo que un Ryzen de escritorio ya hace hoy con 512 bits.&lt;/p&gt;

&lt;p&gt;📖 Resumen en Telegram: Ver resumen&lt;/p&gt;

&lt;p&gt;Probalo vos: cloná &lt;a href="https://github.com/mcpherrinm/ancientroots" rel="noopener noreferrer"&gt;mcpherrinm/ancientroots&lt;/a&gt; y corré &lt;code&gt;openssl x509 -noout -modulus&lt;/code&gt; sobre certificados viejos que tengas a mano para ver de qué tamaño de clave dependía tu propia navegación hace 25 años.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Este hallazgo pone en riesgo la navegación actual?
&lt;/h3&gt;

&lt;p&gt;No. La raíz de E-Certify fue retirada de Netscape en 2002 y el certificado expiró el 16 de octubre de 2003, así que ningún navegador moderno confía en ella.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuánto tardó la factorización?
&lt;/h3&gt;

&lt;p&gt;32 horas para la clave "Gold Server" y 29 horas para "Gold Client", ambas de 512 bits, corriendo CADO-NFS en un Ryzen 9 5950X de escritorio.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué es CADO-NFS?
&lt;/h3&gt;

&lt;p&gt;Es una implementación open source de la criba general del cuerpo de números (GNFS), el algoritmo estándar para factorizar semiprimos grandes como los módulos RSA.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué una clave de 512 bits ya era débil en 1999?
&lt;/h3&gt;

&lt;p&gt;Porque ese mismo año un equipo internacional factorizó RSA-155, otro semiprimo de 512 bits del RSA Factoring Challenge, demostrando en público que ese tamaño no alcanzaba.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Se puede reproducir el experimento?
&lt;/h3&gt;

&lt;p&gt;Sí. Las claves privadas, los certificados originales y las herramientas están publicados en el repositorio de GitHub de McPherrin, junto con el servidor TLS a medida para probarlos con Netscape 4.51.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué tamaño de clave RSA se considera seguro hoy?
&lt;/h3&gt;

&lt;p&gt;El mínimo aceptado por el Web PKI es de 2048 bits, aunque la migración hacia esquemas poscuánticos como ML-KEM ya está en marcha de cara al riesgo de las computadoras cuánticas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://mcpherrin.ca/2026/09/07/rsa.html" rel="noopener noreferrer"&gt;mcpherrin.ca&lt;/a&gt;: publicación original de Matthew McPherrin con el detalle completo del proceso de factorización.- &lt;a href="https://github.com/mcpherrinm/ancientroots" rel="noopener noreferrer"&gt;github.com/mcpherrinm/ancientroots&lt;/a&gt;: repositorio con las claves privadas, certificados y herramientas usadas.- &lt;a href="https://cado-nfs.gitlabpages.inria.fr/" rel="noopener noreferrer"&gt;cado-nfs.gitlabpages.inria.fr&lt;/a&gt;: página oficial del proyecto CADO-NFS, la herramienta de factorización usada.- &lt;a href="https://en.wikipedia.org/wiki/RSA_Factoring_Challenge" rel="noopener noreferrer"&gt;en.wikipedia.org/wiki/RSA_Factoring_Challenge&lt;/a&gt;: historial del RSA Factoring Challenge, incluyendo RSA-155.- &lt;a href="https://csrc.nist.gov/pubs/fips/203/final" rel="noopener noreferrer"&gt;csrc.nist.gov&lt;/a&gt;: estándar FIPS 203 (ML-KEM) del NIST para criptografía poscuántica.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📱 &lt;strong&gt;¿Te gusta este contenido?&lt;/strong&gt; Únete a nuestro canal de Telegram &lt;a href="https://t.me/programacion" rel="noopener noreferrer"&gt;@programacion&lt;/a&gt; donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.&lt;/p&gt;

</description>
      <category>technology</category>
      <category>science</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>BZip3 reduce el peso de BZip2 en 84% al comprimir código real</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Mon, 07 Sep 2026 20:25:17 +0000</pubDate>
      <link>https://dev.to/lu1tr0n/bzip3-reduce-el-peso-de-bzip2-en-84-al-comprimir-codigo-real-f7c</link>
      <guid>https://dev.to/lu1tr0n/bzip3-reduce-el-peso-de-bzip2-en-84-al-comprimir-codigo-real-f7c</guid>
      <description>&lt;p&gt;BZip3 acaba de demostrar que se puede comprimir el mismo archivo hasta un 84% más chico que con BZip2, sin tocar una sola línea del contenido original. El proyecto de código abierto, publicado en GitHub por el desarrollador iczelia, se presenta como el sucesor espiritual de BZip2: mismo objetivo general, pero con un motor completamente distinto por dentro.&lt;/p&gt;

&lt;p&gt;En un benchmark público con el código fuente completo de Perl 5, bzip3 pasó de un archivo de 3,44 GB comprimido con BZip2 a uno de apenas 546 MB. Es la clase de mejora que importa cuando administrás backups, repositorios de código o pipelines de CI que mueven gigabytes de texto todos los días.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;BZip3 es un compresor open source que se presenta como sucesor espiritual de BZip2, publicado en GitHub por iczelia.- Con Perl 5 completo, BZip3 -b511 comprimió el archivo a 546.456.978 bytes frente a 3.441.163.911 bytes de BZip2.- Eso equivale a un archivo casi 84% más chico que el de BZip2 con el mismo contenido de prueba.- LZMA (xz -9) llegó a 2.056.645.240 bytes: mejor que BZip2, pero muy por detrás de BZip3 -b511.- BZip3 descomprimió el corpus en 4min06s frente a 9min22s de BZip2 y 4min40s de xz, en un disco HDD.- Combinado con lrzip para deduplicación de largo alcance, BZip3 bajó el resultado final a apenas 60.672.608 bytes.- El motor usa BWT vía arrays de sufijos, RLE+LZ77 con modelado PPM y un codificador de entropía por mezcla de contexto.- El repositorio acumula 1.400 estrellas y 61 forks en GitHub, y ya se instala con brew install bzip3 en macOS.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Qué pasó
&lt;/h2&gt;

&lt;p&gt;El repositorio &lt;strong&gt;iczelia/bzip3&lt;/strong&gt; lleva tiempo publicado en GitHub, pero volvió a circular en comunidades de desarrolladores por sus números de compresión frente a herramientas clásicas como BZip2, LZMA (xz) y Zstandard. El autor documentó un benchmark propio: descargó cada versión de Perl 5 publicada en &lt;a href="https://www.cpan.org/src/5.0/" rel="noopener noreferrer"&gt;CPAN&lt;/a&gt;, las descomprimió y empaquetó todo en un único archivo .tar para comparar compresores en igualdad de condiciones.&lt;/p&gt;

&lt;p&gt;El resultado con BZip2 fue un archivo de 3.441.163.911 bytes. Con LZMA (xz -9) bajó a 2.056.645.240 bytes. Pero bzip3, corriendo con bloques de 511 MiB, lo redujo a 546.456.978 bytes: menos de un sexto del tamaño que ocupaba con BZip2.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contexto e historia
&lt;/h2&gt;

&lt;p&gt;BZip2 nació en 1996 y todavía se usa en distribuciones Linux, en el formato .tar.bz2 y en herramientas de compresión de vieja guardia. Su compresor se basa en la &lt;a href="https://en.wikipedia.org/wiki/Burrows%E2%80%93Wheeler_transform" rel="noopener noreferrer"&gt;transformada de Burrows-Wheeler&lt;/a&gt; combinada con codificación Huffman, un diseño eficaz para su época pero que no aprovecha las CPUs multinúcleo ni los avances en modelado de entropía de las últimas dos décadas. Podés repasar su historia completa en la &lt;a href="https://en.wikipedia.org/wiki/Bzip2" rel="noopener noreferrer"&gt;página de BZip2 en Wikipedia&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;bzip3 toma la misma idea central (BWT más agrupar símbolos similares antes de comprimir) pero cambia casi todo el resto del pipeline. En vez de Huffman, usa un codificador de entropía con mezcla de contexto de orden 0. En vez de un solo paso de reordenamiento, agrega una etapa de RLE combinada con emparejamiento de cadenas estilo LZ77 y modelado estilo PPM antes de entrar al codificador final.&lt;br&gt;
El repositorio acumula 1.400 estrellas y 61 forks en GitHub.&lt;br&gt;
El proyecto declara soporte probado en &lt;strong&gt;diez arquitecturas&lt;/strong&gt; distintas: x86, x86_64, armv6, armv7, aarch64, ppc64le, mips, mips64, sparc y s390x. Esa cobertura es poco común para un proyecto de compresión relativamente joven y sugiere que ya corrió en hardware embebido, servidores ARM y máquinas legacy por igual.&lt;/p&gt;
&lt;h2&gt;
  
  
  Detalles técnicos de BZip3 y su rendimiento
&lt;/h2&gt;

&lt;p&gt;La tabla siguiente resume el benchmark contra sus principales alternativas, comprimiendo el mismo archivo .tar con el historial completo de Perl 5:&lt;br&gt;
MétodoTamaño comprimidoTiempo total de compresiónLZMA (xz -9, 16 hilos)2.056.645.240 bytes12min 09sBZip2 -93.441.163.911 bytes17min 16sBZip3 -b 256 (12 hilos)1.001.957.587 bytes7min 10sBZip3 -b 511 (4 hilos)546.456.978 bytes7min 08sZstandard -16 (12 hilos)3.076.143.660 bytes6min 35s&lt;br&gt;
Con bloques de apenas 256 MiB, bzip3 ya comprime a menos de un tercio del tamaño de BZip2, en la mitad de tiempo. Subir el bloque a 511 MiB reduce el tamaño final casi a la sexta parte del de BZip2, aunque exige más memoria: el proceso con &lt;code&gt;-b 256 -j 12&lt;/code&gt; llegó a usar 18.301 MiB de RAM durante la compresión, y con &lt;code&gt;-b 511 -j 4&lt;/code&gt; el pico bajó a 12.178 MiB.&lt;/p&gt;

&lt;p&gt;En descompresión, medida aparte sobre un disco mecánico WD Blue, bzip3 en modo paralelo tardó 4min 06s: más rápido que BZip2 (9min 22s) y que LZMA (4min 40s), y casi a la par de Zstandard (3min 51s).&lt;br&gt;
De 3,44 GB con BZip2 a 546 MB con BZip3: el mismo contenido, un sexto del peso.&lt;br&gt;
El pipeline interno de bzip3 encadena tres etapas antes de escribir el archivo final:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TD
A["Datos de entrada"] --&amp;gt; B["BWT via arrays de sufijos"]
B --&amp;gt; C["RLE + LZ77 con modelado PPM"]
C --&amp;gt; D["Codificador de entropia (mezcla de contexto orden 0)"]
D --&amp;gt; E["Archivo .bz3"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El rendimiento real depende mucho del compilador. Según la documentación del &lt;a href="https://github.com/iczelia/bzip3" rel="noopener noreferrer"&gt;repositorio oficial de bzip3&lt;/a&gt;, los builds de Linux x64 compilados con Clang 13 alcanzan hasta 17 MiB/s de compresión y 23 MiB/s de descompresión por hilo. Los builds de Windows y de 32 bits suelen rendir bastante menos.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Tip:&lt;/strong&gt; el flag &lt;code&gt;-j&lt;/code&gt; controla cuántos hilos usa bzip3. Con bloques grandes (&lt;code&gt;-b 511&lt;/code&gt;) necesitás menos hilos para saturar la CPU porque cada bloque ya es una unidad de trabajo grande; con bloques chicos conviene subir &lt;code&gt;-j&lt;/code&gt; para paralelizar más.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Cómo empezar con BZip3
&lt;/h2&gt;

&lt;p&gt;Instalar bzip3 no requiere pasos raros: es un proyecto con autotools y CMake, y ya llegó a los gestores de paquetes más comunes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Linux &lt;span class="o"&gt;(&lt;/span&gt;compilar desde un clon del repositorio con git&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;./bootstrap.sh
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;./configure
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;make
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;make &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;macOS &lt;span class="o"&gt;(&lt;/span&gt;via Homebrew&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;bzip3
&lt;span class="go"&gt;
&lt;/span&gt;&lt;span class="gp"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Windows &lt;span class="o"&gt;(&lt;/span&gt;via CMake, con Visual Studio o MinGW/MSYS2 instalado&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;cmake &lt;span class="nt"&gt;-B&lt;/span&gt; build &lt;span class="nt"&gt;-S&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-DCMAKE_BUILD_TYPE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Release
&lt;span class="gp"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;cmake &lt;span class="nt"&gt;--build&lt;/span&gt; build &lt;span class="nt"&gt;--config&lt;/span&gt; Release
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En Linux, si instalaste desde un paquete de código fuente (no un &lt;code&gt;git clone&lt;/code&gt;), podés saltarte el paso de &lt;code&gt;./bootstrap.sh&lt;/code&gt;. En Windows y en builds de 32 bits, el propio proyecto advierte que el rendimiento suele ser considerablemente menor que en Linux x64.&lt;/p&gt;

&lt;p&gt;Una vez instalado, comprimir y descomprimir un archivo real se ve así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Comprimir con bloques de 256 MiB y 12 hilos en paralelo&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;bzip3 &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nt"&gt;-b&lt;/span&gt; 256 &lt;span class="nt"&gt;-j&lt;/span&gt; 12 backup.tar

&lt;span class="c"&gt;# Descomprimir el resultado&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;bunzip3 backup.tar.bz3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El flag &lt;code&gt;-e&lt;/code&gt; fuerza el modo de compresión explícito, &lt;code&gt;-b&lt;/code&gt; fija el tamaño de bloque en MiB y &lt;code&gt;-j&lt;/code&gt; el número de hilos. Para confirmar que la instalación quedó bien, corré &lt;code&gt;bzip3 --help&lt;/code&gt;: tiene que listar esas opciones junto con &lt;code&gt;-d&lt;/code&gt; para descompresión manual.&lt;/p&gt;

&lt;h2&gt;
  
  
  Impacto y análisis
&lt;/h2&gt;

&lt;p&gt;El caso de uso donde bzip3 más se nota es texto y código fuente: repositorios git empaquetados, logs, datasets en CSV o JSON, y árboles de código como el benchmark de Perl 5. El propio README lo dice sin vueltas: bzip3, igual que su antecesor, "excels at compressing text or code". Para binarios ya comprimidos (imágenes JPEG, videos, archivos ZIP anidados) la ventaja se reduce, porque ahí ningún compresor de propósito general saca mucho jugo.&lt;/p&gt;

&lt;p&gt;El combo con lrzip es interesante para archivos gigantes con mucha redundancia de largo alcance: lrzip hace la deduplicación entre partes distantes del archivo, y bzip3 comprime lo que queda. En el benchmark, esa combinación bajó el .tar.lrz de Perl 5 a 60.672.608 bytes, contra 64.774.202 bytes de lrzip+lzma y 75.685.065 bytes de lrzip+bzip2.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Ojo:&lt;/strong&gt; el propio proyecto advierte que ningún compresor puede garantizar al 100% que un archivo comprimido se pueda recuperar siempre. Antes de usar bzip3 para backups críticos, probá el ciclo completo de comprimir y descomprimir con datos de prueba y verificá el resultado.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;La contrapartida de bzip3 es la memoria. Bloques grandes implican mantener varios cientos de megabytes por hilo activo en RAM durante la compresión, algo que Zstandard evita por diseño (687 MiB de pico en el mismo benchmark, contra más de 12 GB de bzip3 con bloques grandes). Para servidores con poca RAM o contenedores con límites estrictos, bzip3 con bloques chicos (&lt;code&gt;-b 256&lt;/code&gt; o menos) es la opción más razonable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué sigue
&lt;/h2&gt;

&lt;p&gt;El repositorio sigue activo, con 456 commits acumulados y soporte oficial ya empaquetado para macOS vía Homebrew. El README remite a comparativas adicionales contra Turbo-Range-Coder y BSC dentro del propio repositorio, lo que sugiere que el proyecto se sigue midiendo activamente contra el estado del arte en compresión sin pérdida.&lt;/p&gt;

&lt;p&gt;Para equipos que hoy dependen de &lt;code&gt;.tar.bz2&lt;/code&gt; en pipelines de CI o de distribución de paquetes, el próximo paso lógico es correr el propio dataset (no el de Perl 5) contra bzip3 con distintos tamaños de bloque, y comparar tamaño final, tiempo de compresión y memoria pico antes de migrar cualquier proceso de producción.&lt;/p&gt;

&lt;p&gt;📖 Resumen en Telegram: Ver resumen&lt;/p&gt;

&lt;p&gt;Probalo vos: cloná el repositorio de &lt;a href="https://github.com/iczelia/bzip3" rel="noopener noreferrer"&gt;bzip3 en GitHub&lt;/a&gt; y corré bzip3 -e -b 256 -j 4 sobre tu propio repositorio de código para comparar el tamaño final contra el .tar.gz que ya usás.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿BZip3 es compatible con archivos .bz2 de BZip2?
&lt;/h3&gt;

&lt;p&gt;No. bzip3 usa un formato de contenedor propio (extensión .bz3) y un pipeline de compresión distinto. Para abrir un .bz2 necesitás bzip2 o una herramienta que lo soporte explícitamente; bzip3 no lee ese formato.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuánta memoria necesita BZip3 para comprimir?
&lt;/h3&gt;

&lt;p&gt;Depende del tamaño de bloque. En el benchmark de Perl 5, correr bzip3 con &lt;code&gt;-b 256 -j 12&lt;/code&gt; llegó a usar 18.301 MiB de RAM; con &lt;code&gt;-b 511 -j 4&lt;/code&gt; el pico bajó a 12.178 MiB. Bloques más chicos consumen bastante menos memoria.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿BZip3 corre en Windows?
&lt;/h3&gt;

&lt;p&gt;Sí, mediante CMake con Visual Studio o MinGW/MSYS2, aunque el propio proyecto advierte que los builds de Windows y de 32 bits suelen rendir considerablemente menos que Linux x64 con Clang.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿En qué arquitecturas está probado BZip3?
&lt;/h3&gt;

&lt;p&gt;El README lista x86, x86_64, armv6, armv7, aarch64, ppc64le, mips, mips64, sparc y s390x como plataformas ya verificadas.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿BZip3 sirve para comprimir imágenes o video?
&lt;/h3&gt;

&lt;p&gt;No es su punto fuerte. bzip3 está optimizado para texto y código fuente; archivos binarios ya comprimidos (JPEG, MP4, ZIP) no se benefician tanto de su pipeline de BWT y modelado de contexto.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Es seguro usar BZip3 para backups sin probarlo antes?
&lt;/h3&gt;

&lt;p&gt;El propio proyecto no lo recomienda: el disclaimer del README pide no comprimir datos críticos sin aceptar la posibilidad, aunque sea baja, de que el archivo no se pueda recuperar. Probar el ciclo completo de comprimir y descomprimir antes de confiar en él para producción es la práctica sensata.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/iczelia/bzip3" rel="noopener noreferrer"&gt;iczelia/bzip3 en GitHub&lt;/a&gt;: repositorio oficial, código fuente y benchmarks completos.- &lt;a href="https://www.cpan.org/src/5.0/" rel="noopener noreferrer"&gt;Archivo de versiones de Perl 5 en CPAN&lt;/a&gt;: el dataset usado en el benchmark de compresión.- &lt;a href="https://en.wikipedia.org/wiki/Burrows%E2%80%93Wheeler_transform" rel="noopener noreferrer"&gt;Transformada de Burrows-Wheeler en Wikipedia&lt;/a&gt;: contexto sobre el algoritmo que comparten BZip2 y BZip3.- &lt;a href="https://en.wikipedia.org/wiki/Bzip2" rel="noopener noreferrer"&gt;BZip2 en Wikipedia&lt;/a&gt;: historia y contexto del compresor predecesor.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📱 &lt;strong&gt;¿Te gusta este contenido?&lt;/strong&gt; Únete a nuestro canal de Telegram &lt;a href="https://t.me/programacion" rel="noopener noreferrer"&gt;@programacion&lt;/a&gt; donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.&lt;/p&gt;

</description>
      <category>technology</category>
      <category>science</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>SeoulTech crea un framework para probar la robustez de la visión por IA</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Mon, 07 Sep 2026 16:17:27 +0000</pubDate>
      <link>https://dev.to/lu1tr0n/seoultech-crea-un-framework-para-probar-la-robustez-de-la-vision-por-ia-4j29</link>
      <guid>https://dev.to/lu1tr0n/seoultech-crea-un-framework-para-probar-la-robustez-de-la-vision-por-ia-4j29</guid>
      <description>&lt;p&gt;SeoulTech, la Universidad Nacional de Ciencia y Tecnología de Seúl, presentó un framework pensado para exponer el momento exacto en que un sistema de visión por inteligencia artificial deja de reconocer lo que debería reconocer. La herramienta mide y busca mejorar la &lt;strong&gt;robustez de visión IA&lt;/strong&gt; frente a ruido, desenfoque, compresión y perturbaciones calculadas para engañar al modelo.&lt;/p&gt;

&lt;p&gt;El reporte, publicado por &lt;a href="https://www.tmcnet.com/usubmit/2026/08/31/10437524.htm" rel="noopener noreferrer"&gt;TMCnet&lt;/a&gt;, llega en un momento en que cámaras de seguridad, sistemas de asistencia a la conducción y equipos de diagnóstico médico dependen cada vez más de redes neuronales entrenadas con imágenes limpias que rara vez reflejan las condiciones reales de uso.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;SeoulTech (Universidad Nacional de Ciencia y Tecnología de Seúl) presentó un framework para medir la robustez de visión IA.- El framework aplica perturbaciones adversariales y corrupciones naturales (ruido, niebla, compresión) a las imágenes de prueba.- Mide la caída de precisión del modelo frente a esas alteraciones y retroalimenta el reentrenamiento.- Se apoya en la misma línea que popularizó FGSM (Goodfellow, 2014) y el benchmark ImageNet-C (Hendrycks, 2019).- Herramientas abiertas como RobustBench y torchattacks permiten reproducir pruebas similares hoy mismo.- La robustez es cada vez más un requisito regulatorio para sistemas de IA de alto riesgo, no solo una métrica académica.- El principal trade-off: mejorar la robustez adversarial suele bajar algo la precisión en datos limpios.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Qué pasó
&lt;/h2&gt;

&lt;p&gt;Según la cobertura de TMCnet, el equipo de SeoulTech construyó un framework de evaluación que somete modelos de visión por computadora a un conjunto de pruebas automatizadas antes de que salgan a producción. La idea central no es nueva: viene de una línea de investigación que arrancó hace más de una década, pero SeoulTech la empaqueta como un proceso repetible que un equipo de ingeniería puede correr contra su propio modelo, de forma parecida a un pipeline de integración continua que corre pruebas unitarias antes de un deploy.&lt;/p&gt;

&lt;p&gt;El framework combina dos familias de pruebas. La primera aplica perturbaciones adversariales: ruido matemáticamente diseñado, casi imperceptible para un ojo humano, que aprovecha el gradiente del propio modelo para maximizar el error de clasificación. La segunda aplica corrupciones naturales: niebla, lluvia, desenfoque de movimiento, compresión JPEG agresiva, condiciones que una cámara real puede encontrar sin que nadie la esté atacando. Un modelo puede rendir bien en ambas pruebas, en una sola o en ninguna, y esa combinación define su robustez de visión IA en la práctica.&lt;/p&gt;

&lt;p&gt;Lo que hace útil a un framework de este tipo no es solo detectar la falla, sino alimentar ese resultado de vuelta al entrenamiento: las imágenes que rompen al modelo se usan para generar ejemplos de aumento de datos o para un régimen de entrenamiento adversarial, cerrando parcialmente la brecha entre precisión de laboratorio y precisión en el mundo real.&lt;br&gt;
Una perturbación casi invisible puede cambiar por completo la predicción de un modelo.&lt;/p&gt;
&lt;h2&gt;
  
  
  Contexto e historia
&lt;/h2&gt;

&lt;p&gt;El punto de partida de este campo suele fijarse en 2014, cuando Ian Goodfellow y sus coautores publicaron el &lt;a href="https://arxiv.org/abs/1412.6572" rel="noopener noreferrer"&gt;método FGSM (Fast Gradient Sign Method)&lt;/a&gt;, que demostró que sumar un ruido casi invisible a una imagen podía hacer que una red neuronal de última generación la clasificara con total confianza como algo completamente distinto. Esa fragilidad, contraintuitiva para un sistema que superaba a los humanos en precisión bruta, abrió una subdisciplina completa dentro del aprendizaje automático.&lt;/p&gt;

&lt;p&gt;En 2019, Dan Hendrycks y Thomas Dietterich publicaron &lt;a href="https://arxiv.org/abs/1903.12261" rel="noopener noreferrer"&gt;ImageNet-C&lt;/a&gt;, un benchmark que en vez de atacar al modelo con matemática adversarial lo somete a quince tipos de corrupción cotidiana (ruido gaussiano, pixelado, niebla, cambios de brillo, entre otras) en cinco niveles de severidad. La conclusión del paper fue incómoda: modelos que ya superaban a los humanos en ImageNet limpio se desplomaban frente a corrupciones que un humano ni siquiera nota. Ese hallazgo es, en esencia, el problema que un framework como el de SeoulTech intenta resolver de forma sistemática.&lt;/p&gt;

&lt;p&gt;Desde entonces se sumaron esfuerzos como &lt;a href="https://robustbench.github.io/" rel="noopener noreferrer"&gt;RobustBench&lt;/a&gt;, un leaderboard académico que compara decenas de modelos bajo ataques y corrupciones estandarizadas, y programas como GARD (Guaranteeing AI Robustness against Deception) de DARPA en Estados Unidos, enfocados en certificar matemáticamente los límites de robustez de un modelo, no solo medirla empíricamente.&lt;/p&gt;
&lt;h2&gt;
  
  
  Detalles técnicos: cómo se mide la robustez de visión IA
&lt;/h2&gt;

&lt;p&gt;La métrica central de cualquier evaluación de este tipo es la precisión robusta: el porcentaje de imágenes que el modelo sigue clasificando correctamente después de aplicarle una perturbación o corrupción, en contraste con la precisión limpia (clean accuracy) medida sobre el dataset original sin alterar. La diferencia entre ambas cifras expone qué tan frágil es un modelo en la práctica.&lt;br&gt;
Tipo de pruebaEjemploCuándo usarlaLimitaciónPerturbación adversarial (FGSM, PGD)Ruido calculado con el gradiente del modeloEvaluar riesgo ante un atacante dirigidoCasi siempre requiere acceso white-box al modeloCorrupción natural (ImageNet-C)Niebla, desenfoque de movimiento, compresión JPEGEvaluar robustez ante condiciones reales de cámara o climaNo representa un atacante maliciosoCambio de distribución (domain shift)Imágenes de otra cámara, país o datasetEvaluar generalización fuera del set de entrenamientoDifícil de resumir en una sola métrica&lt;br&gt;
Un dato que suele sorprender a quien no trabaja en el área: no hace falta acceso físico a la cámara ni al pipeline de producción para atacar un modelo. Basta con conocer su arquitectura, o incluso solo su salida en ataques black-box, para generar perturbaciones que funcionan de forma consistente contra la misma familia de redes.&lt;/p&gt;

&lt;p&gt;Un pipeline típico de este tipo de framework sigue un ciclo simple: generar la perturbación, medir la caída de precisión y, si el resultado es malo, retroalimentar el entrenamiento.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TD
A["Imagen original"] --&amp;gt; B["Generador de perturbaciones"]
B --&amp;gt; C["Modelo de vision"]
C --&amp;gt; D["Medir precision robusta"]
D --&amp;gt; E{"Cae la precision?"}
E --&amp;gt;|"Si"| F["Reentrenar con aumentos"]
E --&amp;gt;|"No"| G["Modelo aprobado"]
F --&amp;gt; C
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Cómo empezar a probarlo
&lt;/h2&gt;

&lt;p&gt;No hace falta esperar a que SeoulTech publique su framework para empezar a medir la robustez de visión IA de un modelo propio. La comunidad de código abierto ya construyó las piezas necesarias, y correr una primera prueba toma minutos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;torch torchvision torchattacks robustbench
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con eso instalado, el flujo mínimo es cargar un modelo preentrenado, aplicarle un ataque conocido y comparar la precisión antes y después.&lt;br&gt;
Un ataque FGSM contra ResNet18 corre en menos de diez líneas de código.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torch&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;torchvision.models&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;torchattacks&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FGSM&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;resnet18&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;weights&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;IMAGENET1K_V1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;atk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FGSM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;eps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;adv_images&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;atk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;images&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;outputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;adv_images&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;robust_acc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;outputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;argmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Precision robusta: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;robust_acc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;item&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El parámetro &lt;code&gt;eps&lt;/code&gt; controla cuánto se le permite mover el ruido a cada píxel: valores bajos generan perturbaciones casi invisibles, valores altos son más fáciles de detectar a simple vista pero también más fáciles de bloquear con filtros simples. Para corrupciones naturales en vez de ataques dirigidos, la librería &lt;code&gt;imagecorruptions&lt;/code&gt; replica los quince tipos definidos en ImageNet-C sin necesidad de acceso al modelo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Tip:&lt;/strong&gt; El parámetro &lt;code&gt;eps&lt;/code&gt; en FGSM o PGD suele probarse en un rango de 2/255 a 16/255. Cuanto más alto, más fácil engañar al modelo, pero menos realista es la perturbación.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Impacto y análisis
&lt;/h2&gt;

&lt;p&gt;La robustez de visión IA dejó de ser un tema exclusivamente académico. Un sistema de frenado automático que falla al reconocer una señal de alto parcialmente cubierta de nieve, o una cámara de control de acceso que un atacante engaña con un patrón impreso en una gorra, son el mismo problema que documentan estos benchmarks, solo que con consecuencias físicas.&lt;/p&gt;

&lt;p&gt;Por eso frameworks de este tipo se están volviendo parte del proceso de desarrollo, no un experimento aparte: correrlos antes de cada despliegue permite detectar regresiones de robustez de la misma forma en que un test de integración detecta una regresión funcional.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Ojo:&lt;/strong&gt; Entrenar un modelo para resistir ataques adversariales casi siempre reduce algo de precisión sobre datos limpios. No existe robustez gratis: es un trade-off que hay que medir, no asumir.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;El costo no es solo de cómputo. El entrenamiento adversarial, la técnica más usada para cerrar la brecha entre precisión limpia y precisión robusta, puede multiplicar el tiempo de entrenamiento porque cada lote de datos requiere generar primero sus versiones atacadas antes de actualizar los pesos del modelo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué sigue
&lt;/h2&gt;

&lt;p&gt;La tendencia regulatoria apunta a que estas pruebas dejen de ser opcionales. Marcos como el de la Unión Europea para sistemas de inteligencia artificial de alto riesgo ya incluyen requisitos de exactitud, robustez y ciberseguridad como condición para operar en sectores sensibles, lo que empuja a que evaluaciones como la de SeoulTech pasen de ser un paper académico a un paso obligatorio antes de un lanzamiento.&lt;/p&gt;

&lt;p&gt;A nivel técnico, el área avanza hacia certificación formal: en vez de solo probar contra un puñado de ataques conocidos, las técnicas de robustez certificada intentan demostrar matemáticamente que ningún ataque dentro de un radio determinado puede cambiar la predicción del modelo. Es un estándar mucho más alto que superar un benchmark, y todavía es costoso de aplicar a modelos grandes.&lt;/p&gt;

&lt;p&gt;📖 Resumen en Telegram: Ver resumen&lt;/p&gt;

&lt;p&gt;Probalo vos: instalá &lt;code&gt;torchattacks&lt;/code&gt; y corré un ataque FGSM contra tu propio modelo de visión antes de tu próximo deploy para ver cuánto cae realmente su precisión.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Qué es la robustez de visión IA?
&lt;/h3&gt;

&lt;p&gt;Es la capacidad de un modelo de visión por computadora de mantener su precisión cuando la imagen de entrada cambia levemente, ya sea por ruido natural (niebla, compresión) o por una perturbación diseñada a propósito para engañarlo.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Un ataque adversarial y una corrupción natural son lo mismo?
&lt;/h3&gt;

&lt;p&gt;No. Un ataque adversarial usa el gradiente del modelo para calcular el ruido más dañino posible; una corrupción natural simula condiciones reales de cámara o clima sin intención maliciosa. Ambas pueden bajar la precisión, pero se miden y se corrigen distinto.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puedo evaluar la robustez de mi propio modelo hoy mismo?
&lt;/h3&gt;

&lt;p&gt;Sí. Librerías abiertas como RobustBench y torchattacks permiten correr ataques FGSM o PGD contra cualquier modelo de torchvision en pocas líneas de código, como se muestra en la sección Cómo empezar a probarlo de este artículo.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Mejorar la robustez adversarial afecta la precisión normal?
&lt;/h3&gt;

&lt;p&gt;Casi siempre sí, en algún grado. El entrenamiento adversarial suele reducir un poco la precisión sobre datos limpios a cambio de reducir mucho más la caída de precisión frente a ataques o corrupciones.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Dónde se aplica esto fuera del laboratorio?
&lt;/h3&gt;

&lt;p&gt;En sistemas donde una falla de visión tiene consecuencias físicas o de seguridad: asistencia a la conducción, control de acceso por cámara, inspección industrial y diagnóstico por imagen médica.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.tmcnet.com/usubmit/2026/08/31/10437524.htm" rel="noopener noreferrer"&gt;TMCnet&lt;/a&gt;: reporte sobre el framework de SeoulTech para robustez de visión por IA.- &lt;a href="https://arxiv.org/abs/1412.6572" rel="noopener noreferrer"&gt;arXiv: Explaining and Harnessing Adversarial Examples&lt;/a&gt;: el paper de Goodfellow et al. que introdujo FGSM en 2014.- &lt;a href="https://arxiv.org/abs/1903.12261" rel="noopener noreferrer"&gt;arXiv: Benchmarking Neural Network Robustness to Common Corruptions and Perturbations&lt;/a&gt;: el paper que presentó ImageNet-C.- &lt;a href="https://robustbench.github.io/" rel="noopener noreferrer"&gt;RobustBench&lt;/a&gt;: leaderboard abierto que compara modelos bajo ataques y corrupciones estandarizadas.- &lt;a href="https://en.wikipedia.org/wiki/Adversarial_machine_learning" rel="noopener noreferrer"&gt;Wikipedia: Adversarial machine learning&lt;/a&gt;: panorama general del campo y sus técnicas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📱 &lt;strong&gt;¿Te gusta este contenido?&lt;/strong&gt; Únete a nuestro canal de Telegram &lt;a href="https://t.me/programacion" rel="noopener noreferrer"&gt;@programacion&lt;/a&gt; donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>El 80% de los smartphones en la UE no cumple las reglas de reparabilidad</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Mon, 07 Sep 2026 14:29:31 +0000</pubDate>
      <link>https://dev.to/lu1tr0n/el-80-de-los-smartphones-en-la-ue-no-cumple-las-reglas-de-reparabilidad-448g</link>
      <guid>https://dev.to/lu1tr0n/el-80-de-los-smartphones-en-la-ue-no-cumple-las-reglas-de-reparabilidad-448g</guid>
      <description>&lt;p&gt;Más del 80% de los smartphones y tablets que llegan al mercado europeo todavía no publican la información que exige la &lt;a href="https://www.theregister.com/personal-tech/2026/09/07/smartphone-makers-dont-bother-to-comply-with-eu-repairability-requirements/5294532" rel="noopener noreferrer"&gt;ley de reparabilidad de smartphones&lt;/a&gt;, vigente hace exactamente un año. Lo confirmó Right to Repair Europe el 7 de septiembre de 2026, después de revisar el registro oficial donde cada fabricante declara su propio puntaje.&lt;/p&gt;

&lt;p&gt;El hallazgo importa porque la norma se apoya en la palabra del fabricante: nadie más audita el dato antes de que el celular llegue a la góndola.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Más del 80% de los smartphones y tablets en la UE no publica su información de reparación obligatoria.- La norma exige un puntaje de reparabilidad autodeclarado y un enlace de repuestos desde junio de 2025.- De 2.334 registros de celulares en el EPREL, solo el 18% enlaza a una página real con repuestos o manuales.- Cerca del 50% de los registros deja en blanco el campo de URL de reparación.- Otro 19% remite a una página de soporte genérica, sin repuestos ni instrucciones.- Algunos registros mandan al comprador a buscar repuestos en Temu o AliExpress.- Fabricantes que incumplen igual se autoasignan la calificación máxima, clase A, en reparabilidad.- Desde febrero de 2027 los celulares nuevos deberán traer batería reemplazable por el usuario.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Qué pasó
&lt;/h2&gt;

&lt;p&gt;Right to Repair Europe, la coalición que agrupa a organizaciones como iFixit en su rama europea, revisó el &lt;a href="https://eprel.ec.europa.eu/" rel="noopener noreferrer"&gt;European Product Registry for Energy Labelling (EPREL)&lt;/a&gt;, la base pública donde la Comisión Europea obliga a registrar cada modelo de celular y tablet que se vende en el bloque. &lt;a href="https://www.theregister.com/personal-tech/2026/09/07/smartphone-makers-dont-bother-to-comply-with-eu-repairability-requirements/5294532" rel="noopener noreferrer"&gt;Encontró 2.334 registros de smartphones&lt;/a&gt; dados de alta en el último año y revisó, uno por uno, si cada uno cumplía con publicar dónde conseguir repuestos y el manual de reparación.&lt;/p&gt;

&lt;p&gt;El resultado: &lt;a href="https://www.theregister.com/personal-tech/2026/09/07/smartphone-makers-dont-bother-to-comply-with-eu-repairability-requirements/5294532" rel="noopener noreferrer"&gt;solo el 18% de esos registros enlaza a una página que realmente sirve&lt;/a&gt;, con precios de repuestos o instrucciones. Cerca de la mitad deja el campo vacío, sin ningún enlace. Otro 19% apunta a una página de producto o de soporte genérica, sin repuestos ni manual. En algunos casos, el fabricante remite directamente a Temu o AliExpress para conseguir piezas de repuesto.&lt;/p&gt;

&lt;p&gt;Incluso cuando el precio del repuesto sí aparece, el dato puede ser inútil: algunos registros listan una &lt;a href="https://www.theregister.com/personal-tech/2026/09/07/smartphone-makers-dont-bother-to-comply-with-eu-repairability-requirements/5294532" rel="noopener noreferrer"&gt;batería de repuesto entre 14 y 128 euros&lt;/a&gt;, un rango tan amplio que no le sirve a nadie para decidir si vale la pena reparar el equipo.&lt;/p&gt;

&lt;p&gt;Lo más llamativo es que varios fabricantes claramente incumplidores igual se otorgan a sí mismos la nota más alta posible, clase A, en el puntaje de reparabilidad que ellos mismos declaran. Y cuando el enlace sí existe y es válido, no siempre es fácil de usar: para marcas grandes como Apple y Samsung hace falta navegar varios clics antes de llegar al precio real de un repuesto, según el informe.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Ojo:&lt;/strong&gt; el sistema no tiene un verificador automático. Un fabricante puede dejar el campo de reparación vacío y aun así declararse clase A en reparabilidad, porque el puntaje es autoevaluado.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Contexto e historia
&lt;/h2&gt;

&lt;p&gt;La obligación nació dentro del paquete de ecodiseño y etiquetado energético de la UE, que desde junio de 2025 extendió a smartphones y tablets el mismo esquema que ya existía para heladeras o lavarropas: una etiqueta con una nota de A a G y datos técnicos verificables. La diferencia con la energía es que, en electrodomésticos, hay laboratorios que miden el consumo. En reparabilidad, el puntaje lo pone el propio fabricante, sin auditoría previa.&lt;/p&gt;

&lt;p&gt;Francia había probado algo parecido antes, con su índice de reparabilidad obligatorio para electrónica de consumo, y sirvió de referencia para el esquema europeo. La apuesta de Bruselas fue escalar esa idea a los 27 países del bloque, apoyada en el registro EPREL como ventanilla única de transparencia.&lt;br&gt;
La ley exige publicar dónde conseguir estos repuestos, pero la mitad de los registros no lo hace.&lt;/p&gt;
&lt;h2&gt;
  
  
  Cómo funciona el registro EPREL
&lt;/h2&gt;

&lt;p&gt;Cada fabricante que vende un smartphone o tablet en la UE tiene que crear un registro en &lt;a href="https://eprel.ec.europa.eu/" rel="noopener noreferrer"&gt;EPREL&lt;/a&gt; antes de poner el producto a la venta. Ese registro incluye la ficha técnica del modelo, la etiqueta energética generada automáticamente y, desde junio de 2025, un campo obligatorio con la URL donde el comprador puede encontrar precios de repuestos y el manual de reparación.&lt;/p&gt;

&lt;p&gt;El problema es estructural: EPREL valida que el campo de la URL exista y tenga formato de enlace, pero no valida que ese enlace lleve a información real. Right to Repair Europe tuvo que abrir manualmente cada uno de los 2.334 enlaces para clasificarlos. Así se ve la distribución que encontraron:&lt;br&gt;
Categoría del registroQué significa% de los 2.334 registrosEnlace válido con datos de reparaciónLa URL lleva a precios de repuestos o instrucciones reales18%Campo de URL en blancoEl fabricante no completó el enlace obligatorio~50%Enlace genérico o irrelevanteRemite a una página de producto o soporte sin repuestos ni manual19%Otros casos, incluidos Temu y AliExpressEl enlace existe pero no cumple el propósito de la normaresto de los registros&lt;br&gt;
El siguiente diagrama resume el recorrido de un registro típico, desde que el fabricante declara su puntaje hasta que un comprador intenta usar esa información:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;flowchart TD
A["Fabricante lanza un modelo"] --&amp;gt; B["Declara su propio puntaje de reparabilidad"]
B --&amp;gt; C["Registra el modelo en EPREL"]
C --&amp;gt; D{"¿Publica una URL con repuestos y manual?"}
D -- "Sí, 18%" --&amp;gt; E["El consumidor encuentra la información"]
D -- "Campo vacío, ~50%" --&amp;gt; F["El consumidor no encuentra nada"]
D -- "Link genérico, 19%" --&amp;gt; G["El consumidor llega a una página sin datos"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Cómo verificar la reparabilidad de smartphones vos mismo
&lt;/h2&gt;

&lt;p&gt;El registro de EPREL es público, así que no hace falta esperar al próximo informe de una ONG para chequear un modelo puntual. El buscador web está en &lt;a href="https://eprel.ec.europa.eu/" rel="noopener noreferrer"&gt;eprel.ec.europa.eu&lt;/a&gt;, filtrando por la categoría de smartphones y tablets. Ahí aparece la ficha de cada modelo con su etiqueta energética y, si el fabricante la cargó, la URL de reparación.&lt;/p&gt;

&lt;p&gt;Para confirmar rápido si esa URL sirve, alcanza con revisar el código de estado HTTP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"%{http_code}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"https://soporte.ejemplo-fabricante.com/repuestos/modelo-x1"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Un 200 no garantiza que la página tenga precios de repuestos, solo que el enlace responde. El paso que hace Right to Repair Europe es bajar el contenido y buscar palabras clave asociadas a reparación real, no solo a soporte técnico genérico:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;PALABRAS_CLAVE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;repuesto&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;spare part&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;battery&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bateria&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;manual de reparacion&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;repair manual&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;clasificar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vacio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;allow_redirects&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RequestException&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;inalcanzable&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;texto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;palabra&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;palabra&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;PALABRAS_CLAVE&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cumple&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;irrelevante&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;eprel_smartphones.csv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;archivo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;filas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DictReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;archivo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;resultados&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;fila&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;filas&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;estado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;clasificar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fila&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url_reparacion&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;resultados&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;estado&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resultados&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;estado&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resultados&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El script recibe un CSV con los modelos y la URL de reparación que cada uno declaró en EPREL (se exporta a mano desde el buscador, porque EPREL no ofrece una API pública documentada para terceros), y devuelve un conteo por categoría. Si corrés esto sobre una muestra amplia, las proporciones deberían acercarse a las que reportó Right to Repair Europe: minoría en "cumple", cerca de la mitad en "vacío".&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Tip:&lt;/strong&gt; antes de comprar un celular, buscá el modelo en EPREL y probá el enlace de reparación con el &lt;code&gt;curl&lt;/code&gt; de arriba. Si tira 404 o redirige a la home del fabricante, el puntaje de reparabilidad que aparece en la caja no tiene respaldo real.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Impacto y análisis
&lt;/h2&gt;

&lt;p&gt;Right to Repair Europe cuestiona todo el diseño del sistema. Si miles de registros tienen el campo vacío y nadie lo notó en un año, ninguna autoridad está revisando los datos que cargan los fabricantes.&lt;/p&gt;

&lt;p&gt;Thomas Opsomer, vocero de políticas de la Unión Europea de iFixit y de la coalición Right to Repair Europe, lo resumió así: "The obligation for publicly available spare parts prices and repair manuals is a great step forward, but it needs to be enforced better" (la obligación de publicar precios de repuestos y manuales es un paso adelante, pero necesita mejor aplicación). Opsomer también planteó que, si el puntaje es autoasignado, los fabricantes deberían estar obligados a publicar toda la documentación que lo respalda, para que cualquiera pueda auditarlo, y que debería ser más fácil para consumidores y talleres reportar incumplimientos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.theregister.com/personal-tech/2026/09/07/smartphone-makers-dont-bother-to-comply-with-eu-repairability-requirements/5294532" rel="noopener noreferrer"&gt;The Register&lt;/a&gt; le consultó a la Comisión Europea por estos hallazgos y, al momento de publicar el informe, todavía no había respuesta. Ese silencio es parte del problema que señala la ONG: no hay evidencia pública de que alguna autoridad esté auditando activamente los registros de EPREL.&lt;/p&gt;

&lt;p&gt;Para quienes trabajan en software o en cumplimiento normativo, el caso es un ejemplo clásico de autoevaluación sin auditoría: cualquier sistema donde el regulado carga sus propios datos, sin un chequeo automático de calidad ni una sanción clara por dejar campos vacíos, tiende a llenarse de campos vacíos. El problema de fondo es que la reparabilidad de smartphones quedó en manos de quien menos interés tiene en que se audite: el propio fabricante.&lt;br&gt;
La etiqueta muestra una nota de reparabilidad que el propio fabricante calcula.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué sigue
&lt;/h2&gt;

&lt;p&gt;En &lt;a href="https://www.theregister.com/personal-tech/2026/09/07/smartphone-makers-dont-bother-to-comply-with-eu-repairability-requirements/5294532" rel="noopener noreferrer"&gt;febrero de 2027 entra en vigor otro tramo de la misma familia de reglas&lt;/a&gt;: los celulares nuevos vendidos en la UE deberán traer &lt;strong&gt;batería reemplazable por el usuario&lt;/strong&gt;, con excepciones para categorías como los wearables. Esa exigencia es más fácil de auditar que un enlace roto, porque se verifica con el diseño físico del producto, no con un campo de texto que el fabricante puede dejar vacío.&lt;/p&gt;

&lt;p&gt;Right to Repair Europe seguirá presionando por dos cambios concretos: que la Comisión obligue a publicar la documentación técnica detrás de cada puntaje autodeclarado, y que exista un canal simple para que consumidores y talleres de reparación reporten registros incumplidores en EPREL. Ninguno de los dos cambios requiere una ley nueva, alcanza con reglamentar mejor la que ya existe.&lt;/p&gt;

&lt;p&gt;Para un lector fuera de la UE, el caso vale como advertencia temprana: cualquier ley de reparabilidad que se apoye en la autoevaluación del fabricante, sin auditoría ni sanción automática, corre el riesgo de terminar con la misma brecha entre lo que dice la etiqueta y lo que hay detrás del enlace.&lt;/p&gt;

&lt;p&gt;📖 Resumen en Telegram: Ver resumen&lt;/p&gt;

&lt;p&gt;Probalo vos: buscá el modelo de tu próximo celular en &lt;a href="https://eprel.ec.europa.eu/" rel="noopener noreferrer"&gt;eprel.ec.europa.eu&lt;/a&gt; y corré el &lt;code&gt;curl&lt;/code&gt; de arriba contra el enlace de reparación antes de confiar en la nota de reparabilidad que aparece en la caja.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Qué es la etiqueta de reparabilidad de la UE?
&lt;/h3&gt;

&lt;p&gt;Es una nota, de clase A a la más baja, que cada fabricante de smartphones y tablets debe autoasignarse desde junio de 2025, junto con un enlace donde el comprador puede ver precios de repuestos y el manual de reparación.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué es EPREL?
&lt;/h3&gt;

&lt;p&gt;El European Product Registry for Energy Labelling es la base de datos pública de la Comisión Europea donde los fabricantes registran cada modelo antes de venderlo en el bloque, incluida su etiqueta energética y de reparabilidad.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué el puntaje de reparabilidad no es confiable del todo?
&lt;/h3&gt;

&lt;p&gt;Porque lo calcula y lo declara el propio fabricante, sin que un laboratorio externo lo verifique antes de publicarlo. Right to Repair Europe encontró fabricantes que se dan clase A pese a dejar vacío el campo obligatorio de información de reparación.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué pasa si un fabricante no cumple con la norma?
&lt;/h3&gt;

&lt;p&gt;Según el informe, no hay evidencia de sanciones activas: miles de registros llevan un año con el campo de reparación vacío sin que ninguna autoridad los haya corregido.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿La regla aplica también a marcas que venden a través de plataformas como Temu o AliExpress?
&lt;/h3&gt;

&lt;p&gt;Sí, cualquier fabricante que venda smartphones o tablets en el mercado europeo debe registrarse en EPREL, sin importar su país de origen o el canal de venta.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué cambia en 2027?
&lt;/h3&gt;

&lt;p&gt;Desde febrero de 2027, los celulares nuevos deberán traer batería reemplazable por el usuario, con excepciones para dispositivos como wearables.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.theregister.com/personal-tech/2026/09/07/smartphone-makers-dont-bother-to-comply-with-eu-repairability-requirements/5294532" rel="noopener noreferrer"&gt;The Register&lt;/a&gt;: informe original sobre el incumplimiento de las reglas de reparabilidad en la UE.- &lt;a href="https://eprel.ec.europa.eu/" rel="noopener noreferrer"&gt;EPREL&lt;/a&gt;: registro público de la Comisión Europea donde se cargan las etiquetas energéticas y de reparabilidad.- iFixit: organización de reparación citada como vocera de la coalición Right to Repair Europe.- &lt;a href="https://commission.europa.eu/" rel="noopener noreferrer"&gt;Comisión Europea&lt;/a&gt;: autoridad responsable del reglamento de ecodiseño y etiquetado energético que incluye la reparabilidad.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📱 &lt;strong&gt;¿Te gusta este contenido?&lt;/strong&gt; Únete a nuestro canal de Telegram &lt;a href="https://t.me/programacion" rel="noopener noreferrer"&gt;@programacion&lt;/a&gt; donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>android</category>
      <category>ios</category>
      <category>programming</category>
    </item>
    <item>
      <title>Internet Archive: donación de $25 se triplica a $75 en septiembre</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Mon, 07 Sep 2026 08:22:41 +0000</pubDate>
      <link>https://dev.to/lu1tr0n/internet-archive-donacion-de-25-se-triplica-a-75-en-septiembre-43ji</link>
      <guid>https://dev.to/lu1tr0n/internet-archive-donacion-de-25-se-triplica-a-75-en-septiembre-43ji</guid>
      <description>&lt;p&gt;Un dólar donado a Internet Archive este mes se convierte en tres. La organización sin fines de lucro que sostiene la Wayback Machine y buena parte de la memoria pública de internet &lt;a href="https://blog.archive.org/2026/09/01/keep-our-servers-running-your-recurring-donation-goes-3x-this-september/" rel="noopener noreferrer"&gt;anunció una campaña de donaciones recurrentes&lt;/a&gt; para septiembre de 2026: cada aporte mensual desde $25 recibe un match de 2:1 durante todo el mes.&lt;/p&gt;

&lt;p&gt;La noticia importa porque Internet Archive no terceriza su infraestructura central. Construye y mantiene sus propios servidores, sistemas de almacenamiento y refrigeración para preservar 210 petabytes de datos: libros, páginas web, audio, video y software. Sin financiamiento estable, esa capacidad de preservación depende directamente de campañas como esta.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Internet Archive lanzó en septiembre de 2026 una campaña de donaciones recurrentes con match 2:1.- Un aporte de $25 mensuales se convierte en $75 de impacto total gracias al match.- $50 mensuales generan $150; $100 mensuales generan $300, según el anuncio oficial.- El match aplica solo al primer aporte de una donación recurrente nueva iniciada en septiembre.- La organización preserva 210 petabytes: libros, páginas web, audio, video y software.- Internet Archive no cobra por acceso, no vende datos de usuarios ni muestra publicidad.- La donación promedio histórica de la organización ronda los $25 mensuales.- La campaña fue publicada el 1 de septiembre de 2026 en blog.archive.org.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Qué pasó
&lt;/h2&gt;

&lt;p&gt;Internet Archive confirmó que todo nuevo &lt;strong&gt;donante recurrente&lt;/strong&gt; que inicie un aporte de $25 o más durante septiembre de 2026 recibirá un match de 2:1 sobre su primera contribución. En la práctica, eso multiplica por tres el valor inicial de cada donación.&lt;/p&gt;

&lt;p&gt;La organización lo explicó con ejemplos concretos en su blog oficial: un aporte mensual de $25 desbloquea $50 adicionales de match, para un total de $75 de apoyo. Un aporte de $50 se convierte en $150, y uno de $100 llega a $300. La siguiente tabla resume la mecánica:&lt;/p&gt;

&lt;p&gt;Aporte mensual propioMatch 2:1Total generado$25+$50$75$50+$100$150$100+$200$300&lt;/p&gt;

&lt;p&gt;El mensaje de Brewster Kahle, bibliotecario digital y fundador de Internet Archive, enmarca la campaña en la misión histórica de la organización: &lt;em&gt;“El acceso universal a todo el conocimiento humano está a nuestro alcance. Nuestro trabajo es poner lo mejor que nuestro mundo tiene para ofrecer al alcance de nuestros hijos”&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;La campaña se suma al programa permanente llamado Monthly Giving Circle, el grupo de donantes recurrentes que sostiene mes a mes las operaciones de la organización. Según el propio blog, la donación promedio en Internet Archive ronda los $25 mensuales, lo que confirma que el umbral elegido para el match no es arbitrario: coincide con el comportamiento real de sus donantes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contexto e historia de Internet Archive
&lt;/h2&gt;

&lt;p&gt;Internet Archive nació en 1996 en San Francisco con un objetivo declarado desde el inicio: archivar internet antes de que desapareciera. Su proyecto más conocido, la &lt;a href="https://web.archive.org" rel="noopener noreferrer"&gt;Wayback Machine&lt;/a&gt;, empezó a estar disponible públicamente en 2001 y hoy permite consultar versiones históricas de miles de millones de páginas web.&lt;/p&gt;

&lt;p&gt;La organización preserva 210 petabytes de datos con infraestructura propia.&lt;/p&gt;

&lt;p&gt;A lo largo de tres décadas, el archivo creció mucho más allá de las páginas web. Hoy incluye libros digitalizados, grabaciones de audio y música, películas, videojuegos emulables, software histórico y colecciones de radio y televisión. Toda esa colección combinada suma, según el anuncio de septiembre de 2026, 210 petabytes de datos.&lt;/p&gt;

&lt;p&gt;La decisión de no delegar esa infraestructura a proveedores externos es, en parte, un principio editorial: Internet Archive no cobra por el acceso, no vende datos de sus usuarios y no muestra publicidad. Ese modelo la diferencia de bibliotecas digitales comerciales, pero también la deja sin la palanca de ingresos que tienen esas empresas: publicidad, suscripciones premium o venta de datos agregados.&lt;/p&gt;

&lt;p&gt;Internet Archive también atravesó momentos de tensión legal en los últimos años, principalmente por su programa de préstamo digital controlado de libros escaneados, cuestionado por editoriales en tribunales de Estados Unidos. Ese contexto explica por qué la organización insiste en la estabilidad financiera: cada frente de disputa legal consume recursos que también deberían sostener servidores y personal técnico.&lt;/p&gt;

&lt;h2&gt;
  
  
  Detalles técnicos y rendimiento de la infraestructura
&lt;/h2&gt;

&lt;p&gt;Mantener 210 petabytes en operación no es solo un problema de espacio en disco. Cada dólar recaudado se reparte entre varios frentes técnicos: servidores de cómputo, arreglos de almacenamiento, redes internas, energía eléctrica y refrigeración de los centros de datos que la organización opera directamente.&lt;/p&gt;

&lt;p&gt;El siguiente diagrama resume, de forma simplificada, cómo una donación recurrente se traduce en capacidad operativa real:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;flowchart TD
A["Donación mensual"] --&amp;gt; B["Match 2:1 de Internet Archive"]
B --&amp;gt; C["Fondos para infraestructura"]
C --&amp;gt; D[("Servidores y almacenamiento")]
C --&amp;gt; E[("Energía y refrigeración")]
D --&amp;gt; F["Wayback Machine y colecciones"]
E --&amp;gt; F
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A diferencia de un proveedor cloud comercial, Internet Archive no factura por consumo elástico: opera capacidad fija que debe crecer al ritmo de sus colecciones. Eso vuelve más predecible el gasto operativo, pero también más sensible a caídas de ingresos: si las donaciones bajan, la organización no puede simplemente reducir capacidad sin arriesgar la disponibilidad del archivo.&lt;/p&gt;

&lt;p&gt;La infraestructura propia evita depender de proveedores cloud externos.&lt;/p&gt;

&lt;p&gt;Esa autonomía tecnológica es, según la propia organización, parte de la razón por la que puede mantener el acceso gratuito y sin publicidad: no hay intermediarios comerciales entre el usuario y los datos que consulta.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo empezar: donar o usar el archivo hoy mismo
&lt;/h2&gt;

&lt;p&gt;Sumarse al Monthly Giving Circle es un trámite de un par de minutos: se hace desde &lt;a href="https://archive.org/donate" rel="noopener noreferrer"&gt;archive.org/donate&lt;/a&gt;, eligiendo un monto recurrente de $25 o más antes de que termine septiembre de 2026 para calificar al match 2:1.&lt;/p&gt;

&lt;p&gt;Pero no hace falta donar para aprovechar la infraestructura que sostiene esta campaña. Internet Archive expone una API pública y gratuita para consultar la Wayback Machine sin necesidad de credenciales. La forma más simple es preguntar si una URL específica ya está archivada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s1"&gt;'http://archive.org/wayback/available?url=example.com'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esa llamada devuelve un JSON con la instantánea más cercana disponible para &lt;code&gt;example.com&lt;/code&gt;, incluyendo su timestamp y la URL directa al snapshot archivado. Es la misma verificación que hace el propio sitio cuando genera el aviso de página archivada.&lt;/p&gt;

&lt;p&gt;Para explorar el historial completo de un dominio, Internet Archive expone la CDX API, pensada para listar snapshots con filtros de fecha:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;20200101&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;20261231&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;5&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://web.archive.org/cdx/search/cdx?&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;(([&lt;/span&gt;&lt;span class="nx"&gt;urlkey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;original&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;original&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ese script pide hasta cinco snapshots de &lt;code&gt;example.com&lt;/code&gt; capturados entre 2020 y 2026, e imprime el timestamp y la URL original de cada uno. La primera fila de la respuesta es el encabezado de columnas, por eso el código la descarta con &lt;code&gt;slice(1)&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Tip:&lt;/strong&gt; el match 2:1 de septiembre solo aplica a la primera contribución de una donación recurrente nueva, no a donaciones únicas ni a aportes recurrentes ya existentes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Impacto y análisis
&lt;/h2&gt;

&lt;p&gt;El diseño de la campaña prioriza donantes recurrentes por encima de aportes únicos, y esa elección tiene una lógica financiera clara: un aporte mensual sostenido es más fácil de proyectar en un presupuesto operativo que una donación puntual, por grande que sea. Para una organización que paga servidores, energía y personal técnico todos los meses, la previsibilidad vale tanto como el monto total recaudado.&lt;/p&gt;

&lt;p&gt;El match 2:1 también funciona como incentivo psicológico: convierte un aporte modesto de $25 mensuales en un impacto declarado de $75, sin que el donante tenga que desembolsar más. Es una estrategia común en organizaciones sin fines de lucro, pero poco habitual en el mundo del software y la infraestructura de internet, donde la mayoría de los servicios que usamos a diario están financiados por publicidad, suscripciones o venta de datos.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Ojo:&lt;/strong&gt; Internet Archive depende casi por completo de donaciones para financiar infraestructura que en una empresa comercial costaría cientos de millones de dólares al año en cómputo y almacenamiento.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Esa dependencia también es un punto débil estructural. A diferencia de una empresa con ingresos recurrentes garantizados por contrato, una biblioteca digital financiada por donaciones vive campaña a campaña. Si una campaña de matching no alcanza su objetivo, no hay una ronda de inversión de respaldo: la organización ajusta gasto operativo, lo que en la práctica puede significar menos capacidad de rastreo web, menos redundancia de almacenamiento o menos velocidad de respuesta en picos de tráfico.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué sigue
&lt;/h2&gt;

&lt;p&gt;La campaña de matching 2:1 corre durante todo septiembre de 2026. Cada donación recurrente nueva que se registre en ese período con $25 o más mensuales calificará automáticamente, sin necesidad de un código promocional ni un paso adicional en el checkout de &lt;a href="https://archive.org/donate" rel="noopener noreferrer"&gt;archive.org/donate&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Más allá del mes de campaña, Internet Archive seguirá enfrentando el mismo desafío estructural: sus colecciones crecen cada año, y con ellas el costo de almacenarlas y servirlas. La organización no anunció un cambio de modelo de financiamiento, así que campañas de matching como esta seguirán siendo, previsiblemente, una herramienta recurrente para sostener la operación.&lt;/p&gt;

&lt;p&gt;📖 Resumen en Telegram: Ver resumen&lt;/p&gt;

&lt;p&gt;Probalo vos: corré &lt;code&gt;curl 'http://archive.org/wayback/available?url=tu-sitio.com'&lt;/code&gt; ahora mismo y confirmá si tu propio sitio ya quedó preservado en la Wayback Machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Qué es Internet Archive?
&lt;/h3&gt;

&lt;p&gt;Es una biblioteca digital sin fines de lucro fundada en 1996 que preserva páginas web, libros, audio, video y software, y opera la Wayback Machine para consultar versiones históricas de internet.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo funciona el match 2:1 de septiembre de 2026?
&lt;/h3&gt;

&lt;p&gt;Toda donación recurrente nueva de $25 mensuales o más iniciada en septiembre recibe el doble de ese monto en fondos adicionales: un aporte de $25 genera $75 de impacto total.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿El match aplica a donaciones únicas?
&lt;/h3&gt;

&lt;p&gt;No. Según el anuncio oficial, el match 2:1 aplica solo al primer aporte de una donación recurrente mensual nueva, no a contribuciones puntuales.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuánto almacenamiento usa Internet Archive?
&lt;/h3&gt;

&lt;p&gt;La organización reporta 210 petabytes de datos preservados, distribuidos entre páginas web, libros digitalizados, audio, video y software histórico.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Internet Archive vende mis datos o muestra publicidad?
&lt;/h3&gt;

&lt;p&gt;No. La organización declara explícitamente que no cobra por el acceso, no vende datos de usuarios ni muestra anuncios en ninguna de sus plataformas.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puedo usar la Wayback Machine sin donar?
&lt;/h3&gt;

&lt;p&gt;Sí. La Wayback Machine y su API de disponibilidad son de acceso público y gratuito, sin necesidad de registro ni de aporte económico.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://blog.archive.org/2026/09/01/keep-our-servers-running-your-recurring-donation-goes-3x-this-september/" rel="noopener noreferrer"&gt;Internet Archive Blog&lt;/a&gt;: anuncio oficial de la campaña de matching 2:1 de septiembre de 2026.- &lt;a href="https://archive.org/donate" rel="noopener noreferrer"&gt;archive.org/donate&lt;/a&gt;: página oficial para sumarse al Monthly Giving Circle.- &lt;a href="https://web.archive.org" rel="noopener noreferrer"&gt;Wayback Machine&lt;/a&gt;: acceso público a las instantáneas históricas de internet.- &lt;a href="https://en.wikipedia.org/wiki/Internet_Archive" rel="noopener noreferrer"&gt;Wikipedia&lt;/a&gt;: historia y contexto general de Internet Archive.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📱 &lt;strong&gt;¿Te gusta este contenido?&lt;/strong&gt; Únete a nuestro canal de Telegram &lt;a href="https://t.me/programacion" rel="noopener noreferrer"&gt;@programacion&lt;/a&gt; donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.&lt;/p&gt;

</description>
      <category>technology</category>
      <category>science</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>GrapheneOS confirma que migra parte de su infraestructura a sistemas propios</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Mon, 07 Sep 2026 02:23:30 +0000</pubDate>
      <link>https://dev.to/lu1tr0n/grapheneos-confirma-que-migra-parte-de-su-infraestructura-a-sistemas-propios-4fk5</link>
      <guid>https://dev.to/lu1tr0n/grapheneos-confirma-que-migra-parte-de-su-infraestructura-a-sistemas-propios-4fk5</guid>
      <description>&lt;p&gt;GrapheneOS no usa mastodon.social ni ninguna instancia de terceros para comunicarse: opera su propio servidor de Mastodon en &lt;strong&gt;grapheneos.social&lt;/strong&gt;. Desde esa misma cuenta, el proyecto &lt;a href="https://grapheneos.social/@GrapheneOS/117225539756835649" rel="noopener noreferrer"&gt;publicó recientemente&lt;/a&gt; que está bien avanzado en el proceso de convertir parte de su infraestructura interna a sistemas propios.&lt;/p&gt;

&lt;p&gt;El mensaje original, tal como quedó disponible públicamente, no detalla qué sistema específico se está migrando ni cuándo terminará el proceso. Pero el hecho en sí (un proyecto de seguridad y privacidad que prioriza tener el control total de su infraestructura propia) es coherente con cómo GrapheneOS ha operado desde siempre, y sirve como punto de partida para explicar qué significa autoalojar servicios críticos en 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GrapheneOS anunció en su cuenta oficial de Mastodon que está bien avanzado en el proceso de convertir parte de su infraestructura interna.- El mensaje se publicó desde grapheneos.social, la instancia de Mastodon que el propio proyecto opera y administra.- GrapheneOS ya autoaloja varios servicios clave: su repositorio de apps en apps.grapheneos.org y su servidor de atestación remota en attestation.app.- La fuente disponible del anuncio no detalla el sistema específico convertido ni una fecha de finalización.- Autoalojar una instancia de Mastodon mínima requiere Docker, PostgreSQL y Redis, con 2 vCPU y 4 GB de RAM como referencia habitual.- La estrategia de infraestructura propia reduce puntos únicos de fallo y dependencia de moderación o suspensión por terceros.- El caso de GrapheneOS sirve como ejemplo práctico para equipos que evalúan migrar de SaaS centralizado a self-hosting.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Qué pasó
&lt;/h2&gt;

&lt;p&gt;El anuncio salió del canal oficial de comunicación del proyecto en Mastodon, no de un blog post ni de un comunicado de prensa. GrapheneOS usa esa cuenta para avisos de seguridad, novedades de compatibilidad con Pixel y, en este caso, una actualización operativa: el equipo dijo estar &lt;strong&gt;bien avanzado&lt;/strong&gt; en convertir parte de su infraestructura a sistemas que administra directamente.&lt;/p&gt;

&lt;p&gt;Es un patrón habitual en el proyecto: GrapheneOS es una organización sin fines de lucro que se financia con donaciones y evita depender de infraestructura corporativa que no controla, algo que ya se nota en tres piezas de su stack actual: el repositorio de aplicaciones, el servicio de atestación remota y la propia red social donde anuncia estos cambios.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contexto e historia
&lt;/h2&gt;

&lt;p&gt;GrapheneOS empezó como CopperheadOS y desde el inicio construyó su reputación sobre un principio simple: minimizar la superficie de confianza. Eso aplica al sistema operativo (hardening del kernel, sandboxing reforzado, verified boot) pero también a la infraestructura que sostiene el proyecto puertas afuera.&lt;/p&gt;

&lt;p&gt;Dos ejemplos ya consolidados de esa filosofía de &lt;strong&gt;infraestructura propia&lt;/strong&gt;: el repositorio en &lt;a href="https://apps.grapheneos.org" rel="noopener noreferrer"&gt;apps.grapheneos.org&lt;/a&gt;, compatible con el cliente de F-Droid, que distribuye Auditor, Vanadium y otras apps first-party sin pasar por Google Play ni por un mirror de terceros; y &lt;a href="https://attestation.app" rel="noopener noreferrer"&gt;attestation.app&lt;/a&gt;, el servicio que permite que cualquier Pixel con GrapheneOS demuestre criptográficamente su estado de arranque contra un servidor que el propio proyecto opera de punta a punta.&lt;br&gt;
Autoalojar el repositorio de apps y la atestación evita depender de terceros.&lt;br&gt;
Que la cuenta de anuncios también corra en un servidor propio (grapheneos.social) en lugar de una instancia genérica cierra ese círculo: ningún canal crítico del proyecto depende de un tercero que pueda suspender la cuenta, cambiar términos de servicio o insertar telemetría no deseada.&lt;/p&gt;
&lt;h2&gt;
  
  
  Detalles técnicos: cómo se sostiene una infraestructura propia
&lt;/h2&gt;

&lt;p&gt;Montar y sostener infraestructura propia como la de GrapheneOS implica decisiones concretas de arquitectura. En el caso de un servidor de Mastodon autoalojado, el stack mínimo combina un proxy inverso, el proceso web de Mastodon, el proceso de streaming (para la línea de tiempo en tiempo real) y dos almacenes de datos: PostgreSQL para el estado persistente y Redis para colas y caché.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TD
    A["Cliente Mastodon"] --&amp;gt; B["Nginx (proxy inverso)"]
    B --&amp;gt; C["Mastodon Web"]
    B --&amp;gt; D["Streaming API"]
    C --&amp;gt; E[("PostgreSQL")]
    C --&amp;gt; F[("Redis")]
    D --&amp;gt; F
    subgraph Backend
    C
    D
    E
    F
    end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Antes de tocar configuración, conviene ver cómo responde una instancia real. Este primer bloque consulta la API pública de &lt;strong&gt;grapheneos.social&lt;/strong&gt; y devuelve la versión de Mastodon que corre:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -s https://grapheneos.social/api/v2/instance | jq '.version'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ese comando no requiere autenticación ni cuenta: cualquier instancia de Mastodon expone su versión y metadata básica por diseño, parte del protocolo ActivityPub que usa la red.&lt;/p&gt;

&lt;p&gt;Para levantar tu propia instancia, el bloque siguiente es un &lt;code&gt;docker-compose.yml&lt;/code&gt; reducido a los tres servicios imprescindibles (sin colas de trabajo en background separadas, que en producción conviene aislar):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;services:
  db:
    image: postgres:15-alpine
    restart: always
    environment:
      POSTGRES_USER: mastodon
      POSTGRES_PASSWORD: cambia_esta_clave
      POSTGRES_DB: mastodon_production
    volumes:
      - ./postgres:/var/lib/postgresql/data

  redis:
    image: redis:7-alpine
    restart: always
    volumes:
      - ./redis:/data

  web:
    image: tootsuite/mastodon:v4.3.0
    restart: always
    env_file: .env.production
    ports:
      - "3000:3000"
    depends_on:
      - db
      - redis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con esos tres servicios arriba (&lt;code&gt;docker compose up -d&lt;/code&gt;), Mastodon queda escuchando en el puerto 3000 detrás de tu propio proxy. La base de datos y la caché nunca salen de tu red interna, algo que en un SaaS centralizado no podés garantizar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo empezar a probarlo
&lt;/h2&gt;

&lt;p&gt;Para reproducir un entorno mínimo de infraestructura propia como la que usa GrapheneOS, el primer paso es tener Docker corriendo. Los comandos de instalación varían por sistema operativo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Linux (Debian/Ubuntu)
curl -fsSL https://get.docker.com | sh

# macOS (con Homebrew)
brew install --cask docker

# Windows (con winget)
winget install Docker.DockerDesktop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una vez instalado Docker y con el &lt;code&gt;docker-compose.yml&lt;/code&gt; del ejemplo anterior en una carpeta junto a un archivo &lt;code&gt;.env.production&lt;/code&gt; con las claves generadas por &lt;code&gt;bin/tootctl&lt;/code&gt; (secreto de aplicación, claves VAPID y credenciales OTP), el arranque es:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker compose up -d
docker compose exec web bin/tootctl accounts create admin --email admin@tudominio.com --confirmed --role Owner
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para confirmar que la instancia levantó correctamente, la misma llamada que usamos antes contra grapheneos.social funciona contra tu propio servidor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -s http://localhost:3000/api/v1/instance | jq '.title, .version'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si el JSON devuelve el título y la versión configurados, la instancia está viva y federando según la configuración de &lt;code&gt;LOCAL_DOMAIN&lt;/code&gt; del &lt;code&gt;.env.production&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Ojo:&lt;/strong&gt; una instancia de Mastodon en producción, con envío de correo, backups y moderación real, necesita bastante más que este stack de tres contenedores: colas de Sidekiq separadas, almacenamiento de medios (S3 o disco dedicado) y un plan de actualización de versión. El ejemplo de arriba es para entender la arquitectura, no para exponer a internet sin ajustes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Impacto y análisis
&lt;/h2&gt;

&lt;p&gt;La diferencia entre depender de una plataforma de terceros y sostener infraestructura propia no es cosmética. Cuando GrapheneOS aloja su propia atestación remota en attestation.app, el proyecto controla el árbol de confianza completo: no hay un intermediario que pueda cambiar el resultado de una verificación de arranque. Lo mismo pasa con apps.grapheneos.org: al ser compatible con F-Droid, cualquier cliente puede verificar las firmas de los paquetes sin pasar por Google Play.&lt;/p&gt;

&lt;p&gt;La contrapartida es el costo operativo. Autoalojar significa parchear servidores, monitorear disponibilidad, pagar ancho de banda y absorber picos de tráfico sin el colchón de un proveedor gestionado. Para un proyecto con presupuesto de donaciones, ese costo compite directamente con desarrollo del propio sistema operativo.&lt;br&gt;
OpciónCuándo usarlaVentajaLimitaciónMastodon autoalojadoCuando el control total del dato y la moderación es prioritarioSin dependencia de terceros ni riesgo de suspensión externaRequiere mantenimiento, backups y monitoreo propiosInstancia de Mastodon de terceros (ej. mastodon.social)Cuando el objetivo es solo tener presencia, sin operar servidoresCero mantenimiento, arranque inmediatoSujeto a políticas y disponibilidad de un terceroRed basada en AT Protocol (ej. Bluesky)Cuando se prioriza portabilidad de identidad entre proveedoresLa cuenta y el grafo social son portables entre hostsEcosistema de self-hosting menos maduro que ActivityPubAutoalojar cambia mantenimiento por control total del dato.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💭 Clave:&lt;/strong&gt; el mismo argumento que lleva a GrapheneOS a operar attestation.app en vez de delegarlo a un tercero es el que explica por qué también aloja su propio Mastodon: cada pieza de infraestructura que no controlás es un punto donde alguien más puede decidir por vos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Qué sigue
&lt;/h2&gt;

&lt;p&gt;El mensaje original no especifica un cronograma de cierre para esta conversión de infraestructura, así que lo verificable hoy es lo que el proyecto ya opera de forma propia: el repositorio de apps, el servidor de atestación y la instancia de Mastodon desde la que se hizo el anuncio. Cualquier detalle adicional sobre el sistema puntual que se está migrando dependerá de futuras publicaciones oficiales del proyecto en ese mismo canal.&lt;/p&gt;

&lt;p&gt;Para equipos de desarrollo que siguen este caso como referencia, el paso lógico es auditar qué servicios propios dependen hoy de un SaaS de terceros y evaluar, servicio por servicio, si el costo operativo de autoalojar se justifica frente al riesgo de depender de un proveedor externo.&lt;/p&gt;

&lt;p&gt;📖 Resumen en Telegram: Ver resumen&lt;/p&gt;

&lt;p&gt;Probalo vos: corré &lt;code&gt;curl -s https://grapheneos.social/api/v2/instance | jq '.version'&lt;/code&gt; ahora mismo para ver en vivo la instancia de Mastodon que GrapheneOS opera con su propia infraestructura.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Qué es grapheneos.social?
&lt;/h3&gt;

&lt;p&gt;Es la instancia de Mastodon que GrapheneOS opera y administra directamente, en lugar de usar mastodon.social o cualquier otro servidor de terceros para su cuenta oficial.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué otra infraestructura autoaloja GrapheneOS?
&lt;/h3&gt;

&lt;p&gt;Al menos dos piezas documentadas públicamente: el repositorio de apps en apps.grapheneos.org (compatible con F-Droid) y el servicio de atestación remota en attestation.app.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué significa exactamente "convertir infraestructura interna" en este anuncio?
&lt;/h3&gt;

&lt;p&gt;El mensaje disponible públicamente no detalla el sistema específico ni el destino de la migración; solo confirma que el proceso está bien avanzado.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Necesito una cuenta para consultar la API de una instancia de Mastodon?
&lt;/h3&gt;

&lt;p&gt;No. Endpoints como &lt;code&gt;/api/v2/instance&lt;/code&gt; son públicos por diseño del protocolo ActivityPub y no requieren autenticación.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuánto hardware necesito para autoalojar Mastodon?
&lt;/h3&gt;

&lt;p&gt;Para una instancia pequeña, la documentación oficial recomienda como referencia habitual 2 vCPU y 4 GB de RAM, además de espacio en disco para PostgreSQL y almacenamiento de medios.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué un proyecto de privacidad como GrapheneOS prioriza infraestructura propia?
&lt;/h3&gt;

&lt;p&gt;Porque reduce la cantidad de terceros que pueden decidir sobre disponibilidad, moderación o acceso a los datos de sus propios servicios críticos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://grapheneos.social/@GrapheneOS/117225539756835649" rel="noopener noreferrer"&gt;Publicación original en grapheneos.social&lt;/a&gt;: el anuncio oficial de GrapheneOS sobre la conversión de infraestructura interna.- &lt;a href="https://grapheneos.org" rel="noopener noreferrer"&gt;GrapheneOS (sitio oficial)&lt;/a&gt;: documentación del proyecto y sus principios de seguridad.- &lt;a href="https://github.com/GrapheneOS" rel="noopener noreferrer"&gt;GrapheneOS en GitHub&lt;/a&gt;: repositorios de código fuente del sistema operativo y sus herramientas.- &lt;a href="https://docs.joinmastodon.org/admin/install/" rel="noopener noreferrer"&gt;Guía oficial de instalación de Mastodon&lt;/a&gt;: documentación de referencia para autoalojar una instancia.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📱 &lt;strong&gt;¿Te gusta este contenido?&lt;/strong&gt; Únete a nuestro canal de Telegram &lt;a href="https://t.me/programacion" rel="noopener noreferrer"&gt;@programacion&lt;/a&gt; donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>android</category>
      <category>ios</category>
      <category>programming</category>
    </item>
    <item>
      <title>Nitter resiste el cese y desistimiento de X Corp del 24 de agosto</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Sun, 06 Sep 2026 20:32:37 +0000</pubDate>
      <link>https://dev.to/lu1tr0n/nitter-resiste-el-cese-y-desistimiento-de-x-corp-del-24-de-agosto-4m0a</link>
      <guid>https://dev.to/lu1tr0n/nitter-resiste-el-cese-y-desistimiento-de-x-corp-del-24-de-agosto-4m0a</guid>
      <description>&lt;p&gt;El 24 de agosto de 2026, X Corp envió cartas de cese y desistimiento exigiendo el cierre permanente de todas las instancias de &lt;strong&gt;Nitter&lt;/strong&gt; y la eliminación de su repositorio en GitHub. Doce días después, el proyecto respondió con una sola línea en su README: tras recibir asesoría legal, Nitter continúa activo y promete más detalles pronto.&lt;/p&gt;

&lt;p&gt;Nitter es un front-end alternativo y de código abierto para Twitter/X, pensado para navegar sin JavaScript, sin rastreo y sin publicidad. La confirmación llegó directamente en el &lt;a href="https://github.com/zedeus/nitter/commit/1428b4c2b4246f92a7e5b2673438e5fb39fcc4a3" rel="noopener noreferrer"&gt;commit 1428b4c del repositorio oficial&lt;/a&gt;, firmado por su creador, zedeus.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;El 24 de agosto de 2026, X Corp envió cartas de cese y desistimiento a zedeus exigiendo cerrar Nitter y borrar su repositorio en GitHub.- Tras recibir asesoría legal, el proyecto confirmó que Nitter continúa activo; prometió más detalles próximamente.- El anuncio se publicó en el README, en el commit 1428b4c2b4246f92a7e5b2673438e5fb39fcc4a3 del repositorio oficial.- Nitter funciona sin JavaScript y sin anuncios; el navegador nunca habla directamente con los servidores de Twitter/X.- Para el perfil @nim_lang, la página de Nitter pesa 60 KB frente a los 784 KB de twitter.com.- El proyecto está bajo licencia AGPLv3, que prohíbe expresamente instancias propietarias cerradas.- El mismo commit sumó Ko-fi a las vías de donación, junto a GitHub Sponsors, Patreon y Liberapay.- El roadmap da por resuelto el soporte de embeds y deja pendientes cuentas con timeline y archivado de tweets.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Qué pasó
&lt;/h2&gt;

&lt;p&gt;Un cese y desistimiento (cease and desist) es una carta legal que exige detener una actividad bajo amenaza de demanda; no es una demanda en sí misma, pero suele ser el paso previo. Según el &lt;a href="https://github.com/zedeus/nitter/commit/1428b4c2b4246f92a7e5b2673438e5fb39fcc4a3" rel="noopener noreferrer"&gt;commit que actualizó el README de Nitter&lt;/a&gt;, X Corp envió estas cartas el 24 de agosto de 2026 pidiendo dos cosas concretas: que se cerraran todas las instancias públicas de Nitter y que se eliminara el repositorio del proyecto en GitHub.&lt;/p&gt;

&lt;p&gt;El README original solo describía la amenaza. La actualización posterior, la misma que analiza este artículo, agrega una nota corta pero decisiva: &lt;strong&gt;"Following legal advice, the Nitter project will continue"&lt;/strong&gt;. No se detalla todavía qué argumento legal respalda esa decisión, ni si hubo negociación directa con X Corp. El propio proyecto adelantó que compartirá más información en los próximos días.&lt;br&gt;
Nitter carga perfiles y tuits sin JavaScript ni rastreo del navegador.&lt;/p&gt;
&lt;h2&gt;
  
  
  Contexto e historia
&lt;/h2&gt;

&lt;p&gt;Nitter nació en 2019 como una alternativa liviana a Twitter, inspirada directamente en el proyecto &lt;a href="https://github.com/iv-org/invidious" rel="noopener noreferrer"&gt;Invidious&lt;/a&gt;, el front-end abierto para YouTube. La idea central es la misma en ambos casos: un servidor intermedio que consulta la API del servicio original y le entrega al usuario una página limpia, sin scripts de rastreo ni anuncios.&lt;/p&gt;

&lt;p&gt;Durante años, Nitter dependió de tokens de invitado (guest tokens) de la API no oficial de Twitter, un mecanismo pensado para la app móvil que no exigía registrar una cuenta de desarrollador. Ese acceso se volvió más frágil a partir de 2023, cuando Twitter (ya rebautizada X) empezó a restringir el uso gratuito de su API. En 2024, buena parte de las instancias públicas de Nitter dejaron de responder cuando X bloqueó el flujo de tokens del que dependían, y solo un puñado de instancias mantenidas por voluntarios logró sobrevivir a fuerza de parches constantes.&lt;/p&gt;

&lt;p&gt;El episodio de agosto de 2026 es distinto en un punto importante: la amenaza no apunta solo a instancias individuales, algo que ya había pasado antes, sino al repositorio y al proyecto como tal. Es la primera vez que X Corp intenta cerrar Nitter en su origen y no solo en sus copias públicas.&lt;/p&gt;
&lt;h2&gt;
  
  
  Detalles técnicos y rendimiento
&lt;/h2&gt;

&lt;p&gt;Lo que hace de Nitter algo más que un simple espejo de Twitter/X es su arquitectura: el navegador del usuario nunca se conecta a los servidores de X, solo a la instancia de Nitter, que actúa como intermediaria. Esto tiene consecuencias directas en privacidad y en peso de página.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sin JavaScript obligatorio&lt;/strong&gt;: la interfaz se genera en HTML del lado del servidor.- &lt;strong&gt;Cero anuncios&lt;/strong&gt;: no hay integración con la red publicitaria de X.- &lt;strong&gt;Aislamiento del cliente&lt;/strong&gt;: todas las peticiones pasan por el backend de Nitter, así que X nunca ve la IP ni la huella digital del navegador del usuario final.- &lt;strong&gt;API no oficial&lt;/strong&gt;: usa el mismo acceso que la app móvil de Twitter, sin necesidad de cuenta de desarrollador.- &lt;strong&gt;Peso reducido&lt;/strong&gt;: para el perfil @nim_lang, Nitter pesa 60 KB frente a los &lt;strong&gt;784 KB&lt;/strong&gt; que carga la versión oficial de twitter.com, según cifras publicadas en el propio &lt;a href="https://github.com/zedeus/nitter" rel="noopener noreferrer"&gt;repositorio&lt;/a&gt;.- &lt;strong&gt;RSS por instancia&lt;/strong&gt;: cada instancia puede exponer feeds RSS, aunque muchas los desactivan por abuso de scraping.- &lt;strong&gt;Licencia AGPLv3&lt;/strong&gt;: obliga a que cualquier fork, incluso corriendo como servicio web, publique su código fuente. La &lt;a href="https://www.gnu.org/licenses/agpl-3.0.html" rel="noopener noreferrer"&gt;AGPLv3&lt;/a&gt; es justamente la licencia elegida para impedir instancias propietarias cerradas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Así se ve el flujo de una petición típica: el cliente nunca toca los servidores de X, solo la instancia de Nitter.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TD
    A["Navegador del usuario"] --&amp;gt; B["Instancia Nitter"]
    B --&amp;gt; C["API no oficial de Twitter/X"]
    B --&amp;gt; D[("Cache Redis")]
    subgraph Backend
    B
    D
    end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;OpciónCuándo usarlaVentajaLimitaciónInstancia pública de NitterConsulta rápida sin instalar nadaCero configuraciónDepende de que alguien más la mantenga en pieInstancia propia (self-host)Uso frecuente o para un equipoControl total y disponibilidad propiaRequiere mantenimiento y expone al operador a riesgo legalTwitter/X oficialCuando se necesita interactuar (publicar, comentar)Funcionalidad completaJavaScript, anuncios y rastreo activados&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo probarlo
&lt;/h2&gt;

&lt;p&gt;Nitter puede levantarse localmente con Docker Compose en minutos. Esta es la configuración mínima, con Redis como caché obligatorio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3.8"&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;nitter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;zedeus/nitter:latest&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8080:8080"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./nitter.conf:/src/nitter.conf:ro&lt;/span&gt;
    &lt;span class="na"&gt;depends_on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;nitter-redis&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
  &lt;span class="na"&gt;nitter-redis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis:7-alpine&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis-server --save '' --appendonly no&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;unless-stopped&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con eso arriba, &lt;code&gt;docker compose up -d&lt;/code&gt; levanta el servicio en &lt;code&gt;localhost:8080&lt;/code&gt;. El siguiente paso es escribir el archivo &lt;code&gt;nitter.conf&lt;/code&gt; que ese contenedor monta como solo lectura, con la configuración real de la instancia:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[Server]&lt;/span&gt;
&lt;span class="py"&gt;address&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.0.0.0"&lt;/span&gt;
&lt;span class="py"&gt;port&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt;
&lt;span class="py"&gt;httpMaxConnections&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="py"&gt;staticDir&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"./public"&lt;/span&gt;
&lt;span class="py"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"mi-instancia"&lt;/span&gt;
&lt;span class="py"&gt;hostname&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"nitter.midominio.dev"&lt;/span&gt;
&lt;span class="py"&gt;https&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;

&lt;span class="nn"&gt;[Cache]&lt;/span&gt;
&lt;span class="py"&gt;redisHost&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"nitter-redis"&lt;/span&gt;
&lt;span class="py"&gt;redisPort&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6379&lt;/span&gt;
&lt;span class="py"&gt;listMinutes&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;240&lt;/span&gt;
&lt;span class="py"&gt;rssMinutes&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;

&lt;span class="nn"&gt;[Config]&lt;/span&gt;
&lt;span class="py"&gt;hmacKey&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"cambiar-por-una-clave-generada-con-openssl"&lt;/span&gt;
&lt;span class="py"&gt;enableRSS&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="py"&gt;enableDebug&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;

&lt;span class="nn"&gt;[Preferences]&lt;/span&gt;
&lt;span class="py"&gt;replaceTwitter&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"nitter.midominio.dev"&lt;/span&gt;
&lt;span class="py"&gt;proxyVideos&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La clave &lt;code&gt;hmacKey&lt;/code&gt; conviene generarla con &lt;code&gt;openssl rand -hex 32&lt;/code&gt; antes de exponer la instancia a internet. En Windows, macOS y Linux el flujo es idéntico porque todo corre dentro de contenedores: solo cambia el binario de Docker Desktop (Windows/macOS) o Docker Engine (Linux).&lt;/p&gt;

&lt;p&gt;Para confirmar que la instancia responde correctamente, basta con pedir la cabecera HTTP de la página de estado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sI&lt;/span&gt; https://nitter.midominio.dev/about | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 1
&lt;span class="c"&gt;# HTTP/1.1 200 OK confirma que la instancia esta activa&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Ojo:&lt;/strong&gt; operar una instancia pública de Nitter implica hacer scraping de la API no oficial de X, algo que puede tener consecuencias legales según la jurisdicción. Revisá los términos de servicio locales antes de exponerla a internet.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Impacto y análisis
&lt;/h2&gt;

&lt;p&gt;El anuncio de continuidad es una buena noticia para periodistas, investigadores y usuarios que dependen de Nitter para acceder a contenido público de X sin crear cuenta ni exponerse a rastreo. También es una señal para el resto del ecosistema de front-ends alternativos (a YouTube, a Reddit, a Instagram): la amenaza legal directa al repositorio, y no solo a las instancias, marca un precedente que otros proyectos similares van a mirar de cerca.&lt;/p&gt;

&lt;p&gt;La licencia AGPLv3 del proyecto juega un rol clave acá. Aunque X Corp lograra forzar el cierre del repositorio principal en GitHub, cualquier fork existente conserva el derecho legal a seguir publicando el código, siempre que mantenga la misma licencia. Es una protección estructural, no una garantía de que no haya consecuencias para zedeus como individuo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💭 Clave:&lt;/strong&gt; la amenaza legal no cambia la dependencia técnica de fondo: Nitter sigue funcionando porque X no ha bloqueado por completo el acceso que usa, no porque tenga un acuerdo con la empresa.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ahí está la limitación honesta de esta historia: la continuidad legal del proyecto no resuelve el problema técnico de fondo. Nitter depende de una API no documentada que X puede cerrar en cualquier momento, como ya pasó parcialmente en 2024. Ganar la batalla legal no evita que una decisión técnica unilateral de X vuelva a tumbar instancias de un día para otro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué sigue
&lt;/h2&gt;

&lt;p&gt;El propio README promete "más detalles pronto", sin fecha concreta. Lo que hay que observar en las próximas semanas: si zedeus publica el argumento legal usado para resistir el cese y desistimiento, si X Corp escala a una demanda formal, y si el proyecto anuncia cambios operativos (por ejemplo, mover el repositorio a otro forge o modificar cómo se distribuyen las instancias públicas). El commit también sumó Ko-fi a las vías de donación existentes (GitHub Sponsors, Patreon, Liberapay), lo que sugiere que financiar una eventual defensa legal es parte de la conversación.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Tip:&lt;/strong&gt; si querés apoyar al proyecto, las cuatro vías activas hoy son GitHub Sponsors, Patreon, Liberapay y Ko-fi, todas enlazadas desde el repositorio oficial.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;📖 Resumen en Telegram: Ver resumen&lt;/p&gt;

&lt;p&gt;Probalo vos: cloná el repositorio con &lt;code&gt;git clone https://github.com/zedeus/nitter&lt;/code&gt; y levantá tu propia instancia hoy con el docker-compose de arriba.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Qué es exactamente un cese y desistimiento?
&lt;/h3&gt;

&lt;p&gt;Es una carta legal donde una parte exige que otra detenga una actividad específica bajo amenaza de acción judicial. No implica una demanda automática, pero suele ser el paso previo si no hay respuesta.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Nitter sigue funcionando hoy?
&lt;/h3&gt;

&lt;p&gt;Sí. Según el README oficial actualizado el 24 de agosto de 2026, el proyecto continúa activo tras recibir asesoría legal, aunque todavía no publicó los detalles completos de esa decisión.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Es legal usar una instancia pública de Nitter?
&lt;/h3&gt;

&lt;p&gt;Depende de la jurisdicción y de los términos de servicio que aplique cada usuario final. Usar una instancia como lector es distinto, legalmente, a operar una instancia que hace scraping constante de la API de X.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Necesito una cuenta de Twitter/X para usar Nitter?
&lt;/h3&gt;

&lt;p&gt;No. Nitter usa la API no oficial que la app móvil de Twitter/X expone sin requerir autenticación de desarrollador, por eso no hace falta cuenta ni token propio.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo dono para apoyar el proyecto?
&lt;/h3&gt;

&lt;p&gt;El repositorio lista cuatro vías activas: GitHub Sponsors, Patreon, Liberapay y, desde este mismo commit, Ko-fi.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué pasa si quiero armar mi propia instancia?
&lt;/h3&gt;

&lt;p&gt;Podés seguir la guía de Docker Compose de este artículo. Tené en cuenta el aviso legal: operar una instancia pública implica scraping continuo de X, con el riesgo que eso conlleva según tu jurisdicción.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/zedeus/nitter/commit/1428b4c2b4246f92a7e5b2673438e5fb39fcc4a3" rel="noopener noreferrer"&gt;Commit 1428b4c en zedeus/nitter&lt;/a&gt;: actualización del README que confirma la continuidad del proyecto tras el cese y desistimiento.- &lt;a href="https://github.com/zedeus/nitter" rel="noopener noreferrer"&gt;Repositorio oficial de Nitter&lt;/a&gt;: código fuente, features y roadmap del proyecto.- &lt;a href="https://github.com/zedeus/nitter/wiki/Embeds-guide" rel="noopener noreferrer"&gt;Guía de embeds de Nitter&lt;/a&gt;: documentación de la función de embeds mencionada en el roadmap.- &lt;a href="https://github.com/iv-org/invidious" rel="noopener noreferrer"&gt;Invidious&lt;/a&gt;: el proyecto que inspiró la arquitectura de Nitter para YouTube.- &lt;a href="https://www.gnu.org/licenses/agpl-3.0.html" rel="noopener noreferrer"&gt;Licencia AGPLv3&lt;/a&gt;: los términos bajo los que se distribuye Nitter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📱 &lt;strong&gt;¿Te gusta este contenido?&lt;/strong&gt; Únete a nuestro canal de Telegram &lt;a href="https://t.me/programacion" rel="noopener noreferrer"&gt;@programacion&lt;/a&gt; donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.&lt;/p&gt;

</description>
      <category>technology</category>
      <category>science</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>La automejora recursiva de la IA avanza más lento de lo previsto</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Sun, 06 Sep 2026 16:21:30 +0000</pubDate>
      <link>https://dev.to/lu1tr0n/la-automejora-recursiva-de-la-ia-avanza-mas-lento-de-lo-previsto-in9</link>
      <guid>https://dev.to/lu1tr0n/la-automejora-recursiva-de-la-ia-avanza-mas-lento-de-lo-previsto-in9</guid>
      <description>&lt;p&gt;En 1965, el matemático británico I.J. Good escribió que una máquina capaz de diseñar máquinas mejores que ella misma desataría una "explosión de inteligencia" imparable. Sesenta años después, un análisis publicado por MIT Technology Review el 18 de agosto de 2026 concluye que esa explosión sigue sin llegar.&lt;/p&gt;

&lt;p&gt;El reportaje repasa por qué la &lt;strong&gt;automejora recursiva&lt;/strong&gt; (recursive self-improvement o RSI), la idea de que un sistema de IA entrena a su propio sucesor sin intervención humana, avanza mucho más despacio de lo que anticipaban quienes apostaban por un despegue rápido hacia la superinteligencia.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;MIT Technology Review publicó el 18 de agosto de 2026 un análisis que cuestiona la velocidad de la automejora recursiva en sistemas de IA.- La idea de la "explosión de inteligencia" proviene de un texto de 1965 del matemático I.J. Good.- Sistemas actuales como el Darwin Gödel Machine de Sakana AI ya editan su propio código, pero de forma acotada y supervisada.- Los cuellos de botella identificados incluyen el costo de cómputo creciente, la escasez de datos nuevos de calidad y la falta de evaluación externa objetiva.- AutoML-Zero (Google, 2020) demostró que buscar arquitecturas desde cero funciona, pero con un costo computacional que escala con el espacio de búsqueda.- El riesgo técnico central es el sobreajuste a benchmarks propios cuando el mismo sistema genera y evalúa sus mejoras.- El debate divide a la comunidad de IA entre quienes ven una meseta de rendimiento y quienes sostienen que el despegue rápido solo se retrasó.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Qué pasó
&lt;/h2&gt;

&lt;p&gt;El artículo de MIT Technology Review, publicado el 18 de agosto de 2026, plantea una pregunta directa: si los laboratorios de IA llevan años prometiendo sistemas capaces de mejorarse a sí mismos sin ayuda humana, ¿por qué la &lt;strong&gt;automejora recursiva&lt;/strong&gt; no se traduce todavía en el despegue exponencial que predecían los teóricos de la singularidad?&lt;/p&gt;

&lt;p&gt;El texto ubica el debate en 2026. Es el año en que varios laboratorios, incluidos los que financia la iniciativa estadounidense Genesis Mission con 5.000 millones de dólares para IA aplicada a la ciencia, apuestan a que la propia IA acelere su investigación futura. La National Science Foundation también construye infraestructura de cómputo específica para investigación en IA, según reportó Government Executive el mismo mes. El argumento central del análisis es otro: la automejora recursiva en sentido estricto, un sistema que entrena, evalúa y despliega a su sucesor sin intervención humana, todavía no se observa a la escala que predecía la teoría del despegue rápido.&lt;br&gt;
La automejora recursiva supone que un sistema entrena a su sucesor sin intervención humana.&lt;/p&gt;
&lt;h2&gt;
  
  
  Contexto e historia
&lt;/h2&gt;
&lt;h3&gt;
  
  
  De 1965 a la singularidad
&lt;/h3&gt;

&lt;p&gt;El concepto no es nuevo. I.J. Good, criptógrafo que trabajó junto a Alan Turing en Bletchley Park, escribió en 1965 que una "máquina ultrainteligente" podría diseñar máquinas todavía mejores, generando una &lt;a href="https://en.wikipedia.org/wiki/Intelligence_explosion" rel="noopener noreferrer"&gt;explosión de inteligencia&lt;/a&gt; que dejaría atrás cualquier capacidad humana de control. En 1993, el matemático y escritor Vernor Vinge popularizó la idea bajo el nombre de "singularidad tecnológica". Nick Bostrom retomó el debate en su libro &lt;em&gt;Superintelligence&lt;/em&gt;, distinguiendo entre un "despegue rápido" (cuestión de días o meses) y un "despegue lento" (cuestión de años o décadas).&lt;/p&gt;

&lt;p&gt;La pregunta que plantea el análisis de 2026 es en qué punto de ese espectro está realmente la tecnología actual. La &lt;a href="https://en.wikipedia.org/wiki/Recursive_self-improvement" rel="noopener noreferrer"&gt;automejora recursiva&lt;/a&gt;, en su forma más pura, requiere que un sistema no solo genere mejoras candidatas, sino que además las evalúe y las adopte sin que un humano revise el resultado.&lt;/p&gt;
&lt;h3&gt;
  
  
  Los intentos reales, generación por generación
&lt;/h3&gt;

&lt;p&gt;Varios proyectos ya exploran versiones acotadas de esta idea. AutoML-Zero, publicado por investigadores de Google en 2020, mostró que un sistema de búsqueda evolutiva puede descubrir desde cero algoritmos de aprendizaje automático competitivos, sin partir de arquitecturas diseñadas por humanos. AlphaZero y sus sucesores demostraron que el autojuego (self-play) permite a un sistema superar el nivel humano en juegos de información perfecta sin ver una sola partida jugada por personas. Más recientemente, Sakana AI presentó el Darwin Gödel Machine, un agente que reescribe su propio código fuente para mejorar su desempeño en tareas de programación, evaluando cada versión contra un conjunto de benchmarks antes de adoptarla.&lt;/p&gt;
&lt;h2&gt;
  
  
  Detalles técnicos y rendimiento de la automejora recursiva
&lt;/h2&gt;

&lt;p&gt;Técnicamente, un ciclo de automejora recursiva necesita tres piezas: un generador de variantes, un evaluador y un mecanismo de selección. El generador propone cambios al modelo, al código o a la arquitectura. El evaluador mide si la variante es mejor. El mecanismo de selección decide si esa variante reemplaza a la versión anterior. El diagrama siguiente resume ese ciclo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TD
    A["Modelo base"] --&amp;gt; B["Genera una mejora candidata"]
    B --&amp;gt; C["Evalua la mejora en un benchmark fijo"]
    C --&amp;gt; D{"Mejora el puntaje?"}
    D --&amp;gt;|"Si"| E["Adopta la nueva version"]
    D --&amp;gt;|"No"| F["Descarta y ajusta la busqueda"]
    E --&amp;gt; A
    F --&amp;gt; B
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La siguiente tabla compara los enfoques que hoy se usan como aproximaciones parciales a la automejora recursiva, cada uno con una limitación práctica distinta:&lt;br&gt;
EnfoqueQué mejoraEjemplo conocidoLimitación prácticaBúsqueda de arquitecturas (AutoML/NAS)La arquitectura del modeloAutoML-Zero (Google, 2020)El costo de cómputo crece con el tamaño del espacio de búsquedaAutojuego (self-play)La política de decisiónAlphaZero y sus sucesoresFunciona bien solo en entornos con una señal de recompensa claraAutoedición de códigoEl propio código del agenteDarwin Gödel Machine (Sakana AI)Riesgo de sobreajustar a sus propios benchmarks de evaluaciónDestilación generacionalLos pesos del modelo sucesorEsquemas profesor-alumnoLa calidad del alumno queda acotada por la señal del profesor&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Ojo:&lt;/strong&gt; cuando el mismo sistema que propone una mejora también decide si esa mejora es buena, el resultado tiende a sobreajustarse al criterio propio en lugar de mejorar en el mundo real. Por eso todo sistema de automejora recursiva serio necesita un benchmark externo y fijo que el generador nunca pueda modificar.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Un ciclo simplificado, sin ningún componente de IA real, ayuda a entender la mecánica de fondo. El siguiente ejemplo simula una búsqueda de tipo "hill climbing" que conserva la mejor variante encontrada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generar_variante&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;programa&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;programa&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;  # variante generada&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;evaluar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;programa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;benchmark&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;benchmark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;programa&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;mejor_programa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;programa_inicial&lt;/span&gt;
&lt;span class="n"&gt;mejor_puntaje&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;evaluar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mejor_programa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;benchmark_tareas&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;iteracion&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;candidato&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;generar_variante&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mejor_programa&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;puntaje&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;evaluar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;candidato&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;benchmark_tareas&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;puntaje&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;mejor_puntaje&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;mejor_programa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mejor_puntaje&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;candidato&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;puntaje&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Mejor puntaje tras 20 iteraciones:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mejor_puntaje&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este bucle solo conserva una variante si supera a la anterior en el mismo benchmark. Con 20 iteraciones y un benchmark simple, el puntaje final debería ser igual o mayor al inicial. Si no mejora nada, es señal de que el generador de variantes no está explorando cambios útiles: el mismo problema de fondo que describe el análisis de MIT Technology Review a mayor escala.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo probarlo
&lt;/h2&gt;

&lt;p&gt;Para experimentar con un ciclo de automejora aplicado a código real, el patrón más simple es combinar una suite de tests con llamadas a un modelo de lenguaje que proponga correcciones cuando los tests fallan:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;pedir_mejora_al_modelo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;codigo_actual&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resultados_tests&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;contexto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Código actual y tests que fallan:&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;contexto&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;codigo_actual&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;resultados_tests&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; Proponé una version corregida que pase los tests.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;llamar_llm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;correr_tests&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;pytest&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-q&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;capture_output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;returncode&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resultado&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;

&lt;span class="n"&gt;codigo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;leer_archivo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;agente.py&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;ronda&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;salida&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;correr_tests&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;
    &lt;span class="n"&gt;codigo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pedir_mejora_al_modelo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;codigo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;salida&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;escribir_archivo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;agente.py&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;codigo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La función &lt;code&gt;llamar_llm&lt;/code&gt; representa cualquier cliente de API de un modelo de lenguaje. El punto clave no es qué proveedor se use, sino que &lt;code&gt;correr_tests()&lt;/code&gt; siempre se ejecuta contra la misma suite fija, sin que el modelo pueda editarla. Eso es lo que evita que el generador haga trampa reescribiendo también el criterio de evaluación.&lt;/p&gt;

&lt;p&gt;Para verificar si una ronda realmente mejoró el desempeño, y no solo el puntaje que el propio modelo reporta, conviene guardar el resultado contra un conjunto de pruebas separado ("held out") que nunca se le muestra al modelo generador, y comparar ambos puntajes con un comando simple, por ejemplo &lt;code&gt;python benchmark.py --version v3 --set held_out&lt;/code&gt;. Si el puntaje sobre el conjunto reservado no sube al mismo ritmo que el de entrenamiento, hay sobreajuste.&lt;br&gt;
Sakana AI probó agentes que reescriben su propio código de forma acotada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Impacto y análisis
&lt;/h2&gt;

&lt;p&gt;Si la automejora recursiva avanza más despacio de lo previsto, las consecuencias no son solo académicas. Buena parte del capex de IA anunciado en 2026 asume que la propia IA acelerará su propia investigación. Eso incluye programas como la Genesis Mission de Estados Unidos y el refuerzo de infraestructura de la NSF. Si ese efecto compuesto tarda más en llegar, los cronogramas de esas apuestas también deberían ajustarse.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💭 Clave:&lt;/strong&gt; hay una diferencia importante entre "la IA hace más productivos a los investigadores humanos" (algo que ya ocurre, con herramientas de código asistido por agentes) y "la IA entrena a su sucesor sin humanos en el ciclo" (la definición estricta de automejora recursiva). Lo primero es real hoy; lo segundo sigue siendo, en gran medida, una proyección.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;El análisis también toca un punto sensible: la dificultad de medir progreso cuando el propio sistema evaluado participa en diseñar su métrica. Es el mismo problema de fondo que motivó, en paralelo, un trabajo académico distinto. En agosto de 2026, la Seoul National University of Science and Technology presentó un marco para poner a prueba la robustez de sistemas de visión por computadora frente a variaciones que el propio modelo no generó.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué sigue
&lt;/h2&gt;

&lt;p&gt;El propio reportaje deja la puerta abierta a que la automejora recursiva sí llegue, pero por un camino más gradual: mejoras compuestas, donde un modelo ligeramente mejor entrena a la siguiente generación con datos ligeramente mejores, en lugar de un salto discontinuo. En paralelo, crece el interés en investigación centrada en la colaboración humano-IA en lugar de la sustitución total. Un equipo de Carnegie Mellon University publicó en agosto de 2026 un estudio que plantea a los humanos y la IA como "compañeros de equipo" en tareas de investigación, un enfoque que no depende de que el sistema se automejore solo.&lt;/p&gt;

&lt;p&gt;Lo más probable, a corto plazo, es que el debate se resuelva con más papers empíricos que midan directamente cuánto mejora un sistema entrenado por su predecesor sin intervención humana, en lugar de extrapolaciones teóricas sobre curvas de escalado.&lt;/p&gt;

&lt;p&gt;📖 Resumen en Telegram: Ver resumen&lt;/p&gt;

&lt;p&gt;Probalo vos: cloná un proyecto pequeño con una suite de tests automatizados, armá un bucle de cinco rondas como el del ejemplo de arriba y compará el puntaje contra un conjunto de pruebas reservado que nunca le muestres al modelo generador.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Qué es la automejora recursiva (recursive self-improvement)?
&lt;/h3&gt;

&lt;p&gt;Es la idea de que un sistema de inteligencia artificial puede diseñar, entrenar y desplegar una versión mejorada de sí mismo sin que un humano intervenga en ese ciclo, generación tras generación.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿De dónde viene la idea de una "explosión de inteligencia"?
&lt;/h3&gt;

&lt;p&gt;El matemático I.J. Good la planteó en 1965: una máquina "ultrainteligente" podría diseñar máquinas todavía mejores, en una cadena que se aceleraría sola.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué encontró el análisis de MIT Technology Review?
&lt;/h3&gt;

&lt;p&gt;Que la automejora recursiva, en su forma estricta, avanza mucho más despacio de lo que predecían los defensores de un despegue rápido, por cuellos de botella técnicos concretos como el costo de cómputo y la falta de evaluación externa objetiva.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Hay sistemas que ya se automejoren hoy?
&lt;/h3&gt;

&lt;p&gt;Existen aproximaciones parciales y supervisadas, como AutoML-Zero, AlphaZero y el Darwin Gödel Machine de Sakana AI, pero ninguno opera sin algún tipo de benchmark o supervisión fijados por humanos.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuál es el principal riesgo técnico de estos sistemas?
&lt;/h3&gt;

&lt;p&gt;Que el mismo sistema que genera una mejora también la evalúe, lo que favorece el sobreajuste a un criterio propio en lugar de una mejora real y generalizable.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Esto significa que la superinteligencia no va a llegar?
&lt;/h3&gt;

&lt;p&gt;No necesariamente. El análisis sugiere que el camino sería más gradual y compuesto, con mejoras incrementales entre generaciones, en lugar del despegue exponencial y discontinuo que planteaba la teoría original.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.technologyreview.com/2026/08/18/1142188/ai-recursive-self-improvement/" rel="noopener noreferrer"&gt;MIT Technology Review&lt;/a&gt;: el análisis original sobre por qué la automejora recursiva de la IA avanza más lento de lo esperado.- &lt;a href="https://en.wikipedia.org/wiki/Recursive_self-improvement" rel="noopener noreferrer"&gt;Wikipedia&lt;/a&gt;: definición y contexto histórico del concepto de automejora recursiva.- &lt;a href="https://en.wikipedia.org/wiki/Intelligence_explosion" rel="noopener noreferrer"&gt;Wikipedia&lt;/a&gt;: origen del concepto de explosión de inteligencia a partir del texto de I.J. Good de 1965.- &lt;a href="https://sakana.ai" rel="noopener noreferrer"&gt;Sakana AI&lt;/a&gt;: laboratorio detrás del Darwin Gödel Machine, un agente que edita su propio código fuente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📱 &lt;strong&gt;¿Te gusta este contenido?&lt;/strong&gt; Únete a nuestro canal de Telegram &lt;a href="https://t.me/programacion" rel="noopener noreferrer"&gt;@programacion&lt;/a&gt; donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Pangram 4: el detector de texto de IA que ya casi no falla</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Sun, 06 Sep 2026 14:27:37 +0000</pubDate>
      <link>https://dev.to/lu1tr0n/pangram-4-el-detector-de-texto-de-ia-que-ya-casi-no-falla-14n3</link>
      <guid>https://dev.to/lu1tr0n/pangram-4-el-detector-de-texto-de-ia-que-ya-casi-no-falla-14n3</guid>
      <description>&lt;p&gt;El 78% de los desarrolladores deja de leer un texto apenas sospecha que lo escribió una IA, y el 71% evita al autor para siempre, según una &lt;a href="https://bcantrill.dtrace.org/2026/09/05/the-revolt-of-the-reader/" rel="noopener noreferrer"&gt;encuesta a 668 desarrolladores&lt;/a&gt; citada por Bryan Cantrill, CTO de Oxide Computer.&lt;/p&gt;

&lt;p&gt;Cantrill publicó &lt;em&gt;The revolt of the reader&lt;/em&gt; el 5 de septiembre de 2026 y pone en el centro a &lt;strong&gt;Pangram 4&lt;/strong&gt;, el detector de texto generado por IA de Pangram Labs, con una precisión que describe como sorprendentemente alta.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;El 78% de los desarrolladores deja de leer si detecta IA, y el 71% evita al autor después.&lt;/li&gt;
&lt;li&gt;El 98% de los encuestados prefiere un texto propio imperfecto antes que uno pulido por IA.&lt;/li&gt;
&lt;li&gt;Bryan Cantrill publicó "The revolt of the reader" el 5 de septiembre de 2026 en su blog.&lt;/li&gt;
&lt;li&gt;Pangram Labs lanzó Pangram 3 a fines de 2025 y Pangram 4 hace poco más de un mes.&lt;/li&gt;
&lt;li&gt;Cantrill compara la detección de texto con IA con la guerra contra el spam de los 2000.&lt;/li&gt;
&lt;li&gt;RFD 576 de Oxide Computer dice que usar IA para escribir anula el contrato social lector-autor.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Qué pasó
&lt;/h2&gt;

&lt;p&gt;Bryan Cantrill escribe ensayos largos en dtrace.org desde hace más de una década, casi siempre sobre ingeniería de sistemas y cultura de trabajo en Oxide Computer. El publicado el 5 de septiembre de 2026 rompe ese patrón: en vez de hablar de hardware o de Rust, habla de por qué dejó de confiar en textos ajenos.&lt;/p&gt;

&lt;p&gt;Su punto de partida es personal. Cantrill dice notar señales evidentes en textos con ayuda sustancial de un LLM: frases de transición vacías, afirmaciones que se autoelogian ("y por eso este enfoque importa") y una uniformidad de ritmo que un lector entrenado detecta en segundos. Antes esa sospecha era subjetiva. Ahora, dice, hay una herramienta que la confirma: Pangram 4.&lt;/p&gt;

&lt;p&gt;El propio Cantrill había anticipado buena parte de este argumento en &lt;strong&gt;RFD 576&lt;/strong&gt;, un documento interno de diseño de Oxide Computer: escribir con ayuda sustancial de una IA, sin que el lector lo sepa, anula el contrato social entre autor y lector. Ese contrato, dice, obliga al lector a esforzarse por entender una oración solo si el autor también se esforzó por escribirla.&lt;/p&gt;

&lt;p&gt;Pangram Labs lanzó &lt;strong&gt;Pangram 3&lt;/strong&gt; a fines de 2025. Cantrill lo adoptó como herramienta diaria y reporta una tasa de falsos positivos muy baja: cuando el modelo marcaba un texto como mayormente escrito por IA, la sospecha se confirmaba casi siempre. Hace poco más de un mes la empresa lanzó &lt;strong&gt;Pangram 4&lt;/strong&gt;, que Cantrill describe como un salto de tipo step-function sobre su predecesor, con una tasa de falsos positivos aún más baja y también menos falsos negativos.&lt;/p&gt;

&lt;p&gt;Pangram Labs lanzó su primer modelo, Pangram 3, a fines de 2025.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contexto: la guerra contra el spam se repite
&lt;/h2&gt;

&lt;p&gt;Cantrill traza un paralelo directo con el correo no deseado. A inicios de los 2000 muchos temieron que el spam terminara con el correo electrónico como herramienta útil: la bandeja de entrada se volvía inutilizable. La bisagra llegó a fines de esa década, cuando el filtrado de spam mejoró lo suficiente como para romper la economía del spammer: enviar correo masivo dejó de ser rentable si nadie lo veía.&lt;/p&gt;

&lt;p&gt;Ese cambio trajo un efecto secundario importante: ser etiquetado como spam pasó a tener un costo altísimo. Hoy una empresa que cae en listas negras de correo puede perder su dominio y su reputación en cuestión de días. Cantrill sostiene que algo parecido puede pasarle a la escritura asistida por IA sin declarar: a medida que detectores como Pangram 4 se vuelven confiables, ser identificado como autor de texto generado por IA empieza a tener el mismo costo reputacional que ser marcado como spam.&lt;/p&gt;

&lt;p&gt;La diferencia es que el filtro no lo aplica un servidor de correo: lo aplica el propio lector, en tiempo real, decidiendo si sigue leyendo o cierra la pestaña.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo funciona Pangram 4 y otros detectores de texto con IA
&lt;/h2&gt;

&lt;p&gt;Pangram Labs no publica el detalle exacto de su clasificador, pero la familia de técnicas detrás de este tipo de herramientas es conocida. Un detector típico combina tres señales:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Perplejidad&lt;/strong&gt;: qué tan predecible es cada palabra siguiente según un modelo de lenguaje de referencia. El texto generado por un LLM suele elegir sistemáticamente la palabra más probable, lo que produce una perplejidad más baja y estable que la prosa humana.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Burstiness&lt;/strong&gt;: la variación en la longitud y complejidad de las oraciones. Un humano alterna oraciones largas y cortas de forma irregular; un LLM tiende a un ritmo más uniforme.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Huella estilística&lt;/strong&gt;: repetición de conectores y muletillas típicas de un LLM ("cabe destacar", "es importante señalar", "en resumen"), estructura de párrafo muy simétrica y transiciones que se auto-explican.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Con esas señales, el clasificador se entrena con millones de ejemplos etiquetados como humanos o generados por IA, y aprende a separar ambas distribuciones. El resultado es un puntaje de probabilidad, no una certeza binaria: por eso Cantrill insiste en mirar la tasa de falsos positivos y falsos negativos del modelo, no solo su existencia.&lt;/p&gt;

&lt;p&gt;El siguiente diagrama resume el flujo típico de este tipo de clasificadores:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TD
    A["Texto sin firmar"] --&amp;gt; B["Extraccion de senales: perplejidad, burstiness, estilo"]
    B --&amp;gt; C["Clasificador entrenado con texto humano y de LLM"]
    C --&amp;gt; D{"Puntaje de probabilidad"}
    D --&amp;gt;|"alto"| E["Marcado como generado por IA"]
    D --&amp;gt;|"bajo"| F["Marcado como humano"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ninguna de estas señales es infalible por separado. Lo que hace fuerte a un clasificador como Pangram 4 es combinarlas y entrenarlas contra una base de datos enorme y actualizada de ejemplos reales, algo que una heurística casera no puede igualar.&lt;/p&gt;

&lt;p&gt;La varianza en longitud de oraciones es una de las señales que buscan estos clasificadores.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo probarlo: heurísticas DIY antes de publicar
&lt;/h2&gt;

&lt;p&gt;No hace falta pagar por Pangram 4 para hacer una primera pasada de control sobre un borrador. Una heurística simple de burstiness, calculada con la varianza en la longitud de las oraciones, ya sirve como alerta temprana. No reemplaza a un clasificador entrenado, pero ayuda a detectar párrafos sospechosamente uniformes antes de publicarlos.&lt;/p&gt;

&lt;p&gt;Este primer ejemplo calcula la varianza de un párrafo suelto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;burstiness&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;oraciones&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
    &lt;span class="n"&gt;largos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;oraciones&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;promedio&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;largos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;largos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;varianza&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;promedio&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;largos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;largos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;varianza&lt;/span&gt;

&lt;span class="n"&gt;texto_ejemplo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;El texto humano tiende a variar mucho. A veces una oracion es larga y con varias ideas encadenadas. A veces no.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;burstiness&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;texto_ejemplo&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una varianza baja (oraciones de longitud muy parecida) es una señal de alerta; una varianza alta sugiere un ritmo más humano. El siguiente ejemplo aplica la misma idea a un archivo completo, párrafo por párrafo, algo útil para revisar un borrador largo antes de publicarlo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;statistics&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;analizar_parrafos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ruta_archivo&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ruta_archivo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;contenido&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;parrafos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;contenido&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parrafo&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parrafos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;oraciones&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;(? {alerta}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;analizar_parrafos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;borrador.md&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para confirmar que la señal funciona, corré el script sobre un texto que sepas que escribiste vos mismo y sobre una respuesta larga sin editar de un chatbot: si la varianza del segundo es sistemáticamente más baja, la heurística está capturando la señal que buscás. Es la misma verificación que hace cualquier equipo antes de confiar en un modelo: probarlo contra casos de origen conocido.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Ojo:&lt;/strong&gt; ningún detector es infalible. Pangram Labs reconoce una tasa de falsos negativos más alta de la deseada: un texto puede pasar el filtro sin ser enteramente humano. No uses un solo detector, propio o comercial, como prueba definitiva contra un autor.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Impacto y análisis
&lt;/h2&gt;

&lt;p&gt;El dato más incómodo del ensayo de Cantrill no es sobre los detectores, sino sobre los lectores. El 98% de los desarrolladores encuestados dijo preferir un texto propio, con errores, antes que uno pulido por una IA. Eso contradice el argumento más común a favor de usar un LLM para escribir: que mejora la calidad. Para el lector, la autenticidad pesa más que la prolijidad.&lt;/p&gt;

&lt;p&gt;La siguiente tabla compara los enfoques disponibles hoy para detectar o prevenir texto generado por IA sin declarar:&lt;/p&gt;

&lt;p&gt;EnfoqueCómo funcionaVentajaLimitación&lt;/p&gt;

&lt;p&gt;Clasificador propietario (Pangram 4)Modelo entrenado con millones de ejemplos humanos y de LLMMuy baja tasa de falsos positivos, según CantrillCódigo y datos de entrenamiento no son públicos&lt;br&gt;
Heurística de burstiness (DIY)Mide la varianza en longitud de oracionesGratis, corre local, sin dependencias externasFácil de esquivar variando el ritmo a mano&lt;br&gt;
Watermarking del generadorEl modelo marca su propia salida al generarlaDetección casi binaria si el generador cooperaInútil si el autor edita el texto o usa un modelo sin marca&lt;br&gt;
Revisión humana expertaUn lector frecuente reconoce tics de estiloNo depende de ninguna herramienta externaNo escala más allá de unos pocos textos por día&lt;/p&gt;

&lt;p&gt;El trade-off central es honesto y Cantrill lo reconoce: los detectores como Pangram 4 minimizan falsos positivos a costa de dejar pasar algunos textos generados por IA (falsos negativos). Para un editor esto significa que un puntaje bajo no es garantía de autoría humana; es solo evidencia insuficiente para acusar.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💭 Clave:&lt;/strong&gt; el paralelo con el spam no es solo retórico. Cuando el costo de ser detectado supera el beneficio de ahorrar tiempo escribiendo, el comportamiento cambia. Eso fue lo que pasó con el spam de correo a fines de los 2000, y es la apuesta de Cantrill para el texto generado por IA.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Qué sigue
&lt;/h2&gt;

&lt;p&gt;Si la analogía de Cantrill se sostiene, el próximo paso lógico es que plataformas de publicación y comunidades técnicas empiecen a correr detectores como Pangram 4 de forma rutinaria antes de aceptar un artículo, igual que hoy cualquier servidor de correo corre un filtro de spam antes de entregar un mensaje a la bandeja de entrada.&lt;/p&gt;

&lt;p&gt;Eso no resuelve el problema de fondo: un autor puede seguir usando una IA para investigar, ordenar ideas o revisar gramática sin que el texto final se lea como generado. El punto de Cantrill no es prohibir el uso de IA en el proceso de escritura, sino que el resultado final refleje trabajo propio del autor, aunque sea imperfecto.&lt;/p&gt;

&lt;p&gt;Para comunidades como Hacker News, donde según los datos citados el 78% de los lectores abandona apenas detecta IA, la presión ya es real: publicar con ayuda evidente de un LLM deja de ser una decisión neutral y empieza a tener un costo reputacional medible.&lt;/p&gt;

&lt;p&gt;📖 Resumen en Telegram: Ver resumen&lt;/p&gt;

&lt;p&gt;Probalo vos: corré la función de burstiness de este artículo sobre tu último borrador y compará el resultado contra un párrafo que sepas que es 100% tuyo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Qué es Pangram 4?
&lt;/h3&gt;

&lt;p&gt;Es la última versión del detector de texto generado por IA de Pangram Labs, lanzada poco más de un mes antes del ensayo de Cantrill del 5 de septiembre de 2026, con una precisión que Cantrill describe como un salto notable sobre Pangram 3.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Pangram Labs es gratuito?
&lt;/h3&gt;

&lt;p&gt;El research disponible no detalla precios públicos; Pangram Labs ofrece su detector como servicio orientado a editores y plataformas, así que conviene consultar directamente en su sitio oficial para conocer planes actuales.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué el 78% de los desarrolladores abandona un texto con IA?
&lt;/h3&gt;

&lt;p&gt;Según la &lt;a href="https://bcantrill.dtrace.org/2026/09/05/the-revolt-of-the-reader/" rel="noopener noreferrer"&gt;encuesta citada por Cantrill&lt;/a&gt;, los lectores no rechazan la imperfección sino la falta de autenticidad: prefieren un texto propio con errores antes que uno pulido artificialmente.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Se puede engañar a un detector de texto generado por IA?
&lt;/h3&gt;

&lt;p&gt;Sí, editando manualmente el ritmo de las oraciones o reescribiendo pasajes se reduce la señal que buscan estos clasificadores, aunque Cantrill reporta que Pangram 4 mantiene una tasa de falsos negativos baja incluso así.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué es RFD 576 de Oxide Computer?
&lt;/h3&gt;

&lt;p&gt;Es un documento interno de diseño de Oxide Computer, la empresa donde Cantrill es cofundador y CTO, donde argumenta que usar una IA para escribir anula el contrato social entre autor y lector.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué relación hay entre esto y el spam de correo?
&lt;/h3&gt;

&lt;p&gt;Cantrill compara la maduración de los detectores de texto con IA con la mejora del filtrado de spam a fines de los 2000: en ambos casos, cuando la detección se vuelve confiable, el costo reputacional de ser marcado supera el beneficio de la práctica.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://bcantrill.dtrace.org/2026/09/05/the-revolt-of-the-reader/" rel="noopener noreferrer"&gt;The revolt of the reader, de Bryan Cantrill&lt;/a&gt;: el ensayo original sobre la revuelta del lector contra el texto generado por IA.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pangramlabs.com" rel="noopener noreferrer"&gt;Pangram Labs&lt;/a&gt;: la empresa detrás de Pangram 3 y Pangram 4, los detectores de texto generado por IA mencionados en el ensayo.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Email_spam" rel="noopener noreferrer"&gt;Email spam, en Wikipedia&lt;/a&gt;: contexto histórico de la guerra contra el spam que Cantrill usa como analogía.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://oxide.computer" rel="noopener noreferrer"&gt;Oxide Computer Company&lt;/a&gt;: la empresa donde Cantrill es cofundador y CTO, origen del documento interno RFD 576 citado en el ensayo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📱 &lt;strong&gt;¿Te gusta este contenido?&lt;/strong&gt; Únete a nuestro canal de Telegram &lt;a href="https://t.me/programacion" rel="noopener noreferrer"&gt;@programacion&lt;/a&gt; donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.&lt;/p&gt;

</description>
      <category>technology</category>
      <category>science</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>78% de los desarrolladores abandona un texto si detecta escritura de IA</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Sun, 06 Sep 2026 08:22:31 +0000</pubDate>
      <link>https://dev.to/lu1tr0n/78-de-los-desarrolladores-abandona-un-texto-si-detecta-escritura-de-ia-4jj</link>
      <guid>https://dev.to/lu1tr0n/78-de-los-desarrolladores-abandona-un-texto-si-detecta-escritura-de-ia-4jj</guid>
      <description>&lt;p&gt;El 78% de los desarrolladores deja de leer un texto apenas detecta que lo escribió una inteligencia artificial, según una encuesta a 668 developers citada por el ingeniero Bryan Cantrill. El dato aparece en &lt;a href="https://bcantrill.dtrace.org/2026/09/05/the-revolt-of-the-reader/" rel="noopener noreferrer"&gt;"The revolt of the reader"&lt;/a&gt;, un ensayo que Cantrill publicó el 5 de septiembre de 2026 en su blog personal.&lt;/p&gt;

&lt;p&gt;Cantrill, cofundador y CTO de &lt;a href="https://oxide.computer/" rel="noopener noreferrer"&gt;Oxide Computer Company&lt;/a&gt; y uno de los creadores de DTrace, describe algo que llama la revuelta del lector: un rechazo silencioso pero creciente hacia la &lt;strong&gt;escritura generada por ia&lt;/strong&gt; que circula sin aviso en blogs técnicos, redes sociales y hasta documentación de producto.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Bryan Cantrill publicó "The revolt of the reader" el 5 de septiembre de 2026 en bcantrill.dtrace.org.- Encuesta de Cynthia Dunlop a 668 developers: el 78% abandona la lectura al detectar texto de IA.- El 71% de esos lectores evita al mismo autor en publicaciones futuras.- El 98% prefiere un texto propio, imperfecto, antes que uno pulido por IA.- Pangram Labs lanzó Pangram 3 a fines de 2025 y Pangram 4 hacia fines de julio de 2026.- Cantrill compara la ola de escritura con IA con la crisis del spam de e-mail de los 2000.- El ensayo cita la RFD 576 de Oxide: usar IA para escribir anula el contrato social con el lector.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Qué pasó
&lt;/h2&gt;

&lt;p&gt;El ensayo arranca con una confesión personal: Cantrill dice sentir exasperación al ver a colegas que respeta firmar piezas con marcas evidentes de haber sido escritas, o muy asistidas, por un modelo de lenguaje. Su pregunta central tiene dos ramas: ¿los autores creen que los lectores no pueden notarlo, o simplemente no les importa?&lt;/p&gt;

&lt;p&gt;Su respuesta a la primera pregunta es tajante: los lectores frecuentes sí lo notan. Compara las marcas estructurales de la escritura generada por ia con dejarse la bragueta intelectual abierta, algo tan evidente para quien lee mucho que resulta difícil no verlo. Llega a confesar, medio en broma, que fantaseó con condenar a los autores de los textos más flagrantes a leerlos en voz alta ante público, convencido de que ni ellos mismos soportarían escuchar lo que publicaron.&lt;/p&gt;

&lt;p&gt;A la segunda pregunta responde con los números de la encuesta de &lt;em&gt;Cynthia Dunlop&lt;/em&gt;: de 668 developers encuestados, el 78% corta la lectura de inmediato al detectar el patrón, en lo que Cantrill describe como una especie de mecanismo de autopreservación cerebral que expulsa al lector a mitad de oración. El 71% de esas personas evita además al mismo autor en el futuro.&lt;/p&gt;

&lt;p&gt;El dato más incómodo para quienes usan IA para escribir en público es otro: el 98% de los encuestados prefiere un texto propio, con errores, antes que uno pulido por un modelo. La preferencia no es por perfección lingüística, es por autenticidad.&lt;br&gt;
El 71% de los lectores deja de seguir al autor tras detectar el patrón.&lt;/p&gt;
&lt;h2&gt;
  
  
  Contexto e historia
&lt;/h2&gt;

&lt;p&gt;Cantrill traza un paralelo directo con la crisis del &lt;a href="https://en.wikipedia.org/wiki/Email_spam" rel="noopener noreferrer"&gt;spam de correo electrónico&lt;/a&gt; de comienzos de los 2000. En esa época se temía, con razón, que el correo electrónico colapsara bajo el peso del spam: era la aplicación estrella de internet y perderla se sentía catastrófico.&lt;/p&gt;

&lt;p&gt;El punto de inflexión llegó a fines de esa década: los filtros de spam mejoraron tanto que rompieron la economía del spam. Cuando enviar correo masivo dejó de ser rentable en términos de entregabilidad, ser etiquetado como spam pasó de ser una molestia a ser una sentencia de muerte para un dominio. Hoy, cualquier empresa seria cuida con celo su reputación de envío antes de mandar una campaña masiva.&lt;/p&gt;

&lt;p&gt;Cantrill sostiene que la escritura con IA podría seguir el mismo arco: si los lectores identifican el patrón a escala, escribir con IA sin editar dejará de ser simplemente cuestionable para volverse, directamente, contraproducente. En sus propias palabras, usar un modelo para escribir en público anula el contrato social entre quien escribe y quien lee, una idea que ya había desarrollado en la RFD 576 de Oxide.&lt;/p&gt;

&lt;p&gt;Para quien no conoce el sistema de Oxide: las RFD (Request for Discussion) son documentos internos de discusión técnica, similares en espíritu a un ADR (Architecture Decision Record) pero pensados para debatir cualquier decisión de ingeniería o cultura de la empresa antes de tomarla, y suelen hacerse públicos con el tiempo. La RFD 576 es donde Cantrill formalizó por primera vez la idea del contrato social entre autor y lector.&lt;/p&gt;
&lt;h2&gt;
  
  
  Detalles técnicos: cómo se detecta la escritura generada por ia
&lt;/h2&gt;

&lt;p&gt;Antes de confiar en Pangram, Cantrill probó dos caminos que fallaron. El primero fue pedirle a los propios LLM que identificaran texto generado por otro LLM: la tasa de falsos negativos fue demasiado alta, los modelos aceptaban con demasiada facilidad textos que él sabía con certeza que eran de IA.&lt;/p&gt;

&lt;p&gt;El segundo camino fueron los detectores basados en tics superficiales, como la frecuencia del guion largo. Ese enfoque falla porque Cantrill mismo es, según cuenta, un usuario habitual y sin culpa de ese signo en su propia escritura humana: un heurístico que penaliza un signo de puntuación produce falsos positivos contra escritores que simplemente tienen ese hábito.&lt;br&gt;
Generación de detectorFalsos positivosFalsos negativosMomento de lanzamientoPangram 3Muy bajosMás altos de lo idealFines de 2025Pangram 4Extremadamente bajosBajosFines de julio de 2026&lt;br&gt;
Cantrill describe la mejora entre versiones como un salto de función escalón: con Pangram 4 dice haber alcanzado una precisión que antes no existía en ningún detector que hubiera probado, al punto de perder confianza rápidamente en cualquier autor que la herramienta marque con alta certeza como generado por IA.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;

&lt;span class="n"&gt;MULETILLAS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lo que sabemos&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;te contamos&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;todo lo que necesitas saber&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;esto cambia todo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;guia completa de&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;en pocas palabras&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;puntaje_heuristico&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;texto_low&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;hits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;patron&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;texto_low&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;patron&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;MULETILLAS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;ratio_guion_largo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8212&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;texto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;muletillas_detectadas&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;hits&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ratio_guion_largo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ratio_guion_largo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;borrador&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;borrador.md&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;puntaje_heuristico&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;borrador&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este script es solo un heurístico casero, no reproduce el modelo propietario de Pangram, pero sirve como primer filtro: cuenta frases muletilla comunes y mide la densidad de guion largo antes de publicar un borrador.&lt;br&gt;
Pangram 4 redujo tanto falsos positivos como falsos negativos frente a Pangram 3.&lt;/p&gt;
&lt;h2&gt;
  
  
  Cómo probarlo en tu propio texto
&lt;/h2&gt;

&lt;p&gt;No hace falta pagar por un detector para hacer una primera auditoría. Cantrill sugiere, medio en broma, que la prueba definitiva es leer el texto en voz alta: si el autor no soporta escuchar su propio borrador, tampoco debería pedirle a un lector que lo haga.&lt;/p&gt;

&lt;p&gt;Para equipos que publican contenido técnico en blogs o proyectos open source, un chequeo simple es agregar un hook de pre-commit que avise si el borrador contiene frases muletilla típicas antes de que llegue a producción.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="c"&gt;# .git/hooks/pre-commit&lt;/span&gt;
&lt;span class="nv"&gt;archivo&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="nv"&gt;patrones&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"lo que sabemos|te contamos|todo lo que necesitas saber|esto cambia todo"&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-inE&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$patrones&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$archivo&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Revisa el borrador: se encontraron muletillas tipicas de escritura generada por IA."&lt;/span&gt;
  &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi
&lt;/span&gt;&lt;span class="nb"&gt;exit &lt;/span&gt;0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El hook no reemplaza a un detector real como Pangram, pero atrapa gratis los tics más obvios antes de que un lector los encuentre primero.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Tip:&lt;/strong&gt; si vas a usar un LLM para acelerar la redacción, usalo para investigar o reordenar ideas, no para generar la prosa final: la voz debe seguir siendo tuya.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Impacto y análisis
&lt;/h2&gt;

&lt;p&gt;La consecuencia práctica, según Cantrill, es que escribir con IA sin editar deja de ser neutral: activa un mecanismo de rechazo. Su hipótesis es que el cerebro de un lector entrenado en leer mucho reacciona a las marcas de un LLM como una alarma de autopreservación, y abandona la lectura a mitad de oración.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TD
    A["Lector empieza a leer el texto"] --&amp;gt; B{"Detecta tics de escritura generada por ia?"}
    B -- "No" --&amp;gt; C["Sigue leyendo y confia en el autor"]
    B -- "Si" --&amp;gt; D["Abandona la lectura de inmediato"]
    D --&amp;gt; E["Evita al autor en publicaciones futuras"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto tiene implicaciones directas para canales técnicos, newsletters y documentación de proyectos open source: perder la confianza de un lector frecuente no cuesta una sola lectura, cuesta todas las futuras. La encuesta de Dunlop lo confirma con el dato del 71% de abandono permanente del autor, y Cantrill agrega que quienes leen y comparten activamente en redes (justamente los early adopters que dan visibilidad a un texto) son los primeros en aplicar ese castigo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Ojo:&lt;/strong&gt; un heurístico agresivo también puede acusar en falso a autores con estilos particulares, como quienes escriben en un segundo idioma o editan mucho su propia prosa; ningún detector, ni Pangram 4, es infalible.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Qué sigue
&lt;/h2&gt;

&lt;p&gt;Cantrill anticipa que la disponibilidad de detectores confiables cambia la ecuación de costo-beneficio de escribir con IA en público. Su argumento no es moral, es de efectividad: si el objetivo de publicar es que alguien lea y confíe en lo que dice, usar un LLM sin editar deja de servir a ese objetivo en la medida en que los lectores lo detecten y penalicen.&lt;/p&gt;

&lt;p&gt;El paralelo con el spam sugiere un camino: así como hoy ninguna empresa seria arriesga su dominio por una campaña de correo masivo mal dirigida, es esperable que medios, blogs corporativos y comunidades open source empiecen a tratar la escritura de IA no revisada como un riesgo reputacional, no solo como un atajo de productividad.&lt;/p&gt;

&lt;p&gt;📖 Resumen en Telegram: Ver resumen&lt;/p&gt;

&lt;p&gt;Probalo vos: leé el ensayo completo de Cantrill en bcantrill.dtrace.org y corré tu último borrador por un chequeo rápido de muletillas antes de publicarlo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Qué es Pangram y quién lo hace?
&lt;/h3&gt;

&lt;p&gt;Pangram Labs es la empresa que desarrolla los modelos Pangram 3 y Pangram 4, herramientas dedicadas a distinguir si un texto fue escrito por un humano o por un modelo de lenguaje.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué fallan los detectores basados en el guion largo?
&lt;/h3&gt;

&lt;p&gt;Porque penalizan un signo de puntuación que también usan escritores humanos por costumbre, como el propio Cantrill reconoce sobre su estilo; eso produce falsos positivos.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué es la RFD 576 que menciona el ensayo?
&lt;/h3&gt;

&lt;p&gt;Es un documento interno de discusión técnica de Oxide Computer, la empresa que Cantrill cofundó, donde desarrolló por primera vez la idea de que escribir con IA rompe el contrato social entre autor y lector.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuántos developers participaron en la encuesta que cita Cantrill?
&lt;/h3&gt;

&lt;p&gt;La encuesta de Cynthia Dunlop reunió respuestas de 668 developers sobre cómo reaccionan al detectar escritura generada por ia.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Esto significa que nunca hay que usar IA al escribir?
&lt;/h3&gt;

&lt;p&gt;El ensayo no pide prohibir el uso de IA como herramienta de apoyo, apunta específicamente a publicar prosa generada por un modelo sin revisión ni voz propia del autor.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuándo se lanzó Pangram 4?
&lt;/h3&gt;

&lt;p&gt;Según el ensayo, Pangram 4 se presentó poco más de un mes antes de la publicación del artículo del 5 de septiembre de 2026, es decir hacia fines de julio de ese año.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://bcantrill.dtrace.org/2026/09/05/the-revolt-of-the-reader/" rel="noopener noreferrer"&gt;The revolt of the reader&lt;/a&gt;: el ensayo original de Bryan Cantrill, fuente principal de esta nota.- &lt;a href="https://oxide.computer/" rel="noopener noreferrer"&gt;Oxide Computer Company&lt;/a&gt;: la empresa que Cantrill cofundó y donde surgió la RFD 576 citada en el ensayo.- &lt;a href="https://en.wikipedia.org/wiki/Email_spam" rel="noopener noreferrer"&gt;Email spam en Wikipedia&lt;/a&gt;: contexto histórico sobre la crisis del spam de correo electrónico de los 2000 usada como analogía.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📱 &lt;strong&gt;¿Te gusta este contenido?&lt;/strong&gt; Únete a nuestro canal de Telegram &lt;a href="https://t.me/programacion" rel="noopener noreferrer"&gt;@programacion&lt;/a&gt; donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.&lt;/p&gt;

</description>
      <category>technology</category>
      <category>science</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Count-Min Sketch: contar millones de eventos con kilobytes de RAM</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Sat, 05 Sep 2026 16:10:29 +0000</pubDate>
      <link>https://dev.to/lu1tr0n/count-min-sketch-contar-millones-de-eventos-con-kilobytes-de-ram-5466</link>
      <guid>https://dev.to/lu1tr0n/count-min-sketch-contar-millones-de-eventos-con-kilobytes-de-ram-5466</guid>
      <description>&lt;p&gt;Un firewall que ve millones de paquetes por segundo no puede abrir una entrada en una tabla hash por cada IP distinta que procesa: se queda sin memoria en minutos. Necesita contar sin guardar cada evento, y ahí entra el &lt;strong&gt;count-min sketch&lt;/strong&gt;, una estructura de datos probabilística que estima cuántas veces ocurrió algo usando apenas unos kilobytes.&lt;/p&gt;

&lt;p&gt;El count-min sketch resuelve ese problema con una matriz pequeña y varias funciones hash: cambia certeza absoluta por una estimación con error acotado y memoria constante. Es la misma idea detrás de cómo Redis, Apache Flink y los sistemas de detección de anomalías de red cuentan eventos a gran escala sin que la memoria crezca con la cantidad de claves distintas.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Vas a entender cómo el count-min sketch estima frecuencias sin guardar cada evento individual.- Vas a poder calcular el ancho y la profundidad de la matriz según el error que estés dispuesto a tolerar.- Vas a implementar un count-min sketch básico en JavaScript en menos de 30 líneas.- Vas a saber usar CMS.INITBYDIM, CMS.INCRBY y CMS.QUERY del módulo RedisBloom en Redis.- Vas a distinguir cuándo conviene un count-min sketch frente a un Bloom filter o un HyperLogLog.- Vas a conocer el 'conservative update', la técnica que reduce la sobreestimación del conteo.- Vas a identificar los errores más comunes al elegir los parámetros epsilon y delta.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Qué es el count-min sketch y por qué importa
&lt;/h2&gt;

&lt;p&gt;Un mapa hash exacto guarda una entrada por cada clave distinta: si hay diez millones de IPs únicas, la memoria crece con esas diez millones de entradas. El &lt;strong&gt;count-min sketch&lt;/strong&gt; rompe esa relación: su tamaño depende solo del error que tolerás, no de cuántas claves distintas aparezcan en el stream.&lt;/p&gt;

&lt;p&gt;Graham Cormode y S. Muthukrishnan &lt;a href="https://en.wikipedia.org/wiki/Count%E2%80%93min_sketch" rel="noopener noreferrer"&gt;publicaron el algoritmo en 2005&lt;/a&gt; como respuesta a un problema concreto: contar frecuencias en flujos de datos demasiado grandes para caber en memoria. Desde entonces se volvió una pieza estándar en sistemas de streaming, bases de datos analíticas y monitoreo de redes.&lt;/p&gt;

&lt;p&gt;El canal ya cubrió otras estructuras probabilísticas con propósitos distintos: los filtros de Bloom responden 'existe este elemento', HyperLogLog responde 'cuántos elementos distintos hay'. El count-min sketch responde una tercera pregunta, 'cuántas veces apareció este elemento', y esa diferencia importa porque cada una resuelve un problema que las otras dos no pueden.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo funciona por dentro
&lt;/h2&gt;

&lt;p&gt;La estructura es una matriz de &lt;strong&gt;w&lt;/strong&gt; columnas por &lt;strong&gt;d&lt;/strong&gt; filas, todas inicializadas en cero. Cada fila tiene asociada una función hash independiente que mapea cualquier elemento a una columna dentro de esa fila.&lt;/p&gt;

&lt;p&gt;Para incrementar un elemento, el algoritmo calcula sus &lt;strong&gt;d&lt;/strong&gt; posiciones (una por fila) y suma el conteo en cada una de esas celdas. Para consultar la frecuencia estimada, vuelve a calcular esas mismas &lt;strong&gt;d&lt;/strong&gt; posiciones y devuelve el mínimo de los valores encontrados.&lt;/p&gt;

&lt;p&gt;El mínimo importa porque cada fila puede sufrir colisiones: dos elementos distintos que caen en la misma celda inflan su valor. Tomar el mínimo entre varias filas independientes reduce ese ruido. La garantía matemática es que la estimación nunca es menor al conteo real, pero puede ser mayor.&lt;/p&gt;

&lt;p&gt;Cormode y Muthukrishnan demostraron que con un ancho &lt;strong&gt;w = ⌈e/ε⌉&lt;/strong&gt; y una profundidad &lt;strong&gt;d = ⌈ln(1/δ)⌉&lt;/strong&gt; (donde &lt;em&gt;e&lt;/em&gt; es el número de Euler), la estimación se mantiene dentro de un error de &lt;strong&gt;ε·N&lt;/strong&gt; respecto al conteo real, con probabilidad de al menos &lt;strong&gt;1-δ&lt;/strong&gt;, siendo &lt;em&gt;N&lt;/em&gt; la suma total de todos los conteos.&lt;br&gt;
Una matriz de w columnas por d filas resume millones de eventos distintos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TD
    A["Evento: IP 203.0.113.7"] --&amp;gt; B["Hash 1"]
    A --&amp;gt; C["Hash 2"]
    A --&amp;gt; D["Hash 3"]
    B --&amp;gt; E["Fila 1, columna h1"]
    C --&amp;gt; F["Fila 2, columna h2"]
    D --&amp;gt; G["Fila 3, columna h3"]
    subgraph Matriz
    E
    F
    G
    end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Ejemplos prácticos con código
&lt;/h2&gt;

&lt;p&gt;El primer ejemplo implementa un count-min sketch desde cero, sin dependencias, para ver la mecánica interna sin la capa de un motor externo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CountMinSketch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;depth&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;depth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;depth&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;matrix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;depth&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Uint32Array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;seeds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;depth&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2654435761&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;row&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CMS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;INCRBY&lt;/span&gt; &lt;span class="nx"&gt;ip_counter&lt;/span&gt; &lt;span class="mf"&gt;203.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;113.7&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="o"&gt;--&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;OK&lt;/span&gt;
    &lt;span class="nx"&gt;C&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CMS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;QUERY&lt;/span&gt; &lt;span class="nx"&gt;ip_counter&lt;/span&gt; &lt;span class="mf"&gt;203.0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;113.7&lt;/span&gt;
    &lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="o"&gt;--&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;C&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;estimacion&lt;/span&gt; &lt;span class="nx"&gt;aproximada&lt;/span&gt;
    &lt;span class="nx"&gt;Note&lt;/span&gt; &lt;span class="nx"&gt;over&lt;/span&gt; &lt;span class="nx"&gt;C&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nx"&gt;R&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;la&lt;/span&gt; &lt;span class="nx"&gt;estimacion&lt;/span&gt; &lt;span class="nx"&gt;nunca&lt;/span&gt; &lt;span class="nx"&gt;es&lt;/span&gt; &lt;span class="nx"&gt;menor&lt;/span&gt; &lt;span class="nx"&gt;al&lt;/span&gt; &lt;span class="nx"&gt;conteo&lt;/span&gt; &lt;span class="nx"&gt;real&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Cómo empezar paso a paso
&lt;/h2&gt;

&lt;p&gt;Para probarlo hoy mismo sin instalar nada en tu sistema, levantá Redis Stack en Docker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; redis-stack &lt;span class="nt"&gt;-p&lt;/span&gt; 6379:6379 redis/redis-stack:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con el contenedor corriendo, creá el sketch y probá los tres comandos básicos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;redis-cli CMS.INITBYDIM visitas_por_pagina 2000 5
redis-cli CMS.INCRBY visitas_por_pagina /blog/count-min-sketch 1
redis-cli CMS.QUERY visitas_por_pagina /blog/count-min-sketch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para confirmar que la estructura está activa y con los parámetros esperados, usá &lt;strong&gt;CMS.INFO&lt;/strong&gt;, que devuelve el ancho, la profundidad y la suma total de conteos registrados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;redis-cli CMS.INFO visitas_por_pagina
&lt;span class="c"&gt;# 1) width&lt;/span&gt;
&lt;span class="c"&gt;# 2) (integer) 2000&lt;/span&gt;
&lt;span class="c"&gt;# 3) depth&lt;/span&gt;
&lt;span class="c"&gt;# 4) (integer) 5&lt;/span&gt;
&lt;span class="c"&gt;# 5) count&lt;/span&gt;
&lt;span class="c"&gt;# 6) (integer) 1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si el ancho o la profundidad no coinciden con los que esperabas, el sketch fue creado con otros parámetros y hay que recrearlo: no se puede redimensionar una vez inicializado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Casos de uso reales
&lt;/h2&gt;

&lt;p&gt;La detección de &lt;strong&gt;heavy hitters&lt;/strong&gt; en tráfico de red es el caso clásico: identificar qué IPs o qué flujos concentran el grueso del tráfico sin mantener una tabla de flujo completa, algo inviable cuando hay millones de conexiones simultáneas.&lt;/p&gt;

&lt;p&gt;Twitter usó una estructura equivalente en su biblioteca Algebird para contar apariciones de hashtags y términos en streams de tweets, donde guardar un contador exacto por cada palabra distinta habría sido impracticable a esa escala.&lt;br&gt;
Twitter usó una estructura similar en su biblioteca Algebird para contar en streams.&lt;br&gt;
Motores de bases de datos analíticas usan sketches parecidos para estimar la selectividad de una columna antes de elegir un plan de ejecución, sin necesidad de escanear la tabla completa. Proyectos como &lt;a href="https://datasketches.apache.org" rel="noopener noreferrer"&gt;Apache DataSketches&lt;/a&gt; empaquetan el count-min sketch junto a otras estructuras probabilísticas para pipelines de datos a gran escala.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Tip:&lt;/strong&gt; si tu objetivo es limitar peticiones por usuario (rate limiting), un count-min sketch con ventana temporal (reiniciando la matriz cada cierto intervalo) suele consumir muchísima menos memoria que un contador exacto por usuario.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Errores comunes y buenas prácticas
&lt;/h2&gt;

&lt;p&gt;El error más frecuente es tratar la estimación como un número exacto. El count-min sketch &lt;strong&gt;nunca subestima&lt;/strong&gt;, pero sí puede sobreestimar, así que no es apto para decisiones donde un falso positivo por sobreconteo sea inaceptable, como facturación exacta por evento.&lt;/p&gt;

&lt;p&gt;Otro error es elegir un ancho o una profundidad arbitrarios. Si el error tolerado ε es muy pequeño, el ancho w crece proporcionalmente, y si la probabilidad de fallo δ es muy exigente, la profundidad d crece con ella: conviene calcular ambos valores en función del presupuesto de memoria real disponible, no adivinarlos.&lt;/p&gt;

&lt;p&gt;Las distribuciones muy sesgadas (unos pocos elementos con conteos enormes, el resto con conteos bajos) son las que más sufren: un elemento con millones de ocurrencias puede inflar la estimación de elementos que colisionan en su misma celda. Aumentar la profundidad o aplicar &lt;strong&gt;conservative update&lt;/strong&gt; mitiga ese efecto.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Ojo:&lt;/strong&gt; un count-min sketch básico no soporta eliminar o decrementar elementos de forma confiable; si tu caso de uso necesita eso, mirá la variante Count Sketch antes de forzar la estructura básica.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Comparativa con alternativas
&lt;/h2&gt;

&lt;p&gt;EstructuraQué respondeMemoriaCuándo usarlaHash map exactoFrecuencia exactaCrece con claves distintasPocos elementos o memoria abundanteBloom filter¿Existe el elemento?Fija (bits)Verificar membresía, no frecuenciaHyperLogLog¿Cuántos elementos distintos hay?Fija (unos KB)Cardinalidad aproximada (COUNT DISTINCT)Count-Min Sketch¿Cuántas veces apareció?Fija (w × d)Frecuencias aproximadas en streams masivosCount SketchFrecuencia con menor sesgoFija, similar a CMSCuando la sobreestimación sistemática es un problema&lt;/p&gt;
&lt;h2&gt;
  
  
  Profundizando: conservative update y variantes avanzadas
&lt;/h2&gt;

&lt;p&gt;El &lt;strong&gt;conservative update&lt;/strong&gt; es una optimización simple pero efectiva: en vez de sumar el conteo completo a las d celdas, primero calculá cuál sería el nuevo valor mínimo entre esas celdas y subí cada una solo hasta ese valor, nunca más allá. Esto reduce la sobreestimación acumulada sin cambiar la lógica de consulta.&lt;/p&gt;

&lt;p&gt;La variante &lt;strong&gt;Count Sketch&lt;/strong&gt; agrega un signo aleatorio (+1 o -1) por cada función hash, y en la consulta devuelve la mediana en lugar del mínimo. El resultado es un estimador sin sesgo sistemático, aunque a diferencia del count-min sketch, sí puede subestimar el conteo real.&lt;/p&gt;

&lt;p&gt;Cuando el problema es identificar los k elementos más frecuentes (top-k) en lugar de estimar frecuencias individuales, el algoritmo &lt;strong&gt;Space-Saving&lt;/strong&gt; de Misra-Gries suele ser más preciso con memoria similar, porque mantiene explícitamente los candidatos más pesados en vez de una matriz genérica.&lt;/p&gt;

&lt;p&gt;Una propiedad clave para sistemas distribuidos es la &lt;strong&gt;mergeabilidad&lt;/strong&gt;: dos count-min sketches con el mismo ancho, profundidad y funciones hash se pueden combinar sumando sus matrices celda por celda. Esto permite que cada nodo de un cluster cuente su porción del stream por separado y se agreguen los resultados al final, sin coordinación previa.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TD
    Q["Que necesitas saber?"] --&amp;gt; M["Existe el elemento?"]
    Q --&amp;gt; D["Cuantos distintos hay?"]
    Q --&amp;gt; F["Cuantas veces aparecio?"]
    M --&amp;gt; BF["Bloom filter"]
    D --&amp;gt; HLL["HyperLogLog"]
    F --&amp;gt; CMS["Count-Min Sketch"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📖 Resumen en Telegram: Ver resumen&lt;/p&gt;

&lt;p&gt;Tu próximo paso: levantá Redis Stack con el comando de Docker de este artículo, corré CMS.INCRBY sobre un archivo de logs real y comparalo contra un conteo exacto con awk o uniq -c para ver el margen de error en la práctica.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿El count-min sketch puede dar un resultado menor al conteo real?
&lt;/h3&gt;

&lt;p&gt;No. La estructura solo puede sobreestimar, nunca subestimar, porque toma el mínimo entre varias filas que solo suman valores positivos.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo elijo el ancho y la profundidad de la matriz?
&lt;/h3&gt;

&lt;p&gt;El ancho w se calcula como ⌈e/ε⌉ y la profundidad d como ⌈ln(1/δ)⌉, donde ε es el error tolerado y δ la probabilidad de fallo aceptada. Menor error exige más ancho; menor probabilidad de fallo exige más filas.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Un count-min sketch se puede fusionar con otro?
&lt;/h3&gt;

&lt;p&gt;Sí, siempre que ambos usen el mismo ancho, profundidad y funciones hash. Fusionarlos es sumar sus matrices celda por celda, lo que lo hace ideal para conteos distribuidos entre varios nodos.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Sirve para contar elementos que después quiero eliminar?
&lt;/h3&gt;

&lt;p&gt;La versión básica no soporta decrementos de forma confiable. Para eso existe el Count Sketch, una variante con signos aleatorios que permite estimaciones sin sesgo, aunque puede subestimar.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué diferencia hay con un Bloom filter?
&lt;/h3&gt;

&lt;p&gt;Un Bloom filter responde si un elemento existe o no; el count-min sketch responde cuántas veces apareció. Resuelven preguntas distintas y suelen combinarse en el mismo sistema.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué es el conservative update?
&lt;/h3&gt;

&lt;p&gt;Es una optimización donde, al incrementar un elemento, cada celda solo sube hasta el nuevo valor mínimo necesario en vez de sumarle el conteo completo, lo que reduce la sobreestimación acumulada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Count%E2%80%93min_sketch" rel="noopener noreferrer"&gt;Wikipedia: Count-min sketch&lt;/a&gt;: descripción formal del algoritmo, autores originales y garantías matemáticas.- &lt;a href="https://github.com/RedisBloom/RedisBloom" rel="noopener noreferrer"&gt;GitHub: RedisBloom&lt;/a&gt;: implementación open source del módulo que expone CMS.INITBYDIM, CMS.INCRBY y CMS.QUERY en Redis.- &lt;a href="https://datasketches.apache.org" rel="noopener noreferrer"&gt;Apache DataSketches&lt;/a&gt;: biblioteca de estructuras probabilísticas, incluido el count-min sketch, usada en pipelines de datos a gran escala.- &lt;a href="https://redis.io" rel="noopener noreferrer"&gt;Redis&lt;/a&gt;: documentación oficial del proyecto y de sus módulos de estructuras probabilísticas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📱 &lt;strong&gt;¿Te gusta este contenido?&lt;/strong&gt; Únete a nuestro canal de Telegram &lt;a href="https://t.me/programacion" rel="noopener noreferrer"&gt;@programacion&lt;/a&gt; donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>tutorial</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
