<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Posts on gvisoc.com</title>
    <link>https://gvisoc.com/posts/</link>
    <description>Recent content in Posts on gvisoc.com</description>
    <image>
      <title>gvisoc.com</title>
      <url>https://gvisoc.com/images/site-umina-gs.jpg</url>
      <link>https://gvisoc.com/images/site-umina-gs.jpg</link>
    </image>
    <generator>Hugo -- 0.151.0</generator>
    <language>es-ES</language>
    <managingEditor>gabriel@gvisoc.com (Gabriel Viso Carrera)</managingEditor>
    <webMaster>gabriel@gvisoc.com (Gabriel Viso Carrera)</webMaster>
    <copyright>Gabriel Viso Carrera</copyright>
    <lastBuildDate>Sun, 07 Sep 2025 07:49:35 +0000</lastBuildDate>
    <atom:link href="https://gvisoc.com/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Reenviar tráfico TCP y UDP por la red con iptables</title>
      <link>https://gvisoc.com/posts/iptables-router/</link>
      <pubDate>Sun, 07 Sep 2025 07:49:35 +0000</pubDate><author>gabriel@gvisoc.com (Gabriel Viso Carrera)</author>
      <guid>https://gvisoc.com/posts/iptables-router/</guid>
      <description>Este método permite encaminar tráfico UDP y TCP a través de la red cuando no se necesita proxy, o cuando las soluciones basadas en proxies fallan.</description>
      <content:encoded><![CDATA[<p>Este es el tercer artículo de la serie que empezó con &ldquo;<a href="https://gvisoc.com/posts/cambios-xmpp/">Cambios en mi red de la mano de XMPP</a>.&rdquo;</p>
<h2 id="el-problema">El problema</h2>
<p>En aquel artículo, casi al final de todo, comentaba que hacía falta aplicar una solución para que el tráfico XMPP del resto de puertos (5000, 5222,&hellip; todos los que no son el 80 ó el 443) fuese reenviado desde el VPS a mi servidor en casa.</p>
<p>Probé algunas cosas con la configuración de NGINX y su módulo <code>streams</code>, pero no funcionó, así que voy a describir aquí cómo acabé usando las capacidades de filtrado de paquetes de Linux (el núcleo mismo) a través de <a href="https://www.netfilter.org/projects/iptables/index.html">iptables (en inglés)</a>.</p>
<p>Mi solución está basada y adaptada a partir de lo explicado en este <a href="https://ryanwelch.me/blog/port-forward-with-tailscale/">artículo (en inglés)</a> de <a href="https://ryanwelch.me">Ryan Welch</a>.</p>
<figure class="ma0 w-75">
    <img loading="lazy" src="/images/20250910-solution.png"
         alt="El diagrama que representa lo que queremos conseguir y acabamos de detallar."/> <figcaption>
            <p>El objetivo</p>
        </figcaption>
</figure>

<p>Al final del artículo, en cualquier caso, dejaré las configuraciones que intenté aplicar en NGINX para procesar tráfico TCP y UDP en general. Quizá lo necesitemos más adelante, o a lo mejor decides probarlo y comentarme qué es lo que hice mal.</p>
<h2 id="solución">Solución</h2>
<p>Como comentaba antes, Linux (NO GNU/Linux, sino &ldquo;Linux&rdquo; sin más, el núcleo) tiene funcionalidades de filtrado de paquetes de red incluidas, que podemos configurar para nuestros propios fines.</p>
<p>Para configurar la redirección de tráfico en el VPS, entramos por SSH y habilitaremos <em>IP forwarding</em> en el núcleo:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="go">sudo sysctl -w net.ipv4.ip_forward=1
</span></span></span></code></pre></div><p>Esto puede que se aplique entre arranques, o no, dependiendo de tu distribución. Para asegurarte, edita el fichero <code>/etc/sysctl.conf</code> y descomenta la línea <code>net.ipv4.ip_forward=1</code>.</p>
<p>Tras ello, ya podrás redirigir puertos y rangos de puertos con instrucciones como la siguiente:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="go">iptables -A PREROUTING -t nat -p tcp -i eth0 --dport 5222 -j DNAT --to-destination &lt;IP Destino&gt;:5222
</span></span></span><span class="line"><span class="cl"><span class="go">iptables -A POSTROUTING -t nat -p tcp -d &lt;IP Destino&gt; --dport 5222 -j MASQUERADE
</span></span></span></code></pre></div><p>Y, para rangos de puertos:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="go">iptables -A PREROUTING -t nat -p udp -i eth0 -m multiport --dports 49152:65535 -j DNAT --to-destination &lt;IP Destino&gt;:49152-65535
</span></span></span><span class="line"><span class="cl"><span class="go">iptables -A POSTROUTING -t nat -p udp -d &lt;IP Destini&gt; -m multiport --dports 49152:65535 -j MASQUERADE
</span></span></span></code></pre></div><p>Vas a tener que cambiar los puertos del ejemplo por los tuyos propios, así como poner tu propia dirección IP de destino en lugar del texto <code>&lt;IP Destino&gt;</code>.</p>
<p>Para el caso de XMPP hay que añadir todas las reglas de renvío correspondientes a sus puertos, cambiando el texto <code>&lt;IP Destino&gt;</code> por la dirección IP del servidor de casa, <em>patata</em> en el <a href="https://gvisoc.com/posts/vps-servidor-casero/">artículo previo de la serie</a>, y teniendo en cuenta que la dirección que tenemos que configurar es la de <em>patata</em> en Tailscale.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="go">iptables -A PREROUTING -t nat -p tcp -i eth0 --dport 5222 -j DNAT --to-destination &lt;IP Destino&gt;:5222
</span></span></span><span class="line"><span class="cl"><span class="go">iptables -A POSTROUTING -t nat -p tcp -d &lt;IP Destino&gt; --dport 5222 -j MASQUERADE
</span></span></span><span class="line"><span class="cl"><span class="go">iptables -A PREROUTING -t nat -p tcp -i eth0 --dport 5269 -j DNAT --to-destination &lt;IP Destino&gt;:5269
</span></span></span><span class="line"><span class="cl"><span class="go">iptables -A POSTROUTING -t nat -p tcp -d &lt;IP Destino&gt; --dport 5269 -j MASQUERADE
</span></span></span><span class="line"><span class="cl"><span class="go">iptables -A PREROUTING -t nat -p tcp -i eth0 --dport 5000 -j DNAT --to-destination &lt;IP Destino&gt;:5000
</span></span></span><span class="line"><span class="cl"><span class="go">iptables -A POSTROUTING -t nat -p tcp -d &lt;IP Destino&gt; --dport 5000 -j MASQUERADE
</span></span></span><span class="line"><span class="cl"><span class="go">iptables -A PREROUTING -t nat -p tcp -i eth0 --dport 3478 -j DNAT --to-destination &lt;IP Destino&gt;:3478
</span></span></span><span class="line"><span class="cl"><span class="go">iptables -A POSTROUTING -t nat -p tcp -d &lt;IP Destino&gt; --dport 3478 -j MASQUERADE
</span></span></span><span class="line"><span class="cl"><span class="go">iptables -A PREROUTING -t nat -p tcp -i eth0 --dport 3479 -j DNAT --to-destination &lt;IP Destino&gt;:3479
</span></span></span><span class="line"><span class="cl"><span class="go">iptables -A POSTROUTING -t nat -p tcp -d &lt;IP Destino&gt; --dport 3479 -j MASQUERADE
</span></span></span><span class="line"><span class="cl"><span class="go">iptables -A PREROUTING -t nat -p udp -i eth0 --dport 3478 -j DNAT --to-destination &lt;IP Destino&gt;:3478
</span></span></span><span class="line"><span class="cl"><span class="go">iptables -A POSTROUTING -t nat -p udp -d &lt;IP Destino&gt; --dport 3478 -j MASQUERADE
</span></span></span><span class="line"><span class="cl"><span class="go">iptables -A PREROUTING -t nat -p udp -i eth0 --dport 3479 -j DNAT --to-destination &lt;IP Destino&gt;:3479
</span></span></span><span class="line"><span class="cl"><span class="go">iptables -A POSTROUTING -t nat -p udp -d &lt;IP Destino&gt; --dport 3479 -j MASQUERADE
</span></span></span><span class="line"><span class="cl"><span class="go">iptables -A PREROUTING -t nat -p tcp -i eth0 --dport 5349 -j DNAT --to-destination &lt;IP Destino&gt;:5349
</span></span></span><span class="line"><span class="cl"><span class="go">iptables -A POSTROUTING -t nat -p tcp -d &lt;IP Destino&gt; --dport 5349 -j MASQUERADE
</span></span></span><span class="line"><span class="cl"><span class="go">iptables -A PREROUTING -t nat -p tcp -i eth0 --dport 5350 -j DNAT --to-destination &lt;IP Destino&gt;:5350
</span></span></span><span class="line"><span class="cl"><span class="go">iptables -A POSTROUTING -t nat -p tcp -d &lt;IP Destino&gt; --dport 5350 -j MASQUERADE
</span></span></span><span class="line"><span class="cl"><span class="go">iptables -A PREROUTING -t nat -p udp -i eth0 --dport 5349 -j DNAT --to-destination &lt;IP Destino&gt;:5349
</span></span></span><span class="line"><span class="cl"><span class="go">iptables -A POSTROUTING -t nat -p udp -d &lt;IP Destino&gt; --dport 5349 -j MASQUERADE
</span></span></span><span class="line"><span class="cl"><span class="go">iptables -A PREROUTING -t nat -p udp -i eth0 --dport 5350 -j DNAT --to-destination &lt;IP Destino&gt;:5350
</span></span></span><span class="line"><span class="cl"><span class="go">iptables -A POSTROUTING -t nat -p udp -d &lt;IP Destino&gt; --dport 5350 -j MASQUERADE
</span></span></span><span class="line"><span class="cl"><span class="go">iptables -A PREROUTING -t nat -p udp -i eth0 -m multiport --dports 49152:65535 -j DNAT --to-destination &lt;IP Destino&gt;:49152-65535
</span></span></span><span class="line"><span class="cl"><span class="go">iptables -A POSTROUTING -t nat -p udp -d &lt;IP Destino&gt; -m multiport --dports 49152:65535 -j MASQUERADE
</span></span></span></code></pre></div><p>Prueba que todo funciona y graba las reglas de iptables con <code>sudo iptables-save &gt; /etc/iptables/rules.v4</code>, de tal forma que se apliquen cada vez que reinicies el VPS.</p>
<p>En <a href="https://ryanwelch.me/blog/port-forward-with-tailscale/">su artículo</a>, Ryan comentaba otras configuraciones adicionales para temas tales como control de congestión. Consulta ese artículo para saber más, y aplica todo aquello que te sea de utilidad.</p>
<h2 id="nginx-con-tráfico-tcp-y-udp-genérico">NGINX con tráfico TCP y UDP genérico</h2>
<blockquote>
<p>Esta parte del artículo no está del todo probada, porque no me acabó de funcionar para la instalación del servidor XMPP <a href="http://snikket.org">Snikket</a>. Sin embargo, de acuerdo a su documentación, ésta es la forma en la que se configura NGINX para tráfico que no es Web.</p></blockquote>
<p>Instala <code>libnginx-mod-stream</code> para habilitar el soporte a proxies inversos TCP y UDP.</p>
<p>Modifica <code>/etc/nginx/nginx.conf</code> para añadir un bloque <em>stream</em>:</p>
<pre tabindex="0"><code class="language-conf" data-lang="conf">stream {
        include /etc/nginx/streams-enabled/*;
}
</code></pre><p>Tras ello, crea los directorios correspondientes siguiendo el mismo esquema existente para las webs: <code>sudo mkdir -p /etc/nginx/streams-available /etc/nginx/streams-enabled</code></p>
<p>Crea un fichero <code>/etc/nginx/streams-available/tcpudpservice.example.com.conf</code> con reglas como las siguientes:</p>
<pre tabindex="0"><code class="language-conf" data-lang="conf"># Puerto TCP (tráfico no HTTP):
server {
        listen 5222;
        proxy_pass &lt;IP Destino&gt;:5222;
}

# ...

# Puerto UDP:
server {
        listen 3478 udp;
        proxy_pass &lt;IP Destino&gt;:3478;
}

# ...

# Se aceptan rangos, también. En este caso, fíjate
# en el uso de $server_port en la sentencia proxy_pass.

server {
        listen 49152-65535 udp;
        proxy_pass &lt;IP Destino&gt;:$server_port;
}
</code></pre><p>En caso de definir rangos de puertos muy grande, como los que propone Snikket para conversaciones de audio y vídeo por XMPP en instalaciones con muchos usuarios, NGINX devolverá un error al tener demasiados ficheros abiertos. La configuración de Snikket espera poder tener hasta 16384 conexiones UDP abiertas al mismo tiempo.</p>
<p>Si queremos resolver esto en lugar de reducir el rango de puertos UDP, hay que aumentar el parámetro <code>LimitNOFILE</code> de NGINX. Para eso, ejecuta <code>sudo systemctl edit nginx.service</code>; esto abrirá un fichero de extensión de la definición del servicio</p>
<p>Escribe lo siguiente y graba los cambios:</p>
<pre tabindex="0"><code class="language-unit" data-lang="unit">[Service]
LimitNOFILE=65535
</code></pre><p>Tras ello, en el preámbulo de <code>/etc/nginx/nginx.conf</code> (fuera de cualquier bloque <code>http</code>, <code>events</code> o <code>stream</code>), añade la línea  <code>worker_rlimit_nofile</code> con un valor menor a 65535 (30000 funciona para Snikket), e incrementa el valor de <code>worker_connections</code> dentro de <code>events</code>:</p>
<pre tabindex="0"><code class="language-conf" data-lang="conf">...
include /etc/nginx/modules-enabled/*.conf;

worker_rlimit_nofile 30000;

events {
        # worker_connections 768;
        # 3 veces 8192 será suficiente
        worker_connections 24576;
        # multi_accept on;
}

...
</code></pre><p>Como dije antes, esta configuración no me sirvió para XMPP, pero puede ser útil para otros casos de uso.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Exponer servicios alojados en casa usando un VPS y Tailscale</title>
      <link>https://gvisoc.com/posts/vps-servidor-casero/</link>
      <pubDate>Fri, 05 Sep 2025 05:40:00 +1000</pubDate><author>gabriel@gvisoc.com (Gabriel Viso Carrera)</author>
      <guid>https://gvisoc.com/posts/vps-servidor-casero/</guid>
      <description>Una forma fácil de exponer servicios en tu red casera sin necesidad de abrir puertos ni contratar direcciones IP estáticas con tu operador de acceso a internet.</description>
      <content:encoded><![CDATA[<h2 id="problema">Problema</h2>
<p>Este texto detalla los pasos a seguir para conectar un proxy inverso (<a href="https://nginx.org">NGINX</a>) instalado en un servidor A, y dar acceso a servicios web instalados en otra máquina diferente, un servidor B. Si la máquinas están en ubicaciones o redes diferentes, la conectividad la podremos resolver mediante varias alternativas, como una VPN.</p>
<p>En mi caso concreto, esto sirve para instalar NGINX en un VPS, y usarlo para exponer mis servicios alojados en un servidor que tengo en casa, &ldquo;barcas&rdquo;. Para conectar las dos máquinas y que NGINX pueda redirigir el tráfico a esos servicios, he usado <a href="https://tailscale.com">Tailscale</a>.</p>
<figure class="ma0 w-75">
    <img loading="lazy" src="/images/20250905-solution.png"
         alt="Un diagrama que representa lo que queremos conseguir y que acabamos de explicar"/> <figcaption>
            <p>El objetivo</p>
        </figcaption>
</figure>

<p>Este artículo continúa la serie que empezó con &ldquo;<a href="/posts/cambios-xmpp/">Cambios en mi red de la mano de XMPP</a>&rdquo;. Si te preguntas por qué querríamos hacer esto, o qué valor tiene esta configuración, visita ese enlace.</p>
<h2 id="solución">Solución</h2>
<p>Para llevar a cabo esta solución necesitarás:</p>
<ol>
<li>Un servidor VPS contratado con tu servicio de alojamiento de confianza, al que poder acceder por SSH.</li>
<li>Un servidor en tu casa, con al menos un servicio aceptando conexiones HTTP. Por ejemplo, en el puerto 5000 (<code>0.0.0.0:5000</code>). A este servidor lo llamaremos <em>patata</em> en el resto del artículo, por claridad.</li>
<li>Una cuenta gratuita en <a href="https://tailscale.com">Tailscale</a>. En general, valdría con cualquier otro proveedor de VPN, pero es preferible que esté basada en <a href="https://es.wikipedia.org/wiki/WireGuard">WireGuard</a>, porque ofrece un mejor rendimiento que <a href="https://es.wikipedia.org/wiki/OpenVPN">OpenVPN</a>.</li>
<li>Opcionalmente, o para que esto tenga sentido, un dominio con sus registros de DNS apuntando al VPS que mencionamos en el punto 1.</li>
</ol>
<p>En las instrucciones de este artículo supondré que ambos servidores (el VPS y <em>patata</em>) tienen instalada una Ubuntu LTS Server (por ejemplo, la 24.04).</p>
<p>Si no hay problemas, en 20 minutos deberías tenerlo todo listo.</p>
<h3 id="servidor-en-casa">Servidor en casa</h3>
<p>Nos conectaremos a <em>patata</em>, donde está nuestro servicio web esperando peticiones en el puerto 5000.</p>
<p><a href="https://tailscale.com/download">Instalamos Tailscale</a> y autenticamos a <em>patata</em> en nuestra cuenta. Esto asociará una dirección IP dentro de la VPN a <em>patata</em>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="gp">#</span> Las órdenes para instalar tailscale no las reproduzco 
</span></span><span class="line"><span class="cl"><span class="gp">#</span> porque podrían cambiar en cualquier momento.
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">sudo tailscale up
</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="gp">#</span> Seguimos las instrucciones por pantalla
</span></span><span class="line"><span class="cl"><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="gp">#</span> Habilitamos Tailscale como servicio de sistema permanentemente
</span></span><span class="line"><span class="cl"><span class="go">sudo systemctl enable tailscaled --now
</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="gp">#</span> Obtenemos la IP de esta máquina en la tailnet y la anotamos.
</span></span><span class="line"><span class="cl"><span class="go">tailscale ip -4
</span></span></span><span class="line"><span class="cl"><span class="go">100.85.67.22
</span></span></span></code></pre></div><p>En el panel de control de Tailscale podremos ver su nombre local, además de la IP devuelta por la última orden.</p>
<p>También podremos configurar la máquina para que no haya que re-introducirla en la red, desactivando la expiración de la clave usada para autenticar la máquina en Tailscale.</p>
<figure class="ma0 w-10">
    <img loading="lazy" src="/images/20250905-keyexpiry.png"
         alt="Un menú contextual del panel de control de Tailscale para desactivar la expiración de las claves"/> <figcaption>
            <p>Opción relevante para desactivar la expiración de las claves</p>
        </figcaption>
</figure>

<p>Opcionalmente, podemos activar el &ldquo;MagicDNS&rdquo; para podernos referir a ambas máquinas mediante un nombre, en lugar de mediante una dirección IP, sin tener que configurar nada localmente en las máquinas.</p>
<figure class="ma0 w-75">
    <img loading="lazy" src="/images/20250905-magicdns.png"
         alt="Opciones de &#34;MagicDNS&#34; en el panel de control de Tailscale, descrita como &#34;Automatically register domain names for devices in your tailnet. This lets you to use a machine’s name instead of its IP address.&#34;. En la imagen ya se encuentra activado."/> <figcaption>
            <p>Opciones de &ldquo;MagicDNS&rdquo; en el panel de control de Tailscale. En el ejemplo ya se encuentra activado.</p>
        </figcaption>
</figure>

<p>Una vez la máquina está en Tailscale, debemos <strong>abrir el puerto 5000 en el cortafuegos de <em>patata</em></strong>, si es que no lo habíamos hecho ya, para que pueda recibir peticiones desde el VPS por dicho puerto.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="go">sudo iptables -A INPUT -p tcp -m tcp --dport 5000 -j ACCEPT
</span></span></span></code></pre></div><p>A este respecto:</p>
<ol>
<li>Si no tienes <code>iptables-persistent</code> instalado, es el momento de instalarlo para poder grabar las reglas de cortafuegos de tal forma que se apliquen con cada reinicio de la máquina.</li>
</ol>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="go">sudo apt install iptables-persistent 
</span></span></span><span class="line"><span class="cl"><span class="go">sudo iptables-save &gt; /etc/iptables/rules.v4
</span></span></span></code></pre></div><ol start="2">
<li>Personalmente, abro los puertos en todos los interfaces y no sólo en el de Tailscale.
<ul>
<li>Al no tener que abrir ese puerto en el router, no estoy haciendo nada que me deje demasiado expuesto.</li>
<li>Al hacerlo así, no necesito acceder por Tailscale a <em>patata</em> cuando, estando en casa, necesito hacer alguna prueba.</li>
<li>Cada caso es distinto: decide qué hacer tú mismo con tu cortafuegos dependiendo de lo crítico que sea el servicio que estás configurando, y lo sensibles que sean los datos que gestiona.</li>
</ul>
</li>
</ol>
<h3 id="vps">VPS</h3>
<p>En segundo lugar, nos conectamos al VPS por medio de SSH e instalamos un proxy inverso. Aunque no vayamos a tener más de un servicio escuchando en los puertos 80 y 443, configurar y entender un proxy inverso es más fácil que configurar y entender reglas de reenvío de tráfico y DNAT en un cortafuegos como iptables.</p>
<p>En mi caso, suelo usar NGINX.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="go">sudo apt update &amp;&amp; sudo apt install nginx
</span></span></span></code></pre></div><p><a href="https://tailscale.com/download">Instalamos Tailscale</a> y repetimos los mismos pasos al respecto que en el caso de <em>patata</em>. Anotamos la dirección IP de el VPS en &ldquo;la tailnet&rdquo;, por ejemplo <code>100.85.77.36</code>.</p>
<p>Obtenemos un certificado de Let&rsquo;s Encrypt para nuestro dominio, con CertBot. Para esto:</p>
<ul>
<li>Debemos configur previamente los registros DNS de nuestro dominio, <code>ejemplo.com</code>, para que apunten a la IP pública (no a su IP en Tailscale) del VPS en el que estamos trabajando.</li>
<li>Es posible tengamos que parar NGINX para esto (<code>sudo systemctl stop nginx</code>), dependiendo de nuestros proveedores de dominio y los plugins de CertBot disponibles para interactuar con él.</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="go">sudo certbot certonly --standalone -d ejemplo.com
</span></span></span><span class="line"><span class="cl"><span class="go">...
</span></span></span><span class="line"><span class="cl"><span class="go">...
</span></span></span><span class="line"><span class="cl"><span class="go">Successfully received certificate.
</span></span></span><span class="line"><span class="cl"><span class="go">Certificate saved at: /etc/letsencrypt/live/ejemplo.com/fullchain.pem;
</span></span></span><span class="line"><span class="cl"><span class="go">Key is saved at:      /etc/letsencrypt/live/ejemplo.com/privkey.pem;
</span></span></span><span class="line"><span class="cl"><span class="go">...
</span></span></span><span class="line"><span class="cl"><span class="go">...
</span></span></span></code></pre></div><p>Configuramos el servicio en el proxy inverso, poniendo en la sentencia <code>proxy_pass</code> la IP de nuestro servidor <em>patata</em> en Tailscale. Para ello, en <code>/etc/nginx/sites-available/</code> creamos un fichero de configuración, por ejemplo <code>ejemplo.com.conf</code> para una web <code>https://ejemplo.com</code>.</p>
<pre tabindex="0"><code class="language-conf" data-lang="conf">upstream ejemploweb {
        # Sustituye [IP o nombre de máquina] por el valor de tu &#39;patata&#39;
        # **en Tailscale**.
        # 100.85.67.22 en el texto del artículo.
        server [IP o nombre de máquina]:5000;
        keepalive 64;
}

server {
        server_name ejemplo.com;
        listen 80;

        location / {
                return 301 https://$host$request_uri;
        }
}

server {
        server_name ejemplo.com;
        listen 443 ssl http2;

        # Other SSL stuff goes here
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!MEDIUM:!LOW:!aNULL:!NULL:!SHA;
        ssl_prefer_server_ciphers on;
        ssl_session_cache shared:SSL:10m;
        ssl_session_tickets off;

        ssl_certificate     /etc/letsencrypt/live/ejemplo.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/ejemplo.com/privkey.pem;

        location / {
                # The final `/` is important.
                proxy_pass http://ejemploweb/;
                add_header X-Frame-Options SAMEORIGIN;
                add_header X-XSS-Protection &#34;1; mode=block&#34;;
                proxy_redirect off;
                proxy_buffering off;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Forwarded-Port $server_port;
                proxy_read_timeout 90;
        }
}
</code></pre><p>Creamos un enlace simbólico a este fichero en <code>/etc/nginx/sites-enabled</code>, probamos la configuración de NGINX y, si todo va bien, la recargamos.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="go">cd /etc/nginx/sites-enabled/
</span></span></span><span class="line"><span class="cl"><span class="go">sudo ln -s ../sites-available/ejemplo.com.conf
</span></span></span><span class="line"><span class="cl"><span class="go">sudo nginx -t
</span></span></span><span class="line"><span class="cl"><span class="go">nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
</span></span></span><span class="line"><span class="cl"><span class="go">nginx: configuration file /etc/nginx/nginx.conf test is successful
</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="gp">#</span> Si hemos detenido el servicio de NGINX para obtener el certificado, 
</span></span><span class="line"><span class="cl"><span class="gp">#</span> lo arrancamos<span class="p">;</span> si no:
</span></span><span class="line"><span class="cl"><span class="go">sudo systemctl reload nginx
</span></span></span></code></pre></div><p>En este punto, deberíamos poder interactuar con nuestro servicio en <em>patata</em> desde <code>https://ejemplo.com</code>.</p>
<h2 id="posibles-errores-que-te-puedes-encontrar">Posibles errores que te puedes encontrar</h2>
<ul>
<li><strong>El navegador no muestra nada, el servicio no contesta</strong>. Si hay actividad en los logs de NGINX en el VPS (<code>sudo tail -f /var/log/nginx/access.log</code>), y la petición se abandona tras un tiempo (<em>timeout</em>), hay varias posibles causas que me he encontrado con mi limitada experiencia. En <em>patata</em>:
<ul>
<li>El servicio al que quieremos acceder a través de NGINX no está funcionando, y tenemos que arrancarlo,</li>
<li>o el servicio está expuesto en el puerto 5000 de un interfaz de red específico, en lugar de <code>0.0.0.0</code> (que significa <code>todos los interfaces de red</code> de <em>patata</em>), y que no es el de Tailscale; por ejemplo, en <code>127.0.0.1</code>,</li>
<li>o hemos hecho algo mal con el cortafuegos y la petición se está rechazando de esta forma.</li>
</ul>
</li>
<li><strong>La configuración de NGINX es correcta</strong> (<code>sudo nginx -t</code> dice que 👍)<strong>, pero NGINX no arranca</strong> o se muere al recargar la configuración. La causa más frecuente es que NGINX no se puede comunicar con <em>patata</em>, al que estaríamos apuntando con la sentencia <code>proxy_pass</code>, porque no lo encuentra.
<ul>
<li>O bien hemos cometido un error al configurar el <code>proxy_pass</code>,</li>
<li>o bien NGINX ha intentado establecer contacto con <em>patata</em> antes de que Tailscale estableciese el túnel, por ejemplo si esto ocurre tras reiniciar el VPS,</li>
<li>o bien el servicio de Tailscale se ha parado en alguna de las dos máquinas.</li>
<li>Esta causa se confirma con el mensaje <code>host not found in upstream</code> en la salida de <code>sudo systemctl status nginx</code>:</li>
</ul>
</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-console" data-lang="console"><span class="line"><span class="cl"><span class="go">nginx.service - A high performance web server and a reverse proxy server
</span></span></span><span class="line"><span class="cl"><span class="go">     Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: enabled)
</span></span></span><span class="line"><span class="cl"><span class="go">    Drop-In: /etc/systemd/system/nginx.service.d
</span></span></span><span class="line"><span class="cl"><span class="go">             └─override.conf
</span></span></span><span class="line"><span class="cl"><span class="go">     Active: active (running) since Fri 2025-08-29 11:05:51 UTC; 3 days ago
</span></span></span><span class="line"><span class="cl"><span class="go">       Docs: man:nginx(8)
</span></span></span><span class="line"><span class="cl"><span class="go">    Process: 1154 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
</span></span></span><span class="line"><span class="cl"><span class="go">    Process: 1156 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
</span></span></span><span class="line"><span class="cl"><span class="go">    Process: 58676 ExecReload=/usr/sbin/nginx -g daemon on; master_process on; -s reload (code=exited, status=1/FAILURE)
</span></span></span><span class="line"><span class="cl"><span class="go">   Main PID: 1157 (nginx)
</span></span></span><span class="line"><span class="cl"><span class="go">      Tasks: 3 (limit: 1110)
</span></span></span><span class="line"><span class="cl"><span class="go">     Memory: 46.9M (peak: 200.2M)
</span></span></span><span class="line"><span class="cl"><span class="go">        CPU: 29min 57.349s
</span></span></span><span class="line"><span class="cl"><span class="go">     CGroup: /system.slice/nginx.service
</span></span></span><span class="line"><span class="cl"><span class="go">             ├─1157 &#34;nginx: master process /usr/sbin/nginx -g daemon on; master_process on;&#34;
</span></span></span><span class="line"><span class="cl"><span class="go">             ├─1158 &#34;nginx: worker process&#34;
</span></span></span><span class="line"><span class="cl"><span class="go">             └─1159 &#34;nginx: cache manager process&#34;
</span></span></span><span class="line"><span class="cl"><span class="go"></span><span class="err">
</span></span></span><span class="line"><span class="cl"><span class="err"></span><span class="go">...
</span></span></span><span class="line"><span class="cl"><span class="go">Sep 02 05:32:49 vps-hostingprovider nginx[58676]: 2025/09/02 05:32:49 [emerg] 58676#58676: host not found in upstream &#34;100.85.77.22&#34; in /etc/nginx/sites-enabled/ejemlo.com.conf&gt;
</span></span></span><span class="line"><span class="cl"><span class="go">Sep 02 05:32:49 vps-hostingprovider systemd[1]: nginx.service: Control process exited, code=exited, status=1/FAILURE
</span></span></span><span class="line"><span class="cl"><span class="go">Sep 02 05:32:49 vps-hostingprovider systemd[1]: Reload failed for nginx.service - A high performance web server and a reverse proxy server.
</span></span></span><span class="line"><span class="cl"><span class="go">lines 1-28/28 (END)
</span></span></span></code></pre></div><ul>
<li><strong>Recibimos un código de estado HTTP 502</strong>. Esto quiere decir que, si bien NGINX está funcionando correctamente, el servicio al que nos conectamos (expuesto en el puerto 5000 de <em>patata</em>), está devolviendo errores.
<ul>
<li>Si haces una prueba local en <em>patata</em> y el servicio funciona, casi seguro que se trata de un tema de <strong>proxies de confianza</strong>. Describir el problema en detalle excede los objetivos de este artículo, pero en resumen se trata de que tienes que especificar en la configuración de ese servicio, en <em>patata</em>, que NGINX está instalado en una máquina diferente, el VPS, y configurar la dirección del VPS en Tailscale como proxy de confianza. <strong>Consulta los logs del servicio</strong> para confirmar esta hipótesis.</li>
<li>Esto no es un problema, es una característica de seguridad bastante interesante.</li>
<li>Por ejemplo, esto me pasó con mis instancias de Mastodon y de Nextcloud. En ambos casos, la documentación contenía las soluciones: <a href="https://docs.joinmastodon.org/admin/config/#trusted_proxy_ip">Mastodon &ndash; trusted proxies</a>, <a href="https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/reverse_proxy_configuration.html#defining-trusted-proxies">Nextcloud &ndash; trusted proxies</a></li>
<li>Depende de cómo esté implementado el servicio que estamos intentando arreglar, puede ser que acepte un proxy de confianza tanto como nombre de máquina o como direccion IP, o sólo como IP. Ármate de paciencia y si no te funciona con el nombre de la máquina no te desesperes.</li>
</ul>
</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>Cambios en mi red de la mano de XMPP</title>
      <link>https://gvisoc.com/posts/cambios-xmpp/</link>
      <pubDate>Sun, 31 Aug 2025 00:49:35 +0000</pubDate><author>gabriel@gvisoc.com (Gabriel Viso Carrera)</author>
      <guid>https://gvisoc.com/posts/cambios-xmpp/</guid>
      <description>Hace unos días me recomendaron Snikket como servidor XMPP sencillo de instalar y mantener, y a raíz de ello he cambiado la forma de exponer mis servicios a internet.</description>
      <content:encoded><![CDATA[<p><strong>Hace unos días me recomendaron <a href="https://snikket.org">Snikket</a> como una opción sencilla para montar un servidor XMPP<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>, y me lancé por el terraplén</strong> de cabeza. A mitad del descenso, me encontré un montón de problemas interesantísimos que resolver, que iré desgranando paso a paso en los próximos artículos.</p>
<p>En éste os voy a contar cuáles son esos problemas, por qué surgen, por qué los quiero resolver y cómo los he resuelto, pero desde un punto de vista de diseño por el momento. No vas a encontrar instrucciones de terminal para resolver todo esto, sino el contexto necesario para saber qué estoy intentando resolver; las instrucciones detalladas vendrán en los siguientes artículos.</p>
<p>Hasta ahora, todos mis servicios alojados bajo mi impresora eran servicios Web, es decir, basados en comunicaciones a través de los puertos 80 y 443 (HTTP y HTTPs). Estos puertos eran suficientes para comunicar todos mis servicios con mis dispositivos o con mi navegador, o con otros servidores en el caso de mi instancia de Mastodon. Para poder atender a tantos servicios tras los mismos puertos, uso <a href="https://nginx.org/">NGINX</a> como <a href="https://es.wikipedia.org/wiki/Proxy_inverso">proxy inverso</a>:</p>
<figure class="ma0 w-75">
    <img loading="lazy" src="/images/20250901-before.png"
         alt="Un diagrama donde se ve la conectividad entre cloudflare y un servidor llamado barcas, que contiene NGINX y una serie de servicios ejecutados en Docker"/> <figcaption>
            <p>&ldquo;Barcas&rdquo; es el nombre de mi servidor.</p>
        </figcaption>
</figure>

<p>A diferencia de mis otros servicios, <strong>XMPP usa más puertos TCP y UDP que el 80 y el 443</strong>: 5000, 5222, 5269,&hellip; En el caso de Snikket como, supongo, toda otra serie de alternativas, los puertos 80 y 443 también se usan para proporcionar un panel de control Web y poder administrar usuarios y salas de chat.</p>
<p>Sobre el papel, la configuración para instalar Snikket sería la siguiente:</p>
<ul>
<li>Configurar los puertos 80 y 443 en NGINX para poder usar el panel de control de usuarios y conversaciones de Snikket.</li>
<li>Configurar acceso directo a todo el resto de los puertos de Snikket: 5222, 5269,&hellip; ésta es la <a href="https://snikket.org/service/help/advanced/firewall/">lista completa</a> (en inglés). Como no son puertos compartidos entre varios servicios, no hace falta configurarlos en un proxy inverso.</li>
<li>Configurar las DNS de mi servicio de XMPP en mi proveedor de dominios, que es <a href="https://www.cloudflare.com/">Cloudflare</a>.</li>
</ul>
<p>Esta configuración, que a priori tendría buena pinta, se resume en esta figura:</p>
<figure class="ma0 w-75">
    <img loading="lazy" src="/images/20250902-snikketsimple.png"
         alt="Un diagrama donde se ve la conectividad entre cloudflare y un servidor llamado barcas, que contiene NGINX y una serie de servicios ejecutados en Docker."/> <figcaption>
            <p>Esta configuración, aunque parece que tiene sentido, no funciona. Cloudflare sólo ofrece funciones de proxy para los puertos 80 y 443 en su cuenta gratuita, por lo que el tráfico del resto de puertos de Snikket es descartado.</p>
        </figcaption>
</figure>

<p><strong>Sin embargo, esto tiene un problema que no es evidente, y la configuración de arriba no funciona</strong> sin más. Las características de seguridad de Cloudflare que están disponibles para las cuentas gratuitas en forma de &ldquo;el proxy de Cloudflare&rdquo; sólo soportan los puertos 80 y 443. Con el proxy de Cloudflare activado, todo el tráfico que no es web (80 y 443) se descartaba, por lo que ninguno de los puertos que entran en juego en las conversaciones de XMPP llegaba a mi servidor.</p>
<p>Desactivando el proxy de Cloudflare para la configuración de los subdominios de Snikket todo funciona, pero queda así:</p>
<figure class="ma0 w-75">
    <img loading="lazy" src="/images/20250902-snikketactual.png"
         alt="Un diagrama donde se ve la conectividad entre cloudflare y un servidor llamado barcas, que contiene NGINX y una serie de servicios ejecutados en Docker."/> <figcaption>
            <p>Esta configuración, aunque funciona, supone un riesgo. Al desactivar la función de proxy, la dirección IP de mi casa (por donde se entra a &ldquo;barcas&rdquo;) queda expuesta a todo internet. Un ataque de denegación de servicio distribuido que afecte a mi proveedor de servicios de acceso a internet puede dejar sin internet a toda la casa, cosa que no nos gusta.</p>
        </figcaption>
</figure>

<p><strong>Desactivar el proxy de Cloudflare no es ideal, porque expone la IP del servidor</strong> al resto de internet. Mi servidor está en casa, por lo que un ataque de denegación de servicio que, por puro azar, incluyese la dirección IP que mi operador de acceso a internet me asigna, tiraría por tierra toda mi red doméstica. Eso nos impediría trabajar o estudiar desde casa y, probablemente, me traería problemas con mi proveedor de servicio.</p>
<p>Una alternativa a esto es contratar un servidor barato en cualquier proveedor de alojamiento en la nube (un <a href="https://es.wikipedia.org/wiki/Servidor_virtual_privado">VPS</a>) y mover toda mi configuración de NGINX a él, conectando este servidor en la nube con el servidor de mi casa mediante una VPN (la cuenta gratuita de <a href="https://tailscale.com">Tailscale</a> funciona muy bien y es más que suficiente).</p>
<ul>
<li>El proveedor de alojamiento en la nube protegería mi servidor porque la IP expuesta sería la suya, no la de mi casa, y este tipo de empresas protegen su infraestructura ante ataques, por lo menos a un nivel de red. Tras los puertos XMPP no hay contenido, sino un servicio de mensajería que además cifra el tráfico, así que no hay problema por perder la capa de seguridad y anti-<em>bots</em> que proporciona Cloudflare para estos puertos.</li>
<li>Conectar el VPS a mi servidor a través de una VPN es perfecto para este caso, porque oculta la dirección IP de mi red doméstica ahorrándome configurarla en el panel de control de DNS, y también el tener que abrir puertos en mi router. Además, para todo el tráfico que iría entre la VPS y mi servidor, se aplicaría una capa de cifrado que lo protegería en caso de que, de por sí, no estuviese ya cifrado.</li>
</ul>
<figure class="ma0 w-75">
    <img loading="lazy" src="/images/20250902-snikketvps.png"
         alt="Un diagrama donde se ve la conectividad entre cloudflare, un VPS que contiene NGINX, y entre éste y un servidor llamado barcas usando Tailscale. Barcas que contiene una serie de servicios ejecutados en Docker."/> <figcaption>
            <p>Esta configuración funciona y resuelve el problema de la configuración anterior, pero requiere encontrar una solución para redirigir el tráfico de todos los puertos diferentes a 80 y 443 a &ldquo;barcas&rdquo;.</p>
        </figcaption>
</figure>

<p>¿Por qué mover sólo la configuración de NGINX y no todos los servicios? Por una cuestión de recursos y precio: para ejecutar NGINX y una serie de reglas de cortafuegos, los requisitos que necesitamos son mínimos. Con un servidor que tenga 1 GB de RAM y con una CPU es más que suficiente, y eso cuesta entre 3 y 6€ al mes. Si muevo todo<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> necesitaría entre 8 y 16 GB de RAM, mucho más almacenamiento potencia de CPU, una solución de copias de seguridad,&hellip; Con todo ello me estaría moviendo en un rango de unos 40€, o más, al mes. Teniendo un servidor en casa donde ejecutar los servicios, moverlo todo a la VPS acarrea un coste innecesario en mi caso.</p>
<p>Así pues, parece que contratar una VPS sencilla para tener NGINX configurado allí, y conectarla al servidor de casa mediante Tailscale, resolvería mis problemas a un coste muy bajo (3 a 6€ al mes).</p>
<p>La única complicación adicional de este método es que tenemos que tener algún mecanismo para redirigir el tráfico de los puertos de XMPP (varios puertos como el 5222, 5269,&hellip; en TCP y UDP) desde el VPS hacia nuestro servidor (en casa o donde fuere). Al final lo he resuelto configurando el VPS para que haga <em>IP forwarding</em> y luego he configurado una serie de reglas DNAT<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup> en su cortafuegos.</p>
<p>En próximos artículos veremos más en detalle la configuración de todos los elementos.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><em><a href="https://es.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol">Extensible Messaging and Presence Protocol</a></em> &ndash; Protocolo Extensible de Mensajería y Presencia. XMPP es un protocolo que comunica comunidades de usuarios a través de sus servidores, creando conversaciones entre pares de usuarios, o salas para conversaciones en grupo. Google Talks fue el ejemplo más popular de aplicación de XMPP. Una ventaja de XMPP es que es un protocolo federado, es decir: aunque yo me conecte a un servidor donde sólo esté yo, puedo establecer contacto con cualquier otro usuario de cualquier otro servicio que utilice XMPP en el planeta. Los nombres de usuario en XMPP tienen el mismo formato que un correo electrónico, y los servidores se comunican entre ellos cuando sus usuarios lo necesitan.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Aunque en este artículo hablo casi exclusivamente de Snikket, en mi servidor de casa tengo muchos otros servicios: Mastodon, Castopod, algún que otro blog, Linkwarden, FreshRSS, Actual Budget, Forgejo y Nextcloud.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p><em>Destination <a href="https://es.wikipedia.org/wiki/Traducci%C3%B3n_de_direcciones_de_red">NAT</a></em>. Traducción de direcciones de destino de red.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    <item>
      <title>🚨 gvisoc.com en Hugo 🚨</title>
      <link>https://gvisoc.com/posts/gvisoc-com-en-hugo/</link>
      <pubDate>Sun, 03 Aug 2025 14:17:00 +1000</pubDate><author>gabriel@gvisoc.com (Gabriel Viso Carrera)</author>
      <guid>https://gvisoc.com/posts/gvisoc-com-en-hugo/</guid>
      <description>Salvo un sistema de comentarios que me falta por poner, todo terminado y muy satisfecho.</description>
      <content:encoded><![CDATA[<p>He cambiado el motor que da vida a este blog a <a href="https://gohugo.io">Hugo</a>. El anterior era <a href="https://ghost.org">Ghost</a>.</p>
<p>Entre otras cosas, lo hice porque la filosofía de Ghost de obligaros a daros de alta en un perfil determinado de suscriptor para poder comentar me parecía demasiado agresiva. Es cierto, la membresía para ello era gratis, pero no dejaba de ser una barrera artificial y confusa. Por otro lado, Ghost parece más orientado a boletines de noticias (newsletter, en inglés, para los despistados) que a blogs, por varias cosas pero también por el rollo de las membresías.</p>
<p>Por otro lado, Hugo tiene ciertas ventajas para mí, como por ejemplo que me permite crear un blog en dos (o más) idiomas, si es que me decido a traducir todos los artículos. Así, por ejemplo, si pulsáis en la banderita australiana (🇦🇺) que está en la cabecera de la web, podréis acceder a todo el contenido en inglés. En aquellos artículos o páginas con una traducción al inglés, veréis una banderita australiana (o, si estáis en una página en inglés, veréis una banderita española si está traducida al español).</p>
<p>Vais a notar alguna diferencia, más allá de cambios de aspecto. Mientras Ghost es una aplicación web con un servidor y con una base de datos que genera páginas al vuelo, Hugo es un programa que yo ejecuto en mi PC para crear un sitio web estático que luego subo a un servidor web, mucho más sencillo que un servidor de aplicaciones. Eso tiene ventajas e inconvenientes. Sin entrar en demasiados detalles:</p>
<ul>
<li>Como ventaja inmediata, no hay ningún software del que preocuparse que se ejecute en otro sitio diferente a tu PC. Tu navegador se descarga mi web entera y te la representa.</li>
<li>Como inconvemiente inmediato, en Hugo no tendremos comentarios. Algo pensaré.</li>
</ul>
<p>Aunque a lo mejor hay algún bache por el camino, como por ejemplo que el feed RSS cambie y recibas artículos antiguos como nuevos, no hay tantos artículos como para que esto sea un gran problema; no deberías tener que preocuparte de nada. En cualquier caso, si te preocupa algo, deja un comentario mientras puedas o escríbeme un correo a <code>gabriel arroba</code> el dominio de este blog.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Cuando la captura de pantalla de OBS se rompe en Wayland</title>
      <link>https://gvisoc.com/posts/solucionar-captura-obs-rota-wayland/</link>
      <pubDate>Mon, 21 Apr 2025 20:09:27 +0000</pubDate><author>gabriel@gvisoc.com (Gabriel Viso Carrera)</author>
      <guid>https://gvisoc.com/posts/solucionar-captura-obs-rota-wayland/</guid>
      <description>Qué hacer si en OBS (en Linux) deja de aparecer la opción de capturar la pantalla de tu ordenador.</description>
      <content:encoded><![CDATA[<p><a href="https://gvisoc.com/posts/linux-en-directo/">A veces grabo vídeos</a> usando <a href="https://obsproject.com/es">OBS</a>. Salvo contadísimas excepciones grabo usando un PC con Fedora, que es una distribución de Linux que usa <a href="https://es.wikipedia.org/wiki/Wayland_%28protocolo%29">Wayland</a> como protocolo de pantalla.</p>
<p>En ocasiones, algo pasa y la opción correspondiente para grabar el escritorio del ordenador desaparece. No sé si OBS está traducido al Español, o si lo está, si está bien traducido; en Inglés la opción que desaparece es &ldquo;<em>Screen Capture (PipeWire)</em>&rdquo;:</p>
<figure>
    <img loading="lazy" src="/images/20250421-obspipewire.png"
         alt="Captura de pantalla de OBS que muestra un menú emergente con la opción &amp;quot;Screen Capture (PipeWire)&amp;quot; resaltada."/> <figcaption>
            <p>OBS mostrando la opción a recuperar</p>
        </figcaption>
</figure>

<p>En mi caso este problema se debió a que los recursos correspondientes a la funcionalidad de Wayland para compartir pantalla se quedaron bloqueados en algún estado inconsistente.</p>
<p>Tras mucho trastear, acabé por recuperar la funcionalidad perdida borrando el contenido de los directorios <code>~/.cache</code> y <code>~/.local/state/</code>:</p>
<pre><code>rm -rf ~/.cache/*
rm -rf ~/.local/state/*
</code></pre>
<p>No creo que esta solución sirva a todo el mundo, porque Wayland está aún en fase de desarrollo y pueden estar fallando muchas más cosas. Las pistas que me sirvieron para probar estas cosas fueron las siguientes:</p>
<ul>
<li>Esta característica funcionaba, no mucho tiempo atrás.</li>
<li>Creando un usuario nuevo, ese usuario tiene la opción disponible.</li>
</ul>
<p>Esto quiere decir que OBS y Wayland están bien instalados y funcionan en el ordenador, por lo que todo apuntaba a ficheros temporales.</p>
]]></content:encoded>
    </item>
    <item>
      <title>KMail: responder por encima del texto citado</title>
      <link>https://gvisoc.com/posts/kmail-responder-por-encima-del-texto-citado/</link>
      <pubDate>Tue, 10 Dec 2024 23:51:40 +0000</pubDate><author>gabriel@gvisoc.com (Gabriel Viso Carrera)</author>
      <guid>https://gvisoc.com/posts/kmail-responder-por-encima-del-texto-citado/</guid>
      <description>Cómo configurar KMail para que tu respuesta salga por encima del texto del correo al que respondes.</description>
      <content:encoded><![CDATA[<p>Si usas <a href="https://apps.kde.org/kmail2/">KMail</a>, el cliente de correo electrónico de <a href="https://kde.org/">KDE</a>, verás que hay una opción sumamente básica que falta: poder responder mensajes <em>encima</em> del texto del correo al que estás contestando. Por más que busques, no encontrarás esa opción.</p>
<p>Para poder colocar la respuesta automáticamente por encima del texto al que respondes, deberás <strong>editar las plantillas por defecto del editor</strong>. Para eso, en <em>Settings</em> → <em>Composer</em> → *Standard Templates, *o sus equivalentes en español, deberás cambiar todas las plantillas de respuesta para que el comando <code>%CURSOR</code> aparezca por encima del comando <code>%QUOTE</code>.</p>
<p>Por ejemplo, la plantilla de responder a todos pasaría de ésto:</p>
<pre><code>%REM=&quot;Default reply all template&quot;%-
On %ODATE %OTIMELONG %OFROMNAME wrote:
%QUOTE
%CURSOR
</code></pre>
<p>A ésto:</p>
<pre><code>%REM=&quot;Default reply all template&quot;%-
%CURSOR

On %ODATE %OTIMELONG %OFROMNAME wrote:
%QUOTE
</code></pre>
<p>Deberás cambiarlas todas. Y para más inri, si usas KMail como un plugin de <a href="https://apps.kde.org/kontact/">Kontact</a>, probablemente debas cambiar estas plantillas en ambas aplicaciones; por alguna razón no hablan entre ellas muy bien. En cualquier caso, ese cambio funciona una vez ambos escenarios reconocen el cambio.</p>
<p>Siendo esta aplicación parte de KDE, entorno de escritorio famoso por la ingente cantidad de opciones que ofrece, que falte algo tan básico es casi un síntoma de la falta de diseñadores de producto colaborando con proyectos de software libre que, por otro lado y desde cualquier punto de vista, son fantásticos.</p>
<p>Aún así, no hace falta buscar muy a fondo en internet para encontrar <a href="https://www.reddit.com/r/kde/comments/jh3ctl/comment/ga3tmr3/">respuestas</a> como la que sigue:</p>
<blockquote>
<p><em>No tiene nada de malo que la comunidad de KDE <em>eduque</em> a usuarios como tú en conceptos avanzados de los clientes de correo electrónico [como las plantillas].
&hellip;
&hellip; entender cómo funcionan las plantillas de texto no es mucho pedir para un usuario de KDE/Plasma. Siempre puedes instalar Thunderbird si piensas diferente.</em></p></blockquote>
<p><strong>Y así es como el software libre pierde usuarios: con respuestas pedantes</strong> que piensan que forzarte a perder el tiempo con algo tan <em>de nicho</em> como un lenguaje de marcado específico de un editor de plantillas de mensajes correo electrónico es más razonable que mejorar un producto con una opción en forma de una casilla de verificación. <strong>Una triste casilla de verificación</strong>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Linux en directo</title>
      <link>https://gvisoc.com/posts/linux-en-directo/</link>
      <pubDate>Sat, 30 Nov 2024 21:47:45 +0000</pubDate><author>gabriel@gvisoc.com (Gabriel Viso Carrera)</author>
      <guid>https://gvisoc.com/posts/linux-en-directo/</guid>
      <description>&lt;p&gt;Empezar con Linux no es un paso &lt;em&gt;trivial&lt;/em&gt; para todo el mundo. Pese a que las cosas son mucho más sencillas que en 1998, o, sin irnos tan allá, que en 2010, hay muchas preguntas que hacerse al respecto.&lt;/p&gt;
&lt;p&gt;El pasado viernes 29 de noviembre estuve instalando Linux en arranque dual con Windows 11, en través de &lt;a href=&#34;https://www.twitch.tv/gvis0c&#34;&gt;twitch&lt;/a&gt;. Y me ha gustado el resultado, tanto que es muy posible que haga muchos más vídeos de ahora en adelante, tanto en directo como &amp;ldquo;producidos&amp;rdquo;.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Empezar con Linux no es un paso <em>trivial</em> para todo el mundo. Pese a que las cosas son mucho más sencillas que en 1998, o, sin irnos tan allá, que en 2010, hay muchas preguntas que hacerse al respecto.</p>
<p>El pasado viernes 29 de noviembre estuve instalando Linux en arranque dual con Windows 11, en través de <a href="https://www.twitch.tv/gvis0c">twitch</a>. Y me ha gustado el resultado, tanto que es muy posible que haga muchos más vídeos de ahora en adelante, tanto en directo como &ldquo;producidos&rdquo;.</p>
<p>El resultado está disponible en PeerTube, en mi cuenta de <a href="https://veedeo.org/a/gvisoc/">veedeo.org</a>, próximamente en YouTube, y lo puedes ver aquí mismo:</p>
<div style="position: relative; padding-bottom: 56.25%; margin-bottom: 1rem; height: 0; overflow: hidden;">
<iframe sandbox="allow-scripts allow-popups" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;"
    src="https://veedeo.org/videos/embed/h5hYmcWPtyDXPmydDu8kFZ?title=0&warningTitle=0&peertubeLink=0" allowfullscreen>
</iframe>
</div>

<p>También he creado, por fin, <a href="https://www.patreon.com/gabrielviso">una cuenta de Patreon</a> para que, quien quiera, pueda apoyar este blog, <a href="https://podcast.gvisoc.com/@sobrelamarcha">el podcast</a> y <a href="https://veedeo.org/a/gvisoc/">los vídeos que iré creando</a> a medida que el tiempo y el material disponible me lo permitan.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Solucionando Problemas de Compatibilidad del Certificado de la FNMT</title>
      <link>https://gvisoc.com/posts/solucionando-problemas-pkcs12/</link>
      <pubDate>Tue, 10 Sep 2024 21:34:34 +0000</pubDate><author>gabriel@gvisoc.com (Gabriel Viso Carrera)</author>
      <guid>https://gvisoc.com/posts/solucionando-problemas-pkcs12/</guid>
      <description>Si tienes un certificado almacenado en un fichero .p12, probablemente no lo puedas importar en un navegador sin realizar algunos cambios primero.</description>
      <content:encoded><![CDATA[<p>Hace unos pocos días tuve que renovar mi certificado digital de la Fábrica Nacional de Moneda y Timbre (España). Como hacía menos de 5 años que me había identificado personalmente en el Consulado Español en Sydney, no tuve que hacer gran cosa y pude realizar todo el proceso en Fedora, siguiendo las instrucciones correspondientes.</p>
<p>Sin embargo, el fichero de copia de seguridad del certificado (formato PKCS #12, de extensión <code>.p12</code>) que generan las herramientas oficiales usa una versión de los algoritmos de cifrado que está considerada obsoleta. Esto genera un fichero aparentemente inservible, imposible de usar en la mayoría de navegadores modernos, como Firefox en mi caso.</p>
<figure>
    <img loading="lazy" src="/images/20240910-errorpkcs12.png"
         alt="Un cuadro de diálogo de error proporcionado por Firefox, en este caso funcionando en Fedora. Dice textualmente &amp;quot;Failed to decode the file. Either is not in PKCS #12 format, has been corrupted, or the password you entered was incorrect&amp;quot;. Tiene un botón &amp;quot;OK&amp;quot;."/> <figcaption>
            <p>&ldquo;Fallo al decodificar el fichero. O bien no está en formato PKCS #12, o está corrupto, o la contraseña proporcionada es incorrecta&rdquo; es el error proporcionado por Firefox al intentar importar el certificado desde el fichero <code>.p12</code> generado por las herramientas de la FNMT.</p>
        </figcaption>
</figure>

<p>Esto te puede estar afectando ya mismo aunque no uses Linux, y aunque no hayas renovado nada.</p>
<ul>
<li>El problema se debe a un cambio en los estándares de seguridad de los navegadores, que busca elevar el nivel de seguridad de este tipo de cosas. Si tienes esta copia de seguridad almacenada en tus archivos y quieres importarla en un navegador moderno, meses o años después de haberla generado, probablemente tengas este problema.</li>
<li>Al ser algo relacionado con la seguridad de forma general, el problema no debería estar limitado a Firefox ni a Linux, y puede estar pasando ahora o en un futuro cercano con Safari, Chrome o Edge en Windows o en macOS.</li>
</ul>
<p>Los siguientes comandos en GNU/Linux producen un fichero <code>certificado.p12</code> que podrás importar en tu navegador. Antes de empezar, algunas notas:</p>
<ul>
<li>
<p><code>VISO_CARRERA_GABRIEL___[NIF].p12</code> es el archivo de certificado con problemas, así que tendrás que usar el nombre de tu propio fichero.</p>
</li>
<li>
<p>Los ficheros <code>.p12</code> están protegidos con contraseña. Necesitarás introducir una contraseña para operar con el fichero <code>.p12</code> con problemas, y fijar una nueva contraseña en el fichero <code>.p12</code> resultado del proceso. Esto no está representado en los comandos siguientes.</p>
<p>openssl pkcs12 -legacy -in VISO_CARRERA_GABRIEL___[NIF].p12 -clcerts -nokeys -out certificado.crt
openssl pkcs12 -legacy -in VISO_CARRERA_GABRIEL___[NIF].p12 -nocerts -out cifrado.key
openssl rsa -in cifrado.key -out privado.key
openssl pkcs12 -export -in certificado.crt -inkey privado.key -out certificado.p12</p>
</li>
</ul>
<p>Un comando por línea.</p>
<p>Una vez hecho esto, <code>certificado.p12</code> podrá ser importado en tus navegadores, sin problema alguno.</p>
<p>Este proceso no me lo he inventado yo, ni lo he descubierto por mi mismo; lo he encontrado en <a href="https://discussion.fedoraproject.org/t/importing-pfx-pkcs12-certificate-fails-on-fedora-but-succeeds-on-windows-11/120349/4">esta respuesta en el foro de la comunidad de Fedora</a>.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Actualiza tu Máquina Virtual de Windows 10 a Windows 11 en VirtualBox</title>
      <link>https://gvisoc.com/posts/actualiza-tu-maquina-virtual-de-windows-10-a-windows-11-en-virtualbox/</link>
      <pubDate>Mon, 15 Jul 2024 23:52:31 +0000</pubDate><author>gabriel@gvisoc.com (Gabriel Viso Carrera)</author>
      <guid>https://gvisoc.com/posts/actualiza-tu-maquina-virtual-de-windows-10-a-windows-11-en-virtualbox/</guid>
      <description>Es hora de ver cómo actualizar tu máquina virtual de Windows 10 a Windows 11, antes de perder el soporte de Microsoft.</description>
      <content:encoded><![CDATA[<p><a href="https://learn.microsoft.com/es-es/lifecycle/products/windows-10-home-and-pro"><strong>En Octubre de 2025 Windows 10 pierde su soporte</strong></a><strong>, y no recibirá más actualizaciones</strong>.</p>
<p><strong>Si usas GNU/Linux en tu día a día pero tienes Windows en una máquina virtual por si las moscas, esto también es un problema</strong> aunque no uses Windows más que una o dos veces al año. Por ejemplo, si usas Windows para entrar en la típica página de la administración porque no has sido capaz de configurar un navegador de forma que funcione correctamente, vas a tener que tener un sistema compatible pero actualizado. No quieres usar un sistema desactualizado, sin parches, etc., para cosas tan sensibles como tu declaración de la renta o gestionar cosas con la Seguridad Social. <strong>Aunque creas que te da igual, no te da igual, y no quieres hacerlo</strong>.</p>
<blockquote>
<p><strong>Para poder llevar a cabo este proceso tu ordenador físico tiene que cumplir con los requisitos de hardware de Windows 11</strong> en términos de microprocesador, módulo de seguridad TPM, y demás. La virtualización es un proceso que comparte dispositivos reales de la máquina física entre distintos sistemas operativos: uno anfitrión, que es el que está instalado sobre la máquina física, y los distintos sistemas operativos huéspedes, instalados en las máquinas virtuales.</p>
<p>Aunque pudiese haber productos que, además de virtualización, tuviesen capadidades de <em>emulación</em> para exponer un chip TPM realizado por software, o para que Windows 11 percibiese un microprocesador de una serie más moderna que el tuyo, VirtualBox no es uno de ellos.</p>
<p>Por lo tanto, <strong>utilizar VirtualBox no te va a servir para instalar Windows 11 en un PC que no esté soportado</strong>.</p></blockquote>
<p>Al igual que actualizar un ordenador a Windows 11, actualizar una máquina virtual tiene sus curvas, sus terraplenes y sus trucos: si cambiamos el <em>hardware virtual</em> de nuestra máquina virtual, nuestra licencia de Windows 10 no será válida, y tendremos que comprar una licencia de Windows 11. No podemos crear otra máquina virtual, instalar Windows 11 y usarlo, porque no tendremos licencia de Windows para ese hardware. Incluso si creamos la máquina virtual con los mismos <em>identificadores de hardware</em>, sospecho que al no haber cambiado de Windows 10 a Windows 11 de forma controlada podríamos tener algún problema de licencia porque la licencia vinculada a esos identificadores de hardware es de Windows 10.</p>
<p>Por si fuera poco, VirtualBox no se caracteriza por ofrecer una experiencia de virtualización de Windows 11 adecuada, ni por facilitar la actualización desde Windows 10:</p>
<ol>
<li>Hasta hace relativamente pocos telediarios, las máquinas virtuales de VirtualBox tenían una definición equivalente a un PC de hace 20 años, y no exagero: BIOS, esquema de particiones MBR, nada que se parezca a un chip TPM es ofrecido a la máquina virtual, el arranque seguro es ciencia-ficción y la EFI &ldquo;<em>sólo es válida para sistemas operativos especiales</em>&rdquo;.</li>
<li>Por las razones arriba expuestas, estas máquinas no soportan Windows 11. Para usar Windows 11 en estas máquinas debías usar <a href="https://blogs.oracle.com/virtualization/post/install-microsoft-windows-11-on-virtualbox">el proceso existente para decirle a Windows que no comprobase sus requisitos de hardware</a>. Esto cae en un terreno gris donde Microsoft no termina de posicionarse, pero siempre ha barajado no permitir que dichos PC recibiesen actualizaciones.</li>
<li>En <strong>VirtualBox 7</strong>, como quien dice, anteayer, Oracle por fin implementó todas las características que requiere Windows 11 de forma nativa y <a href="https://windowsreport.com/virtualbox-7-windows-11/">ya permite definir una máquina virtual con EFI, arranque seguro, TPM 2.0</a> y todas esas otras características.</li>
<li>En una máquina virtual existente, activar esas características permitiría, en teoría, ejecutar el proceso de actualización a Windows 11 sin perder la licencia ni tener que hacer arcanos de terminal ni editar ficheros a mano.</li>
<li>Sin embargo, <strong>activar la EFI, TPM y arranque seguro en nuestra máquina virtual existente la dejará aparentemente inservible, porque no arrancará</strong>.</li>
</ol>
<p><strong>No es un problema tan descabellado</strong>, tiene su sentido, la causa del problema es trivial y, por suerte, <strong>tiene fácil solución</strong>. El problema es que la máquina no encuentra el sistema operativo: el disco donde está Windows 10 es un disco formateado con un esquema de particiones MBR, típico de la época de los PC con BIOS, mientras que los PC con EFI espera discos formateados con esquema de particiones GPT.</p>
<p>Así pues, <strong>para poder activar la EFI hay que</strong> <a href="https://www.windowscentral.com/how-convert-mbr-disk-gpt-move-bios-uefi-windows-10"><strong>convertir la tabla de particiones de un disco desde MBR a GPT</strong></a>. Para ello y como se discute en el enlace anterior, Microsoft proporciona un programa llamado <code>mbr2gpt.exe</code>. Afortunadamente, todas las instalaciones de Windows 10 que conserven su partición de recuperación lo tienen disponible, y las instalaciones hechas en VirtualBox no son una excepción. Además, y por si las moscas, ese programa está incluido en todas las imágenes de DVD o de memoria USB que usaríamos para reparar, actualizar o restaurar el sistema.</p>
<p>Esto es lo que hay que hacer específicamente en Virtual Box:</p>
<ul>
<li>
<p>Actualiza tu instalación de Windows 10 hasta la última actualización disponible.</p>
</li>
<li>
<p><strong>Realiza una copia de seguridad de tus ficheros</strong>, por si la conversión desde MBR a GPT fallase por alguna razón y debieras reinstalar Windows 10.</p>
</li>
<li>
<p><strong>Recuerda: tu licencia está vinculada a Windows 10</strong>. Hasta que no tengas un sistema actualizado a Windows 11 y con Windows 11 activado, <em>creo que</em> no puedes formatear e instalar Windows 11 desde cero.</p>
</li>
<li>
<p>Descarga el programa de creación de medios de instalación de Microsoft para crear dos medios de instalación en formato ISO: <code>Windows 10.iso</code> y <code>Windows 11.iso</code>.</p>
</li>
<li>
<p>Reinicia tu sistema operativo en modo recuperación pulsando la tecla de mayúsculas mientras pinchas en el botón <strong>Reiniciar</strong> de Windows 10</p>
</li>
<li>
<p>Alternativamente, utiliza cualquiera de las ISO que acabas de descargar para reparar el sistema.</p>
</li>
</ul>
<p><img alt="La imagen muestra la pantalla de bienvenida de Windows 11 que aparece al arrancar desde la ISO que hemos descargado. Abajo a la izquierda, vemos una opción para reparar el sistema, que nos llevará a las mismas pantallas y opciones que ofrece la partición de recuperación de Windows 10." loading="lazy" src="/images/20240715-isorepair.png">La ISO de Windows 11 ofrece opciones para reparar el sistema, igual que la partición de recuperación de Windows 10.</p>
<ul>
<li>
<p>En este entorno, abre un intérprete de comandos (<em>Troubleshoot</em> &gt; <em>Advanced Options</em> &gt; <em>Command Prompt</em> o algo como <em>Solución de Problemas</em> &gt; <em>Opciones Avanzadas</em> &gt; <em>Intérprete de Comandos</em>) y ejecuta los comandos siguientes:</p>
<p>mbr32gpt /validate</p>
</li>
</ul>
<p>Comando para validar tu unidad de disco. Si todo va bien, la salida del programa terminará con <code>MBR2GPT: Validation completed successfully.</code></p>
<pre><code>mbr2gpt /convert
</code></pre>
<p>Comando para convertir tu unidad de disco desde MBR a GPT. Si todo va bien, la salida del programa terminará con <code>MBR2GPT: Conversion completed successfullyMBR2GPT: Update WinRE config fileMBR2GPT: Before the new system can boot properly you need to switch the firmware to boot to UEFI mode!</code></p>
<p><img loading="lazy" src="/images/20240715-recovery.png"></p>
<p><img loading="lazy" src="/images/20240715-recovery2.png"></p>
<p><img loading="lazy" src="/images/20240715-recovery3.png"></p>
<p><img loading="lazy" src="/images/20240715-cmd.png"></p>
<p><img loading="lazy" src="/images/20240715-cmd2.png"></p>
<p>Diferentes pantallas del proceso explicado en los puntos anteriores, donde podemos ver el aspecto del proceso de recuperación y la salida de los comandos.</p>
<ul>
<li><strong>Apaga la máquina virtual de forma ordenada</strong> y, en VirtualBox, cambia la configuración para que EFI, Arranque Seguro (<em>Secure Boot</em>), el chip TMP 2.0 y la aceleración de gráficos en 3D estén activadas en el siguiente arranque.</li>
</ul>
<p><img alt="La imagen muestra la pantalla de opciones de la máquina virtual de Windows 10, en Virtual Box, en la pestaña &quot;System&quot;, donde deberemos seleccionar &quot;Enable EFI (special OSes only)&quot; y &quot;Enable Secure Boot&quot;" loading="lazy" src="/images/20240715-uefitpm.png">Activando las opciones EFI y Secure Boot.<img alt="En la imagen vemos otra de las pestañas de opciones de la máquina virtual de Windows 10 en VirtualBox, &quot;Display&quot;, donde deberemos activar &quot;Extended features: Enable 3D Acceleration&quot;. También dotaremos a la máquina virtual de suficiente memoria de vídeo, en &quot;Video Memory&quot;, desplazando el selector hasta el máximo de 256 MB." loading="lazy" src="/images/20240715-3daccel.png">Activando la aceleración 3D, y dotando a la máquina de suficiente memoria de vídeo (256 MB, que es el máximo)</p>
<ul>
<li><strong>Arranca la máquina virtual</strong>. El sistema debería arrancar perfectamente y funcionar como si nada.</li>
<li>Actualiza Windows 10 una vez más.</li>
</ul>
<p>Windows seguirá diciendo que tu sistema no es compatible con Windows 11, y sólo obtendrás actualizaciones de Windows 10. Esto no es cierto gracias a los cambios que hemos llevado a cabo en la máquina: mi sospecha es que el programa de compatibilidad que Microsoft ha escrito tiene una base de datos de fabricantes reconocidos que no está preparado para máquinas virtuales. Pero esto no es un problema, porque tenemos una ISO de Windows 11 y podremos iniciar el proceso pese a todo.</p>
<ul>
<li><strong>Monta la ISO de Windows 11 en la unidad de DVD que tiene tu máquina virtual</strong>.</li>
<li><strong>Ábrela con el Explorador de Ficheros</strong> y ejecuta el programa <code>setup.exe</code>.</li>
</ul>
<p><img alt="Imagen de una ventana del Explorador de Ficheros de Windows 10, mostrando los contenidos de un DVD. El DVD se llama &quot;ESD-ISO&quot; y es el resultado de montar la imagen de DVD de Windows 11 en Virtual Box. En el panel derecho de la ventana se muestran varias carpetas y ficheros, y está seleccionado &quot;setup.exe&quot;." loading="lazy" src="/images/20240715-win11-setup.png">Programa de instalación de Windows 11, en el Explorador de Ficheros de Windows 10</p>
<ul>
<li>Selecciona las opciones adecuadas para conservar tus ficheros y aplicaciones (o no), y actualizar el sistema.</li>
</ul>
<p>Si todo te ha ido igual de bien que a mí, deberías tener una máquina virtual con Windows 11 donde todos los requisitos están cumplidos, la activación del sistema es correcta y está vinculada a tu cuenta de Microsoft.
<img alt="En la imagen se muestra la ventana de Virtual Box con escritorio de Windows 11. Los marcos de la ventana son los de Gnome, por lo que la máquina virtual está funcionando en Linux. Dentro de la máquina virtual hay una ventana abierta que muestra el detalle del chip TPM que le es ofrecido. Se muestran varios detalles, como el fabricante (IBM), especificaciones, y demás." loading="lazy" src="/images/20240715-win11tpmdetails.png">Detalle de la máquina virtual Windows 11 mostrando los detalles del chip TPM que le es ofrecido.
Es hora de actualizarla una última vez para recibir actualizaciones específicas de Windows 11, crear una copia de seguridad de acuerdo a tu propia estrategia, y dedicarte a cosas más productivas.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Un año con un Framework 13</title>
      <link>https://gvisoc.com/posts/doce-meses-con-el-framework/</link>
      <pubDate>Wed, 26 Jun 2024 08:03:04 +0000</pubDate><author>gabriel@gvisoc.com (Gabriel Viso Carrera)</author>
      <guid>https://gvisoc.com/posts/doce-meses-con-el-framework/</guid>
      <description>Tengo un Framework 13 y durante un año lo he usado para todo. Ésta es mi retrospectiva.</description>
      <content:encoded><![CDATA[<p>Normalmente todas las primeras impresiones son buenas, pero muchas veces nos falta esa retrospectiva tras mucho tiempo de uso. Este artículo da cuenta de cómo de bien me ha ido con este portátil tras algo más de un año de uso intensivo y como ordenador principal, siempre ejecutando y desempeñando todas mis tareas en Linux, haciendo hincapié en las cosas buenas y las no tan buenas.</p>
<h2 id="compatibilidad-con-linux-gnulinux">Compatibilidad con Linux GNU/Linux</h2>
<p>A día de hoy y con la distribución que uso, que es <a href="https://fedoraproject.org">Fedora</a> en alguna de sus variantes, la compatibilidad es total, excepto con el lector de pantalla. No hay ningún dispositivo que no funcione; sin embargo, para que todo funcione <em>bien</em>, debemos tener en cuanta algunas cosas y, dependiendo de nuestras elecciones, hacer algunos ajustes.</p>
<blockquote>
<p>🐧 Como siempre, pero esperemos que por poco tiempo, GNU/Linux tiene sus servidumbres.</p></blockquote>
<p>Esta sección no trata de desanimarte, sino todo lo contrario porque todos los problemas que detallo aquí son salvables de una u otra forma; sin embargo, y para poder disfrutar de un portátil Framework, conviene leer este apartado.</p>
<p>Lo primero es que debemos escoger la mejor distribución para nuestras necesidades de accesibilidad: <strong>Fedora funciona bien para mí, pero no para una persona que necesite un lector de pantalla</strong>. Fedora utiliza Wayland por defecto, que es el protocolo de gestión de ventanas y gráficos destinado a reemplazar a X, que acaba de cumplir 40 años y tiene toda una serie de problemas. Lamentablemente, Wayland rompe la compatibilidad con los lectores de pantalla de Linux, y aunque <a href="https://blogs.gnome.org/a11y/2024/06/18/update-on-newton-the-wayland-native-accessibility-project/">se está trabajando en restaurar la accesibilidad</a>, el trabajo no está terminado. <strong>Si necesitas usar un lector de pantalla te recomiendo que evites Fedora por el momento</strong> y que uses otra distribución que utilice X por defecto, como <a href="https://pop.system76.com/">Pop!_OS</a> o <a href="https://linuxmint.com/">Linux Mint</a> en alguna de sus variantes.</p>
<p>En cualquier otro caso, este portátil requiere usar Wayland por la mera razón de que la pantalla tiene una resolución demasiado alta. Aunque parezca contradictorio, es aquí es donde nos podemos desanimar un poco.</p>
<ul>
<li>Con la pantalla que trae este portátil, <em>necesitas</em> escalado fraccionado. Si no configuras una ampliación a 125% ó 150%, la resolución nativa del portátil es tan alta que no vas a poder trabajar.</li>
<li>Esto no funciona bien, o no funciona en absoluto, con X.</li>
<li>Si usas Linux con Wayland, el escalado fraccionado funciona bien en KDE por defecto, queriendo decir &ldquo;bien&rdquo; que las aplicaciones se ven nítidas. Da igual lo antiguas que sean las aplicaciones: en general se ven todas igual de nítidas.</li>
<li>En Gnome, sin embargo, vas a tener que arreglar las aplicaciones <em>antiguas</em> una por una, añadiendo parámetros por línea de comandos en aquellas aplicaciones que se vean borrosas.</li>
</ul>
<p>Por aplicaciones <em>antiguas</em> me refiero a aquellas aplicaciones que todavía no se han adaptado nativamente al uso de Wayland como protocolo de pantalla.</p>
<p>A continuación una imagen donde se puede comparar &ldquo;aplicación borrosa&rdquo; con &ldquo;aplicación que se ve bien&rdquo;: se trata de una superposición de la misma web mostrada en Firefox (al fondo, nítida) con la misma web mostrada por una aplicación que no está corregida para usar el escalado fraccionado moderno, implementado por Wayland (en primer plano, texto borroso):</p>
<figure class="ma0 w-75">
    <img loading="lazy" src="/images/20240626-hidpiblur.png"
         alt="Superposición de una web en la que se aprecia el efecto del escalado fraccionado mal realizado (en primer plano), superpuesta sobre la web correctamente representada por una aplicación que sí está adaptada al escalado fraccionado moderno (con Wayland)."/> <figcaption>
            <p>Superposición de una web en la que se aprecia el efecto del escalado fraccionado mal realizado (en primer plano), superpuesta sobre la web correctamente representada por una aplicación que sí está adaptada al escalado fraccionado moderno (con Wayland).</p>
        </figcaption>
</figure>

<p>Parece una diferencia trivial, pero cuando la ves y tu cerebro aprende a distinguirla sin esfuerzo, no es algo que puedas &ldquo;<em>desver</em>&rdquo;. Echa por tierra la experiencia de usuario que, de otra forma, disfrutarías con esta pantalla.</p>
<p>Este problema, como señalaba antes, afecta predominantemente a Gnome. Aún así, con la excepción de las aplicaciones que utilizan Java para la gestión de gráficos, como los entornos de programación integrados de JetBrains, he podido solucionar todo actuando sobre cada aplicación. Esto se hace añadiendo opciones adicionales por línea de comandos en sus accesos directos; sin embargo, al tener que hacerlo aplicación por aplicación, es algo que se lleva su trabajo. Si no estás por la labor, este asunto me llevaría a recomendarte evitar Gnome y usar KDE. Si prefieres Gnome y necesitas ayuda, escríbeme un comentario por aquí mismo o <a href="https://fedi.gvisoc.com/@gabriel">por mastodon</a>, y te ayudaré hasta donde pueda.</p>
<p>En cualquier otro aspecto, la experiencia que ofrece este portátil con GNU/Linux es impecable. Con un mínimo de configuración opcional, <em>para dejar las cosas a nuestro gusto</em>, tanto Fedora Workstation como los <em>spins</em> con KDE, o las versiones atómicas Silverblue (Gnome) y Kinoite (KDE) encajan como un guante.</p>
<h2 id="ampliabilidad-y-reparabilidad-a-prueba-de-torpes">Ampliabilidad y reparabilidad a prueba de torpes</h2>
<p>La realidad es que <strong>tengo un portátil que es más fácil de montar y desmontar que mi sobremesa</strong>.</p>
<p>Y no exagero: allá por 2017 cometí el error de comprarme un sobremesa primero y la tarjeta gráfica después. Esto me llevó a descubrir que, según la tarjeta gráfica que quieras, no vale cualquier fuente de alimentación: la fuente de alimentación que había montado no tenía salidas de alimentación suficientes como para conectar una Nvidia GTX 1070. Para cambiar la fuente de alimentación tuve que desmontar todo el sobremesa y las pasé canutas con la cantidad de tornillos y cables, y la gestión de los mismos. De hecho, me sobró un tornillo que tengo guardado por ahí.</p>
<p>Sin embargo, el Framework se monta y desmonta con un solo destornillador, la organización del interior es excelente, y cada componente tiene un código QR que te lleva a la guía de instalación o reemplazo de cada uno. La batería se desconecta automáticamente cuando detecta que el dispositivo está abierto, y el portátil no tiene clips de presión: todo se ensambla o bien con el destornillador que trae, o bien se fija con imanes. Como prueba, un vídeo de <a href="https://www.ifixit.com">iFixIt</a> (en inglés) en el que actualizan la pantalla, placa base y batería de un Framework de primera generación a los componentes que vienen con el modelo que tengo:</p>
<p><div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
      <iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/U-yzFxpQLgs?autoplay=0&amp;controls=1&amp;end=0&amp;loop=0&amp;mute=0&amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"></iframe>
    </div>
 </p>
<p>El vídeo está extremadamente resumido, pero por propia experiencia os puedo decir que los 20 minutos que menciona el presentador se pueden convertir, todo lo más, en 30 si tienes que pensarte las cosas dos veces y consultar las instrucciones para mayor seguridad. Fácil, divertido y responsable con tu bolsillo y el planeta.</p>
<p>Montar un sobremesa con la misma facilidad es difícil y sale más caro, porque vas a necesitar cajas mejores, y fuentes de alimentación modulares para evitar manojos de cables por ahí colgando. El diseño mecánico de cajas y componentes fáciles de cambiar, y que encajen bien entre ellos sin hacer encaje de bolillos, es de suponer, tiene un precio.</p>
<p>Pese a estas posibilidades, el acabado se nota muy bueno, y la rigidez de todo el conjunto es mucho más alta de lo que personalmente me podía imaginar. No hay crujidos ni zonas donde el portátil dé la impresión de ser frágil.</p>
<h2 id="el-hardware">El <em>hardware</em></h2>
<p><strong>La pantalla</strong> que escogí es la de acabado mate. Es una pantalla IPS que ofrece brillo superior a 400 *nit *(<a href="https://es.wikipedia.org/wiki/Candela_por_metro_cuadrado">candelas por metro cuadrado</a>) y un contraste superior a 1500:1.</p>
<p>Cubre el rango del <a href="https://es.wikipedia.org/wiki/Espacio_de_color_sRGB">espacio de color sRGB</a> al 100% y tiene una resolución de <strong>2256×1504</strong> píxels en sólo 13.5 pulgadas. La resolución arroja una densidad aproximada de <strong>200 puntos por pulgada</strong>, que para la distancia normal de uso de un portátil (aproximadamente 50 cm.), hace muy difícil que la imagen resulte pixelada. Por otro lado, obliga a usar escalado fraccionado de gráficos para que el tamaño del texto y los controles resulte razonable. Mientras que en Windows esto es un simple ajuste, con Linux tuvimos que remangarnos un poquito más, como ya he comentado. La <strong>relación de aspecto es 3:2</strong>, quizá no tan cómoda para ver películas como una 16:9, pero mejor para trabajar, porque cabe más texto en vertical.</p>
<figure class="ma0 w-75">
    <img loading="lazy" src="/images/20240626-fmwkscreen.jpg"
         alt="Fotografía de la pantalla donde se puede apreciar que, con la resolución de la misma, los píxeles de la imagen no son visibles ni en las distancias cortas"/> <figcaption>
            <p>Fotografía de la pantalla donde se puede apreciar que, con la resolución de la misma, los píxeles de la imagen no son visibles ni en las distancias cortas</p>
        </figcaption>
</figure>

<p><strong>La batería</strong> es de 61Wh pero se queda en un aprobado. Mientras que su autonomía cumple, proporcionando unas 12 horas escribiendo texto con poco brillo en la pantalla, el soporte a umbrales de carga y a características de cuidado de la misma se queda muy corto en comparación a las baterías de otros portátiles profesionales, como los ThinkPad. Es de esperar que tanto la controladora de la propia batería, como el <em>software</em> proporcionado por Framework, y la eficiencia de los microprocesadores mejoren en un espacio de dos o tres generaciones hasta darnos una eficiencia que pueda acercarse a la de un Apple Silicon, y el control esté a la altura de un ThinkPad, pero por ahora esto es lo que hay. Lo bueno es que, cuando estas cosas vayan mejorando, portátiles como el Framework podrán irlas adquiriendo componente a componente, y no teniendo que reemplazar el equipo entero.</p>
<p><strong>El <em>trackpad</em></strong>, creo, es lo peor que tiene el portátil. No porque tenga un tamaño o una respuesta inadecuadas; al contrario, soporta gestos con tres y cuatro dedos de forma ágil y precisa. Es por el rechazo de palma: al menos con Linux, el rechazo de la palma de la mano es realmente malo, lo cual quiere decir que en medio de un texto puedes mover el ratón, seleccionando texto, escribiendo encima, y estropeando constantemente el flujo de trabajo. Y es que el controlador no soporta ningún mecanismo de ajuste de presión o de sensibilidad, así que la única solución que he encontrado para esto ha sido ponerme manos a la obra y configurar un atajo de teclado para desactivarlo cuando necesito escribir textos largos, como es este caso, programando un pequeño <em>script</em> al que poder asociar una combinación de teclas (Meta+T, en mi caso) en Gnome.</p>
<pre><code>#!/bin/sh

state=$(gsettings get org.gnome.desktop.peripherals.touchpad send-events)

if [ &quot;$state&quot; == &quot;'enabled'&quot; ];then
	gsettings set org.gnome.desktop.peripherals.touchpad send-events disabled
else
	gsettings set org.gnome.desktop.peripherals.touchpad send-events enabled
fi
</code></pre>
<p><strong>El rendimiento</strong> no merece demasiado comentario porque es excelente. Con un <strong>Intel Core i7-1360P</strong> a <strong>5 GHz</strong> con 64 GB de RAM, no hay nada que <em>yo</em> necesite ejecutar con lo que se quede corto, y el microprocesador tiene una cantidad de núcleos suficiente (4 de alto rendimiento y 8 de alta eficiencia) como para ser un microprocesador excelente a la hora de utilizar contenedores y máquinas virtuales. Como referencia para los usuarios de Macintosh podríamos decir que, sin tener en cuenta el ancho de banda de acceso a memoria, el rendimiento de este microprocesador se sitúa entre el Apple M2 y el M2 Pro. Una nota negativa es que, pese a que el microprocesador soporta DDR5 y LPDDR5, la placa base de Framework para este modelo sólo porta DDR4. Esto afecta no sólo a la velocidad alcanzable, sino también al consumo de energía del ordenador. Eso sí, el kit de placa y procesador sólo tiene un ventilador, y cuando sopla, sopla de verdad. Con tareas exigentes este portátil no es silencioso en absoluto.</p>
<p>El <strong>almacenamiento</strong> que le he puesto ha sido un módulo <strong>Crucial P5 Plus PCIe 4</strong>, de 2 TB, en lugar de los Western Digital que ofrece Framework, porque éstos no ofrecen cifrado por <em>hardware</em> y el Crucial sí. El cifrado por <em>hardware</em> funciona como sigue: el disco está siempre cifrado, hagas lo que hagas, pero de fábrica no solicita ninguna contraseña en el arranque. Cuando, en la UEFI / BIOS de tu ordenador, configuras una contraseña para el disco, lo conectes al ordenador que lo conectes, si no introduces la contraseña correcta el disco es ilegible. Esto permite configurar la seguridad de forma independiente al sistema operativo, con el inconveniente de que perdemos algo de velocidad. Por poner valores concretos, los módulos que vende Framework ofrecen una velocidad de lectura secuencial de 7300 MB/s, mientras que el Crucial que he montado ofrece 6600 MB/s. En mi caso personal, el cifrado por <em>hardware</em> vale más que los 700 MBps que he entregado a cambio.</p>
<p><strong>El teclado</strong> es muy bueno. Teclas y recorrido amplio, buen tacto y respuesta sólida. Con una retroiluminación que aparece bajo las teclas, sin resaltar los glifos en las teclas, pero que, aún así, resuelve. Personalmente lo sitúo como bastante mejor que el teclado de los Macbook Pro actuales (uso un M3 en el trabajo) pero por debajo del teclado de los ThinkPad que, en mi opinión, está próximo a ser perfecto. Sin embargo, tiene dos defectos: uno cosmético y otro funcional.</p>
<ul>
<li>Cosméticamente, es un teclado con la tecla de Windows. En Linux, esa tecla se llama Meta y no necesita estar <em>marcada</em> con el logotipo de Windows, ni con ningún otro. Es un modificador de teclado más. Actualmente (2024), Framework está preparando kits de teclado con una tecla Meta agnóstica del fabricante del sistema operativo, pero cuando compré el portátil no estaba disponible.</li>
</ul>
<figure class="ma0 w-75">
    <img loading="lazy" src="/images/20240626-fmwkkeyb.jpg"
         alt="Fotografía del teclado de mi portátil framework. Se puede ver la tecla de Windows en primer término, y la retroiluminación está activada"/> <figcaption>
            <p>Un teclado más con la tecla de Windows: ¡qué tristeza!</p>
        </figcaption>
</figure>

<ul>
<li>El defecto funcional es que no tiene un indicador luminoso del estado de las teclas de función (<strong>Fn</strong>). En este teclado, como en muchos otros, tenemos las teclas F1 a F12 con doble comportamiento: F1 a F12, o extensiones como el control de volumen, brillo de la pantalla, etc. Estos modos se pueden bloquear mediante Fn+ESC, pero no hay ningún indicador visual que te diga, antes de pulsar la tecla F1, si se va a abrir la ayuda (F1), o si se va a poner el sonido en mudo (<em>mute</em>). Y esto no es algo que se pueda arreglar con extensiones o controladores, porque a diferencia de indicadores como el bloqueo de mayúsculas, y demás modificadores estándares, éste ocurre en el <em>hardware</em> del teclado sin exponer ningún indicador al sistema operativo.</li>
</ul>
<p>El <strong>lector de huellas</strong> es realmente bueno. Rápido, fácil de configurar y con un soporte en Linux excelente, me ahorra una cantidad de tiempo increíble. En Linux se puede usar el lector de huellas en la Terminal, a diferencia de en macOS que hay que teclear la contraseña cada vez que tenemos que usar <code>sudo</code>.</p>
<p><strong>El sonido</strong> ni impresiona ni molesta, lo mismo que la cámara web a 1080p y 60 Hz. El micrófono es suficiente como para tener una conversación inteligible.</p>
<hr>
<h2 id="conclusión">Conclusión</h2>
<p>No puedo estar más contento con este portátil. Es ligero, razonablemente <em>bonito</em>, y con unas prestaciones y una calidad muy altas.</p>
<p>La compatibilidad con GNU/Linux, que define en muchos aspectos lo que yo necesito y quiero, es excelente y sólo puede mejorar.</p>
<p>En cuanto a lo que distingue este portátil de otros: su reparabilidad y ampliabilidad, merecen mucho la pena. En mi caso concreto, y salvo que necesite un dispositivo con mayor capacidad gráfica, este es en teoría el portátil definitivo: todo lo que a día de hoy me disgusta, lo que se rompa o lo que se quede corto se podrá cambiar, y en muchos casos reutilizar de alguna forma. Mientras la compañía sobreviva, estas características compensan con creces el sobreprecio que suponen en comparación con otras alterantivas menos reparables o, directamente, de usar y tirar.</p>
<p>Los puntos negativos, como el <em>trackpad</em>, el rendimiento por watio, el control de la batería y lo ruidoso del ventilador son cosas de las que el fabricante es consciente y se irán superando.</p>
]]></content:encoded>
    </item>
    <item>
      <title>¿Recuerdas Recuerdos?</title>
      <link>https://gvisoc.com/posts/recuerdos-recap/</link>
      <pubDate>Sat, 15 Jun 2024 21:35:29 +0000</pubDate><author>gabriel@gvisoc.com (Gabriel Viso Carrera)</author>
      <guid>https://gvisoc.com/posts/recuerdos-recap/</guid>
      <description>La cosa pinta mal.</description>
      <content:encoded><![CDATA[<p>Escribí hace unas semanas acerca de <a href="https://gvisoc.com/posts/windows-recall/">Recuerdos de Microsoft Windows</a>, y cómo la cosa pintaba muy mal. El caso es que desde entonces estuve ocupado montando <a href="https://gvisoc.com/posts/migrar-un-podcast-a-castopod/">un ataque de denegación de servicio distribuido a mi casa</a>, reencontrándome con algunos de mis videojuegos y, en fin, ocupado en diversos menesteres.</p>
<p>Desde los primeros anuncios de Recuerdos / Recall, la cosa ha estado muy movida y muy loca. Escribo este artículo a modo de cronología, en parte para darle un poco de seguimiento a lo que escribí en su día, pero sobre todo para poder aparcar este tema.</p>
<ul>
<li>
<p>Microsoft anuncia <a href="https://gvisoc.com/posts/windows-recall/">recuerdos</a></p>
</li>
<li>
<p>Numerosos expertos en ciberseguridad y derechos humanos critican este mecanismo porque no ofrece la seguridad y privacidad que cabría esperar.</p>
</li>
<li>
<p>¿Derechos humanos? Sí: un PC con Recuerdos activado es muy atractivo en regímenes autoritarios y estados policiales, además de otras situaciones como <a href="https://hachyderm.io/@evacide/112481894385686328">violencia doméstica donde un usuario pueda ser coaccionado</a> o torturado para dar acceso al contenido de recuerdos.</p>
</li>
<li>
<p>Microsoft y <a href="https://www.windowscentral.com/software-apps/windows-11/microsoft-has-lost-trust-with-its-users-windows-recall-is-the-last-straw">sus seguidores dentro de la prensa tratan de quitar hierro al asunto, interpretando este rechazo como un error de comunicación de Microsoft</a>, haciendo énfasis en las premisas que deberían hacer seguro a Recuerdos: las capturas de pantalla se almacenan cifradas mediante Bitlocker, un atacante debería ganar acceso a tu ordenador, etcétera.</p>
</li>
<li>
<p>Numerosos analistas consiguen reventar el chisme por todas partes, siendo el más notorio dentro del grupo al que yo sigo, <a href="https://fedi.gvisoc.com/@GossiTheDog@cyberplace.social/112563053447938707">Kevin Beaumont</a>.</p>
</li>
<li>
<p>Al parecer, la información de las capturas de pantalla se procesa mediante reconocimiento óptico de caracteres (OCR) y se guarda en una base de datos <a href="https://www.sqlite.org/index.html">SQLite</a> sin cifrar.</p>
</li>
<li>
<p>Un usuario que sepa dónde está guardado el fichero SQLite puede acceder a él símplemente aceptando un diálogo de control de acceso de usuarios (UAC) de Windows. El usuario no tiene que tener permisos de administrador.</p>
</li>
<li>
<p>Al estar la información dentro de SQLite en texto claro, si se tiene acceso a ésta, no importa que la máquina tenga activado Bitlocker o no. Accediendo localmente a este fichero o copiándolo a otra máquina, la actividad del usuario estaría completamente expuesta.</p>
</li>
<li>
<p><a href="https://infosec.exchange/@tiraniddo/112566044174482506">Programando es incluso más fácil</a></p>
</li>
<li>
<p>Más o menos al mismo tiempo, Microsoft empieza a darse cuenta del fiasco y a <a href="https://www.theverge.com/2024/6/7/24173499/microsoft-windows-recall-response-security-concerns">cambiar el enfoque añadiendo medidas adicionales</a> que pasan por esperar a que el usuario lo active (en lugar de activarlo por defecto), y por proteger el acceso a Recuerdos mediante <a href="https://www.microsoft.com/en-us/windows/tips/windows-hello">Windows Hello</a> (un autenticador <a href="https://fidoalliance.org/how-fido-works/">FIDO2</a> basado en biometría).</p>
</li>
<li>
<p>Empieza a haber <a href="https://freeradical.zone/@funnymonkey/112580980411040919">preocupación</a> acerca de tener activado recuerdos en un entorno profesional que maneje datos personales y datos sensibles de sus clientes, ya que la falta de seguridad de este mecanismo hace que un atacante ni siquiera tenga que esforzarse en buscar los datos en diferentes documentos: toda la información de interés estaría contenida en un único punto.</p>
</li>
<li>
<p>Al final el impacto es tan negativo que <a href="https://www.reuters.com/technology/artificial-intelligence/microsoft-delay-release-recall-ai-feature-security-concerns-2024-06-14/">Recuerdos se retrasa oficialmente</a> y no estará disponible en los primeros PC Copilot+.</p>
</li>
</ul>
<p>¿En qué quedará la cosa? Personalmente espero que sepan encontrar un equilibrio entre seguridad y comodidad, porque por muy atractivo que Recuerdos pueda parecer a usuarios privilegiados (esto es, sin problemas) del primer mundo, la cosa está muy verde.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Migrar un Podcast de Spotify a Castopod</title>
      <link>https://gvisoc.com/posts/migrar-un-podcast-a-castopod/</link>
      <pubDate>Fri, 24 May 2024 12:00:05 +0000</pubDate><author>gabriel@gvisoc.com (Gabriel Viso Carrera)</author>
      <guid>https://gvisoc.com/posts/migrar-un-podcast-a-castopod/</guid>
      <description>Recuperando el control sobre las cosas que siempre debieron pertenecernos.</description>
      <content:encoded><![CDATA[<p>Empecé <a href="https://podcast.gvisoc.com/@sobrelamarcha">sobre la marcha</a> en 2017, al poco de llegar a Australia. Por aquél entonces, una red social de segmentos de 2 minutos llamada Anchor viraba su rumbo y abrazaba el podcasting como siguiente paso lógico en su estrategia. El funcionamiento era original e innovador: durante un espacio de 24 horas, los segmentos de 2 minutos y las contestaciones de tus contactos, de 1 minuto, se iban añadiendo a tu <em>emisora</em> de Anchor. Cuando terminaba el día, podías optar por publicar todo el contenido del día en un feed RSS: ya tenías tu podcast.</p>
<p>Era genial.</p>
<p>Entonces, llegó Spotify, primero como inversor, y luego comprando Anchor. Al poco tiempo, todas las características sociales y el funcionamiento que comentaba arriba, como la <em>emisora</em>, desaparecieron del producto y nos quedamos con una plataforma de podcasting solvente, y nada más.</p>
<p>No voy a dar cuenta en detalle del proceso de <a href="https://gvisoc.com/posts/enmierdificacion/">enmierdificación</a> de Spotify en este artículo, sino que me voy a limitar a decir que no estoy cómodo en esa plataforma desde hace tiempo, y he decidido <a href="https://gvisoc.com/posts/personal-y-rapido/">autoalojar en casa</a> mi propio podcast. El soporte a mi podcast me lo da ahora <a href="https://castopod.org/">Castopod</a>, una plataforma de podcasting libre y de código abierto que, además, ofrece integración con el fediverso mediante Activity Pub y soporte a múltiples características del <a href="https://podcasting2.org/">podcasting 2.0</a>, como la posibilidad de dejar comentarios desde tu propia aplicación de escucha de podcasts entre otras cosas.</p>
<p>Vamos a ver cómo se migra un podcast a Castopod. En este artículo se trata de Spotify, pero el proceso va a ser muy similar en cualquier otro caso.</p>
<h2 id="obtén-castopod">Obtén Castopod</h2>
<p>Castopod está disponible para instalar en tu propio servidor, que puede ser una VPS o una máquina sencilla conectada a internet, o puedes contratarlo en varios proveedores especializados. En <a href="https://castopod.org/">castopod.org</a> tienes acceso a información acerca de todas las opciones. Yo lo he instalado en un mini PC, en mi casa, usando Docker y NGINX como proxy inverso. Publicaré algo al respecto en lo sucesivo, pero hoy me voy a centrar en el <strong>proceso de salida de Spotify</strong>.</p>
<h3 id="opcional-obtén-tu-propio-dominio-y-si-es-posible-una-cdn">Opcional: obtén tu propio dominio y, si es posible, una CDN</h3>
<p>Si lo vas a instalar en tu casa, vas a necesitar un dominio. Si lo usas ofrecido por alguno de los proveedores, probablemente puedas usar un subdominio proporcionado por ellos.</p>
<p>En cualquier caso, como un podcast sirve archivos de cierto peso, es buena idea contratar un servicio que te ofrezca una red de distribución de contenidos (CDN) con presencia en múltiples geografías: actuará de caché, relajando los requisitos de ancho de banda de tu proveedor, y además acelerará el acceso a tu podcast desde geografías lejanas. Personalmente, uso la cuenta gratuita de Cloudflare para los dos asuntos: dominio y CDN.</p>
<h2 id="importa-tu-podcast-en-castopod">Importa tu Podcast en Castopod</h2>
<p>Una vez Castopod está funcionando en tu servidor, es hora de importar tu podcast en Castopod. Esto se hace indicando la dirección del feed RSS a Castopod en su panel de control, así como el nombre de usuario en el fediverso, la categoría y el idioma del contenido.</p>
<figure class="ma0 w-75">
    <img loading="lazy" src="/images/20240524-castopodimport.png"
         alt="Formulario de importación de un podcast en Castopod. Permite introducir la dirección del feed, indicar el idioma, la categoría y el nombre de usuario de la cuenta en el fediverso."/> <figcaption>
            <p>Formulario de importación de un podcast en Castopod.</p>
        </figcaption>
</figure>

<p>![)Formulario de importación de un podcast en Castopod
Es importante tener en cuenta que Castopod va a reinterpretar todo el feed y a validarlo. Uno de los problemas que tuve derivados de este aspecto es que, si a alguno de tus episodios le faltan las notas (el contenido del campo <code>&lt;description /&gt;</code>), el proceso va a fallar, tendrás que corregir el episodio en concreto, esperar a que Spotify republique tu feed, y reanudar el proceso donde se interrumpió. En mi caso, llevó unos cuantos intentos:</p>
<figure class="ma0 w-75">
    <img loading="lazy" src="/images/20240524-castopodimportlog.png"
         alt="Pantalla de Castopod que muestra diferentes intentos de importar sobre la marcha en mi nuevo servidor. Podemos contar 8 intentos fallidos, seguidos de tres exitosos para sincronizar metadatos editados y publicaciones posteriores al proceso original de importación"/> <figcaption>
            <p>Distintos intentos fallidos antes de completar la importación de sobre la marcha.</p>
        </figcaption>
</figure>

<h3 id="opcional-activa-las-estadísticas-op3">Opcional: activa las estadísticas OP3</h3>
<p>Las estadísticas que ofrece Castopod por defecto son bastante buenas, pero si te interesa la iniciativa <em>Open Podcast Prefix Project</em>, <a href="https://op3.dev/">OP3</a>, es un buen momento para unirte a ella activando las estadísticas con un sólo click en el formulario de edición de tu podcast.</p>
<figure class="ma0 w-75">
    <img loading="lazy" src="/images/20240524-castopodeditpod.png"
         alt="Formulario de edición del podcast recién importado. De interés es el hecho de que para activar las estadísticas OP3, en Castopod se hace con un click."/> <figcaption>
            <p>Formulario de edición del podcast recién importado.</p>
        </figcaption>
</figure>

<h2 id="redirige-tu-antiguo-feed-al-nuevo-permanentemente">Redirige tu antiguo feed al nuevo, permanentemente</h2>
<p>Éste es el paso más sencillo, y más crítico. En Spotify para Podcasters, en el panel de edición de tu podcast, encontrarás un campo de texto para introducir un nuevo feed al que redirigir el antiguo. Esta redirección se implementa mediante un código de estado del protocolo HTTP, 301, que indica a los clientes, índices, buscadores y directorios de podcasting que el feed se ha mudado y nunca volverá a Spotify. En el cuerpo de la respuesta que acompaña a ese estado de redirección permanente 301 está la dirección del nuevo feed. El comportamiento esperado para clientes HTTP (cualquier aplicación o servicio que quiera acceder al feed) cuando reciben una respuesta con estado 301 es actualizar sus registros a la nueva dirección y no volver a intentar acceder a la antigua nunca más.</p>
<p>A partir de este momento, y en un tiempo indeterminado, todos tus suscriptores empezarán a recibir contenido por el feed nuevo, y si tienes la misma experiencia que yo, de una forma totalmente transparente.</p>
<blockquote>
<p>⚠️ <strong>Cuando esto pase, perderás el control de tu podcast en Spotify para Podcasters</strong></p></blockquote>
<p>Esto es algo de lo que Spotify no te avisa claramente, pero cuando Spotify perciba que el podcast ya no está bajo su control, perderás acceso a funciones de edición del mismo, e incluso a la posibilidad de borrar los datos del mismo en Spotify.</p>
<p>Aún cuando veas que esto está pasando, no borres aún tu cuenta de Spotify para Podcasters: si algún rezagado no ha recibido la instrucción de redirección y borras tu cuenta, se borra la redirección, con lo cual podrías perder oyentes. Personalmente, yo voy a borrarla pasado un mes.</p>
<blockquote>
<p>⚠️ Escoge cuidadosamente el momento de hacer esto si alojas tu nuevo podcast en tu casa.</p>
<p>En el momento en el que actives la redirección en Spotify, servicios de directorio que probablemente no sepas que estaban indexando tu feed recibirán las coordenadas del feed nuevo. Estos servicios de directorio usan procesos tipo <em>arañas</em> (mala traducción de <em>web crawlers</em>) para recorrer el feed y reindexarlo todo.</p>
<p>El cambio desde Spotify para Podcasters a Castopod es muy profundo. En términos de la propia estructura del feed, de dónde están alojados los ficheros, y del nombre de los mismos, el efecto es que todos estos procesos perciben tu podcast como una <em>reedición</em> completa. Como decimos en España, <em>a este feed no lo reconoce ni su padre</em>. Esto hace que todos estos actores invaliden todos los datos previos y lo recorran todo de nuevo, descargando todos y cada uno de tus episodios, metadatos, imágenes&hellip; todo. Y en este momento, aunque tengas CDN, su caché todavía está vacía, por lo que todas las peticiones van a ir directas a tu casa.</p>
<p>Estos servicios tienen una capacidad de cómputo y de red inmensamente mayor que la de tu casa, por lo que todos* ataquen tu feed a la vez*, tu conexión a internet va a experimentar un pico de tráfico de subida muy significativo, que puede afectar a tu conectividad, especialmente si hay alguien trabajando desde casa.</p>
<p>Por eso, mejor hazlo por la noche. No seas como yo 😅</p></blockquote>
<h2 id="solicita-el-traspaso-de-tu-podcast-a-tu-propiedad-en-los-distintos-directorios-que-te-interesen">Solicita el traspaso de tu Podcast a tu propiedad en los distintos directorios (que te interesen)</h2>
<p>Esto es importante.</p>
<p>Me voy a centrar en Apple Podcasts, pero es fácil entender que esto deberías hacerlo allá en donde te interese tener presencia, en tu caso particular.</p>
<p>Acabas de redirigir tu feed a Castopod, tu conexión a internet en casa las ha pasado canutas, y has tenido que dar explicaciones a tu mujer e hijos de por qué internet iba como una patata, pero todo ha vuelto a su cauce normal, todo funciona y los primeros oyentes que sabían que ibas a cambiar esto te felicitan, te dicen que las descargas van más lentas&hellip;</p>
<p>Sin embargo, los directorios de podcasting como Apple Podcasts no te tienen registrado como el autor o el responsable del mismo a la hora de enviarte alertas y avisos con respecto a tu podcast. Situaciones en las que te podrías ver involucrado y que te interesaría resolver con Apple, como una potencial violación de los Términos y Condiciones de su servicios de directorio, no te serán notificadas.</p>
<p>Por otro lado, tampoco tienes control sobre tu podcast en Spotify para Podcasters, que es a donde Apple enviaría este tipo de mensajes en caso de conflicto. Spotify te ha dado la patada en cuanto la redirección se ha vuelto efectiva.</p>
<p>Estás en tierra de nadie.</p>
<p>Es hora de ponerse en contacto con Apple Podcasts Connect y solicitar que te den control sobre tu podcast.</p>
<p>Para eso, ármate con tu fluidez en el idioma de Shakespeare, porque creo que el formulario no se ofrece en Español, y haz lo siguiente (efectivo en Mayo de 2024):</p>
<ol>
<li>
<p>Entra en <a href="https://podcastsconnect.apple.com">Apple Podcasts Connect</a>, o regístrate si no tienes cuenta.</p>
</li>
<li>
<p>Abajo de todo, selecciona &ldquo;<em>Contact Us</em>&rdquo;</p>
</li>
<li>
<p>En el formulario que aparece, rellena tus datos y selecciona como tema de consulta &ldquo;<em>Missing Podcast(s)</em>&rdquo; dentro de &ldquo;<em>Content Management</em>&rdquo;. Tendrás que introducir los siguientes datos:</p>
</li>
<li>
<p>El título del podcast (&quot;<em><strong>Podamigos del cocido</strong></em>&quot;)</p>
</li>
<li>
<p>El <em>id</em> del podcast. Entiendo que se trata de los números al final en la URL del podcast en Apple Podcasts: &ldquo;<strong>id817487481</strong>&rdquo;.</p>
</li>
<li>
<p>La URL completa a la página del podcast en Apple Podcasts.</p>
</li>
<li>
<p>La URL del nuevo feed.</p>
</li>
<li>
<p>En el cuerpo del mensaje, indica que has migrado tu podcast desde Spotify a otro hosting, indica también la del anterior por si acaso el operador que te atienda todavía tiene el antiguo feed en sus cachés, y pide instrucciones como te gustaría que te las pidiesen a ti.</p>
</li>
</ol>
<p>Este fue el mensaje enviado, nada fuera de lo común:</p>
<blockquote>
<p>Good afternoon.</p>
<p>I am writing as the author of the show &ldquo;sobre la marcha&rdquo;, which was previously hosted on Spotify for Podcasters. I recently re-hosted the show on my own hosting server, and I would like to claim ownership and be able to manage it under my Apple Podcasts Connect dashboard. I hope this is the right method / channel to request so.</p>
<p>Looking forward to hearing from you,</p>
<p>~Gabriel Viso Carrera</p>
<p>PS – before today, the show&rsquo;s feed was &ldquo;<a href="https://anchor.fm/s/dd4f78/podcast/rss%22">https://anchor.fm/s/dd4f78/podcast/rss"</a>. As part of the migration, it has been placed a 301 permanent redirection to the feed I filled in this form; please take it into consideration of you see that the redirection hasn&rsquo;t been followed in your systems yet. Please note that no further episodes will be appearing in such feed.</p></blockquote>
<p>Te enviarán un correo en un plazo de un par de días, pidiéndote más datos (como el ID de tu cuenta en Apple Podcasts Connect), y dándote un código numérico que deberás introducir en algún campo del feed. Por ejemplo, mí me dieron como opciones el campo de <code>&lt;copyright /&gt;</code>, <code>&lt;keyword /&gt;</code> o <code>&lt;verification /&gt;</code>.</p>
<p>En negrita los aspectos clave que nos piden en esta respuesta de ejemplo, que es lo que me contestaron a mí con algunas cosas cambiadas.</p>
<blockquote>
<p>Hello Gabriel,</p>
<p>Thanks for reaching out to us. I hope you&rsquo;re doing well.</p>
<p>To get access to the show in Apple Podcasts Connect, we can transfer the ownership of it to your account.</p>
<p>To transfer ownership, <strong>enter the six-digit authorization code “381234” in the verification, keyword, or copyright fields of your RSS feed</strong>.</p>
<p>You can update the six-digit authorization code on your hosting provider’s platform or edit the metadata tags in your RSS feed. If you need assistance with this update, contact your hosting provider. We’ll review your request after we receive your reply.</p>
<p>When you reply, <strong>tell us where you entered the authorization code so we can find it <strong>and</strong> include the Account ID of your Apple Podcasts Connect account</strong>.</p>
<p>You can locate the Account ID on the <a href="https://podcastsconnect.apple.com/account/details">Details pane</a> in the Account section in Apple Podcasts Connect.</p>
<p>Example Account ID: 12a345bc6-d7ef-8901-2ghi-j3k4lm56n7o8</p>
<p>If you have additional questions related to this request, please reference case number 384791872432.</p>
<p>Best regards,</p>
<p>Mary Jane
Apple Inc.</p></blockquote>
<p>El feed que genera Castopod no tiene campo <code>&lt;verification /&gt;</code>, pero como añadir campos a medida es sencillísimo, es la solución ideal porque nadie recibirá ese cambio de forma visible. Ve al panel de control de edición de tu podcast, y abajo de todo encontrarás un campo donde poder poner el campo extra:</p>
<figure class="ma0 w-75">
    <img loading="lazy" src="/images/20240524-castopodeditpodverification.png"
         alt="Captura de pantalla del panel de edición del podcast, mostrando el campo donde podemos introducir el código de verificación. Este lugar es &#34;Advanced Parameters&#34;; y debemos introducir el campo con las etiquetas XML incluidas, por ejemplo &amp;lt;verification&amp;gt;381234&amp;lt;/verification&amp;gt;"/> <figcaption>
            <p>Captura de pantalla del panel de edición del podcast, mostrando el campo donde podemos introducir el código de verificación.</p>
        </figcaption>
</figure>

<p>Salva los cambios en tu podcast, verifica que en unos segundos, el feed tiene el mencionado campo dentro del objeto <code>&lt;channel /&gt;</code>, y contesta a Apple con los datos que te han solicitado, que incluyen dónde pueden encontrar el valor en cuestión.</p>
<blockquote>
<p>Good morning, Mary Jane.</p>
<p>Thanks for your prompt reply. As requested:My Podcasts Connect Account ID is <strong>12a345bc6-d7ef-8901-2ghi-j3k4lm56n7o8</strong>.I&rsquo;ve just included the code you provided in the tag of my feed, inside the &lt;channel /&gt; element:</p>
<p>&lt;rss version=&ldquo;2.0&rdquo;&gt;
&lt;channel&gt;
&hellip;
**        &lt;verification&gt;381234&lt;/verification&gt;**
&hellip;
&lt;/channel&gt;
&lt;/rss&gt;</p>
<p>Thank you for your help and kind regards,
~Gabriel</p></blockquote>
<p>Cuando recibas la confirmación y al cabo de un tiempo prudencial que te indicarán, deberías poder controlar tu relación con el directorio de Apple Podcasts tú mismo.</p>
<figure class="ma0 w-75">
    <img loading="lazy" src="/images/20240524-applepodconnect.png"
         alt="Captura de pantalla de mi panel de control de Apple Podcasts Connect mostrando mi podcast &#34;sobre la marcha&#34;"/> <figcaption>
            <p>Captura de pantalla de mi panel de control de Apple Podcasts Connect mostrando mi podcast &ldquo;sobre la marcha&rdquo;</p>
        </figcaption>
</figure>

<h2 id="no-tengas-prisa-en-borrar-cosas">No tengas prisa en borrar cosas</h2>
<p>En realidad ya está, pero es importante que no corras a Spotify y a tu feed a borrar cosas y deshacer cambios, porque puedes revertir el proceso sin querer.</p>
<ol>
<li>Como comentaba en el apartado de la redirección permamente, no tengas demasiada prisa en borrar tu cuenta de Spotify, porque podrías perder oyentes.</li>
<li>Aún cuando ya tengas tu podcast en Apple Podcasts Connect, no corras a editar tu podcast en Castopod para retirar el campo de verificación. Ten en cuenta que el directorio de podcasts de Apple tienen páginas en todo el mundo, y no nos interesa que, por alguna razón, alguna versión antigua del feed se haya quedado en algún sitio y reasignen tu podcast a Spotify. Deja ese campo de verificación en tu feed el tiempo que te parezca oportuno.</li>
</ol>
<h2 id="pues-ya-estaría">Pues ya estaría</h2>
<p>Hasta aquí mi experiencia. Espero que te resulte útil e interesante.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Recuerdos de Windows (Recall)</title>
      <link>https://gvisoc.com/posts/windows-recall/</link>
      <pubDate>Wed, 22 May 2024 07:28:01 +0000</pubDate><author>gabriel@gvisoc.com (Gabriel Viso Carrera)</author>
      <guid>https://gvisoc.com/posts/windows-recall/</guid>
      <description>Puede que parezca muy útil, pero podría exponer a quien se comunique con nosotros.</description>
      <content:encoded><![CDATA[<p><em><strong>Recuerdos</strong></em> (<em>Recall</em>) es una funcionalidad de Windows 11 en los <a href="https://www.microsoft.com/es-es/windows/copilot-plus-pcs">PC Copilot+</a> que se basa en capturar tu pantalla cada pocos segundos y alimentar un modelo de aprendizaje máquina (&ldquo;IA&rdquo; 😒) local. Con ese modelo y mediante búsquedas, Windows puede proporcionarte información acerca de todo el trabajo productivo de los últimos meses, y opciones para interactuar con los resultados. Microsoft asegura que todo el contenido se almacena localmente y bajo las medidas de seguridad de Windows 11, como por ejemplo Bitlocker, pero los comentarios airados en contra no han tardado en llegar.</p>
<p>En lugar de hacerme eco de comentarios de otros, he estado leyendo <a href="https://www.microsoft.com/es-es/windows/copilot-plus-pcs#faq2">información acerca de <em>Recuerdos</em> en la web de Microsoft</a>, <strong>partiendo de la base de que un usuario que se compre un PC &ldquo;Copilot+&rdquo; quiereusar <em>Recuerdos</em></strong>. Los comentarios a continuación son mis propias dudas acerca de este producto y sus implicaciones.</p>
<ol>
<li>Aunque no está cubierto en la página de Microsoft, <em>Recuerdos</em> se puede desactivar en las versiones de vista previa &ldquo;Insider Preview&rdquo;, según varias fuentes en inglés (<a href="https://pureinfotech.com/disable-recall-windows-11/">ejemplo</a>). Nada se sabe de las versiones finales, pero <em>es de suponer</em> que se puede desactivar completamente.</li>
<li>Permite excluir aplicaciones, webs visitadas en <em>un navegador soportado</em>. La coletilla de &ldquo;navegador soportado&rdquo; es preocupante, porque esto puede ser un incentivo impuesto más por parte de Microsoft para empujarte hacerte más cómodo y conveniente cambiarte a Edge. Esperemos que los demás navegadores se soporten también, si no desde el primer día, pronto.</li>
<li>Permite pausar las capturas. Bien.</li>
<li>No captura las sesiones <em>InPrivate</em> de Edge. Mal. Debería soportar las sesiones privadas / anónimas de otros navegadores.</li>
<li>No captura el contenido con DRM. Irrelevante para el usuario final, entiendo que esto se ha aclarado para evitar la oposición de las productoras que producen este tipo de contenido cautivo. Una muestra, sin embargo, del control que tiene Microsoft para hacer ajuste fino de estas capturas.</li>
<li>No realiza moderación de contenido. Como la propia Microsoft aclara, <em>Recuerdos</em> captura indiscriminadamente información sensible como contraseñas y números de tarjeta de crédito. Esto es fundamentalmente malo, pero por lo menos Microsoft es transparente con ello.</li>
<li>Las capturas no se comparten entre perfiles de usuario ni con Microsoft. Esto es una configuración <em>de mínimos</em>: no ofrece unas medidas de seguridad que no tuviésemos  con otro material cualquiera (a no ser que los memes que te descargas de la web se estén enviando a Microsoft, claro).
De hecho, no ofrece ninguna seguridad contra <strong>acceso coercitivo</strong>, como <a href="https://en.wikipedia.org/wiki/Plausible_deniability#Use_in_cryptography">la negación plausible</a> que soportan otros esquemas de cifrado de datos para proteger a <strong>víctimas de casos de violencia doméstica u opresión por parte de gobiernos autoritarios</strong>.</li>
</ol>
<blockquote>
<p>💡 Ya que el enlace anterior es a una definición en inglés, en resumen: la <em>negación plausible</em> en sistemas de criptografía hace el contenido cifrado indetectable a no ser que se sepa que está ahí, además de conocer la clave correcta.</p></blockquote>
<p>Por ejemplo, si introduces una clave, el acceso es parcial, y si introduces una segunda clave, el acceso a la información es completo.</p>
<p>La idea es que, si no se conoce la existencia de esta segunda clave, el contenido cifrado está almacenado de una forma que no se puede probar que existe; por ejemplo, camuflado como residuos de información borrada, u oculto en otras partes del sistema de almacenamiento mediante técnicas <a href="https://es.wikipedia.org/wiki/Esteganograf%C3%ADa">esteganográficas</a>.</p>
<p>Tengo muchas preguntas, no ya desde el punto de vista del propio usuario de Windows 11: <strong>asumo que quien se compra un PC Copilot+ lo hace porque quiere usar <em>Recuerdos</em>, entre otras funcionalidades extra</strong>. Pero, ¿y qué pasa con los demás? ¿Cómo, las decisiones de esos usuarios, pueden afectarnos?</p>
<p>Por ejemplo, yo no soy usuario de Microsoft Windows, ni lo seré fuera de mi horario laboral. Pero, de ahora en adelante, siempre tengo que sospechar que cuando me comunico con alguien, de cualquier forma, voy a dejar una huella grabada en el ordenador de alguien. Esto incluye cualquier aplicación de comunicaciones mediante texto o imagen: correo electrónico, video llamadas, o cualquier comunicación por voz que soporte transcripciones automáticas o extensiones de accesibilidad y se estén mostrando en pantalla. ¿Tengo que estar pidiendo en cada llamada que se pause <em>Recuerdos</em>?, ¿tengo que <em>creerme</em> que los han pausado?</p>
<p>Quitando datos financieros y contraseñas, que nunca deberías decir de viva voz a nadie, puede que no nos preocupe por la parte del uso que mis amigos, familiares, o compañeros de trabajo hagan de esas capturas de pantalla. Puede que a mí no me afecte demasiado en mi pequeña esquina privilegiada del mundo, de hombre blanco occidental heterosexual ciudadano de dos democracias, pero eleva el riesgo al que se expone mucha gente si sus contactos están usando <em>Recuerdos</em>.</p>
<ul>
<li>Una mujer que está discutiendo tratamientos de fertilidad o abortivos en Estados Unidos, en ciertos estados hoy por hoy, y probablemente en cualquiera en un futuro no tan improbable, puede estar dejando comentarios incriminatorios en las capturas de <em>Recuerdos</em> de otras personas.</li>
<li>Un activista de un país oprimido se comunica con gente de fuera, utilizando cuantas precauciones pueda para que el contenido de sus comunicaciones no se intercepten, y todo para que acabe en las capturas de <em>Recuerdos</em> de alguien, por puro descuido.</li>
</ul>
<p>Las reservas que podemos tener acerca de funcionalidades como <em>Recuerdos</em>, muchas veces, no van tanto del usuario del *chisme *en sí. Van de cómo nuestras decisiones pueden estar afectando a la privacidad de nuestro círculo de contactos, a los datos de las personas de nuestro entorno, y a comunicaciones que todos deberíamos proteger.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Por si Telegram no me gustaba lo suficientemente poco...</title>
      <link>https://gvisoc.com/posts/salseo-telegram-signal/</link>
      <pubDate>Tue, 14 May 2024 12:00:43 +0000</pubDate><author>gabriel@gvisoc.com (Gabriel Viso Carrera)</author>
      <guid>https://gvisoc.com/posts/salseo-telegram-signal/</guid>
      <description>... Elon Musk y Pavel Durov han estado ayudándome a reforzar mis reticencias.</description>
      <content:encoded><![CDATA[<p>Estos días hemos visto una romería de argumentos delirantes, tratando de desacreditar a Signal para, se supone, ganar usuarios de Telegram.</p>
<p>Básicamente, hemos visto cosas tan absurdas como las siguientes:</p>
<blockquote>
<p>&ldquo;Hay vulnerabilidades conocidas en Signal que no están siendo corregidas. Parece raro&hellip;&rdquo;</p>
<p>~Elon Musk</p></blockquote>
<p>Por supuesto, ni un sólo enlace a hechos, ni a información contrastada, ni a nada verificable. Como cuando se habla del chupacabras.</p>
<blockquote>
<p>&ldquo;Un número alarmante de gente importante con la que he hablado asegura que sus mensajes &lsquo;privados&rsquo; de Signal han sido utilizados en su contra en juicios o por la prensa&rdquo;</p>
<p>~Pavel Durov</p></blockquote>
<p>&ldquo;Gente Importante&rdquo;. Eh, chavales, hacedme caso, que yo me codeo.</p>
<p>Argumentos del nivel de calidad de cuando, en primaria, otro niño nos aseguraba que no debíamos tomar refrescos de cola porque &ldquo;una vez un niño se murió&rdquo;.</p>
<p>No voy a copiar o reproducir aquí la cronología, porque está más que publicada en todas partes. Por ejemplo, el artículo &ldquo;<a href="https://www.businessinsider.com/elon-musk-encrypted-messenger-app-wars-telegram-signal-2024-5">In the battle of Telegram vs Signal, Elon Musk casts doubt on the security of the app he once championed</a>&rdquo; de Business Insider da cuenta de todo ello de una forma bastante detallada.</p>
<p>En lo que sí quiero hacer hincapié es que los propios verificadores de Twitter X desmintieron a Elon Musk casi inmediatamente:</p>
<figure class="ma0 w-75">
    <img loading="lazy" src="/images/20240514-elontweet.png"
         alt="Una captura de pantalla de Twitter, donde un bulo de Elon Musk es cuestionado, casi al momento, por el propio personal de X."/> <figcaption>
            <p>Una captura de pantalla de Twitter, donde Elon Musk dice &ldquo;Hay vulnerabilidades conocidas en Signal que no están siendo corregidas. Parece raro&hellip;&rdquo;, y el equipo de verificación de datos lo desmiente, &ldquo;No hay evidencias que sugieran que Signal tenga &lsquo;vulnerabilidades que no estén siendo corregidas&rsquo;. Debido a la naturaleza de código abierto de Signal, entre otros factores, esto es fácil de verificar&rdquo;</p>
        </figcaption>
</figure>

<p>Sin embargo, y casi al momento, <em>hordas</em> se apresuraron a señalar que en Signal no existen &ldquo;compilaciones reproducibles&rdquo; de las aplicaciones de iOS, con lo cual no se puede establecer una certeza del 100% de que el código publicado se corresponda con el código de la aplicación que te instalas. Esto, por si lo dudábamos, es lo que sostiene Pavel Durov en su propio canal de Telegram.</p>
<p>Sin embargo, es fácil de explicar desde un punto de vista técnico. El problema es que las aplicaciones de iOS que te instalas a través de la tienda de Apple están cifradas por la misma tienda, con lo cual es imposible conseguir una aplicación a partir del código que sea idéntica al paquete que te entrega el Apple App Store: no tienes las claves privadas de Apple para reproducir el cifrado. Es culpa de Apple, vaya. También es cierto que Telegram ha hecho esfuerzos notables por romper este problema, pero <a href="https://core.telegram.org/reproducible-builds#reproducible-builds-for-ios">el método que han conseguido para ello es incompleto y requiere de un iPhone antiguo con <em>jailbreak</em></a>, con lo que en cualquier momento puede dejar de funcionar. <a href="https://twitter.com/matthew_d_green/status/1789687898863792453">En este hilo de Matthew Green en X</a> podéis encontrar material interesante al respecto</p>
<figure class="ma0 w-75">
    <img loading="lazy" src="/images/20240514-matthewgreentweet.png"
         alt="Captura de los tweets (¿equises?) más relevantes del hilo de Matthew Green enlazado más arriba, en el párrafo, donde comenta el tema de las compilaciones reproducibles."/> <figcaption>
            <p>Captura de los tweets (¿equises?) más relevantes del hilo de Matthew Green enlazado más arriba, en el párrafo, donde comenta el tema de las compilaciones reproducibles.</p>
        </figcaption>
</figure>

<p>No he entrado a enlazar a la propia Meredith Whittaker, la presidenta de ¿la fundación? Signal porque, la verdad, no creo que haga falta cuando las cosas se caen por sí solas y cuando la propia comunidad es capaz de proporcionar información con cierta profundidad.</p>
<p>Lo que quiero comunicar con este artículo es que el mero hecho de que gente tan significativa como el propio fundador de Telegram y gente tan deleznable como Elon Musk hagan causa en contra de una aplicación (la que sea), sin aportar hechos comprobables y apelando a la conspiración, no hace más que reforzar <a href="__GHOST_URL__/por-que-telegram-no/">mi gran reticencia a usar Telegram</a> para temas serios. Porque, además, cuando Meredith Whittaker les contesta, aparece gente que se va por la tangente de la falacia, señalando que <a href="https://en.wikipedia.org/wiki/Katherine_Maher">Katherine Maher</a> es la presidenta de la junta directiva  –falacia <em>ad-hominem</em>. Como si una ejecutiva pudiese invalidar el modelo de seguridad de Signal, hacerlo cuestionable, o para establecer una correlación conspiranoica con la dificultad de conseguir complicaciones reproducibles en iOS.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Copias de Seguridad con Pika Backup</title>
      <link>https://gvisoc.com/posts/copias-de-seguridad-pika-backup/</link>
      <pubDate>Mon, 06 May 2024 10:28:43 +0000</pubDate><author>gabriel@gvisoc.com (Gabriel Viso Carrera)</author>
      <guid>https://gvisoc.com/posts/copias-de-seguridad-pika-backup/</guid>
      <description>Abandono Déjà Dup después de años de servicio.</description>
      <content:encoded><![CDATA[<p>Estoy moviendo todas mis copias de seguridad, desde Déjà Dup a Pika Backup.</p>
<p><a href="https://apps.gnome.org/PikaBackup/">Pika Backup</a> es una solución de copias de seguridad para GNU/Linux que, sin dejar de ser extremadamente sencilla de utilizar, proporciona características muy interesantes y es muy eficiente. Está basado en <a href="https://borgbackup.readthedocs.io/en/stable/">Borg Backup</a>, un sistema que crea copias de seguridad comprimidas, cifradas, y que además detecta y elimina duplicados en la copia de seguridad.</p>
<figure class="ma0 w-75">
    <img loading="lazy" src="/images/20240506-pikabackupmulti.png"
         alt="La imagen muestra la vista principal de Pika Backup. Muestra dos configuraciones de copia de seguridad, una a un disco duro USB sin programar, y otra, programada para ejecutarse periódicamente, a una ubicación remota."/> <figcaption>
            <p>Pika Backup con dos tareas de copia de seguridad configuradas; una en un directorio remoto, y otra en un disco duro externo</p>
        </figcaption>
</figure>

<p>Las características de Pika Backup que me han convencido han sido las siguientes:</p>
<ul>
<li>
<p><strong>Permite realizar copias de seguridad a discos USB y a cualquier directorio remoto, y soporta Borg en el lado del servidor</strong>:</p>
</li>
<li>
<p>Directorio &ldquo;tonto&rdquo;: cualquier directorio en donde tengas acceso local (por ejemplo, servicios tipo Drop Box o One Drive), y a localizaciones remotas &ldquo;tradicionales&rdquo; como servidores de ficheros FTP, o carpetas compartidas en red.</p>
</li>
<li>
<p>En sí, esto ya es muy potente y versátil.</p>
</li>
<li>
<p>Servicio remoto con soporte para <a href="https://borgbackup.readthedocs.io/en/stable/">Borg Backup</a>, si quieres mejor rendimiento. Esto no es más que un servidor donde el ejecutable <code>borg</code> esté instalado, y al que tengas acceso por <code>ssh</code>. Una Raspberry Pi con el paquete <code>borgbackup</code> instalado y un disco duro enchufado por USB es suficiente para tener copias de seguridad en red en casa, con rendimiento mejorado.</p>
</li>
<li>
<p>No hay por qué saber usar Borg; Pika Backup lo hace todo por ti, tanto en tu ordenador de trabajo como en tu servidor de copia de seguridad.</p>
</li>
<li>
<p>Más adelante os cuento por qué esto es tan ventajoso.</p>
</li>
<li>
<p><strong>Permite tener más de una tarea de copia de seguridad configuradas sobre el mismo conjunto de datos</strong>, para poder tener tu copia de seguridad en varios lugares. Por ejemplo, en un servidor en red, donde ejecutas la copia de seguridad de forma programada, y en un disco externo por USB, donde ejecutas la copia manualmente, cuando te parece bien.</p>
</li>
<li>
<p>Esto permite desarrollar una **estrategia 3:2:1 **sin salir de Pika Backup.</p>
</li>
</ul>
<blockquote>
<p>💡 Una estrategia <strong>3:2:1</strong> significa que deberíamos tener <strong>3</strong> réplicas de los datos, <strong>2</strong> de las cuales serían las copias de seguridad, ubicadas en sistemas almacenamiento diferentes, para <strong>1</strong> conjunto de datos en particular.</p></blockquote>
<p>De esa forma, siempre nos protegemos en caso de daño físico tanto a nuestra estación de trabajo como a discos de las copias, siendo extremadamente difícil que fallen las tres réplicas a la vez.</p>
<ul>
<li><strong>Es amigable para portátiles</strong>, porque detecta si el ordenador está conectado a la corriente, y si no lo está, ni siquiera intenta realizar la tarea de copia de seguridad programada.</li>
<li><strong>Proporciona filtros predefinidos</strong> para excluir de la copia de seguridad máquinas virtuales, contenedores, cachés y aplicaciones flatpak instaladas en el directorio de usuario. Esto simplifica bastante la configuración, aunque si no es suficiente, se pueden añador desde ficheros y carpetas individuales, hasta filtros basados en nombres de fichero y en expresiones regulares.</li>
<li><strong>Las copias de seguridad se pueden programar</strong> (hay reglas horarias, diarias, semanales, mensuales o anuales), <strong>y permite especificar el día y la hora 🎉</strong>. Esto parece baladí, pero si sabes que, por ejemplo, los domingos por la tarde el portátil va a estar en el escritorio con tareas de mantenimiento como actualizar el sistema, con sólo dejarlo enchufado la copia de seguridad se va a realizar automáticamente.</li>
</ul>
<figure class="ma0 w-75">
    <img loading="lazy" src="/images/20240506-pikabackupfilters.png"
         alt="Una vista de la configuración donde se pueden ver los distintos filtros que se pueden configurar en Pika Backup. Muestra filtros predeterminados, y carpetas seleccionadas manualmente."/> <figcaption>
            <p>Una vista de la configuración donde se pueden ver los distintos filtros que se pueden configurar en Pika Backup.</p>
        </figcaption>
</figure>

<p>De por sí, las funcionalidades que proporciona Pika Backup en su interfaz gráfico son ya suficientes para convencerme; <em>sobre todo</em> el hecho de poder tener todas las copias de seguridad de mi estrategia 3:2:1 en la misma aplicación. Pero donde lo remata es en el aspecto de ser un cliente de Borg, y por lo tanto soportar servidores con Borg,  para acelerar todas las operaciones de copia y restauración, y en especial <strong>la verificación</strong> de las copias de seguridad.</p>
<p>En general, <strong>hay que verificar las copias de seguridad, al menos cada cierto tiempo</strong>. Con ello nos aseguramos de que los archivos se han generado y almacenado correctamente, y que no hay nada corrupto. Y esto es un proceso que, si se hace en red, es muy costoso: Pika debería descargarse un trozo de la copia de seguridad desde el servidor de red, verificar su integridad, buscar el siguiente trozo, y así&hellip; hasta 130 GB en mi caso. He presenciado verificaciones de integridad hechas así que tardaron 20 horas. Y así es como se hace cuando Pika Backup deposita las copias de seguridad en un directorio de red, &ldquo;tonto&rdquo;, es decir, sin Borg.</p>
<p>Con Borg, la cosa cambia. El hecho de que Pika Backup esté basado en Borg Backup y, a todos los efectos, que sea un cliente de Borg, acelera el proceso de una forma drástica. Según la documentación de Borg, el proceso del lado del servidor realiza las operaciones de gestión de almacenamiento completas cuando se hace la copia de seguridad, <strong>y la verificación en sí</strong>. Esto incrementa el rendimiento sensiblemente, porque elimina el trasiego de datos por la red, y reduce el tiempo de verificación de una copia tan masiva como 130 GB <strong>de 20 horas a unos 35 minutos</strong>.</p>
<figure class="ma0 w-75">
    <img loading="lazy" src="/images/20240506-borgserve.png"
         alt="La imagen muestra un terminal de Gnome conectado al host barcas, bajo el usuario gvisoc. Dentro del terminal se puede ver la salida del comando htop, que muestra el proceso de servidor de borg realizando la verificación de integridad de la copia de seguridad, consumiendo algo menos de un 13% de CPU."/> <figcaption>
            <p>Una captura de pantalla que muestra el proceso de servidor de borg realizando la verificación de integridad de la copia de seguridad, consumiendo algo menos de un 13% de CPU.</p>
        </figcaption>
</figure>

<p>En general estoy muy contento con el cambio, ya que me permite realizar las cosas más eficientemente, utilizar mejor los recursos, y sobre todo, <strong>sobre todísimo</strong>, poder realizar todas las copias de seguridad de mi estrategia con la misma aplicación y de forma sencilla.</p>
<p>Extremadamente recomendable.</p>
<hr>
<h2 id="cómo-se-compara-pika-backup-con-déjà-dup">¿Cómo se compara Pika Backup con Déjà Dup?</h2>
<p><a href="https://flathub.org/apps/org.gnome.DejaDup">Déjà Dup</a> es una solución basada en <a href="https://duplicity.gitlab.io/">duplicity</a> que se ofrece, tradicionalmente, como parte del entorno de escritorio Gnome. Realiza copias de seguridad cifradas, incrementales, y las almacena en un formato de archivo comprimido que, independientemente de dónde almacenes estos archivos, preserva los permisos de los ficheros en tu máquina.</p>
<ul>
<li>Soporta discos externos y todo tipo de almacenamiento remoto –la lista completa se puede consultar en la documentación de <a href="https://duplicity.gitlab.io/">duplicity</a>, pero <strong>sólo soporta una única configuración para tu copia de seguridad. La copia de seguridad que configures, es única y a un sólo destino</strong>. Esto dificulta el realizar una estrategia de copias de seguridad robusta, 3:2:1, con la misma herramienta.</li>
<li>Por otro lado, el sistema de copias de seguridad no tiene parte servidora, como la tiene Borg (y la aprovecha Pika Backup al ser éste un cliente gráfico y versátil de Borg); esto quiere decir que <strong>la verificación y el almacenamiento sea <em>mucho</em> más lento</strong>.</li>
<li>No está bien pensado para portátiles, si es que han pensado en portátiles en absoluto.</li>
<li><strong>No permite escoger el día o la hora de las copias de seguridad programada</strong>. Si cuando configuras Déjà Dup las copias semanales caen en miércoles por el artículo 33, moverlas al domingo no es nada intuitivo, si es que el posible. Y, si cuando entra la copia de seguridad, te tienes que ir con tu portátil, el proceso se va a quedar por ahí medio enganchado.</li>
<li><strong>Las copias de seguridad programadas siempre se intentan realizar, estés funcionando en batería, sin red, o lo que sea</strong>. Esto consume energía y genera errores de forma innecesaria.</li>
</ul>
<p>Todo este tipo de cosas hacen que Déjà Dup se vaya quedando atrás. Si bien es igual de sencillo de usar que Pika Backup, el ritmo al que añaden el tipo de funcionalidades que  me afectan más es bastante bajo, casi diría que cae en la apatía, y estas cosas van desluciendo al producto poco a poco.</p>
<hr>
<h3 id="comentarios-previos">Comentarios previos</h3>
<p><strong>Antonio</strong>, el 8 de mayo de 2024 , <strong>comentó</strong>:</p>
<blockquote>
<p>Gabriel, estupendo artículo muy interesante para los que tenemos que hacer respaldos de los archivos regularmente. Recomiendas alguno para macOS?. Gracias</p></blockquote>
<p><strong>Gabriel Viso Carrera</strong>, el 8 de mayo de 2024, <strong>respondió</strong>:</p>
<blockquote>
<blockquote>
<p>Para macOS solo tengo experiencia con Time Machine y Super Duper. Los dos hacen bien su tarea.</p>
<p>No descarto probar Vorta, que está basado en Borg Backup, igual que Pika Backup. Si quieres echarle un vistazo ve a <a href="https://vorta.borgbase.com">https://vorta.borgbase.com</a></p></blockquote></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>El problema con el Rabbit R1</title>
      <link>https://gvisoc.com/posts/problema-rabbit-r1/</link>
      <pubDate>Thu, 02 May 2024 11:08:04 +0000</pubDate><author>gabriel@gvisoc.com (Gabriel Viso Carrera)</author>
      <guid>https://gvisoc.com/posts/problema-rabbit-r1/</guid>
      <description>El Rabbit R1 tiene una propuesta de valor que amenaza a muchos negocios con los que se pretende integrar.</description>
      <content:encoded><![CDATA[<p>El <a href="https://www.rabbit.tech/live-unboxing">Rabbit R1</a> es un dispositivo que contiene un asistente que se usa por voz y que incluye para ello un modelo extenso de lenguaje natural (LLM – <em>Large Language Model</em>). El dispositivo en cuestión está recibiendo las primeras revisiones por parte de diferentes publicaciones y, en general, está recibiendo críticas bastante duras. La batería dura apenas dos horas, el poco interfaz de usuario que no está basado en voz podría ser táctil, porque lo es, pero no te deja hacer nada de forma táctil para obligarte a usar una ruedecilla, la pantalla utiliza tecnología obsoleta,&hellip; y toda una serie de problemas técnicos que hablan por sí mismos. Le están dando por la izquierda, por la derecha, por arriba y por abajo. Basta hacer una búsqueda básica en YouTube; todos los canales son, en general, unánimes.</p>
<p>A pesar de que es cuestionable sacar al mercado un producto así, todo eso son cosas que se pueden arreglar. Lo que no creo que funcione, y veo difícil arreglo, es la propuesta de valor del dispositivo, en sí.</p>
<p>El Rabbit R1 no sólo incorpora un LLM que hace las veces de interfaz del usuario, sino que <strong>han desarrollado lo que ellos llaman un LAM</strong>: <a href="https://www.rabbit.tech/newsroom/r1-lam-updates"><em>Large Action Model</em></a>, que se podría traducir como un &ldquo;modelo extenso de acciones&rdquo;. Es un modelo de aprendizaje máquina que tiene como objetivo <em>usar aplicaciones web y móviles</em>. A grandes rasgos, y tal y como se ha entendido hasta el momento, <strong>el <em>chisme</em> aprende a reconocer elementos de interfaz gráfico y flujos de trabajo básicos para pedir comida, un taxi, la reproducción de una lista de música, etc., a partir de una pregunta sencilla y natural, y sin que tú tengas que hacerlo por ti mismo</strong>. El dispositivo envía tu orden a sus servidores &ldquo;cómprame un kebab del Bar Tolo en DoorDash&rdquo;, y mediante técnicas similares a los que hacen posible las pruebas automáticas de interfaz web y móvil en la nube, <strong>Rabbit R1 *pulsa</strong>botones y menús, introduce texto, paga*, y lo que haga falta, en algún sistema en la nube, para conseguir tu objetivo**.</p>
<p>Es un asistente digital que usa aplicaciones por ti.* Sin que tú tengas que**ver nada*. Es muy interesante.</p>
<p><strong>Pero ahí es donde yo veo el problema</strong>: la mayoría de los servicios web que usamos han definido su interfaz de usuario, en mayor o menor medida, en base a criteros de <a href="https://gvisoc.com/posts/la-economia-de-tu-atencion/">economía de la atención</a>:</p>
<ul>
<li><strong>Un servicio de música quiere que escuches música nueva todo el tiempo</strong>. De otro modo, podrías llegar a la conclusión de que te es más rentable comporar los 2, 3, 10 discos que estás reproduciendo en bucle, y abandonar una suscripción. ¿Cómo te sugieren nuevos álbumes y artistas? Mediante su propio interfaz gráfico, diseñado para capturar tu atención. Estos asistentes le quitan la salsa.</li>
<li><strong>Cualquier red social comercial quiere controlar lo que los usuarios ven, en qué orden, qué contenido se les posiciona delante, y maximizar el tiempo de exposición</strong> a todo esto para maximizar sus ingresos. ¿Leerte las notificaciones, sin más, sin introducir contenido posicionado en tu rango de visión y de atención? Sería casi como un bloqueador de anuncios perfecto.</li>
<li>Servicios de comida a domicilio, como DoorDash, tienen un diálogo orientado a venderte extras para subir el precio de compra final. &ldquo;<em>Pídeme un kebab al restaurante XYZ y que me lo entregen a las 20:30</em>&rdquo;. En última instancia, este tipo de servicios posicionan nuevos restaurantes, crean cupones de descuento, te sugieren añadir extras al carrito de la compra, y toda una serie de cosas que intentan generar más gasto. ¿Qué pasa si Rabbit R1 se limita a pedir el kebab? Por el contrario, ¿te va a estar dando la paliza con todos esos extras y esas opciones, creando una conversación larguísima, y arriesgándose a que la próxima vez uses el teléfono, porque tardas menos?</li>
</ul>
<p>La propuesta de valor del dispositivo pasa por capturar la relación con el cliente de las cuatro aplicaciones que, por el momento, el Rabbit R1 soporta. Spotify, DoorDash, Uber y MidJourney ven retirados sus interfaces de usuario, específicamente diseñados para mantener al cliente dentro, en el carrusel de ofertas y de publicidad mostrada (allá en donde tenga sentido, claro; no conozco MidJourney). Es decir: la propuesta de valor del Rabbit R1 pasa por negar a esos servicios la atención del usuario.</p>
<p>Estas cosas no suelen gustar.</p>
<p>O bien Rabbit llega a acuerdos de <strong>compensación por el coste de oportunidad que supone perder el control sobre lo que el usuario <em>ve</em>, y por cuánto tiempo</strong>, o mucho me temo que el LAM no va a terminar por cuajar. Por mucho que me guste. No quiero engañar a nadie: a mí me encantaría poder tener una cabecita de conejo, o de otro animalito, rebotando en mi PC y que yo le pudiese decir &ldquo;procesa todas las mágenes de la carpeta XYZ para publicación en web, con un ancho máximo de 900 píxeles, y súbelas a mi librería de medios en Ghost&rdquo; y que el chisme se las arreglara para decirme &ldquo;hecho; la imagen más pesada ocupa 230 kB&rdquo;. O &ldquo;descarga la última imagen de Fedora Server, crea una máquina virtual con ella con 16 GB de RAM, 80 GB de almacenamiento y 4 CPU y crea un usuario <em>test</em> sin contraseña. Y luego haz una copia de seguridad de todo. Cuando acabes, envíame un correo y apaga el ordenador&rdquo;. Y mientras, yo me voy a dar un paseo. Pero cuando intento razonar cómo aplicar este tipo de mecanismo a un servicio donde la relación con el cliente, el control de lo que el cliente ve, y el tiempo que el cliente está expuesto a un determinado contenido son tan cruciales, veo un conflicto difícil de resolver. Y al final, ese conflicto se acabará trasladando a los inversores de los servicios operados mediante LAM y del Rabbit R1.</p>
<p>Mi predicción, ya puestos: una de las empresas afectadas, la más grande, probablemetne con su propio departamento de desarrollo de modelos extensos <em>del tipo que sea</em>, comprará Rabbit. O bien para desmantelarla, o bien para desfigurar el producto tal y como está ideado, y convertirlo en parte de su estrategia de captura de atención.</p>
<p>Espero equivocarme. Creo que el LAM es una buena idea. Me gustaría tener un modelo bien entrenado, que funcionase en local, para poder <em>encargar flujos de trabajo completos</em> por voz. Pero tal y como está el panorama, no lo veo despegando con este tipo de servicios de terceros.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Enmierdificar la IA parece fácil</title>
      <link>https://gvisoc.com/posts/enmierdificar-ia-parece-facil/</link>
      <pubDate>Tue, 30 Apr 2024 10:55:10 +0000</pubDate><author>gabriel@gvisoc.com (Gabriel Viso Carrera)</author>
      <guid>https://gvisoc.com/posts/enmierdificar-ia-parece-facil/</guid>
      <description>Es una caja negra diseñada para ofrecernos atajos que nos quita responsabilidad y no require capacidad crítica.</description>
      <content:encoded><![CDATA[<p>En los últimos 30 años estamos pasando de resolver problemas a, simplemente, plantear preguntas y pedir cosas a través de una conexión permanente con algo que sepa por nosotros, o <em>parezca saber</em> por nosotros. Si nos dejamos llevar, ¿cómo vamos a poder detectar manipulaciones? Detectar la manipulación siempre fue complicado, pero se vuelve tanto más complicado cuanto más nos movemos en esa dirección.</p>
<p>Si tienes 30 años o más, probablemente recuerdes una época en la que usar un ordenador personal era <em>personal</em>; nadie más allá de ti mismo y tu ordenador tenía ni parte ni intereses en lo que estuvieses haciendo. Probablemente sí había interés en <em>con qué</em> lo estabas haciendo, porque siempre hubo competencia: con qué tipo o marca de ordenador, con qué sistema operativo, con qué programa. Pero más allá de eso, estabas tú solo, con tu tarea. A tus cosas. A tu suerte. Tu éxito dependía de tu capacidad de aprender, habilidad de análisis, de tu criterio y de ti mismo</p>
<p>Cuando yo estaba en educación primaria, en los años 1980 y principios de los 1990, todo se hacía en total desconexión; si acaso, consultando un libro o, más frecuentemente, una revista. Más tarde, cuando estaba estudiando en la Universidad entre 1998 y 2004, las conexiones a internet <em>empezaban</em> a extenderse por los hogares españoles, pero aún no había muchos hogares conectados permanentemente a internet. Los equipos conectados a internet en la Escuela Técnica Superior de Ingenieros de Telecomunicación de Vigo, aún siendo la pera limonera de las telecomunicaciones del Campus, eran bastante limitados. Había que hacer cola. Aprender a programar se hacía con un libro al lado, y las prácticas se hacían consultando manuales de referencia, hojas de características del fabricante, y estándares. Pilas de páginas áridas como pocas otras cosas: era la norma y lo que había. ¿Necesitabas la documentación de las librerías de Java? ¿Un manual de referencia de ensamblador de Motorola 68000? ¿Lenguaje C? Ve a reprografía, toma prestado un libro de la biblioteca, o descarga y copia todo a <em>disquetes</em> para consultar en casa. Sin conexión.</p>
<p>Y una de las cosas más valiosas que ganabas con eso es que, con el tiempo, tenías criterio suficiente, incluso, para atribuir calidad y fiabilidad a los libros y fuentes que consultabas. Priorizabas y valorabas unos autores sobre otros. Enviabas correcciones a la editorial, incluso.</p>
<p>La era de la información instantánea, los buscadores, y Stack Overflow, esta época en la que no hay que anotar nada porque todo está <em>en Google</em> o en el historial de navegación, tardaría algo más en llegar. Pero cuando llegó, empezamos a depender del buscador en lugar de nuestra propia colección de referencias, y en lugar de consumir documentación empezamos a depender de algo que nos devolviese la información en un formato de pregunta y respuesta. Esto elimina un montón de contexto, y hace que no tengamos que esforzarnos en ver más allá del siguiente escollo particular. Y lo que es peor, nos hace susceptibles a que se nos tire información sesgada a la cara, sin nosotros pedirla, distrayéndonos de nuestro trabajo, limitando los ángulos de análisis del problema que estuviéramos intentando resolver y, probablemente, dándonos una visión parcial y polarizada de muchas cosas. Añádele posicionamiento pagado, y ya tenemos un buen lío montado: nos puede sugerir una solución que no es la mejor para nuestro propósito, y nos lo podemos creer.</p>
<p>Este modelo funciona, y cuando es muy sutil, pasa desapercibido. Por eso se llama manipulación. Cuando no es sutil, en cambio, la cosa revienta, se destapa un escándalo, y se acaba en un juicio y en una condena, <strong>como ya pasó</strong> con <a href="https://www.theguardian.com/news/2018/may/06/cambridge-analytica-how-turn-clicks-into-votes-christopher-wylie">el escándalo de Cambridge Analytica</a>. Cuando este modelo se lleva a un extremo, se crean burbujas de realidad, cámaras de resonancia, y la realidad se distorsiona. Se pierde la capacidad de criticar a la fuente, y se asume que la realidad es lo que se nos muestra.</p>
<p>La situación sigue avanzando en ese mismo sentido y el siguiente paso, según parece, es envolver el conocimiento dentro de modelos extensos de lenguaje que hacen las veces de &ldquo;el listo de la clase&rdquo;, o &ldquo;el listo del equipo&rdquo;, a quien preguntarle cómo resolver un cierto problema. &ldquo;ey, <em>copilot</em>, ¿cómo tengo que configurar un cliente HTTPS para poder usar certificados auto-firmados?&rdquo; y te escupe un código que pinta razonable y que probablemente funcione, o lo haga con mínimos cambios. Probablemente ni siquiera tenemos que ir más allá, con preguntas más elaboradas que requieren más conocimiento, tipo &ldquo;¿dónde tengo que configurar la cadena de confianza, y qué herramientas necesito para ello?&rdquo;. Y no hablemos ya del &ldquo;¿por qué?&rdquo;. El conocimiento ya no se tiene, se delega y se consume.</p>
<p>No me considero un <a href="https://es.wikipedia.org/wiki/Ludismo">ludita</a> ni un <a href="https://es.wikipedia.org/wiki/Neoludismo">neoludita</a>, pero hay cosas para las que no basta con preguntar y saber seguir instrucciones. Ni con copiar y pegar. El conocimiento adquirido, en lugar del que se delega a una base de preguntas y respuestas ajena, nos puede evitar errores muy graves. Hay errores técnicos, errores de ejecución, y errores de concepto, y estos últimos se evitan con conocimiento propio, construido sobre una base que hemos adquirido estudiando, y luego refinado a base de experimentar y equivocarnos en un entorno controlado hasta que tenemos los conceptos claros. Una vez se tienen los conceptos claros, no veo problemas en el asistente en sí, en el modelo de lenguaje o, si lo queremos llamar así, en la IA (😒). Yo mismo, probablemente, empiece en algún momento a usar este tipo de herramientas para tareas sencillas, repetitivas, tediosas y de bajo riesgo. Aún tengo mis reservas, claro, que es de lo que va este artículo, pero no pienso darle la espalda por completo a las posibilidades que tiene la tecnología en sí.</p>
<p>En donde primero veo un problema es que no todas las tareas son de bajo riesgo, y cuando hay riesgos altos para la salud, las finanzas personales o del común, o procesos industriales sensibles, es mejor no preguntar a un <em>chisme</em>, y que el trabajo lo haga alguien a quien se le puedan exigir responsabilidades. Hay una cita que se ha hecho famosa en los últimos años, atribuida a una presentación de IBM en 1979 (cuyo origen no he podido comprobar totalmente), que lo plantea ya entonces: &ldquo;<em>A computer can never be held accountable; therefore a computer must never make a management decision</em>&rdquo;: &ldquo;A una computadora nunca se le puede hacer responsable, por lo tanto, una computadora no debe nunca tomar una decisión de gestión&rdquo;. No podemos atribuir responsabilidad sobre las consecuencias de una decisión a una máquina. No podemos llevar a juicio a un secador de pelo por una electrocución en una bañera.</p>
<figure class="ma0 w-75">
    <img loading="lazy" src="/images/20240430-computeraccountable.jpg"
         alt="A COMPUTER CAN NEVER BE HELD ACCOUNTABLE --THEREFORE A COMPUTER MUST NEVER MAKE A MANAGEMENT DECISION"/> <figcaption>
            <p>Imagen atribuida a una presentación de IBM de 1979 que plantea el principio de no encargar decisiones a un ordenador cuando no se le puede hacer responsable de sus consecuencias.</p>
        </figcaption>
</figure>

<p>En segundo lugar, hay intereses ajenos detrás de los modelos. Estos desarrollos, visto lo visto, no se hacen poniendo tus objetivos o los míos, o el bien común, como primera prioridad. Por ejemplo, <a href="https://www.tomshardware.com/tech-industry/artificial-intelligence/jensen-huang-advises-against-learning-to-code-leave-it-up-to-ai">hay quienes sugieren que los niños no necesitan aprender a programar, y que se pueden centrar en usar este tipo de modelos, como el CEO de Nvidia</a>. Claramente. Si yo fuese el consejero delegado de la plataforma de hardware que más se usa y mejor se usa para entrenar y ejecutar modelos de lenguaje y aprendizaje automático de todo tipo, también me gustaría que la gente los usase en vez de programar. Si cada vez menos gente usa o depende más de proveedores cuyos modelos, a su vez, dependen de mis sistemas, y por lo tanto me los compran, ¡mejor! Si yo fuese el CEO de Nvidia, de hecho, me encantaría que los únicos programadores sobre la faz de la Tierra fuesen los empleados de Nvidia. Es como cuando salieron las calculadoras; el primer defensor de usar las calculadoras en lugar de aprender aritmética probablemente sería el que las vendía. Pero, intepretaciones mías aparte, la idea es que va a haber que seguir sabiendo programar aunque en la práctica y en el día a día sea menos necesario que hoy. Aprender a programar no se trata de aprender a escribir programas, sino a descomponer una solución en pasos sencillos, automatizables y repetibles &ndash;y eso va a seguir formando parte del día a día para muchísimos profesionales.</p>
<blockquote>
<p>❓ ¿Quién decide si el conjunto de datos con el que se ha entrenado un modelo extenso de lenguaje, como Chat GPT, es fiel a los hechos?, ¿qué garantías hay?, ¿cómo se mide la *imparcialidad *o la <em>equidad</em> de una respuesta?</p></blockquote>
<p>En tercer lugar, no me gusta que seleccionen información, en general, de acuerdo a cómo una empresa me percibe. Al hilo de lo que comentaba en <a href="https://gvisoc.com/posts/la-economia-de-tu-atencion/">La economía de tu atención</a>, <strong>la información que se nos coloca delante no está sujeta a nuestros intereses, sino a los de quien cobra por posicionarla</strong>. Nos van a devolver primero la información que ofrezca mejores resultados correlacionando el dinero que el autor haya pagado y la probabilidad de que nosotros la leamos, de acuerdo al perfil que han ido construyendo a base de espiarnos. De todos los contenidos por los que la plataforma de turno recibe ingresos, se nos coloca delante el subconjunto de enlaces en lo que podríamos a hacer click, y ahí es donde vamos a entrar y a quedarnos más tiempo. Y da igual si hacemos nuestro trabajo, porque si lo piensas, en una sesión de estudio o de trabajo, si se nos pone delante contenido más divertido, nos vamos a ir por el terraplén de la carnaza, los vídeos de gatitos, artículos escritos para polarizarnos y que van a conseguir una respuesta más rentable para la plataforma. Van a cobrar lo mismo, y probablemente mucho más, que si estamos trabajando; el tiempo invertido en escribir un informe o programar es tiempo perdido para ellos porque no estamos viendo anuncios. No pueden monetizar nuestro tiempo productivo. <strong>Tu productividad es coste de oportunidad</strong>.</p>
<blockquote>
<p>💡 Tu atención no tiene por qué ser productiva. Salvo a ti y a tu empleador, <strong>a nadie le importa si tú aprendes, o si haces tu trabajo</strong>, con tal de ingresar dinero por publicidad.</p></blockquote>
<p>¿Cómo se traslada esto al uso y al consumo de información a través de un modelo extenso de lenguaje? ¿Se podría estar explotando económicamente la fase de aprendizaje de los modelos para hacer unas respuestas más probables que otras?</p>
<p>Tampoco me gusta el hecho de que nos estamos moviendo a un modelo en el que los modelos de lenguaje van a estar definiendo cómo accedemos a la información, y cuál es la información a nuestro alcance. No me gusta la perspectiva de hacer depender el conocimiento disponible, el rango posible de respuestas, de mi habilidad a la hora de formular preguntas. Leer un libro te plantea preguntas en las que no habías pensado, sobre todo si eres un neófito en la materia en cuestión. Plantéate, por ejemplo, lo difícil que es encontrar la solución a un problema, o <em>saber si en realidad tienes un problema</em>, si ni siquiera sabes cómo articular una pregunta. Qué tienes que introducir en el cajón de texto del buscador. Por ejemplo, en mi caso, en el ámbito de lo legal: hay veces que ni sé formular una búsqueda básica en la web. Sin embargo, tras algo de lectura en una enciclopedia cualquiera, incluso en la Wikipedia, tras adquirir ciertos conceptos básicos, ya tengo la competencia suficiente como para distinguir un problema de otro, y puedo pensar en qué tengo que preguntar.</p>
<p>El problema de los modelos extensos de lenguaje que se están desarrollando a día de hoy es que ni siquiera ves los resultados de una búsqueda para ver varias fuentes o para ver qué tiene sentido y qué no. Ni siquiera podemos juzgar si la búsqueda era la adecuada para la serie de resultados que hemos obtenido, porque obtenemos una única respuesta, totalmente procesada. En una búsqueda web tradicional, a veces ves resultados tan dispares en la primera página que, de una forma más o menos intuitiva, decides refinar la búsqueda. Abres un par de resultados y no te ves reflejado, vuelves a buscar. Un modelo de lenguaje es como si el bibliotecario, experto en clasificar información y recuperarla, de repente <em>dice haberse**leído</em> toda la biblioteca, te asegura que lo ha entendido todo, y te da la información en viva voz, pero en realidad sin entender de qué leches está hablando. &ldquo;No te preocupes por esos tochos de libros, hazme caso a mí, que ya te lo explico yo&rdquo;. En casos concretos y superficiales, eso está bien. Pero si el riesgo es alto, ¿confiarías en esos resultados?, ¿en qué casos te gustaría tener acceso a los libros y dedicarle un par de horas a contrastar un poco la información y tomar tus propias notas? Y, lo que es peor, <strong>¿qué ocurre y de quién es la responsabilidad, en general, si un modelo empieza a dar prioridad sobre ideas, soluciones, productos o servicios de un determinado proveedor?</strong>, ¿cómo puede esto afectar a la competencia? ¿Qué ocurre si estos modelos empiezan a sesgar y a ponderar interpretaciones ideológicas en sus respuestas?, ¿de quién es la responsabilidad y a quién o en qué grado afecta a nuestra sociedad?</p>
<p>Imagínate que, hojeando el libro de texto de tu hijo, ves algo extraño y te das cuenta de que el libro de ciencias naturales quita importancia al cambio climático. Rascas un poco, y ves que el principal accionista de la editorial de turno es un lobby de los combustibles fósiles. Es un ejemplo muy extremo, pero una metáfora bastante clara de lo que me preocupa, que puede ser mucho más sutil y difícil de detectar si se hace diseñando el conjunto de material con el que se entrenaría un modelo. No hay que entrar en terrenos muy obvios, símplemente que un modelo sugiera que &ldquo;en general, la interpretación más aceptada es X&rdquo;, cuando se aplica a ámbitos socio-políticos, ideológicos o a la interpretación de hechos históricos, en sí es bastante serio. El trabajo de contrastar semejantes aseveraciones puede ser inmenso.</p>
<p>Mi opinión es que, en general, estos modelos reducen la independencia a la hora de tomar decisiones, aprender y llegar a conclusiones, o directamente avanzar el propio conocimiento. Abusar de ellos o utilizarlos como atajo puede mejorar la productividad cuando se utiliza para tareas que no aportan mucho valor para el tiempo que consumen, pero en ciertos casos puede convertirnos muy rápidamente en prisioneros de intereses ajenos a los nuestros, sin nosotros ser conscientes. Personalmente, creo que si no tenemos un mecanismo claro para garantizar que las respuestas son neutras, equilibradas, y que ponen nuestros intereses en primer lugar y no los de terceros, creo que es un sistema increíblemente fácil de manipular y <a href="https://gvisoc.com/posts/enmierdificacion/">enmierdificar</a>, y podemos estar siendo cómplices.</p>
]]></content:encoded>
    </item>
    <item>
      <title>¿Por qué Telegram no?</title>
      <link>https://gvisoc.com/posts/por-que-telegram-no/</link>
      <pubDate>Tue, 23 Apr 2024 23:30:57 +0000</pubDate><author>gabriel@gvisoc.com (Gabriel Viso Carrera)</author>
      <guid>https://gvisoc.com/posts/por-que-telegram-no/</guid>
      <description>Si necesitas privacidad, Telegram no es una opción.</description>
      <content:encoded><![CDATA[<p>Aunque muchos de mis amigos me recuerdan que, básicamente, les arrastré a Telegram cuando <a href="https://hipertextual.com/2024/02/facebook-compro-a-whatsapp-aniversario">Facebook compró WhatsApp en 2014</a>, <strong>lo cierto es que limito mucho mi uso de esta aplicación y hace muchos años que no la recomiendo</strong>. En este artículo os voy a contar por qué, pero no quiero que se entienda como un artículo negativo en términos absolutos; uso Telegram bastante y, seguramente, lo seguiré usando bastante durante bastante tiempo. Se trata de una diferencia de principios y, sobre todo, una crítica a la prensa generalista y una llamada de atención sobre ciertos aspectos que suelen pasar desapercibidos, pero que hay que conocer para poder tener unas expectativas realistas.</p>
<p><a href="https://telegram.org">Telegram</a> es una aplicación de mensajería instantánea que, según su muchas fuentes, está centrada en la seguridad y en la velocidad.</p>
<p>Sin embargo, y para empezar, no es para todos porque no cumple con los criterios de accesibilidad móvil y, de esa forma, excluye a todos los usuarios con deficiencias visuales de su público objetivo. Para ellos, ni seguridad, ni velocidad, ni nada.</p>
<p>En cuanto a la seguridad en la práctica, la <em>forma</em> de abordar este tema es bastante cuestionable. El protocolo de seguridad que esta aplicación utiliza, <a href="https://es.wikipedia.org/wiki/MTProto">MTProto</a>, si bien usa técnicas de cifrado estándar, es un desarrollo a medida injustificado, ya que existían alternativas abiertas disponibles. Y no es de código abierto en su totalidad. En este punto habrá muchas opiniones bastante fuertes, y equivocadas, diciendo que MTProto es de código abierto. Lo que han publicado y es abierto es la documentación, <em>a modo de**estándar</em>. Ni siquiera es un estándar, han adoptado el modelo de estándar abierto. Es decir, Telegram ha publicado documentación suficiente para que muchos otros desarrolladores implementen MTProto para sus aplicaciones, a un nivel de detalle suficiente e inequívoco como para que, si fuera un estándar, pudiese considerarse como tal. Por la parte del código fuente, los clientes son de código abierto, pero la implementación de la parte servidora no lo es. Como consecuencia de la apertura de la documentación existen versiones de código abierto de la parte del servidor, pero el código fuente que usa Telegram en su servidor no está disponible ni hay indicios de que vayan a liberarlo pronto. Por lo tanto, <em>el desarrollo que ejecutan los servidores de Telegram</em> no es de código abierto, y por lo tanto el sistema no lo es en términos absolutos, o extremo a extremo.</p>
<p>Esto fue muy criticado en su día porque era muy difícil demostrar la seguridad de la red al ser cerrado, nuevo y a medida. En general, escribir tu propio código de seguridad es desaconsejable; cuando se programa se comenten errores, y cometer errores en el código de seguridad es fatal porque se pone en riesgo la integridad de la comunicación y de los usuarios. Pero, además, hacerlo con el código cerrado obliga a gastar grandes cantidades de dinero en auditar la seguridad por medios privados, y hace más lenta la reacción de la empresa ante fallos de seguridad: la cantidad de potenciales correctores del código es mucho menor. No estamos hablando de una empresa como Microsoft, con cientos de miles de empleados, sino de una <em>start-up</em>.</p>
<p>En cualquier caso y gracias a que han seguido el modelo de estándar abierto, a día de hoy nadie duda de la seguridad de Telegram; de hecho <a href="https://en.wikipedia.org/wiki/Telegram_%28software%29#Privacy">la seguridad de su protocolo ha sido formalmente probada</a> por la <a href="https://www.uniud.it/en/uniud-international">Universidad de Udine</a>. <strong>Pero hay que tener muy claro que lo que ha sido probado es la seguridad del protocolo, y formalmente: <em>sobre el papel</em></strong>. La seguridad de la implementación de MTProto en la red de Telegram sigue requiriendo un ejercicio de confianza porque no se ha probado de forma práctica. Hay que confiar en Telegram, en sus mantenedores y en sus prácticas.</p>
<p>Por si esto no fuese suficiente, los mensajes no están cifrados extremo a extremo por defecto: es opcional. Para usar el cifrado extremo a extremo y tener conversaciones seguras entre usuarios hay que usar la característica &ldquo;chat secreto&rdquo;. Si no, los mensajes se cifran en tránsito, punto a punto: en lugar de enviarme mensajes cifrados de tal forma que sólo yo los puedo descifrar, los envías usando claves de Telegram, que luego me los envía a mí. Por lo tanto, en los servidores de Telegram, los mensajes son legibles porque Telegram tiene acceso a las claves de cifrado. Sin poner en duda la política de privacidad de Telegram y su estructura y prácticas internas, lo que esto quiere decir a nivel práctico es que, si sus servidores o sus empleados se ven comprometidos y hay una brecha de seguridad con fuga de datos, esos mensajes van a aparecer en la tercera página de resultados de Google Dark Web. Y es innecesario: nadie, en realidad, entiende por qué no se aplica cifrado extremo a extremo a todo. Por otro lado, no es posible aplicar cifrado extremo a extremo a los grupos, en absoluto.</p>
<p>Esto último, además, no es conocido por todos los usuarios. Todos, incluido yo, <em>tomamos decisiones de oídas</em>, sin contrastar los hechos, en mayor o menor medida. Lo que la prensa generalista publica y el consenso popular asume, es que Telegram es una aplicación enfocada en la seguridad, y que por lo tanto es segura (por defecto), y ya está. Todos felices. Y lo cierto es que, si bien <em>puede ser segura, puede que sea segura,</em> o <em>es segura sobre el papel</em>, desde luego no lo es <strong>por defecto</strong>.</p>
<p>Además de todo esto, la prensa española a menudo se inventa un énfasis en la privacidad que, en realidad, no existe. Incluso en la web oficial, Telegram se tilda a sí mismo de Privada, aludiendo a que los mensajes están cifrados de forma robusta y se autodestruyen, cosa que ya hemos discutido que no es el comportamiento por defecto. Pero, independientemente de la seguridad opcional y de cómo sea la política de privacidad de Telegram como empresa hacia los datos de los usuarios, la aplicación no protege nuestra privacidad <em>frente a otros usuarios</em>; al menos no como debería.</p>
<p>A mi parecer y a día de hoy, Telegram tiene tres carencias muy grandes, de las cuales dos que son funciones de pago o, peor, inefectivas cuando tu problema es un usuario de Telegram Premium:</p>
<ol>
<li>Si eres un usuario de Telegram Premium, puedes ver los estados de última conexión y en línea de los usuarios sin compartir tus propios estados. Esto no es demasiado grave, porque si un usuario no comparte estos estados no los vas a ver; sin embargo rompe la reciprocidad de esta opción. En su día, y en otras plataformas de mensajería, si quieres ver si Pepe está conectado, debes permitir que Pepe vea si estás conectado. Es un principio de igualdad y de respeto mutuo. Con Telegram, si pagas, estás exento de reciprocidad. Muchos podéis argumentar que si no quiero que un cualquiera sepa si estoy conectado, puedo ocultar esta información de todo el mundo, pero, ¿y si yo quería compartirla con mis contactos? En cualquier caso, esta decisión de producto es agresiva, injustificada, y supone un privilegio arbitrario que sólo se explica desde el punto de vista puramente comercial.</li>
<li>Mucho más grave es que un usuario de Telegram Premium puede establecer contacto con cualquiera, sin ningún tipo de límite, a no ser que esté bloqueado o reportado. Esto quiere decir que <strong>nadie tiene derecho a decidir si permite que un desconocido le envíe un mensaje</strong>. En colectivos amenazados, desfavorecidos, o tradicionalmente objeto de abuso, esto quiere decir que el acosador siempre tiene acceso a las víctimas u objetivos. Un acosador, con un número de teléfono nuevo y 5€ puede enviar mensajes de todo tipo a quien quiera, durante un mes o hasta que sea bloqueado y reportado. Y luego sólo tiene que registrarse con otro número y volver a hacerlo.</li>
<li>Si no quieres compartir tu número de teléfono, puedes crear un nombre de usuario. Pero si lo haces, cualquiera puede encontrarte a través de la búsqueda global, porque los usuarios de Telegram son públicos. Por lo tanto, si no quieres compartir tu teléfono para evitar exponerte hasta ese punto, te obligan a exponerte de otra forma y completamente.</li>
</ol>
<p><img loading="lazy" src="/images/20240423-lastseen.png"></p>
<p><img loading="lazy" src="/images/20240423-lastseenapp.png"></p>
<p><img loading="lazy" src="/images/20240423-privacy.png"></p>
<p><img loading="lazy" src="/images/20240423-privacyapp.png"></p>
<p><img loading="lazy" src="/images/20240423-privacyappvid.png"></p>
<p>Las distintas características &ldquo;<em>premium</em>&rdquo; a las que me refiero en este artículo mostradas por la propia aplicación</p>
<p>El hecho de que cualquiera pueda establecer contacto contigo, y que ocultar tu número de teléfono suponga aparecer en el buscador global, hace de Telegram una aplicación extremadamente rentable y atractiva para el <em>spam</em>, el <em>phishing</em> y el timo digital, en general: no puedes impedir que te contacten al menos una vez. Además, esto es especialmente grave para usuarios que están amenazados, de alguna forma. Un acosador siempre tiene acceso a su víctima en tanto en cuanto es capaz de encontrarla en Telegram.</p>
<blockquote>
<p>🚨 Telegram no es una aplicación que ponga la privacidad de sus usuarios como una prioridad a la hora de definirse. Puede que Telegram respete nuestra privacidad como parte interesada, y no esté inspeccionando nuestros datos ni explotándolos comercialmente, pero, ¿qué pasa con los timadores, los nazis, los racistas, los homófobos, los asesinos, y el resto de la escoria? Pues, al parecer, que cada palo aguante su vela.</p></blockquote>
<p>Que una empresa <em>cobre</em> por la privacidad es algo que no encaja con mis principios, sobre todo cuando da gratis tanto, y tan bueno; no hace falta hacer ahora una lista de canales, grupos, bots, almacenamiento, y demás <a href="https://adrianperales.com/2024/04/los-sistemas-de-mensajeria-perdieron-el-rumbo/">características de casi cualquier tipo que para muchos de nosotros, como Adrián, en realidad sobran</a> en una aplicación de mensajería. La mayoría de las veces, la gente que <em>realmente necesita privacidad</em> es gente con dificultades en muchos ámbitos de su vida; hacerles pagar precisamente por la privacidad es una estrategia de negocio cruel. Es cierto que hay formas de limitar el <em>spam</em>, o que podemos vivir con él, podemos ignorarlo, reportarlo, e incluso denunciar a nuestros acosadores. Pero el hecho de que una característica <em>premium</em> dé el privilegio de saltarse la privacidad de los otros como parte de su oferta comercial deja ver una cultura de producto y unos principios que dejan mucho que desear.</p>
<p>Si necesitas privacidad, Telegram no es una opción. Tenlo en cuenta a la hora de decidir para qué usarlo.</p>
<hr>
<h3 id="comentarios-previos-en-ghost">Comentarios previos (en Ghost)</h3>
<p><strong>mdd</strong>, el 25 de abril de 2024, <strong>comentó</strong>:</p>
<blockquote>
<p>Es cierto que promocionan el premium de forma turbia, y que la app es lenta y pesada.</p>
<p>Pero el post ese tiene bastantes cosas falsas o malinterpretadas en mi opinión:</p>
<ul>
<li>No soporta APIs de accesibilidad: Falso. No lo hicieron inicialmente cuando estaban corriendo por sacar features, pero lo implementaron como en 2019.</li>
<li>No era necesario crear MTProto: xdddd ahora hay el protocolo de Signal y otros, pero en 2014 no habia un solo protocolo que soportase todo lo que inventó Telegram: canales, grupos de 2000 personas, super grupos, chats e2e, etc&hellip; todo eso se inventó con MTProto.</li>
<li>MTProto server no es open source: cierto, pero aunque lo fuera, sería imposible saber si es el código que están usando. Probablemente, tienen una versión que se ejecuta de forma distribuida y muy optimizada que no quieren liberar para que nadie pueda lanzar un competidor de TG a gran escala. Lo que quiero decir es que no añadiría ninguna a los usuarios que lo fuese, y crearía amenaza de clones a Telegram.</li>
<li>Encriptacion e2e no es por defecto, y no se sabe porqué: si se sabe porqué: no hay NINGUN protocolo que sea e2e con grupos, canales y soporte multidispositivo que funcione bien. Whatsapp y Signal son los que estan más cerca, y mira lo mal que funciona WPP Web. Es técnicamente difícil de conseguir.</li>
<li>&ldquo;un usuario de Telegram Premium puede establecer contacto con cualquiera&rdquo;: Esto a mi me parece más una función chorra que han metido al Premium para venderlo que algo que haya &ldquo;quitado&rdquo; al resto. No existe en ninguna otra app y no tiene utilidad práctica salvo que seas famoso y la gente sepa tu número.</li>
<li>&ldquo;Si no quieres compartir tu número de teléfono, puedes crear un nombre de usuario. Pero si lo haces, cualquiera puede encontrarte&rdquo;: acaso hay alguna app en la que la gente no pueda hablarte adivinando tu usuario o número? Es justo el point de estas apps. Si no quieres que te encuentren, ponte un @ raro y listos</li>
</ul>
<p>En resumen: yo lo único que veo sketchy es lo de pagar por ver las últimas horas sin que se vea la tuya, pero vamos, no es para tanto. Bastante peor es lo lenta que va la app y la forma de desarrollo a trompicones.</p></blockquote>
<p><strong>Gabriel Viso Carrera</strong>, el 25 de abril de 2024, <strong>respondió</strong>:</p>
<blockquote>
<blockquote>
<p>Me parece que quien está interpretando mal el artículo eres tú.</p>
<ol>
<li>El lector de pantalla en iOS sigue sin funcionar correctamente en Telegram. Puedes seguir los comentarios a este post en Mastodon y encontrarás quien te lo confirme: usuarios con discapacidades visuales. No lo digo yo, lo dice quien no puede usar la aplicación por falta de accesibilidad. Por lo tanto, de falso nada.</li>
<li>El protocolo MTProto y el de Signal no es la única forma de hacer cifrado extremo a extremo. El protocolo PGP se puede automatizar de forma transparente al usuario y es décadas anterior a MTProto.</li>
<li>Signal y Matrix funcionan bien en ese sentido, e iMessage funciona impecablemente bien. ¿Hay un compromiso entre seguridad y comodidad? Sí, pero eso no quiere decir que funcione mal.</li>
<li>Que los usuarios Premium puedan establecer contacto con cualquiera es una falta de privacidad y seguridad total. Será una función chorra para ti, pero hay mucha gente (países enteros) para los que esto es un vector de ataque claro.</li>
<li>De lo que se trata es de escoger. Si tú quieres que la gente te pueda buscar, me parece perfecto, pero tu preferencia no tiene por qué ser la de los demás. Yo prefiero dar mi número de teléfono y / o mi nombre de usuario a quien yo quiera. Si no puedo escoger no estar en los resultados del buscador global, no tengo la privacidad que quiero o que necesito.</li>
</ol>
<p>Que estas cosas te parezcan cuestionables habla más de tus circunstancias que de la propia aplicación. No tienes problemas de privacidad, no necesitas comunicaciones seguras: muy bien, suerte la tuya. El punto del artículo es que este tipo de decisiones hace que Telegram no sea una aplicación tan seria como se quiere vender en lo que se refiere a privacidad y seguridad.</p></blockquote></blockquote>
]]></content:encoded>
    </item>
    <item>
      <title>Igual de personal, pero mucho más rápido</title>
      <link>https://gvisoc.com/posts/personal-y-rapido/</link>
      <pubDate>Fri, 19 Apr 2024 11:49:04 +0000</pubDate><author>gabriel@gvisoc.com (Gabriel Viso Carrera)</author>
      <guid>https://gvisoc.com/posts/personal-y-rapido/</guid>
      <description>Cuando las barbas del vecino veas pelar, no alojes cosas en tu NAS.</description>
      <content:encoded><![CDATA[<p>Esta semana no he publicado ningún artículo más allá del mero eco de <a href="https://gvisoc.com/posts/publicidad-en-windows-11-otra-vez/">la falta de vergüenza de Microsoft</a>, que está probando publicidad en Windows 11. Un producto de 145€.</p>
<p>En lugar de escribir, me he dedicado a mover <a href="https://fedi.gvisoc.com/@gabriel">mi instancia personal de mastodon</a>, este blog, y <a href="https://micromaquina.com">micromáquina</a>, desde una Raspberry Pi 4B de 4GB a un Intel NUC. Ya tenía pensado mover todo a mi NAS utilizando Docker, pero finalmente decidí separar las cosas: en vez de seguir apilando Raspberrys, esta semana consolidé todo en una nueva máquina de mayor potencia pero consumo relativamente contenido.</p>
<p><img alt="Una Raspberry Pi con una caja disipadora. A su lado hay un disco duro conectado por USB." loading="lazy" src="/images/20240419-rpi.jpg">Esta Raspberry Pi 4, de 4 GB, llevaba encendida dando servicio a mi instancia de Mastodon y a Micromáquina durante más de 1 año y medio, ininterrumpidamente.</p>
<p>La motivación principal para este movimiento ha sido la experiencia de <a href="https://fedi.gvisoc.com/@vidalpascual@mas.to">Jacobo Vidal Pascual</a>, del podcast Desde El Reloj, con una serie de fallos en su NAS.</p>
<p>Podéis escucharle aquí: &ldquo;<a href="https://www.desdeelreloj.com/e0822/">E0822: 32 horas sin NAS, sin Docker y sin página web</a>&rdquo;</p>

<style>
.toot {
    --toot-bg: var(--entry);
    --toot-border: rgba(0,0,0,0.1);
    --toot-radius: 12px;
    --toot-shadow: 0 1px 3px rgba(0,0,0,0.1);

    background: var(--toot-bg);
    border: 1px solid var(--toot-border);
    border-radius: var(--toot-radius);
    box-shadow: var(--toot-shadow);
    padding: 16px;
    margin: 1.5rem auto;
    max-width: 600px;
    font-family: -apple-system, BlinkMacSystemFont, system-ui, sans-serif;
}

.dark .toot {
    --toot-border: rgba(255,255,255,0.1);
    --toot-shadow: 0 1px 3px rgba(0,0,0,0.2);
}

.toot-header {
    display: flex;
    align-items: flex-start;
    gap: 12px;
    margin-bottom: 12px;
}

.toot-profile img {
    width: 48px;
    height: 48px;
    border-radius: 4px;
    display: block;
}

.toot-author {
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.toot-author-name {
    color: var(--primary);
    font-weight: 700;
    text-decoration: none;
    font-size: 15px;
    line-height: 20px;
}

.toot-author-handle {
    color: var(--secondary);
    text-decoration: none;
    font-size: 14px;
    line-height: 18px;
}

.toot-content {
    color: var(--content);
    font-size: 15px;
    line-height: 1.5;
    margin: 12px 0;
}

.toot-content p {
    margin: 0 0 12px;
}

.toot-content p:last-child {
    margin-bottom: 0;
}

.toot-content a {
    color: #2b90d9;
    text-decoration: none;
}

.toot-content a:hover {
    text-decoration: underline;
}

.toot-media-grid {
    display: grid;
    grid-gap: 8px;
    margin: 12px 0;
    border-radius: 12px;
    overflow: hidden;
}

.toot-media-grid[data-count="1"] {
    grid-template-columns: 1fr;
}

.toot-media-grid[data-count="2"] {
    grid-template-columns: repeat(2, 1fr);
}

.toot-media-grid[data-count="3"] {
    grid-template-columns: repeat(2, 1fr);
}

.toot-media-grid[data-count="3"] > :first-child {
    grid-column: 1 / -1;
}

.toot-media-grid[data-count="4"] {
    grid-template-columns: repeat(2, 1fr);
}

.toot-media-item img {
    width: 100%;
    height: auto;
    display: block;
    border-radius: 4px;
}

.toot-footer {
    margin-top: 12px;
    padding-top: 12px;
    border-top: 1px solid var(--toot-border);
    color: var(--secondary);
    font-size: 14px;
}

.toot-date {
    color: inherit;
    text-decoration: none;
}

.toot-date:hover {
    text-decoration: underline;
}
</style>








    
    
        
        
    

    
        <div class="toot">
            <div class="toot-header">
                <a class="toot-profile" href="https://mas.to/@desdeelreloj" rel="noopener">
                    <img src="https://media.mas.to/accounts/avatars/109/694/690/202/287/596/original/05c31515605728cb.jpg"
                         alt="Avatar for @desdeelreloj@mas.to"
                         loading="lazy">
                </a>
                <div class="toot-author">
                    <a class="toot-author-name"
                       href="https://mas.to/@desdeelreloj"
                       rel="noopener">Desde El Reloj</a>
                    <a class="toot-author-handle"
                       href="https://mas.to/@desdeelreloj"
                       rel="noopener">@desdeelreloj@mas.to</a>
                </div>
            </div>

            <div class="toot-content"><p>Sigo con la web caída, disculpad las molestias… 😩</p></div>

            

            <div class="toot-footer">
                <a href="https://mas.to@desdeelreloj/status/112240632440123033"
                   class="toot-date"
                   rel="noopener">9:48 AM · abr. 9, 2024</a>
            </div>
        </div>
    


<p>El relato de los problemas causados por componentes moribundos, el precio de reemplazarlos y el riesgo que corrieron sus archivos personales, me dejaban claro el mensaje: tener varios servidores en mi NAS, constantemente accedidos por todos vosotros y por Activity Pub en el caso de Mastodon, elevaría el acceso a los discos a un ritmo fuera de mi control, reduciendo su vida útil. Los componentes de un NAS son *bastante *más caros que los componentes de un equipo tradicional, porque están pensados para evitar errores que no afectan el tipo de servicios que quiero alojar: para mi instancia de Mastodon y mis webs no necesito ni memoria ECC, ni discos en RAID; con una buena estrategia de copias de seguridad me basta. La perspectiva de poder llegar a ver todos mis datos en riesgo por el hecho de alojar webs públicas y los costes asociados no me hacían ninguna gracia.</p>
<p>Por otro lado, mi NAS es de Synology, lo cual tiene una serie de inconvenientes derivados de la licencia de su software y su política de soporte. No ya por cuestiones éticas de licencias del software y potencial <a href="https://gvisoc.com/posts/enmierdificacion/"><em>enmierdificación</em></a> futura a varios nieveles, sino también porque todo esto nos sujeta a políticas de soporte y fin de actualizaciones por las que podemos llegar a vernos obligados a renovar un equipo que, de otra manera, tendría una vida útil mucho mayor.</p>
<p>Así que nada: cuanto, antes mejor, y me puse manos a la obra.</p>
<p>Los beneficios de este cambio son varios:</p>
<ul>
<li>A corto plazo, el aprendizaje. Estoy aprendiendo un montón acerca de <em>proxies inversos</em> y de Docker, puesto que mover una instancia de Mastodon desde una máquina física a contenedores Docker, sin perder datos, no es trivial.</li>
<li>A medio plazo tiene los beneficios ya comentados en el área de la vida útil del <em>hardware</em> donde tengo nuestros datos personales y los de la familia.</li>
<li>A largo plazo, estos cambios transforman la forma de relacionarnos con internet y a través de internet, ya que nos devuelven un control que perdimos hace tiempo porque hacen de la tecnología algo mucho más personal.</li>
</ul>
<p>Por el momento, ya se va notando una mejoría de rendimiento importante.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Publicidad en Windows 11, por si lo dudabas</title>
      <link>https://gvisoc.com/posts/publicidad-en-windows-11-otra-vez/</link>
      <pubDate>Sun, 14 Apr 2024 20:40:31 +0000</pubDate><author>gabriel@gvisoc.com (Gabriel Viso Carrera)</author>
      <guid>https://gvisoc.com/posts/publicidad-en-windows-11-otra-vez/</guid>
      <description>Microsoft te cobra 145€ y utiliza tu CPU y tus datos para su propio beneficio.</description>
      <content:encoded><![CDATA[<p>La noticia saltaba a finales de la semana pasada, y la leía por primera vez en BleepingComputer: <a href="https://www.bleepingcomputer.com/news/microsoft/microsoft-now-testing-app-ads-in-windows-11s-start-menu/"><em>Microsoft now testing app ads in Windows 11&rsquo;s Start menu</em></a>. La funcionalidad está siendo desplegada a un pequeño grupo de usuarios en la versión 22635.3495 del canal Insider Preview. No es nuevo; la publicidad en el sistema operativo ya lleva unas cuantas versiones &ldquo;animando&rdquo; al usuario a usar más características de la cuenta de Microsoft u otros productos y servicios de la compañía, como One Drive y similares. O para que te compres un ordenador nuevo, si el que tienes no soporta oficialmente Windows 11.</p>
<figure class="ma0 w-75">
    <img loading="lazy" src="/images/20230414-win11-ads.webp"
         alt="App ads in the Windows 11 Start menu"/> <figcaption>
            <p>Anuncio de una aplicación en el menú de Inicio (Microsoft, tomado de BleepingComputer</p>
        </figcaption>
</figure>

<p>En cualquier caso, <a href="https://gvisoc.com/posts/enmierdificacion/">enmierdificación</a> en estado puro.</p>
<p>Antes buscabas soluciones a tus problemas, cuando los tenías, poniendo algo de esfuerzo en ello. Aprendías por el camino, comparando soluciones, mirando el problema desde varios ángulos. Ahora Windows se encarga tirarte a la cara anuncios de aplicaciones que probablemente no necesites pero tu telemetría apunta un posible interés, y que lo más seguro es que te van a distraer todavía más.</p>
<p><strong>Un sistema operativo que Microsoft ofrece por 145€ en su versión más básica</strong> a 15 de abril de 2024 <strong>utiliza recursos del ordenador que has pagado con tu esfuerzo para obtener más ingresos</strong>. Todo esto, por supuesto, utilizando la telemetría opcional, que recoge el uso de aplicaciones y servicios, tu identificador de publicidad y, en definitiva, tus datos. Y no para ofrecerte mejores experiencias, sino para ofrecer a los fabricantes de software que han pagado una puerta de entrada en tu vida, y por lo tanto acceso a tus datos, <a href="https://gvisoc.com/posts/la-economia-de-tu-atencion/">tu atención</a> o a tu dinero.</p>
<p>No sé qué más decir que no sea repetir más y tirarme a lo más hondo del pozo de la náusea, pero hoy más que nunca me alegro de estar usando GNU/Linux en exclusiva y con todas las consecuencias.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Beeper, la seguridad y la cortesía</title>
      <link>https://gvisoc.com/posts/beeper-seguridad/</link>
      <pubDate>Thu, 11 Apr 2024 00:49:35 +0000</pubDate><author>gabriel@gvisoc.com (Gabriel Viso Carrera)</author>
      <guid>https://gvisoc.com/posts/beeper-seguridad/</guid>
      <description>Si usas Beeper, estás perdiendo el cifrado extremo a extremo de muchas redes. Procura que tus contactos lo sepan, y si no están de acuerdo, escúchalos.</description>
      <content:encoded><![CDATA[<p>En los últimos días, <a href="https://www.beeper.com/">Beeper</a> vuelve a las noticias por dos razones: en primer lugar, <a href="https://blog.beeper.com/2024/04/09/beeper-is-now-available/">ya está disponible para todo el mundo</a> y no hay una lista de espera para empezar a usarla; en segundo lugar, porque <a href="https://blog.beeper.com/2024/04/09/beeper-is-joining-automattic/">ha sido comprada</a> por <a href="https://automattic.com/about/">Automattic</a>, que es la empresa tras Wordpress, Pocket Casts y muchas otras plataformas y aplicaciones relacionadas con la publicación y el consumo de contenidos.</p>
<p>Sin embargo, yo voy a hablar de cómo funciona y qué tenemos que tener en cuenta para <strong>ajustar nuestras expectativas y respetar las de los demás</strong>.</p>
<p>Para quien no sepa qué es Beeper: se trata de una aplicación cuya misión es aglutinar todas las redes de mensajería instantánea en una sóla aplicación. Esta premisa, muy atractiva y potente, se consigue desplegando un servidor de <a href="https://matrix.org/">Matrix</a> y habilitando todos los <em>bridges</em> o puentes necesarios. De esta forma, la aplicación de Beeper se comunica con su servidor, o con el tuyo puesto puedes alojar tu propio servidor, usando el protocolo de Matrix (si es que no han implementado el suyo propio), que de por sí es seguro, eficiente y descentralizado. Una vez en el servidor, éste cede el mensaje a la red que corresponda, usando el puente adecuado.</p>
<p>En sí, Beeper actúa como una pasarela o <em>relé</em> de mensajería. Es una propuesta bastante sensata e inteligente. Y que requiere poco trabajo por parte de Beeper, ya que la mayoría de esos puentes existían ya bajo alguna u otra licencia de código libre o abierto, para ser utilizados directamente o producir un derivado. Sin embargo, tiene una clara desventaja que hay que tener en cuenta porque nos afecta tanto a nosotros como a nuestros contactos.</p>
<p>De acuerdo a cómo funcionan las cosas, y a <a href="https://www.beeper.com/faq#how-does-beeper-connect-to-encrypted-chat-networks-like-imessage-signal-whatsapp">sus preguntas frecuentes</a>, <strong>el cifrado extremo a extremo deja de serlo cuando usamos Beeper para comunicarnos a través de servicios como iMessage, WhatsApp o Signal</strong>. Ninguna de estas redes de mensajería utiliza Matrix nativamente, por lo que lo que Beeper hace es:</p>
<ol>
<li>Cifra tu mensaje en tu dispositivo, mediante la aplicación de Beeper, utilizando el protocolo de Matrix (si es que no han implementado el suyo propio), y lo envía al servidor de Beeper.</li>
<li>El servidor de Beeper descifra el mensaje, selecciona la pasarela correspondiente, y lo cifra utilizando el protocolo de la red de destino.</li>
<li>Lo envía al destinatario a través del puente adecuado.</li>
</ol>
<p>Por lo tanto, y como ya deberíamos haber sospechado, el mensaje está en texto claro, en algún momento, en el servidor de Beeper. Esto tiene dos consecuencias:</p>
<ol>
<li><strong>Usar Beeper requiere un ejercicio de confianza hacia el servidor de Beeper, hacia Beeper y hacia Automattic</strong>. El servidor en sí, su software, su proveedor de infraestructura, o las librerías que usa, puede tener una vulnerabilidad y que, en caso de un ataque a cualquiera de esos elementos, tus comunicaciones se filtren. Beeper puede declarar que no almacena los mensajes ni a propósito ni por accidente y que no los van a estar mirando, como creo que lo declaran. Automattic puede tener un registro impecable en lo referente a respetar los principios y la independencia de sus adquisiciones en lo que se refiere a la privacidad y al uso de los datos. Todas estas cosas están muy bien, pero somos nosotros quienes debemos decidir si nos lo creemos o no.</li>
<li><strong>Usar Beeper afecta a nuestros contactos</strong>, no sólo a nosotros mismos. <em>Nuestros contactos pueden haber elegido Signal**porque está cifrado extremo a extremo</em>. No deberíamos presuponer que nuestros contactos van a estar contentos con el hecho de que los mensajes se descifren en Beeper, y el hecho de que nosotros confiemos en Beeper no quiere decir que ellos tengan por qué hacerlo.</li>
</ol>
<blockquote>
<p>🚨 Si usas Beeper, ten en cuenta que a alguno de tus contactos le puedes estar haciendo la puñeta. Háblalo con ellos.</p></blockquote>
<p>A mí, personalmente, me parece que esto va a hacer algo más difícil las comunicaciones seguras desde regiones geopolíticas menos amigas de los derechos humanos. Ahora mismo, alguien que quiera establecer comunicaciones con el exterior desde países de gobiernos autoritarios no sólo deben confiar que el destinatario con quien quieren hablar es quien dice ser, sino que además tienen que tener en cuenta que la seguridad puede estar comprometida en favor de la mera comodidad de la persona con la que quieren hablar. Sé que es algo a lo que muchos no nos afecta pero en general me parece, como poco, preocupante.</p>
<p>Igualmente me preocupa cómo esto afecta a los <em>whistleblowers</em>, esas personas que, asumiendo un alto riesgo personal y profesional, deciden denunciar un caso de corrupción o irreguridades corporativas: ¿qué ocurre si la persona, el periódico, o el organismo a quien denunciamos los hechos, está usando una pasarela como Beeper o de otro tipo, y se compromete?</p>
<p>En conclusión, mi opinión personal es que rebajar la seguridad de nuestras comunicaciones no es una decisión puramente personal, sino una decisión en la que tienen que estar de acuerdo las dos partes. <strong>Si usas Beeper, procura que se sepa.</strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>Enmierdificación</title>
      <link>https://gvisoc.com/posts/enmierdificacion/</link>
      <pubDate>Tue, 09 Apr 2024 07:38:06 +0000</pubDate><author>gabriel@gvisoc.com (Gabriel Viso Carrera)</author>
      <guid>https://gvisoc.com/posts/enmierdificacion/</guid>
      <description>&lt;p&gt;Cory Doctorow introdujo el término &amp;ldquo;&lt;em&gt;enshittification&lt;/em&gt;&amp;rdquo;, que podría definirse como un** proceso por el cual un determinado servicio digital se degrada hasta el punto de que utilizarlo es un asco, una miseria **y una mierda.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;👤 Cory Doctorow (&lt;a href=&#34;https://en.wikipedia.org/wiki/Cory_Doctorow&#34;&gt;wikipedia&lt;/a&gt; 🇺🇸) es un escritor de ciencia-ficción, periodista, &lt;em&gt;blogger&lt;/em&gt; y activista por los derechos digitales con doble nacionalidad, canadiense y británica. Es posible que te suene no sólo por sus novelas y por sus ensayos, sino también por ser un *blogger *veterano muy ligado a &lt;a href=&#34;https://boingboing.net/author/cory_doctorow_1&#34;&gt;Boing Boing&lt;/a&gt;, donde fue coeditor durante muchos años y también autor; sus artículos en Boing Boing y en &lt;a href=&#34;https://pluralistic.net&#34;&gt;Pluralistic&lt;/a&gt; se cuentan por miles.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>Cory Doctorow introdujo el término &ldquo;<em>enshittification</em>&rdquo;, que podría definirse como un** proceso por el cual un determinado servicio digital se degrada hasta el punto de que utilizarlo es un asco, una miseria **y una mierda.</p>
<blockquote>
<p>👤 Cory Doctorow (<a href="https://en.wikipedia.org/wiki/Cory_Doctorow">wikipedia</a> 🇺🇸) es un escritor de ciencia-ficción, periodista, <em>blogger</em> y activista por los derechos digitales con doble nacionalidad, canadiense y británica. Es posible que te suene no sólo por sus novelas y por sus ensayos, sino también por ser un *blogger *veterano muy ligado a <a href="https://boingboing.net/author/cory_doctorow_1">Boing Boing</a>, donde fue coeditor durante muchos años y también autor; sus artículos en Boing Boing y en <a href="https://pluralistic.net">Pluralistic</a> se cuentan por miles.</p></blockquote>
<p>Además, trabajó para la <a href="https://www.eff.org/"><em>Electronic Frontier Foundation</em></a> (<a href="https://es.wikipedia.org/wiki/Electronic_Frontier_Foundation">wikipedia</a> 🇪🇸), para la cual todavía colabora como asesor.</p>
<p>La palabra fue acuñada en su artículo &ldquo;<em>Social Quitting</em>&rdquo;, escrito enero de 2023 <a href="https://locusmag.com/2023/01/commentary-cory-doctorow-social-quitting/">en Locus Magazine</a> y reseñado tanto en su blog de medium como <a href="https://pluralistic.net/2023/01/08/watch-the-surpluses/#exogenous-shocks">en su blog personal, pluralistic.net</a>. Poco después, la carga semántica del término cuajó completamente en el artículo &ldquo;<a href="https://pluralistic.net/2023/01/21/potemkin-ai/#hey-guys">Tiktok&rsquo;s enshittification</a>&rdquo;, y empezó a repetirse en más artículos del propio autor y de otros. Entre esos otros me incluyo, me he referido a ella en varios foros como <strong>enmierdificación</strong>, que es la traducción que creo que mejor recoge ese matiz de transformación o *transmutación *en 💩</p>
<p>Es tan relevante que la <a href="https://americandialect.org/2023-word-of-the-year-is-enshittification/">Sociedad Americana del Dialecto escogió <em>enshittification</em> como la palabra del año en 2023</a>. Y como es un término que voy a usar mucho en este blog, quiero capturar su esencia en este artículo.</p>
<p>La palabra se introdujo al describir la decadencia y el desdén hacia los usuarios y los clientes de las redes sociales y mercados-plataforma. Un mercado-plataforma es un servicio en internet que pone en contacto productores con consumidores, de productos o servicios, y se lleva una tajada por cada transacción. Por ejemplo, eBay y Amazon empezaron cobrando una comisión por cada venta, y plataformas más extendidas hoy en día como AirBnb para alquiler de alojamiento de corta duración, o AirTasker, para ofrecer nuestra capacidad para realizar micro-trabajos, también. Si ganas dinero usando cualquiera de estas plataformas, por ejemplo porque traduces un trabajo mediante AirTasker, ésta se lleva una comisión.</p>
<p>Google también es un ejemplo de mercado plataforma, que pone en contacto productores de información con consumidores de la misma.</p>
<p>A través de su historia, este tipo de plataformas ha seguido más o menos consistentemente el siguiente proceso de enmierdificación, primero para los usuarios del gran público (quien compra, quien busca en Google), y luego para sus clientes (quien paga las comisiones para que sus anuncios o su contenido <em>patrocinado</em> aparezca arriba). Y es fácil reconocer cómo los servicios digitales, no ya sólo los mercados plataforma, van progresando a través de un ciclo de vida que los empeora constantemente hasta que ya no resultan útiles ni provechosos a nadie:</p>
<blockquote>
<p>Here is how platforms die: first, they are good to their users; then they abuse their users to make things better for their business customers; finally, they abuse those business customers to claw back all the value for themselves. Then, they die.</p>
<p>(Así es como mueren las plataformas: primero, son buenas para con sus usuarios; después abusan de sus usuarios para favorecer a sus clientes; finalmente, abusan de sus clientes para acaparar todo el valor para ellas mismas. Después, mueren.)</p></blockquote>
<p>El caso de Google es enorme, y como ejemplo es fantástico: su propia transición hacia un mercado plataforma de la publicidad es su enmierdificación en sí misma, y sigue la descripción de Cory Doctorow etapa a etapa:</p>
<ol>
<li><strong>Primera Etapa</strong>: en aquellos dos años entre 1998 y 2000, cuando Google todavía no tenía una división de negocio de anuncios y de posicionamiento por palabras, los resultados eran clasificados excelentemente por pura relevancia, y todos sus usuarios estábamos maravillados: por fin era fácil encontrar cosas en internet.</li>
<li><strong>Segunda Etapa</strong>: entre el 2000 y hoy, los usuarios reciben anuncios y resultados de búsqueda promocionados, cada vez más arriba y paulatinamente cada vez más; mientras, aparece la figura del cliente, que son los anunciantes que les pagan y reciben visitas gracias al posicionamiento comprado. Este posicionamiento se consigue realizando seguimiento a nuestra actividad en internet, que cada vez es más difícil de entender, limitar o evitar aún sin usar Google o tener cuenta de usuario. Con la llegada de Android, Google nos sigue a todas partes porque está en el bolsillo. Es el abuso de los usuarios en favor de sus clientes.</li>
<li><strong>Tercera Etapa</strong>: los <a href="https://www.trecebits.com/funciona-google-cada-vez-peor/">cada vez peores resultados de la búsqueda de Google</a> a pesar de su <a href="https://es.wired.com/articulos/google-enfrenta-demanda-por-violar-la-privacidad-en-el-modo-incognito-de-chrome">cada vez mayor apetito por tus datos personales</a> son sólo los efectos más recientes del proceso. Ahora mismo, sólo quien más paga aparece en primera página: los resultados de búsqueda son cada vez peores, menos diversos y menos relevantes para el usuario, y cada vez más clientes se quedan fuera de la primera página porque no pueden competir. Y recordemos: según <a href="https://es.wikipedia.org/wiki/Javier_Cansado">Javier Cansado</a>, <em>la tercera página de Google es la**Dark Web</em>. Y Google no deja de cobrar y de crecer, acaparando el valor para ella misma mientras abusa de sus clientes.</li>
<li>Obviamente, Google sigue ahí; todavía no se ha cerrado el proceso.</li>
</ol>
<p>Pero aunque el término se empezó explicando con las plataformas, es fácil extenderlo a otros ejemplos relacionados con la tecnología, como pueden ser <a href="https://es.ifixit.com/News/71352/como-el-emparejamiento-de-piezas-acaba-con-la-reparacion-independiente">los impedimentos a la reparación independiente</a> de los dispositivos por los que has pagado bajo el pretexto de protegerte. Sí, <em>te impedimos reparar tu dispositivo para protegerte</em>: es absurdo pero cierto. O <a href="https://computerhoy.com/windows/anuncios-windows-11-plan-microsoft-1231622">que Windows, un producto cuyo precio oficial es 145€, muestre publicidad</a> y contenido posicionado sin ningún tipo de rubor.</p>
<p>Todas estas cosas  hacen que te pares, te plantees que las cosas, antes, no eran así. Que antes todo era más transparente, más honesto y más personal. Y que te enfades, lógicamente.</p>
<p>Y todo lo que se <em>enmierdifica</em> lo hace al mismo tiempo que eleva los costes del cambio para que los usuarios y clientes no tengan tan fácil el irse a otro lado. Por ejemplo, cualquier aplicación de mensajería instantánea o red social comercial hace imposible o lamentable el contactar con usuarios de otras. Desde WhatsApp no podías contactar con un usuario de Telegram. Desde iMessage no podías contactar de forma segura con usuarios de Android, a los que enviaba mensajes SMS como si estuviéramos en la década de 1990.</p>
<p>Estábamos tan metidos en el barro que probablemente lo veíamos normal, hasta que recordamos que hay redes sociales federadas como <a href="https://es.wikipedia.org/wiki/Mastodon_%28red_social%29">Mastodon</a>, y mensajería descentralizada, como <a href="https://es.wikipedia.org/wiki/Extensible_Messaging_and_Presence_Protocol">XMPP</a>, que ponen en tela de juicio cualquier justificación técnica.</p>
<p>De hecho, la <a href="https://eur-lex.europa.eu/ES/legal-content/summary/digital-markets-act.html">Ley Europea de Mercados Digitales</a> ha bastado para, por un lado resolverlas, y por otro para poner en evidencia a todo el mundo. <a href="https://www.xatakamovil.com/apple/burbujas-chat-mensajes-android-seguiran-siendo-verdes-imessage-rcs">Apple</a> implementará compatibilidad con RCS, el sucesor de los SMS, permitiendo así contactar con usuarios de Android con un mínimo de seguridad; sin embargo, seguirá mostrando las burbujas del chat RCS en verde, color asignado actualmente a los SMS, lentos, obsoletos y que nadie debería usar por pura seguridad. Tú y yo lo sabemos, pero probablemente muchos usuarios de a pie ni se enteren del matiz, y sigan asociando las conversaciones con burbujas verdes con poca calidad. <a href="https://www.xataka.com/basics/interoperabilidad-whatsapp-que-que-podras-hacer-cuando-se-podran-enviar-mensajes-whatsapp-a-otras-apps">WhatsApp</a> también tiene lo suyo: permitirá interoperar con otras alternativas, pero segregará las conversaciones con otras plataformas en una pestaña aparte, haciendo de todo el tema un ejercicio de segregación bastante descarado. Ambos cumplen, sí, pero de forma que genera rechazo, fricción y vergüenza ajena.</p>
<p>La situación, a estas alturas, es tan pobre y generalizada que este tipo de cosas son casi como un despertar.</p>
<hr>
<p>La enmierdificación puede afectar a cualquier cosa más allá de la tecnología y los servicios digitales, como <a href="https://hipertextual.com/2022/07/bmw-asientos-calefactables-bajo-suscripcion">a los coches</a>, los tractores y, en general, a cualquier cosa en la que su responsable pueda llegar a pensar que no te está sacando el suficiente dinero. Aún así, en este blog me centraré en la tecnología y en servicios digitales, señalando víctimas de la enmierdificación y comparándolas con los remansos de calidad a los que todavía nos podemos retirar.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Notificaciones: menos es más</title>
      <link>https://gvisoc.com/posts/notificaciones-menos-es-mas/</link>
      <pubDate>Fri, 05 Apr 2024 04:10:38 +0000</pubDate><author>gabriel@gvisoc.com (Gabriel Viso Carrera)</author>
      <guid>https://gvisoc.com/posts/notificaciones-menos-es-mas/</guid>
      <description>Desactiva tus notificaciones, o casi todas; no son tan importantes y la mayoría ni siquiera son útiles.</description>
      <content:encoded><![CDATA[<p><strong>Las notificaciones <em>push</em></strong>, esa característica de las aplicaciones móviles y de escritorio que deberían usar para hacernos saber algún evento importante, pero que utilizan básicamente para <em>interrumpirnos</em>, <strong>están peor que nunca</strong>.</p>
<p>Lo has notado tú, lo he notado yo, y lo recoge The Verge en el artículo &ldquo;<a href="https://www.theverge.com/24119076/ios-android-notifications-focus-modes-scheduled-summary">It&rsquo;s time for a hard reset on notifications</a>&rdquo;: enmedio de notificaciones que querrías recibir porque pudieran interesarte, cada vez más aplicaciones y sitios web insertan notificaciones puramente publicitarias que no tienen otro objectivo que hacerte abrir la aplicación:</p>
<ul>
<li>Hace mucho tiempo que no publicas nada, deja que tus contactos sepan que estás bien.</li>
<li>Hemos seleccionado estas subastas para ti.</li>
<li>Termina tus deberes de Klingon Coloquial, porque un chaval de 13 años de Nebraska está a punto de superar tus logros.</li>
<li>Sólo queda una hora para completar los desafíos diarios de Parky Crunch.</li>
<li>¿Te gusta nuestra aplicación? Escribe una reseña, sólo te llevará 2 minutos.</li>
</ul>
<blockquote>
<p>Todas esas cosas de arriba se podrían completar con un &ldquo;<em><strong>&hellip; y lo que estés haciendo nos importa un bledo</strong></em>&rdquo;.</p></blockquote>
<p>Con esas notificaciones, vuelves a entrar en su aplicación y te arriesgas a caer en el pozo de *hacer scroll *durante un tiempo suficiente para imprimir unos cuantos anuncios para ti, y convertir la atención que has perdido en <a href="https://gvisoc.com/posts/la-economia-de-tu-atencion/">unos pocos ingresos para ellos</a>. Porque cuando abres una de esas notificaciones, el diseño de la aplicación va a <em>tirarte a la cara todo tipo de argucias y estímulos para que te quedes</em>.</p>
<p>Y, mientras tanto, tu trabajo, pareja, amigos, familia, tu libro, la serie o la película que estabas viendo, están desatendidos.</p>
<p>Llevo unos 7 años con pocas notificaciones en mi teléfono más que las llamadas telefónicas, mis bancos, y mensajes personales directos. Empezaba este viaje en agosto de 2017 y daba cuenta de ello en mi podcast &ldquo;<a href="https://podcasts.apple.com/au/podcast/sobre-la-marcha/id1259866113">sobre la marcha</a>&rdquo;; al poco tiempo (mayo de 2018) me daba cuenta de lo que este hecho cambiaba mi forma de relacionarme con mi teléfono móvil. Y no ha habido vuelta atrás.</p>
<p>En resumen:</p>
<ul>
<li><strong>Si no es una llamada, no es tan importante</strong>. Si alguien te necesita <em>ya</em>, lo que tiene que hacer es llamarte. Y si quien te llama no está en tus contactos o, peor, oculta su número, no es importante.</li>
<li><strong>Gestiona tu tiempo y tu atención tú mismo</strong>. Es muy molesto estar tomando un café con alguien y que esa persona esté constantemente mirando de reojo su teléfono móvil, porque no para de vibrar. No seas esa persona. No empeores tus relaciones sociales para cubir la cuota de ingresos por publicidad de algún desconocido al otro lado del mundo.</li>
<li><strong>Decide cuándo entrar en un aplicación tú mismo</strong>, no le des ese poder a ningún desarrollador. &ldquo;<em>¡Hace mucho tiempo que tus contactos no saben de ti!</em>&rdquo; es una forma muy falaz de decir &ldquo;<strong>hace mucho tiempo que no recibimos ingresos de tu actividad y ya es hora de que entres de nuevo en la aplicación</strong>&rdquo;.</li>
<li><strong>La inmensa mayoría de las notificaciones no sirven para nada</strong>. Es un completo despropósito que se te informe de todos los pasos que tu compra sigue desde que haces un pedido hasta que el repartidor te la deja en la puerta, y después un recordatorio de que metas los productos frescos en la nevera, y que luego se te acose para que dejes una reseña. Ése es un ejemplo con el que coincido palabra por palabra con el artículo de The Verge. Ya sé que he puesto un pedido y me considero capaz de abrir una aplicación por mí mismo. Si quiero saber si hay algún cambio, ya sé dónde mirar. Si estoy esperando un paquete de cualquier otro tipo, también: seguro que tengo un enlace de seguimiento para mirarlo cuando yo quiera. No me hacen falta notificaciones.</li>
</ul>
<p>Excepciones notables son las ya mencionadas llamadas telefónicas, mensajes personales de contactos conocidos en aplicaciones de mensajería instantánea, tu cuenta de correo importante (donde recibes información personal, de tus bancos y de tus obligaciones como ciudadano) y la de tu trabajo, de tus bancos por si hay actividad fraudulenta, aplicaciones de autenticación que usan notificaciones&hellip; ¡y poco más! Con esas notificaciones esenciales, personalmente <em>desactivé las notificaciones de más de 60 aplicaciones</em> ya en 2017, momento en el que tenía instaladas unas 75. Y, mientras el número de aplicaciones instaladas ha ido, en general, subiendo, el número de aquellas que pueden enviarme notificaciones han ido, en general, bajando.</p>
<p>Es cierto que hay otras formas de controlar este tipo de interrupciones, y que cada cual ha de tomar su propia decisión, pero personalmente las desactivo sin piedad. Nunca he usado características tipo &ldquo;resumen programado&rdquo; o &ldquo;modos de concentración&rdquo;, porque no son más que soluciones mediocres que los sistemas operativos móviles proporcionan en favor de los desarrolladores de aplicaciones y en contra tuya. Las notificaciones no están a tu servicio, y tenerlas aparcadas para que te distraigan más tarde sólo retrasan el problema. Tú sigues perdiendo tu tiempo y alguien sigue ingresando dinero gracias al tiempo que pierdes&hellip; más tarde.</p>
<p>Desactiva (casi) todas tus notificaciones. En realidad, ni necesitas tantas, ni son tan útiles.</p>
]]></content:encoded>
    </item>
    <item>
      <title>La economía de tu atención</title>
      <link>https://gvisoc.com/posts/la-economia-de-tu-atencion/</link>
      <pubDate>Tue, 02 Apr 2024 05:34:02 +0000</pubDate><author>gabriel@gvisoc.com (Gabriel Viso Carrera)</author>
      <guid>https://gvisoc.com/posts/la-economia-de-tu-atencion/</guid>
      <description>Tu atención es un recurso a explotar.</description>
      <content:encoded><![CDATA[<p>Las aplicaciones móviles y los servicios y páginas web están constantemente compitiendo por nuestra atención, entre sí y contra nosotros mismos. Esto es algo literal: <a href="https://es.wikipedia.org/wiki/Econom%C3%ADa_de_la_atenci%C3%B3n">la economía de la atención</a> es algo que se formuló por prmera vez <a href="https://es.wikipedia.org/wiki/Econom%C3%ADa_de_la_atenci%C3%B3n#Historia">en la década de 1970</a>, y desde principios de los 2000 forma parte de los principios de diseño de ese stipo de aplicaciones.</p>
<p>Las premisas fundamentales son, más o menos, las siguientes:</p>
<ul>
<li>La atención de un individuo, y de la sociedad en su conjunto, es un bien escaso.</li>
<li>Consumir información <em>utiliza</em> atención. <em>Ocupa</em> recursos.</li>
<li>Si un individuo no encuentra información suficiente, o lo suficientemente rápido, se irá a buscar lo que sea a otro sitio.</li>
</ul>
<p>La industria de las tecnologías de la información lleva bastante tiempo adoptando y aplicando este modelo al diseño de las webs y aplicaciones. Y es normal, porque es una forma de hacer aplicaciones de acceso a información más efectivas. Es más, si esas tres premisas se pusiesen siempre a nuestro servicio, como usuarios que somos, el resultado sería fantástico porque tendríamos aplicaciones <em>diseñadas para quitarse de enmedio lo antes posible</em>, dándonos información de forma rápida, precisa y eficiente. Porque nuestra antención es escasa y tenemos que pasar a lo siguiente que sea que tenemos que antender.</p>
<p>Pero esto no es así casi nunca, porque la mayoría de aplicaciones y webs no se diseñan a nuestro favor. Especialmente si se sostienen mediante anuncios: el dueño de la web o aplicación obtiene más ingresos cuantos más anuncios se nos muestren, y por eso es importante que nos quedemos más tiempo dentro, desatendiendo todo lo demás.</p>
<p>Por ejemplo, las redes sociales comerciales como X (Twitter, hablando claro) o Facebook son famosas provocando que nos desplacemos por la cronología de publicaciones un tiempo obscenamente alto, &ldquo;haciendo <em>scroll</em>&rdquo; sobre una sucesión de contenido que la plataforma va posicionando en base a nuestros intereses. Cuanto más tiempo, mejor. Y luego nos damos cuenta a las 3 de la mañana que llevamos 5 horas viendo vídeos de gatos en Tik Tok.</p>
<p>El problema se complica cuando este tipo de aplicaciones añaden otra premisa, obvia, al conjunto anterior:</p>
<ul>
<li>*Si Gabriel consume otra información de <em>otros</em>,**o hace otra cosa, *otros <em>se llevan su atención: hay que hacer algo.</em></li>
</ul>
<p>Esos &ldquo;otros&rdquo; incluyen tu trabajo, tu familia, tus amigos o el coche que se ha saltado el semáforo en rojo y te va a pasar por encima. Y es básicamente lo mismo que decir que <em>nuestra</em> atención no es tal: es <em>su**recurso a explotar</em>. Este tipo de negocios se autoatribuyen el derecho a disponer de nuestra atención por encima de nuestros propios intereses. <strong>El que nosotros hagamos cualquier otra cosa distinta a <em>scroll</em> en su plataforma</strong>, como deporte, leer, jugar con nuestros hijos, tomar un café prestando atención a quien tenemos en frente, usar otra web o aplicación, <strong>supone un coste de oportunidad</strong> para ellos.</p>
<p>¿Cómo nos mantienen dentro? Calculando qué mostrarnos en cada momento. ¿Cómo nos arrastran dentro si salimos? Mediante notificaciones. Las notificaciones son lo que nos atrae y nos hace asomarnos al pozo.</p>
<blockquote>
<p>Cuando el producto se sostiene mediante anuncios, tus datos personales o tu atención son los recursos a explotar.</p></blockquote>
<p><strong>Desactiva las notificaciones</strong>.</p>
<p>En breve, más sobre estos y otros temas.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
