<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.2">Jekyll</generator><link href="https://enreas.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://enreas.com/" rel="alternate" type="text/html" /><updated>2023-06-01T11:03:50+02:00</updated><id>https://enreas.com/feed.xml</id><title type="html">El blog de un enrea</title><subtitle>&quot;Vaya, vaya... pensando, ¿verdad?&quot;</subtitle><author><name>Juan Diego Gutiérrez</name></author><entry><title type="html">Impresora en red con una Raspberry Pi</title><link href="https://enreas.com/2023/05/30/raspberry-impresora/" rel="alternate" type="text/html" title="Impresora en red con una Raspberry Pi" /><published>2023-05-30T01:00:00+02:00</published><updated>2023-05-30T01:00:00+02:00</updated><id>https://enreas.com/2023/05/30/raspberry-impresora</id><content type="html" xml:base="https://enreas.com/2023/05/30/raspberry-impresora/"><![CDATA[<p>Siguiendo con la serie de <a href="/etiqueta/#raspberry-pi" title="Raspberry Pi">cosas que hago en casa usando una Raspberry Pi</a>, esta vez voy a describir cómo montar, desde cero, un servidor de impresión, permitiendo que una impresora USB actúe como impresora en red. Así, la familia puede usarla para imprimir desde cualquier dispositivo conectado a la red Wi-Fi doméstica, incluso desde sus smartphones.</p>

<p>Los pasos que describo a continuación son los que doy para preparar una <abbr title="cat /sys/firmware/devicetree/base/model"><strong>Raspberry Pi 2 Model B Rev 1.1</strong></abbr> con <strong>Raspbian Pi OS Lite</strong> desde cero. No es necesario que tenga ni teclado, ni ratón, ni monitor. Al terminar el proceso puedo conectar con SSH utilizando autenticación con clave pública. Y, por último, lo configuro como servidor de impresión. Estos pasos son los siguientes:</p>

<ol>
  <li>
    <p><strong>Descarga Raspberry Pi Imager.</strong></p>

    <p>Todo el software está disponible en <a href="https://www.raspberrypi.com/software/" title="Raspberry Pi Software">la página correspondiente</a> de la web de Raspberry Pi.</p>

  </li>
  <li>
    <p><strong>Inserta una tarjeta Micro SD.</strong></p>

    <p>Aunque yo estoy usando una de 64 GB, <a href="https://www.kingston.com/en/blog/personal-storage/choosing-storage-for-raspberry-pi" title="Choosing Storage for Raspberry Pi">deberías tener suficiente con una de 4 GB</a>.</p>

  </li>
  <li>
    <p><strong>Ejecuta Raspberry Pi Imager.</strong></p>

    <p><img src="/assets/images/2023/05/imager1.png" alt="" title="Más sencillo, imposible" /></p>

  </li>
  <li>
    <p><strong>Selecciona el sistema operativo.</strong></p>

    <p>Haz clic en el botón <strong>Choose OS</strong>, luego en <strong>Raspberry Pi OS (other)</strong> y, por último, en <strong>Raspberry Pi OS Lite (32-bit)</strong>.</p>

    <p><img src="/assets/images/2023/05/imager2.png" alt="" title="Más pequeño, imposible" /></p>

  </li>
  <li>
    <p><strong>Selecciona la tarjeta Micro SD.</strong></p>

    <p>Haz clic en el botón <strong>Choose Storage</strong> para seleccionar en qué tarjeta quieres guardar el sistema operativo.</p>
  </li>
  <li>
    <p><strong>Configura el sistema operativo.</strong></p>

    <p>Ésta es la parte que más me gusta. Haz clic en el botón con forma de engranaje que aparece en la parte inferior derecha de la ventana de Raspberry Pi Imager.</p>

    <p><img src="/assets/images/2023/05/imager3.png" alt="" title="Más útil, imposible" /></p>

    <p>Desde ahí podrás:</p>

    <ul>
      <li>asignar un nombre al sistema.</li>
      <li>activar la conexión mediante SSH y, si quieres, permitir la autenticación mediante clave pública.</li>
      <li>cambiar el nombre del usuario predeterminado del sistema y su contraseña.</li>
      <li>configurar la conexión a la red Wi-Fi.</li>
      <li>cambiar la configuración local (zona horaria y teclado).</li>
    </ul>

    <p><img src="/assets/images/2023/05/imager4.png" alt="" title="Maravilloso" /></p>

    <p>Creo que todo lo que introduzcas en esta ventana se guardará en un archivo llamado <strong>first_run.sh</strong>, pero no estoy seguro de si hay alguna otra dependencia.</p>
  </li>
  <li>
    <p><strong>Guarda el sistema.</strong></p>

    <p>Haz clic en el botón <strong>Write</strong> para que el sistema se guarde en la tarjeta SD con las opciones de configuración seleccionadas. Este proceso tardará un poco, dependiendo de la versión del sistema operativo seleccionado y de la velocidad de la tarjeta Micro SD.</p>

    <p><img src="/assets/images/2023/05/imager5.png" alt="" title="Paciencia, que todo pasa. Y todo llega" /></p>

  </li>
  <li>
    <p><strong>Enciende la Raspberry Pi.</strong></p>

    <p>Cuando el proceso termine, extrae la tarjeta y ponla en la Raspberry Pi. Enciéndela y conéctate por SSH.</p>
  </li>
  <li>
    <p><strong>Actualiza el sistema.</strong></p>

    <p>Para ello tendrás que ejecutar estas órdenes una por una:</p>

    <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nv">$ </span><span class="nb">sudo </span>apt update
 <span class="nv">$ </span><span class="nb">sudo </span>apt upgrade
 <span class="nv">$ </span><span class="nb">sudo </span>apt list <span class="nt">--upgradable</span>
 <span class="nv">$ </span><span class="nb">sudo </span>apt upgrade
 <span class="nv">$ </span><span class="nb">sudo </span>apt dist-upgrade
 <span class="nv">$ </span><span class="nb">sudo </span>apt autoremove
