<?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.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>USC crea un sistema neuromórfico que se alimenta de la señal que mide</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Tue, 16 Jun 2026 16:12:51 +0000</pubDate>
      <link>https://dev.to/lu1tr0n/usc-crea-un-sistema-neuromorfico-que-se-alimenta-de-la-senal-que-mide-ici</link>
      <guid>https://dev.to/lu1tr0n/usc-crea-un-sistema-neuromorfico-que-se-alimenta-de-la-senal-que-mide-ici</guid>
      <description>&lt;p&gt;Un equipo de la Universidad del Sur de California (USC) construyó un &lt;strong&gt;sistema neuromórfico&lt;/strong&gt; del tamaño de una moneda que percibe el mundo, aprende de él y toma decisiones sin batería, sin procesador y sin conexión a la nube. El trabajo, portada de &lt;em&gt;Nature Sensors&lt;/em&gt; el 2 de junio de 2026, propone una idea radical: que la propia señal física que el dispositivo mide sea también la energía que lo alimenta.&lt;/p&gt;

&lt;p&gt;No es un chip más rápido ni un modelo más grande. Es una manera distinta de computar, inspirada en cómo el cerebro procesa la vista y el tacto a la vez, que podría llevar inteligencia a lugares donde hoy no llega ni un cable ni una pila.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;La USC presentó un sistema neuromórfico del tamaño de una moneda que percibe, aprende y decide sin batería ni nube.&lt;/li&gt;
&lt;li&gt;El trabajo fue portada de &lt;em&gt;Nature Sensors&lt;/em&gt; el 2 de junio de 2026; lo lideran J. Joshua Yang y Seung Ju Kim.&lt;/li&gt;
&lt;li&gt;Usa dos memristores: uno imita una neurona que dispara y otro una sinapsis que retiene lo aprendido.&lt;/li&gt;
&lt;li&gt;Procesa luz, presión, calor y sonido de forma analógica, sin convertir nada a digital.&lt;/li&gt;
&lt;li&gt;La propia señal medida alimenta el circuito: el dato es también la fuente de energía.&lt;/li&gt;
&lt;li&gt;Una demostración detecta rayos midiendo el desfase entre la luz (instantánea) y el sonido (~3 s por kilómetro).&lt;/li&gt;
&lt;li&gt;Posibles usos: sensores contra incendios, gafas inteligentes, sondas espaciales y submarinas autónomas.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;El laboratorio dirigido por el profesor J. Joshua Yang, del Ming Hsieh Department of Electrical and Computer Engineering de la USC, publicó un dispositivo que combina percepción, memoria y aprendizaje en un único circuito analógico. El primer autor del artículo es el investigador posdoctoral Seung Ju Kim. La revista &lt;em&gt;Nature Sensors&lt;/em&gt; lo eligió como historia de portada en su edición del 2 de junio de 2026.&lt;/p&gt;

&lt;p&gt;La pieza clave del anuncio no es la miniaturización en sí, sino la economía energética. En un computador convencional, sensar el mundo, digitalizar la señal, moverla a un procesador y ejecutar un modelo son cuatro etapas que consumen energía por separado. El sistema neuromórfico de la USC colapsa todas esas etapas en una sola y, además, se autoabastece: la energía no viene de una batería, sino de la misma señal física que se está midiendo. Como resume el equipo, &lt;em&gt;"la señal no es solo la señal que se procesa; es también la fuente de energía que alimenta el sistema"&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;El resultado es un objeto que puede dejarse funcionando solo, sin mantenimiento, en lugares donde una pila se agotaría o un cable sería imposible. Esa autonomía es lo que convierte un experimento de laboratorio en una noticia con implicaciones prácticas reales.&lt;/p&gt;

&lt;p&gt;Un circuito analógico que percibe y aprende sin batería externa.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué es un sistema neuromórfico
&lt;/h2&gt;

&lt;p&gt;La &lt;strong&gt;computación neuromórfica&lt;/strong&gt; es una rama de la ingeniería que intenta construir hardware que funcione como el cerebro, no como una calculadora. En un procesador clásico, la memoria y el cálculo viven separados: los datos van y vienen entre la RAM y la CPU por un bus, y ese trasiego constante es el llamado "cuello de botella de von Neumann". El cerebro no trabaja así. En él, las neuronas que computan y las sinapsis que recuerdan son la misma estructura física, y la información se procesa donde se almacena.&lt;/p&gt;

&lt;p&gt;Un sistema neuromórfico persigue esa idea: en lugar de mover bits de un lado a otro, deja que el cálculo ocurra dentro de los propios elementos de memoria. Eso reduce drásticamente el consumo y permite responder a estímulos del mundo real en tiempo continuo, sin esperar a un reloj digital. Empresas y laboratorios llevan más de una década explorando este enfoque —Intel con su chip Loihi, IBM con TrueNorth—, pero la mayoría de esos diseños siguen siendo digitales y necesitan alimentación externa.&lt;/p&gt;

&lt;p&gt;Lo que diferencia al trabajo de la USC es que es &lt;strong&gt;completamente analógico&lt;/strong&gt;. No convierte la luz, la presión o el sonido en unos y ceros: opera directamente sobre el fenómeno físico continuo. Esa decisión de diseño elimina los conversores analógico-digitales, que suelen ser de las partes más caras en energía, y abre la puerta a que el dispositivo se alimente del propio entorno.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💭 Clave:&lt;/strong&gt; en un sistema neuromórfico analógico, percibir, recordar y aprender no son tres pasos distintos sino propiedades físicas del mismo material. Ahí está el ahorro de energía.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Cómo funciona el dispositivo
&lt;/h2&gt;

