<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="gl_ES"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://aburro.me/feed.xml" rel="self" type="application/atom+xml" /><link href="https://aburro.me/" rel="alternate" type="text/html" hreflang="gl_ES" /><updated>2026-05-16T00:35:00+00:00</updated><id>https://aburro.me/feed.xml</id><title type="html">Aburro.me</title><subtitle>Unha colección de procrastinación</subtitle><entry xml:lang="gl"><title type="html">Mapeando eólicos</title><link href="https://aburro.me/2026/04/05/eolico_mapping/" rel="alternate" type="text/html" title="Mapeando eólicos" /><published>2026-04-05T00:00:00+00:00</published><updated>2026-04-05T00:00:00+00:00</updated><id>https://aburro.me/2026/04/05/eolico_mapping</id><content type="html" xml:base="https://aburro.me/2026/04/05/eolico_mapping/"><![CDATA[<h1 id="intro">Intro</h1>

<p>A <a href="https://mapas.xunta.gal/visores/pba/">Xunta ofrece</a> datos sobre a localización e as características dos eólicos (aeroxeradores) en Galicia. No que respecta a este <em>post</em>, simplemente vou usar estes datos para crear visualizacións dos propios eólicos.</p>

<h1 id="os-datos">Os datos</h1>

<p>Para descargar os datos, debes seguir a ligazón que aparece na imaxe, pero basicamente: botón de capas &gt; Afeccións &gt; Enerxía &gt; Eólica.</p>

<figure class="post-figure">
    <img src="/assets/eolicos_1/download.JPG" alt="A forma de descargar estes datos" />
    <figcaption>A forma de descargar estes datos</figcaption>
</figure>

<p>Isto descarga un arquivo <code class="language-plaintext highlighter-rouge">.zip</code> que contén varios formatos, o cal é útil dependendo do teu obxectivo específico. Para as visualizacións deste artigo, usei o formato <code class="language-plaintext highlighter-rouge">.shp</code> (Shapefile), aínda que os outros ficheiros poden conter datos diferentes ou máis detallados. En concreto, o <code class="language-plaintext highlighter-rouge">.shp</code> ten as seguintes columnas: <code class="language-plaintext highlighter-rouge">'OBJECTID', 'INFRAEST', 'NOME', 'ETRS89_X', 'ETRS89_Y', 'DIAM', 'ALT', 'NUM_ESTADO', 'SITUACION', 'geometry'</code>. Un exemplo sería:
<br /></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>OBJECTID 2
INFRAEST AEROXERADOR
NOME PAXAREIRAS I
ETRS89_X 494628
ETRS89_Y 4.74572e+06
DIAM 44
ALT 40
NUM_ESTADO 5
SITUACION FUNCIONANDO, AUTORIZADO, EN OBRAS
geometry POINT (494628.4946999181 4745723.399695537)
</code></pre></div></div>
<p><br />
Como podes ver e probablemente imaxinar ao observar os datos, o campo <code class="language-plaintext highlighter-rouge">SITUACION</code> non vale para nada, xa que todos teñen os mesmos valores. Porén, o resto da información pode ser útil.</p>

<h1 id="a-visualización">A visualización</h1>

<p>Como o obxectivo é simplemente a visualización, quixen probar <a href="https://kepler.gl/">kepler.gl</a>. Para que os datos se <em>rendericen</em> correctamente alí, é necesario reproxectalos. Os datos da Xunta veñen en CRS 29N (a zona UTM de Galicia), pero Kepler require WGS 84 (EPSG:4326), que é o estándar global. Como a precisión milimétrica non é unha prioridade nestas visualizacións, podemos facer a conversión de xeito sinxelo con <code class="language-plaintext highlighter-rouge">geopandas</code>.
<br /></p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">geopandas</span> <span class="k">as</span> <span class="n">gpd</span>

<span class="n">eolicos_gdf</span> <span class="o">=</span> <span class="n">gpd</span><span class="p">.</span><span class="n">read_file</span><span class="p">(</span><span class="s">"your_path.shp"</span><span class="p">)</span>
<span class="n">eolicos_wgs84</span> <span class="o">=</span> <span class="n">eolicos_gdf</span><span class="p">.</span><span class="n">to_crs</span><span class="p">(</span><span class="s">"EPSG:4326"</span><span class="p">)</span>
<span class="n">eolicos_wgs84</span><span class="p">.</span><span class="n">to_file</span><span class="p">(</span><span class="s">"your_output_file.geojson"</span><span class="p">,</span> <span class="n">driver</span><span class="o">=</span><span class="s">"GeoJSON"</span><span class="p">)</span>
</code></pre></div></div>
<p><br />
Ademais, para lograr unha visualización máis interesante, quixen aproveitar os datos contidos no <code class="language-plaintext highlighter-rouge">.shp</code>. Deste xeito, ao ler tanto a altura (<code class="language-plaintext highlighter-rouge">ALT</code>) como o diámetro (<code class="language-plaintext highlighter-rouge">DIAM</code>), podemos crear unha visualización en 3D máis informativa. Para iso, no que respecta aos cambios no ficheiro de saída, só precisamos obter o radio a partir do diámetro e incorporalo ao <code class="language-plaintext highlighter-rouge">.geojson</code>. Para conseguilo, cambiamos a xeometría de puntos individuais a polígonos (círculos):</p>

<p><br /></p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">geopandas</span> <span class="k">as</span> <span class="n">gpd</span>

<span class="n">eolicos_gdf</span> <span class="o">=</span> <span class="n">gpd</span><span class="p">.</span><span class="n">read_file</span><span class="p">(</span><span class="s">"your_path.shp"</span><span class="p">)</span>
<span class="n">eolicos_gdf</span><span class="p">[</span><span class="s">'geometry'</span><span class="p">]</span> <span class="o">=</span> <span class="n">eolicos_gdf</span><span class="p">.</span><span class="n">geometry</span><span class="p">.</span><span class="nb">buffer</span><span class="p">(</span><span class="n">radii</span><span class="p">)</span>
<span class="n">eolicos_wgs84</span> <span class="o">=</span> <span class="n">eolicos_gdf</span><span class="p">.</span><span class="n">to_crs</span><span class="p">(</span><span class="s">"EPSG:4326"</span><span class="p">)</span>
<span class="n">eolicos_wgs84</span><span class="p">.</span><span class="n">to_file</span><span class="p">(</span><span class="s">"your_output_file.geojson"</span><span class="p">,</span> <span class="n">driver</span><span class="o">=</span><span class="s">"GeoJSON"</span><span class="p">)</span>
</code></pre></div></div>
<p><br /></p>

<p>A continuación, podemos subir o ficheiro a kepler.gl e seleccionar o campo de altura, asociándoo ao campo <code class="language-plaintext highlighter-rouge">ALT</code> do geojson. Iso debería xerar un resultado semellante a:</p>

<figure class="map-container">
    <iframe src="/assets/eolicos_1/kepler_map_1.html" width="100%" height="600px">
    </iframe>
    <figcaption>
         Mapa interactivo 3D: Altura e diámetro dos eólicos.
    </figcaption>
</figure>

<p>Ademais, usando o <code class="language-plaintext highlighter-rouge">.geojson</code> orixinal, tamén creei outra visualización de tipo <em>heatmap</em> para mostrar onde se concentran máis eólicos (ademáis, a intensidade da cor vén determinada pola altura, utilizándoa como <em>proxy</em> da potencia dos eólicos).</p>

<figure class="map-container">
    <iframe src="/assets/eolicos_1/kepler_map_2.html" width="100%" height="600px" style="border:none;"></iframe>
    <figcaption>
            Mapa interactivo 2D: heatmap de eólicos.
    </figcaption>
