<?xml version="1.0" encoding="UTF-8"?>

<!--|
    | Atom feed templated extracted from the Zola SSG builtin templates source code.
    | Modified to add support for a custom icon image.
    |
    | File copied at 2026-08-22, permalink:
    |   <https://github.com/getzola/zola/blob/5835ee8ea605ae7bc6a8dba28f032233a6c00b43/components/templates/src/builtins/atom.xml>.
    |
    | This file is licensed under the MIT Licence.
    | It is Copyright (c) 2026 Jorge Dobón Blanco, Vincent Prouillet
    | and contributors (see <https://github.com/getzola/zola/graphs/contributors>).
    |
    |-->

<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
    
    <icon>https://dobon.dev/processed_images/icon.ab5074eb75da7606.avif</icon>
    
    <title>
         
        Jorge Dobón Blanco
    </title>
    <subtitle>Sitio web personal sobre informática, arte, política y otros temas.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://dobon.dev/es/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://dobon.dev"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-08-15T00:00:00+00:00</updated>
    <id>https://dobon.dev/es/atom.xml</id>
    <entry xml:lang="es">
        <title>88x31</title>
        <published>2026-08-15T00:00:00+00:00</published>
        <updated>2026-08-15T00:00:00+00:00</updated>
        
        <author>
            <name>Jorge Dobón Blanco</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://dobon.dev/es/88x31/"/>
        <id>https://dobon.dev/es/88x31/</id>
        
        <content type="html" xml:base="https://dobon.dev/es/88x31/">&lt;p&gt;Quizá te haya llamado la atención la imagen abstracta &lt;a rel=&quot;external&quot; href=&quot;https://indieweb.org/88x31&quot;&gt;88x31&lt;/a&gt; de tonos verdosos que
se encuentra al pie de todas las páginas de este sitio web. Se trata de una
versión reducida del logotipo principal de &lt;a rel=&quot;external&quot; href=&quot;https://dobon.dev&quot;&gt;dobon.dev&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;pixel-art&quot;&gt;
&lt;figure&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #F2F4F8; background-color: #000000;&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;picture&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;source srcset=&amp;quot;https://dobon.dev/processed_images/me.d7909b6ed2f8f277.avif&amp;quot; type=&amp;quot;image/avif&amp;quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;source srcset=&amp;quot;https://dobon.dev/processed_images/me.74fcbc10b115f317.webp&amp;quot; type=&amp;quot;image/webp&amp;quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;!--|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        | If the picture is inside a figure, the `alt` information should be&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        | removed to avoid the screen reader reading the same text twice.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        | See also &amp;lt;https://stackoverflow.com/a/58468470&amp;gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        |--&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;lt;img&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            src=&amp;quot;https://dobon.dev/processed_images/me.a2dc909c1bde0ed8.jpg&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            loading=&amp;quot;lazy&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            width=&amp;quot;88&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            height=&amp;quot;31&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;/picture&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;figcaption&amp;gt;La imagen 88x31 representativa de este sitio web.&amp;lt;/figcaption&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;Dada la tradición de la &lt;a rel=&quot;external&quot; href=&quot;https://indieweb.org/IndieWeb&quot;&gt;IndieWeb&lt;/a&gt; sobre este tipo de imágenes, doy completo permiso
de que sea usada en otros sitios web como una forma de expresar apoyo o recomendación
hacia mi proyecto artístico.&lt;/p&gt;
&lt;p&gt;Ruego, por favor, que se evite realizar &lt;a rel=&quot;external&quot; href=&quot;https://es.wikipedia.org/wiki/Hotlinking&quot;&gt;hot-linking&lt;/a&gt; sobre la imagen;
descargue una copia de la misma al alojamiento de su página personal y
enlace dicha copia.&lt;/p&gt;
&lt;p&gt;Dada la baja resolución de estas imágenes, y el uso sobre las mismas de técnicas &lt;a rel=&quot;external&quot; href=&quot;https://es.wikipedia.org/wiki/Pixel_art&quot;&gt;pixel art&lt;/a&gt;,
recomiendo aplicar las siguientes propiedades CSS sobre toda imagen &lt;a rel=&quot;external&quot; href=&quot;https://indieweb.org/88x31&quot;&gt;88x31&lt;/a&gt;:&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #F2F4F8; background-color: #000000;&quot; &gt;&lt;code data-lang=&quot;css&quot; data-name=&quot;style.css&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;.pixel-art {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #08BDBA;&quot;&gt;    image-rendering&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #08BDBA;&quot;&gt; auto&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #08BDBA;&quot;&gt;    image-rendering&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #08BDBA;&quot;&gt; crisp-edges&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #08BDBA;&quot;&gt;    image-rendering&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: #08BDBA;&quot;&gt; pixelated&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Favoritos</title>
        <published>2026-08-14T00:00:00+00:00</published>
        <updated>2026-08-15T00:00:00+00:00</updated>
        
        <author>
            <name>Jorge Dobón Blanco</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://dobon.dev/es/favs/"/>
        <id>https://dobon.dev/es/favs/</id>
        
        <content type="html" xml:base="https://dobon.dev/es/favs/">&lt;p&gt;&lt;em&gt;Inspirado en la página &lt;a rel=&quot;external&quot; href=&quot;https://vlad.website/recommendations&quot;&gt;&lt;em&gt;Recommendations&lt;/em&gt;&lt;/a&gt; de
&lt;a rel=&quot;external&quot; href=&quot;https://vlad.website&quot;&gt;Vlad-Stefan Harbuz&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;directorio-web&quot;&gt;Directorio web&lt;/h2&gt;
&lt;p&gt;Listar todas las páginas web que frecuento sería tarea imposible;
no busco que esta lista sea exhaustiva, tomalá como una serie de recomendaciones:&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Sitio&lt;/th&gt;&lt;th&gt;Fuentes&lt;/th&gt;&lt;th&gt;Descripción&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://xeiaso.net&quot;&gt;Xe Iaso&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://xeiaso.net/blog.rss&quot;&gt;RSS&lt;/a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https://xeiaso.net/blog.json&quot;&gt;JSON Feed&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Sitio web personal con publicaciones sobre tecnología, principlamente sobre gestión de infraestructura.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://unsung.aresluna.org&quot;&gt;Unsung&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://unsung.aresluna.org/feed.xml&quot;&gt;Atom&lt;/a&gt;&lt;/td&gt;&lt;td&gt;El blog sobre tecnología de &lt;a rel=&quot;external&quot; href=&quot;https://aresluna.org&quot;&gt;Marcin Wichary&lt;/a&gt;, numerosos escritos sobre &lt;em&gt;UI/UX&lt;/em&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://lobste.rs&quot;&gt;lobste.rs&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Agregador de enlaces comunitario.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://www.aprilcools.club&quot;&gt;April Cools&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Iniciativa para hacer del 1 de abril un día más interesante en la &lt;a rel=&quot;external&quot; href=&quot;https://indieweb.org/IndieWe&quot;&gt;IndieWeb&lt;/a&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://vlad.website&quot;&gt;Vlad-Stefan Harbuz&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://vlad.website/index.xml&quot;&gt;RSS&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Sitio web personal sobre filosofía y &lt;em&gt;Open Source&lt;/em&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://xxiivv.com&quot;&gt;xxiivv&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://wiki.xxiivv.com/links/log.xml&quot;&gt;RSS (Entradas)&lt;/a&gt; &lt;a rel=&quot;external&quot; href=&quot;https://wiki.xxiivv.com/links/img.xml&quot;&gt;RSS (Imágenes)&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;em&gt;Wiki&lt;/em&gt; personal de Devine Lu Linvega, artista y programador.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://kokorobot.ca&quot;&gt;kokorobot&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://kokorobot.ca/links/rss.xml&quot;&gt;RSS&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Sitio web personal de Rek Bellum, artista e ilustradora.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://100r.ca&quot;&gt;Hundred Rabbits&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://100r.ca/links/rss.xml&quot;&gt;RSS&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Proyecto artístico y de vida de Devine Lu Livega y Rek Bellum.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://michael.stapelberg.ch&quot;&gt;Michael Stapelberg&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://michael.stapelberg.ch/feed.xml&quot;&gt;Atom&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Sitio web personal con publicación sobre diversos temas de la informática, por un ex-&lt;em&gt;maintainer&lt;/em&gt; de Debian.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://faultlore.com&quot;&gt;Faultlore&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://faultlore.com/blah/rss.xml&quot;&gt;RSS&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Sitio y &lt;em&gt;blog&lt;/em&gt; personal de Aria Desires, multitud de artículos sobre informática a bajo nivel.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://rknight.me&quot;&gt;Robb Knight&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://rknight.me/subscribe&quot;&gt;Atom, RSS y JSON Feed&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;em&gt;Blog&lt;/em&gt; personal con artículos sobre informática y otros temas varios.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;a rel=&quot;external&quot; href=&quot;https://ooni.org&quot;&gt;OONI&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Organización que busca documentar y registrar casos de censura de Internet por instituciones, recomiendo encarecidamente &lt;a rel=&quot;external&quot; href=&quot;https://ooni.org/get-involved/&quot;&gt;apoyarles&lt;/a&gt;.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;musica&quot;&gt;Música&lt;/h2&gt;
&lt;p&gt;Soy amante de muchos géneros de música, escuchando todo lo que se asemeje
al hip-hop, al rock, al rap o al jazz.
Tengo un &lt;a rel=&quot;external&quot; href=&quot;https://last.fm/jdobonb&quot;&gt;perfil de Last.fm&lt;/a&gt; donde aparece y se actualiza
la música que escucho día a día.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;There&#39;s only one beer left...&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;miscelanea&quot;&gt;Miscelánea&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Mi color favorito es el &lt;span style=&quot;color: red;&quot;&gt;rojo&lt;/span&gt;.&lt;/li&gt;
&lt;li&gt;Mi caracter Unicode preferido es el &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/Angzarr&quot;&gt;Angzarr &lt;code&gt;⍼&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Libro de visitas</title>
        <published>2026-08-14T00:00:00+00:00</published>
        <updated>2026-08-14T00:00:00+00:00</updated>
        
        <author>
            <name>Jorge Dobón Blanco</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://dobon.dev/es/guestbook/"/>
        <id>https://dobon.dev/es/guestbook/</id>
        
        <content type="html" xml:base="https://dobon.dev/es/guestbook/">&lt;p&gt;En esta página, vosotros, los lectores de este sitio web, podéis dejar mensajes
al mundo. Para dejar un mensaje, manda un correo electrónico a &lt;a href=&quot;mailto:guestbook@dobon.dev&quot;&gt;guestbook@dobon.dev&lt;/a&gt;
con su nombre, el cuerpo del mensaje y opcionalmente un enlace a su sitio web.&lt;/p&gt;
&lt;p&gt;Se permiten los siguientes formatos:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Texto plano.&lt;/li&gt;
&lt;li&gt;Markdown &lt;a rel=&quot;external&quot; href=&quot;https://commonmark.org/&quot;&gt;CommonMark&lt;/a&gt; (se permite híbrido con HTML).&lt;/li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https://es.wikipedia.org/wiki/HTML&quot;&gt;HTML&lt;/a&gt; (siempre que no sea molesto o malicioso).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Para aparecer como un lector anónimo indíquelo explícitamente.&lt;/em&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Fuentes</title>
        <published>2026-08-12T00:00:00+00:00</published>
        <updated>2026-08-15T00:00:00+00:00</updated>
        
        <author>
            <name>Jorge Dobón Blanco</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://dobon.dev/es/feeds/"/>
        <id>https://dobon.dev/es/feeds/</id>
        
        <content type="html" xml:base="https://dobon.dev/es/feeds/">&lt;p&gt;Las siguientes &lt;a rel=&quot;external&quot; href=&quot;https://es.wikipedia.org/wiki/Atom_(formato_de_redifusi%C3%B3n)&quot;&gt;fuentes Atom&lt;/a&gt; se encuentran disponibles
para estar al tanto de nuevas publicaciones o actualizaciones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/es/atom.xml&quot;&gt;Fuente global&lt;/a&gt;: Lista todo aquello publicado o actualizado en el sitio web.
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;/es/articles/atom.xml&quot;&gt;Fuente de artículos&lt;/a&gt;: Nuevos &lt;a href=&quot;/es/articles&quot;&gt;artículos&lt;/a&gt; o actualizaciones de estos.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/es/notes/atom.xml&quot;&gt;Fuente de notas&lt;/a&gt;: Nuevas &lt;a href=&quot;/es/notes&quot;&gt;notas&lt;/a&gt; o actualizaciones de estos.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Explorando los arrays paginados</title>
        <published>2026-08-10T00:00:00+00:00</published>
        <updated>2026-08-14T00:00:00+00:00</updated>
        
        <author>
            <name>Jorge Dobón Blanco</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://dobon.dev/es/notes/exploring-paginated-arrays/"/>
        <id>https://dobon.dev/es/notes/exploring-paginated-arrays/</id>
        
        <content type="html" xml:base="https://dobon.dev/es/notes/exploring-paginated-arrays/">&lt;p&gt;&lt;em&gt;A lo largo de este texto se trabaja únicamente con números con signo,&lt;/em&gt;
&lt;em&gt;esto es debido a que uno de mis requisitos personales es que mis librerías&lt;/em&gt;
&lt;em&gt;sea compatible con &lt;a rel=&quot;external&quot; href=&quot;https://learn.microsoft.com/es-es/dotnet/standard/language-independence&quot;&gt;el acuerdo de independencia CLS&lt;/a&gt; descrito en&lt;/em&gt;
&lt;em&gt;el estándar &lt;a rel=&quot;external&quot; href=&quot;https://ecma-international.org/publications-and-standards/standards/ecma-335/&quot;&gt;ECMA-335 CLI&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Recientemente, me encontraba trabajando un proyecto personal desarrollado en C#
que por diversas razones, y con el afán de experimentar un poco, necesitaba
de un &lt;em&gt;array&lt;/em&gt; que pudiera tomar como índice un entero &lt;code&gt;long&lt;/code&gt;, es decir,
con 64 bits de indexación.&lt;/p&gt;
&lt;p&gt;El entorno de ejecución .NET solo soporta nativamente &lt;em&gt;arrays&lt;/em&gt; con enteros &lt;code&gt;int&lt;/code&gt;,
32 bits, como índices. Esto no solo se trata de una limitación de su librería
estándar sino de su propio &lt;a rel=&quot;external&quot; href=&quot;https://es.wikipedia.org/wiki/Recolector_de_basura&quot;&gt;recolector de basura (&lt;em&gt;GC&lt;/em&gt;)&lt;/a&gt;; a menos que se active
una configuración en concreto, los objetos se encuentran limitados a 2 GiB.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Elemento &lt;code&gt;&amp;lt;gcAllowVeryLargeObjects&amp;gt;&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;En plataformas de 64 bits, habilita matrices que tienen un tamaño total
de más de 2 gigabytes (GB).&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #F2F4F8; background-color: #000000;&quot; &gt;&lt;code data-lang=&quot;xml&quot; data-name=&quot;Company.Project.csproj&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt;gcAllowVeryLargeObjects&lt;/span&gt;&lt;span&gt; enabled=&lt;/span&gt;&lt;span style=&quot;color: #BE95FF;&quot;&gt;&amp;quot;true|false&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;— Microsoft Learn (&lt;a rel=&quot;external&quot; href=&quot;https://learn.microsoft.com/es-es/dotnet/framework/configure-apps/file-schema/runtime/gcallowverylargeobjects-element&quot;&gt;fuente&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;En todo caso, crear un &lt;em&gt;array&lt;/em&gt; de tal tamaño tampoco sería ideal, pues supondría
la aparición grandes monolíticos bloques de memoria manejada que serían problemáticos
para el &lt;em&gt;GC&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;arrays-paginados&quot;&gt;&lt;em&gt;Arrays&lt;/em&gt; paginados&lt;/h2&gt;
&lt;p&gt;Decidí acudir a un recurso que solventaría los problemas de memoria y que,
en mi cabeza, también me permitiría tener una indexación de 64 bits, los &lt;em&gt;arrays&lt;/em&gt;
paginados.&lt;/p&gt;
&lt;p&gt;Un &lt;em&gt;array&lt;/em&gt; paginado se trata de una estructura de datos en la que los elementos
se almacenan en &lt;em&gt;arrays&lt;/em&gt; de tamaño fijo denominados páginas. Mi teoría consistía
en que con la suficiente cantidad de páginas podría simular una indexación
de 64 bits.&lt;/p&gt;
&lt;p&gt;Mi implementación consistía en una &lt;em&gt;sparse list&lt;/em&gt;, una estructura de datos que permite
el acceso a índices discontinuos introduciendo punteros nulos en aquellas páginas
completamente vacías.&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #F2F4F8; background-color: #000000;&quot; &gt;&lt;code data-lang=&quot;csharp&quot; data-name=&quot;SparseList.cs&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;font-style: italic;&quot;&gt;namespace&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; Redacted&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt;Collections&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt; 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: #33B1FF;&quot;&gt;internal&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;font-style: italic;&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; SparseList&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt;T&lt;/span&gt;&lt;span&gt;&amp;gt;(&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; pageSize&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; T tombstone&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; = default!&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt; 4&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt; 5&lt;/span&gt;&lt;span style=&quot;color: #33B1FF;&quot;&gt;    public&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; T&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; this&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt;long&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; index&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt; 6&lt;/span&gt;&lt;span&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt; 7&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;font-style: italic;&quot;&gt;        get&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #FF7EB6;font-weight: bold;&quot;&gt; Get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;index&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt; 8&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;font-style: italic;&quot;&gt;        set&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #FF7EB6;font-weight: bold;&quot;&gt; Set&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;index&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; value&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt; 9&lt;/span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;10&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;11&lt;/span&gt;&lt;span style=&quot;color: #33B1FF;&quot;&gt;    private readonly&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; List&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt;SparseListPage&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt;T&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt;?&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; _pages&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; =&lt;/span&gt;&lt;span&gt; [];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;12&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;13&lt;/span&gt;&lt;span style=&quot;color: #33B1FF;&quot;&gt;    private&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; T&lt;/span&gt;&lt;span style=&quot;color: #FF7EB6;font-weight: bold;&quot;&gt; Get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt;long&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; index&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;14&lt;/span&gt;&lt;span&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;15&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;font-style: italic;&quot;&gt;        var&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt;pageIndex&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; elementIndex&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #FF7EB6;font-weight: bold;&quot;&gt; GetIndices&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;index&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;16&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt;        if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;pageIndex&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; &amp;gt;=&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; _pages&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;Count&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt; return&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; tombstone&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;17&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;18&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;font-style: italic;&quot;&gt;        var&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; page&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; _pages&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;pageIndex&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;19&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt;        if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;page&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; ==&lt;/span&gt;&lt;span style=&quot;color: #82CFFF;&quot;&gt; null&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt; return&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; tombstone&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;20&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;21&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; _pages&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;pageIndex&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt;!&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;elementIndex&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;22&lt;/span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;23&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;24&lt;/span&gt;&lt;span style=&quot;color: #33B1FF;&quot;&gt;    private&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt; void&lt;/span&gt;&lt;span style=&quot;color: #FF7EB6;font-weight: bold;&quot;&gt; Set&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt;long&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; index&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; T value&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;25&lt;/span&gt;&lt;span&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;26&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;font-style: italic;&quot;&gt;        var&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt;pageIndex&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; elementIndex&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #FF7EB6;font-weight: bold;&quot;&gt; GetIndices&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;index&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;27&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;font-style: italic;&quot;&gt;        var&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; isValueTombstone&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #FF7EB6;font-weight: bold;&quot;&gt; Equals&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; tombstone&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;28&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;29&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;font-style: italic;&quot;&gt;        var&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; missingPages&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; =&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;pageIndex&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color: #82CFFF;&quot;&gt; 1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; _pages&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;Count&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt;        if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;missingPages&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #82CFFF;&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; isValueTombstone&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt; return&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;31&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;32&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt;        for&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;font-style: italic;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; i&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #82CFFF;&quot;&gt; 0&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; i&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; missingPages&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; i&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt;++&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;33&lt;/span&gt;&lt;span&gt;        {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;34&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;            _pages&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: #FF7EB6;font-weight: bold;&quot;&gt;Add&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #82CFFF;&quot;&gt;null&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;35&lt;/span&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;36&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;37&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;        _pages&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;pageIndex&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; ??= new&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; SparseListPage&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt;T&lt;/span&gt;&lt;span&gt;&amp;gt;(&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;pageSize&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; tombstone&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;38&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;font-style: italic;&quot;&gt;        var&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; page&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; _pages&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;pageIndex&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt;!&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;39&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;40&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt;        if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;page&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;Count&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; ==&lt;/span&gt;&lt;span style=&quot;color: #82CFFF;&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; isValueTombstone&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;41&lt;/span&gt;&lt;span&gt;        {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;42&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;            _pages&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;pageIndex&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #82CFFF;&quot;&gt; null&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;43&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt;            return&lt;/span&gt;&lt;span&gt;;   &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;44&lt;/span&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;45&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;46&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;        page&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;elementIndex&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; value&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;47&lt;/span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;48&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;49&lt;/span&gt;&lt;span style=&quot;color: #33B1FF;&quot;&gt;    private&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; pageIndex&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; elementIndex&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: #FF7EB6;font-weight: bold;&quot;&gt; GetIndices&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt;long&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; index&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;50&lt;/span&gt;&lt;span&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;51&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt;        return&lt;/span&gt;&lt;span&gt; ((&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt;int&lt;/span&gt;&lt;span&gt;)(&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;index&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; /&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; pageSize&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt;,&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt;int&lt;/span&gt;&lt;span&gt;)(&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;index&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; %&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; pageSize&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;52&lt;/span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;53&lt;/span&gt;&lt;span&gt;}⏎&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo&quot; style=&quot;color: #F2F4F8; background-color: #000000;&quot; &gt;&lt;code data-lang=&quot;csharp&quot; data-name=&quot;SparseListPage.cs&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;font-style: italic;&quot;&gt;namespace&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; Redacted&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt;Collections&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt; 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color: #33B1FF;&quot;&gt;internal&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;font-style: italic;&quot;&gt; class&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; SparseListPage&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt;T&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt; 4&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt; 5&lt;/span&gt;&lt;span style=&quot;color: #33B1FF;&quot;&gt;    public&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; Size&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; _size&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt; 6&lt;/span&gt;&lt;span style=&quot;color: #33B1FF;&quot;&gt;    public&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; Count&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt; 7&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt; 8&lt;/span&gt;&lt;span style=&quot;color: #33B1FF;&quot;&gt;    public&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; T&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; this&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; index&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt; 9&lt;/span&gt;&lt;span&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;font-style: italic;&quot;&gt;        get&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; =&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; _data&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;index&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;11&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;font-style: italic;&quot;&gt;        set&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;12&lt;/span&gt;&lt;span&gt;        {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;13&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;font-style: italic;&quot;&gt;            var&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; isNewValueTombstone&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #FF7EB6;font-weight: bold;&quot;&gt; Equals&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;value&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; _tombstone&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;font-style: italic;&quot;&gt;            var&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; isStoredValueTombstone&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #FF7EB6;font-weight: bold;&quot;&gt; Equals&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;_data&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;index&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; _tombstone&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;15&lt;/span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;16&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt;            if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;isNewValueTombstone&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; isStoredValueTombstone&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;17&lt;/span&gt;&lt;span&gt;            {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;18&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;                Count&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt;++&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;19&lt;/span&gt;&lt;span&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;20&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt;            else if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;isNewValueTombstone&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; &amp;amp;&amp;amp; !&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;isStoredValueTombstone&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;21&lt;/span&gt;&lt;span&gt;            {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;22&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;                Count&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt;--&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;23&lt;/span&gt;&lt;span&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;24&lt;/span&gt;&lt;span&gt;            &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;25&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;            _data&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;index&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; value&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;26&lt;/span&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;27&lt;/span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;28&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;29&lt;/span&gt;&lt;span style=&quot;color: #33B1FF;&quot;&gt;    private readonly&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; _size&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;30&lt;/span&gt;&lt;span style=&quot;color: #33B1FF;&quot;&gt;    private readonly&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; T _tombstone&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;31&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;32&lt;/span&gt;&lt;span style=&quot;color: #33B1FF;&quot;&gt;    private readonly&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; T&lt;/span&gt;&lt;span&gt;[]&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; _data&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;33&lt;/span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;34&lt;/span&gt;&lt;span style=&quot;color: #33B1FF;&quot;&gt;    public&lt;/span&gt;&lt;span style=&quot;color: #FF7EB6;font-weight: bold;&quot;&gt; SparseListPage&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #78A9FF;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; size&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; T tombstone&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; = default!&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;35&lt;/span&gt;&lt;span&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;36&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;        _size&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; size&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;37&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;        _tombstone&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; tombstone&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;38&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;39&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;        _data&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt; = new&lt;/span&gt;&lt;span style=&quot;color: #DDE1E6;&quot;&gt; T&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;size&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;40&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;        Array&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style=&quot;color: #FF7EB6;font-weight: bold;&quot;&gt;Fill&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt;_data&lt;/span&gt;&lt;span style=&quot;color: #3DDBD9;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #FFFFFF;&quot;&gt; _tombstone&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;41&lt;/span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot; style=&quot;color: #393939;&quot;&gt;42&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Con mi implementación funcionando y respondiendo correctamente a mis tests unitarios
me dispuse a llevar estas estructuras al mundo real. Le dedico unas horas a mi proyecto,
ejecuto &lt;code&gt;dotnet run&lt;/code&gt; en la terminal y...&lt;/p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #F2F4F8; background-color: #000000;&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Unhandled exception. System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. (Parameter &amp;#39;index&amp;#39;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   at System.Collections.Generic.List`1.get_Item(Int32 index)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   at Redacted.Collections.SparseSet.SparseList`1.Get(Int64 index) in [...]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   at Redacted.Collections.SparseSet.SparseList`1.get_Item(Int64 index) in [...]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;En ese momento me sorprendió, resulta que al intentar usar el índice más alto posible,
&lt;code&gt;long.MaxValue&lt;/code&gt;, es decir, con el número 9.223.372.036.854.775.807, el método &lt;code&gt;GetIndices()&lt;/code&gt;
devuelve el valor -1 como índice de página.&lt;/p&gt;
&lt;p&gt;Esto es debído a que la operación &lt;code&gt;index / pageSize&lt;/code&gt; no garantiza que sea
un valor menor o igual a &lt;code&gt;int.maxValue&lt;/code&gt;, es decir, el número 2.147.483.648.
Esto tiene sentido, no es difícil ver que toda operación &lt;code&gt;long / int&lt;/code&gt; no garantiza
esto.&lt;/p&gt;
&lt;h2 id=&quot;justificacion&quot;&gt;Justificación&lt;/h2&gt;
&lt;p&gt;La razón, que rompe cualquier posibilidad de que mi teoría fuese cierta,
es sencilla.&lt;/p&gt;
&lt;p&gt;Un &lt;em&gt;array&lt;/em&gt; con índices de 32 bits puede almacenar hasta $ 2^{31} $ elementos, esto
implica que cada página puede almacenar dicha cantidad; y dado que los punteros
hacia las páginas también se almacenan en un &lt;em&gt;array&lt;/em&gt;, puede haber hasta $ 2^{31} $ páginas.&lt;/p&gt;
&lt;p&gt;Es significa que puede haber hasta $ 2^{31} * 2^{31} = 2^{31 + 31} = 2^{62} $ elementos
en total en un &lt;em&gt;array&lt;/em&gt; paginado, pero un &lt;em&gt;array&lt;/em&gt; con índices de 64 bits puede
acumular hasta $ 2^{63} $ elementos. Hay $ 2^{63} - 2^{62} $ elementos inaccesibles,
es decir, los últimos $ 4.611.686.018.427.387.904 $ índices del &lt;em&gt;array&lt;/em&gt; no son
&lt;em&gt;indexables&lt;/em&gt;.&lt;/p&gt;
&lt;h3 id=&quot;y-si-quitaramos-el-signo&quot;&gt;¿Y si quitáramos el signo?&lt;/h3&gt;
&lt;p&gt;Si nos encontrásemos con un lenguaje que permitiese índices de 32 bits sin signo,
se podrían almacenar hasta $ 2^{32} $ elementos; con el mismo razonamiento de antes,
podríamos tener hasta $ 2^{32} $ páginas.&lt;/p&gt;
&lt;p&gt;Esto nos permitiría llegar hasta los $ 2^{32} * 2^{32} = 2^{32 + 32} = 2^{64} $ elementos
en total al dar uso de un &lt;em&gt;array&lt;/em&gt; paginado. Es interesante que en este lenguaje
hipotético, un &lt;em&gt;array&lt;/em&gt; paginado no solo podría almacenar todos los elementos
de un &lt;em&gt;array&lt;/em&gt; de índices &lt;strong&gt;con signo&lt;/strong&gt; de 64 bits ($ 2^{63} $ elementos) si no también
de un &lt;em&gt;array&lt;/em&gt; de índices &lt;strong&gt;sin signo&lt;/strong&gt; de 64 bits ($ 2^{64} $ elementos).&lt;/p&gt;
&lt;h3 id=&quot;demostracion&quot;&gt;Demostración&lt;/h3&gt;
&lt;p&gt;Vistos los resultados anteriores es natural que surja interés de en hallar una
demostración matemática:&lt;/p&gt;
&lt;p&gt;Planteamos $ a \gt b$, donde $ a \in \mathbb{N^+} $ es el número de bits de
los índices del &lt;em&gt;array&lt;/em&gt; que queremos replicar, y $ b \in \mathbb{N^+} $ el número de
bits de los índices de los &lt;em&gt;arrays&lt;/em&gt; que  conforman nuestro &lt;em&gt;array&lt;/em&gt; paginado (&lt;em&gt;la réplica&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Para que la réplica sea válida todos los elementos del &lt;em&gt;array&lt;/em&gt; original deben
poder ser introducidos en la réplica:&lt;/p&gt;
&lt;p&gt;$$ 2^a = 2^b * 2^b \implies 2^a = 2^{b + b} \implies a = 2b \implies a / 2 = b$$&lt;/p&gt;
&lt;p&gt;Y dado que nos encontramos trabajando con aritmética entera,
la expresión $ a / 2 $ solo existe si $ a \bmod 2 = 0 $;
dicho de otro modo, &lt;em&gt;$ a $ debe ser un número par $ \blacksquare $&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;alternativas&quot;&gt;Alternativas&lt;/h2&gt;
&lt;p&gt;Dudo que existan alternativas para cubrir este concreto caso, la mayoría de sistemas
donde puede surgir una necesidad así son capaces usar índices de 64 bits.
Este intento mio ha resultado ser poco más que un curioso experimento que quería compartir.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Aventuras con SSGs</title>
        <published>2026-08-09T00:00:00+00:00</published>
        <updated>2026-08-09T00:00:00+00:00</updated>
        
        <author>
            <name>Jorge Dobón Blanco</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://dobon.dev/es/articles/ssg-adventures/"/>
        <id>https://dobon.dev/es/articles/ssg-adventures/</id>
        
        <content type="html" xml:base="https://dobon.dev/es/articles/ssg-adventures/">&lt;p&gt;Es ley que todo usuario de la &lt;a rel=&quot;external&quot; href=&quot;https://indieweb.org/IndieWeb&quot;&gt;IndieWeb&lt;/a&gt; tenga como primera publicación un texto
explicando sus primeras desventuras creando y desplegando su página web personal.&lt;/p&gt;
&lt;p&gt;Mi caso no es una excepción, originalmente intenté dar vida a mi página, primero
creando mi propio SSG (&lt;em&gt;Static Site Generator&lt;/em&gt;), &lt;a rel=&quot;external&quot; href=&quot;https://codeberg.org/jdobonb/amiga&quot;&gt;del que aún quedan resquicios&lt;/a&gt;.
Poco después me di cuenta de la complejidad que esta tarea tenía, y con
la universidad aun consumiendo mucho de mi tiempo decidí dejar este proyecto
aparcado un tiempo.&lt;/p&gt;
&lt;p&gt;Quiero con este artículo hacer una prueba de contacto a la escritura y formato
propios de un &lt;em&gt;blog&lt;/em&gt;, y comentar el proceso creativo y de diseño que han llevado
al &lt;em&gt;stack&lt;/em&gt; de tecnologías actuales de &lt;a href=&quot;/es&quot;&gt;dobon.dev&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id=&quot;y-al-principio-estaba-lobste-rs&quot;&gt;Y al principio estaba &lt;a rel=&quot;external&quot; href=&quot;https://lobste.rs&quot;&gt;lobste.rs&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Mi interés por tener mi propio espacio digital viene de tiempo atrás. De forma
accidental, buscando resolver las distintas dudas que me surgían en mi viaje autodidacta
en el mundo de la informática, encontraba textos que me parecían de un gran interés
y aprendizaje, pues en muchos casos me abrían las puertas a conceptos completamente nuevos.&lt;/p&gt;
&lt;p&gt;Las explicaciones de &lt;a rel=&quot;external&quot; href=&quot;https://michael.stapelberg.ch&quot;&gt;Michael Stapelberg&lt;/a&gt; sobre su gestor de paquetes experimental
&lt;a rel=&quot;external&quot; href=&quot;https://michael.stapelberg.ch/posts/2019-08-17-introducing-distri/&quot;&gt;d1stri&lt;/a&gt;, las detalladas explicaciones de &lt;a rel=&quot;external&quot; href=&quot;https://xeiaso.net&quot;&gt;Xe Iaso&lt;/a&gt; sobre
&lt;a rel=&quot;external&quot; href=&quot;https://xeiaso.net/blog/paranoid-nixos-2021-07-18/&quot;&gt;su paranoica configuración de NixOS&lt;/a&gt; o el &lt;em&gt;rant&lt;/em&gt; de &lt;a rel=&quot;external&quot; href=&quot;https://faultlore.com&quot;&gt;Aria Desires&lt;/a&gt;
sobre &lt;a rel=&quot;external&quot; href=&quot;https://faultlore.com/blah/c-isnt-a-language/&quot;&gt;la situación actual de los &lt;em&gt;ABIs&lt;/em&gt; basados en C&lt;/a&gt; eran pequeñas
ventanas hacia todo aquello de mi gremio que no conocía.&lt;/p&gt;
&lt;p&gt;Fue con ello natural que de mí surgiera el deseo de escribir y compartir mis
opiniones y descubrimientos, que se mantuvo latente pero constante a lo largo
de los años. Al llegar a la universidad y hablar con mis semejantes, me di cuenta
de que quizá había infravalorado tanto mi capacidad de enseñar y mostrar a
otros mis descubrimientos, como del placer que me es hacerlo.&lt;/p&gt;
&lt;p&gt;Pasado el primer cuatrimestre, algo más asentado en la vida universitaria,
tomé la decisión de dedicar mis escasos momentos libres a la construcción
de mi propia página web. Durante ese periodo, en mi rutinaria lectura de &lt;a rel=&quot;external&quot; href=&quot;https://lobste.rs&quot;&gt;lobste.rs&lt;/a&gt;,
me encontré una nueva entrada, clara y directa:
&lt;a rel=&quot;external&quot; href=&quot;https://arne.me/blog/write-your-own-ssg&quot;&gt;&lt;em&gt;Why You Should Write Your Own Static Site Generator&lt;/em&gt;&lt;/a&gt;
(&lt;a rel=&quot;external&quot; href=&quot;https://lobste.rs/s/5hf7qf/why_you_should_write_your_own_static_site&quot;&gt;entrada en lobste.rs&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Con ello, motivado por este artículo, abrí RustRover con la intención de crear
un &lt;em&gt;SSG&lt;/em&gt; que cumpliese una breve y humilde lista de características:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Renderizado incremental.&lt;/li&gt;
&lt;li&gt;Renderizado basado en plantillas HTML.&lt;/li&gt;
&lt;li&gt;Soporte multiidioma.&lt;/li&gt;
&lt;li&gt;Generación de fuentes Atom.&lt;/li&gt;
&lt;li&gt;Optimización de imágenes AVIF y generación de &lt;em&gt;fallbacks&lt;/em&gt; WEBP y JPEG.&lt;/li&gt;
&lt;li&gt;Recarga en caliente (&lt;em&gt;Hot reloading&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Sistema de taxonomías.&lt;/li&gt;
&lt;li&gt;Soporte de comentarios con &lt;a rel=&quot;external&quot; href=&quot;https://en.wikipedia.org/wiki/Webmention&quot;&gt;Webmention&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Minificación&lt;/em&gt; de HTML, CSS y JS.&lt;/li&gt;
&lt;li&gt;Sindicalización &lt;a rel=&quot;external&quot; href=&quot;https://indieweb.org/POSSE&quot;&gt;POSSE&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Espero que se haya hecho notar la ironía... Visto en retrospectiva mi error
está claro, la complejidad del sistema que yo necesitaba era demasiado alta.
El desarrollo fue rápidamente cuesta arriba por un segundo cuatrimestre que
ya estaba funcionando a todo rendimiento y una serie de restricciones
autoimpuestas, quería que fuese un &lt;em&gt;SSG&lt;/em&gt; generalista en toda regla,
y no un &lt;a rel=&quot;external&quot; href=&quot;https://hannahilea.com/blog/houseplant-programming/&quot;&gt;programa de planta de interior&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Todo esto llevo a que el proyecto acabara de forma prematura, insatisfecho con
lo que había logrado hacer. Creo que hubo unos puntos clave que dificultaron
mucho la tarea:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Menosprecie la dificultad de crear una caché funcional y la poca necesidad de
renderizado incremental en la mayoría de &lt;em&gt;SSGs&lt;/em&gt;, dada la velocidad de renderizado
que pueden llegar a alcanzar.&lt;/li&gt;
&lt;li&gt;La conversión entre formatos de imagen resulto ser más compleja que añadir
una librería adicional y una llamada extra a una función,
&lt;a rel=&quot;external&quot; href=&quot;https://imagemagick.org&quot;&gt;ImageMagick&lt;/a&gt; tiene una API de una complejidad elevada.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En pocas palabras:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hay solo dos cosas difíciles en la informática: la invalidación de caché y
nombrar cosas.&lt;/p&gt;
&lt;p&gt;— Phil Karlton (Traducido, &lt;a rel=&quot;external&quot; href=&quot;https://www.karlton.org/2017/12/naming-things-hard/&quot;&gt;fuente&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;hugo-me-marea&quot;&gt;Hugo me marea&lt;/h2&gt;
&lt;p&gt;Paso un tiempo de desconexión sobre este tema; un proyecto de &lt;em&gt;autoalojado&lt;/em&gt;
(&lt;em&gt;self-hosting&lt;/em&gt;), sobre el que quiero escribir en un futuro, tomó gran parte de
mi tiempo.&lt;/p&gt;
&lt;p&gt;Recién entrando en el mes de agosto quise de una vez por todas tener una página
propia, me decanté por &lt;a rel=&quot;external&quot; href=&quot;https://gohugo.io/&quot;&gt;Hugo&lt;/a&gt;, que es sin duda, junto a &lt;a rel=&quot;external&quot; href=&quot;https://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt;, &lt;a rel=&quot;external&quot; href=&quot;https://www.11ty.dev/&quot;&gt;Eleventy&lt;/a&gt;
y &lt;a rel=&quot;external&quot; href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt;, uno de los &lt;em&gt;SSG&lt;/em&gt; más usados del mundo...&lt;/p&gt;
&lt;p&gt;No fue una tarde productiva, la documentación de &lt;a rel=&quot;external&quot; href=&quot;https://gohugo.io/&quot;&gt;Hugo&lt;/a&gt; resulto ser un desastre.
Más cercana a una referencia que a un documento que sirva para aprender a usar
la herramienta, introduce constantemente conceptos nuevos y peca de enlazar
demasiadas páginas entre sí, lo que vuelve todo algo agobiante.&lt;/p&gt;
&lt;p&gt;Su &lt;a rel=&quot;external&quot; href=&quot;https://gohugo.io/getting-started/quick-start/&quot;&gt;guía Quick start&lt;/a&gt; trata a la herramienta como una &lt;em&gt;caja negra&lt;/em&gt;,
obligando la instalación de un tema, pues no es explicado en ella como funciona el
sistema de plantillas y estilizado.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;El glosario de Hugo&lt;/summary&gt;
&lt;p&gt;&lt;em&gt;Esta sección originalmente no iba a estar escondida tras un desplegable,&lt;/em&gt;
&lt;em&gt;pero me extendí demasiado en ella. Además, me quedó demasiado como un rant.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Para ejemplo de esta problemática se encuentra su &lt;a rel=&quot;external&quot; href=&quot;https://gohugo.io/quick-reference/glossary&quot;&gt;glosario de términos&lt;/a&gt;,
que presenta multitud de problemas como:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;La adición de términos comunes en la informática que solo llevan a que el
glosario sea demasiado extenso, por ejemplo:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Booleano: Un &lt;em&gt;booleano&lt;/em&gt; es un tipo de dato con dos posibles valores, o verdadero
&amp;gt;   (&lt;code&gt;true&lt;/code&gt;) o falso (&lt;code&gt;false&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Caché: Una &lt;em&gt;caché&lt;/em&gt; es un componente de software que almacena datos para que
&amp;gt;   futuras peticiones de los mismos sean más rápidas.&lt;/li&gt;
&lt;li&gt;CLI: CLI significa &lt;em&gt;Command Line Interface&lt;/em&gt;, un mecanismo basado en texto que
&amp;gt;   permite la interacción con programas informáticos o sistemas operativos.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;— El glosario del &lt;em&gt;SSG&lt;/em&gt; Hugo (Traducido, &lt;a rel=&quot;external&quot; href=&quot;https://gohugo.io/quick-reference/glossary&quot;&gt;fuente&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;La existencia de términos &lt;em&gt;proxy&lt;/em&gt;, por ejemplo:&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Dimensión de un contenido: Vea &lt;em&gt;dimensión&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Bundle&lt;/em&gt;: Vea &lt;em&gt;bundle de una página&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;bool&lt;/em&gt;: Vea &lt;em&gt;booleano&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;— El glosario del &lt;em&gt;SSG&lt;/em&gt; Hugo (Traducido, &lt;a rel=&quot;external&quot; href=&quot;https://gohugo.io/quick-reference/glossary&quot;&gt;fuente&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;La invención de terminología innecesariamente compleja:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Dimensión: Una &lt;em&gt;dimensión&lt;/em&gt; es un eje de variación de un contenido
que permite que múltiples variaciones lógicas de una página existan
simultáneamente. Las tres dimensiones son &lt;em&gt;idioma&lt;/em&gt;, &lt;em&gt;rol&lt;/em&gt; y &lt;em&gt;versión&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Por ejemplo, una página lógica puede que exista en 6 idiomas, 4 versiones
y 2 roles.&lt;/p&gt;
&lt;p&gt;— El glosario del &lt;em&gt;SSG&lt;/em&gt; Hugo (Traducido, &lt;a rel=&quot;external&quot; href=&quot;https://gohugo.io/quick-reference/glossary&quot;&gt;fuente&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Que no se me malinterprete, este glosario no se trata de un problema crítico,
pero sí ejemplifica a la perfección el mal estado de la documentación de &lt;a rel=&quot;external&quot; href=&quot;https://gohugo.io/&quot;&gt;Hugo&lt;/a&gt;.&lt;/p&gt;
&lt;/details&gt;
&lt;h3 id=&quot;y-si-uso-bash&quot;&gt;¿Y si uso Bash?&lt;/h3&gt;
&lt;p&gt;Durante un muy breve periodo de tiempo se me ocurrió la idea no utilizar un
&lt;em&gt;SSG&lt;/em&gt;, sino una serie de &lt;em&gt;scripts&lt;/em&gt; en Bash que dieran uso de herramientas
como &lt;a rel=&quot;external&quot; href=&quot;https://pandoc.org/&quot;&gt;Pandoc&lt;/a&gt; o &lt;a rel=&quot;external&quot; href=&quot;https://mikefarah.gitbook.io/yq&quot;&gt;yq&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;La idea duró una tarde. Vi en poco tiempo como iba a acabar
con los mismos problemas que con mi intento original de &lt;em&gt;SSG&lt;/em&gt;, además, recordé
mi odio hacia el &lt;em&gt;shell scripting&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id=&quot;usando-zola&quot;&gt;Usando Zola&lt;/h2&gt;
&lt;p&gt;Finalmente, di una segunda oportunidad a una herramienta que en un pasado rindió
sin peros y que todavía no sé por qué la deje a un lado, &lt;a rel=&quot;external&quot; href=&quot;https://www.getzola.org/&quot;&gt;Zola&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;No tengo ninguna queja, su &lt;a rel=&quot;external&quot; href=&quot;https://www.getzola.org/documentation/getting-started/overview/&quot;&gt;Getting Started - Overview&lt;/a&gt;
me guio rápidamente en la creación de un sencillo &lt;em&gt;blog&lt;/em&gt; personal, mostrando en el
proceso el funcionamiento de su sistema de plantillas y su breve terminología
basada en páginas, secciones e índices.&lt;/p&gt;
&lt;p&gt;Es un &lt;em&gt;SSG&lt;/em&gt; que busca ser rápido, no entrometerse en tu diseño y tener las funcionalidades
justas y necesarias.&lt;/p&gt;
&lt;h3 id=&quot;hablemos-del-open-source&quot;&gt;Hablemos del &lt;em&gt;Open Source&lt;/em&gt;&lt;/h3&gt;
&lt;p&gt;En una nota más personal, me alegró ver que el proyecto sufrió una transición
de una licencia MIT (permisiva) a la EUPL (&lt;em&gt;libre&lt;/em&gt; y vírica). Me gustaría incluir
el siguiente fragmento de una conversación que ocurrió en GitHub:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Desafortunadamente, esto es un gran cambio para los usuarios corporativos de los EEUU.
La EUPL está categóricamente prohibida en la industria tecnológica, pues es agrupada
junto a la AGPL y la SSPL. Esta licencia hace a efectos practicos a Zola imposible
de incluso ejecutar su binario en cualquier entorno comercial estadounidense.
— psarossy&lt;/p&gt;
&lt;p&gt;¿Una pena para los usuarios corporativos de los EEUU entonces? No hay razón ninguna
para agrupar la EUPL con la AGPL. [La versión] 0.21 está todavía disponible
para esos usuarios.
— Keats (creador de &lt;a rel=&quot;external&quot; href=&quot;https://www.getzola.org/&quot;&gt;Zola&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;— Extracto de la conversación del &lt;em&gt;Issue #3093&lt;/em&gt; del repositorio
de GitHub de &lt;a rel=&quot;external&quot; href=&quot;https://www.getzola.org/&quot;&gt;Zola&lt;/a&gt; (Traducido, &lt;a rel=&quot;external&quot; href=&quot;https://github.com/getzola/zola/issues/3093&quot;&gt;fuente&lt;/a&gt;).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Creo que ilustra a la perfección la asimétrica situación en la que nos encontramos
en el mundo &lt;em&gt;Open Source&lt;/em&gt;. El mundo corporativo y profesional ha creado
unas expectativas sobre voluntarios y gente que ejerce de la informatica
como &lt;em&gt;hobby&lt;/em&gt;, obligandoles a proveer productos y un servicio de excelencia
y &lt;em&gt;business-ready&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Creo que es relevante enunciar una vez más una serie de verdades muchas veces
olvidadas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Toda persona es libre de crear cuando y como quiera, ignorando si lo creado
presenta o no una &lt;em&gt;utilidad práctica&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;No tienes la obligación de examinar &lt;em&gt;Pull Requests&lt;/em&gt; o cualquier otra propuesta
de adición de código, sea escrita por humano o IA.&lt;/li&gt;
&lt;li&gt;ESTE SOFTWARE SE PROPORCIONA &quot;TAL CUAL&quot;, SIN GARANTÍA DE NINGÚN TIPO.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Recomiendo mucho el texto &lt;a rel=&quot;external&quot; href=&quot;https://lake.computer/blog/help-wanted/&quot;&gt;help wanted&lt;/a&gt; por &lt;a rel=&quot;external&quot; href=&quot;https://lake.computer/&quot;&gt;Lake Hope&lt;/a&gt;, que explora en mayor
profundidad este tema.&lt;/p&gt;
&lt;h2 id=&quot;post-mortem&quot;&gt;&lt;em&gt;Post mortem&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;Por un lado, me alegra mucho tener por fín un sitio en el que compartir mis
ideas y opiniones. Pero, no puedo evitar tener el pensamiento de que no he logrado
tener la virtud propia de un ingeniero informático; el desgaste (o &lt;em&gt;burnout&lt;/em&gt;),
el cansancio y el desconocimiento han jugado un factor clave en esto, pero no haber
sido capaz de desarrollar un programa &lt;em&gt;SSG&lt;/em&gt; más competente me deja una sensación
agridulce en el cuerpo.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Sobre mí</title>
        <published>2026-03-20T00:00:00+00:00</published>
        <updated>2026-08-15T00:00:00+00:00</updated>
        
        <author>
            <name>Jorge Dobón Blanco</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://dobon.dev/es/about/"/>
        <id>https://dobon.dev/es/about/</id>
        
        <content type="html" xml:base="https://dobon.dev/es/about/">&lt;p&gt;¡Hola! Soy Jorge, un estudiante de ingeniería informática y estadística de España.&lt;/p&gt;
&lt;p&gt;Quiero en esta página contar un poco sobre mí, como una forma de que conozcais
al autor que esta detras de todos los textos de este sitio web.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;En esta página intento evitar mencionar preferencia o disgusto frente a productos,&lt;/em&gt;
&lt;em&gt;servicios o piezas de arte en concreto.&lt;/em&gt;
&lt;em&gt;Mi página de &lt;a href=&quot;/es/favs&quot;&gt;recomendaciones&lt;/a&gt; ya cumple ese propósito.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;informatica&quot;&gt;Informática&lt;/h2&gt;
&lt;p&gt;Llevo descubriendo de forma autodidacta, y ahora también de forma académica,
la informática desde que tengo memoria. Esta ha sido, es, y seguramente será
la pasión a que más horas la he dedicado.&lt;/p&gt;
&lt;p&gt;He probado y estudiado, en mayor o menor medida, una gran multitud de los campos
que la conforman: desarrollo de software, diseño de interfaces, la web,
administración de sistemas, sistemas reproducibles (NixOS),
&lt;em&gt;devops&lt;/em&gt; y &lt;em&gt;CI/CDs&lt;/em&gt; y mucho más.&lt;/p&gt;
&lt;p&gt;Y aun con todas las horas pasadas en frente de una pantalla, solo me surgen las
ganas de conocer más, de leer más, de &lt;em&gt;cacharrear&lt;/em&gt; un poco más.&lt;/p&gt;
&lt;h2 id=&quot;en-dos-palabras-vi-deojuegos&quot;&gt;En dos palabras: vi-deojuegos&lt;/h2&gt;
&lt;p&gt;Desde niño soy un gran apasionado de los videojuegos, les he dedicado miles
de horas y probado decenas de géneros diferentes.&lt;/p&gt;
&lt;p&gt;Nunca me voy a negar de jugar a un &lt;em&gt;Metroidvania&lt;/em&gt;, un buen juego de &lt;em&gt;puzzles&lt;/em&gt;,
un &lt;em&gt;souls-like&lt;/em&gt;, una aventura de supervivencia o un &lt;em&gt;plataformas&lt;/em&gt; resultón.&lt;/p&gt;
&lt;p&gt;Y por mucho que lo intente, y lo mucho que me lo recomienden, no he logrado
nunca he logrado divertirme jugando un &lt;em&gt;Rogue-like&lt;/em&gt; (o un &lt;em&gt;Rogue-lite&lt;/em&gt;).&lt;/p&gt;
&lt;h2 id=&quot;lectura&quot;&gt;Lectura&lt;/h2&gt;
&lt;p&gt;Aunque desde hace unos años ya estoy habituado a leer todos los días algún
texto de aspecto técnico, normalmente escritos por miembros de la &lt;a rel=&quot;external&quot; href=&quot;https://indieweb.org/IndieWeb&quot;&gt;IndieWeb&lt;/a&gt;,
no tengo todavía un fuerte hábito de lectura.&lt;/p&gt;
&lt;p&gt;Espero en unos años poder actualizar esta sección de la página con un
tono más positivo.&lt;/p&gt;
&lt;h2 id=&quot;fotografia&quot;&gt;Fotografía&lt;/h2&gt;
&lt;p&gt;Desde hace no mucho tiempo, y debido a unas vacaciones en las que se dio lugar
a espacios muy fotogénicos, me he empezado a interesar en la fotografía.&lt;/p&gt;
&lt;p&gt;Por ahora no soy más que un principiante (ab)usando de un teléfono móvil
de altas prestaciones; algunas de las fotografías que hago me resultan
lo suficiente atractivas como para &lt;a href=&quot;/es/photos&quot;&gt;publicarlas en este sitio&lt;/a&gt;.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="es">
        <title>Ahora</title>
        <published>2026-03-20T00:00:00+00:00</published>
        <updated>2026-08-08T00:00:00+00:00</updated>
        
        <author>
            <name>Jorge Dobón Blanco</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://dobon.dev/es/now/"/>
        <id>https://dobon.dev/es/now/</id>
        
        <content type="html" xml:base="https://dobon.dev/es/now/">&lt;p&gt;A día de 8 de agosto de 2026 me encuentro:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Disfrutando de mis vacaciones de verano.&lt;/li&gt;
&lt;li&gt;Migrando de mi SSG (&lt;em&gt;Static Site Generator&lt;/em&gt;) casero a &lt;a rel=&quot;external&quot; href=&quot;https://www.getzola.org&quot;&gt;Zola&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Esto es una página &lt;a rel=&quot;external&quot; href=&quot;https://nownownow.com/&quot;&gt;/now&lt;/a&gt;, una idea impulsada por &lt;a rel=&quot;external&quot; href=&quot;https://sive.rs&quot;&gt;Derek Sivers&lt;/a&gt; y &lt;a rel=&quot;external&quot; href=&quot;https://skillstopractice.com/&quot;&gt;Greg Albritton&lt;/a&gt;.&lt;/p&gt;
</content>
        
    </entry>
</feed>