</code></pre></div>    </div>
  </li>
  <li>
    <p><strong>Instala el servidor de impresión.</strong></p>

    <p>Se trata de <a href="https://www.cups.org/" title="Common UNIX Printing System">CUPS</a>:</p>

    <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">sudo </span>apt <span class="nb">install </span>cups
</code></pre></div>    </div>

  </li>
  <li>
    <p><strong>Instala los controladores de tu impresora.</strong></p>

    <p>En mi caso, estoy usando una Samsung ML-1640 Series, así que me sirve <a href="https://www.openprinting.org/driver/splix/" title="Menos mal que esto existe...">SpliX</a>:</p>

    <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">sudo </span>apt <span class="nb">install </span>printer-driver-splix
</code></pre></div>    </div>

  </li>
  <li>
    <p><strong>Crea un usuario para administrar la impresora.</strong></p>

    <p>Aunque podrías usar el mismo usuario que estás utilizando para configurar el sistema, es mejor crear uno nuevo que no tenga privilegios de administración:</p>

    <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">sudo </span>adduser impresora <span class="nt">--ingroup</span> lpadmin
</code></pre></div>    </div>

    <p>Indica qué contraseña tendrá el usuario, la necesitarás luego. No es necesario que proporciones ningún dato más.</p>
  </li>
  <li>
    <p><strong>Modifica la configuración de CUPS.</strong></p>

    <p>Guarda el original, por si acaso:</p>

    <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">sudo cp</span> /etc/cups/cupsd.conf /etc/cups/cupsd.conf.original
<span class="nv">$ </span><span class="nb">sudo </span>nano /etc/cups/cupsd.conf
</code></pre></div>    </div>

    <p>Permite el acceso desde la red local, cambiando esto:</p>

    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Only listen for connections from the local machine.
Listen localhost:631
</code></pre></div>    </div>

    <p>por esto:</p>

    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Only listen for connections from the local machine.
# Listen localhost:631
Port 631
</code></pre></div>    </div>

    <p>Ahora, permite el acceso a las diferentes secciones de la web de CUPS. Busca en el archivo todos los elementos <code class="language-plaintext highlighter-rouge">&lt;Location&gt;</code>. Debería haber 4. Antes de la etiqueta de cierre (<code class="language-plaintext highlighter-rouge">&lt;/Location&gt;</code>) añade la línea <code class="language-plaintext highlighter-rouge">Allow @local</code>. Esa parte debería quedar así:</p>

    <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Restrict access to the server...
&lt;Location /&gt;
Order allow,deny
Allow @local
&lt;/Location&gt;

# Restrict access to the admin pages...
&lt;Location /admin&gt;
Order allow,deny
Allow @local
&lt;/Location&gt;

# Restrict access to configuration files...
&lt;Location /admin/conf&gt;
AuthType Default
Require user @SYSTEM
Order allow,deny
Allow @local
&lt;/Location&gt;

# Restrict access to log files...
&lt;Location /admin/log&gt;
AuthType Default
Require user @SYSTEM
Order allow,deny
Allow @local
&lt;/Location&gt;
</code></pre></div>    </div>

    <p>Guarda los cambios y reinicia el servidor:</p>

    <div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">sudo</span> /etc/init.d/cups restart
</code></pre></div>    </div>
  </li>
  <li>
    <p><strong>Añade la impresora a CUPS.</strong></p>

    <p>Visita la página web de CUPS, que está en la misma IP que tenga tu Raspberry Pi, en el puerto 631. Si estuviese en la IP 192.168.1.2, tendrías que abrir https://192.168.1.2:631.</p>

    <p>Haz clic en <strong>Administration</strong>, en la barra superior:</p>

    <p><img src="/assets/images/2023/05/cups1.png" alt="" title="Página principal de CUPS" /></p>

    <p>Haz clic en el botón <strong>Add Printer</strong>:</p>

    <p><img src="/assets/images/2023/05/cups2.png" alt="" title="Añadir impresora" /></p>

    <p>CUPS te pedirá el nombre de usuario y la contraseña de un usuario con permisos de administración del sistema de impresión. Para esto creamos antes el nuevo usuario. Introduce su nombre y su contraseña.</p>

    <p>Ahora, CUPS te mostrará una serie de opciones. En mi caso, la impresora está conectada por USB, así que sólo tengo que seleccionarla y hacer clic en el botón <strong>Continue</strong>:</p>

    <p><img src="/assets/images/2023/05/cups3.png" alt="" title="Seleccionar impresora" /></p>

    <p>Ahora, indica dónde se encuentra la impresora, eso puede ayudar a quien quiera añadirla, marca la casilla de verificación <strong>Share This Printer</strong> y haz clic en el botón <strong>Continue</strong>:</p>

    <p><img src="/assets/images/2023/05/cups4.png" alt="" title="Configurar impresora" /></p>

    <p>Para terminar, selecciona la marca y el modelo de la impresora y haz clic en el botón <strong>Add Printer</strong>:</p>

    <p><img src="/assets/images/2023/05/cups5.png" alt="" title="¡Terminamos! O casi" /></p>

    <p>Una cosa más. Antes de poder utilizar la impresora debes establecer sus opciones predeterminadas. En mi caso, acepto las que CUPS me ofrece y hago clic en el botón <strong>Set Default Options</strong>:</p>

    <p><img src="/assets/images/2023/05/cups6.png" alt="" title="Ahora sí" /></p>

  </li>