</figure>]]></content><author><name></name></author><summary type="html"><![CDATA[Diferentes visualizacións de eólicos en Galicia.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aburro.me/assets/eolicos_1/card.png" /><media:content medium="image" url="https://aburro.me/assets/eolicos_1/card.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="gl"><title type="html">Caracterizando o comportamento das bateas baixo SAR</title><link href="https://aburro.me/2026/04/02/batea_SAR/" rel="alternate" type="text/html" title="Caracterizando o comportamento das bateas baixo SAR" /><published>2026-04-02T00:00:00+00:00</published><updated>2026-04-02T00:00:00+00:00</updated><id>https://aburro.me/2026/04/02/batea_SAR</id><content type="html" xml:base="https://aburro.me/2026/04/02/batea_SAR/"><![CDATA[<h1 id="intro">Intro</h1>

<p>Unha “<a href="https://gl.wikipedia.org/wiki/Batea">batea</a>” é un tipo de balsa ou estrutura flotante formada por un <em>entramado</em> de trabes de madeira combinadas con flotadores dos que colgan cordas, perpendiculares á propia balsa, que se mergullan na auga permitindo o crecemento do marisco, principalmente mexillóns.</p>

<p>Detectar estas en imaxes visibles de Observación da Terra (EO) é relativamente sinxelo (dada a resolución adecuada), agás polo feito de que Galicia está sempre notablemente nubrada. Polo tanto, tratar de monitorizalas con, por exemplo, Sentinel 2, significaría estar todo o inverno mirando para unha teito branco de nubes. Para construír un sistema de observación que funcione todo o ano, hai que soltar a cámara e coller un microondas (só <em>parcialmente</em> metafórico). A ferramenta ideal para o traballo sería un Radar de Apertura Sintética (SAR) como o do Sentinel 1. Ao radar non lle importan as nubes, de feito atravesaas. O que <em>si</em> lle importa, e moito, é a xeometría.</p>

<p>En circunstancias normais, con auga en calma, entra en xogo un fenómeno chamado reflexión especular. Os instrumentos SAR lanzan microondas desde a órbita cara á terra e logo tentan recoller o que o terreo reflectiu. A superficie lisa do océano desvía o pulso do radar <em>lonxe</em> do satélite, facendo que a auga en calma apareza escura. Isto contrasta facilmente coas bateas que son, esencialmente nesta configuración, reflectores de esquina (<em>corner reflectors</em>). O pulso golpea a auga plana xunto á balsa, rebota cara arriba na cara vertical dunha trabe e logo sae disparado directamente de volta ao satélite. Este dobre rebote crea un sinal forte que, a pesar do tamaño das propias bateas e da <em>baixa</em> resolución do Sentinel 1, debería ser facilmente visible nas imaxes.</p>

<h1 id="os-datos">Os datos</h1>
<div style="text-indent: 0 !important; padding-left: 0 !important; margin-left: 0 !important; margin-bottom: 20px; display: block; width: 100%;"> 

Para probar isto, descarguei algúns datos RTC de Sentinel 1 de [Planetary Computer](https://planetarycomputer.microsoft.com/dataset/sentinel-1-rtc) e creei unha especie de  composto de falsa cor. Neste composto, a banda vermella corresponde aos datos VV, a canle verde ao VH e a canle azul á diferenza de ambos (VV-VH). En particular, os datos foron transformados a decibelios e normalizados, seguindo un enfoque un pouco ad-hoc (é dicir, fíxeno a ollo):
</div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">def</span> <span class="nf">normalize_band</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">vmin</span><span class="p">,</span> <span class="n">vmax</span><span class="p">):</span>
        <span class="n">clipped</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">clip</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">vmin</span><span class="p">,</span> <span class="n">vmax</span><span class="p">)</span>
        <span class="k">return</span> <span class="p">((</span><span class="n">clipped</span> <span class="o">-</span> <span class="n">vmin</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">vmax</span> <span class="o">-</span> <span class="n">vmin</span><span class="p">)</span> <span class="o">*</span> <span class="mf">255.0</span><span class="p">).</span><span class="n">astype</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="n">uint8</span><span class="p">)</span>

    <span class="n">vv_db</span> <span class="o">=</span> <span class="mi">10</span> <span class="o">*</span> <span class="n">np</span><span class="p">.</span><span class="n">log10</span><span class="p">(</span><span class="n">vv_raw</span><span class="p">)</span>
    <span class="n">vh_db</span> <span class="o">=</span> <span class="mi">10</span> <span class="o">*</span> <span class="n">np</span><span class="p">.</span><span class="n">log10</span><span class="p">(</span><span class="n">vh_raw</span><span class="p">)</span>
    <span class="n">diff_db</span> <span class="o">=</span> <span class="n">vv_db</span> <span class="o">-</span> <span class="n">vh_db</span>

    <span class="n">R_channel</span> <span class="o">=</span> <span class="n">normalize_band</span><span class="p">(</span><span class="n">vv_db</span><span class="p">,</span> <span class="o">-</span><span class="mi">25</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
    <span class="n">G_channel</span> <span class="o">=</span> <span class="n">normalize_band</span><span class="p">(</span><span class="n">vh_db</span><span class="p">,</span> <span class="o">-</span><span class="mi">30</span><span class="p">,</span> <span class="o">-</span><span class="mi">5</span><span class="p">)</span>
    <span class="n">B_channel</span> <span class="o">=</span> <span class="n">normalize_band</span><span class="p">(</span><span class="n">diff_db</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">15</span><span class="p">)</span>
</code></pre></div></div>

<h1 id="a-saída">A saída</h1>

<p>Ao visualizar as imaxes queda claro que as bateas son visibles a pesar do seu tamaño (fíxate nos pequenos puntos sobre o mar negro nas imaxes de abaixo).</p>

<div style="display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 20px;">
  <div style="width: 30%; text-align: center;">
    <img src="/assets/bateas/batea_master_rgb_20230130.jpg" alt="Composición RGB de falsa cor con mar calma
" style="width: 100%;" />
    <p style="font-size: 0.85em; color: #666; margin-top: 5px;">Composición RGB de falsa cor con mar calma
</p>
  </div>
  <div style="width: 30%; text-align: center;">
    <img src="/assets/bateas/calm_vv.jpg" alt="VV co mar en calma" style="width: 100%;" />
    <p style="font-size: 0.85em; color: #666; margin-top: 5px;">Polarización VV co mar en calma</p>
  </div>
  <div style="width: 30%; text-align: center;">
    <img src="/assets/bateas/calm_vh.jpg" alt="Calm VH" style="width: 100%;" />
    <p style="font-size: 0.85em; color: #666; margin-top: 5px;">Polarización VH co mar en calma</p>
  </div>
</div>

<div style="text-indent: 0 !important; padding-left: 0 !important; margin-left: 0 !important; margin-bottom: 20px; display: block; width: 100%;"> 

Porén, co mar picado, a identificación é un pouco máis complexa. En primeiro lugar, as pequenas manchas convertéronse en liñas e, en segundo lugar, vense menos definidas, cunha clara interacción entre VV e VH que se reflicte na imaxe como unha cor violeta. En particular, comparando as imaxes de polarización VV do mar picado e en calma, podemos ver unha diferenza notable. Co mar tranquilo a polarización VV é máis clara, ofrecendo bateas máis nítidas, mentres que co mar picado a VV apenas permite diferenciar algunhas bateas, mentres que na VH pódense ver claramente todas (aínda que se asemellen máis a liñas que a puntos).

</div>

<div style="display: flex; justify-content: space-between; align-items: flex-start; margin-top: 20px; margin-bottom: 20px;">
  <div style="width: 30%; text-align: center;">
    <img src="/assets/bateas/batea_master_rgb_20230313.jpg" alt="Composicción de falsa cor RGB co mar picado" style="width: 100%;" />
    <p style="font-size: 0.85em; color: #666; margin-top: 5px;">Composicción de falsa cor RGB co mar picado</p>
  </div>
  <div style="width: 30%; text-align: center;">
    <img src="/assets/bateas/choppy_vv.jpg" alt="Polarización VV co mar picado" style="width: 100%;" />
    <p style="font-size: 0.85em; color: #666; margin-top: 5px;">Polarización VV co mar picado</p>
  </div>
  <div style="width: 30%; text-align: center;">
    <img src="/assets/bateas/choppy_vh.jpg" alt="Polarización VH co mar picado" style="width: 100%;" />
    <p style="font-size: 0.85em; color: #666; margin-top: 5px;">Polarización VH co mar picado</p>
  </div>
</div>
<div style="text-indent: 0 !important; padding-left: 0 !important; margin-left: 0 !important; margin-bottom: 20px; display: block; width: 100%;"> 

O mar picado devolve o sinal ao satélite debido ás ondas. Isto fai que os valores base do mar suba ata igualarse co das bateas, eliminando o contraste. A canle VH segue amosando contraste grazas á diferente polarización. Para que un pulso de radar volva ao satélite na canle de polarización cruzada (VH), precisa _cambiar a súa polarización orixinal_ (pasar da vertical da fonte á horizontal) antes de rebotar e ser recollido de volta. A superficie do océano, mesmo con ondas, adoita simplemente redireccionar o sinal, pero non pode alterar facilmente a súa polarización. Unha batea, pola contra, é unha combinación de trabes de madeira, cordas, frotadores e outros elementos. O sinal do radar entra nesa estrutura, rebota repetidamente contra superficies duras con diferentes ángulos e sae coa súa polarización alterada. Deste xeito, o mar permanece relativamente escuro en VH mentres que as bateas seguen brillando, mantendo o contraste incluso en condicións de tormenta.

</div>]]></content><author><name></name></author><summary type="html"><![CDATA[As bateas baixo Sentinel-1 SAR e o efecto do mar picado no sinal]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aburro.me/assets/bateas/card.png" /><media:content medium="image" url="https://aburro.me/assets/bateas/card.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="gl"><title type="html">Os números do Wordle</title><link href="https://aburro.me/2022/01/30/wordle_data/" rel="alternate" type="text/html" title="Os números do Wordle" /><published>2022-01-30T00:00:00+00:00</published><updated>2022-01-30T00:00:00+00:00</updated><id>https://aburro.me/2022/01/30/wordle_data</id><content type="html" xml:base="https://aburro.me/2022/01/30/wordle_data/"><![CDATA[<h1 id="introdución">Introdución</h1>

<p>Para quen non o saiba, o wordle é un simple xogo de adiviñar palabras de 5 letras. É fácil ver porque se fixo tan famoso xa que é moi accesible e permíteche compartir os teus intentos cos teus amigos de maneira moi simple. Como debe ser, <a href="https://wordlegalego.appspot.com/">este xogo xa foi adaptado ao galego</a> da man de <a href="https://twitter.com/mg_abraham">Abraham Martinez Gracia</a>. Pero hai algunha palabra ou combinación delas que sexa a mellor para garantir o teu éxito e superar a todos os teus colegas? Ben, parece que <a href="https://towardsdatascience.com/a-deep-dive-into-wordle-the-new-pandemic-puzzle-craze-9732d97bf723">non fun o único que o pensou</a>, pero vamos facer esta análise para a nosa versión en galego. A modo de <em>disclaimer</em> direi que non sei exactamente que lista de palabras usa o wordle, eu vou usar a que empreguei para facer <a href="https://typer-gal.vercel.app/">typer-gal</a>, así que é posible que falten as últimas palabras que engadira a RAG.</p>

<h1 id="ao-choio">Ao choio</h1>

<p>Partindo da lista de todas as palabras posibles, debemos seleccionar aquelas con 5 letras, xa que son as que emprega o wordle. En todo este proceso debemos eliminar palabras “espurias” que están incluídas no dicionario e que realmente son prefixos (i.e. vaso-) ou expresións (a fin, a man, etc.). É necesario ter coidado tamén con nomes propios e outras palabras que teñan letras en maiúscula. A mellor forma de evitar problemas é pasalo todo a maiúscula ou minúsculas. Finalmente, tamén se deben ter en conta os acentos e a ñ, que poden dar problemas máis adiante.</p>

<p>Desta forma obtemos que (cando menos nesa versión do dicionario) hai un total de <strong>3351 palabras de 5 letras.</strong></p>

<h1 id="as-letras">As letras</h1>

<p>Xa coa lista definitiva de palabras podemos adentrarnos no análise, letra a letra. A forma máis fácil de ver que letras son as máis comúns e representativas deste conxunto de palabras é mediante un mapa de calor. Con esta figura poderemos ver claramente que letras son as que máis se repiten, pero tamén as súas posicións nas palabras en si.</p>

<p><img src="/assets/wordle/heatmap.svg" alt="Heatmap das palabras de 5 letras en galego" class="imgContainer" /></p>

<p>Se agrupamos as letras poderemos ver que as máis comúns son as vogais, con 4 delas no top-5 das letras máis repetidas. Desta forma, vendo o top-10 mostrado abaixo podemos empezar a pensar que palabras teñen a maior cantidade desas letras como unha boa forma de eliminar moitas posibilidades en poucos intentos.</p>

<p><img src="/assets/wordle/top_10.svg" alt="Top-10 das letras máis comúns" class="imgContainer" /></p>

<h1 id="puntuando">Puntuando…</h1>

<p>Con estes datos podemos obter varias métricas sobre que opcións sería mellor empregar á hora de adiviñar a palabra do dia no wordle, ou canto menos nos primeiros intentos cando vas a cegas.</p>

<p>A forma máis fácil de medir a utilidade dunha palabras é ver cantas outras pode descartar. Para isto simplemente debemos buscar as letras máis comúns e tentar agrupalas nunha mesma palabra. Para obter un número representativo deste poder discriminativo debemos sumar as posibilidades de que unha das súas letras apareza en calquera palabra (número de aparicións/total palabras). Cabe destacar que esta métrica é máis útil se evitamos que unha mesma letra se repita máis dunha vez, xa que así poderemos eliminar o maior número de variables do noso cadro do wordle. Así, nomearemos esta métrica como presente_sin_rep e presente_rep na táboa final.</p>

<p>Outra cousa a medir é a posibilidade de que unha letra apareza exactamente no lugar no que se escribe. Como se puido ver antes no mapa de calor, a pesar de que a letra “A” é moi común o máis habitual é atopala na quinta posición. Desta forma esta medida sería algo equivalente á posibilidade de acertar un cadro verde no wordle, así que lle chamaremos verde.</p>

<p>De maneira similar, tamén pode ser importante ter en conta as posibilidades de que unha letra non apareza no lugar no que se predixo pero si en calquera outro da palabra. Isto seria equivalente a un bloque amarelo, polo que así lle chamaremos.</p>

<p>Como quedaría logo a cousa? A palabra con maior poder discriminativo, é dicir, que pode eliminar máis letras frecuentes é <strong>eiroa</strong> que é un sinónimo de anguía. Se atendemos á posibilidade de acertar cadros verdes á primeira, a mellor palabra seria <strong>carto</strong>. Para acabar, se por algunha razón o que necesitas son cadrados amarelos a toda costa, a túa mellor aposta sería <strong>caroa</strong>, que é un sinónimo de caguña.
<br /></p>

<p><img src="/assets/wordle/scores.png" alt="Puntuacións" class="imgContainer" /> 
<br /></p>

<p>Os resultados coas puntuacións para todas as palabras, pódense descargar <a href="/assets/wordle/scores.csv">aquí</a></p>

<h1 id="código">Código</h1>

<script src="https://gist.github.com/e8a2b5e1bab16b0b5c944b3ffea55112.js"> </script>]]></content><author><name></name></author><category term="D" /><summary type="html"><![CDATA[Hai unha estratexia gañadora?]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aburro.me/assets/wordle/wordle.png" /><media:content medium="image" url="https://aburro.me/assets/wordle/wordle.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="gl"><title type="html">Códigos QR, compresión e libros</title><link href="https://aburro.me/2021/08/13/qr/" rel="alternate" type="text/html" title="Códigos QR, compresión e libros" /><published>2021-08-13T00:00:00+00:00</published><updated>2021-08-13T00:00:00+00:00</updated><id>https://aburro.me/2021/08/13/qr</id><content type="html" xml:base="https://aburro.me/2021/08/13/qr/"><![CDATA[<h1 id="os-códigos">Os códigos</h1>

<p>Con todo o tema da pandemia os códigos QR están cada vez máis presentes na vida diaria. Dende as cartas “contact-less” ata os certificados de vacinación, cada vez é mais necesario saber manexarse con esta tecnoloxía. En realidade, o uso que se lle da agora mesmo é bastante simple xa que só se usan como unha especie de acurtadores de direccións URL. Nos dous exemplos anteriores, tanto nas cartas dos locais como nos certificados de vacinación, o contido dos códigos QR é unha simple dirección electrónica, unha URL. Porén, os códigos QR poden conter moita máis información. O maior cantidade de datos que se pode colocar nestes códigos é 2953 bytes, algo que dá para moito máis que unha ligazón.</p>

<p>Desta forma, empecei a darlle voltas a que se podería meter en realidade nun destes códigos. Obviamente, non fun ao primeiro ao que se lle ocorreu, nin serei o último. Quizais o exemplo que máis me chamou a atención foi <a href="https://www.youtube.com/watch?v=ExwqNreocpg">este</a> no cal se introduciu un xogo completo (aínda que moi básico) nun QR, sen ningún tipo de trampa. O bo dos executables e que se poden facer moi moi pequenos, pero cos datos en “cru” non pasa o mesmo.</p>

<h1 id="perspectiva">Perspectiva</h1>

<p>2953 bytes pode parecer moito, pero non o é. Practicamente calquera arquivo que teñas no móbil ou no ordenador ocupa máis ca iso. De feito este texto ata o punto onde agora les, codificado, e sen datos extra (nin css nin nada) xa case ocupa iso. Desta forma pódese ver que os códigos QR aínda que cómodos non son un medio para transmitir gran cantidade de información senón para actuar como intermediarios. Isto vese claro se observamos a especificación dos códigos, xa que ofrecen diversos niveis de redundancia. Isto permite, ata certo punto, a corrección de erros. Desta forma, se unha parte do código falta, esta mal impresa ou calquera cousa, o contido segue sendo accesible.</p>

<h1 id="que-se-pode-meter-nun-qr">Que se pode meter nun QR?</h1>

<p>Pois aparte do común, URLs, algo amplamente soportado é texto. A pesar disto, o tamaño de texto que se pode meter non é moi grande. Pode ser aceptable por exemplo para texto pequeno do estilo de poemas, cancións ou relatos curtos. Aquí un exemplo coa letra de Around the World de Daft Punk.</p>

<p><img src="/assets/qr/df.png" alt="A letra de Around the World de Daft Punk" class="imgContainer" /></p>

<h1 id="compresión">Compresión</h1>

<p>Moitos dos datos cos que tratamos a diario pódense comprimir aínda que moitas veces non é necesario ou é simplemente negativo. Por exemplo, estiven experimentado con compresión de audio (cancións) para que puideran coller nun código QR. Sobra dicir (xa solo polo que puxen antes) que foi un fracaso total, ou colles un fragmento desprezable (i.e. &lt; 1 segundo) ou o comprimes ata que non sona a nada. Porén o texto, é máis fácil de comprimir. Por exemplo, o libro de Rosalía, Cantares Gallegos, ocupa aproximadamente en formato PDF uns 670KB. Isto baixa ata 115KB se o convertemos a .txt, texto plano. Este arquivo pódese comprimir máis, ata uns 35KB se empregamos a compresión bzip2. Aínda así quedamos <strong>mooooi</strong> lonxe dos ~2KB que permite usar un QR e, no proceso, perdemos a capacidade de que un lector “normal” de códigos QR o poida ler.</p>

<h1 id="libros-en-qr">Libros en QR</h1>

<p>Se acabo de dicir que non colle nada nun QR, como vai coller un libro? Efectivamente, un libro non colle nun QR, pero en varios xa cambia o conto. Obviamente é un resultado menos chulo pero é curioso igual. Concretamente o libro de antes, Cantares Gallegos, colle en 36 códigos QR diferentes (optimizando ao máximo o espazo).</p>

<p><img src="/assets/qr/cg.png" alt="Cantares Gallegos de Rosalia de Castro" class="imgContainer" /></p>

<p>O malo deste códigos tan grandes e que poden ser dificiles de escanear, polo seu tamaño, pola resolución da pantalla/papel, etc. Isto xa se podia apreciar no da canción de Daft Punk de antes, aínda que sexa un só. É dicir, non é perfecto, pero tecnicamente a información está aí. Curiosamente o peso da imaxe anterior é de 232KB, algo mais do dobre que o arquivo de texto do que partimos, pero a pesar disto, é notablemente inferior ao do PDF orixinal (670KB). Así que <em>tecnicamente</em> estamos a comprimir a información. En realidade, a única compresión que realizamos e que se podería imprimir cantares enteiro nunha soa folla de papel. Sendo sinceiros, tamén se podería facer o mesmo con letra pequeniña!</p>

<h1 id="como">Como?</h1>

<p>Facer todo isto á man, paso a paso, é un traballo insufrible pero todo se pode automatizar. Para pasar os libros de pdf á txt pódese utilizar calquera conversor tanto online como local. A parte difícil é cortar os arquivos, xa en texto, no tamaño adecuado, codificalos e facer o collage final. Para todo isto creei un pequeno script de bash que permite facelo todo de golpe.</p>

<script src="https://gist.github.com/66faef4631762acc8606189229c84527.js"> </script>

<h1 id="outros-exemplos">Outros exemplos</h1>

<p>Con libros máis densos, os códigos QR dispárense de forma dramática. Por exemplo, Sempre en Galiza, en formato .txt pesa 1.1 Mb. Isto resulta nun total de 455!! códigos QR, o cal deixa a imaxe final nos 2.5Mb, máis do dobre.</p>

<p><img src="/assets/qr/sr.png" alt="Sempre en Galiza de Castelao" class="imgContainer" /></p>

<p>Non toda a prosa é tan “explosiva”, a Esmorga, resulta en tan “só” 57 códigos. Así, pasamos de 164 KB de texto a 370 de imaxe.</p>

<p><img src="/assets/qr/em.png" alt="A Esmorga de Blanco Amor" class="imgContainer" /></p>

<h1 id="comprimir-aínda-máis">Comprimir aínda máis?</h1>

<p>Mentres que sería posible comprimir as imaxes cos códigos QR, eu creo que non é recomendable. Debido ao tamaño dos códigos que se manexan, xa pode resultar difícil escanealos perfectamente, xa que dependendo da pantalla/papel, do lector e do pulso de que nos lea poden dar errores ou lecturas incorrectas. Comprimir as imaxes só aumentaría estes ratios e, ademais, podería acabar levando a que se perdera información, xa que cambiar un pixel de negro a branco podería resultar nun código QR ilexible.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Que se pode meter nun código QR?]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aburro.me/assets/qr/aburro.png" /><media:content medium="image" url="https://aburro.me/assets/qr/aburro.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="gl"><title type="html">Restaurando o mapa das escolas da emigración</title><link href="https://aburro.me/2021/03/13/escolas/" rel="alternate" type="text/html" title="Restaurando o mapa das escolas da emigración" /><published>2021-03-13T00:00:00+00:00</published><updated>2021-03-13T00:00:00+00:00</updated><id>https://aburro.me/2021/03/13/escolas</id><content type="html" xml:base="https://aburro.me/2021/03/13/escolas/"><![CDATA[<h1 id="resumo-para-impacientes">Resumo para impacientes</h1>

<p>O mapa -&gt; <a href="/assets/escolas/escolas.html">Mapa das escolas da emigración</a></p>

<h1 id="o-link-rot">O link rot</h1>
<p>O concepto de “link rot”, que se podería traducir a algo como podremia de ligazóns ou comúnmente rotura de enlaces, ocorre cando un sitio ou recurso xa non se pode atopar en internet. Neste caso, o que vos vou contar si que se pode seguir visitando pero está nun estado inusuable. É común que moitas webs queden desatendidas ou desaparezan co tempo a medida que as persoas que as levaban ou mantiñan perden o interese. Algo que debería ser menos frecuente é que isto ocorra con sitios web creados/mantidos polas administracións. Neste caso estouvos a falar da web <a href="http://mapas.consellodacultura.gal/escolas/index.php">escolas da emigración</a>. Actualmente, esta web está nun estado inusable, probablemente non pola culpa da administración senon polo cambio na API de google maps. Este cambio ocorreu xa no 2018 e fixo obrigatorio o uso dun método de pago de forma que, moitas webs coma esta, quedaron practicamente inutilizadas ao non estar ben configuradas. Neste caso, aínda que é posible ver máis ou menos as localizacións en canto lle tocas, rompe completamente.</p>

<p><img src="/assets/escolas/captura_web.jpg" alt="A paxina actualmente, a nada que lle tocas rompe" class="imgContainer" /> 
<br /></p>

<p>Vendo o tempo que fai deste cambio e o feito de que agora a API é de pago, paréceme pouco probable que a administración se acorde xa deste proxecto. Cabe destacar que cada certo tempo ocorre un milagre como pasou con <a href="https://galicianomeada.xunta.gal/sixtop/inicio">Galicia Nomeada</a> que volveu recuperar o proxecto da toponimia cunha web mellor ca nunca. Visto todo isto, o que decidín facer é simple: un “remake”</p>

<h1 id="os-datos">Os datos</h1>

<p>Por sorte os datos para este proxecto están dispoñibles na propia páxina. Dende o propio mapa pódense exportar ao formato .kmz, axeitado para o google earth. Isto fai que non sexan necesarios procedementos avanzados de “crawling”. Este tipo datos podemos, despois, convertelo a outros máis comúns. Eu usarei o geojson que está estandarizado e é compatible con python e folium (o que usarei máis adiante). Hai que dicir que se podería traballar cos datos orixinais xa que non deixan estar nun formato moi similar ao xml.</p>

<h1 id="o-mapa">O mapa</h1>

<p>Folium é unha libraría de python que permite, de forma bastante fácil, crear mapas a partir de múltiples tipos de datos (neste caso o geojson de antes). O máis relevante quizais é que soporta <a href="https://www.openstreetmap.org/">openstreetmap</a>. Openstreetmap, en resumo, é como Google maps pero gratuíto e aberto o que o fai bastante atractivo para un proxecto deste estilo. Tan importante coma isto é que para usar os mapas non hai que pagar e calquera pode achegar o seu coñecemento a eles, en forma de topónimos por exemplo.</p>

<p>Con Folium podemos coller os datos exportados no geojson e introducilos no mapa directamente, isto daranos unha serie de marcadores detallando a localización de cada unha das escolas indianas. Para darlle un pouco máis de gracia ao asunto podemos engadir <i>popups</i> e <i>tooltips</i> para que engadan información adicional. Aí eu introducín o nome de cada escola, unha foto que moi convintemente viña embebida no propio geojson. Pero non todo ían ser cousa boas, as imaxes viñan incluídas en forma de ligazón. A páxina está configurada de tal forma que non permite peticións a través doutros lugares web, probablemente por razóns de seguridade. Desta forma para poñelo bonito a única opción que quedaba era facer “crawling” destas imaxes. Isto é, descargalas e almacenalas eu para que puideran ser servidas co resto da páxina web. Xa que os propios links estaban no json embebidos isto non foi difícil, descargar as imaxes a partir desas URLs e cambiar os vínculos para que apuntasen a este sitio web.</p>

<p>Adicionalmente, engadín un campo de información extra que é unha ligazón á paxina orixinal onde hai máis detalles. Este último campo construino “adviñando” o formato das ligazóns permanentes que crea o servizo. Desta forma pódese acceder aos detalles de cada escola na páxina orixinal, mantendo a utilidade e as visitas desta (non vaia ser que a liquiden por non ter tráfico) e evítase re-implementar todo de novo.</p>

<p>Finalmente, <a href="/assets/escolas/escolas.html">o mapa resultante</a>, aínda que non é nada do outro mundo quedou bastante xeitoso e o que é mais importante, salvo cambio grave en openstreetmap debería ser estable.</p>

<h1 id="os-bugs">Os bugs</h1>

<p>Coma todo, tiña que ter bugs. O máis obvio foi atopar a Escola Rosalía de Castro na costa cerca de África. Isto debeuse a que nos datos desta escola a lonxitude e latitude estaban ambos a 0. Isto non é cousa da exportación así que o problema leva aí sen solucionar unhos anos. O máis interesante é que noutro lugar da páxina, nos detalles da escola en si, as coordenadas son correctas. Unha vez copiadas o problema quedou solucionado.</p>

<p>Máis interesante é o feito de que o xerador de ligazóns permanentes da páxina web non funciona ben. Se a escola ten no nome unha ñ non é capaz de crear o vínculo. Sorprendentemente con outros caracteres especiales si funciona, por exemplo, ignora as tiles. Debido a isto, é posible que neses casos o enlace de máis información que aparece no mapa non funcione ben.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Se non queres que se perda algo, mellor telo da túa man]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aburro.me/assets/escolas/mini.jpg" /><media:content medium="image" url="https://aburro.me/assets/escolas/mini.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="gl"><title type="html">Ten o teu concello máis palabras que persoas?</title><link href="https://aburro.me/2021/02/03/mapas/" rel="alternate" type="text/html" title="Ten o teu concello máis palabras que persoas?" /><published>2021-02-03T00:00:00+00:00</published><updated>2021-02-03T00:00:00+00:00</updated><id>https://aburro.me/2021/02/03/mapas</id><content type="html" xml:base="https://aburro.me/2021/02/03/mapas/"><![CDATA[<h1 id="os-mapas-interactivos">Os Mapas interactivos</h1>
<p><br />Primeiro só a lonxitude do artigo.<br /><br /></p>
<iframe title="Lonxitude do artigo de cada concello na Galipedia" aria-label="map" id="datawrapper-chart-SgcJe" src="https://datawrapper.dwcdn.net/SgcJe/2/" scrolling="no" frameborder="0" style="width: 0; min-width: 100% !important; border: none;" height="743"></iframe>
<script type="text/javascript">!function(){"use strict";window.addEventListener("message",(function(a){if(void 0!==a.data["datawrapper-height"])for(var e in a.data["datawrapper-height"]){var t=document.getElementById("datawrapper-chart-"+e)||document.querySelector("iframe[src*='"+e+"']");t&&(t.style.height=a.data["datawrapper-height"][e]+"px")}}))}();
</script>

<p><br /><br />Lonxitude do artigo normalizada pola cantidade de xente do concello. É dicir, a cantidade de palabras que existen no artigo por cada persoa que vive no concello.
<br /></p>
<iframe title="Palabras por persoa na Galipedia" aria-label="Map" id="datawrapper-chart-XKt1R" src="https://datawrapper.dwcdn.net/XKt1R/1/" scrolling="no" frameborder="0" style="width: 0; min-width: 100% !important; border: none;" height="778"></iframe>
<script type="text/javascript">!function(){"use strict";window.addEventListener("message",(function(a){if(void 0!==a.data["datawrapper-height"])for(var e in a.data["datawrapper-height"]){var t=document.getElementById("datawrapper-chart-"+e)||document.querySelector("iframe[src*='"+e+"']");t&&(t.style.height=a.data["datawrapper-height"][e]+"px")}}))}();
</script>

<p><br /><br /></p>

<h1 id="como-se-fixo">Como se fixo</h1>
<p>Á idea é simple, obter os datos da galipedia e simplemente contar as palabras. Na versión normalizada aumenta un pouco a dificultade xa que implica recoller os datos de poboación. O primeiro paso será polo tanto obter unha lista dos concellos da Galiza. Isto, vendo o fácil que era fíxeno a man, é dicir, copieinos a un arquivo .txt. A partir deste xa poderemos facer as chamadas a API da wiki para poder ver os artigos en concreto. Para iso use o seguinte script de python:
<br />
<script src="https://gist.github.com/6c77bdb46b7351bbc027ea98e43c690d.js"> </script></p>

<p>En xeral facer e usar o script é bastante fácil. Hai que ter coidado cos encodings dos arquivos iso si, xa que estes poden non estar en UTF-8 o cal pode implicar problemas ao facer as peticións á galipedia.</p>

<p>Para normalizar o proceso é similar. Os datos collinos á man do IGE, de onde os podes descargar en diferentes formatos. Despois, lemos os datos dos arquivos (a saída do anterior e os descargados) para combinalos mediante o seguinte script de python:
<br />
<script src="https://gist.github.com/52b933dd5cc2f4d5641ccc06757e710a.js"> </script></p>

<p>Con isto conseguimos os datos, pero e os mapas? Os mapas son incluso máis sinxelos de facer grazas a <a href="https://www.datawrapper.de/">Datawrapper</a>. Nesta páxina web podemos crear todo tipos de mapas e gráficos de maneira sinxela, simplemente importando os datos que conseguimos antes. Se queredes botarlle unha ollada aos datos que obtiven deixovolos <a href="/assets/mapas/concellos.csv">aquí</a>.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Mapas interactivos e como facelos]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aburro.me/assets/mapas/normalizado.png" /><media:content medium="image" url="https://aburro.me/assets/mapas/normalizado.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="gl"><title type="html">Typer-Gal: o xogo de escritura en galego</title><link href="https://aburro.me/2020/08/27/typer-gal/" rel="alternate" type="text/html" title="Typer-Gal: o xogo de escritura en galego" /><published>2020-08-27T00:00:00+00:00</published><updated>2020-08-27T00:00:00+00:00</updated><id>https://aburro.me/2020/08/27/typer-gal</id><content type="html" xml:base="https://aburro.me/2020/08/27/typer-gal/"><![CDATA[<h1 id="tldr">TL;DR</h1>