&lt;p&gt;El corazón del sistema son dos tipos de &lt;strong&gt;memristores&lt;/strong&gt;, dispositivos nanoscópicos cuya resistencia eléctrica cambia según la corriente que han recibido y que conservan ese estado aunque se les quite la alimentación. Por eso se les considera un buen candidato para imitar a las sinapsis biológicas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Memristor tipo neurona&lt;/strong&gt; — dispara una señal cuyo instante depende de la intensidad del estímulo. Cuanto más fuerte es la entrada, antes se activa, igual que una neurona biológica que codifica información en el momento del disparo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memristor tipo sinapsis&lt;/strong&gt; — retiene de forma indefinida el estado aprendido, sirviendo como memoria persistente del sistema sin necesidad de refrescarlo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ambos se conectan con componentes tan banales como resistencias y condensadores. No hay firmware, no hay sistema operativo, no hay software que actualizar. El aprendizaje es no supervisado y emerge solo de la física: según el equipo, &lt;em&gt;"la memoria surge de la relación temporal entre las señales físicas, imitando la forma en que los sistemas biológicos aprenden de experiencias repetidas"&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;El ejemplo que mejor ilustra el principio es la detección de rayos. Un relámpago emite dos señales que viajan a velocidades muy distintas: la luz llega casi instantáneamente, mientras que el trueno avanza a unos 3 segundos por kilómetro. El sistema percibe ambas, y el desfase temporal entre ellas queda codificado directamente en la memoria del memristor, lo que permite estimar la distancia del rayo sin ningún servidor ni registrador de datos en medio.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph LR
  A["Rayo"] --&amp;gt; B["Luz (instantanea)"]
  A --&amp;gt; C["Sonido (~3 s/km)"]
  B --&amp;gt; D["Memristor neurona: dispara"]
  C --&amp;gt; D
  D --&amp;gt; E["Memristor sinapsis: guarda el desfase"]
  E --&amp;gt; F["Distancia estimada"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El flujo es íntegramente local: el sensor, la memoria y la "decisión" ocurren en el mismo punto. Lo que en un sistema tradicional requeriría un micrófono, un fotodiodo, un microcontrolador, un reloj y un algoritmo de correlación, aquí lo resuelve la física de un puñado de componentes pasivos.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Tip:&lt;/strong&gt; si querés entender por qué importa que sea analógico, pensá en cuántos joules se gastan solo en digitalizar audio a 44,1 kHz de forma continua durante días. El diseño de la USC simplemente nunca digitaliza.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Datos y cifras
&lt;/h2&gt;

&lt;p&gt;Más allá de la elegancia conceptual, conviene ordenar los datos concretos que sostienen la noticia, porque la promesa de "computar con aire" exige precisión para no caer en exageración.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tamaño&lt;/strong&gt; — el circuito completo cabe en una placa del tamaño de una moneda.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Energía externa&lt;/strong&gt; — cero. El sistema se alimenta de la señal física que sensa, no de una batería ni de la red eléctrica.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Componentes&lt;/strong&gt; — dos tipos de memristores nanoscópicos más resistencias y condensadores convencionales.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Procesamiento&lt;/strong&gt; — 100 % analógico, sin conversión a digital ni software.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Publicación&lt;/strong&gt; — portada de &lt;em&gt;Nature Sensors&lt;/em&gt;, 2 de junio de 2026.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Demostración&lt;/strong&gt; — red simulada de detección de rayos basada en el desfase luz/sonido (~3 s/km).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Financiación&lt;/strong&gt; — el centro CONCRETE (Center of Neuromorphic Computing under Extreme Environments), con apoyo de la Air Force Office of Scientific Research, el Air Force Research Laboratory, el Army Research Office y la National Science Foundation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El nombre del centro financiador, CONCRETE, no es casual: el enfoque está pensado para entornos extremos donde no hay infraestructura. Esa es la frontera real del proyecto, y también explica el interés de agencias de defensa y ciencia básica de Estados Unidos.&lt;/p&gt;

&lt;p&gt;Sensores que aprenden solos, pensados para terreno sin infraestructura.&lt;/p&gt;

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

&lt;p&gt;El contexto de esta noticia es la creciente angustia por el consumo energético de la inteligencia artificial. Mientras los grandes modelos de lenguaje empujan la demanda de centros de datos a niveles que preocupan a gobiernos y operadores eléctricos, una corriente de investigación va en sentido contrario: en vez de concentrar más cómputo en almacenes gigantes, repartir inteligencia mínima en el borde, donde nace el dato. Un sistema neuromórfico autoalimentado es la expresión más extrema de esa filosofía.&lt;/p&gt;

&lt;p&gt;Conviene, sin embargo, ser objetivos sobre el alcance. Este dispositivo no compite con un modelo de IA generativa ni pretende hacerlo. No va a escribir código ni a clasificar imágenes complejas. Su valor está en tareas de percepción acotadas —detectar un patrón, medir un desfase, reaccionar a un umbral— donde hoy desplegar electrónica convencional es inviable por costo, mantenimiento o falta de energía. Compararlo con un chip de IA de centro de datos sería un error de categoría.&lt;/p&gt;

&lt;p&gt;Las aplicaciones que el equipo plantea dan la medida del nicho. Un sensor que no necesita batería ni red podría esparcirse por terreno propenso a incendios para detectar la caída de rayos; podría integrarse en gafas inteligentes que procesan el entorno sin conectarse a un teléfono; o podría enviarse al espacio o dejarse caer en el océano profundo para aprender por su cuenta. Son escenarios en los que la autonomía energética no es un lujo, sino la condición que hace posible el despliegue.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Ojo:&lt;/strong&gt; que un prototipo de laboratorio funcione no garantiza que se fabrique a escala. Los memristores llevan más de una década prometiendo revolucionar el hardware y todavía no se producen en masa con la fiabilidad de un transistor CMOS.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ese es el matiz periodístico honesto: estamos ante una prueba de concepto sólida y revisada por pares, no ante un producto. La fabricación reproducible de memristores, su variabilidad entre unidades y su integración con la electrónica existente siguen siendo problemas abiertos en toda la industria. La noticia es importante porque demuestra que el principio funciona y se publica en una revista de primer nivel, no porque mañana vayamos a comprar uno.&lt;/p&gt;

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

&lt;p&gt;El siguiente paso lógico es pasar de una red simulada a despliegues físicos más grandes y a tareas de percepción más ricas que combinen varias modalidades sensoriales a la vez —la "vista y tacto simultáneos" que inspiró el diseño—. También habrá que demostrar robustez: cómo se comportan estos dispositivos tras meses de funcionamiento autónomo, con ruido, temperatura variable y señales débiles.&lt;/p&gt;

&lt;p&gt;En el plano industrial, la gran pregunta es la fabricación. Para que un sistema neuromórfico como este salga del laboratorio hace falta un proceso capaz de producir memristores consistentes a bajo costo. Mientras eso no exista, el impacto se medirá en nichos de investigación, defensa y exploración científica antes que en electrónica de consumo. Aun así, cada demostración que cierra la brecha entre percibir y computar empuja a toda la disciplina un paso más cerca de un cómputo que se parezca, de verdad, al cerebro.&lt;/p&gt;

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

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

&lt;h3&gt;
  
  
  ¿Qué es un sistema neuromórfico?
&lt;/h3&gt;

&lt;p&gt;Es hardware diseñado para funcionar como el cerebro, donde el cálculo y la memoria conviven en la misma estructura física en lugar de estar separados como en una CPU y su RAM. Eso reduce el consumo y permite procesar señales del mundo real en tiempo continuo.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿De verdad funciona sin batería?
&lt;/h3&gt;

&lt;p&gt;Sí, según el trabajo publicado en &lt;em&gt;Nature Sensors&lt;/em&gt;. No tiene fuente de energía externa: la propia señal física que mide —luz, presión, calor o sonido— es también la que alimenta el circuito. Por eso el equipo dice que el dato y la energía son lo mismo.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué es un memristor y por qué importa aquí?
&lt;/h3&gt;

&lt;p&gt;Es un componente nanoscópico cuya resistencia depende de la corriente que ha pasado por él y que conserva ese estado sin alimentación. El dispositivo usa dos tipos: uno que dispara como una neurona y otro que retiene lo aprendido como una sinapsis.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Reemplaza a los chips de IA actuales?
&lt;/h3&gt;

&lt;p&gt;No. No compite con los aceleradores de centros de datos ni con los modelos generativos. Está pensado para tareas de percepción acotadas en lugares sin energía ni red, no para entrenar o ejecutar grandes modelos.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Para qué sirve la demostración del rayo?
&lt;/h3&gt;

&lt;p&gt;Ilustra el principio central: la luz llega casi instantánea y el sonido a unos 3 segundos por kilómetro, y el sistema codifica ese desfase directamente en su memoria para estimar la distancia, sin servidores ni registradores de datos.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuándo veremos esto en productos reales?
&lt;/h3&gt;

&lt;p&gt;No hay fecha. Es una prueba de concepto revisada por pares; la fabricación masiva y fiable de memristores sigue siendo un reto abierto en toda la industria. Los primeros usos llegarán antes a investigación, defensa y exploración científica que a electrónica de consumo.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://viterbischool.usc.edu/news/2026/06/usc-scientists-built-a-tiny-system-that-thinks-like-a-brain-and-runs-on-thin-air/" rel="noopener noreferrer"&gt;USC Viterbi&lt;/a&gt; — anuncio oficial del sistema neuromórfico autoalimentado y portada de Nature Sensors.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://viterbischool.usc.edu/news/2025/10/artificial-neurons-developed-by-usc-team-replicate-biological-function-for-improved-computer-chips/" rel="noopener noreferrer"&gt;USC Viterbi&lt;/a&gt; — trabajo previo del mismo grupo sobre neuronas artificiales basadas en memristores.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.eurekalert.org/news-releases/1103879" rel="noopener noreferrer"&gt;EurekAlert!&lt;/a&gt; — nota de prensa sobre las neuronas artificiales del equipo de la USC.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://interestingengineering.com/innovation/usc-artificial-neurons-ai-hardware" rel="noopener noreferrer"&gt;Interesting Engineering&lt;/a&gt; — cobertura sobre las neuronas artificiales basadas en iones para hardware de IA.&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>hardware</category>
      <category>technology</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Cómo funciona un reloj mecánico: los 7 componentes del movimiento</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Tue, 16 Jun 2026 14:17:30 +0000</pubDate>
      <link>https://dev.to/lu1tr0n/como-funciona-un-reloj-mecanico-los-7-componentes-del-movimiento-5h6e</link>
      <guid>https://dev.to/lu1tr0n/como-funciona-un-reloj-mecanico-los-7-componentes-del-movimiento-5h6e</guid>
      <description>&lt;p&gt;Un &lt;strong&gt;reloj mecánico&lt;/strong&gt; mide el tiempo con notable precisión sin una sola batería ni chip. Detrás de esa hazaña hay un sistema de apenas siete piezas que convierten la tensión de un resorte en el tic-tac constante de la manecilla de los segundos.&lt;/p&gt;

&lt;p&gt;Inspirados en el célebre explicador interactivo de Bartosz Ciechanowski, desarmamos el movimiento pieza por pieza y lo modelamos con código, porque para quien programa hay una analogía poderosa escondida en estos engranajes.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;El movimiento de un reloj mecánico funciona sin batería: almacena energía en un resorte llamado muelle real.&lt;/li&gt;
&lt;li&gt;El sistema de cronometraje se reduce a 7 piezas principales dispuestas casi en línea recta.&lt;/li&gt;
&lt;li&gt;El muelle real se carga girando el árbol (arbor) y libera su energía empujando el tambor (barrel).&lt;/li&gt;
&lt;li&gt;El tren de engranajes reduce la rotación para mover las manecillas de hora, minuto y segundo.&lt;/li&gt;
&lt;li&gt;El escape (escapement) libera los engranajes diente por diente: de ahí nace el característico tic-tac.&lt;/li&gt;
&lt;li&gt;El volante oscila a frecuencia fija (a menudo 4 Hz, 28.800 vibraciones por hora) y actúa como reloj patrón mecánico.&lt;/li&gt;
&lt;li&gt;El explicador interactivo de Bartosz Ciechanowski (mayo de 2022) popularizó esta forma de enseñar ingeniería en la web.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ¿Qué es el movimiento de un reloj mecánico?
&lt;/h2&gt;

&lt;p&gt;Cuando hablamos de un &lt;strong&gt;reloj mecánico&lt;/strong&gt;, la caja metálica que vemos es lo de menos. La verdadera estrella es el &lt;em&gt;movimiento&lt;/em&gt;: la maquinaria interna que vive encerrada en esa caja. El movimiento contiene decenas de piezas, pero su función central —mantener el tiempo— recae en un puñado de componentes que, sorprendentemente, se pueden alinear casi en una sola fila.&lt;/p&gt;

&lt;p&gt;El mundo de la relojería está lleno de jerga, y muchos componentes tienen nombres poco familiares. No hace falta memorizarlos: lo importante es entender el papel que cumple cada uno dentro de la cadena. Esa cadena va desde una fuente de energía hasta un oscilador que marca el ritmo, pasando por una serie de engranajes que reparten ese movimiento. Si has trabajado con señales de reloj en electrónica o con bucles de animación a 60 fps, el patrón te resultará familiar.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💭 Clave:&lt;/strong&gt; todo reloj mecánico hace lo mismo que un cristal de cuarzo, pero sin electricidad: genera una oscilación estable y la cuenta. La diferencia es que aquí el oscilador es físico y la cuenta la hace un tren de engranajes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  La fuente de energía: el muelle real y el tambor
&lt;/h2&gt;

&lt;p&gt;Los dispositivos puramente mecánicos necesitan almacenar energía de alguna forma, y uno de los métodos más simples es un resorte. En lugar del típico resorte de compresión que vemos en un bolígrafo, el reloj usa un &lt;strong&gt;resorte de torsión en espiral&lt;/strong&gt;: se carga al enrollarlo y, al soltarlo, se desenrolla girando en sentido contrario hasta llegar a su estado natural. Como en un reloj queremos manecillas que giren, este movimiento rotatorio es justo lo que necesitamos.&lt;/p&gt;

&lt;p&gt;Ese resorte se llama &lt;strong&gt;muelle real&lt;/strong&gt; (mainspring) y es tan fuerte que, sin contención, se expandiría de golpe. Por eso vive dentro de una carcasa cilíndrica llamada &lt;strong&gt;tambor&lt;/strong&gt; (barrel), cuyas paredes lo mantienen en su sitio. Para almacenar energía, enrollamos el muelle apretándolo con el &lt;strong&gt;árbol&lt;/strong&gt; (arbor), un eje central con un gancho que se engancha a un orificio del resorte. Al girar el árbol —eso es darle cuerda— el muelle se tensa.&lt;/p&gt;

&lt;p&gt;Aquí aparece el primer detalle ingenioso. Si soltáramos el árbol, el muelle simplemente lo haría girar hacia atrás y no obtendríamos trabajo útil. La solución es sostener el árbol y dejar que sea el &lt;strong&gt;tambor&lt;/strong&gt; el que gire, transmitiendo así la energía al resto del mecanismo. Una tira metálica unida al extremo exterior del muelle roza contra la pared del tambor: esa fricción bloquea el extremo externo y, si se intenta dar demasiada cuerda, el muelle resbala dentro del tambor en lugar de romperse. Es, literalmente, un mecanismo de seguridad mecánico.&lt;/p&gt;

&lt;p&gt;El muelle real almacena la energía; el tambor la libera de forma controlada.&lt;/p&gt;

&lt;h2&gt;
  
  
  El tren de engranajes: repartir y reducir la rotación
&lt;/h2&gt;

&lt;p&gt;El tambor no mueve las manecillas directamente: gira demasiado despacio y con demasiada fuerza. Entre el tambor y el oscilador hay un &lt;strong&gt;tren de engranajes&lt;/strong&gt; (gear train) formado por varias ruedas dentadas que reducen progresivamente la velocidad y reparten el movimiento. De ese tren salen las tomas para la manecilla de las horas, la de los minutos y la de los segundos.&lt;/p&gt;

&lt;p&gt;La idea es la misma que un divisor de frecuencia: una rueda grande engrana con un piñón pequeño, y la relación entre el número de dientes determina cuánto se reduce la velocidad en cada etapa. Encadenando varias reducciones, una rotación rápida del lado del oscilador se convierte en el giro lento y exacto que necesita la manecilla de las horas.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📌 Nota:&lt;/strong&gt; el tren de engranajes no decide a qué velocidad va el reloj; solo traduce. Quien fija el ritmo es el conjunto escape + volante que veremos a continuación. Cambiar un engranaje altera las relaciones, pero el latido base lo marca el oscilador.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Por eso un reloj que se adelanta o atrasa rara vez tiene un problema en los engranajes: el ajuste fino se hace sobre el oscilador, no sobre el tren. Para un desarrollador es la misma distinción entre la frecuencia base de un reloj de hardware y los contadores que dividen esa señal aguas abajo.&lt;/p&gt;

&lt;h2&gt;
  
  
  El escape y el volante: el corazón del tic-tac
&lt;/h2&gt;

&lt;p&gt;Llegamos al componente más fascinante. Si dejáramos que el muelle real moviera el tren de engranajes libremente, todo se desenrollaría en segundos. Hace falta algo que libere la energía en porciones diminutas y regulares. Ese trabajo lo hace el &lt;strong&gt;escape&lt;/strong&gt; (escapement), compuesto por la &lt;strong&gt;rueda de escape&lt;/strong&gt; y el &lt;strong&gt;áncora&lt;/strong&gt; (pallet fork), trabajando junto al &lt;strong&gt;volante&lt;/strong&gt; (balance wheel) y su espiral.&lt;/p&gt;

&lt;p&gt;El volante es una rueda que oscila de un lado a otro a una frecuencia fija, gobernada por una pequeña espiral (la espiral del volante) que actúa como el resorte de un péndulo. En cada media oscilación, el áncora libera &lt;em&gt;un solo diente&lt;/em&gt; de la rueda de escape; ese diente, al escapar, da un pequeño empujón al volante que lo mantiene oscilando. Ese intercambio —liberar un diente, recibir un impulso— es el origen del tic-tac que escuchas.&lt;/p&gt;

&lt;p&gt;La frecuencia típica de un reloj moderno es de 4 Hz, es decir, 8 medias oscilaciones por segundo, lo que equivale a 28.800 vibraciones por hora (vph). Esa cifra grabada en muchos movimientos no es marketing: es literalmente la frecuencia del oscilador que define la precisión del reloj.&lt;/p&gt;

&lt;p&gt;El escape libera el tren diente por diente; el volante marca el ritmo.&lt;/p&gt;

&lt;p&gt;El flujo completo de energía, de la fuente al oscilador, se puede ver así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph LR
  A["Muelle real"] --&amp;gt; B["Tambor (barrel)"]
  B --&amp;gt; C["Tren de engranajes"]
  C --&amp;gt; D["Rueda de escape"]
  D --&amp;gt; E["Áncora (pallet fork)"]
  E --&amp;gt; F["Volante + espiral"]
  F -. "libera un diente" .-&amp;gt; D
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fíjate en la flecha de retorno: el volante no solo recibe energía, también &lt;em&gt;controla&lt;/em&gt; cuándo se libera el siguiente diente. Es un lazo de realimentación mecánico, equivalente a un oscilador que se autorregula.&lt;/p&gt;

&lt;h2&gt;
  
  
  Modelando el reloj con código
&lt;/h2&gt;

&lt;p&gt;Para quien viene del software, la mejor forma de fijar estos conceptos es escribir un modelo mínimo. El escape funciona como un divisor de reloj: el volante oscila a frecuencia fija y cada media oscilación deja avanzar el tren una unidad. Contar esas unidades es, en esencia, llevar la hora.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

FRECUENCIA_HZ = 4          # 4 oscilaciones por segundo (28.800 vph)
DIENTES_ESCAPE = 15        # dientes de la rueda de escape

class Movimiento:
    def __init__(self):
        self.energia = 100.0      # carga del muelle real (%)
        self.segundos = 0.0

    def medio_ciclo(self):
        # Cada media oscilacion del volante libera un diente
        if self.energia  **💡 Tip:** si quieres ver el mecanismo en movimiento real, abre el artículo original de Ciechanowski en el escritorio: sus demostraciones 3D interactivas dejan arrastrar la cámara y mover un control deslizante para mirar dentro del movimiento. Ningún diagrama estático lo iguala.

## Por qué esto importa para quien programa

Un **reloj mecánico** es un curso intensivo de diseño de sistemas comprimido en un objeto que cabe en la muñeca. Hay separación de responsabilidades clara: la fuente de energía (muelle real), el transporte (tren de engranajes) y el control de ritmo (escape y volante) están desacoplados. Hay tolerancia a fallos: el muelle resbala antes de romperse. Y hay un lazo de realimentación que mantiene estable la frecuencia sin un cerebro central.

Más allá del reloj, el verdadero aporte de Bartosz Ciechanowski fue demostrar que conceptos densos de ingeniería se pueden enseñar con simulaciones interactivas en el navegador, sin vídeos ni libros de texto. Sus explicadores sobre GPS, motores, cámaras o el propio reloj se han convertido en referencia de lo que la web puede hacer como medio educativo, y en LATAM son un excelente recurso gratuito para estudiar física e ingeniería de sistemas desde el código.

📖 Resumen en Telegram: [Ver resumen](#)

## Preguntas frecuentes

### ¿Un reloj mecánico necesita batería?

No. Toda su energía proviene del muelle real, un resorte que se enrolla al darle cuerda manualmente o, en los modelos automáticos, mediante el movimiento de la muñeca. No usa pilas ni componentes electrónicos.

### ¿Cada cuánto hay que darle cuerda?

Depende de la reserva de marcha del movimiento, que suele oscilar entre 38 y 80 horas en relojes modernos. Un reloj manual requiere cuerda diaria; uno automático se recarga solo mientras se usa.

### ¿Qué diferencia hay entre un reloj mecánico y uno de cuarzo?

Ambos cuentan oscilaciones, pero el de cuarzo usa un cristal vibrando a 32.768 Hz alimentado por una pila, mientras que el mecánico usa un volante físico que oscila a unos 4 Hz movido por un resorte. El de cuarzo es más preciso y barato; el mecánico es valorado por su ingeniería.

### ¿Qué significa 28.800 vph?

Es la frecuencia del oscilador: 28.800 vibraciones por hora equivalen a 4 Hz, es decir, 8 medias oscilaciones del volante por segundo. A mayor frecuencia, la manecilla de segundos se mueve de forma más fluida y el reloj suele ser más estable.

### ¿Qué es un reloj automático?

Es un reloj mecánico que añade un rotor que gira con el movimiento del brazo y va dando cuerda al muelle real de forma continua. Así evita la cuerda manual diaria mientras se lleva puesto.

### ¿Por qué el escape hace tic-tac?

El sonido proviene del áncora golpeando los dientes de la rueda de escape en cada media oscilación del volante. Cada liberación de un diente produce un clic; a 4 Hz se perciben como el clásico tic-tac.

## Referencias

- [Mechanical Watch — Bartosz Ciechanowski](https://ciechanow.ski/mechanical-watch/) — explicador interactivo original (mayo de 2022) que inspira este artículo.
- [Wikipedia: Mechanical watch](https://en.wikipedia.org/wiki/Mechanical_watch) — historia, componentes y funcionamiento general del reloj mecánico.
- [Wikipedia: Escapement](https://en.wikipedia.org/wiki/Escapement) — el mecanismo de escape, su historia y variantes.
- [Wikipedia: Mainspring](https://en.wikipedia.org/wiki/Mainspring) — el muelle real como fuente de energía y reserva de marcha.

📱 **¿Te gusta este contenido?** Únete a nuestro canal de Telegram [@programacion](https://t.me/programacion) 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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>technology</category>
      <category>science</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>El emulador x86 de Windows reescribía 256 KB de código basura al vuelo</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Tue, 16 Jun 2026 08:17:46 +0000</pubDate>
      <link>https://dev.to/lu1tr0n/el-emulador-x86-de-windows-reescribia-256-kb-de-codigo-basura-al-vuelo-1c2a</link>
      <guid>https://dev.to/lu1tr0n/el-emulador-x86-de-windows-reescribia-256-kb-de-codigo-basura-al-vuelo-1c2a</guid>
      <description>&lt;p&gt;Durante un intercambio de anécdotas entre ingenieros veteranos de Microsoft, un colega de Raymond Chen contó una historia que resume el eterno duelo entre los compiladores y quienes ejecutan su salida. Un &lt;strong&gt;emulador x86&lt;/strong&gt; de Windows —de los que permitían correr binarios x86-32 sobre procesadores de otra arquitectura— se topó con código tan ineficiente que el equipo decidió arreglarlo en pleno proceso de traducción.&lt;/p&gt;

&lt;p&gt;El detalle que hizo célebre la anécdota: ese programa gastaba &lt;strong&gt;256 KB de instrucciones para inicializar apenas 64 KB de memoria&lt;/strong&gt;. El código que ponía los ceros pesaba cuatro veces más que los datos que inicializaba.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Un emulador x86 de Windows usaba traducción binaria (JIT) para convertir código x86-32 en código nativo de otra arquitectura.&lt;/li&gt;
&lt;li&gt;Un programa reservaba ~64 KB en la pila; el compilador desenrolló el bucle de inicialización en 65.536 instrucciones de 'escribir un byte'.&lt;/li&gt;
&lt;li&gt;Cada instrucción ocupaba 4 bytes: 65.536 × 4 = 262.144 bytes, es decir 256 KB de código para inicializar 64 KB de datos.&lt;/li&gt;
&lt;li&gt;El equipo del emulador agregó código al traductor para detectar ese patrón y reemplazarlo por un bucle compacto.&lt;/li&gt;
&lt;li&gt;La anécdota la relató Raymond Chen en The Old New Thing el 15 de junio de 2026.&lt;/li&gt;
&lt;li&gt;No se precisó qué procesador era; Windows incluyó emuladores x86 varias veces (Alpha, Itanium, ARM).&lt;/li&gt;
&lt;li&gt;El caso ilustra los límites del loop unrolling: 'más rápido en teoría' no siempre significa mejor en la práctica.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;La escena no ocurrió en una sala de incidentes ni en un postmortem formal, sino en una charla informal entre ingenieros. Raymond Chen, autor del blog &lt;em&gt;The Old New Thing&lt;/em&gt;, recogió la anécdota de un colega que trabajó en uno de los varios emuladores de x86 que Windows ha incluido a lo largo de su historia para correr binarios x86-32 sobre procesadores de otra arquitectura.&lt;/p&gt;

&lt;p&gt;El &lt;strong&gt;emulador x86&lt;/strong&gt; en cuestión no interpretaba instrucción por instrucción. Empleaba &lt;strong&gt;traducción binaria&lt;/strong&gt;: tomaba bloques de código x86-32 y generaba código nativo equivalente para el procesador anfitrión, una técnica que rinde mucho más que un intérprete clásico. Conviene pensarlo así: el x86-32 es un bytecode y el emulador es, en la práctica, un compilador JIT que produce código máquina al vuelo.&lt;/p&gt;

&lt;p&gt;Al traducir cierto programa, el equipo se topó con una función que reservaba unos 64 KB en la pila y los inicializaba. Hasta ahí, pura rutina. El problema era &lt;em&gt;cómo&lt;/em&gt; lo hacía el código que había generado el compilador original.&lt;/p&gt;

&lt;p&gt;La traducción binaria convierte código x86-32 en instrucciones nativas del anfitrión.&lt;/p&gt;

&lt;h2&gt;
  
  
  El antipatrón: 256 KB para inicializar 64 KB
&lt;/h2&gt;

&lt;p&gt;La forma estándar de reservar e inicializar un bloque grande en la pila tiene tres pasos: hacer un &lt;em&gt;stack probe&lt;/em&gt; para garantizar que hay 64 KB disponibles, restar 65.536 al puntero de pila y, por último, inicializar la memoria con un bucle pequeño y apretado. Ese bucle suele caber en un puñado de instrucciones.&lt;/p&gt;

&lt;p&gt;Pero el compilador que generó ese binario consideró que un bucle era demasiado mundano. En lugar de emitirlo, &lt;strong&gt;desenrolló&lt;/strong&gt; por completo la inicialización: 65.536 instrucciones individuales de 'escribir un byte en memoria', una por cada byte del buffer. Cada una de esas instrucciones ocupaba 4 bytes.&lt;/p&gt;

&lt;p&gt;La aritmética es demoledora: 65.536 instrucciones × 4 bytes = 262.144 bytes. Es decir, &lt;strong&gt;256 KB de código para inicializar 64 KB de datos&lt;/strong&gt;. Una desproporción que ofende a cualquiera que haya mirado un perfilador de cerca.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💭 Clave:&lt;/strong&gt; No es que el bucle desenrollado fuera lento por byte. El problema es el tamaño del propio código: 256 KB de instrucciones arrasan con la caché de instrucciones y, en un emulador, también con el tiempo de traducción.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Veamos el contraste a nivel de ensamblador. Así se veía, en esencia, el código 'optimizado' por el compilador:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="c1"&gt;; Inicializar 64 KB en la pila — version desenrollada por el compilador&lt;/span&gt;
&lt;span class="nf"&gt;mov&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt; &lt;span class="nv"&gt;ptr&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;esp&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="mi"&gt;0&lt;/span&gt;
&lt;span class="nf"&gt;mov&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt; &lt;span class="nv"&gt;ptr&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;esp&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="mi"&gt;0&lt;/span&gt;
&lt;span class="nf"&gt;mov&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt; &lt;span class="nv"&gt;ptr&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;esp&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="c1"&gt;; ... 65.533 instrucciones mas, una por cada byte ...&lt;/span&gt;
&lt;span class="nf"&gt;mov&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt; &lt;span class="nv"&gt;ptr&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;esp&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;65535&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="c1"&gt;; total: 65.536 instrucciones x 4 bytes = 256 KB de codigo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y así de compacto puede expresarse exactamente lo mismo con un bucle apretado, usando la instrucción de relleno de cadenas del x86:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nasm"&gt;&lt;code&gt;&lt;span class="c1"&gt;; Equivalente compacto — pocas instrucciones, 64 KB inicializados&lt;/span&gt;
&lt;span class="nf"&gt;xor&lt;/span&gt;    &lt;span class="nb"&gt;eax&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;eax&lt;/span&gt;        &lt;span class="c1"&gt;; valor a escribir = 0&lt;/span&gt;
&lt;span class="nf"&gt;mov&lt;/span&gt;    &lt;span class="nb"&gt;ecx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;65536&lt;/span&gt;      &lt;span class="c1"&gt;; cantidad de bytes&lt;/span&gt;
&lt;span class="nf"&gt;lea&lt;/span&gt;    &lt;span class="nb"&gt;edi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;esp&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;      &lt;span class="c1"&gt;; destino = base del buffer en la pila&lt;/span&gt;
&lt;span class="nf"&gt;rep&lt;/span&gt;    &lt;span class="nv"&gt;stosb&lt;/span&gt;           &lt;span class="c1"&gt;; rellena ECX bytes con AL desde EDI&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Cómo el emulador x86 detectó el patrón
&lt;/h2&gt;

&lt;p&gt;Lo que el equipo hizo fue elegante en su pragmatismo. En vez de tragarse la traducción literal de 65.536 instrucciones —que habría inflado el código nativo generado y castigado tanto la memoria como el tiempo de arranque—, &lt;strong&gt;agregaron código especial al traductor para reconocer esa función concreta y reemplazarla por su equivalente compacto&lt;/strong&gt;. El emulador, al detectar la firma del antipatrón, emitía un bucle apretado en lugar de la avalancha de escrituras byte a byte.&lt;/p&gt;

&lt;p&gt;Es la clase de decisión que solo tiene sentido cuando controlás el motor de ejecución. Un compilador JIT no está obligado a reproducir el código fuente instrucción por instrucción: está obligado a reproducir su &lt;em&gt;comportamiento observable&lt;/em&gt;. Y rellenar 64 KB con ceros es exactamente igual de correcto con 5 instrucciones que con 65.536.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph LR
  A["Codigo x86-32"] --&amp;gt; B["Traductor JIT"]
  B --&amp;gt; C{"Patron basura?"}
  C --&amp;gt;|"Si"| D["Emitir bucle compacto"]
  C --&amp;gt;|"No"| E["Traduccion normal"]
  D --&amp;gt; F["Codigo nativo"]
  E --&amp;gt; F
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Desenrollar un bucle al extremo cambia velocidad teórica por peso de código.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contexto e historia: emuladores y traducción binaria
&lt;/h2&gt;

&lt;p&gt;La frase 'Windows incluyó un emulador de x86' no señala un único producto: ha pasado varias veces. Cuando Windows NT corría sobre el procesador Alpha de DEC, existía &lt;em&gt;FX!32&lt;/em&gt;, un sistema híbrido que combinaba emulación y traducción binaria para ejecutar aplicaciones x86 con rendimiento sorprendente para la época. Más tarde, Windows sobre Itanium incluyó su propia capa de ejecución x86. Y en la era moderna, Windows on ARM trae un emulador x86/x64 que permite correr aplicaciones de escritorio tradicionales sobre chips ARM, una pieza clave de los equipos con Snapdragon.&lt;/p&gt;

&lt;p&gt;En todos los casos, la diferencia entre interpretar y traducir es enorme. Un intérprete lee cada instrucción del huésped y la simula en software, lo que multiplica el costo por instrucción. La &lt;strong&gt;traducción binaria&lt;/strong&gt; compila bloques completos a código nativo una sola vez y luego los reutiliza, igual que un JIT de Java o de .NET reaprovecha el código generado. El precio que se paga es la complejidad del traductor y el riesgo de que el código generado crezca demasiado, justo lo que ocurrió aquí.&lt;/p&gt;

&lt;p&gt;Apple recorrió un camino parecido con &lt;em&gt;Rosetta 2&lt;/em&gt; en la transición de Intel a Apple Silicon: traducción binaria anticipada (AOT) más un componente JIT para código generado en tiempo de ejecución. El patrón se repite porque funciona.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por qué un compilador genera código así
&lt;/h2&gt;

&lt;p&gt;El &lt;em&gt;loop unrolling&lt;/em&gt; (desenrollado de bucles) es una optimización legítima y antigua. La idea: replicar el cuerpo del bucle varias veces para reducir el costo del salto y la comprobación de la condición en cada iteración, y de paso exponer más paralelismo a nivel de instrucción para que el procesador llene mejor su pipeline. Desenrollar por un factor de 4 u 8 suele ser razonable.&lt;/p&gt;

&lt;p&gt;El problema es el extremo. Desenrollar por un factor de 65.536 deja de ser una optimización y se convierte en una patología. El cuerpo del bucle era una sola escritura de byte; el 'ahorro' de eliminar el contador y el salto es minúsculo frente al costo de generar un cuarto de megabyte de instrucciones que destrozan la caché de instrucciones y, en un binario, inflan el tamaño del ejecutable.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Ojo:&lt;/strong&gt; Más instrucciones nunca es gratis. Un bucle desenrollado al extremo puede ser más lento que el compacto si expulsa código útil de la caché L1 de instrucciones. La microoptimización a ciegas suele ser contraproducente.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Como apuntó un lector del blog original, los procesadores modernos ya hacen una forma de desenrollado en su pipeline de prefetch, y hay quien diseña su código deliberadamente para aprovecharlo. Existe el viejo compromiso entre código rápido pero glotón de memoria y código compacto pero más lento. Pero usar 256 KB para inicializar 64 KB no cae en ninguna zona sensata de ese compromiso: es, simplemente, un error de criterio del compilador.&lt;/p&gt;

&lt;h2&gt;
  
  
  Impacto y análisis para desarrolladores en LATAM
&lt;/h2&gt;

&lt;p&gt;Más allá de la anécdota, hay lecciones concretas para quien escribe o ejecuta código en producción. La primera: &lt;strong&gt;medir antes de optimizar&lt;/strong&gt;. Ninguna intuición sustituye a un perfilador. El compilador 'creyó' que desenrollar era mejor; un benchmark real habría mostrado lo contrario en segundos.&lt;/p&gt;

&lt;p&gt;La segunda: cuando controlás la capa de ejecución —un intérprete propio, un transpilador, un motor de plantillas, un JIT— tenés libertad para reescribir patrones a algo equivalente y mejor. Muchos motores de bases de datos y runtimes de lenguajes hacen exactamente esto: reconocen patrones comunes y los sustituyen por implementaciones optimizadas. No es trampa; es ingeniería.&lt;/p&gt;

&lt;p&gt;La tercera: el tamaño del código importa tanto como la cantidad de operaciones. En entornos con recursos ajustados —desde un microcontrolador hasta un contenedor con límites estrictos de memoria— un binario hinchado puede ser peor que uno con un bucle 'lento'. La caché de instrucciones es un recurso finito y caro.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Tip:&lt;/strong&gt; Antes de desenrollar a mano, confiá en intrínsecos como &lt;code&gt;memset&lt;/code&gt; o en las instrucciones de cadena del CPU (&lt;code&gt;rep stosb&lt;/code&gt;). El compilador y la microarquitectura suelen elegir mejor que vos para el hardware concreto.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;La historia es vieja, pero el problema es perfectamente actual. La transición de la industria hacia ARM —en servidores, portátiles y la nube— ha vuelto a poner la traducción binaria en el centro: Windows on ARM, Rosetta 2 de Apple, QEMU y proyectos como FEX o Box64 en Linux dependen de traductores que deben tomar decisiones inteligentes sobre el código que reciben, sin poder confiar en que venga limpio.&lt;/p&gt;

&lt;p&gt;Esos traductores enfrentan a diario binarios generados por compiladores de décadas distintas, con heurísticas que ya no tienen sentido en el hardware actual. La capacidad de detectar antipatrones y reescribirlos —como hizo aquel equipo del emulador x86— seguirá siendo una ventaja competitiva. La anécdota de Raymond Chen no es nostalgia: es un recordatorio de que el código que escribimos hoy puede terminar ejecutándose en máquinas que ni imaginamos, traducido por sistemas que juzgarán nuestras decisiones.&lt;/p&gt;

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

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

&lt;h3&gt;
  
  
  ¿Qué es un emulador x86 con traducción binaria?
&lt;/h3&gt;

&lt;p&gt;Es un sistema que ejecuta binarios x86 sobre un procesador de otra arquitectura compilando bloques de código x86 a instrucciones nativas del anfitrión, en lugar de interpretarlos una por una. Funciona como un compilador JIT y rinde mucho más que un intérprete clásico.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué 256 KB de código para inicializar 64 KB?
&lt;/h3&gt;

&lt;p&gt;El compilador desenrolló completamente el bucle de inicialización en 65.536 instrucciones de 'escribir un byte', cada una de 4 bytes. 65.536 × 4 = 262.144 bytes ≈ 256 KB, contra los 64 KB de datos que rellenaba.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿El loop unrolling es malo entonces?
&lt;/h3&gt;

&lt;p&gt;No en general. Desenrollar por un factor moderado (4 u 8) reduce el costo de saltos y mejora el paralelismo a nivel de instrucción. El problema es el extremo: un factor de 65.536 infla el código y castiga la caché de instrucciones, anulando cualquier ahorro.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo arregló el problema el equipo del emulador?
&lt;/h3&gt;

&lt;p&gt;Agregaron código al traductor binario para reconocer ese patrón concreto y reemplazarlo por un bucle compacto equivalente, del tipo &lt;code&gt;rep stosb&lt;/code&gt;. Como un JIT solo debe preservar el comportamiento observable, la sustitución es totalmente correcta.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué procesador era?
&lt;/h3&gt;

&lt;p&gt;Raymond Chen no lo precisó. Windows ha incluido emuladores de x86 en varias plataformas: Alpha (con FX!32), Itanium y, hoy, ARM. La anécdota podría aplicar a cualquiera de ellas.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Sigue siendo relevante esto en 2026?
&lt;/h3&gt;

&lt;p&gt;Sí. La migración hacia ARM en escritorio, portátiles y nube ha revitalizado la traducción binaria (Windows on ARM, Rosetta 2, QEMU, FEX, Box64). Detectar y reescribir antipatrones en código heredado sigue siendo una capacidad valiosa.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://devblogs.microsoft.com/oldnewthing/20260615-00/?p=112419" rel="noopener noreferrer"&gt;The Old New Thing — Raymond Chen&lt;/a&gt; — relato original del caso del emulador x86 y el código basura.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Binary_translation" rel="noopener noreferrer"&gt;Wikipedia: Binary translation&lt;/a&gt; — explicación de la traducción binaria estática y dinámica.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Loop_unrolling" rel="noopener noreferrer"&gt;Wikipedia: Loop unrolling&lt;/a&gt; — la optimización de desenrollado de bucles y sus compromisos.&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>Iroh 1.0: conexiones P2P por llave y soporte Python, Node, Swift y Kotlin</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Mon, 15 Jun 2026 20:26:36 +0000</pubDate>
      <link>https://dev.to/lu1tr0n/iroh-10-conexiones-p2p-por-llave-y-soporte-python-node-swift-y-kotlin-2g2i</link>
      <guid>https://dev.to/lu1tr0n/iroh-10-conexiones-p2p-por-llave-y-soporte-python-node-swift-y-kotlin-2g2i</guid>
      <description>&lt;p&gt;El equipo detrás de &lt;strong&gt;Iroh 1.0&lt;/strong&gt; publicó la primera versión estable de su librería de red con una premisa que suena a herejía para quien creció con TCP/IP: dejar de marcar direcciones IP y empezar a marcar llaves criptográficas. La idea es que tu dispositivo sea direccionable de forma segura sin importar dónde esté, detrás de cuántos firewalls o tras cuántos cambios de red.&lt;/p&gt;

&lt;p&gt;Tras más de cuatro años de desarrollo abierto y 65 versiones previas, este lanzamiento congela el protocolo y las APIs. La pregunta para quien construye apps en LATAM es directa: ¿vale la pena cambiar la dirección IP por una llave? Veamos qué cambió y por qué importa.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Iroh 1.0 es la primera versión estable tras 4 años de desarrollo abierto y 65 versiones previas.&lt;/li&gt;
&lt;li&gt;La idea central: marcar (dial) una llave criptográfica en lugar de una IP, que el dispositivo controla y conserva al moverse.&lt;/li&gt;
&lt;li&gt;Los relays públicos del proyecto vieron más de 200 millones de endpoints creados en los últimos 30 días.&lt;/li&gt;
&lt;li&gt;Implementa QUIC multipath y NAT traversal sobre QUIC para abrir conexiones directas y cambiar de ruta en caliente.&lt;/li&gt;
&lt;li&gt;Suma soporte oficial para Python, Node.js, Swift y Kotlin, además del crate de Rust.&lt;/li&gt;
&lt;li&gt;Iroh asegura estabilidad del protocolo de cable: un endpoint v1 habla con otro v1 sin importar versión menor ni lenguaje.&lt;/li&gt;
&lt;li&gt;Es común que el 95% de los datos viajen directo entre dispositivos, reduciendo saltos por la nube y la factura de egress.&lt;/li&gt;
&lt;li&gt;El soporte de relays públicos para la rama 0.35x continúa hasta el 31 de diciembre de 2026.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Qué pasó: Iroh llega a su versión 1.0
&lt;/h2&gt;

&lt;p&gt;Iroh 1.0 marca el primer lanzamiento mayor del proyecto y, con él, un compromiso de estabilidad que antes no existía. La librería describe a sí misma como una capa de red que "simplemente funciona": uno le entrega la llave pública del dispositivo con el que quiere hablar y la librería se encarga del resto: descubrir rutas, atravesar NATs, abrir una conexión directa y cifrarla. Donde antes había que pausar funcionalidades por el costo de mantenimiento de las APIs, ahora hay una promesa explícita de compatibilidad.&lt;/p&gt;

&lt;p&gt;El proyecto no nace hoy. Según el anuncio oficial, Iroh ya corre en millones de dispositivos y se usa para transmitir video, entrenar modelos de lenguaje, hablar con agentes, asegurar chats, jugar en línea y enviar archivos. La novedad de la versión 1.0 no es la capacidad técnica, que venía madurando, sino la garantía de que lo que construyas hoy seguirá funcionando mañana.&lt;/p&gt;

&lt;p&gt;Iroh marca una llave pública en lugar de una dirección IP.&lt;/p&gt;

&lt;h2&gt;
  
  
  Marcar llaves, no IPs: la idea central de Iroh 1.0
&lt;/h2&gt;

&lt;p&gt;El argumento de fondo es sencillo y, a la vez, profundo. Una dirección IP puede romperse sin aviso y está fuera del control de tu dispositivo: cambia cuando saltas de la red móvil al WiFi, cuando el proveedor reasigna el bloque, o cuando un firewall corporativo te deja inalcanzable. Una llave, en cambio, la creas y la controlas tú. Permanece igual aunque el dispositivo se mueva, y es tuya para conservar o desechar.&lt;/p&gt;

&lt;p&gt;Sobre esa llave se construye todo lo demás. Se usa para asegurar la conexión, y como todos los datos que llegan por esa conexión quedan protegidos por la misma llave, encima de ella se levantan identidad, permisos y atribución. Esa misma llave funciona además como dirección para marcar al dispositivo, sin importar en qué parte del mundo esté. En palabras del propio equipo, convierte a internet en un &lt;em&gt;localhost&lt;/em&gt; seguro.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💭 Clave:&lt;/strong&gt; separar la identidad (la llave, estable y tuya) de la ubicación (la IP, volátil y ajena) es el cambio conceptual que sostiene a Iroh 1.0. Es la misma lógica que hace robusto a un sistema cuando la red por debajo es caótica.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Contexto e historia: 4 años y 65 versiones
&lt;/h2&gt;

&lt;p&gt;Iroh 1.0 es la culminación de un camino largo. Durante el desarrollo, el equipo migró hacia estándares abiertos, prefiriendo borradores del IETF siempre que fue posible. Esa decisión es relevante: en vez de inventar un protocolo propietario, Iroh apuesta por interoperar con un ecosistema más amplio y por no quedar atrapado en una solución cerrada.&lt;/p&gt;

&lt;p&gt;El proyecto también pasó por decisiones difíciles. En algún momento pausaron el soporte de FFI (la interfaz para usar Iroh desde otros lenguajes) por el costo de mantenerlo al día con una API que aún cambiaba mucho, y prometieron retomarlo con una API estable en la 1.0. Este lanzamiento cumple esa promesa. La historia de 65 versiones previas no es anecdótica: explica por qué el equipo se siente cómodo congelando el protocolo ahora y no antes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo funciona Iroh 1.0: QUIC multipath y NAT traversal
&lt;/h2&gt;

&lt;p&gt;Debajo de la abstracción de "marcar una llave" hay ingeniería de red densa. El equipo construyó su propia implementación de &lt;strong&gt;QUIC multipath&lt;/strong&gt;, lo que permite a Iroh administrar varias rutas dentro de una misma conexión e intercambiarlas en caliente conforme cambian las condiciones de red. Si te mueves de una red a otra, la conexión no se cae: cambia de camino sin que la aplicación se entere.&lt;/p&gt;

&lt;p&gt;A eso se suma una implementación de &lt;strong&gt;NAT traversal&lt;/strong&gt; sobre QUIC, que abre conexiones directas entre dispositivos manteniendo cifrados los detalles de la conexión. Iroh agrega configuraciones &lt;em&gt;local-first&lt;/em&gt; para encontrar y conectar dispositivos en la red local sin acceso a internet, se compila a WebAssembly para correr en el navegador, y admite transportes personalizados como Bluetooth Low-Energy, LoRa (en construcción), WiFi Aware o incluso Tor, todos bajo la misma abstracción de marcar por llave.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph LR
  A["Dispositivo A (llave pública)"] --&amp;gt;|"marca la llave"| R["Relay n0"]
  R -.-&amp;gt;|"NAT traversal"| B["Dispositivo B (llave pública)"]
  A ==&amp;gt;|"conexión directa cifrada (95%)"| B
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El flujo típico es el del diagrama: el relay ayuda a que dos dispositivos se descubran y atraviesen sus NATs, pero una vez establecida la ruta directa, la mayor parte del tráfico deja de pasar por la nube.&lt;/p&gt;

&lt;p&gt;El relay solo ayuda a establecer la conexión; los datos van directos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Datos y cifras del lanzamiento
&lt;/h2&gt;

&lt;p&gt;Las cifras que acompañan el anuncio dan escala al proyecto. Los relays públicos que opera el equipo vieron más de &lt;strong&gt;200 millones de endpoints creados en los últimos 30 días&lt;/strong&gt;. Y en cuanto a eficiencia, es normal observar que el &lt;strong&gt;95% de los datos&lt;/strong&gt; de una conexión viajan directamente entre dispositivos. Ir directo significa menos saltos por la nube, lo que reduce tu factura de egress, y menos saltos por routers, lo que hace a internet más eficiente en conjunto.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Tip:&lt;/strong&gt; el ahorro de egress no es teórico. Si hoy pagas por mover datos entre usuarios a través de tu backend en la nube, una arquitectura donde el 95% del tráfico va directo entre clientes recorta esa partida de forma directa.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Soporte para Python, Node.js, Swift y Kotlin
&lt;/h2&gt;

&lt;p&gt;Una de las novedades más prácticas de Iroh 1.0 es el regreso del soporte multilenguaje. Además del crate de Rust, ahora hay bindings oficiales para Python, Node.js, Swift y Kotlin. Esto cambia el panorama: puedes incrustar Iroh en una app de iOS en Swift o en una app de Android en Kotlin, o prototipar rápido desde Python o Node.js sin tocar Rust.&lt;/p&gt;

&lt;p&gt;Un ejemplo conceptual en Python de cómo se vería crear un endpoint y conectar por llave (consultá la documentación oficial para la API exacta de tu versión):&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;iroh&lt;/span&gt;

&lt;span class="c1"&gt;# Crear un endpoint con su propia llave (node id)
&lt;/span&gt;&lt;span class="n"&gt;endpoint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;iroh&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Endpoint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;mi_llave&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;node_id&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;Mi node id (llave): &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;mi_llave&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;span class="c1"&gt;# Conectar a otro dispositivo usando SU llave, no su IP
&lt;/span&gt;&lt;span class="n"&gt;llave_destino&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
&lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;llave_destino&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alpn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sa"&gt;b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mi-protocolo/0&lt;/span&gt;&lt;span class="sh"&gt;"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Conexion directa establecida&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;h2&gt;
  
  
  Instalación de Iroh 1.0 en Windows, macOS y Linux
&lt;/h2&gt;

&lt;p&gt;La instalación depende del lenguaje. Para el crate de Rust necesitás el toolchain instalado. Acá los comandos según tu sistema operativo:&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;# --- Instalar Rust ---&lt;/span&gt;
&lt;span class="c"&gt;# Windows (PowerShell): descargar rustup-init.exe desde https://rustup.rs&lt;/span&gt;
&lt;span class="c"&gt;#   o con winget:&lt;/span&gt;
winget &lt;span class="nb"&gt;install &lt;/span&gt;Rustlang.Rustup

&lt;span class="c"&gt;# macOS / Linux:&lt;/span&gt;
curl &lt;span class="nt"&gt;--proto&lt;/span&gt; &lt;span class="s1"&gt;'=https'&lt;/span&gt; &lt;span class="nt"&gt;--tlsv1&lt;/span&gt;.2 &lt;span class="nt"&gt;-sSf&lt;/span&gt; https://sh.rustup.rs | sh

&lt;span class="c"&gt;# --- Agregar iroh al proyecto (igual en los 3 SO) ---&lt;/span&gt;
cargo add iroh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para los lenguajes de scripting, los gestores de paquetes hacen el trabajo y son idénticos entre plataformas:&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;# Python (Windows / macOS / Linux)&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;iroh

&lt;span class="c"&gt;# Node.js (Windows / macOS / Linux)&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; @number0/iroh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Ojo:&lt;/strong&gt; los nombres exactos de paquete y la firma de la API pueden variar entre versiones de los bindings. Antes de fijar versiones en producción, verificá la documentación generada de la API para el lenguaje que uses.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Estabilidad del protocolo y política de versiones
&lt;/h2&gt;

&lt;p&gt;Iroh 1.0 afirma estabilidad tanto del protocolo de cable como de las APIs de cada lenguaje: un endpoint v1 podrá comunicarse con otro endpoint v1 sin importar la versión menor ni el lenguaje. En el futuro podrían versionar ambos aspectos de forma independiente —por ejemplo, sacar una versión 2 de la API de un lenguaje manteniendo compatibilidad en el cable—, pero cualquier cambio que afecte la estabilidad del protocolo coincidirá siempre con un lanzamiento mayor.&lt;/p&gt;

&lt;p&gt;Sobre soporte, el equipo publicó un calendario. Las versiones mayores y menores posteriores a la 1.0 se soportan según ese cronograma. La rama menor 0.35 no recibirá más releases, aunque el soporte de relays públicos para 0.35x continúa hasta el &lt;strong&gt;31 de diciembre de 2026&lt;/strong&gt;. Las versiones canary (0.9x) y los release candidates (1.0.0-rcX) dejan de soportarse, con relays públicos operativos hasta el 30 de septiembre de 2026. Un detalle de operación: el equipo actualiza los relays públicos a la última versión poco después de cada release, normalmente en 24 horas, y los cambios que rompan compatibilidad de cable estrenan URLs nuevas para que los clientes viejos sigan funcionando.&lt;/p&gt;

&lt;h2&gt;
  
  
  Impacto y análisis para desarrolladores en LATAM
&lt;/h2&gt;

&lt;p&gt;Para el contexto latinoamericano, donde el NAT de operador (CGNAT) es la norma y muchos usuarios nunca tienen una IP pública estable, el modelo de Iroh 1.0 resuelve un dolor real. Las apps peer-to-peer —transferencia de archivos, juegos, sincronización, llamadas— suelen sufrir aquí porque establecer conexión directa entre dos clientes detrás de CGNAT es difícil. Iroh hace de ese problema su especialidad.&lt;/p&gt;

&lt;p&gt;El ahorro de egress también pesa más en mercados sensibles al costo. Si tu producto mueve datos entre usuarios a través de servidores en la nube y cobrás en moneda local mientras pagás infraestructura en dólares, mover el 95% del tráfico a conexiones directas mejora márgenes de forma tangible. Sumado a los bindings para Swift y Kotlin, Iroh 1.0 se vuelve una opción concreta para apps móviles regionales que quieran funciones colaborativas sin levantar y pagar una flota de servidores intermediarios.&lt;/p&gt;

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

&lt;p&gt;El mensaje del equipo es que el momento de construir es ahora: con la 1.0 hay un stack de red maduro que se puede integrar con confianza. Las piezas en desarrollo, como el transporte sobre LoRa, apuntan a escenarios de conectividad extrema —IoT rural, redes mesh, zonas sin internet—, justo donde la abstracción de "marcar una llave" en lugar de una IP brilla más. Habrá que ver cómo evoluciona la adopción ahora que la barrera de la inestabilidad de API quedó atrás y el soporte multilenguaje abre la puerta a comunidades fuera de Rust.&lt;/p&gt;

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

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

&lt;h3&gt;
  
  
  ¿Qué significa "marcar llaves, no IPs" en Iroh 1.0?
&lt;/h3&gt;

&lt;p&gt;Significa que identificás y conectás a un dispositivo por su llave criptográfica pública (su node id) en lugar de por una dirección IP. La llave es estable y la controla el dispositivo; la IP es volátil y depende de la red. Iroh se encarga de encontrar la ruta real por debajo.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Necesito saber Rust para usar Iroh?
&lt;/h3&gt;

&lt;p&gt;No. Aunque Iroh está escrito en Rust, la versión 1.0 ofrece bindings oficiales para Python, Node.js, Swift y Kotlin, así que podés integrarlo desde esos lenguajes sin escribir Rust.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Los datos pasan siempre por un servidor relay?
&lt;/h3&gt;

&lt;p&gt;No necesariamente. El relay ayuda a que dos dispositivos se descubran y atraviesen sus NATs, pero una vez establecida la conexión directa es común que el 95% de los datos viajen directamente entre los dispositivos, sin pasar por la nube.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Iroh 1.0 garantiza compatibilidad hacia el futuro?
&lt;/h3&gt;

&lt;p&gt;Sí dentro de la versión mayor 1: un endpoint v1 puede comunicarse con otro v1 sin importar la versión menor ni el lenguaje. Cualquier cambio que rompa la compatibilidad del protocolo de cable coincidirá con un lanzamiento mayor.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Hasta cuándo funcionan los relays de versiones viejas?
&lt;/h3&gt;

&lt;p&gt;Los relays públicos para la rama 0.35x operan hasta el 31 de diciembre de 2026, mientras que los de versiones canary (0.9x) y los release candidates (1.0.0-rcX) lo hacen hasta el 30 de septiembre de 2026.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Para qué casos de uso sirve Iroh?
&lt;/h3&gt;

&lt;p&gt;Según el equipo, ya se usa para transmitir video, entrenar modelos de lenguaje, hablar con agentes, asegurar chats, jugar, sincronizar y enviar archivos. Brilla especialmente en escenarios peer-to-peer detrás de NAT, comunes en redes móviles y CGNAT.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.iroh.computer/blog/v1" rel="noopener noreferrer"&gt;Iroh 1.0 - Dial Keys, not IPs&lt;/a&gt; — anuncio oficial del lanzamiento.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/n0-computer/iroh" rel="noopener noreferrer"&gt;n0-computer/iroh en GitHub&lt;/a&gt; — código fuente, issues y releases del proyecto.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.iroh.computer/" rel="noopener noreferrer"&gt;Documentación oficial de Iroh&lt;/a&gt; — guías, quickstart y referencia de API.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://datatracker.ietf.org/doc/draft-ietf-quic-multipath/" rel="noopener noreferrer"&gt;Draft IETF: QUIC Multipath&lt;/a&gt; — borrador del estándar en que se inspira el multipath de Iroh.&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>Llama 3.1 405B consume 0,39 Wh por consulta, según ML.ENERGY</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Mon, 15 Jun 2026 16:10:57 +0000</pubDate>
      <link>https://dev.to/lu1tr0n/llama-31-405b-consume-039-wh-por-consulta-segun-mlenergy-1155</link>
      <guid>https://dev.to/lu1tr0n/llama-31-405b-consume-039-wh-por-consulta-segun-mlenergy-1155</guid>
      <description>&lt;p&gt;El &lt;strong&gt;consumo energético de la IA&lt;/strong&gt; dejó de ser una estimación de servilleta. Investigadores de la Universidad de Michigan publicaron &lt;strong&gt;ML.ENERGY&lt;/strong&gt;, un benchmark abierto que mide cuánta energía gasta realmente cada modelo de inteligencia artificial al responder, modelo por modelo y token por token.&lt;/p&gt;

&lt;p&gt;El dato que rompe el consenso: las cifras que circulan, casi todas derivadas del TDP de la GPU, exageran el gasto real hasta 4,1 veces. La medición directa cuenta otra historia, y por primera vez está disponible en una tabla pública y reproducible.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;ML.ENERGY, de la Universidad de Michigan, mide el consumo energético real de más de 40 modelos de IA por consulta.&lt;/li&gt;
&lt;li&gt;Llama 3.1 405B gasta una mediana de 0,39 Wh por consulta; Mixtral 8x22B baja a 0,06 Wh y Llama 3.1 8B a 0,02 Wh.&lt;/li&gt;
&lt;li&gt;La herramienta Zeus mide la energía directa de la GPU, que supone el 50-70% de la potencia del centro de datos.&lt;/li&gt;
&lt;li&gt;Estimar por TDP exagera el consumo: hasta 4,1 veces más para CodeGemma 2B frente a la medición real.&lt;/li&gt;
&lt;li&gt;El batching amortiza energía: a mayor lote, menor gasto por consulta en la fase de generación de tokens.&lt;/li&gt;
&lt;li&gt;Optimizar sin cambiar el cómputo ahorra más del 40%: un 44% en Llama 3.1 8B al relajar la latencia.&lt;/li&gt;
&lt;li&gt;La generación de texto tiene baja intensidad de cómputo; la difusión de imágenes se acerca al tope de la GPU.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Un equipo del grupo SymbioticLab de la Universidad de Michigan, liderado por el profesor &lt;strong&gt;Mosharaf Chowdhury&lt;/strong&gt; y con Jae-Won Chung como primer autor, actualizó en febrero de 2026 el &lt;strong&gt;ML.ENERGY Leaderboard&lt;/strong&gt;, una tabla clasificatoria que ordena modelos generativos según la energía que consumen al ejecutar inferencia. No es una proyección teórica: cada cifra proviene de medir el gasto eléctrico real de las GPU mientras los modelos responden.&lt;/p&gt;

&lt;p&gt;El proyecto se apoya en &lt;strong&gt;Zeus&lt;/strong&gt;, una biblioteca de código abierto desarrollada por el mismo grupo que lee los contadores de energía de la GPU por software, sin necesidad de instrumentación física. La tabla, su código y el conjunto de datos están publicados, de modo que cualquiera puede reproducir las mediciones o añadir modelos nuevos. El acompañamiento académico es el artículo &lt;em&gt;The ML.ENERGY Benchmark&lt;/em&gt;, que detalla la metodología y los resultados sobre unas 40 arquitecturas distintas.&lt;/p&gt;

&lt;p&gt;Las GPU concentran el 50-70% de la potencia provisionada en un centro de datos de IA.&lt;/p&gt;

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

&lt;p&gt;La pregunta "¿cuánta energía gasta una consulta a un modelo de IA?" se volvió central a medida que los centros de datos crecían. El problema es que casi todas las respuestas públicas se calculaban de la misma forma poco fiable: tomar el TDP (la potencia máxima de diseño) de la GPU, multiplicarlo por un tiempo estimado y repartirlo entre las consultas. Es cómodo, pero parte de un supuesto falso, que el chip trabaja siempre a tope.&lt;/p&gt;

&lt;p&gt;En la práctica, generar texto rara vez exige el máximo de la GPU. La fase de decodificación —producir un token tras otro— es un proceso limitado por la memoria, no por el cálculo: el acelerador pasa buena parte del tiempo esperando datos en lugar de quemando vatios. Por eso el TDP es un mal estimador. ML.ENERGY nació justamente para sustituir ese atajo por una medición directa y comparable, y para mostrar que la conversación sobre el consumo energético de la IA estaba apoyada en números inflados.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💭 Clave:&lt;/strong&gt; El TDP mide cuánto &lt;em&gt;podría&lt;/em&gt; consumir una GPU, no cuánto consume de verdad al generar texto. Confundir ambos infla las estimaciones hasta varias veces.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Datos y cifras: el consumo energético de la IA medido por consulta
&lt;/h2&gt;

&lt;p&gt;Las mediciones se hicieron sobre GPU NVIDIA A100 (40 GB) y H100 (80 GB) en instancias de AWS, midiendo en estado estacionario, es decir, cuando el servidor está saturado de peticiones tal como ocurre en producción. La energía por consulta se calcula como la energía total del lote dividida entre el número de peticiones, multiplicada por la longitud media de salida. Estos son algunos resultados representativos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Llama 3.1 405B&lt;/strong&gt; — mediana de unos 0,39 Wh por consulta, de los más altos entre los modelos densos grandes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mixtral 8x22B&lt;/strong&gt; — alrededor de 0,06 Wh por consulta gracias a su arquitectura de mezcla de expertos (MoE), que solo activa una fracción de sus parámetros.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Llama 3.1 8B&lt;/strong&gt; — en torno a 0,02 Wh por consulta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mistral 7B&lt;/strong&gt; — cerca de 0,01 Wh en una tarea de chat típica.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La diferencia entre el modelo más pesado y el más ligero supera un factor de 30. También aparece el hallazgo que más matiza el discurso público: estimar por TDP exagera el gasto hasta &lt;strong&gt;4,1 veces&lt;/strong&gt; en el caso de CodeGemma 2B frente a la medición real. Otro contraste interesante es entre tareas: la generación de imágenes con modelos de difusión se acerca al límite de potencia de la GPU, mientras que la generación de texto se queda muy por debajo.&lt;/p&gt;

&lt;p&gt;El flujo de medición es conceptualmente sencillo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph LR
  A["Consulta del usuario"] --&amp;gt; B["Servidor de inferencia (lote)"]
  B --&amp;gt; C["GPU genera tokens"]
  C --&amp;gt; D["Zeus mide la energia de la GPU"]
  D --&amp;gt; E["Energia por consulta = energia del lote / numero de consultas"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Medir con Zeus dentro del propio servicio de inferencia es directo. Un esquema simplificado del patrón:&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;from&lt;/span&gt; &lt;span class="n"&gt;zeus.monitor&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ZeusMonitor&lt;/span&gt;

&lt;span class="n"&gt;monitor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ZeusMonitor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gpu_indices&lt;/span&gt;&lt;span class="o"&gt;=&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="n"&gt;monitor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;begin_window&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;inferencia&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# El modelo genera la respuesta para todo el lote
&lt;/span&gt;&lt;span class="n"&gt;salida&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;modelo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lote_de_prompts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;medida&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;monitor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end_window&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;inferencia&lt;/span&gt;&lt;span class="sh"&gt;"&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;Energia del lote: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;medida&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total_energy&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; J&lt;/span&gt;&lt;span class="sh"&gt;"&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;Por consulta: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;medida&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total_energy&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;lote_de_prompts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; J&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 detalle decisivo es el &lt;strong&gt;batching&lt;/strong&gt;. En producción, decenas de consultas se procesan juntas en un mismo lote, y la energía se reparte entre todas. Cuanto mayor es el lote, menor es el gasto por consulta, porque el coste fijo de cargar los pesos del modelo en memoria se amortiza entre más peticiones. Por eso medir un modelo respondiendo a un único prompt aislado sobreestima brutalmente el consumo: nadie sirve un modelo así.&lt;/p&gt;

&lt;p&gt;El gasto por consulta varía más de 30 veces entre el modelo más pesado y el más ligero.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Tip:&lt;/strong&gt; Si necesitás reducir el consumo energético de la IA en tu propio despliegue, lo primero no es cambiar de modelo, sino aumentar el tamaño de lote y relajar la latencia donde el caso de uso lo permita.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;La consecuencia práctica es doble. Por un lado, ML.ENERGY ofrece a quien despliega modelos una base empírica para elegir: un MoE como Mixtral puede dar calidad comparable a un denso grande con una fracción del gasto, y un modelo de 8B resuelve muchas tareas con la vigésima parte de la energía de uno de 405B. Por otro, el benchmark desmonta titulares alarmistas construidos sobre estimaciones de TDP: el consumo energético de la IA es real y crece, pero los números que circulaban estaban, en muchos casos, varias veces inflados.&lt;/p&gt;

&lt;p&gt;El trabajo también muestra que se puede ahorrar mucho sin tocar el resultado del modelo. Aplicando recomendaciones de optimización automática —ajustar la frecuencia de la GPU, el tamaño de lote o los límites de latencia— el equipo logró reducciones de más del 40%, con un caso concreto del &lt;strong&gt;44% en Llama 3.1 8B&lt;/strong&gt; al relajar las restricciones de latencia. Es energía que hoy se desperdicia simplemente por servir los modelos con la configuración de fábrica.&lt;/p&gt;

&lt;p&gt;Para periodistas, reguladores y responsables de sostenibilidad, el mensaje es que la medición importa: apoyar políticas o promesas de eficiencia en cifras de TDP produce conclusiones engañosas. Una tabla abierta y reproducible es una herramienta mucho más sólida para discutir el coste ambiental de esta tecnología con datos en la mano.&lt;/p&gt;

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

&lt;p&gt;El ML.ENERGY Leaderboard es un proyecto vivo: se actualiza con nuevos modelos y hardware, y su naturaleza abierta invita a que otros laboratorios contribuyan mediciones. La frontera más interesante por cubrir es la del razonamiento. Esta edición se centra en cargas de inferencia clásicas (chat, código, texto a imagen), pero los modelos que "piensan" mediante test-time scaling generan cadenas largas de tokens internos antes de responder, lo que puede multiplicar la energía por consulta. Medir ese coste con el mismo rigor será el siguiente capítulo.&lt;/p&gt;

&lt;p&gt;A más largo plazo, la propuesta del grupo es que la eficiencia energética se trate como una métrica de primera clase, junto a la precisión y la latencia, en cada decisión de diseño del stack de IA. Si esa idea cuaja, el consumo energético de la IA dejará de ser una nota al pie para convertirse en un número que se reporta y se optimiza de serie.&lt;/p&gt;

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

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

&lt;h3&gt;
  
  
  ¿Qué es ML.ENERGY?
&lt;/h3&gt;

&lt;p&gt;Es un benchmark y una tabla clasificatoria abiertos, creados por la Universidad de Michigan, que miden cuánta energía consumen los modelos generativos de IA al ejecutar inferencia. Ordena más de 40 arquitecturas por gasto energético por consulta.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuánta energía gasta una consulta a un modelo grande?
&lt;/h3&gt;

&lt;p&gt;Según las mediciones, un modelo denso grande como Llama 3.1 405B consume una mediana cercana a 0,39 Wh por consulta. Modelos más pequeños como Llama 3.1 8B bajan a unos 0,02 Wh, una diferencia de más de un orden de magnitud.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué las estimaciones por TDP son inexactas?
&lt;/h3&gt;

&lt;p&gt;El TDP es la potencia máxima de diseño de la GPU, pero la generación de texto está limitada por la memoria y rara vez exige ese máximo. Calcular el gasto por TDP exagera el consumo: hasta 4,1 veces para CodeGemma 2B frente a la medición real.&lt;/p&gt;

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

&lt;p&gt;Zeus es la biblioteca de código abierto que usa ML.ENERGY para medir la energía de la GPU directamente por software, leyendo sus contadores durante la inferencia. Es la base técnica que permite obtener cifras reales en lugar de estimadas.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo se puede reducir el consumo energético de la IA al servir modelos?
&lt;/h3&gt;

&lt;p&gt;El batching es clave: agrupar consultas en lotes grandes reparte el coste fijo y baja el gasto por consulta. Ajustar la frecuencia de la GPU y relajar la latencia logró ahorros de más del 40% sin cambiar el resultado del modelo.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Los modelos de mezcla de expertos consumen menos?
&lt;/h3&gt;

&lt;p&gt;Tienden a ser más eficientes por consulta porque solo activan una fracción de sus parámetros. Mixtral 8x22B gasta unos 0,06 Wh, muy por debajo de un modelo denso de tamaño comparable en parámetros totales.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/ml-energy/leaderboard" rel="noopener noreferrer"&gt;ML.ENERGY Leaderboard (GitHub)&lt;/a&gt; — código abierto del benchmark y la tabla de consumo energético.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://arxiv.org/abs/2505.06371" rel="noopener noreferrer"&gt;The ML.ENERGY Benchmark (arXiv)&lt;/a&gt; — artículo con la metodología, Zeus y resultados sobre 40 modelos.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://huggingface.co/spaces/ml-energy/leaderboard" rel="noopener noreferrer"&gt;ML.ENERGY Leaderboard (Hugging Face)&lt;/a&gt; — tabla interactiva con la energía por consulta de cada modelo.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://cse.engin.umich.edu/stories/power-hungry-ai-researchers-evaluate-energy-consumption-across-models" rel="noopener noreferrer"&gt;Power-hungry AI (Michigan CSE)&lt;/a&gt; — nota oficial de la universidad sobre el estudio.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://muxup.com/2026q1/per-query-energy-consumption-of-llms" rel="noopener noreferrer"&gt;Per-query energy consumption of LLMs (Muxup)&lt;/a&gt; — análisis independiente de las cifras por consulta.&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>Una línea de CSS válido vuelve "corrupto" tu EPUB en Kobo</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Mon, 15 Jun 2026 02:17:33 +0000</pubDate>
      <link>https://dev.to/lu1tr0n/una-linea-de-css-valido-vuelve-corrupto-tu-epub-en-kobo-5h14</link>
      <guid>https://dev.to/lu1tr0n/una-linea-de-css-valido-vuelve-corrupto-tu-epub-en-kobo-5h14</guid>
      <description>&lt;p&gt;Un &lt;strong&gt;EPUB en Kobo&lt;/strong&gt; puede aparecer como "archivo corrupto" aunque haya pasado &lt;code&gt;epubcheck&lt;/code&gt; sin un solo error. Eso fue exactamente lo que descubrió un autor independiente: su nuevo libro, validado al 100% contra la versión 3.3 del estándar, funcionaba en Kindle, Apple Books y Thorium, pero se negaba a abrir en cualquier lector Kobo, de cualquier generación.&lt;/p&gt;

&lt;p&gt;El responsable no era un manifest mal armado ni una imagen rota. Era una sola línea de CSS perfectamente válido. La historia es un recordatorio incómodo de que validar contra el estándar no garantiza que tu libro funcione en el mundo real.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Un EPUB que pasó epubcheck 3.3 sin errores aparecía como "archivo corrupto" en todos los lectores Kobo del autor.&lt;/li&gt;
&lt;li&gt;El mismo libro abría sin problemas en Kindle, Apple Books y Thorium; solo Kobo lo rechazaba.&lt;/li&gt;
&lt;li&gt;La causa: Kobo usa RMSDK, el motor de Adobe que también mueve Adobe Digital Editions.&lt;/li&gt;
&lt;li&gt;RMSDK nació hacia 2010 y su parser de CSS quedó congelado alrededor de 2013: sin flexbox, grid, variables ni funciones matemáticas.&lt;/li&gt;
&lt;li&gt;El detonante fue una sola línea: &lt;code&gt;max-width: min(150px, 30vw)&lt;/code&gt;, CSS válido que RMSDK no reconoce.&lt;/li&gt;
&lt;li&gt;Al ver CSS desconocido, RMSDK no degrada ni avisa: descarta el libro completo en silencio.&lt;/li&gt;
&lt;li&gt;epubcheck no puede atrapar el problema porque valida contra el estándar, no contra un motor roto.&lt;/li&gt;
&lt;li&gt;Cambiar la línea a &lt;code&gt;max-width: 150px&lt;/code&gt; resolvió el fallo por completo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Qué pasó: un libro válido que Kobo rechaza
&lt;/h2&gt;

&lt;p&gt;El autor distribuye sus libros como archivos EPUB libres de DRM, algo poco común y que se agradece. Antes de publicar, cada archivo pasa por una batería de procesos hasta que aprueba &lt;code&gt;epubcheck&lt;/code&gt;, la herramienta de referencia para validar libros electrónicos bien formados. Es exigente hasta la obsesión: si tu &lt;code&gt;manifest&lt;/code&gt; no declara cada fragmento e imagen, si usas elementos HTML fuera de orden o te desvías mínimamente de las reglas del estándar EPUB, no pasa.&lt;/p&gt;

&lt;p&gt;Tras meses de trabajo, el libro aprobó &lt;code&gt;epubcheck&lt;/code&gt; con la versión 3.3 del estándar sin un solo aviso. Y aun así, un lector escribió para reportar que el archivo estaba "corrupto". El autor probó entregarle también una versión EPUB2, igualmente conforme a las reglas, pensando en compatibilidad hacia atrás. Mismo resultado: el libro no abría en ninguno de sus dispositivos Kobo.&lt;/p&gt;

&lt;p&gt;La pregunta es la que cualquier desarrollador se haría: ¿qué haces cuando el patrón de oro dice que tu archivo está bien, funciona en todas partes, pero un lector específico insiste en que está roto?&lt;/p&gt;

&lt;p&gt;El mismo EPUB funcionaba en Kindle y Apple Books, pero no en Kobo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por qué un EPUB en Kobo termina como "corrupto"
&lt;/h2&gt;

&lt;p&gt;La pista clave aparece al investigar qué motor usa Kobo por dentro. La respuesta es RMSDK, las siglas de "Reader Mobile Software Development Kit", el motor de renderizado propietario de Adobe. Es el mismo corazón que late dentro de Adobe Digital Editions, esa aplicación que muchos recordamos más por su gestión de DRM que por la experiencia de lectura, y también el motor presente en varios dispositivos Kobo y en antiguos Sony y Nook.&lt;/p&gt;

&lt;p&gt;RMSDK fue construido alrededor de 2010, pensado para EPUB2. Recibió actualizaciones ligeras para soportar EPUB3, pero nunca fue modernizado de verdad. El problema no es solo que esté viejo: es cómo reacciona ante lo que no entiende. En lugar de ignorar una propiedad CSS desconocida, como manda el propio estándar para garantizar compatibilidad hacia adelante, RMSDK simplemente descarta el libro entero. Sin mensaje de error, sin pantalla de fallback, sin un solo indicio de qué salió mal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dot"&gt;&lt;code&gt;&lt;span class="k"&gt;graph&lt;/span&gt; &lt;span class="nv"&gt;LR&lt;/span&gt;
  &lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"EPUB valido"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;B&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"epubcheck 3.3: OK"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nv"&gt;B&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;C&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;"Que motor lo abre"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nv"&gt;C&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;|&lt;/span&gt;&lt;span class="s2"&gt;"Kindle / Apple Books"&lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;D&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Renderiza bien"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nv"&gt;C&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;|&lt;/span&gt;&lt;span class="s2"&gt;"Kobo con RMSDK"&lt;/span&gt;&lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;E&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"CSS min() no reconocido"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nv"&gt;E&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;F&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Libro descartado: archivo corrupto"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para depurarlo, el autor cargó el libro en Adobe Digital Editions, esperando un mensaje útil. Como era de esperar, falló al cargar. Pero lo hizo en el peor estilo posible: sin error, sin queja, solo una pantalla en blanco. El único rastro de que lo había intentado fue que, al reintentar, ADE respondía "no puedes importar ese libro, ya lo agregaste". Clásico.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contexto: RMSDK, un motor congelado en 2013
&lt;/h2&gt;

&lt;p&gt;Identificar a RMSDK como sospechoso no resolvía el caso, pero daba un camino. El autor empezó a desarmar su libro, creando una docena de variantes mientras se aseguraba de que cada una siguiera pasando &lt;code&gt;epubcheck&lt;/code&gt;. Reorganizó carpetas, vació metadatos, eliminó atributos de idioma, generó UUID nuevos, aplanó directorios, renombró extensiones y reconstruyó el ZIP desde cero varias veces. Y falló. Y falló. Y volvió a fallar.&lt;/p&gt;

&lt;p&gt;Cuando estaba a punto de rendirse, se le ocurrió desactivar la hoja de estilos. De golpe, el libro abrió. Con el CSS identificado como origen del problema, fue cuestión de bisección: crear subconjuntos del stylesheet hasta aislar la línea culpable. Resultó ser esta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.copyright&lt;/span&gt; &lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;150px&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;30vw&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;Al cambiarla por la versión clásica, todo funcionó:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.copyright&lt;/span&gt; &lt;span class="nt"&gt;img&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;150px&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;¿Cuál es el problema con la primera versión? Ninguno, desde el punto de vista del estándar. &lt;code&gt;min()&lt;/code&gt; es una función matemática de CSS perfectamente válida y ampliamente soportada en navegadores. El problema es que el parser de CSS de RMSDK quedó congelado aproximadamente en 2013: sin flexbox, sin grid, sin funciones matemáticas, sin propiedades personalizadas (variables). Solo &lt;code&gt;float&lt;/code&gt; de la vieja escuela, manejo deficiente de fuentes y caídas silenciosas cuando ve algo que no reconoce.&lt;/p&gt;

&lt;p&gt;RMSDK descarta el libro entero ante una sola propiedad CSS desconocida.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Ojo:&lt;/strong&gt; RMSDK no ignora la propiedad que no entiende, como exige el modelo de compatibilidad hacia adelante de CSS. Descarta el archivo completo. Una línea inválida para el motor equivale a un libro inservible.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Datos y cifras del caso
&lt;/h2&gt;

&lt;p&gt;No estamos ante un bug aislado de versión: hablamos de un motor con unos 16 años de antigüedad que sigue en producción. RMSDK se diseñó hacia 2010 para EPUB2 y su soporte de CSS se detuvo alrededor de 2013. En la práctica, eso significa que toda la familia de CSS moderna que damos por sentada en la web queda fuera: &lt;code&gt;display: flex&lt;/code&gt;, &lt;code&gt;display: grid&lt;/code&gt;, las variables &lt;code&gt;--mi-color&lt;/code&gt;, y las funciones &lt;code&gt;min()&lt;/code&gt;, &lt;code&gt;max()&lt;/code&gt;, &lt;code&gt;clamp()&lt;/code&gt; y &lt;code&gt;calc()&lt;/code&gt; con unidades mixtas.&lt;/p&gt;

&lt;p&gt;El detalle más revelador es el contraste de comportamientos. El mismo archivo, byte por byte, abría sin problemas en Kindle, Apple Books y Thorium. Tres motores distintos lo aceptaban; uno lo rechazaba. Y la diferencia entre "libro perfecto" y "archivo corrupto" era exactamente una línea de CSS y dos palabras: &lt;code&gt;min(150px, 30vw)&lt;/code&gt; contra &lt;code&gt;150px&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;¿Por qué &lt;code&gt;epubcheck&lt;/code&gt; no lo detectó? Porque hace una validación básica de CSS, pero no puede validar tu hoja de estilos contra un motor que está fundamentalmente roto. epubcheck comprueba conformidad con el estándar, no compatibilidad con cada lector real del mercado. Es, como lo describe el autor, lo más parecido a un "type-linter" o suite de pruebas que tienen quienes publican libros, pero su garantía termina donde empieza un renderizador que ignora el estándar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Impacto y análisis para autores y devs en LATAM
&lt;/h2&gt;

&lt;p&gt;Para quien publica de forma independiente en español —y el ecosistema de autopublicación en LATAM no para de crecer— esta clase de fallo es especialmente dañina. Un lector que paga por tu libro, lo descarga y obtiene un mensaje de "archivo corrupto" rara vez sospecha del motor de Adobe. Sospecha de ti. La percepción es que el autor entregó un producto defectuoso, cuando en realidad el archivo es impecable según el estándar.&lt;/p&gt;

&lt;p&gt;El problema escala. Kobo tiene presencia fuerte fuera del ecosistema Amazon, y es una de las pocas plataformas que respeta formatos abiertos y DRM-free. Que su motor de renderizado se atragante con CSS moderno castiga precisamente a quienes apuestan por la portabilidad y los archivos abiertos. Un EPUB en Kobo debería ser un terreno seguro para el formato libre, y termina siendo el más frágil.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💭 Clave:&lt;/strong&gt; Pasar epubcheck es necesario pero no suficiente. La validación contra el estándar y la compatibilidad con motores reales son dos cosas distintas, y el segundo es el que ve tu lector.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hay una lección de ingeniería más amplia aquí, válida más allá de los ebooks: el manejo de errores importa tanto como la funcionalidad. Un motor que ante una propiedad desconocida la ignora y sigue, degrada con gracia. Un motor que descarta todo el documento sin avisar convierte un detalle cosmético en una falla total. Es la diferencia entre &lt;em&gt;fail open&lt;/em&gt; con un fallback y &lt;em&gt;fail closed&lt;/em&gt; en silencio.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo evitar que tu EPUB falle en Kobo
&lt;/h2&gt;

&lt;p&gt;La conclusión amarga es que confiar solo en &lt;code&gt;epubcheck&lt;/code&gt; no alcanza si te importan los lectores Kobo. Estas son las prácticas que reducen el riesgo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Escribe CSS conservador&lt;/strong&gt; — Evita &lt;code&gt;min()&lt;/code&gt;, &lt;code&gt;max()&lt;/code&gt;, &lt;code&gt;clamp()&lt;/code&gt;, variables, flexbox y grid en las hojas de estilo del EPUB. Prefiere &lt;code&gt;float&lt;/code&gt;, anchos en píxeles o porcentajes simples y propiedades soportadas desde hace una década.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Usa valores estáticos para imágenes&lt;/strong&gt; — En lugar de &lt;code&gt;max-width: min(150px, 30vw)&lt;/code&gt;, opta por &lt;code&gt;max-width: 150px&lt;/code&gt; o, si necesitas adaptabilidad, un porcentaje sencillo como &lt;code&gt;max-width: 30%&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prueba en un motor RMSDK&lt;/strong&gt; — Carga el archivo en Adobe Digital Editions o en un Kobo real antes de publicar. Es la única forma de ver lo que verá ese lector.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mantén epubcheck igualmente&lt;/strong&gt; — Sigue siendo tu primera línea de defensa contra errores reales del estándar; solo no lo tomes como garantía total.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para validar localmente, &lt;code&gt;epubcheck&lt;/code&gt; se instala en cualquier sistema. Aquí los tres entornos:&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;epubcheck
epubcheck mi-libro.epub

&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;epubcheck
epubcheck mi-libro.epub

&lt;span class="c"&gt;# Windows (Scoop) o multiplataforma con el JAR&lt;/span&gt;
scoop &lt;span class="nb"&gt;install &lt;/span&gt;epubcheck
&lt;span class="c"&gt;# o descarga el .jar desde github.com/w3c/epubcheck y corre:&lt;/span&gt;
java &lt;span class="nt"&gt;-jar&lt;/span&gt; epubcheck.jar mi-libro.epub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Tip:&lt;/strong&gt; Si necesitas un ancho adaptable y no quieres romper RMSDK, una regla simple como &lt;code&gt;max-width: 30%; max-height: 150px;&lt;/code&gt; suele cubrir el caso sin recurrir a funciones matemáticas que el motor de Adobe no entiende.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;En un mundo ideal, RMSDK dejaría la edad de piedra del CSS o, al menos, manejaría los errores en vez de descartar el libro entero. Pero el motor lleva más de una década sin modernizarse y poco indica que eso vaya a cambiar pronto, probablemente porque su valor para la plataforma está más en el DRM que en la experiencia de lectura. La industria de la publicación digital sigue más obsesionada con restringir el acceso que con dar la mejor experiencia posible.&lt;/p&gt;

&lt;p&gt;Mientras eso no cambie, la responsabilidad recae en quien publica. Si quieres asegurarte de que tu libro sea compatible con Kobo, vas a tener que probarlo contra un motor RMSDK y escribir tu CSS pensando en lo que un parser de 2013 puede entender. No es justo, pero es el terreno real donde aterrizan tus lectores.&lt;/p&gt;

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

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

&lt;h3&gt;
  
  
  ¿Por qué mi EPUB pasa epubcheck pero falla en Kobo?
&lt;/h3&gt;

&lt;p&gt;Porque epubcheck valida tu archivo contra el estándar EPUB, no contra el motor real de cada lector. Kobo usa RMSDK, de Adobe, cuyo parser de CSS quedó congelado hacia 2013. Si tu hoja de estilos usa CSS moderno como &lt;code&gt;min()&lt;/code&gt; o flexbox, RMSDK puede descartar el libro completo aunque epubcheck lo apruebe.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué es RMSDK y por qué importa?
&lt;/h3&gt;

&lt;p&gt;RMSDK (Reader Mobile Software Development Kit) es el motor de renderizado propietario de Adobe que está dentro de Adobe Digital Editions y de varios dispositivos Kobo, Sony y Nook. Importa porque define qué CSS funciona realmente en esos lectores, y su soporte se detuvo hace más de una década.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué CSS debo evitar para que mi libro funcione en Kobo?
&lt;/h3&gt;

&lt;p&gt;Evita funciones matemáticas como &lt;code&gt;min()&lt;/code&gt;, &lt;code&gt;max()&lt;/code&gt;, &lt;code&gt;clamp()&lt;/code&gt; y &lt;code&gt;calc()&lt;/code&gt; con unidades mixtas, además de flexbox, grid y variables CSS. Prefiere &lt;code&gt;float&lt;/code&gt;, anchos en píxeles o porcentajes simples, soportados desde hace muchos años.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo aislo qué línea de CSS rompe el libro?
&lt;/h3&gt;

&lt;p&gt;Desactiva primero toda la hoja de estilos y confirma que el libro abre. Luego reincorpora el CSS por subconjuntos (bisección) hasta encontrar la regla concreta que provoca el fallo, validando con epubcheck en cada paso para no introducir errores reales.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Sirve de algo seguir usando epubcheck?
&lt;/h3&gt;

&lt;p&gt;Sí. epubcheck sigue siendo la mejor defensa contra errores reales de conformidad con el estándar: manifests incompletos, HTML mal ordenado o metadatos faltantes. Solo no debe tomarse como garantía de que el libro funcionará en todos los lectores; complementa con pruebas en un motor RMSDK.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://andreklein.net/your-epub-is-fine-kobo-disagrees-blame-adobe/" rel="noopener noreferrer"&gt;André Klein — "Your EPUB Is Fine. Kobo Disagrees. Blame Adobe"&lt;/a&gt; — relato original del caso y la depuración línea por línea.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/w3c/epubcheck" rel="noopener noreferrer"&gt;w3c/epubcheck en GitHub&lt;/a&gt; — validador oficial de EPUB, mantenido por el W3C.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.mozilla.org/es/docs/Web/CSS/min" rel="noopener noreferrer"&gt;MDN — función CSS min()&lt;/a&gt; — documentación de la función matemática que detonó el fallo.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.w3.org/TR/epub-33/" rel="noopener noreferrer"&gt;W3C — EPUB 3.3&lt;/a&gt; — especificación del estándar contra el que valida epubcheck.&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>Chaosnet: la red del MIT de 1975 que sigue viva en el DNS</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Sun, 14 Jun 2026 20:19:29 +0000</pubDate>
      <link>https://dev.to/lu1tr0n/chaosnet-la-red-del-mit-de-1975-que-sigue-viva-en-el-dns-lh8</link>
      <guid>https://dev.to/lu1tr0n/chaosnet-la-red-del-mit-de-1975-que-sigue-viva-en-el-dns-lh8</guid>
      <description>&lt;p&gt;En 1975, mucho antes de que internet fuera lo que conocemos hoy, el laboratorio de Inteligencia Artificial del MIT construyó &lt;strong&gt;Chaosnet&lt;/strong&gt;, una red local pensada para conectar sus máquinas Lisp. Medio siglo después esa red está oficialmente muerta, salvo por un detalle incómodo: una de sus piezas sigue viva dentro de prácticamente cada servidor DNS del planeta.&lt;/p&gt;

&lt;p&gt;Este artículo reconstruye qué fue Chaosnet, cómo funcionaba su diseño deliberadamente simple y por qué su legado todavía aparece cuando ejecutás &lt;code&gt;dig CH TXT version.bind&lt;/code&gt; contra un servidor de nombres cualquiera.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Chaosnet nació en 1975 en el MIT AI Lab para conectar máquinas Lisp, inspirada en el Ethernet experimental de Xerox PARC.&lt;/li&gt;
&lt;li&gt;Usaba cable coaxial de 75 ohmios, rondaba los 4 Mbit/s y soportaba unas pocas docenas de nodos en hasta 1 km.&lt;/li&gt;
&lt;li&gt;No tenía control centralizado: de ahí el nombre 'Chaos', no existía un nodo maestro que coordinara la red.&lt;/li&gt;
&lt;li&gt;Su legado vivo es la clase CHAOS (CH) del DNS, usada hoy para fingerprinting con version.bind.&lt;/li&gt;
&lt;li&gt;El comando dig CH TXT version.bind @servidor revela la versión de BIND de muchos resolutores DNS.&lt;/li&gt;
&lt;li&gt;IANA mantiene la clase CH con el valor 3 en su registro oficial de clases DNS, junto a IN (Internet).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Qué es Chaosnet
&lt;/h2&gt;

&lt;p&gt;Chaosnet es el nombre de una red de área local diseñada en el MIT a mediados de los años setenta. La palabra describe una idea concreta: la ausencia de cualquier elemento de control centralizado. En Chaosnet no hay un nodo maestro, ni un servidor que reparta turnos, ni una autoridad que decida quién transmite. Todos los nodos contienden por el medio en igualdad de condiciones, y esa decisión de diseño —que en su momento parecía arriesgada— fue justamente la que la hizo confiable.&lt;/p&gt;

&lt;p&gt;El objetivo original era resolver un problema muy específico. El sistema de máquinas Lisp del MIT le asignaba a cada usuario activo una computadora personal: un procesador de escala media, memoria suficiente y un disco de intercambio. Pero los archivos vivían en un sistema central, y ese sistema de archivos compartido se accedía a través de Chaosnet. En la práctica, Chaosnet ocupaba el lugar del disco de archivos en un sistema convencional. Eso le imponía tres requisitos no negociables: tenía que ser rápida tanto en latencia como en rendimiento, tenía que ser confiable, y tenía que permitir conectar varias docenas de máquinas.&lt;/p&gt;

&lt;p&gt;Lo interesante es cómo lograron esa velocidad: no con algoritmos ingeniosos, sino con un medio de transmisión muy rápido operado de la forma más simple posible. La filosofía completa de Chaosnet se puede resumir en una frase: empezá con un canal veloz y no le agregues complejidad innecesaria encima.&lt;/p&gt;

&lt;p&gt;Chaosnet conectaba las máquinas Lisp del MIT a través de un cable coaxial compartido.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contexto e historia: el MIT, las máquinas Lisp y Xerox PARC
&lt;/h2&gt;

&lt;p&gt;Para entender por qué Chaosnet importa hay que ubicarse en la época. En 1975 no existía una pila de protocolos universal. ARPANET funcionaba, TCP estaba en pañales y el concepto mismo de red local apenas se estaba inventando. El trabajo pionero venía de Xerox PARC, donde Robert Metcalfe y David Boggs habían diseñado el Ethernet experimental: un cable compartido sobre el que las máquinas competían por transmitir paquetes. Chaosnet reconoce abiertamente esa deuda; su hardware ofrece una estructura de acceso múltiple con detección de portadora muy parecida a aquel Ethernet de PARC.&lt;/p&gt;

&lt;p&gt;La diferencia es de propósito. El MIT no quería una red de propósito general capaz de cruzar el continente. Quería algo que reemplazara al disco de un sistema de tiempo compartido para un puñado de máquinas Lisp dentro de uno o dos kilómetros. Esa restricción fue una bendición de diseño: los ingenieros simplemente ignoraron todos los problemas que no aplicaban. Chaosnet no tiene previsiones especiales para enlaces lentos, enlaces ruidosos con alta tasa de error, múltiples caminos, ni enlaces de larga distancia con tiempo de tránsito significativo. Tampoco intenta ofrecer múltiples niveles de servicio ni comunicación segura más allá del cifrado de extremo a extremo.&lt;/p&gt;

&lt;p&gt;El software, por su parte, tomó ideas prestadas de Ethernet, de TCP y de ARPANET, sumándoles modificaciones propias. Esa mezcla pragmática —agarrar lo que funcionaba de cada fuente sin atarse a ninguna— es muy reconocible para cualquier desarrollador que haya construido un sistema bajo presión de tiempo. Chaosnet no buscaba ser elegante en el papel; buscaba andar rápido y no romperse.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo funcionaba: hardware simple, software sin jefe
&lt;/h2&gt;

&lt;p&gt;El medio físico de Chaosnet se llamaba, sin rodeos, el &lt;em&gt;ether&lt;/em&gt;. Era un cable coaxial semirrígido de media pulgada y baja pérdida, del tipo que se usaba para televisión por cable, con terminación de 75 ohmios en ambos extremos. En cada nodo, un transceptor se conectaba al cable. Un cable plano de diez metros unía ese transceptor con una interfaz enchufada al bus de entrada/salida de la computadora. Y dentro de la computadora corría un programa llamado NCP (Network Control Program) que gestionaba toda la red además de la aplicación que justificaba la existencia del nodo.&lt;/p&gt;

&lt;p&gt;La regla de operación era brutalmente simple: un solo nodo a la vez podía tomar el ether y transmitir un paquete, que llegaba a todos los demás nodos. Cada nodo decidía en hardware si ignorar el paquete o recibirlo. El cable tenía que ser una línea recta: sin ramas, sin derivaciones, sin formar un círculo. Para extender el alcance más allá de un kilómetro se usaban &lt;em&gt;bridges&lt;/em&gt; (puentes), nodos que retransmitían paquetes entre dos tramos de cable distintos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dot"&gt;&lt;code&gt;&lt;span class="k"&gt;graph&lt;/span&gt; &lt;span class="nv"&gt;LR&lt;/span&gt;
  &lt;span class="nv"&gt;N1&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Nodo: maquina Lisp"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;T1&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Transceptor&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nv"&gt;T1&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;E&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Ether: cable coaxial 75 ohmios"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nv"&gt;N2&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Nodo: file server"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;T2&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Transceptor&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nv"&gt;T2&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;E&lt;/span&gt;
  &lt;span class="nv"&gt;E&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;B&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Bridge&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nv"&gt;B&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;E2&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Otro ether"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La contención por el cable seguía un esquema de detección de portadora: antes de transmitir, un nodo escuchaba si el ether estaba libre. Si dos nodos transmitían a la vez, había colisión y reintentaban. Es el mismo principio que hizo famoso a Ethernet, pero llevado a su mínima expresión. La clave estaba en no caer en algoritmos tan simples que dejaran de funcionar o desperdiciaran el canal.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💭 Clave:&lt;/strong&gt; Quitar el control centralizado no fue un capricho: era la forma de hacer la red confiable. Sin un nodo maestro, no había un único punto de falla que pudiera tumbar toda la comunicación.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Esa simplicidad también pagaba en mantenimiento. Chaosnet conectaba máquinas muy distintas, así que existían varias implementaciones del mismo protocolo, y cada implementación requería mantenimiento en proporción a su complejidad. Mantener el diseño chico permitía aislar rápido una falla: saber si el problema estaba en el cable, en el hardware de un host o en su software. En una red usada por grupos diversos dentro de una sola institución, esa capacidad de diagnóstico valía oro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Datos y cifras
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Año de origen:&lt;/strong&gt; 1975, en el MIT Artificial Intelligence Laboratory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medio físico:&lt;/strong&gt; cable coaxial de 1/2 pulgada, 75 ohmios, terminado en ambos extremos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alcance:&lt;/strong&gt; aproximadamente 1 km por tramo de ether, limitado por dispersión y atenuación.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Capacidad:&lt;/strong&gt; unas pocas docenas de nodos por cable antes de degradar las propiedades eléctricas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Velocidad:&lt;/strong&gt; del orden de 4 Mbit/s, alta para los estándares de mediados de los setenta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clase DNS heredada:&lt;/strong&gt; CHAOS, valor numérico 3 en el registro oficial de IANA.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La clase CHAOS de Chaosnet todavía se consulta con herramientas DNS modernas.&lt;/p&gt;

&lt;h2&gt;
  
  
  El legado vivo: la clase CHAOS en el DNS
&lt;/h2&gt;

&lt;p&gt;Acá está el giro que hace que Chaosnet siga importando en 2026. Cuando se diseñó el sistema de nombres de dominio, sus autores —varios con raíces en el mundo MIT— previeron que el DNS pudiera servir nombres para más de una familia de redes. Por eso cada registro DNS tiene un campo de &lt;em&gt;clase&lt;/em&gt;. La clase que todos usamos es &lt;code&gt;IN&lt;/code&gt; (Internet). Pero el estándar definió también la clase &lt;code&gt;CH&lt;/code&gt;, que significa exactamente CHAOS, en homenaje directo a la red del MIT.&lt;/p&gt;

&lt;p&gt;Esa clase nunca se usó masivamente para resolver nombres, pero encontró un nicho inesperado: el servidor BIND, el software DNS más extendido del mundo, expone información de diagnóstico a través de registros TXT bajo la clase CHAOS. El más conocido es &lt;code&gt;version.bind&lt;/code&gt;, que devuelve la versión del servidor. Desde la línea de comandos, esto se traduce en un truco clásico de reconocimiento de redes.&lt;/p&gt;

&lt;p&gt;En Linux y macOS, con las herramientas de BIND instaladas, la consulta es directa:&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="go"&gt;dig @ns1.ejemplo.com CH TXT version.bind +short

&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;dig viene preinstalado&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="go"&gt;dig @ns1.ejemplo.com CH TXT version.bind +short
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En Windows, donde &lt;code&gt;dig&lt;/code&gt; no viene de fábrica, se puede usar &lt;code&gt;nslookup&lt;/code&gt; en modo interactivo especificando la clase y el tipo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Windows (PowerShell o CMD)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;nslookup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;CHAOS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;TXT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;version.bind&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ns1.ejemplo.com&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si el servidor no oculta esa información, la respuesta es una cadena como &lt;code&gt;"9.18.24"&lt;/code&gt; o similar. Otros nombres clásicos bajo la misma clase son &lt;code&gt;hostname.bind&lt;/code&gt; y &lt;code&gt;authors.bind&lt;/code&gt;. Para quien hace auditoría de infraestructura, esto es valioso porque permite identificar versiones potencialmente vulnerables sin tocar nada más que el resolutor de nombres.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Ojo:&lt;/strong&gt; Exponer &lt;code&gt;version.bind&lt;/code&gt; facilita el trabajo de un atacante que busca versiones con vulnerabilidades conocidas. La buena práctica es ocultar o falsear esa cadena. En BIND se hace con la directiva &lt;code&gt;version "oculto";&lt;/code&gt; dentro del bloque &lt;code&gt;options&lt;/code&gt; del archivo de configuración.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;El caso de Chaosnet ilustra algo que la industria redescubre cada década: las decisiones de diseño nunca mueren del todo. Una red local pensada para un puñado de máquinas Lisp en un edificio del MIT terminó dejando una huella permanente en el protocolo que sostiene toda la web. Nadie planeó que la clase CHAOS sobreviviera a la red CHAOS; simplemente quedó reservada en el estándar y un día alguien le encontró un uso operativo.&lt;/p&gt;

&lt;p&gt;También es una lección sobre la virtud de lo simple. Chaosnet ganó velocidad y confiabilidad no por ser sofisticada, sino por negarse a resolver problemas que no tenía. Ese principio sigue siendo tan válido hoy como en 1975: muchos sistemas modernos cargan complejidad para escenarios que jamás van a enfrentar, pagando el costo en latencia, en superficie de ataque y en horas de mantenimiento. La restricción explícita —saber qué problemas ignorar— fue una ventaja competitiva.&lt;/p&gt;

&lt;p&gt;Para desarrolladores en LATAM, hay un valor práctico adicional. Entender que el DNS tiene clases más allá de &lt;code&gt;IN&lt;/code&gt; abre la puerta a leer y depurar configuraciones de servidores de nombres con más profundidad. Y el truco de &lt;code&gt;version.bind&lt;/code&gt; es parte del repertorio básico de cualquiera que administre infraestructura o haga pruebas de seguridad autorizadas sobre sus propios sistemas.&lt;/p&gt;

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

&lt;p&gt;Chaosnet no va a volver: las máquinas Lisp son piezas de museo y el coaxial de 75 ohmios cedió su lugar hace décadas. Pero su clase seguirá viviendo mientras el DNS exista, porque eliminar una clase reservada de un estándar tan central no aporta nada y rompería herramientas existentes. La recomendación concreta para quien administra servidores es revisar si su BIND expone la versión y, si lo hace, ocultarla. Más allá de eso, vale la pena leer la memoria técnica original: es uno de esos documentos donde se ve cómo se pensaban las redes cuando todo estaba por inventarse.&lt;/p&gt;

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

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

&lt;h3&gt;
  
  
  ¿Por qué se llama Chaosnet?
&lt;/h3&gt;

&lt;p&gt;El nombre hace referencia a la ausencia de cualquier elemento de control centralizado en la red. No hay un nodo maestro ni una autoridad que coordine las transmisiones: todos los nodos compiten por el cable en igualdad de condiciones, y ese diseño descentralizado es lo que inspiró el nombre.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Chaosnet todavía se usa para conectar computadoras?
&lt;/h3&gt;

&lt;p&gt;No. Como red física dejó de tener uso práctico hace décadas, junto con las máquinas Lisp para las que fue creada. Lo único que sobrevive es su clase CHAOS dentro del protocolo DNS, que persiste por compatibilidad y por un uso operativo de diagnóstico.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué es la clase CHAOS en el DNS?
&lt;/h3&gt;

&lt;p&gt;Es una de las clases de registro que define el estándar DNS, con el valor numérico 3, en homenaje a Chaosnet. La clase que todos usamos para resolver dominios es IN (Internet); la clase CH quedó reservada y hoy BIND la usa para exponer registros de diagnóstico como version.bind.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo consulto version.bind desde mi terminal?
&lt;/h3&gt;

&lt;p&gt;En Linux y macOS usás &lt;code&gt;dig @servidor CH TXT version.bind +short&lt;/code&gt;. En Windows, &lt;code&gt;nslookup -class=CHAOS -type=TXT version.bind servidor&lt;/code&gt;. Si el servidor no oculta la información, devuelve la versión de BIND como una cadena de texto.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Es peligroso que mi servidor exponga version.bind?
&lt;/h3&gt;

&lt;p&gt;No es una vulnerabilidad en sí misma, pero facilita el reconocimiento: un atacante puede mapear versiones con fallas conocidas sin esfuerzo. La práctica recomendada es ocultar o falsear esa cadena con la directiva &lt;code&gt;version&lt;/code&gt; en el bloque &lt;code&gt;options&lt;/code&gt; de la configuración de BIND.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué relación tiene Chaosnet con Ethernet?
&lt;/h3&gt;

&lt;p&gt;Chaosnet se inspiró directamente en el Ethernet experimental de Xerox PARC. Compartían la idea de un cable compartido donde los nodos contienden por transmitir paquetes con detección de portadora, aunque Chaosnet llevó esa idea a una versión más simple y enfocada en redes locales cortas.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://tumbleweed.nu/r/lm-3/uv/amber.html" rel="noopener noreferrer"&gt;Chaosnet (memoria técnica original del MIT AI Lab)&lt;/a&gt; — documento fuente que describe el hardware, el software y los objetivos de diseño de la red.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Chaosnet" rel="noopener noreferrer"&gt;Chaosnet — Wikipedia&lt;/a&gt; — resumen histórico de la red, su origen en 1975 y su legado en el DNS.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml" rel="noopener noreferrer"&gt;DNS Parameters — IANA&lt;/a&gt; — registro oficial que lista la clase CH (CHAOS) con valor 3 entre las clases DNS.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Lisp_machine" rel="noopener noreferrer"&gt;Lisp machine — Wikipedia&lt;/a&gt; — contexto sobre las máquinas Lisp del MIT que Chaosnet fue diseñada para conectar.&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>Atari imprimía el arte de sus arcades con serigrafía, color por color</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Sun, 14 Jun 2026 14:18:31 +0000</pubDate>
      <link>https://dev.to/lu1tr0n/atari-imprimia-el-arte-de-sus-arcades-con-serigrafia-color-por-color-3nka</link>
      <guid>https://dev.to/lu1tr0n/atari-imprimia-el-arte-de-sus-arcades-con-serigrafia-color-por-color-3nka</guid>
      <description>&lt;p&gt;En 1982, una cámara filmó algo que hoy parece magia industrial: paneles de madera entrando bajo una prensa y saliendo con el arte vibrante de una cabina arcade de Atari. No era una calcomanía gigante ni un adhesivo. Era &lt;strong&gt;serigrafía&lt;/strong&gt;, una técnica de impresión que aplicaba el color directamente sobre la madera, una capa a la vez.&lt;/p&gt;

&lt;p&gt;Detrás de cada cabina de &lt;em&gt;Missile Command&lt;/em&gt; o &lt;em&gt;Centipede&lt;/em&gt; había un proceso de producción tan riguroso como una pipeline de software: separación de capas, alineación milimétrica y control de calidad en cada paso.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;En 1982 se filmó el proceso de serigrafía de Atari imprimiendo paneles de la cabina Quantum, con una tirada de solo 500 unidades.&lt;/li&gt;
&lt;li&gt;El arte no era un adhesivo: se imprimía directamente sobre la madera, un color a la vez.&lt;/li&gt;
&lt;li&gt;Cada color requería su propia pantalla y un film positivo en acetato con el arte en negro opaco.&lt;/li&gt;
&lt;li&gt;Missile Command tuvo una tirada de 14.000 cabinas, lo que implicó imprimir 28.000 paneles.&lt;/li&gt;
&lt;li&gt;El registro (alineación exacta de cada pantalla) era el secreto para evitar colores corridos.&lt;/li&gt;
&lt;li&gt;Atari usaba una prensa serigráfica plana semiautomática, no un sistema manual, para escalar.&lt;/li&gt;
&lt;li&gt;La serigrafía deposita una capa de tinta gruesa y opaca, por eso el arte sigue vibrante hoy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Qué es la serigrafía y por qué Atari la usaba
&lt;/h2&gt;

&lt;p&gt;La &lt;strong&gt;serigrafía&lt;/strong&gt; (también llamada impresión por pantalla o &lt;em&gt;silkscreen&lt;/em&gt;) es una técnica que existe desde hace más de un siglo y que poco tiene que ver con las impresoras digitales de gran formato que usamos hoy. La idea es sencilla pero poderosa: se hace pasar tinta a través de una malla tensada en la que solo ciertas zonas dejan pasar el color. Esas zonas forman un esténcil, y la tinta que atraviesa la malla queda depositada sobre la superficie de abajo.&lt;/p&gt;

&lt;p&gt;En la edad dorada de los arcades, a comienzos de los años 80, Atari decoraba todas sus cabinas con ilustraciones llamativas. Esos dibujos no se imprimían en papel para luego pegarlos: se imprimían &lt;strong&gt;directamente sobre los paneles de madera&lt;/strong&gt; de la cabina. Y aquí está la clave que sorprende a casi todos: se hacía un color a la vez.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💭 Clave:&lt;/strong&gt; Lo que parece una calcomanía gigante en realidad es tinta aplicada capa por capa sobre la madera. No hay adhesivo: el color forma parte del panel.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Qué se ve en el video de 1982
&lt;/h2&gt;

&lt;p&gt;El metraje que dio origen a esta historia fue filmado en 1982 y muestra la impresión de los paneles laterales de la cabina &lt;em&gt;Quantum&lt;/em&gt;, un título con una tirada relativamente baja de apenas 500 unidades. En las imágenes se observa un panel de madera colocado bajo un gran cabezal de impresión.&lt;/p&gt;

&lt;p&gt;El proceso es metódico. Una pantalla desciende sobre el panel y un operario extiende la tinta sobre la malla con una espátula de goma (el famoso &lt;em&gt;squeegee&lt;/em&gt;). La presión empuja la tinta a través de las zonas abiertas del esténcil y la deposita sobre la madera. Cuando la pantalla se levanta, queda impreso un solo bloque de color. El panel avanza entonces a la siguiente estación, donde otra pantalla agrega el color siguiente. El ciclo se repite varias veces hasta completar la ilustración.&lt;/p&gt;

&lt;p&gt;Paneles recién impresos, listos para el ensamblaje.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separación de color: pensar el arte como capas
&lt;/h2&gt;

&lt;p&gt;Para que la serigrafía funcione, los artistas de Atari tenían que hacer algo que a cualquier desarrollador le resultará familiar: &lt;strong&gt;descomponer el problema en capas&lt;/strong&gt;. El arte completo se separaba en capas de color individuales, y cada color necesitaba su propia pantalla de impresión.&lt;/p&gt;

&lt;p&gt;Si un diseño contenía azul claro, azul oscuro, rojo, amarillo y negro, se fabricaban cinco pantallas distintas. Cada una contenía únicamente las áreas correspondientes a ese color. Al imprimir todos los colores en secuencia, una capa sobre otra, se combinaban para formar la ilustración final. Con el tiempo Atari se volvió más astuta: imprimía, por ejemplo, un amarillo sobre un azul para obtener verde, ahorrándose una pantalla.&lt;/p&gt;

&lt;p&gt;Ese concepto de separar una imagen en canales de color es exactamente lo que hace cualquier librería de procesamiento de imágenes moderna. Podemos reproducir la idea en pocas líneas con Python y Pillow:&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;from&lt;/span&gt; &lt;span class="n"&gt;PIL&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;

&lt;span class="c1"&gt;# Cargar el arte original de la cabina
&lt;/span&gt;&lt;span class="n"&gt;arte&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="p"&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;arte_cabina.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;convert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RGB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Separar en canales de color (cada canal = una "pantalla")
&lt;/span&gt;&lt;span class="n"&gt;rojo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;verde&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;azul&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;arte&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="c1"&gt;# Guardar cada capa por separado, como un film positivo
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;nombre&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;capa&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rojo&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rojo&lt;/span&gt;&lt;span class="p"&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;verde&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;verde&lt;/span&gt;&lt;span class="p"&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;azul&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;azul&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
    &lt;span class="n"&gt;capa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&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;pantalla_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;nombre&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.png&lt;/span&gt;&lt;span class="sh"&gt;"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Arte separado en 3 capas de color listas para imprimir&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 ejecutarlo solo necesitás instalar Pillow. La instalación cambia ligeramente según tu sistema operativo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Windows (PowerShell)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Pillow&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# macOS&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;python3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-m&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Pillow&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Linux (Debian/Ubuntu)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;sudo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;apt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;python3-pip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pip3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Pillow&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Tip:&lt;/strong&gt; La separación por canales RGB es solo una analogía. La serigrafía real usa tintas de pigmento (CMYK o colores planos), no luz aditiva, así que el verde de pantalla no equivale al verde de tinta. La idea que importa es la misma: cada color, su propia capa.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  El secreto del registro: alineación milimétrica
&lt;/h2&gt;

&lt;p&gt;El reto más difícil de imprimir varios colores por separado no es aplicar la tinta, sino lograr que cada capa quede &lt;strong&gt;perfectamente alineada&lt;/strong&gt; con las anteriores. Los impresores llaman a esto &lt;em&gt;registro&lt;/em&gt;. Si una pantalla se desplazaba apenas un milímetro, los contornos se veían borrosos y los colores se superponían mal.&lt;/p&gt;

&lt;p&gt;Para evitarlo, las mesas de impresión usaban pasadores de posicionamiento, topes y guías de alineación que garantizaban que cada panel volviera exactamente a la misma posición en cada pasada. Considerando la velocidad de producción, el nivel de precisión que lograban los operarios era notable.&lt;/p&gt;

&lt;p&gt;El flujo completo, de principio a fin, se parece bastante a una pipeline de procesamiento por etapas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph LR
  A["Arte original"] --&amp;gt; B["Separacion de color"]
  B --&amp;gt; C["Films positivos"]
  C --&amp;gt; D["Pantallas con emulsion"]
  D --&amp;gt; E["Impresion capa por capa"]
  E --&amp;gt; F["Registro y alineacion"]
  F --&amp;gt; G["Panel terminado"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Antes de llegar a la pantalla, cada color pasaba por un &lt;strong&gt;film positivo&lt;/strong&gt;: una lámina de acetato transparente con el arte en negro opaco, que representaba las zonas que se imprimirían. Ese film se colocaba sobre una pantalla recubierta de emulsión sensible a la luz y se exponía a una luz intensa. La emulsión expuesta se endurecía, mientras que las zonas tapadas por el arte negro quedaban blandas y se lavaban después con agua. El resultado era un esténcil en la malla que dejaba pasar la tinta solo donde hacía falta ese color.&lt;/p&gt;

&lt;p&gt;Un film positivo define qué zonas reciben cada color.&lt;/p&gt;

&lt;h2&gt;
  
  
  Datos y cifras de la producción
&lt;/h2&gt;

&lt;p&gt;La escala explica por qué Atari no podía hacer esto a mano. &lt;em&gt;Missile Command&lt;/em&gt;, uno de sus grandes éxitos, tuvo una tirada de 14.000 cabinas. Como cada cabina lleva dos paneles laterales, eso significó imprimir &lt;strong&gt;28.000 paneles&lt;/strong&gt;. Multiplicá eso por las cinco o más pasadas de color que requería cada panel y entenderás por qué la automatización era indispensable.&lt;/p&gt;

&lt;p&gt;Por eso Atari no usaba un sistema completamente manual, sino una &lt;strong&gt;prensa serigráfica plana semiautomática&lt;/strong&gt;. La maquinaria se encargaba de buena parte del movimiento, pero los operarios entrenados seguían siendo esenciales para la puesta a punto, el control del color y la inspección de calidad.&lt;/p&gt;

&lt;p&gt;La línea de producción incluía marcos de impresión grandes, films de separación de color, emulsiones fotosensibles, fijaciones de registro, tintas serigráficas, mecanismos de espátula industrial y estaciones de secado o curado entre pasadas. Cada estación tenía una función específica y el panel solo avanzaba cuando la capa anterior estaba lista.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por qué el arte sigue vibrante 40 años después
&lt;/h2&gt;

&lt;p&gt;Una de las razones por las que el arte original de las cabinas de Atari todavía luce tan intenso es que la serigrafía deposita una capa de tinta &lt;strong&gt;relativamente gruesa y opaca&lt;/strong&gt;. A diferencia de la impresión por inyección moderna, los colores no se construyen a partir de diminutos puntos: cada color se aplica como una capa sólida, lo que le da a la ilustración una riqueza y profundidad difíciles de replicar.&lt;/p&gt;

&lt;p&gt;Cuando ves una cabina de &lt;em&gt;Missile Command&lt;/em&gt; con azules brillantes, rojos vivos y gráficos nítidos, estás mirando el resultado de múltiples pasadas de impresión cuidadosamente alineadas, cada una sumando otra capa a la imagen final. Esa solidez también explica por qué tantos coleccionistas prefieren restaurar el arte original antes que reemplazarlo con reproducciones digitales.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué nos enseña hoy a quienes escribimos software
&lt;/h2&gt;

&lt;p&gt;Mirar este proceso hoy es un recordatorio de que las cabinas arcade no eran simples cajas de madera con un videojuego adentro: eran &lt;strong&gt;obras de arte gráfico producidas industrialmente&lt;/strong&gt;, pensadas para destacar en salones repletos de máquinas de la competencia.&lt;/p&gt;

&lt;p&gt;Para quienes desarrollamos software en LATAM hay lecciones que trascienden la madera y la tinta. La serigrafía de Atari es, en esencia, un pipeline: descomponer un problema complejo (el arte) en unidades manejables (las capas de color), procesarlas en etapas bien definidas y garantizar la consistencia entre pasadas (el registro). Cambiá tinta por commits y pantallas por etapas de CI y la analogía casi se escribe sola. La buena ingeniería —de procesos o de código— casi siempre se trata de separar, alinear y repetir con precisión.&lt;/p&gt;

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

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

&lt;h3&gt;
  
  
  ¿El arte de las cabinas de Atari era un adhesivo?
&lt;/h3&gt;

&lt;p&gt;No. Era tinta aplicada directamente sobre la madera mediante serigrafía, un color a la vez. No había calcomanías ni adhesivos gigantes.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué cada color necesitaba su propia pantalla?
&lt;/h3&gt;

&lt;p&gt;Porque cada pantalla funciona como un esténcil que solo deja pasar la tinta en las zonas de un color específico. Cinco colores implicaban, en general, cinco pantallas, aunque Atari aprendió a superponer tintas para crear colores adicionales.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué es el registro en serigrafía?
&lt;/h3&gt;

&lt;p&gt;Es la alineación exacta de cada pantalla con las capas ya impresas. Sin un buen registro, los contornos quedan borrosos y los colores se superponen mal. Se lograba con pasadores, topes y guías de posicionamiento.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué los colores siguen tan vivos décadas después?
&lt;/h3&gt;

&lt;p&gt;Porque la serigrafía deposita una capa de tinta gruesa y opaca, en lugar de construir el color con puntos diminutos como la inyección de tinta. Esa capa sólida da profundidad y resistencia al desgaste.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuántos paneles imprimió Atari para Missile Command?
&lt;/h3&gt;

&lt;p&gt;Con una tirada de 14.000 cabinas y dos paneles por cabina, Atari imprimió alrededor de 28.000 paneles, cada uno con varias pasadas de color.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://arcadeblogger.com/2026/06/14/how-did-atari-apply-side-art-to-arcade-cabinets/" rel="noopener noreferrer"&gt;The Arcade Blogger&lt;/a&gt; — artículo original con el video de 1982 del proceso de serigrafía de Atari.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://es.wikipedia.org/wiki/Serigraf%C3%ADa" rel="noopener noreferrer"&gt;Wikipedia: Serigrafía&lt;/a&gt; — fundamentos de la técnica de impresión por pantalla.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Missile_Command" rel="noopener noreferrer"&gt;Wikipedia: Missile Command&lt;/a&gt; — datos sobre el arcade y su producción.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Atari,_Inc." rel="noopener noreferrer"&gt;Wikipedia: Atari, Inc.&lt;/a&gt; — historia de la compañía durante la edad dorada de los arcades.&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>Phoenix LiveView 1.2 trae CSS colocado en plantillas HEEx</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Sun, 14 Jun 2026 08:17:22 +0000</pubDate>
      <link>https://dev.to/lu1tr0n/phoenix-liveview-12-trae-css-colocado-en-plantillas-heex-6o5</link>
      <guid>https://dev.to/lu1tr0n/phoenix-liveview-12-trae-css-colocado-en-plantillas-heex-6o5</guid>
      <description>&lt;p&gt;Phoenix LiveView 1.2 llegó el 10 de junio de 2026 con una característica que muchos desarrolladores de Elixir venían esperando: CSS colocado dentro de las plantillas HEEx. Ahora podés escribir los estilos justo al lado del componente que los usa, sin saltar a un archivo aparte.&lt;/p&gt;

&lt;p&gt;Pero hay un giro interesante. El equipo construyó toda la infraestructura necesaria para hacer &lt;em&gt;scoping&lt;/em&gt; de CSS y, aun así, decidió no activarlo por defecto. En este artículo vemos qué trae Phoenix LiveView 1.2, cómo funciona el CSS colocado por dentro y por qué esa decisión tiene mucho sentido.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Phoenix LiveView 1.2 se publicó el 10 de junio de 2026, anunciado por Steffen Deusch.- Introduce CSS colocado en plantillas HEEx mediante &lt;code&gt;&amp;lt;style :type={Modulo.ColocatedCSS}&amp;gt;&lt;/code&gt;.- El CSS se extrae en tiempo de compilación a la carpeta &lt;code&gt;phoenix-colocated&lt;/code&gt; dentro de &lt;code&gt;_build&lt;/code&gt;.- Usa la regla &lt;code&gt;@scope&lt;/code&gt; de CSS y un atributo &lt;code&gt;phx-r&lt;/code&gt; para acotar los estilos a un componente.- El scoping NO viene activado por defecto: &lt;code&gt;@scope&lt;/code&gt; aún no tiene buen soporte en navegadores en junio de 2026.- La compilación de HEEx se dividió en tokenización y parsing separados para soportar macro-componentes.- Actualizar es tan simple como cambiar &lt;code&gt;{:phoenix_live_view, "~&amp;gt; 1.2.0"}&lt;/code&gt; en &lt;code&gt;mix.exs&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Qué trae Phoenix LiveView 1.2
&lt;/h2&gt;

&lt;p&gt;Phoenix LiveView 1.2 es una versión incremental sobre la rama 1.1, pero el cambio principal toca un punto sensible del desarrollo web: dónde viven los estilos. En la versión 1.1, el equipo había introducido los &lt;em&gt;Colocated Hooks&lt;/em&gt; y el &lt;em&gt;Colocated JavaScript&lt;/em&gt;, que permiten escribir hooks de JavaScript directamente dentro de cualquier plantilla HEEx. La versión 1.2 extiende ese mismo trabajo de base, hecho sobre &lt;code&gt;Phoenix.LiveView.ColocatedJS&lt;/code&gt;, para que ahora también puedas colocar CSS dentro de HEEx.&lt;/p&gt;

&lt;p&gt;La idea de fondo es simple y poderosa: si un componente define su estructura (HTML), su comportamiento (JS) y su apariencia (CSS) en el mismo lugar, el componente se vuelve autocontenido. No hay que cazar la hoja de estilos correcta en otra carpeta, ni adivinar qué clases globales lo afectan. Para quien viene de React con CSS Modules, styled-components o Vue con &lt;code&gt;&amp;lt;style scoped&amp;gt;&lt;/code&gt;, el concepto va a sonar familiar; lo nuevo es cómo Phoenix LiveView 1.2 lo resuelve aprovechando que controla la compilación de HEEx a HTML.&lt;br&gt;
El CSS vive junto al componente que lo usa.&lt;/p&gt;
&lt;h2&gt;
  
  
  CSS colocado: estilos junto al componente
&lt;/h2&gt;

&lt;p&gt;El uso básico es directo. Dentro de tu plantilla HEEx agregás una etiqueta &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; con un atributo especial &lt;code&gt;:type&lt;/code&gt; que apunta a un módulo de CSS colocado. Veamos un ejemplo de un componente de tabla:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;assigns&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="sx"&gt;~H""&lt;/span&gt;&lt;span class="s2"&gt;"

    thead {
      color: var(--brand);
    }
    tbody tr:hover {
      background: #f5f5f5;
    }

  ...
  """&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Igual que con el JavaScript colocado, el atributo &lt;code&gt;:type&lt;/code&gt; le dice a LiveView que extraiga el contenido de la etiqueta en tiempo de compilación. Ese CSS no se queda inline en el HTML: se vuelca a una carpeta especial llamada &lt;code&gt;phoenix-colocated&lt;/code&gt; dentro de tu directorio &lt;code&gt;_build&lt;/code&gt;. Desde ahí lo recoge tu bundler habitual —normalmente Tailwind o Esbuild— y lo procesa como parte de tu pipeline de CSS de siempre. En otras palabras, no hay magia en tiempo de ejecución ni un sistema de estilos paralelo: todo termina pasando por las mismas herramientas que ya usás.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💭 Clave:&lt;/strong&gt; el CSS colocado no agrega peso en runtime. Se extrae al compilar y entra a tu bundler estándar, así que el resultado final es el mismo CSS optimizado que ya generabas.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hasta acá la parte fácil. El problema real aparece cuando querés que esos estilos no se escapen y afecten a otros elementos de la página que vienen de componentes distintos. Eso es el &lt;em&gt;scoping&lt;/em&gt;, y es donde Phoenix LiveView 1.2 hace algo elegante.&lt;/p&gt;

&lt;h2&gt;
  
  
  La regla &lt;a class="mentioned-user" href="https://dev.to/scope"&gt;@scope&lt;/a&gt; y el atributo phx-r
&lt;/h2&gt;

&lt;p&gt;El CSS moderno trae una regla relativamente nueva, &lt;code&gt;@scope&lt;/code&gt;, que permite limitar el alcance de un conjunto de reglas a una porción concreta del árbol del DOM. Su forma general es así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@scope&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raiz&lt;/span&gt; &lt;span class="n"&gt;del&lt;/span&gt; &lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;limite&lt;/span&gt; &lt;span class="n"&gt;del&lt;/span&gt; &lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c"&gt;/* reglas que solo aplican dentro de ese rango */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La regla acepta un selector raíz y un selector límite opcional. Si pudiéramos anotar el HTML renderizado con un atributo único que identifique la raíz de una plantilla y otro que marque dónde termina, podríamos escribir reglas que apliquen solo a esa plantilla. Y como LiveView controla cómo se compila HEEx a HTML, puede hacer exactamente eso.&lt;/p&gt;

&lt;p&gt;Para lograrlo, LiveView marca los elementos más externos de cada plantilla con un atributo especial &lt;code&gt;phx-r&lt;/code&gt;, que sirve como selector límite en la regla &lt;code&gt;@scope&lt;/code&gt;. Cuando un componente usa CSS colocado con scope, sus elementos raíz reciben además un atributo único del tipo &lt;code&gt;phx-css-*&lt;/code&gt;. Hay un detalle fino con los slots: el contenido que pasa el componente que llama (por ejemplo, un &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; dentro de un slot) no pertenece a la plantilla del componente sino a quien lo invoca, así que también se considera una raíz y recibe su propio &lt;code&gt;phx-r&lt;/code&gt;. Esto evita que los estilos del componente se filtren hacia el contenido que el usuario inyecta.&lt;/p&gt;

&lt;p&gt;Con esas anotaciones, el CSS scoped se ve así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@scope&lt;/span&gt; &lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;phx-css-foo&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;phx-r&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;font-weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;;&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;Con esa regla, solo los &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; que pertenecen a la plantilla del componente se renderizan en negrita; cualquier otro &lt;code&gt;&amp;lt;p&amp;gt;&lt;/code&gt; de la página queda intacto. LiveView no inyecta el atributo &lt;code&gt;phx-r&lt;/code&gt; de forma automática: es opt-in mediante una nueva configuración de compilación.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="ss"&gt;:phoenix_live_view&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="c1"&gt;# atributo que se pone en todos los tags raiz.&lt;/span&gt;
  &lt;span class="c1"&gt;# Lo usa Phoenix.LiveView.ColocatedCSS.&lt;/span&gt;
  &lt;span class="ss"&gt;root_tag_attribute:&lt;/span&gt; &lt;span class="s2"&gt;"phx-r"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La regla &lt;a class="mentioned-user" href="https://dev.to/scope"&gt;@scope&lt;/a&gt; acota los estilos entre la raíz y el límite del componente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por qué no activan el scoping por defecto
&lt;/h2&gt;

&lt;p&gt;Acá viene la decisión que sorprende. Después de todo ese esfuerzo para hacer posible el CSS colocado y el scoping, Phoenix LiveView 1.2 no envía el scoping activado por defecto. La razón es honesta y pragmática: la regla &lt;code&gt;@scope&lt;/code&gt; todavía no tiene buen soporte en todos los navegadores al momento de escribir esto, en junio de 2026. Activarla por defecto rompería estilos en una parte de los usuarios finales, algo inaceptable para un framework que prioriza la estabilidad.&lt;/p&gt;

&lt;p&gt;En lugar de imponer una solución que aún no es universal, el equipo expone un &lt;code&gt;@behaviour&lt;/code&gt; que podés implementar para hacer scoping con la estrategia que prefieras. Esto deja la puerta abierta a varias técnicas —desde &lt;code&gt;@scope&lt;/code&gt; nativo hasta prefijos de clase generados o atributos de datos— sin atar el framework a una sola. Quien quiera ser &lt;em&gt;early adopter&lt;/em&gt; de &lt;code&gt;@scope&lt;/code&gt; tiene la implementación documentada y lista para copiar.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Ojo:&lt;/strong&gt; si activás el scoping con &lt;code&gt;@scope&lt;/code&gt; hoy, verificá la compatibilidad con los navegadores de tu audiencia. En junio de 2026 el soporte todavía es parcial, sobre todo en versiones antiguas.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Esta filosofía —dar la herramienta sin forzar la opinión— es muy del estilo de Phoenix. El framework prefiere que el desarrollador decida cuándo el soporte de una feature web es suficiente para su caso, en vez de tomar esa decisión por todos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo cambió la compilación de HEEx
&lt;/h2&gt;

&lt;p&gt;Implementar el CSS colocado obligó al equipo a revisar cómo se compilan las plantillas HEEx. El resumen es que dividieron la compilación en dos pasos separados: una etapa de tokenización y otra de parsing. Esa separación les permitió manejar los macro-componentes —el CSS y el JS colocados— sin volver más complejo el resto del proceso de compilación. Como bonus, pudieron reutilizar código que antes estaba duplicado entre la compilación de plantillas y el formateo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph LR
  A["Plantilla HEEx"] --&amp;gt; B["Tokenizacion"]
  B --&amp;gt; C["Parsing"]
  C --&amp;gt; D["Extraccion de macro-componentes"]
  D --&amp;gt; E["Carpeta phoenix-colocated"]
  E --&amp;gt; F["Bundler (Tailwind / Esbuild)"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este tipo de refactor interno rara vez es visible para quien usa el framework, pero es la clase de inversión que paga dividendos a largo plazo: una arquitectura de compilación más limpia facilita agregar nuevas features colocadas en el futuro sin acumular deuda técnica. El equipo publicó además un análisis técnico aparte para quien quiera entrar en el detalle de este rediseño.&lt;/p&gt;

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

&lt;p&gt;Phoenix es el framework web por excelencia del ecosistema Elixir, y LiveView es su pieza más distintiva: permite construir interfaces interactivas en tiempo real renderizadas en el servidor, con muy poco JavaScript escrito a mano. La comunicación entre el servidor y el navegador va por WebSocket, y LiveView envía solo los &lt;em&gt;diffs&lt;/em&gt; mínimos del HTML cuando el estado cambia. Esto le dio a Elixir una ventaja particular para apps reactivas sin el peso de un framework de frontend completo.&lt;/p&gt;

&lt;p&gt;La línea de trabajo de la "colocación" —tener HTML, JS y CSS juntos— viene madurando hace varias versiones. Primero fueron los hooks y el JavaScript colocados en la 1.1, y ahora el CSS en la 1.2. Es una respuesta directa a una tensión clásica del desarrollo web: la separación de responsabilidades por tipo de archivo (todo el CSS en un lado, todo el JS en otro) suena ordenada en teoría, pero en la práctica obliga a saltar entre archivos para entender un solo componente. La tendencia de los últimos años, vista en React, Svelte y Vue, fue agrupar por componente en lugar de por tipo de archivo. Phoenix LiveView 1.2 trae esa misma comodidad al mundo de HEEx, pero con una diferencia técnica importante: la extracción ocurre en compilación y se apoya en estándares CSS nativos, no en una capa de runtime propietaria.&lt;/p&gt;

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

&lt;p&gt;Pasar de LiveView 1.1 a 1.2 es trivial. Solo tenés que actualizar el requisito de versión en tu archivo &lt;code&gt;mix.exs&lt;/code&gt; y volver a bajar las dependencias:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight elixir"&gt;&lt;code&gt;&lt;span class="c1"&gt;# En mix.exs&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:phoenix_live_view&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"~&amp;gt; 1.2.0"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Los comandos de Mix son idénticos en los tres sistemas operativos. Una vez editado &lt;code&gt;mix.exs&lt;/code&gt;, ejecutá:&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;# Windows (PowerShell o CMD), macOS y Linux: mismo comando&lt;/span&gt;
mix deps.get

&lt;span class="c"&gt;# O para forzar la actualización de ese paquete puntual:&lt;/span&gt;
mix deps.update phoenix_live_view
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Tip:&lt;/strong&gt; si usás Elixir vía &lt;code&gt;asdf&lt;/code&gt; o &lt;code&gt;mise&lt;/code&gt; en macOS/Linux, o el instalador oficial en Windows, no necesitás nada extra: &lt;code&gt;mix&lt;/code&gt; ya viene con la toolchain. El CSS colocado no requiere cambios en tu bundler más allá de que Tailwind/Esbuild lean la carpeta generada.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Entre las mejoras menores que también trae la 1.2 está la posibilidad de implementar un &lt;code&gt;Phoenix.LiveView.HTMLFormatter.TagFormatter&lt;/code&gt; para formatear etiquetas &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; y &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt; en HEEx con la herramienta que prefieras —la documentación muestra un ejemplo con prettier—, y que las estructuras &lt;code&gt;Phoenix.LiveView.JS&lt;/code&gt; ahora se codifican automáticamente al enviarse.&lt;/p&gt;

&lt;h2&gt;
  
  
  Impacto para desarrolladores en LATAM
&lt;/h2&gt;

&lt;p&gt;Para los equipos hispanohablantes que ya apostaron por Elixir y Phoenix, esta versión reduce una fricción cotidiana. El CSS colocado significa que un componente compartido —pensá en un design system interno de una startup o una agencia— puede empaquetar su estructura, comportamiento y estilo en un solo módulo, más fácil de versionar, revisar y reutilizar entre proyectos. Eso baja el costo de mantener consistencia visual cuando varios desarrolladores tocan el mismo código.&lt;/p&gt;

&lt;p&gt;El consejo práctico para nuestra región es el mismo que para todos: aprovechá el CSS colocado desde ya, porque la extracción en compilación es estable y no depende del navegador. Pero respecto al scoping con &lt;code&gt;@scope&lt;/code&gt;, medí primero qué navegadores usa tu base de usuarios. En mercados donde todavía hay dispositivos viejos o navegadores desactualizados, activar &lt;code&gt;@scope&lt;/code&gt; hoy puede traer sorpresas; en cambio, una estrategia de scoping basada en clases generadas mediante el &lt;code&gt;@behaviour&lt;/code&gt; que provee LiveView te da compatibilidad amplia sin renunciar al aislamiento.&lt;/p&gt;

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

&lt;p&gt;El camino parece claro: a medida que el soporte de &lt;code&gt;@scope&lt;/code&gt; se generalice en los navegadores, es razonable esperar que el scoping nativo pase de opt-in a una recomendación más fuerte, e incluso al comportamiento por defecto en una versión futura. Mientras tanto, la infraestructura ya está lista y el &lt;code&gt;@behaviour&lt;/code&gt; permite que cada equipo elija su momento. La separación de la compilación de HEEx en tokenización y parsing, además, deja el terreno preparado para futuras features colocadas sin tener que volver a tocar el núcleo del compilador.&lt;/p&gt;

&lt;p&gt;Para seguir el avance, lo mejor es vigilar el repositorio oficial de &lt;code&gt;phoenix_live_view&lt;/code&gt; en GitHub y el blog de Phoenix, donde el equipo suele publicar análisis técnicos detallados de cada cambio relevante.&lt;/p&gt;

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

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

&lt;h3&gt;
  
  
  ¿Qué es el CSS colocado en Phoenix LiveView 1.2?
&lt;/h3&gt;

&lt;p&gt;Es la posibilidad de escribir bloques &lt;code&gt;&amp;lt;style :type={Modulo.ColocatedCSS}&amp;gt;&lt;/code&gt; directamente dentro de una plantilla HEEx. LiveView extrae ese CSS en tiempo de compilación a la carpeta &lt;code&gt;phoenix-colocated&lt;/code&gt; y tu bundler (Tailwind o Esbuild) lo procesa como parte del pipeline normal.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿El scoping de CSS viene activado por defecto?
&lt;/h3&gt;

&lt;p&gt;No. Aunque Phoenix LiveView 1.2 incluye toda la infraestructura para hacer scoping con la regla &lt;code&gt;@scope&lt;/code&gt; y el atributo &lt;code&gt;phx-r&lt;/code&gt;, no lo activa por defecto porque &lt;code&gt;@scope&lt;/code&gt; aún no tiene buen soporte en todos los navegadores a junio de 2026. Se expone un &lt;code&gt;@behaviour&lt;/code&gt; para implementar la estrategia que prefieras.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo actualizo de LiveView 1.1 a 1.2?
&lt;/h3&gt;

&lt;p&gt;Cambiá la dependencia a &lt;code&gt;{:phoenix_live_view, "~&amp;gt; 1.2.0"}&lt;/code&gt; en &lt;code&gt;mix.exs&lt;/code&gt; y ejecutá &lt;code&gt;mix deps.get&lt;/code&gt;. El comando es el mismo en Windows, macOS y Linux.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Para qué sirve el atributo phx-r?
&lt;/h3&gt;

&lt;p&gt;Es un atributo que LiveView agrega a los elementos raíz de cada plantilla y que sirve como selector límite en la regla &lt;code&gt;@scope&lt;/code&gt;. Combinado con un atributo único &lt;code&gt;phx-css-*&lt;/code&gt;, permite que los estilos de un componente apliquen solo dentro de ese componente y no se filtren al resto de la página.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Necesito cambiar mi bundler para usar CSS colocado?
&lt;/h3&gt;

&lt;p&gt;No hace falta un bundler nuevo. El CSS extraído se deposita en una carpeta dentro de &lt;code&gt;_build&lt;/code&gt; que tu Tailwind o Esbuild existente puede leer como parte de su flujo habitual. No hay procesamiento en tiempo de ejecución.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué cambiaron la compilación de HEEx?
&lt;/h3&gt;

&lt;p&gt;Para soportar los macro-componentes (CSS y JS colocados) sin complicar el resto del compilador, dividieron la compilación en dos pasos: tokenización y parsing. Esto también permitió reutilizar código que antes estaba duplicado entre la compilación de plantillas y el formateo.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://phoenixframework.org/blog/phoenix-liveview-1-2-released" rel="noopener noreferrer"&gt;Phoenix Blog&lt;/a&gt; — Anuncio oficial de Phoenix LiveView 1.2 (10 de junio de 2026).- &lt;a href="https://github.com/phoenixframework/phoenix_live_view" rel="noopener noreferrer"&gt;GitHub: phoenix_live_view&lt;/a&gt; — Repositorio oficial con código fuente, changelog e issues.- &lt;a href="https://hexdocs.pm/phoenix_live_view" rel="noopener noreferrer"&gt;HexDocs: Phoenix.LiveView&lt;/a&gt; — Documentación de la API, incluido el módulo ColocatedCSS.- &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/@scope" rel="noopener noreferrer"&gt;MDN: @scope&lt;/a&gt; — Referencia de la regla CSS &lt;a class="mentioned-user" href="https://dev.to/scope"&gt;@scope&lt;/a&gt; y su compatibilidad con navegadores.&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 FDA aprueba el bemotrizinol, primer filtro UV nuevo en 20 años</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Sun, 14 Jun 2026 02:18:56 +0000</pubDate>
      <link>https://dev.to/lu1tr0n/la-fda-aprueba-el-bemotrizinol-primer-filtro-uv-nuevo-en-20-anos-3249</link>
      <guid>https://dev.to/lu1tr0n/la-fda-aprueba-el-bemotrizinol-primer-filtro-uv-nuevo-en-20-anos-3249</guid>
      <description>&lt;p&gt;La Administración de Alimentos y Medicamentos de Estados Unidos (FDA) aprobó el &lt;strong&gt;bemotrizinol&lt;/strong&gt;, el primer filtro ultravioleta químico nuevo que llega a los protectores solares estadounidenses en casi dos décadas. El ingrediente, presente en productos de Europa y Asia desde hace años, bloquea rayos UVA y UVB por sí solo y resiste la degradación bajo el sol.&lt;/p&gt;

&lt;p&gt;Detrás del anuncio hay una historia de regulación, química y más de 18 millones de dólares invertidos a lo largo de veinte años. Acá explicamos qué es, cómo funciona y qué cambia para quienes vivimos bajo el sol intenso de Latinoamérica.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;La FDA aprobó el bemotrizinol, el primer filtro UV químico nuevo para protectores solares en EE.UU. en casi 20 años.&lt;/li&gt;
&lt;li&gt;Bloquea rayos UVA y UVB por sí solo y es fotoestable: se degrada lento, así que protege más tiempo entre aplicaciones.&lt;/li&gt;
&lt;li&gt;Su nombre comercial más conocido es Tinosorb S; se usa en Europa y Asia desde hace décadas.&lt;/li&gt;
&lt;li&gt;EE.UU. regula los protectores como medicamentos de venta libre, no como cosméticos: por eso la aprobación tardó tanto.&lt;/li&gt;
&lt;li&gt;DSM-Firmenich invirtió al menos US$18 millones durante más de 20 años para lograr la aprobación.&lt;/li&gt;
&lt;li&gt;Su molécula es grande, por lo que casi no se absorbe en el torrente sanguíneo, a diferencia de otros filtros químicos.&lt;/li&gt;
&lt;li&gt;En gran parte de LATAM, que sigue la regulación cosmética europea, el bemotrizinol ya estaba disponible.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Qué pasó: la FDA aprueba el bemotrizinol
&lt;/h2&gt;

&lt;p&gt;Por primera vez en casi tres décadas, la FDA dio luz verde a un nuevo filtro ultravioleta químico para los protectores solares que se venden en Estados Unidos. La noticia, reportada por NPR el 13 de junio de 2026, fue recibida con entusiasmo poco habitual por parte de la comunidad dermatológica. &lt;em&gt;"Esto es un gran asunto"&lt;/em&gt;, resumió la doctora Heather Rogers, dermatóloga en Seattle y miembro de la Academia Estadounidense de Dermatología.&lt;/p&gt;

&lt;p&gt;El bemotrizinol no es un desconocido: es el mismo compuesto que la industria comercializa bajo el nombre &lt;strong&gt;Tinosorb S&lt;/strong&gt; y que, en la nomenclatura internacional de ingredientes cosméticos (INCI), aparece como &lt;em&gt;bis-ethylhexyloxyphenol methoxyphenyl triazine&lt;/em&gt;. Lo nuevo no es la molécula, sino el permiso para usarla en un mercado que llevaba años atascado en una lista cerrada de filtros aprobados.&lt;/p&gt;

&lt;p&gt;Para entender por qué un ingrediente común en la góndola de cualquier farmacia europea tardó tanto en cruzar el Atlántico, hay que mirar cómo cada región clasifica al protector solar. Y ahí está la clave de toda la historia del bemotrizinol.&lt;/p&gt;

&lt;p&gt;Los filtros UV son la primera barrera contra el daño solar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contexto e historia: por qué la FDA tardó 20 años
&lt;/h2&gt;

&lt;p&gt;En Estados Unidos, los protectores solares se regulan como &lt;strong&gt;medicamentos de venta libre&lt;/strong&gt; (OTC, por &lt;em&gt;over-the-counter&lt;/em&gt;), no como cosméticos. Esa distinción, que parece burocrática, define todo lo demás. Un medicamento debe pasar por pruebas rigurosas de seguridad y eficacia antes de llegar al mercado. &lt;em&gt;"Es realmente caro y consume mucho tiempo"&lt;/em&gt;, explicó Kelly Dobos, química cosmética que enseña en la Universidad de Cincinnati.&lt;/p&gt;

&lt;p&gt;En Europa, en cambio, los protectores solares se tratan como cosméticos. El umbral regulatorio es más liviano y permite incorporar filtros nuevos con mucha más agilidad. El resultado: durante 20 años, el consumidor europeo y asiático tuvo acceso a filtros de última generación que el estadounidense no podía comprar legalmente.&lt;/p&gt;

&lt;p&gt;La empresa europea DSM-Firmenich gastó &lt;strong&gt;al menos 18 millones de dólares a lo largo de más de dos décadas&lt;/strong&gt; empujando el expediente de aprobación del bemotrizinol ante la FDA. Esa cifra ilustra el costo real de la divergencia regulatoria: no es que la ciencia faltara, sino que el camino administrativo era largo y caro.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💭 Clave:&lt;/strong&gt; La diferencia no estuvo en la molécula, sino en cómo cada región la clasifica. Cosmético en Europa, medicamento en EE.UU.: la misma sustancia, dos velocidades regulatorias completamente distintas.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;El siguiente diagrama resume por qué un mismo ingrediente siguió caminos tan distintos según el continente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph LR
  A["Nuevo filtro UV"] --&amp;gt; B{"Como se regula?"}
  B --&amp;gt;|"Europa: cosmetico"| C["Aprobacion agil"]
  B --&amp;gt;|"EE.UU.: medicamento OTC"| D["Pruebas de seguridad y eficacia"]
  D --&amp;gt; E["20+ anos y mas de US$18M"]
  E --&amp;gt; F["Aprobacion 2026"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Cómo funciona el bemotrizinol: UVA, UVB y fotoestabilidad
&lt;/h2&gt;

&lt;p&gt;Para apreciar por qué los dermatólogos celebran, conviene repasar dos conceptos. La radiación solar que nos preocupa se divide en &lt;strong&gt;rayos UVB&lt;/strong&gt;, los de longitud de onda más corta que provocan quemaduras, y &lt;strong&gt;rayos UVA&lt;/strong&gt;, de longitud más larga, responsables del envejecimiento prematuro y las arrugas. Ambos pueden causar cáncer de piel. Un buen protector debe ser de &lt;em&gt;amplio espectro&lt;/em&gt;: cubrir los dos.&lt;/p&gt;

&lt;p&gt;Históricamente, los protectores estadounidenses eran excelentes frenando UVB, pero flojos contra UVA. El filtro que usaban para los UVA, el &lt;strong&gt;avobenzona&lt;/strong&gt;, tiene un problema: no es fotoestable. Su capacidad de protección empieza a romperse rápido al exponerse al sol. Según datos recopilados en su ficha técnica, la avobenzona puede perder cerca de un 36% de su absorbancia tras una sola hora de sol, y al degradarse libera moléculas que pueden irritar la piel. Por eso suele combinarse con estabilizantes como la octocrilena.&lt;/p&gt;

&lt;p&gt;El bemotrizinol resuelve las dos cosas a la vez. Es de amplio espectro por sí solo —tiene dos picos de absorción, alrededor de 310 nm (UVB) y 340 nm (UVA)— y es notablemente fotoestable. Distintos estudios citados en la literatura técnica indican que conserva más del 98% de su estructura incluso tras dosis altas de radiación. &lt;em&gt;"Si pasás un poco más de las dos horas para reaplicar el protector, todavía quedará más protección"&lt;/em&gt;, señaló Rogers. (Aun así, recomienda reaplicar cada dos horas: la mejora no es excusa para descuidarse.)&lt;/p&gt;

&lt;p&gt;Hay un beneficio adicional clave para la confianza del público. La molécula del bemotrizinol es &lt;strong&gt;grande&lt;/strong&gt;, lo que dificulta que la piel la absorba y llegue al torrente sanguíneo. Esto importa porque estudios previos mostraron que algunos filtros químicos vendidos en EE.UU. sí se absorbían en la sangre, lo que disparó pedidos de más datos de seguridad y alimentó una ola de desinformación contra el protector solar en redes sociales.&lt;/p&gt;

&lt;p&gt;El bemotrizinol cubre UVA y UVB con un solo filtro fotoestable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Datos y cifras del bemotrizinol
&lt;/h2&gt;

&lt;p&gt;Resumamos los números que definen esta aprobación. Es el &lt;strong&gt;primer filtro UV químico nuevo&lt;/strong&gt; aprobado por la FDA en cerca de 20 años (y, según algunas cuentas, en casi tres décadas). La empresa DSM-Firmenich invirtió &lt;strong&gt;al menos US$18 millones&lt;/strong&gt; en el proceso, sostenido por &lt;strong&gt;más de 20 años&lt;/strong&gt; de trabajo regulatorio.&lt;/p&gt;

&lt;p&gt;En el terreno técnico, el bemotrizinol (fórmula molecular C₃₈H₄₉N₃O₅, masa molar cercana a 628 g/mol) ofrece protección de amplio espectro con dos máximos de absorción en torno a 310 y 340 nanómetros. Según la documentación disponible, retiene alrededor del 98% de su integridad tras decenas de dosis eritémicas mínimas de radiación, una cifra que contrasta de forma dramática con la caída de la avobenzona.&lt;/p&gt;

&lt;p&gt;Alexa Friedman, científica sénior del Environmental Working Group (EWG), subraya un punto importante: por haber pasado todo ese proceso de testeo, el bemotrizinol llega con &lt;strong&gt;más datos de seguridad que cualquier otro filtro químico actualmente aprobado en EE.UU.&lt;/strong&gt; Las pruebas en animales no mostraron daños reproductivos, y los ensayos clínicos en humanos indicaron que no irrita la piel incluso tras aplicaciones repetidas en el tiempo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📌 Nota:&lt;/strong&gt; Hasta ahora, el único ingrediente disponible en EE.UU. que combinaba fotoestabilidad, baja absorción y buena cobertura UVA/UVB era el óxido de zinc, un filtro mineral. El bemotrizinol ofrece ese paquete pero como filtro químico, con mejor cosmética.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Impacto y análisis: qué cambia, y qué significa para LATAM
&lt;/h2&gt;

&lt;p&gt;El cuarto gran atractivo del bemotrizinol es estético, y no es un detalle menor. Los filtros minerales como el óxido de zinc y el dióxido de titanio se asientan sobre la superficie de la piel y suelen dejar ese residuo blanquecino tan conocido, poco favorecedor en pieles más oscuras. Los filtros químicos, en cambio, se integran mejor y resultan más cosméticos. Un protector que la gente &lt;em&gt;quiera&lt;/em&gt; usar termina protegiendo más que uno técnicamente perfecto que queda olvidado en el cajón.&lt;/p&gt;

&lt;p&gt;Y ahí está el argumento de salud pública que repiten los dermatólogos. &lt;em&gt;"Solo necesitamos tener un protector solar que la gente use, en el que confíe"&lt;/em&gt;, dijo Rogers. &lt;em&gt;"Y este ingrediente va a permitir que eso suceda"&lt;/em&gt;. El cáncer de piel es el tipo de cáncer más común, así que la adherencia —que la gente efectivamente se ponga el producto— pesa tanto como la fórmula.&lt;/p&gt;

&lt;p&gt;¿Y qué pasa con Latinoamérica? Acá hay una ironía interesante. Buena parte de los países de la región siguen, de forma total o parcial, el marco regulatorio europeo que trata al protector solar como cosmético. Eso significa que en muchos mercados de LATAM el bemotrizinol (Tinosorb S) y otros filtros modernos como el Tinosorb M &lt;strong&gt;ya estaban disponibles desde hace años&lt;/strong&gt;, mientras el consumidor estadounidense esperaba. La noticia de la FDA, vista desde la región, es menos un estreno y más una confirmación: el mercado más exigente del mundo en regulación de medicamentos validó un ingrediente que muchos latinoamericanos ya usaban.&lt;/p&gt;

&lt;p&gt;Para quienes trabajan en tecnología, ciencia de datos o salud digital, el caso del bemotrizinol es además un recordatorio de cómo los marcos regulatorios moldean la innovación tanto como la ciencia misma. La molécula existía, los datos existían; lo que faltaba era recorrer un proceso de aprobación diseñado para fármacos. Es el mismo tipo de fricción regulatoria que vemos en dispositivos médicos, software clínico y herramientas de diagnóstico asistido por IA: la barrera no siempre es técnica.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Tip:&lt;/strong&gt; Al elegir un protector solar, fijate en la etiqueta si dice "amplio espectro" (UVA + UVB) y revisá los ingredientes activos. Si vivís en LATAM, es probable que ya encuentres bemotrizinol o Tinosorb S sin necesidad de importarlo.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;La aprobación abre la puerta a que los fabricantes estadounidenses reformulen sus protectores con bemotrizinol, aunque eso no ocurre de un día para el otro: hay que rediseñar fórmulas, hacer pruebas de estabilidad y pasar controles antes de que los nuevos productos lleguen a las estanterías. En los próximos meses y años se espera una nueva generación de protectores estadounidenses con mejor cobertura UVA y mejor cosmética.&lt;/p&gt;

&lt;p&gt;El otro frente es la confianza pública. La desinformación contra los protectores solares —impulsada en parte por estudios sobre absorción de filtros químicos y amplificada en redes— sigue siendo un problema. Que el bemotrizinol llegue respaldado por dos décadas de datos y con baja absorción cutánea les da a dermatólogos y divulgadores un argumento sólido para recuperar esa confianza. Para los expertos, el mensaje es simple: el mejor protector solar es el que efectivamente te aplicás.&lt;/p&gt;

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

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

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

&lt;p&gt;Es un filtro ultravioleta químico de amplio espectro que protege contra rayos UVA y UVB. Se comercializa principalmente como Tinosorb S y su nombre INCI es bis-ethylhexyloxyphenol methoxyphenyl triazine. La FDA lo aprobó para protectores solares en EE.UU. en junio de 2026.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué la FDA tardó casi 20 años en aprobarlo?
&lt;/h3&gt;

&lt;p&gt;Porque en Estados Unidos los protectores solares se regulan como medicamentos de venta libre, no como cosméticos. Eso exige pruebas rigurosas y costosas de seguridad y eficacia. DSM-Firmenich invirtió al menos US$18 millones a lo largo de más de 20 años para completar el expediente.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Es seguro el bemotrizinol?
&lt;/h3&gt;

&lt;p&gt;Según el EWG, llega con más datos de seguridad que cualquier otro filtro químico aprobado en EE.UU. Las pruebas no mostraron daños reproductivos en animales ni irritación cutánea en humanos, y su molécula grande casi no se absorbe en el torrente sanguíneo.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿En qué se diferencia de la avobenzona?
&lt;/h3&gt;

&lt;p&gt;La avobenzona, el filtro UVA tradicional en EE.UU., no es fotoestable: pierde cerca del 36% de su absorbancia tras una hora de sol y necesita estabilizantes. El bemotrizinol cubre UVA y UVB por sí solo y conserva más del 98% de su estructura tras radiación intensa.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Ya está disponible el bemotrizinol en Latinoamérica?
&lt;/h3&gt;

&lt;p&gt;En buena parte de LATAM, donde la regulación sigue el modelo cosmético europeo, el bemotrizinol (Tinosorb S) ya estaba disponible desde hace años en protectores importados o formulados localmente. La aprobación de la FDA principalmente abre el mercado estadounidense.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Tengo que reaplicar el protector con menos frecuencia?
&lt;/h3&gt;

&lt;p&gt;No. Aunque el bemotrizinol se degrada más lento y deja más protección residual, los dermatólogos siguen recomendando reaplicar cada dos horas, sobre todo después de nadar o sudar.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.npr.org/2026/06/13/nx-s1-5856385/sunscreen-skin-protection-bemotrizinol" rel="noopener noreferrer"&gt;NPR&lt;/a&gt; — Cobertura original de la aprobación del bemotrizinol por la FDA, con declaraciones de dermatólogos y expertos.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Bemotrizinol" rel="noopener noreferrer"&gt;Wikipedia: Bemotrizinol&lt;/a&gt; — Ficha técnica del compuesto: espectro de absorción, fotoestabilidad, nombre IUPAC y fórmula molecular.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Avobenzone" rel="noopener noreferrer"&gt;Wikipedia: Avobenzone&lt;/a&gt; — Datos sobre la avobenzona, su protección UVA y su degradación bajo luz solar.&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 ROM del WorkBoy, la PDA del Game Boy de 1992, apareció en el Gigaleak</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Sat, 13 Jun 2026 20:18:32 +0000</pubDate>
      <link>https://dev.to/lu1tr0n/la-rom-del-workboy-la-pda-del-game-boy-de-1992-aparecio-en-el-gigaleak-1nmc</link>
      <guid>https://dev.to/lu1tr0n/la-rom-del-workboy-la-pda-del-game-boy-de-1992-aparecio-en-el-gigaleak-1nmc</guid>
      <description>&lt;p&gt;En 1992, una pequeña empresa llamada Montague-Weston diseñó un accesorio que prometía convertir el Game Boy en una computadora de bolsillo: el &lt;strong&gt;WorkBoy&lt;/strong&gt;. Traía un teclado físico, agenda de contactos, calculadora, conversor de monedas y temperaturas, y traducción de palabras entre cinco idiomas. Nintendo lo licenció, las revistas de la época lo anunciaron... y nunca llegó a las tiendas.&lt;/p&gt;

&lt;p&gt;Durante 28 años se dio por perdido, tanto el cartucho como el teclado. Hasta que en 2020 una filtración masiva de Nintendo destapó su ROM y un historiador logró hacerlo funcionar de verdad. Esta es la historia del WorkBoy y de cómo se preserva el software que estuvo a punto de desaparecer.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;El WorkBoy (1992) era un teclado físico que convertía el Game Boy en una PDA: agenda, contactos, calculadora y conversor de monedas.&lt;/li&gt;
&lt;li&gt;Lo diseñó Montague-Weston, lo licenció Nintendo y lo iba a distribuir Fabtek, pero nunca llegó a las tiendas pese a anuncios en revistas.&lt;/li&gt;
&lt;li&gt;Su ROM apareció en el lote de Game Boy filtrado en septiembre de 2020, parte del llamado Nintendo Gigaleak.&lt;/li&gt;
&lt;li&gt;En diciembre de 2020, Liam Robertson (DidYouKnowGaming?) mostró un prototipo del teclado funcionando con la ROM filtrada.&lt;/li&gt;
&lt;li&gt;La pantalla muestra la versión 8.87, pero las cadenas internas dicen 5.74: el código sobrescribe el número en RAM al arrancar.&lt;/li&gt;
&lt;li&gt;La ROM guarda la pantalla de título en cinco idiomas (inglés, español, italiano, alemán y francés) en offsets fijos.&lt;/li&gt;
&lt;li&gt;El caso es un ejemplo claro de preservación de software y de ingeniería inversa sobre hardware retro.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Qué fue el WorkBoy
&lt;/h2&gt;

&lt;p&gt;El &lt;strong&gt;WorkBoy&lt;/strong&gt; no era un juego. Era un periférico que se conectaba al puerto del cartucho del Game Boy y le añadía un teclado completo, transformando la consola portátil más popular de su época en una agenda electrónica. La idea era ambiciosa para 1992: con la pantalla monocromática del Game Boy y un teclado de membrana, podías guardar citas, direcciones, números de teléfono, llevar el balance de tu cuenta bancaria y hasta convertir temperaturas y divisas. En un mundo previo a las Palm y mucho antes del primer smartphone, era una propuesta adelantada.&lt;/p&gt;

&lt;p&gt;El reparto detrás del proyecto explica buena parte de la historia. El diseño y el software venían de Montague-Weston; la licencia, de Nintendo; y la distribución estaba a cargo de Fabtek, Inc., la misma compañía que más tarde se haría conocida por publicar el arcade &lt;em&gt;Raiden&lt;/em&gt; en Norteamérica. Esa cadena de actores aparece, literalmente, en la pantalla de título del propio software, como veremos más abajo cuando leamos la ROM byte por byte.&lt;/p&gt;

&lt;p&gt;El Game Boy de 1992, la base sobre la que el WorkBoy quería construir una PDA.&lt;/p&gt;

&lt;p&gt;El problema es que, pese a los anuncios pagados en revistas de videojuegos de la época, el WorkBoy &lt;strong&gt;nunca se lanzó comercialmente&lt;/strong&gt;. No hubo unidades a la venta, no hubo cartuchos en estanterías, y con los años quedó como una de esas leyendas del hardware perdido: un accesorio del que existían fotos publicitarias pero ninguna prueba de que funcionara realmente. Para coleccionistas e historiadores, era una pieza fantasma.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contexto e historia: del olvido a la filtración
&lt;/h2&gt;

&lt;p&gt;El giro llega en 2020. Ese año, Nintendo sufrió una de las filtraciones de datos más grandes de su historia, conocida popularmente como el &lt;strong&gt;Gigaleak&lt;/strong&gt;. Se trató de una serie de volcados de información interna de la compañía publicados de forma anónima en imageboards. El nombre "Gigaleak" se asoció sobre todo a la segunda tanda, de julio de 2020, de unos tres gigabytes, pero hubo varias oleadas a lo largo del año.&lt;/p&gt;

&lt;p&gt;La que nos interesa es la de &lt;strong&gt;septiembre de 2020&lt;/strong&gt;. En la segunda semana de ese mes apareció un conjunto enorme de material que incluía documentación interna de &lt;em&gt;Wii Sports&lt;/em&gt;, el código fuente del bootrom de la Nintendo DSi y, crucialmente, un &lt;strong&gt;lote de ROMs de Game Boy y Game Boy Color&lt;/strong&gt; con juegos publicados y sin publicar. Entre esos volcados estaba el cartucho del WorkBoy. Después de casi tres décadas, el software perdido reaparecía, no en un mercado de pulgas, sino en un archivo filtrado en internet.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📌 Nota:&lt;/strong&gt; El WorkBoy figura en la categoría de "Nintendo Leaks" de The Cutting Room Floor (TCRF), el wiki dedicado a documentar contenido oculto y sin usar dentro de videojuegos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;El segundo acto lo puso el historiador &lt;strong&gt;Liam Robertson&lt;/strong&gt;. En diciembre de 2020, el canal de YouTube DidYouKnowGaming? publicó un video en el que Robertson aparecía usando un &lt;strong&gt;prototipo del teclado&lt;/strong&gt; del WorkBoy junto con la ROM filtrada, sobre un Game Boy real. Robertson había rastreado durante años el hardware hasta dar con Frank Ballouz, fundador de Fabtek, dueño de uno de los pocos prototipos conocidos. Lo que le faltaba era el software: el teclado no servía de nada sin el cartucho. La ROM del Gigaleak fue exactamente la pieza que faltaba. Grabada en un cartucho regrabable, hizo que el prototipo funcionara tal como se diseñó en 1992.&lt;/p&gt;

&lt;h2&gt;
  
  
  Datos y cifras del WorkBoy
&lt;/h2&gt;

&lt;p&gt;Más allá de la anécdota, lo interesante para quien programa es que hoy podemos abrir la ROM y examinarla. The Cutting Room Floor documentó varios detalles técnicos verificables que vale la pena desglosar, porque muestran cómo se construía software comercial para hardware de 8 bits.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Año y créditos&lt;/strong&gt; — La pantalla de título declara &lt;code&gt;(c) 1992 Montague-Weston&lt;/code&gt;, con licencia exclusiva a Fabtek, Inc. y "Licensed by Nintendo".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cinco idiomas&lt;/strong&gt; — El cartucho incluye la pantalla de título localizada en inglés, español, italiano, alemán y francés, cada una almacenada en un offset distinto de la ROM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dos números de versión&lt;/strong&gt; — La pantalla muestra &lt;code&gt;Version 5.74&lt;/code&gt; en su forma final renderizada, pero las cadenas crudas en la ROM dicen una cosa y el arranque las modifica. Ese detalle es la joya técnica del caso.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Los offsets concretos de cada localización están documentados. Si tuvieras el archivo &lt;code&gt;workboy.gb&lt;/code&gt;, podrías extraer cada cadena con unas pocas líneas de Python, sin emulador ni herramientas especiales:&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="n"&gt;OFFSETS&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;ingles&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="mh"&gt;0x08072&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x080D6&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;espanol&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="mh"&gt;0x08E9A&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x08F09&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;italiano&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="mh"&gt;0x10075&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x100E2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aleman&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="mh"&gt;0x14078&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x140E1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;frances&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="mh"&gt;0x1C077&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mh"&gt;0x1C0DC&lt;/span&gt;&lt;span class="p"&gt;),&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;workboy.gb&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;rb&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;rom&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;idioma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inicio&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;OFFSETS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&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;rom&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;inicio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;fin&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ascii&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;replace&lt;/span&gt;&lt;span class="sh"&gt;"&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;== &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;idioma&lt;/span&gt;&lt;span class="si"&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="nf"&gt;print&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una ROM no es magia: es un arreglo de bytes con un mapa de memoria conocido. Cada idioma vive en una región fija y el programa salta al offset correcto según la configuración. Esta es exactamente la clase de estructura que hace posible la preservación: si conocés el offset, conocés el dato.&lt;/p&gt;

&lt;p&gt;Una ROM es un arreglo de bytes con un mapa de memoria conocido.&lt;/p&gt;

&lt;h2&gt;
  
  
  El truco de la versión: 5.74 que se vuelve 8.87
&lt;/h2&gt;

&lt;p&gt;Aquí está el detalle que más disfrutan los aficionados a la ingeniería inversa. La descubridora &lt;em&gt;WaluigiBSOD&lt;/em&gt; documentó que la pantalla de título del WorkBoy muestra el número de versión &lt;strong&gt;8.87&lt;/strong&gt;, pero las cadenas almacenadas en el código indican &lt;strong&gt;5.74&lt;/strong&gt;. ¿Por qué dos números distintos para lo mismo?&lt;/p&gt;

&lt;p&gt;La respuesta es un parche en tiempo de ejecución. Antes de dibujar la pantalla de título, el programa copia la cadena correspondiente a la RAM y, una vez ahí, &lt;strong&gt;reemplaza el texto "5.74" por "8.87"&lt;/strong&gt;, leyendo esos cuatro caracteres desde la ROM en los offsets &lt;code&gt;0x00FEA-0x00FED&lt;/code&gt;. Es decir: el número "real" que ve el usuario no está pegado a la cadena de cada idioma, sino guardado una sola vez y estampado sobre la plantilla en el momento de pintar.&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="c1"&gt;# La ROM guarda "5.74" en las cadenas, pero muestra "8.87".
# Antes de pintar la pantalla, copia la cadena a RAM y sobrescribe
# "5.74" con "8.87", leido de la ROM en 0x00FEA-0x00FED.
&lt;/span&gt;&lt;span class="n"&gt;version_mostrada&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rom&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mh"&gt;0x00FEA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mh"&gt;0x00FEE&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ascii&lt;/span&gt;&lt;span class="sh"&gt;"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Version real en pantalla:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;version_mostrada&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 8.87
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¿Por qué hacerlo así? Es un patrón clásico de la programación de la época, cuando cada byte contaba. En lugar de repetir el número de versión cinco veces (una por idioma) y tener que editar cinco lugares en cada compilación, guardás la versión una sola vez y la inyectás en una plantilla compartida. Reduce duplicación y errores. Hoy lo resolveríamos con una variable o una interpolación de cadena; en 1992, con un Game Boy de 8 KB de RAM, lo resolvías sobrescribiendo bytes en memoria.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart LR
  A["ROM: cadena con 5.74"] --&amp;gt; B["Copia a RAM"]
  B --&amp;gt; C["Lee 8.87 de 0x00FEA"]
  C --&amp;gt; D["Sobrescribe 5.74 por 8.87"]
  D --&amp;gt; E["Pinta la pantalla de titulo"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💭 Clave:&lt;/strong&gt; El número de versión que ve el usuario no estaba en las cadenas: se estampaba en RAM al arrancar. Una micro-optimización de memoria que hoy delata cómo se construyó el software.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Cómo se preserva una ROM perdida
&lt;/h2&gt;

&lt;p&gt;El caso del WorkBoy ilustra por qué la &lt;strong&gt;preservación de software&lt;/strong&gt; importa, y por qué la comunidad técnica le dedica tanto esfuerzo. Sin esa ROM filtrada, el prototipo de teclado de Robertson sería un pisapapeles: hardware sin software no hace nada. La filtración, por dudosa que sea su procedencia, terminó siendo el único registro funcional de un producto que de otra forma estaría perdido para siempre.&lt;/p&gt;

&lt;p&gt;Para quien quiera meterse en este mundo desde LATAM, el ecosistema de herramientas de Game Boy es sorprendentemente accesible y gratuito. Una de las más usadas es &lt;strong&gt;RGBDS&lt;/strong&gt; (Rednex Game Boy Development System), el toolkit que ensambla y desensambla código de Game Boy. Instalarlo es directo en los tres sistemas operativos:&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;# Windows (Scoop)&lt;/span&gt;
scoop &lt;span class="nb"&gt;install &lt;/span&gt;rgbds

&lt;span class="c"&gt;# macOS (Homebrew)&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;rgbds

&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;rgbds
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con un toolkit así más un emulador como mGBA, podés cargar una ROM, inspeccionar su mapa de memoria, seguir el flujo de ejecución y reconstruir cómo se comporta el programa. Es exactamente el tipo de trabajo que permitió documentar el parche de versión del WorkBoy: alguien abrió la ROM, encontró la cadena "5.74", notó que la pantalla decía "8.87" y siguió el rastro hasta el código que hacía la sustitución.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Tip:&lt;/strong&gt; Si querés practicar ingeniería inversa sin riesgos legales, empezá con ROMs homebrew de dominio público o con tus propios cartuchos volcados. El Game Boy es la plataforma ideal para aprender: arquitectura simple, documentación abundante y herramientas libres.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Más allá de la nostalgia, el WorkBoy deja varias lecciones para desarrolladores. La primera es histórica: las PDA y los asistentes personales no nacieron con Palm ni con el iPhone. Hubo intentos tempranos, muchos fallidos, de meter productividad en dispositivos de consumo. El WorkBoy fue uno de ellos, y su fracaso comercial no le quita valor como antecedente conceptual.&lt;/p&gt;

&lt;p&gt;La segunda lección es técnica. Leer una ROma de 8 bits hoy es trivial con Python, pero entender &lt;em&gt;por qué&lt;/em&gt; está escrita así requiere ponerse en el lugar de quien programaba con restricciones brutales de memoria y procesamiento. El truco del número de versión no es un bug ni una rareza: es una decisión de diseño razonable bajo esas limitaciones. Estudiar código antiguo es estudiar restricciones, y eso entrena el criterio de cualquier ingeniero moderno.&lt;/p&gt;

&lt;p&gt;La tercera es ética y práctica a la vez: la preservación digital depende, demasiadas veces, de filtraciones y de fans. No existe un archivo oficial y abierto de buena parte del software comercial de los 80 y 90. Cuando una empresa decide no relanzar ni archivar un producto, el conocimiento queda en manos de coleccionistas, dumpers y comunidades como TCRF. El WorkBoy sobrevivió de milagro; muchísimos títulos y accesorios no tuvieron esa suerte.&lt;/p&gt;

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

&lt;p&gt;El WorkBoy ya está documentado, su ROM circula entre quienes estudian hardware retro y su funcionamiento quedó registrado en video. Lo que sigue es lo de siempre en este campo: que más gente abra esos archivos, los analice y publique sus hallazgos. Cada offset documentado, cada cadena traducida y cada rutina explicada hace que la próxima persona que se acerque al tema tenga un punto de partida.&lt;/p&gt;

&lt;p&gt;Para la comunidad de desarrollo en español, casos como este son una invitación. La barrera de entrada a la ingeniería inversa de consolas retro es baja, las herramientas son libres y multiplataforma, y el material para practicar abunda. El WorkBoy es, en ese sentido, un recordatorio de que la tecnología "vieja" sigue teniendo mucho que enseñar.&lt;/p&gt;

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

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

&lt;h3&gt;
  
  
  ¿Qué era exactamente el WorkBoy?
&lt;/h3&gt;

&lt;p&gt;Un accesorio de 1992 que conectaba un teclado físico al Game Boy y lo convertía en una PDA: permitía guardar citas, contactos, números de teléfono y balance bancario, además de convertir temperaturas, monedas y traducir palabras entre cinco idiomas.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué nunca se lanzó?
&lt;/h3&gt;

&lt;p&gt;Pese a tener licencia de Nintendo, distribución prevista por Fabtek y anuncios en revistas de la época, el WorkBoy nunca llegó al mercado. No hubo unidades a la venta y tanto el cartucho como el teclado se consideraron perdidos durante casi tres décadas.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo reapareció su software?
&lt;/h3&gt;

&lt;p&gt;La ROM del WorkBoy apareció en el lote de Game Boy filtrado en septiembre de 2020, parte de la gran filtración de datos de Nintendo conocida como Gigaleak. En diciembre de 2020, Liam Robertson la usó para hacer funcionar un prototipo del teclado.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué la versión es 5.74 y 8.87 al mismo tiempo?
&lt;/h3&gt;

&lt;p&gt;Las cadenas internas de la ROM dicen "5.74", pero al arrancar el programa copia la cadena a RAM y sobrescribe ese texto con "8.87", leído desde la ROM en los offsets 0x00FEA-0x00FED. El usuario ve 8.87; el dato base es 5.74.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Es legal estudiar la ROM del WorkBoy?
&lt;/h3&gt;

&lt;p&gt;El análisis y la documentación de software para fines de investigación y preservación son prácticas comunes, pero la ROM proviene de una filtración no autorizada. Para aprender ingeniería inversa sin riesgos, conviene usar ROMs homebrew de dominio público o volcados de cartuchos propios.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Con qué herramientas puedo analizar ROMs de Game Boy?
&lt;/h3&gt;

&lt;p&gt;RGBDS para ensamblar y desensamblar, emuladores como mGBA con depurador integrado, y editores hexadecimales para inspeccionar bytes. Todas son gratuitas y funcionan en Windows, macOS y Linux.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://tcrf.net/Workboy" rel="noopener noreferrer"&gt;The Cutting Room Floor — Workboy&lt;/a&gt; — documentación técnica: offsets de idiomas y el truco de la versión 5.74/8.87.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Nintendo_data_leak" rel="noopener noreferrer"&gt;Wikipedia — Nintendo data leak&lt;/a&gt; — cronología del Gigaleak y de las filtraciones de septiembre de 2020.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.inverse.com/input/gaming/meet-the-workboy-nintendos-long-lost-gameboy-productivity-device" rel="noopener noreferrer"&gt;Inverse — Meet the WorkBoy&lt;/a&gt; — contexto sobre el accesorio y su recuperación por Liam Robertson.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.siliconera.com/rare-unreleased-game-boy-workboy-prototype-demonstrated-on-youtube/" rel="noopener noreferrer"&gt;Siliconera — WorkBoy prototype demonstrated&lt;/a&gt; — cobertura del prototipo funcionando con la ROM filtrada.&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>TensorZero movía el 1% del gasto global en LLMs y archivó su repositorio</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Sat, 13 Jun 2026 14:17:35 +0000</pubDate>
      <link>https://dev.to/lu1tr0n/tensorzero-movia-el-1-del-gasto-global-en-llms-y-archivo-su-repositorio-160k</link>
      <guid>https://dev.to/lu1tr0n/tensorzero-movia-el-1-del-gasto-global-en-llms-y-archivo-su-repositorio-160k</guid>
      <description>&lt;p&gt;El 12 de junio de 2026, sin comunicado ni explicación visible, el repositorio de &lt;strong&gt;TensorZero&lt;/strong&gt; en GitHub amaneció con un aviso seco: &lt;em&gt;"This repository was archived by the owner. It is now read-only."&lt;/em&gt; Hablamos de una de las plataformas LLMOps de código abierto más populares del momento: 11.500 estrellas, 850 forks y, según su propia documentación, infraestructura que canalizaba cerca del 1% del gasto mundial en APIs de modelos de lenguaje.&lt;/p&gt;

&lt;p&gt;Que un proyecto de este tamaño pase a solo lectura de un día para otro es noticia. Acá explicamos qué es TensorZero, por qué importaba para quienes construyen aplicaciones con LLMs y qué significa, en la práctica, que su repositorio quede congelado.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;GitHub archivó el repositorio de TensorZero el 12 de junio de 2026: quedó en modo solo lectura, sin nuevos commits ni issues.&lt;/li&gt;
&lt;li&gt;Era una plataforma LLMOps de código abierto que unificaba gateway, observabilidad, evaluación, optimización y experimentación.&lt;/li&gt;
&lt;li&gt;Acumulaba 11.500 estrellas, 850 forks y 4.100 commits en su rama principal.&lt;/li&gt;
&lt;li&gt;Su gateway estaba escrito en Rust y prometía menos de 1 ms de latencia p99 a más de 10.000 consultas por segundo.&lt;/li&gt;
&lt;li&gt;Según su documentación, canalizaba cerca del 1% del gasto mundial en APIs de LLM, con clientes desde startups hasta empresas Fortune 10.&lt;/li&gt;
&lt;li&gt;La compañía levantó una ronda seed de 7,3 millones de dólares y tenía unos 18 meses de vida.&lt;/li&gt;
&lt;li&gt;GitHub no publicó motivo del archivado; el código sigue clonable bajo su licencia, pero el desarrollo abierto se detuvo.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;El cambio es técnico y, a la vez, contundente. Cuando una persona u organización archiva un repositorio en GitHub, este pasa a modo &lt;strong&gt;read-only&lt;/strong&gt;: nadie puede abrir issues, enviar pull requests, hacer push de nuevos commits ni modificar la configuración. El historial completo permanece visible y el código sigue siendo clonable, pero el proyecto deja de recibir mantenimiento activo desde su origen. En el caso de TensorZero, el aviso apareció fechado el 12 de junio de 2026 y, hasta el momento de escribir esta nota, sin una declaración pública que explique el porqué.&lt;/p&gt;

&lt;p&gt;La página del repositorio conserva todas las cifras que lo convirtieron en un caso de estudio: 11.500 estrellas, 850 forks y 4.100 commits. Para dimensionar el crecimiento, meses atrás había llegado a ser el repositorio número uno en tendencia de la semana a nivel global, saltando de alrededor de 3.000 a más de 9.700 estrellas en poco tiempo. Pasar de ese ritmo a un estado congelado es, justamente, lo que hace que el archivado llame la atención.&lt;/p&gt;

&lt;p&gt;Conviene ser claro y objetivo: &lt;strong&gt;archivar no es lo mismo que borrar&lt;/strong&gt;. El código de TensorZero no desapareció. Quien lo tenía en producción puede seguir clonándolo, ejecutándolo y hasta crear un fork para continuar el desarrollo por su cuenta, siempre dentro de los términos de su licencia. Lo que cambia es la garantía de futuro: ya no habrá parches de seguridad, correcciones de bugs ni nuevas funciones provenientes del equipo original a través de ese repositorio.&lt;/p&gt;

&lt;p&gt;El aviso de archivado deja el proyecto en modo solo lectura.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué es TensorZero y por qué importaba
&lt;/h2&gt;

&lt;p&gt;TensorZero se presentaba como una plataforma &lt;strong&gt;LLMOps&lt;/strong&gt; de código abierto. El término LLMOps es la versión para modelos de lenguaje de lo que MLOps fue para el machine learning clásico: el conjunto de herramientas y prácticas para llevar un modelo de un experimento en un cuaderno a un servicio confiable en producción. Donde MLOps se preocupaba por entrenar y desplegar modelos propios, LLMOps se enfoca en orquestar llamadas a modelos de terceros (OpenAI, Anthropic, Google) o autoalojados, medir su calidad y costo, y mejorarlos de forma sistemática.&lt;/p&gt;

&lt;p&gt;La propuesta de TensorZero era unificar cinco piezas que normalmente se resuelven con productos separados:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gateway&lt;/strong&gt; — un único punto de entrada para acceder a cualquier proveedor de LLM a través de una API unificada, con enrutamiento, reintentos, fallbacks y balanceo de carga.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observabilidad&lt;/strong&gt; — almacenar cada inferencia y su feedback (métricas, ediciones humanas) en tu propia base de datos, consultable desde una interfaz o de forma programática.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evaluación&lt;/strong&gt; — comparar inferencias individuales o flujos completos usando heurísticas y jueces basados en LLM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimización&lt;/strong&gt; — recolectar métricas y retroalimentación humana para mejorar prompts, modelos y estrategias de inferencia.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Experimentación&lt;/strong&gt; — pruebas A/B, enrutamiento y fallbacks integrados para desplegar cambios con confianza.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El argumento de venta que repetía la documentación de TensorZero era la &lt;strong&gt;adopción incremental&lt;/strong&gt;: podías tomar solo el gateway y dejar el resto, o sumar la observabilidad más adelante. Esa modularidad, junto con su compatibilidad con el SDK de OpenAI, OpenTelemetry y prácticamente todos los proveedores grandes, explicaba buena parte de su tracción entre equipos hispanos y de todo el mundo que querían evitar el lock-in con un único proveedor de modelos.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💭 Clave:&lt;/strong&gt; LLMOps no busca entrenar el modelo perfecto, sino convertir llamadas impredecibles a un LLM en un servicio medible, barato y reproducible. Ese es el problema que TensorZero atacaba.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;TensorZero era una empresa joven: rondaba los 18 meses de vida y había levantado una ronda seed de &lt;strong&gt;7,3 millones de dólares&lt;/strong&gt; para construir, en sus palabras, un stack de código abierto para aplicaciones de LLM de "grado industrial". Ese respaldo financiero y su crecimiento explosivo en GitHub la pusieron en el radar de medios tecnológicos y de la comunidad de desarrolladores.&lt;/p&gt;

&lt;p&gt;La pieza que más distinguía al proyecto era una decisión de ingeniería poco común en el ecosistema de IA, dominado por Python: el gateway estaba escrito en &lt;strong&gt;Rust&lt;/strong&gt;. La razón es de rendimiento. Un gateway se sienta en el camino crítico de cada llamada a un modelo, así que cualquier sobrecarga que agregue se paga en todas y cada una de las inferencias. TensorZero presumía menos de 1 ms de latencia p99 incluso a más de 10.000 consultas por segundo, un nivel que es difícil de sostener con runtimes de lenguajes de mayor abstracción y recolección de basura.&lt;/p&gt;

&lt;p&gt;El otro pilar era la compatibilidad. En lugar de imponer un SDK propio, TensorZero hablaba el protocolo de la API de OpenAI. En la práctica, eso significaba que un equipo podía colocarlo delante de su aplicación cambiando una sola línea —la &lt;code&gt;base_url&lt;/code&gt;— y empezar a enrutar hacia Anthropic, AWS Bedrock, Azure, Google Vertex AI, Mistral, Together, Groq, DeepSeek o cualquier endpoint compatible con OpenAI, como Ollama.&lt;/p&gt;

&lt;h2&gt;
  
  
  Datos y cifras
&lt;/h2&gt;

&lt;p&gt;Más allá del archivado, vale la pena fijar los números que definían a TensorZero, porque ayudan a entender por qué su congelamiento genera conversación:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;11.500 estrellas&lt;/strong&gt; y &lt;strong&gt;850 forks&lt;/strong&gt; en GitHub al momento del archivado.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;4.100 commits&lt;/strong&gt; en la rama principal, señal de un desarrollo intenso y sostenido.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&amp;lt;1 ms de latencia p99&lt;/strong&gt; de sobrecarga del gateway a &lt;strong&gt;10.000+ QPS&lt;/strong&gt;, según sus benchmarks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~1% del gasto global en APIs de LLM&lt;/strong&gt; canalizado a través de la plataforma, de acuerdo con su documentación.&lt;/li&gt;
&lt;li&gt;Clientes que iban desde &lt;strong&gt;startups de IA de frontera hasta empresas Fortune 10&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;7,3 millones de dólares&lt;/strong&gt; de financiación seed para una empresa de ~18 meses.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ese 1% del gasto mundial es la cifra más llamativa: aunque sea una estimación de la propia compañía y no un dato auditado por un tercero, sugiere que TensorZero no era un experimento de fin de semana, sino infraestructura que tocaba un volumen real de tráfico productivo.&lt;/p&gt;

&lt;p&gt;Un gateway unifica el acceso a varios proveedores de LLM.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo se usaba TensorZero
&lt;/h2&gt;

&lt;p&gt;Para entender qué pierden quienes lo adoptaron, conviene ver lo simple que era empezar. El despliegue base era un único contenedor de Docker. Estos son los comandos para levantarlo en las tres plataformas más comunes:&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 / macOS (terminal)&lt;/span&gt;
docker run &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:3000 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$OPENAI_API_KEY&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  tensorzero/gateway

&lt;span class="c"&gt;# Windows (PowerShell)&lt;/span&gt;
docker run &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:3000 &lt;span class="sb"&gt;`&lt;/span&gt;
  &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$env&lt;/span&gt;:OPENAI_API_KEY &lt;span class="sb"&gt;`&lt;/span&gt;
  tensorzero/gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con el gateway corriendo, el cambio en el código de la aplicación era mínimo. Cualquier cliente del SDK de OpenAI —Python, Node, Go— funcionaba apuntando la &lt;code&gt;base_url&lt;/code&gt; al gateway local:&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;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="c1"&gt;# Apuntar el cliente al gateway de TensorZero
&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:3000/openai/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;not-used&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="n"&gt;respuesta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="c1"&gt;# Llamar a cualquier proveedor a través del gateway
&lt;/span&gt;    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tensorzero::model_name::anthropic::claude-sonnet-4-6&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&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;role&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;user&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;content&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;Comparte un dato curioso sobre TensorZero.&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="p"&gt;],&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="n"&gt;respuesta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&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="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ese mismo gateway registraba la inferencia, su costo y su latencia, y permitía después reproducir llamadas históricas con un prompt o un modelo distinto para comparar resultados. El diagrama siguiente resume la arquitectura conceptual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dot"&gt;&lt;code&gt;&lt;span class="k"&gt;graph&lt;/span&gt; &lt;span class="nv"&gt;LR&lt;/span&gt;
  &lt;span class="nv"&gt;App&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Tu aplicacion (SDK OpenAI)"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;GW&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"TensorZero Gateway (Rust)"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nv"&gt;GW&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;P1&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"OpenAI"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nv"&gt;GW&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;P2&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Anthropic"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nv"&gt;GW&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;P3&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Bedrock / Vertex AI"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nv"&gt;GW&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Base de datos: inferencias y feedback"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nv"&gt;DB&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;UI&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"TensorZero UI"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Tip:&lt;/strong&gt; Si dependés de un proyecto de código abierto en producción, fijá (pin) una versión exacta y guardá una copia del repositorio. Un archivado no rompe lo que ya tenés desplegado, pero sí corta el flujo de actualizaciones futuras.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;El archivado de TensorZero deja varias lecturas para quienes construyen con LLMs en LATAM y en el resto del mundo hispano. La primera es práctica: si tu stack dependía de este gateway, hoy seguís funcionando, pero estás efectivamente sobre un artefacto congelado. Eso obliga a una decisión: mantener un fork propio, migrar a una alternativa o aceptar el riesgo de quedarte sin parches de seguridad.&lt;/p&gt;

&lt;p&gt;La segunda lectura es sobre el &lt;strong&gt;riesgo de cadena de suministro en infraestructura de IA&lt;/strong&gt;. La explosión de herramientas LLMOps en 2025 y 2026 hizo que muchos equipos adoptaran proyectos jóvenes, con un solo respaldo corporativo, en posiciones críticas de su arquitectura. Cuando ese respaldo cambia de rumbo —por una adquisición, un giro de producto o el cierre de una línea—, el proyecto puede congelarse de un día para otro. No es exclusivo de TensorZero; es un patrón estructural del ecosistema.&lt;/p&gt;

&lt;p&gt;La tercera es más matizada y favorable al código abierto: precisamente porque TensorZero era open source, su archivado no es un apagón. El historial de 4.100 commits, las crates de Rust, la interfaz y la documentación siguen disponibles. La comunidad tiene, al menos en teoría, todo lo necesario para tomar la posta con un fork si la demanda lo justifica. Es la diferencia exacta entre depender de un SaaS cerrado que se apaga y depender de un proyecto abierto que se congela.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Ojo:&lt;/strong&gt; Un repositorio archivado deja de recibir parches de seguridad. Si lo tenés expuesto en un gateway de producción, esa es la dimensión a vigilar primero, no las nuevas funciones.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Por ahora, la pregunta del millón —el porqué del archivado— no tiene respuesta pública. Las hipótesis razonables van desde una adquisición que mueva el desarrollo a un repositorio privado, hasta un cambio de licencia o de modelo de negocio que separe el núcleo abierto de una oferta comercial. Es importante remarcar que, hasta el momento de esta publicación, ninguna de esas hipótesis está confirmada: lo único verificable es el estado de solo lectura con fecha del 12 de junio de 2026.&lt;/p&gt;

&lt;p&gt;Para los equipos hispanos que evalúan su stack de LLMOps, el episodio es un buen recordatorio para auditar dependencias: identificar qué piezas son críticas, cuáles tienen un único mantenedor y qué plan de contingencia existe si una de ellas se congela. TensorZero seguirá funcionando para quien ya lo tiene, pero su historia abierta, por ahora, cierra capítulo.&lt;/p&gt;

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

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

&lt;h3&gt;
  
  
  ¿TensorZero dejó de funcionar?
&lt;/h3&gt;

&lt;p&gt;No. Archivar un repositorio en GitHub no borra el código ni apaga los servicios desplegados. TensorZero sigue siendo clonable y ejecutable; lo que se detuvo es el desarrollo activo, los nuevos commits, las issues y los pull requests a través de ese repositorio.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué significa que un repositorio esté archivado?
&lt;/h3&gt;

&lt;p&gt;Significa que pasa a modo de solo lectura. El historial y el código permanecen visibles, pero nadie puede modificar el repositorio: ni el equipo original ni la comunidad. Para seguir el desarrollo habría que crear un fork bajo los términos de la licencia del proyecto.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué TensorZero archivó su repositorio?
&lt;/h3&gt;

&lt;p&gt;No hay una explicación pública oficial al momento de escribir esta nota. El único dato verificable es la fecha del archivado, el 12 de junio de 2026. Cualquier motivo concreto —adquisición, cambio de licencia o de estrategia— sería especulación hasta que haya una declaración formal.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué es una plataforma LLMOps como TensorZero?
&lt;/h3&gt;

&lt;p&gt;Es el conjunto de herramientas para llevar aplicaciones basadas en modelos de lenguaje a producción: un gateway que unifica el acceso a varios proveedores, observabilidad para medir costos y calidad, evaluación, optimización de prompts y modelos, y experimentación con pruebas A/B.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué TensorZero usaba Rust en su gateway?
&lt;/h3&gt;

&lt;p&gt;Por rendimiento. El gateway está en el camino crítico de cada llamada a un modelo, así que su sobrecarga se paga en todas las inferencias. Rust permitía sostener menos de 1 ms de latencia p99 a más de 10.000 consultas por segundo sin recolección de basura que introdujera picos.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué alternativas existen si dependía de TensorZero?
&lt;/h3&gt;

&lt;p&gt;Las opciones son mantener un fork propio del proyecto, migrar a otro gateway o capa de observabilidad de LLM compatible con el SDK de OpenAI, o seguir usando la versión actual de forma controlada mientras se planifica la transición. La decisión depende de qué tan crítico sea el componente en tu arquitectura.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/tensorzero/tensorzero" rel="noopener noreferrer"&gt;GitHub — tensorzero/tensorzero&lt;/a&gt; — repositorio oficial, ahora archivado y de solo lectura.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.tensorzero.com/blog/tensorzero-raises-7-3m-seed-round-to-build-an-open-source-stack-for-industrial-grade-llm-applications/" rel="noopener noreferrer"&gt;TensorZero Blog&lt;/a&gt; — anuncio de la ronda seed de 7,3 millones de dólares.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://venturebeat.com/ai/tensorzero-nabs-7-3m-seed-to-solve-the-messy-world-of-enterprise-llm-development" rel="noopener noreferrer"&gt;VentureBeat&lt;/a&gt; — cobertura del financiamiento y el contexto del proyecto.&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>
  </channel>
</rss>