</ol>

<p>¡Listo! Ya puedes usar tu impresora USB por Wi-Fi, tanto desde tus PC como desde tus dispositivos móviles.</p>

<p>Como he comentado otras veces, los pasos aquí mostrados consiguen solucionar un caso muy particular que, obviamente, no tiene por qué ser el tuyo. Sin embargo, podría ser que algo de lo que cuento aquí te sea útil en algún momento. En cualquier caso, lo publico porque sé que a mí me va a venir bien tenerlo como referencia.</p>]]></content><author><name>Juan Diego Gutiérrez</name></author><category term="Administración de sistemas" /><category term="Raspberry Pi" /><category term="Raspbian" /><category term="Impresoras" /><summary type="html"><![CDATA[Cómo preparar una Raspberry Pi con Raspbian desde cero, para convertir una impresora USB en impresora de red]]></summary></entry><entry><title type="html">What is Deep Learning?</title><link href="https://enreas.com/2023/03/25/what-is-deep-learning/" rel="alternate" type="text/html" title="What is Deep Learning?" /><published>2023-03-25T00:00:00+01:00</published><updated>2023-03-25T00:00:00+01:00</updated><id>https://enreas.com/2023/03/25/what-is-deep-learning</id><content type="html" xml:base="https://enreas.com/2023/03/25/what-is-deep-learning/"><![CDATA[<blockquote>
  <p>Deep learning is not an exact science, but a set of everchanging, empirically derived engineering best practices, woven together by unreliable narratives.</p>
</blockquote>

<p><a href="https://fchollet.com/" title="Software engineer and AI researcher. Currently a Senior Staff Software Engineer at Google">François Chollet</a>, <a href="https://www.manning.com/books/deep-learning-with-python-second-edition" title="El otro enlace lleva a Maning, éste a O’Reilly"><em>“Deep Learning with Python, Second Edition”</em></a>, página 256.</p>]]></content><author><name>Juan Diego Gutiérrez</name></author><category term="Citas" /><summary type="html"><![CDATA[Deep learning is not an exact science, but a set of everchanging, empirically derived engineering best practices, woven together by unreliable narratives.]]></summary></entry><entry><title type="html">Cómo transcribir podcasts con Whisper</title><link href="https://enreas.com/2023/02/26/como-transcribir-podcasts-con-whisper/" rel="alternate" type="text/html" title="Cómo transcribir podcasts con Whisper" /><published>2023-02-26T01:00:00+01:00</published><updated>2023-02-26T01:00:00+01:00</updated><id>https://enreas.com/2023/02/26/como-transcribir-podcasts-con-whisper</id><content type="html" xml:base="https://enreas.com/2023/02/26/como-transcribir-podcasts-con-whisper/"><![CDATA[<p><a href="https://en.wikipedia.org/wiki/Fork_(blockchain)#Hard_fork" title="Non backward-compatible change">Hard Fork</a> es un <a href="https://www.nytimes.com/column/hard-fork" title="The future is already here">podcast del New York Times</a> que trata semanalmente temas de actualidad en el mundo de la tecnología. Por ejemplo, en <a href="https://www.nytimes.com/2023/02/17/podcasts/hard-fork-bing-ai-elon.html" title="The Bing Who Loved Me, and Elon Rewrites the Algorithm">el episodio del 17 de febrero de 2023</a> comentaron cómo Bing Chat le declaró su amor a uno de los presentadores. En <a href="https://www.nytimes.com/2023/02/24/podcasts/hard-fork-bing-reddit-meta.html" title="Kevin Killed Sydney, and Reddit's C.E.O. Defends Section 230">el de la semana siguiente</a> continuaron hablando del tema de los grandes modelos del lenguaje y uno de los presentadores aclaró que estos modelos no son tan sólo máquinas probabilísticas.</p>

<p>El caso es que me gustó la forma en lo que lo expuso y quería poner la cita aquí. Fui a la web buscando la transcripción pero aún no la tenían. Tampoco recordaba el momento exacto en el que lo decía. Sabía que era al principio. Tendría que volver a escucharlo, saltando hacia adelante, con el riesgo de pasármelo y tener que volver a empezar. Sí, podría hacer eso o… <a href="https://github.com/openai/whisper" title="Robust Speech Recognition via Large-Scale Weak Supervision">utilizar Whisper</a>.</p>

<p>Según lo describe OpenAI en su repositorio de GitHub y lo traduce <a href="https://www.deepl.com/en/whydeepl" title="Advanced AI technology meets unbeatable translation accuracy">DeepL</a> con su tecnología también basada en <abbr title="Inteligencia Artificial... aunque, a estas alturas, casi sobra ponerlo, ¿verdad?">IA</abbr>:</p>