<p>O enlace: <a href="https://typer-gal.now.sh/">typer-gal</a></p>

<h1 id="open-source">Open source</h1>

<p>Fai uns días atopei unha aplicación moi chula, <a href="https://typer.now.sh/">typer</a>, e iso que os xogos de escribir non son o meu. O interesante desta app web é o seu deseño simple pero sobre todo que é de código aberto ou open source. Isto significa que, a grosso modo, podes non só ver o código senón modificalo ao gusto, que foi o que fixen eu.</p>

<h1 id="modificacións">Modificacións</h1>

<p>A idea era ben simple, partindo da base en inglés, adaptala para empregar palabras en galego. O que cambiei do deseño foi pouco, só engadín un par de botóns para cambiar entre a versión isolacionista e a reintegracionista, así está ao gusto de todos. Fóra diso, pasei dos 10 segundos para escribir da orixinal á 15 xa que moitas das palabras son máis longas.
<br />
Como é código aberto invítovos a pasarvos polo repo, tanto da <a href="https://github.com/omediodomonte38/typer-gal">miña versión</a> como da do <a href="https://github.com/ninest/typer">creador orixinal</a>. Se o vedes, xa vos aviso de que o código está daquela maneira, non me dou moito xeito co javascript.</p>

<h1 id="as-palabras">As palabras</h1>