<blockquote>
  <p>Whisper es un modelo de reconocimiento del habla de uso general. Se ha entrenado con un gran conjunto de datos de audio diverso y es también un modelo multitarea que puede realizar reconocimiento del habla multilingüe, así como traducción del habla e identificación de idiomas.</p>
</blockquote>

<p>Es decir, que vamos a utilizar una IA para buscar lo que dice un humano sobre otra IA.</p>

<p>En estos momentos estoy trabajando con Ubuntu 22.04 dentro de <a href="https://learn.microsoft.com/en-us/windows/wsl/install" title="Windows Subsystem for Linux">WSL</a>, en Windows 11. Vengo de usar macOS y, la verdad, no podía estar más contento, no echo nada de menos. Bueno, sí, Time Machine. Pero eso es otra historia para otro momento. Tengo <a href="https://docs.conda.io/en/latest/miniconda.html" title="A free minimal installer for conda">Miniconda</a> para gestionar diferentes entornos de ejecución de Python, así que puedo instalar Whisper así:</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>conda create <span class="nt">--name</span> whisper <span class="nv">python</span><span class="o">=</span>3.9
conda activate whisper
conda <span class="nb">install</span> <span class="nt">-c</span> conda-forge <span class="nv">cudatoolkit</span><span class="o">=</span>11.7 <span class="nv">cudnn</span><span class="o">=</span>8.1.0
pip <span class="nb">install </span>torch torchvision torchaudio
pip <span class="nb">install</span> <span class="nt">-U</span> openai-whisper
</code></pre></div></div>

<p>Quizá las versiones que estoy utilizando no sean las mismas que tengas que utilizar tú si quieres repetir el experimento, pero el proceso será similar.</p>

<p>Si quieres desactivar el entorno virtual:</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>conda deactivate
</code></pre></div></div>

<p>Y si algo va mal, borra el entorno virtual y empieza desde cero:</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>conda remove <span class="nt">-n</span> whisper <span class="nt">--all</span>
</code></pre></div></div>

<p>También hay que descargar el MP3 del podcast. Se puede conseguir de muchas formas diferentes. En mi caso lo que hice fue ir a <a href="https://podcasts.google.com/feed/aHR0cHM6Ly9mZWVkcy5zaW1wbGVjYXN0LmNvbS9sMmk5WW5UZA==" title="Hard Fork en Google">la página del podcast en Google</a>, buscar el episodio que me interesaba, empezar a reproducirlo y, entonces, bucear en el código usando el inspector hasta encontrar el enlace adecuado que contuviese los caracteres <code class="language-plaintext highlighter-rouge">mp3</code> (<a href="https://nyt.simplecastaudio.com/3e43d072-f8a5-430f-bc8e-4c70aafdf3c7/episodes/206b46a2-f658-42b7-b4cc-8ba1940f3486/audio/128/default.mp3" title="¿Cuántos enlaces terminarán rompiéndose en esta entrada del blog?">era el último</a>, qué mala suerte). Para transcribir el texto utilicé:</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>whisper audio.mp3 <span class="nt">--language</span> English <span class="nt">--device</span> cuda <span class="nt">--verbose</span> False
</code></pre></div></div>

<p>Si todo va bien, Whisper te dará la transcripción completa del podcast en diferentes formatos, algunos con marcas de tiempo incluídas. Así de sencillo. Ya puedo poner la cita que quería:</p>

<blockquote>
<p>But I also got some interesting feedback that was sort of the opposite of that. I was saying, I think by calling these just sort of predictive text models or saying that they just generate the next words in a sequence, or that they're just like one argument you hear all the time, especially on Twitter in the last week, is that this is just essentially fancy autocomplete, that these language models, all they're doing is sort of remixing text that's already on the internet and presenting it to you in a way that seems human but isn't.</p>

<p>And the feedback that I got from, and this was from, including from pretty senior folks in the AI research community was like, that's actually kind of underselling what these models are doing, that yes, <b>they are predicting the next words in a sequence, but that they're doing so not just by sort of remixing fragments of text that are out there on the internet, but by building these kind of large scale understandings of human language and syntax and grammar and how we communicate with each other</b>, that there's actually something that's a lot more complicated here than just predicting the next word in a sequence.</p>

<p>And I think I'm coming around to that view that there is something between totally harmless fancy autocomplete and fully sentient killer AI, and that that is what we were talking about when we're talking about something like Bing slash Sydney is it's not just fancy autocomplete.</p>

<p>There is something interesting and important going on here. And that's true even if it's not sentient.</p>
</blockquote>

<p>Se trata de un detalle importante. Estos modelos no son únicamente una máquina probabilistíca para construir secuencias de palabras sino que están consiguiendo comprimir la forma en la que nos comunicamos, con todas sus reglas, de forma cada vez más eficaz.</p>

<p>Aunque sean logros impresionantes, no puedo evitar tener, a la vez, una sensación extraña. Estamos empezando a replicar lo que llevan toda la vida diciéndonos que nos hace diferentes. Desde luego es una cura de humildad.</p>]]></content><author><name>Juan Diego Gutiérrez</name></author><category term="Tutoriales" /><category term="Inteligencia Artificial" /><category term="Python" /><summary type="html"><![CDATA[Utiliza una inteligencia artificial para extraer el texto de un audio.]]></summary></entry><entry><title type="html">Cosas que echo de menos de iOS</title><link href="https://enreas.com/2021/06/25/cosas-que-echo-de-menos-de-ios/" rel="alternate" type="text/html" title="Cosas que echo de menos de iOS" /><published>2021-06-25T01:00:00+02:00</published><updated>2021-06-25T01:00:00+02:00</updated><id>https://enreas.com/2021/06/25/cosas-que-echo-de-menos-de-ios</id><content type="html" xml:base="https://enreas.com/2021/06/25/cosas-que-echo-de-menos-de-ios/"><![CDATA[<p>Llevo metido en el ecosistema de Apple <a href="https://flic.kr/p/28h6wL" title="Si miro la fecha me da hasta vértigo">ya algún tiempo</a>.</p>

<p><img src="https://live.staticflickr.com/1289/738712636_ab11923354_o.jpg" alt="" title="Qué bonito me parecía el MacBook Pro negro..." /></p>

<p>En cuanto pude me hice con un iPhone 4s y, desde entonces, mi contacto con Android ha sido meramente profesional. Sin embargo, los precios desorbitados (para mí) de los últimos modelos de iPhone me han obligado a cambiar a Android. Vengo de usar un iPhone SE de primera generación, así que prácticamente cualquier smartphone Android reciente me va a parecer un salto enorme.</p>

<p>Ambas plataformas tienen muchos puntos en común, y cada vez convergen más. La principal diferencia, por tanto, está en la interconexión entre plataformas (iOS/macOS, por ejemplo) y en las apps exclusivas de cada plataforma. Con estas premisas, tengo claro que voy a echar algunas cosas de menos:</p>

<ul>
  <li><a href="https://netnewswire.com" title="NetNewsWire is a free and open source RSS reader for Mac, iPhone, and iPad."><strong>NetNewsWire</strong></a>: no es más que un cliente RSS, pero qué bien ejecutado, qué sencillo. Además, es multiplataforma dentro del ecosistema de Apple, lo que lo hace muy cómodo. Ahora mismo estoy usando el cliente de <a href="https://feedly.com" title="Keep up with the topics and trends you care about, without the overwhelm">Feedly</a> en Android, pero no me resulta nada cómodo.</li>
  <li><strong>Copiar y pegar entre dispositivos</strong>: poder copiar textos en el iPhone y pegarlos en el Mac, sin más, es una de las cosas que más voy a echar de menos, junto con NetNewsWire y AirDrop. Es casi magia.</li>
  <li><strong>AirDrop</strong>: como copiar y pegar textos, pero con archivos. Muy sencillo de usar.</li>
  <li><strong>Find My</strong>: para saber dónde está mi hijo, que a lo largo de los años se ha ido quedando con el iPhone que yo dejo. Creo que existe una función similar en Android, tengo que investigarlo.</li>
  <li><a href="https://www.blackboxpuzzles.com" title="A refreshingly oppressive puzzle app"><strong>Blackbox</strong></a>: un verdadero desafío. Puzzles que aprovechan todas las características del iPhone para ponerte a prueba.</li>
  <li><a href="https://www.andreasilliger.com" title="You have always dreamed of flying - but your wings are tiny."><strong>Tiny Wings</strong></a>: un pajarito que salta y se alegra cuando lo hace muy alto, qué juego más divertido e inofensivo. Llevo con él desde mi primer iPhone.</li>
  <li><strong>Historial de conversaciones de WhatsApp</strong>: he perdido años de conversaciones porque WhatsApp no ofrece una manera de migrar de iOS a Android. Aunque he visto por ahí algunas herramientas de pago que aseguran poder realizar la migración, no me han inspirado demasiada confianza. A veces creo que mantener este histórico es más por afán de coleccionismo, que no responde a una necesidad real. Supongo que cuando necesite volver a algo que tenía ahí guardado y no lo encuentre me llevaré un disgusto.</li>
</ul>

<p>Iré actualizando esta lista a medida que vaya echando de menos más cosas.</p>]]></content><author><name>Juan Diego Gutiérrez</name></author><category term="Android" /><category term="iOS" /><summary type="html"><![CDATA[Me he pasado a Android y aún no estoy acostumbrado.]]></summary></entry><entry><title type="html">Android Studio Wireless</title><link href="https://enreas.com/2021/06/20/android-wireless-ejecutar-depurar/" rel="alternate" type="text/html" title="Android Studio Wireless" /><published>2021-06-20T01:00:00+02:00</published><updated>2021-06-20T01:00:00+02:00</updated><id>https://enreas.com/2021/06/20/android-wireless-ejecutar-depurar</id><content type="html" xml:base="https://enreas.com/2021/06/20/android-wireless-ejecutar-depurar/"><![CDATA[<blockquote>
  <p><strong>Actualización (2022-01-26)</strong>: estoy instalando la nueva versión de <a href="https://developer.android.com/studio/releases#bumblebee" title="Android Studio Bumblebee | 2021.1.1">Android Studio</a> y dice incluir <a href="https://developer.android.com/studio/releases#wireless-debugging" title="Wireless debugging">depuración inalámbrica</a> sin usar los truquitos que describo a continuación.</p>
</blockquote>