<p>Actualmente o xogo ten <strong>todas</strong> as palabras, tanto do dicionario da RAG como do Estraviz. Algo de limpeza de repetidos ou expresións feitas moi longas si que fixen, pero non moito. Isto pode supoñer un problema se o queredes usar con pícaros xa que pode ser que aparezan palabras mal soantes, no futuro sería interesante facer unha versión simplificada.
<br />
Para obter as palabras usei os <em>sitemaps</em> do dicionario Estraviz que fixeron moi fácil crear unha lista de palabras. O dicionario da RAG resistiuse un pouco máis, tiven que recorrer a súa app móbil. Nesta atópase unha base de datos con todos os termos. Cabe destacar que a versión da app non é moi recente (2018) polo que algunhas das últimas palabras engadidas, como o famoso gromo, faltarán.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Aprende algunha palabra ou pasa o tempo tentando superar as túas puntuacións máis altas]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aburro.me/assets/typer/typer.png" /><media:content medium="image" url="https://aburro.me/assets/typer/typer.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="gl"><title type="html">Complementando as notas para o Dirt mediante IA</title><link href="https://aburro.me/2020/08/02/ai-voice/" rel="alternate" type="text/html" title="Complementando as notas para o Dirt mediante IA" /><published>2020-08-02T00:00:00+00:00</published><updated>2020-08-02T00:00:00+00:00</updated><id>https://aburro.me/2020/08/02/ai-voice</id><content type="html" xml:base="https://aburro.me/2020/08/02/ai-voice/"><![CDATA[<h1 id="as-notas">As notas</h1>