<p>Creo que intenté hacer <a href="https://medium.com/android-news/wireless-debugging-through-adb-in-android-using-wifi-965f7edd163a" title="Wireless Debugging through ADB in Android using WiFi">esto</a> cuando comenzó a ser una posibilidad con Android, sin éxito. O el proceso no estaba maduro por entonces, o metí la pata en algo. Tengo más claro que, cuando lo probé en iOS, estaba tan mal montado que lo dejé por imposible. Sin embargo, hoy no me ha quedado más remedio que intentarlo de nuevo, estoy trabajando con un sensor conectado al smartphone por el único puerto USB del que dispone:</p>

<p><img src="/assets/images/2021/06/android-usb.jpg" alt="" title="El único puerto del dispositivo está ocupado" /></p>

<p>Esto me obliga a desconectar el sensor, conectar el smartphone al ordenador, instalar la app, desconectar el smartphone del ordenador, conectar el sensor y comprobar que todo funciona. Con cada cambio hay que repetir el proceso. Por no hablar del fatídico momento en el que algo falle y tenga que depurar. He estado dejando pasar el momento de volver a probar la conexión Wi-Fi con Android Studio hasta ahora mismo. Los pasos para lograrlo son los siguientes:</p>

<ol>
  <li>
    <p>Conecta tu smartphone Android a la misma red Wi-Fi que tu ordenador.</p>
  </li>
  <li>
    <p>Averigua la IP con la que se ha conectado el smartphone. Si es posible, resérvala, de manera que siempre sea la misma dentro de esa Wi-Fi. Te facilitará mucho el trabajo. Supongamos que se trata de la IP <strong>192.168.1.123</strong>.</p>
  </li>
  <li>
    <p>Conecta el smartphone al ordenador por USB.</p>
  </li>
  <li>
    <p>Localiza la ubicación del SDK de Android en macOS. En mi caso está en <strong>~/Library/Android/sdk/</strong>.</p>
  </li>
  <li>
    <p>Abre un terminal en la carpeta <strong>platform-tools</strong> del SDK de Android.</p>
  </li>
  <li>
    <p>Ejecuta <code class="language-plaintext highlighter-rouge">adb devices</code> para asegurarte de que el dispositivo está conectado. Deberías ver algo así:</p>

    <p><img src="/assets/images/2021/06/adb-no-wi-fi.png" alt="" title="ADB sin Wi-Fi" /></p>
  </li>
  <li>
    <p>Además de la IP, necesitas asignar un puerto al smartphone. Si se tratase del puerto <strong>5555</strong>, deberías ejecutar <code class="language-plaintext highlighter-rouge">adb tcpip 5555</code>.</p>
  </li>
  <li>
    <p>Por último, conecta el puente de depuración con el smartphone ejecutando <code class="language-plaintext highlighter-rouge">adb connect 192.168.1.123</code>.</p>
  </li>
  <li>
    <p>Comprueba que todo es correcto volviendo a ejecutar <code class="language-plaintext highlighter-rouge">adb devices</code>. El resultado debería ser similar al siguiente:</p>

    <p><img src="/assets/images/2021/06/adb-wi-fi.png" alt="" title="ADB por Wi-Fi" /></p>
  </li>
</ol>

<p>¡Listo! ¿Cómo he podido estar tanto tiempo sin hacer esto, con lo fácil y cómodo que resulta trabajar así?</p>]]></content><author><name>Juan Diego Gutiérrez</name></author><category term="Programación" /><category term="Android" /><category term="Android Studio" /><category term="macOS" /><summary type="html"><![CDATA[Cómo conectar por Wi-Fi Android Studio con tu smartphone.]]></summary></entry><entry><title type="html">Otra nana</title><link href="https://enreas.com/2020/05/26/otra-nana/" rel="alternate" type="text/html" title="Otra nana" /><published>2020-05-26T01:00:00+02:00</published><updated>2020-05-26T01:00:00+02:00</updated><id>https://enreas.com/2020/05/26/otra-nana</id><content type="html" xml:base="https://enreas.com/2020/05/26/otra-nana/"><![CDATA[<p>Mi hija está viendo <a href="https://en.wikipedia.org/wiki/Bizaardvark" title="A portmanteau of the words &quot;bizarre&quot; and &quot;aardvark&quot;">Bizaardvark</a> en Disney+. Me ha llamado la atención el pie que sale en la cabecera, quizá inspirado por Monty Python. Ayer mismo me quiso enseñar esto:</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/TT5mzYjuCpg" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>

<p>Ahí también veo la posible inspiración de otros de mis favoritos, <a href="/2008/10/23/nana-adelantado-don-rodrigo-diaz-de-carreras">Les Luthiers</a>.</p>]]></content><author><name>Juan Diego Gutiérrez</name></author><category term="Televisión" /><category term="Series" /><category term="Humor" /><category term="Música" /><summary type="html"><![CDATA[Una relajante canción para que tu bebé se duerma.]]></summary></entry><entry><title type="html">¿Qué hace el zorro?</title><link href="https://enreas.com/2019/08/30/que-hace-el-zorro/" rel="alternate" type="text/html" title="¿Qué hace el zorro?" /><published>2019-08-30T01:00:00+02:00</published><updated>2019-08-30T01:00:00+02:00</updated><id>https://enreas.com/2019/08/30/que-hace-el-zorro</id><content type="html" xml:base="https://enreas.com/2019/08/30/que-hace-el-zorro/"><![CDATA[<p><a href="http://songexploder.net" title="Song Exploder is a podcast where musicians take apart their songs, and piece by piece, tell the story of how they were made">Song Exploder</a> es uno de los podcast que sigo, de los que califico como imprescindibles: intento escucharlo tan pronto como hay un nuevo episodio. No hago lo mismo con otros que quizá me interesan también, pero que pueden esperar.</p>