<p>Como igual xa vistes <a href="/2020/07/15/dirty_pacenotes_galician.html">nun dos anteriores posts</a> fixen un pequeno “modelo” de notas de copiloto para o Dirt Rally (1 e 2) ao cal cada quen poidera engadir outras palabras de forma fácil. Desta forma cada un podería adaptalas ao estilo que preferira. O maior problema era que, ao usar só as palabras dispoñibles no diccionario da RAG/ILG moitas das frases creadas quedaban inconexas. Por exemplo, algo moi común é que o copiloto che diga que non cortes ou non atalles nunha curva porque pode ser que teña unha cuneta, unha pedra ou algo perigoso. Ben, só coas palabras gravadas non se poden conxugar a maioría de verbos polo que a frase final podería quedar como “Curva 1 dereita non atallar” que lle da un toque máis robótico do que xa ten. Con esta nova opción poderemos crear as palabras axeitas, como por exemplo conxugando verbos. Con isto poderemos conseguir, por exemplo: “Curva 1 dereita non atalles”.</p>

<h1 id="pero-como">Pero, como?</h1>

<p>Xa fai un tempo, igual vos cadrou de ver por twitter o modelo que adestrou <a href="https://twitter.com/m_garthia/status/1251541614490681344">Marcos</a>. Todo isto está baseado nel. Este modelo foi creado empregando <a href="https://arxiv.org/abs/1712.05884">Tacotron 2</a>. Non vou finxir ser un experto nestas cousas pero a <em>grosso modo</em> usa dúas redes neuronais diferentes, unha das cales toma o texto de entrada o transfórmao nun espectrograma. A segunda, unha Wavenet modificada, representa o audio correspondente ao espectrograma xerado anteriormente. Desta forma, adestrando o sistema coa voz de Luis Iglesia poderemos imitar a súa voz.</p>