<p><a href="http://songexploder.net/reply-all" title="Bonus Episode: Reply All - Breakmaster Cylinder – Reply All Theme">En un episodio especial</a> conversan con <a href="https://en.wikipedia.org/wiki/Breakmaster_Cylinder" title="Breakmaster Cylinder">BmC</a> sobre su proceso creativo. Ya conocía a BmC por hacer la música de algún que otro podcast que escucho (como, por ejemplo, <a href="https://www.macintosh.fm" title="A tiny show about a big fruit company">Welcome to Macintosh</a>). En ese episodio comenta cómo llegó hasta lo que es ahora la sintonía de <a href="https://gimletmedia.com/shows/reply-all" title="A podcast about the internet’ that is actually an unfailingly original exploration of modern life and how to survive it">Reply All</a>, un podcast que no conocía de nada. Por lo visto, es muy popular.</p>

<p>Reply All me tenía tan enganchado que me propuse hacer lo mismo que con otros como <a href="https://99percentinvisible.org" title="99% Invisible is about all the thought that goes into the things we don’t think about — the unnoticed architecture and design that shape our world">99% Invisible</a>: escuchar todo lo que me había perdido. Está vez, en orden cronológico inverso. Mala idea, porque Reply All vuelve de vez en cuando a mencionar episodios anteriores, y sin el contexto necesario perdía detalles, y tenía que saltar de un episodio a otro anterior, y luego volver.</p>

<p>Pero entonces me enteré de que antes de Reply All, Alex Goldman y PJ Vogt hicieron <a href="https://podcasts.apple.com/us/podcast/tldr/id709617583" title="A weekly podcast featuring short, surprising stories about the internet">TLDR</a> y, claro, me pusé con él, dejando en pausa Reply All. Son capítulos más cortos, de unos 10 minutos de duración. Tras el número 7 ocurrió algo extraño: había <a href="https://www.wnycstudios.org/story/bringing-internet-public-housing-your-neighbors-and-unicorn" title="Bringing the Internet to Public Housing, Your Neighbors and a Unicorn">un episodio de “Note to Self”</a>, otro podcast. Pensé que era un error, que se les había colado ése en la lista, por error. Aún así, como ya conocía el podcast porque las creadoras había empezado <a href="https://www.radiotopia.fm/podcasts/zigzag" title="ZigZag is a podcast about changing the course of capitalism, journalism, and women’s lives. For real">ZigZag</a> en Radiotopia, decidí escucharlo. Estaba ahí por una razón: hablaban de TLDR.</p>

<p>Lo más impresionante es que, en un momento dado, sonó de fondo algo que me llamó la atención (salta al minuto 17):</p>

<iframe frameborder="0" scrolling="no" height="130" width="100%" src="https://www.wnyc.org/widgets/ondemand_player/wnycstudios/#file=/audio/json/331947/&amp;share=1"></iframe>

<p>Los chillidos me confundieron: no sabía si era la canción o las locutoras. Retrocedí unos segundos, volvía a escuchar, esta vez prestando atención a la letra, la busqué y descubrí esta maravilla:</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/jofNR_WkoCE" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>

<p>“Descubrir” es quizá un poco atrevido cuando estamos hablando de un vídeo que han visto casi 900 millones de personas desde 2013, pero lo que es cierto es que yo no conocía <strong>What does the fox say?</strong>. Y sigo sin saber qué hace el zorro, la verdad.</p>]]></content><author><name>Juan Diego Gutiérrez</name></author><category term="Podcasts" /><category term="Música" /><summary type="html"><![CDATA[La extraña secuencia de acontecimientos que me permitió descubrir una canción superpopular.]]></summary></entry><entry><title type="html">Instalación de paquetes para Python en Blender</title><link href="https://enreas.com/2019/08/09/blender-python-paquetes/" rel="alternate" type="text/html" title="Instalación de paquetes para Python en Blender" /><published>2019-08-09T01:00:00+02:00</published><updated>2019-08-09T01:00:00+02:00</updated><id>https://enreas.com/2019/08/09/blender-python-paquetes</id><content type="html" xml:base="https://enreas.com/2019/08/09/blender-python-paquetes/"><![CDATA[<p>Blender es una aplicación de código abierto utilizada en multitud de ámbitos como publicidad, videojuegos o películas. En mi caso concreto, la utilizo para la simulación de experimentos. Podía haber escogido alguna otra aplicación similar, pero Blender tiene una característica especialmente interesante: permite utilizar Python para automatizar prácticamente cualquier aspecto de su funcionamiento. Los paquetes incluidos en la distribución son mínimos. Si necesitas añadir alguno más, como es mi caso, sólo tienes que seguir estos pasos:</p>