<h1 id="que-facer-entón">Que facer entón?</h1>

<p>Co modelo que me deu Marcos, xa adestrado, o único que tiven que facer eu foi poñelo á disposición de todos. Para facer isto só é necesario empregar o servizo <a href="https://colab.research.google.com/">Colab</a> de Google. Este servizo permítenos usar máquinas con GPUs moi potentes, requisito case indispensable para usar este tipo de modelos, a pesar de que esteñan adestrados. A versión gratuita só permite unhas horas de computación de cada vez, pero como o obxectivo é só a xeración a partir dun modelo xa pre-adestrado ningúen debería ter problema.</p>

<h1 id="o-notebook">O notebook</h1>

<p>Colab estrúturase mediante notebooks ou cadernos. Estes arquivos permiten compartir código que se executará nas máquinas. Para xerar logo as nosas palabras o primeiro paso é acceder ao <a href="https://colab.research.google.com/drive/1IOKfoY45NjsnaXR2LYZZrNVuPuY6K_pj?usp=sharing">notebook en concreto</a>.</p>

<p>A continuación e como paso previo deberemos asegurarnos de que o entorno de execución ten unha GPU como acelerador. Para facer isto deberemos ir ao menú superior, facer clic no menú de Entorno de execución e a continuación cambiar o tipo de entorno de execución. Con isto mostrarásenos unha selección dos que están dispoñibles. O máis común e que apareza como seleccionado None, debemos logo facer clic no desplegable e seleccionar GPU.</p>

<p><img src="/assets/colab/env.png" alt="Cambiando o tipo de entorno de execución" class="imgContainer" /></p>

<h1 id="paso-a-paso">Paso a paso</h1>

<p>Dentro do caderno veremos diferentes bloques. Dentro destes bloques hai código que se executará cando se fai clic no pequeno botón de “play” que teñen na esquina superior dereita. Decidín agochar o código por defecto para que ninguén se sinta intimidado a primeira vista. Porén se alguén quere velo so ten que facer clic dereito formulario &gt; mostar código. Os dous primeros bloques (Descarga de arquivos necesarios e Instalación de librarías e compoñentes) podemos executalos sen darlle moitas voltas, facendo clic no botón e esperando.</p>

<p><img src="/assets/colab/paso0.png" alt="Antes de executar" class="imgContainer" /></p>

<p>En cambio o terceiro bloque, require que introduzamos as palabras que desexemos serar. Por defecto trae só dúas pero é posible introducir calquera outra cantidade delas. O tempo de execución variará en función das que decidas poñer iso si, máis palabras máis espera. Unha vez introducidas as palabras é <strong>fundamental</strong> facer clic no botón de executar para que se garden. Se cambiaches de idea con respecto ás palabras que queres introducir podes executar este bloque cantas veces queiras sen repercusións, pero é importante destacar que só se xerarán aquelas que estiveran persentes no campo a última vez que se executou o bloque.</p>

<p>Por último os dous bloques finais, xerar os arquivos de audio e descargar os arquivos, poden ser de novo executados sen realizar ningunha outra acción. O último bloque descargará todos os arquivos xerados pero é posible que se son moitos ou nunca descargaches nada desta páxina ou navegador se queixe e che pida permiso para descargalos ou incluso os bloquee. Se ves que xa acabou de executarse o bloque e non se descargou nada o máis posible que sexa por iso.</p>

<p>Cabe destacar que cada bloque ao acabar a súa execución mostará un mensaxiño confirmándoo pero tamén se pode ver facilmente polo aspecto dos botóns:
<br /></p>

<p><img src="/assets/colab/botons.png" alt="Aspecto dos botóns" class="imgContainer" /></p>

<h1 id="consellos-e-melloras-sobre-os-resultados">Consellos e melloras sobre os resultados</h1>

<p>O modelo non é perfecto e como tal pode dar lugar a erros. Moitos deles pódense solucionar con algúns trucos. Por exemplo cambiando ou quitando o til dalgunha letra pode fozar ao sistema a pronunciar doutra forma a palabra (aínda que gramaticalmente non sexa correcto) e arreglar así algun problema. Outro truquiño é cambiar Vs por Bs e ao revés.</p>