<ol>
  <li>
    <p><strong>Instala Python 3.7.0</strong>. Es la misma versión que incluye Blender 2.80, la última disponible en el momento de escribir estas líneas. En macOS utilizo <a href="https://github.com/pyenv/pyenv" title="Simple Python version management">pyenv</a> para disponer de varias versiones de Python a la vez.</p>
  </li>
  <li>
    <p><strong>Instala el paquete que te interese</strong>. Por ejemplo, <a href="https://pillow.readthedocs.io/en/stable/" title="Pillow is the friendly PIL fork by Alex Clark and Contributors. PIL is the Python Imaging Library by Fredrik Lundh and Contributors">PIL</a>:</p>

    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> ~/.pyenv/versions/3.7.0/bin/pip <span class="nb">install </span>Pillow
</code></pre></div>    </div>
  </li>
  <li>
    <p><strong>Copia el paquete a Blender</strong>. El resultado es que dicho paquete acabará dentro de la propia aplicación:</p>

    <div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="nb">cp</span> <span class="nt">-pR</span> ~/.pyenv/versions/3.7.0/lib/python3.7/site-packages/PIL/ /Applications/Blender.app/Contents/Resources/2.80/python/lib/python3.7/site-packages/
</code></pre></div>    </div>
  </li>
</ol>

<p>La principal desventaja de este sistema es que cada vez que instales una nueva versión de Blender es necesario volver a instalar los paquetes que uses, teniendo especial cuidado de comprobar qué versión de Python incluye.</p>

<p>Si conoces alguna forma más simple de conseguir el mismo resultado no dudes en ponerte en contacto conmigo.</p>]]></content><author><name>Juan Diego Gutiérrez</name></author><category term="Software" /><category term="Blender" /><category term="Python" /><category term="macOS" /><summary type="html"><![CDATA[Qué pasos dar para poder utilizar paquetes de Python no incluidos en Blender.]]></summary></entry><entry><title type="html">Fritzing</title><link href="https://enreas.com/2019/08/08/fritzing/" rel="alternate" type="text/html" title="Fritzing" /><published>2019-08-08T01:00:00+02:00</published><updated>2019-08-08T01:00:00+02:00</updated><id>https://enreas.com/2019/08/08/fritzing</id><content type="html" xml:base="https://enreas.com/2019/08/08/fritzing/"><![CDATA[<p>Cada vez que necesito compartir con alguien el diagrama de algún montaje hecho con Arduino abro <a href="https://fritzing.org/home/" title="An open-source hardware initiative that makes electronics accessible as a creative material for anyone">Fritzing</a>. Durante unos segundos la interfaz de usuario del sistema operativo deja de responder, si estoy escuchando música se deja de escuchar, si hay algún vídeo en marcha se para. Y cuando todo vuelve a la normalidad, compruebo si hay alguna nueva versión disponible. Y no, no la hay: <a href="https://en.wikipedia.org/wiki/Fritzing" title="La versión 0.9.3b, para ser exactos. Y sí, he abierto Fritzing para verlo y todo se ha quedado tostado unos segundos">la última es de junio de 2016</a>.</p>

<p>El futuro de esta aplicación <a href="https://hackaday.com/2019/02/14/the-future-of-fritzing-is-murky-at-best/" title="The Future of Fritzing is Murky at Best">no parecía demasiado prometedor</a>. La principal dificultad a la que se enfrenta este software parece ser la dificultad de encontrar programadores expertos en Qt y C++ dispuestos a colaborar en el proyecto. Pero quizá no todo esté perdido porque… ¡hay una versión de Fritzing <a href="https://hackaday.com/2019/04/30/fritzing-is-back-and-this-time-its-written-in-javascript/" title="Fritzing Is Back, And This Time It’s Written In JavaScript!">basada en JavaScript en marcha</a>!</p>

<p>Si se cumplen las previsiones, antes de que termine el año 2019 veremos una nueva versión de Fritzing.</p>]]></content><author><name>Juan Diego Gutiérrez</name></author><category term="Software" /><category term="Arduino" /><category term="Prototipado" /><summary type="html"><![CDATA[Parece que Fritzing ha muerto, pero va a resucitar.]]></summary></entry><entry><title type="html">Going Wrong</title><link href="https://enreas.com/2019/08/08/going-wrong/" rel="alternate" type="text/html" title="Going Wrong" /><published>2019-08-08T01:00:00+02:00</published><updated>2019-08-08T01:00:00+02:00</updated><id>https://enreas.com/2019/08/08/going-wrong</id><content type="html" xml:base="https://enreas.com/2019/08/08/going-wrong/"><![CDATA[<blockquote>
  <p>I dedicate this book to Mr Evans, a wonderful man who helped many of us of us to learn about
the depths of history over which we float. <strong>It is important that we know where we come from, because
if you do not know where you come from, then you don’t know where you are, and if you don’t know
where you are, then you don’t know where you’re going. And if you don’t know where you’re going,
you’re probably going wrong.</strong></p>
</blockquote>

<p><a href="https://en.wikipedia.org/wiki/Terry_Pratchett" title="Sir Terence David John Pratchett">Terry Pratchett</a>, al final de <a href="https://en.wikipedia.org/wiki/I_Shall_Wear_Midnight" title="No he leído nada de él, debería empezar..."><em>“I Shall Wear Midnight”</em></a>.</p>]]></content><author><name>Juan Diego Gutiérrez</name></author><category term="Citas" /><category term="Terry Pratchett" /><category term="Posicionamiento" /><summary type="html"><![CDATA[Cita de "I Shall Wear Midnight", de Terry Practchett, muy relacionada con el posicionamiento.]]></summary></entry></feed>