<h1 id="para-ir-acabando">Para ir acabando…</h1>

<p>Con estes arquivos de audio o proceso para agregalos sería o mesmo que o visto <a href="/2020/07/15/dirty_pacenotes_galician.html">no anterior post</a>. Cabe destacar que poden ou non requerer limpeza segundo como sexa o resultado do sistema.</p>

<p>Este método de producción de sons, ademáis de para estas notas de copiloto, tamén pode ter outras aplicacións como por exemplo xerar a pronuncia de palabras para un dicionario ou como un simple TTS en galego.</p>]]></content><author><name></name></author><category term="D" /><summary type="html"><![CDATA[Usando redes neuronais podemos imitar a voz de Luis Iglesia]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aburro.me/assets/colab/header.jpg" /><media:content medium="image" url="https://aburro.me/assets/colab/header.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="gl"><title type="html">Outro simulador de Battle Royale</title><link href="https://aburro.me/2020/07/28/br_simulator/" rel="alternate" type="text/html" title="Outro simulador de Battle Royale" /><published>2020-07-28T00:00:00+00:00</published><updated>2020-07-28T00:00:00+00:00</updated><id>https://aburro.me/2020/07/28/br_simulator</id><content type="html" xml:base="https://aburro.me/2020/07/28/br_simulator/"><![CDATA[<h1 id="battle-royale-os-bots-e-twitter">Battle Royale, os bots e twitter</h1>

<p>Non son novidade ningunha os bots, especialmente de twitter que simulan batallas ou guerras entre territorios, persoas, etc. A cousa é que, ultimamente e especialmente durante o confinamento, puxeronse de moda certas contas que son <strong>obviamente</strong> xente, é dicir, que ademais de estar amañadas están enganando aos seus seguidores. Xa teño visto máis cousas deste estilo por aí, diferentes persoas que queren, por algunha razón, convencer á xente de que o seu bot/intelixencia artificial fai algo que obviamente foi feito por persoas.</p>

<h1 id="disclaimer">Disclaimer</h1>

<p>O pequeno script que fixen eu probablemente teña 300 anti-patterns e erros de orientación a obxectos, pero tampouco o fixen coa intención de que fora unha ferramenta de aprendizaxe, simplemente por entreterme e ver como de difícil era o tema. Se eu fora vós non o copiaría porque seguro que está a un esbirro de romper.</p>

<h1 id="a-premisa">A premisa</h1>

<p>A miña idea é ben simple: unha serie de personaxes que se deben enfrentar nunha batalla a morte ata que só quede un. As persoas, ademais, poderán facer diferentes accións, todas elas básicas iso si. O principal punto é que cada personaxe pode atopar unha serie de <em>items</em> ou obxectos, configurables, que lle permiten facer máis dano, ter máis vida, etc.</p>

<h1 id="as-personaxes-e-os-items">As personaxes e os items</h1>

<p>Cada xogador ten tres estatísticas básicas susceptibles de ser modificadas polos obxectos que vaia atopando. Estas son ataque, defensa e vida e funcionan máis ou menos como cabería esperar. Para facerlle dano a outro ao ataque réstaselle a defensa do contrario e o resultado será o dano inflixido. Para manter o deseño simple, a persoa que ataca a outra ten prioridade, é dicir, fai dano primeiro. Desta forma evitamos empates que resulten en que acabe morrendo todo o mundo. Igual non é a maneira máis elegante ou máis interesante, pero vai co tema da aleatorieadade. Un xogador pode tan só atacar aos seus veciños. Cando mata a un deles, adquire á vez os veciños deste, facendo o seu terreo de influencia más grande. A orde na que as personaxes realizan as accións está aleatorizada de forma que non se beneficien a ningún.</p>

<h1 id="as-accións">As accións</h1>

<p>Cada personaxe, pode facer as seguintes accións (con posibilidades configurables): esconderse, buscar items, descansar, atacar ou ser un torpe e non dar feito nada.</p>

<h2 id="esconderse">Esconderse:</h2>

<p>O primeiro que fan todos os xogadores (en canto á orde de execución do código) e decidir se se esconde ou intentan facer algo de proveito. Esconderse permite que o xogador agochado non poida ser atacado por outros.</p>

<h2 id="buscar-items">Buscar items:</h2>
<p>Ao buscar items, unha personaxe pode atopar algo ou non. As posibilidades de atopar ou non items son configurables e o item que atope é aleatorio, dentro da lista dos dispoñibles.</p>

<h2 id="descansar">Descansar:</h2>
<p>Rexenera toda a vida.</p>

<h2 id="atacar">Atacar:</h2>
<p>Ataca a un veciño aleatoriamente. Pode fallar se o veciño ao que se decide atacar está agochado. Tamén cabe a posibilidade que o intento sexa fallido porque ambas personaxes enfrentadas non sexan capaces de matarse entre elas, xa que non hai segundos golpes, ou se matán nun só enfrentamento ou nada. Nese caso ambos salirán danados pero non morrerán. Tamén pode ocorrer que un personaxe tivera pensando atacar pero fose atacado por outro e sobrevivise. Nese caso este xogador recapacitará e abandonará o plan. Cabe destacar que no caso de que se fora producir un empate pero un dos “axentes” gañara pola prioridade, este rematará coa mínima vida, 1 punto, sinalizando que foi unha batalla moi apretada.</p>

<h2 id="non-facer-nada">Non facer nada:</h2>
<p>Cunha pequena posibilidade, tamén configurable, algún xogador será incapaz de facer nada en todo o día.</p>

<h1 id="engandindo-xogadores">Engandindo xogadores</h1>

<p>Para engadir personaxes basta con modificar o arquivo players.csv. Neste inclúense xa os nomes das columnas para facer máis simple o proceso. Basicamente cada xogador precisa dun nome, as estatísticas (ataque, defensa e vida) e unha lista de inimigos veciños. É importante ser consistente coa escritura dos nomes xa que é o que usa os script para recoñecer a cada xogador.</p>

<h1 id="engandindo-items">Engandindo items</h1>

<p>Cada item necesita un nome, e ademais, necesita estatísticas que modificarán as que ten cada personaxe. Hai que dicir que pola forma na que está programado non soporta estatísticas negativas. Aínda que para defensa e ataque non tería problema (o ataque negativo curaría inimigos, non desexable pero pasable) o problema ven dado de recoller algo que mataría á personaxe.</p>

<h1 id="o-resultado">O resultado</h1>

<p>Para executar este scritp só é necesio python3 sen ningunha dependencia fóra dos paquetes estándar. Para executar bastaría con</p>

<figure class="highlight"><pre><code class="language-shell" data-lang="shell"> python3 simulate.py </code></pre></figure>

<p>O resultado da simulación é un arquivo de texto, res.txt, con todos os eventos separados nos diferentes días de forma que sexa fácil de poñer en chíos ou darllo como entrada a un bot.</p>

<h1 id="o-código-en-si">O código en si</h1>

<p>Podedes botarlle unha ollada ao código en <a href="https://github.com/omediodomonte38/OutroBRSim">Github</a></p>

<h1 id="exemplo-de-batalla">Exemplo de batalla</h1>

<script src="https://gist.github.com/584472fa0c462bb1bff21dcd5785ba60.js"> </script>]]></content><author><name></name></author><category term="D" /><summary type="html"><![CDATA[Antes os bots finxían ser persoas, agora parece que é ao revés]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aburro.me/assets/img/logo_big.png" /><media:content medium="image" url="https://aburro.me/assets/img/logo_big.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry xml:lang="gl"><title type="html">Copiloto para o Dirt Rally en galego: Luís Iglesia</title><link href="https://aburro.me/2020/07/15/dirty_pacenotes_galician/" rel="alternate" type="text/html" title="Copiloto para o Dirt Rally en galego: Luís Iglesia" /><published>2020-07-15T00:00:00+00:00</published><updated>2020-07-15T00:00:00+00:00</updated><id>https://aburro.me/2020/07/15/dirty_pacenotes_galician</id><content type="html" xml:base="https://aburro.me/2020/07/15/dirty_pacenotes_galician/"><![CDATA[<h1 id="dirt-rally">Dirt Rally</h1>
<p>O Dirt Rally é un xogo que xa levaba tempo no mercado cando o conseguín, de feito solo o teño porque o deron gratis un tempo en steam. Cando o probei encantoume, amor a primeira vista, e iso que pensaba que iba ser moi <em>hardcore</em> para min. A cousa é que obviamente non ten copiloto en galego. Si o ten en portugués do Brasil, que pode ser un valer, pero a verdade e que a min acábame costando entender calquera copiloto e non viña mal algo que fora máis simple. Con isto, facer un copiloto en galego foi o meu proxecto “procastínico” dos exames do segundo cuadrimestre, <em>circa</em> xuño.</p>

<h1 id="a-voz">A voz</h1>

<p>A miña primeira idea, e eu creo que a de moitos tamén, foi a icónica voz de Luís Iglesia do dicionario da RAG. Palabras claras, segmentadas e dispoñibles. Esta elección ten algúns problemas que se farán obvios máis adiante pero foi a que usei. ¯\<em>(ツ)</em>/¯</p>

<h1 id="os-medios">Os medios</h1>

<p>Investigando atopei varias formas de cambiar a voz do copiloto sendo a que eu considero máis fácil e mellor o programa <a href="https://www.racedepartment.com/downloads/dirty-pacenotes.13792/">DiRTy Pacenotes</a> de Palo Samo. Este programa simplifica enormemente o traballo que sería cambiar todos os arquivos dun idioma por outros con toda as complicacións extra de tamaños de arquivo e demais que iso implica.</p>

<p>O mellor deste software é que é gratuíto e pódenselle engadir voces de forma fácil para crear as túas propias notas de copiloto. Unha vez baixado o programa só teredes qeu baixar o arquivo comprimido coa voz en galego e descomprilo na carpeta <em>co-drivers</em> dentro da carpeta do propio DiRTy Pacenotes, con isto o programa xa poderá detectalo e usalo.</p>

<h1 id="as-notas">As notas</h1>

<p>O meu obxectivo con este proxecto era crear unha base para que cada persoa a adapte ás súas necesidades. Por exemplo, a min gústame as notas relativamente cedo e simples, aínda que me perda información. A outras persoas igual lles gusta máis outras máis detalladas, con outro estilo, etc. Desta forma as seguintes seccións están un pouco enfocadas á personalización da base que vos proporciono para que cada faga como prefira.</p>

<h2 id="obtendo-os-arquivos-de-voz">Obtendo os arquivos de voz</h2>

<p>A pesar de que no paquete que vos proporciono van suficientes palabras para facer unhas notas mínimas, sempre é bo expandir. Vamos usar un exemplo realista, incluír a palabra rasante que se me quedou fóra do paquete.</p>

<p>Para conseguir os arquivos temos dúas opcións. A primeira, algo máis fácil, implica buscar a palabra que necesitemos na web do ILG: http://ilg.usc.es/pronuncia/ Unha vez atopada a palabra podemos, simplemente, facer clic dereito no botón de play e logo en gardar enlace como, que nos dará a opción de gardalo como arquivo de son.
<br />
<img src="/assets/pacenotes/web_ilg.png" alt="Gardando o arquivo de son dende o ILG" class="imgContainer" /></p>

<p>Na outra forma, empezariamos primeiro por atopar a palabra no dicionario da <a href="https://academia.gal/dicionario/-/termo/busca/rasante">RAG</a>. Unha vez na páxina podemos constatar que ten un arquivo de pronuncia se facemos clic na icona do altofalante. Como podemos obter logo o arquivo de son desta páxina? Mediante o o inspector de elementos incluído na maioría dos buscadores, i.e chrome, firefox, safari, etc. Unha forma fácil é facer control+shift+c e logo facer clic na icona do altofalante. Isto levaranos directamente á liña de código co arquivo de son. Outra opción e abrir directamente o inspector de elementos, habitualmente con f12, e procurar a clase <em>button-audio</em> mediante control+f.</p>

<p>Unha vez atopada a liña deberiamos poder ver algo coma isto:
<br />
<img src="/assets/pacenotes/web_elements.png" alt="Gardando o arquivo de son dende a RAG" class="imgContainer" /> 
<br />
Se copiamos o enlace que aí aparece, neste caso http://ilg.usc.es/pronuncia/mp3/r/417.mp3 poderemos acceder directamente ao arquivo de son e gardalo co nome que queiramos.</p>

<h2 id="incluír-o-arquivo-de-son">Incluír o arquivo de son</h2>

<p>Co arquivo de son xa descargado, podemos simplemente incluílo na carpeta <em>sounds</em> dentro da de <em>LuisIglesia</em> ou facer algo de procesamento sobre el, que foi o que fixen eu. Como estes arquivos son para a pronuncia, teñen bastante tempo ao principio e ao final de silencio e son algo lentos. O que se pode facer é modificar un por un cada arquivo en audacity por exemplo que dará moi bos resultados. O que fixen eu foi usar un script para modificalos todos de vez, que aínda que de resultados algo peores e menos homoxéneos é moito máis rápido. Co seguinte script de python acortei os arquivos a, mais ou menos, só a parte falada, para facelos máis dinámicos. Deixo o script en cuestión a continuación:
<br /></p>

<script src="https://gist.github.com/ad721175a00b2b00dff2cb31a97cd2cb.js"> </script>

<p>Unha vez incluído o arquivo na carpeta de sounds, deberemos modificar o arquivo sounds.csv para incluílo e, desta forma, o programa xa o ten dispoñible para poder crearmos as nosas notas! Cabe destacar que, dentro do propio programa, deberemos seleccionar o copiloto que queiramos, xa que o que trae por defecto é o creado polo autor, en polaco.</p>

<h2 id="uso">Uso</h2>

<p>O programa require dun par de cambios na configuración dos xogos, o máis relevante é cambiar un arquivo de configuración para que expulse datos por UDP, que é o que lle permite funcionar. Para isto remítovos ao titorial do propio Palo Samo que o explica moi ben. De forma similar as notas créanse co programa mentres “exploras” o tramo no dirt, tal e como especifica o autor. O programa ten, tamén, diversas opcións sobre como de cedo dicir as notas. As que creei eu, para o meu gusto, funcionan mellor en <em>recce</em> xa que as creei algo axustadas demais.</p>

<h1 id="arquivos">Arquivos</h1>

<p>Como  xa dixen proporciónovos unha base razoable para empezar a crear as vosas notas. Ademais, incluín unhas notas para o tramo de Pant Mawr en Gales. 
<br /></p>

<p><a href="https://mega.nz/file/RVtGyIKA#Xx6xiaT69kUdE0CmeUwkxNyUlknv4YhxcHpGJuxG3Ik">Descarga os arquivos</a></p>

<p><br /></p>

<p>Pequena demonstración:
<br /></p>

<div class="video-wrapper">
  <iframe title="Exemplo das notas en galego en Pant Mawr" src="https://drive.google.com/file/d/1YPNAHJfpStYADZpGW6kCA1fO_dpR6Kh-/preview" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
</div>

<p>(Aínda me levou unhas cantas tomas falsas non estoupar o coche contra algunha árbore, pódeme a presión diante das cámaras)</p>

<h1 id="notas-finais">Notas finais</h1>
<p>Incluín un arquivo <em>startup</em> no cal o copiloto che fai a conta atrás pero, de momento, no dirt rally 1 non funciona. O copiloto tampouco reacciona a nada do que pase na propia etapa, da igual que piques unha roda ou rebentes o coche, el segue como se foras un ás, isto é unha limitación do programa. Por último cabe dicir que se metín a zoca nalgo mo comentedes e que tentarei cambialo. Os meus agradecementos á <a href="https://twitter.com/emgalego">emgalego</a> e <a href="https://twitter.com/iavius_fausto">Xabier</a> polas aclaracións lingüísticas da curva “gancho”.</p>

<h1 id="conclusións">Conclusións</h1>

<p>O resultado <em>creo</em> que non está mal sobre todo se che gustan as frases incongruentes e algo robotizadas. Obviamente isto ten a limitación de que so se pode acceder as palabras que o propio Luís gravou para o dicionario de forma que non temos verbos conxugados nin nada polo estilo. Aínda así penso que o resultado é decente aínda que só sexa para rirse un pouco mentres comes árbores por Gales adiante.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Sempre quixeches ter un copiloto en galego pero robotizado e con frases inconexas? Non? De verdade?]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://aburro.me/assets/pacenotes/header.jpg" /><media:content medium="image" url="https://aburro.me/assets/pacenotes/header.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>