<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>clrnd's - RSS feed</title>
    <link href="http://clrnd.com.ar/atom.xml" rel="self" />
    <link href="http://clrnd.com.ar" />
    <id>http://clrnd.com.ar/atom.xml</id>
    <author>
        <name>Ezequiel A. Alvarez</name>
        <email>welcometothechango@gmail.com</email>
    </author>
    <updated>2020-11-19T00:00:00Z</updated>
    <entry>
    <title>Los algoritmos del capital</title>
    <link href="http://clrnd.com.ar/posts/2020-11-19-los-algoritmos-del-capital.html" />
    <id>http://clrnd.com.ar/posts/2020-11-19-los-algoritmos-del-capital.html</id>
    <published>2020-11-19T00:00:00Z</published>
    <updated>2020-11-19T00:00:00Z</updated>
    <summary type="html"><![CDATA[<article id="article">
    <header>
        <h1>Los algoritmos del capital</h1>
    </header>

    <section>
        <figure>
<img class="img-responsive" src="http://clrnd.com.ar/files/algos-capital/hito.png" alt="Hito Steyerl: Factory of the Sun">
<figcaption>
Hito Steyerl: Factory of the Sun <a href="http://clrnd.com.ar#fn1" class="footnote-ref" id="fnref1" role="doc-noteref"><sup>1</sup></a>
</figcaption>
</figure>
<p>El otro día una amiga me preguntó que era un algoritmo y me acordé la definición que me dieron en la facultad: “es una secuencia de pasos a ejecutar en orden para resolver un problema”. Esta misma tiene una trampa que me gusta hacer y consiste en no mencionar la computadora, porque en el fondo una y otra cosa no tienen nada que ver. Los algoritmos existen desde mucho antes que las computadoras. Por ejemplo, hacer café es un algoritmo:</p>
<ol type="1">
<li>Calentar agua hasta que llegue a los 80 grados centígrados</li>
<li>Poner 22 gramos de café molido por taza de agua en la prensa</li>
<li>Verter el agua caliente en la misma</li>
<li>Esperar un minuto</li>
<li>Prensar</li>
<li>Servir</li>
</ol>
<p>Multiplicar, como lo aprendemos en la primaria, también es un algoritmo y uno interesante ya que hay varios: existen muchas maneras de multiplicar dos números que llevan a la misma respuesta. Algunos son más fáciles, otros más veloces, o como hacían apenas 3 décadas antes en el colegio nuestrxs progenitores, usando tablas de logaritmos. Además, es un área de investigación activa: el año pasado inventaron <a href="https://www.quantamagazine.org/mathematicians-discover-the-perfect-way-to-multiply-20190411/">uno nuevo</a>.</p>
<p>Cocinar es algorítmico, una receta es seguir una secuencia de pasos y hasta podríamos aplicar técnicas algorítmicas a la cocina: imaginense que las mismas digan, por ejemplo, cómo crece la complejidad con respecto a la cantidad de personas, porque son distintos los problemas de hacer un asado que los de hacer un guiso para 20 personas. Y hasta tenemos loops: “revolver hasta que …” y condicionales: “si tenemos … entonces …”.</p>
<p>Otro, muy antiguo: se dice que en el siglo IX durante el califato abasí se encriptaban los registros de los impuestos, por eso quizás el filósofo musulman al-Kindi <a href="https://en.wikipedia.org/wiki/Al-Kindi#Cryptography">diseñó un algoritmo</a> para descifrar mensajes encriptados donde las letras estaban intercambiadas.</p>
<h2 id="mecanización">Mecanización</h2>
<p>Pero, es cierto, el verdadero potencial de los algoritmos se empieza a aprovechar con el advenimiento de las computadoras. A fin de cuentas, una computadora no es más que una máquina que puede ejecutar instrucciones ordenadas de manera programable. Generalmente, se dice que la primera computadora aparece en el siglo XIX: la <a href="https://es.wikipedia.org/wiki/M%C3%A1quina_anal%C3%ADtica">máquina analítica</a>. Pero me parece más interesante hablar sobre el primer programa. ¿Qué es un programa? Pues, es un algoritmo expresado de manera que una máquina –o persona– lo pueda entender.</p>
<p>Vayamos entonces a la historia del primer programa. El primer programa pensado para una máquina fue escrito por Ada Lovelace (a quien pusieron a estudiar matemática porque su padre, Lord Byron, era un romántico sin salvación) en 1843 para la computadora de su amigo, Charles Babbage, que estaba diseñando la susodicha máquina analítica. Lo que resolvía el programa de Lovelace era calcular un número de Bernoulli, muy útil en la época, ya que servía para hacer multiplicaciones entre números muy grandes. El programa es bastante complejo y hasta tiene algo que lo hace, más allá de toda duda, el primer “programa real”: un <em>bug</em> <a href="http://clrnd.com.ar#fn2" class="footnote-ref" id="fnref2" role="doc-noteref"><sup>2</sup></a>. Desgraciadamente nunca lo pudieron probar ya que la máquina de Babbage jamás llegó a existir.</p>
<p>Lovelace, por otra parte, nunca resignó su linaje poético. En una carta a su madre le escribe enfurecida: “No me concedes poesía filosófica. ¡Invierte el orden! ¿Me darás filosofía poética, ciencia poética?”. Justamente se concebía como una pionera de la “ciencia poética”, y se dice que su amor por la poesía es en parte lo que la llevó a escribir el primer programa: un claro producto de la intersección entre el Romanticismo y la Revolución Industrial.</p>
<p>Con el tiempo, lo mecánico advino a lo electro-mecánico y finalmente terminamos en la computadora electrónica. Mientras la computadora de Babbage podía multiplicar dos números de 20 cifras en alrededor de 3 minutos, una computadora moderna puede hacerlo en una billonésima de segundo. Este crecimiento exponencial –ahora denominado Ley de Moore– fue observado por primera vez por Gordon Moore, uno de los fundadores de Intel, quien formuló que la cantidad de transistores <a href="http://clrnd.com.ar#fn3" class="footnote-ref" id="fnref3" role="doc-noteref"><sup>3</sup></a> que entra en una computadora se duplicaría cada dos años. A efectos prácticos esto significó que diseñar algoritmos y software en general se volviese –para una clase grande de problemas– mucho más fácil: si tu programa andaba lento, podías esperar dos años para que, sencillamente por correrlo en una computadora nueva, funcione el doble de rápido.</p>
<p>Vale detenerse a reflexionar igual: el hecho de sacar cada dos años una computadora el doble de rápida que la anterior perpetúa uno de los efectos mas contradictorios del consumismo capitalista: la <em>obsolescencia programada</em>. La <em>obsolescencia programada</em> es una manera de aumentar las ventas de un producto diseñando el mismo de tal manera que sea obsoleto después de un tiempo artificial predeterminado. Para darnos una idea, el primer caso reconocido de obsolescencia programada es nada más y nada menos que las bombitas incandescentes: en 1925 se fundó un cartel de empresas productoras de bombitas que decidieron unánimemente <a href="https://www.newyorker.com/business/currency/the-l-e-d-quandary-why-theres-no-such-thing-as-built-to-last">limitar la vida útil de las mismas</a>. Por lo tanto, mientras la Ley de Moore pudo significar que la “productividad” de las computadoras creció exponencialmente, también significó que millones de computadoras terminen en pilas de basura no degradable por siglos a venir.</p>
<figure>
<img class="img-responsive" src="http://clrnd.com.ar/files/algos-capital/ada.png" alt="Ada Lovelace">
<figcaption>
Ada Lovelace
</figcaption>
</figure>
<p>Para bien o para mal, este proceso parece estar interrumpiéndose y ya no se espera que el crecimiento siga siendo exponencial; se estaría llegando a los límites físicos de cuánto se puede reducir un transistor.</p>
<p>Pero la algoritmización de la vida encuentra nuevas maneras de acelerar: la hiperconectividad de internet, la pervasividad de los <em>smartphones</em>, la acumulación incremental de datos personales y la subsecuente explotación: el algoritmo sigue produciendo, acaparando y no planea detenerse.</p>
<h2 id="explotación">Explotación</h2>
<p>¿Y de qué maneras los algoritmos modernos nos hacen la vida más fácil? El algoritmo de Google (PageRank), por ejemplo, nos simplifica la tarea de recordar sitios web y encontrar información en internet; EdgeRank de Facebook ordena y filtra inmensas cantidades de contenido de manera tal que nos llegue primero lo que más nos interesa; cientos de algoritmos trabajan en conjunto para que nos mandemos mensajes de texto casi instantáneos desde nuestros bolsillos.</p>
<p>Pero catalogar a estos algoritmos de benignos sería crudamente ingenuo. En su artículo del 2016, <a href="https://medium.com/thrive-global/how-technology-hijacks-peoples-minds-from-a-magician-and-google-s-design-ethicist-56d62ef5edf3">Cómo la Tecnología está Secuestrando Nuestra Mente</a>, Tristan Harris desarrolla algunos de los puntos donde los algoritmos del capital nos afectan negativamente: nos hacen creer que tomamos decisiones cuando no es así, nos hacen adictos a la interacción tecnológica, potencian inseguridades sociales o físicas de tal manera que ya es tema de salud pública que las redes sociales <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3477910/">aumentan la tasa de suicidios</a>, y quien sabe cuantos mas.</p>
<p>Entonces me pregunto: si la revolución industrial –supuestamente– nos liberaba del trabajo manual, ¿los algoritmos nos deberían liberar del trabajo intelectual? Para pensar esto habría que investigar sobre qué líneas de fuga se plantan estos algoritmos. En el capitalismo estas líneas de fuga están generalmente enfocadas sobre un tipo de extractivismo económico trivial que gira alrededor de la acumulación de capital y esto es más que nunca verdad para los algoritmos.</p>
<p>De la misma manera que la automatización de las fábricas no liberó a la humanidad del trabajo manual, los algoritmos por sí solos no nos liberarán de las injusticias, la desigualdad, el hambre o la explotación de unos por parte de otros. Como dice Tiziana Terranova, “la automatización, desde el punto de vista del capital, debe siempre ser compensada […] con nuevas formas de controlar el tiempo y la energía así liberados. Debe producir pobreza y estrés donde debería existir riqueza y ocio. Debe hacer del trabajo directo la medida de valor aun cuando es evidente que la ciencia, la tecnología y la cooperación social constituyen la fuente de la riqueza producida” <a href="http://clrnd.com.ar#fn4" class="footnote-ref" id="fnref4" role="doc-noteref"><sup>4</sup></a>. Dada la realidad material del presente, sus contradicciones y la interminable desigualdad incremental que vivimos, a veces me resulta difícil entender el <em>hype</em> de mis colegas informaticxs por cualquier nuevo algoritmo o tecnología; siempre tan disociados del contexto social en el que se encuentran. Cuando Elon Musk anuncia que llevará 1 millón de personas a Marte antes del 2050, ¿a qué millón de personas se refiere?</p>
<p>Si dejásemos eso de lado, si pudiéramos olvidarnos por un momento del ímpetu capitalista de acumulación y explotación, ¿cómo serían los algoritmos desarrollados por y para personas y organizaciones sociales preocupadas por vivir en un mundo más justo para todxs?</p>
<h2 id="recuperación">Recuperación</h2>
<figure>
<img class="img-responsive" src="http://clrnd.com.ar/files/algos-capital/debord.png" alt="Guy Debord: Guide psychogéographique de Paris">
<figcaption>
Guy Debord: Guide psychogéographique de Paris
</figcaption>
</figure>
<p>En el libro <a href="https://algorithmstoliveby.com/">Algorithms to Live By</a> de alguna manera los autores intentan humanizar el uso práctico de algunos algoritmos, pero no es lo que uno esperaría. En vez de nuevas maneras emancipatorias de organización política y social, nos encontramos con casos aislados donde aplicar resultados estadísticos para problemas cotidianos puede ser más óptimo o eficaz. Como cuándo hay que dejar de buscar a la “pareja perfecta”, usando la regla de la secretaria que dice que en cualquier búsqueda lineal sobre un conjunto inmenso el óptimo existe en parar al haber “entrevistado” al 37% de los sujetos (si querían saber, aplicado a la búsqueda de pareja esto representa dejar de buscar a los 28 años). O que si se compran muchas verduras, la mejor manera de consumirlas es en el orden del vencimiento, excepto si algo está por vencer donde entonces se tiene que tirar “la que más comidas rinda”.</p>
<p>No me mueve tanto la aguja. Lo que me gustaría ver es si es posible tener algoritmos que resuelvan problemas sociales, estructurales y, por qué no, políticos.</p>
<p>Me viene a la mente el <a href="https://99percentinvisible.org/episode/project-cybersyn/">Proyecto Cybersyn</a>: el plan maestro del gobierno de Salvador Allende para orquestar la economía del país, la misma ampliamente estatizada como parte de su proyecto socialista. Cybersyn hubiese consistido de una intranet entre empresas estatales que continuamente alimentaba un algoritmo que disparaba alertas y ayudaba a tomar decisiones económicas. El mismo nunca se puso en funcionamiento: el golpe de estado puso fin al sueño Chileno.</p>
<p>Volviendo al presente, en su <a href="https://www.youtube.com/watch?v=djg7yHL1iaE">charla</a> para la CodeMesh 2019, por ejemplo, Veronica Dahl dice de pensar en una inteligencia artificial <em>regenerativa</em> y <em>redistributiva</em>. Imaginar algoritmos de <em>machine learning</em> que sirvan para, por ejemplo, levantar una alarma cuando una publicación científica utiliza una muestra demasiado chica o sesgada de la población. O algo más ambicioso: algoritmos que ayuden a los legisladores a tomar mejores decisiones.</p>
<p>Más allá de la discusión de si esto es factible o no –en la cantidad de años que el sistema judicial pueda tomar en reformarse ¿cuántas nuevas maneras de acumular habrá encontrado el capital?– comparto opinión con Terranova en que seguir desarrollando algoritmos abocados solamente a crear excedentes de tiempo y trabajo para ser apropiados por una minoría, “conduce así inevitablemente a la destrucción periódica y generalizada de la riqueza acumulada, en formas de agotamiento psíquico, catástrofe ambiental y destrucción física de la riqueza por medio de la guerra” <a href="http://clrnd.com.ar#fn5" class="footnote-ref" id="fnref5" role="doc-noteref"><sup>5</sup></a>.</p>
<p>¿Es realmente imposible pensar en algoritmos cuyo único propósito no sea acumular? No lo sé, pero creo que la búsqueda tiene el potencial de ser revolucionaria.</p>
<section class="footnotes" role="doc-endnotes">
<hr />
<ol>
<li id="fn1" role="doc-endnote"><p>Todas las imágenes de este artículo fueron modificadas alterando su codigo binario con un editor hexadecimal. De esta manera, los efectos logrados (artefactos) son producto del algoritmo de (des)compresión JPG.<a href="http://clrnd.com.ar#fnref1" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
<li id="fn2" role="doc-endnote"><p>Un <em>bug</em>,del inglés “insecto”, es un error de programación. El término viene de una historia graciosa en la cual un programa, corriendo sobre una antigua computadora electromecánica en 1946, no funcionaba correctamente y al investigar el caso se encuentra que el error estaba causado por un insecto que se había introducido físicamente entre los contactos de un relé.<a href="http://clrnd.com.ar#fnref2" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
<li id="fn3" role="doc-endnote"><p>Un transistor vendría a ser la unidad básica de la que están compuestas las computadoras electrónicas: una computadora moderna tiene alrededor de 10.000.000.000 transistores.<a href="http://clrnd.com.ar#fnref3" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
<li id="fn4" role="doc-endnote"><p>Tiziana Terranova, Red Stack Attack!, Caja Negra, 2019<a href="http://clrnd.com.ar#fnref4" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
<li id="fn5" role="doc-endnote"><p><em>Ibíd</em><a href="http://clrnd.com.ar#fnref5" class="footnote-back" role="doc-backlink">↩︎</a></p></li>
</ol>
</section>
        <div class="meta">
            <div class="meta-component">
                <i class="fa fa-calendar fa-fw"></i>
                November 19, 2020
            </div>
            <div class="meta-component">
                <i class="fa fa-tags fa-fw"></i>
                <a title="All pages tagged 'algoritmos'." href="http://clrnd.com.ar/tags/algoritmos.html">algoritmos</a>, <a title="All pages tagged 'capitalismo'." href="http://clrnd.com.ar/tags/capitalismo.html">capitalismo</a>
            </div>
        </div>
    </section>
</article>
]]></summary>
</entry>
<entry>
    <title>La Sombra de las Calles: Probando OSMnx</title>
    <link href="http://clrnd.com.ar/posts/2018-07-13-la-sombra-de-las-calles-probando-osmnx.html" />
    <id>http://clrnd.com.ar/posts/2018-07-13-la-sombra-de-las-calles-probando-osmnx.html</id>
    <published>2018-07-13T00:00:00Z</published>
    <updated>2018-07-13T00:00:00Z</updated>
    <summary type="html"><![CDATA[<article id="article">
    <header>
        <h1>La Sombra de las Calles: Probando OSMnx</h1>
    </header>

    <section>
        <p>Llegué a este <a href="http://geoffboeing.com/2018/07/city-street-orientations-world/">post</a> sobre OSMnx y me gustó la idea, pero no me cerraba el gráfico.</p>
<p>Inspirado en eso y probablemente en estar leyendo Visual Explanations de Edward Tufte, se me ocurrió que tenia que haber una manera mas elegante de mostrar la dirección de las calles.</p>
<p>Justamente, las calles en sí son una visualización de su dirección, por lo que mostrando todas las calles “superpuestas” de alguna manera, deberían aparecer patrones.</p>
<p>Para esto, calculo el centroide para cada calle (por su nombre, lo que trae cierto error cuando hay nombres repetidos) y las traslado todas al origen, o sea el (0, 0).</p>
<p>Acá el <a href="https://github.com/clrnd/osmnx-calles-sombras/blob/master/notebook.ipynb">notebook</a> de jupyter.</p>
<p>Este es el resultado para las ciudades Argentinas:</p>
<p><img class="img-responsive" src="http://clrnd.com.ar/files/street_shadows_ar.png"></p>
<p>Y para algunas ciudades del original:</p>
<p><img class="img-responsive" src="http://clrnd.com.ar/files/street_shadows_us.png"></p>
        <div class="meta">
            <div class="meta-component">
                <i class="fa fa-calendar fa-fw"></i>
                July 13, 2018
            </div>
            <div class="meta-component">
                <i class="fa fa-tags fa-fw"></i>
                <a title="All pages tagged 'python'." href="http://clrnd.com.ar/tags/python.html">python</a>, <a title="All pages tagged 'viz'." href="http://clrnd.com.ar/tags/viz.html">viz</a>, <a title="All pages tagged 'osmnx'." href="http://clrnd.com.ar/tags/osmnx.html">osmnx</a>
            </div>
        </div>
    </section>
</article>
]]></summary>
</entry>
<entry>
    <title>wave2blofeld: Building a MIDI thing in C++</title>
    <link href="http://clrnd.com.ar/posts/2018-01-26-wave2blofeld-building-a-midi-thing-in-c.html" />
    <id>http://clrnd.com.ar/posts/2018-01-26-wave2blofeld-building-a-midi-thing-in-c.html</id>
    <published>2018-01-26T00:00:00Z</published>
    <updated>2018-01-26T00:00:00Z</updated>
    <summary type="html"><![CDATA[<article id="article">
    <header>
        <h1>wave2blofeld: Building a MIDI thing in C++</h1>
    </header>

    <section>
        <p>Last year’s November I went to the amazing <a href="http://clrnd.com.arduraznoconf.uy/">DuraznoConf</a>, which I must emphasize was an awesome experience, and during my free time there I got to finally finish a project of mine which I had sitting around for too long: <a href="https://github.com/clrnd/wave2blofeld">wave2blofeld</a>.</p>
<p>Basically the Waldorf Blofeld, a lovely synthesizer I happen to own, has something called <a href="http://en.wikiaudio.org/Wavetable_synthesis">WaveTable synthesis</a> which means it has literal wave tables (actually arrays though) that it iterates trough and other synth stuff. In the Blofeld, each wave table has 64 waves, and each one of these waves has 128 samples.</p>
<p>Now the fun part: you can load your own wave tables!</p>
<p>The catch is that there is no nice official way to do it 😬</p>
<p>So in order to maximize compatibility, and because why not, I decided to do it in C++ (or Rust, but the only MIDI lib I found was too beta for me).</p>
<p><code>wave2blofeld</code> takes a 8192 samples WAV file and spits out to a MIDI file which you can transfer to your Blofeld using SysEx Librarian, for example.</p>
<h2 id="dependencies">Dependencies</h2>
<p>Just run. Run as fast as you can (?)</p>
<p>Dependency management in C++ deserves it’s own dystopic novel. I tried a couple of solutions like <a href="https://buckaroo.pm/">Buckaroo</a> but guess what happens when you <a href="https://buckaroo.pm/search?q=midi">search for midi</a>.</p>
<p>Essentialy, you are on your own, so after losing more hours than I’d want I wrote a 28 lines <code>Makefile</code> which works like a charm. The thing is, since C++ package management is such a complicated issue, library writers usually end up doing their stuff as easy to build as possible, having no dependencies and sometimes even only header files!</p>
<p>Take for example this line from TCLAP’s home:</p>
<blockquote>
<p>The library is implemented entirely in header files making it easy to use and distribute with other software.</p>
</blockquote>
<p>Having to build libraries without depending on anything is a serious drawback.</p>
<p>Anyway, for this thing I ended up using:</p>
<ul>
<li><a href="https://github.com/craigsapp/midifile">midifile</a> for, ehm, MIDI files</li>
<li><a href="https://github.com/craigsapp/midifile">audiofile</a> for you can guess what</li>
<li><a href="https://github.com/craigsapp/midifile">TCLAP</a> for parsing command line options</li>
</ul>
<h2 id="building">Building</h2>
<p>Last year I ended up having to learn CMake because my algorithms class teachers weren’t really good at it, so I went with it. It’s fairly easy to get started and possibly demential to learn in depth (the manual never ends). The whole thing is only a dozen lines long:</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode cmake"><code class="sourceCode cmake"><span id="cb1-1"><a href="http://clrnd.com.ar#cb1-1"></a><span class="kw">cmake_minimum_required</span>(<span class="ot">VERSION</span> 3.0)</span>
<span id="cb1-2"><a href="http://clrnd.com.ar#cb1-2"></a><span class="kw">project</span>(wave2blofeld)</span>
<span id="cb1-3"><a href="http://clrnd.com.ar#cb1-3"></a></span>
<span id="cb1-4"><a href="http://clrnd.com.ar#cb1-4"></a><span class="kw">set</span>(<span class="dv">CMAKE_CXX_STANDARD</span> 11)</span>
<span id="cb1-5"><a href="http://clrnd.com.ar#cb1-5"></a><span class="kw">set</span>(<span class="dv">CMAKE_BUILD_TYPE</span> Debug)</span>
<span id="cb1-6"><a href="http://clrnd.com.ar#cb1-6"></a></span>
<span id="cb1-7"><a href="http://clrnd.com.ar#cb1-7"></a><span class="kw">link_directories</span>(deps/midifile-master/lib)</span>
<span id="cb1-8"><a href="http://clrnd.com.ar#cb1-8"></a></span>
<span id="cb1-9"><a href="http://clrnd.com.ar#cb1-9"></a><span class="kw">include</span>_directories(deps/midifile-master/include)</span>
<span id="cb1-10"><a href="http://clrnd.com.ar#cb1-10"></a><span class="kw">include</span>_directories(deps/audiofile-master)</span>
<span id="cb1-11"><a href="http://clrnd.com.ar#cb1-11"></a><span class="kw">include</span>_directories(deps/tclap-1.2.1/include)</span>
<span id="cb1-12"><a href="http://clrnd.com.ar#cb1-12"></a></span>
<span id="cb1-13"><a href="http://clrnd.com.ar#cb1-13"></a><span class="kw">file</span>(<span class="ot">GLOB</span> SOURCES <span class="st">&quot;src/*.cpp&quot;</span> <span class="st">&quot;deps/audiofile-master/*.cpp&quot;</span>)</span>
<span id="cb1-14"><a href="http://clrnd.com.ar#cb1-14"></a></span>
<span id="cb1-15"><a href="http://clrnd.com.ar#cb1-15"></a><span class="kw">add_executable</span>(wave2blofeld <span class="dv">${</span>SOURCES<span class="dv">}</span>)</span>
<span id="cb1-16"><a href="http://clrnd.com.ar#cb1-16"></a><span class="kw">target_link_libraries</span>(wave2blofeld midifile)</span></code></pre></div>
<p>It definitely beats having to write a Makefile 😂. Also, it is kind of readable.</p>
<p>With that out of the way, building is as easy as creating a <code>build</code> folder and inside it running <code>cmake ..</code> followed by <code>make</code>.</p>
<h2 id="actually-programming">Actually programming</h2>
<p>Building a MIDI file is not complicated, but a SysEx file … that took me a while.</p>
<p>Basically MIDI has this System Extended message format, which manufacturers can use for anything they like. Of course this means it’s all done in binary.</p>
<p>Thankfully for reference I had <a href="http://www.lysator.liu.se/~norling/blofeld.html">Jonas Norling’s page</a> which kindly offers the binary format explained and a reference implementation.</p>
<p>For starters, the Blofeld wants 128 samples of big-endian signed 21-bit integers each, that is integers between -1048575 and 1048575. <code>audiofile</code> loads samples as floating point numbers between -1 and 1, so each loop we normalize every sample and then load it in 7-bit triplets [Edit: Jonas’ post says “21-byte little-endian” numbers, which is weird because 21-bytes is a lot and anyway little-endian didn’t work for me, so I guess that’s a typo].</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb2-1"><a href="http://clrnd.com.ar#cb2-1"></a>    <span class="cf">for</span> (<span class="dt">int</span> i = <span class="dv">0</span>; i &lt; <span class="dv">128</span>; ++i){</span>
<span id="cb2-2"><a href="http://clrnd.com.ar#cb2-2"></a>        mm[<span class="dv">8</span> + <span class="dv">3</span>*i    ] = (samples[i + wave*<span class="dv">128</span>] &gt;&gt; <span class="dv">14</span>) &amp; <span class="bn">0x7f</span>;</span>
<span id="cb2-3"><a href="http://clrnd.com.ar#cb2-3"></a>        mm[<span class="dv">8</span> + <span class="dv">3</span>*i + <span class="dv">1</span>] = (samples[i + wave*<span class="dv">128</span>] &gt;&gt;  <span class="dv">7</span>) &amp; <span class="bn">0x7f</span>;</span>
<span id="cb2-4"><a href="http://clrnd.com.ar#cb2-4"></a>        mm[<span class="dv">8</span> + <span class="dv">3</span>*i + <span class="dv">2</span>] = (samples[i + wave*<span class="dv">128</span>]      ) &amp; <span class="bn">0x7f</span>;</span>
<span id="cb2-5"><a href="http://clrnd.com.ar#cb2-5"></a>    }</span></code></pre></div>
<p>Then it’s a matter of following the spec, and building a 410 byte array which is the SysEx message. We need to send a message for each of the 64 waves of the wave table.</p>
<p>Finally, a touch of iterators for adding every byte of the wave, which makes a kind of checksum:</p>
<div class="sourceCode" id="cb3"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb3-1"><a href="http://clrnd.com.ar#cb3-1"></a>    <span class="dt">int</span> checksum = <span class="bu">std::</span>accumulate(</span>
<span id="cb3-2"><a href="http://clrnd.com.ar#cb3-2"></a>        mm.begin()+<span class="dv">7</span>, mm.begin()+<span class="dv">407</span>, <span class="dv">0</span>);</span></code></pre></div>
<p>and done</p>
<div class="sourceCode" id="cb4"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb4-1"><a href="http://clrnd.com.ar#cb4-1"></a>    mf.addEvent(<span class="dv">0</span>, <span class="dv">0</span>, mm);</span></code></pre></div>
<p>Also don’t forget, you need a lamdba to make it really <em>C++11</em>:</p>
<div class="sourceCode" id="cb5"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb5-1"><a href="http://clrnd.com.ar#cb5-1"></a><span class="dt">bool</span> isValidName(<span class="bu">std::</span>string&amp; s){</span>
<span id="cb5-2"><a href="http://clrnd.com.ar#cb5-2"></a>    <span class="cf">return</span> <span class="bu">std::</span>all_of(s.begin(), s.end(),</span>
<span id="cb5-3"><a href="http://clrnd.com.ar#cb5-3"></a>        [](<span class="dt">char</span>&amp; c){</span>
<span id="cb5-4"><a href="http://clrnd.com.ar#cb5-4"></a>            <span class="cf">return</span> <span class="bn">0x20</span> &lt;= c <span class="kw">and</span> c &lt;= <span class="bn">0x7f</span>;</span>
<span id="cb5-5"><a href="http://clrnd.com.ar#cb5-5"></a>        });</span>
<span id="cb5-6"><a href="http://clrnd.com.ar#cb5-6"></a>}</span></code></pre></div>
<h2 id="command-line-options">Command line options</h2>
<p>This was ok. It’s not <a href="http://crates.io/crates/clap">Rust’s clap</a> or <a href="https://hackage.haskell.org/package/optparse-applicative">Haskell’s optparse-applicative</a> but it works. In short you need to build arguments like</p>
<div class="sourceCode" id="cb6"><pre class="sourceCode cpp"><code class="sourceCode cpp"><span id="cb6-1"><a href="http://clrnd.com.ar#cb6-1"></a>    TCLAP::ValueArg&lt;<span class="dt">unsigned</span> <span class="dt">int</span>&gt;</span>
<span id="cb6-2"><a href="http://clrnd.com.ar#cb6-2"></a>        slot(<span class="st">&quot;s&quot;</span>, <span class="st">&quot;slot&quot;</span>, <span class="st">&quot;Wavetable to write to. Between 80 and 118.&quot;</span>, <span class="kw">true</span>, <span class="dv">0</span>, <span class="st">&quot;slot&quot;</span>);</span>
<span id="cb6-3"><a href="http://clrnd.com.ar#cb6-3"></a>    cmd.add(slot);</span></code></pre></div>
<p>and the library’s “template magic” does some validation.</p>
<p>Notice how you need to add the argument to the <code>TCLAP::CmdLine cmd</code> object <strong>unless</strong> it’s a <code>TCLAP::SwitchArg</code> in which case you pass <code>cmd</code> as an argument. Why? Because software 💦.</p>
<h2 id="closing">Closing</h2>
<p>In the end, it works like a charm. I also have plans to somehow add this functionality to <a href="https://github.com/AndrewBelt/WaveEdit">WaveEdit</a> which is super cool.</p>
<p>For now, you need to export the wave table from WaveEdit, which exports them as 64 waves of 256 samples each (not 128), and convert them using wave2blofeld’s <code>-d</code> switch which will subsample each sample. Not the best solution but hey it works.</p>
        <div class="meta">
            <div class="meta-component">
                <i class="fa fa-calendar fa-fw"></i>
                January 26, 2018
            </div>
            <div class="meta-component">
                <i class="fa fa-tags fa-fw"></i>
                <a title="All pages tagged 'c++'." href="http://clrnd.com.ar/tags/c%2B%2B.html">c++</a>, <a title="All pages tagged 'midi'." href="http://clrnd.com.ar/tags/midi.html">midi</a>, <a title="All pages tagged 'wav'." href="http://clrnd.com.ar/tags/wav.html">wav</a>, <a title="All pages tagged 'sysex'." href="http://clrnd.com.ar/tags/sysex.html">sysex</a>, <a title="All pages tagged 'audio'." href="http://clrnd.com.ar/tags/audio.html">audio</a>, <a title="All pages tagged 'blofeld'." href="http://clrnd.com.ar/tags/blofeld.html">blofeld</a>
            </div>
        </div>
    </section>
</article>
]]></summary>
</entry>
<entry>
    <title>Sorting pixels in Rust</title>
    <link href="http://clrnd.com.ar/posts/2017-12-10-sorting-pixels-in-rust.html" />
    <id>http://clrnd.com.ar/posts/2017-12-10-sorting-pixels-in-rust.html</id>
    <published>2017-12-10T00:00:00Z</published>
    <updated>2017-12-10T00:00:00Z</updated>
    <summary type="html"><![CDATA[<article id="article">
    <header>
        <h1>Sorting pixels in Rust</h1>
    </header>

    <section>
        <p>Some time ago I decided to make something in Rust so my snobbish commentaries regarding the language would, at least, be honest.</p>
<p>Truthful to my style, and because it’s usually the best way to try a language, I decided to do something <em>industrialistic</em>, something that takes command line arguments, has error messages and is efficient. I find that this kind of project leaves you with a bigger picture of the language, community and libraries than doing just an exercise on it’s features and ideas.</p>
<p>The project I’ll go trough in this blog post is a pixel sorter. It takes an image like this</p>
<p><img class="img-responsive" src="http://clrnd.com.ar/files/pepsi.png"></p>
<p>and turns it into this</p>
<p><img class="img-responsive" src="http://clrnd.com.ar/files/pepsi_sorted_red.png"></p>
<p>In this example, the pixels where sorted by <em>redness</em> which is the default, but it can sort them by many dimensions: red, green, blue, alpha, hue, saturation and lightness.</p>
<p>The code is over at <a href="https://github.com/clrnd/imgsort">GitHub</a>, so feel free to criticize/improve it.</p>
<h1 id="cargo-is-love">Cargo is love</h1>
<p>Having worked with C++ a lot this year I think now I can really appreciate how great <code>cargo</code> is, and <code>rustup</code> too. Dependency handling, which can take literally between a day and a week in a new C++ project, is solved with 3 commands. Just wanted to say that, and cheers to the <code>cargo</code> team!</p>
<p>Also, for reference, this was done in Rust nightly 1.24.</p>
<h1 id="first-impressions">First impressions</h1>
<p>First of all, let me say I have but the deepest admiration to the team behind Rust. The language is barely 7 years old but it already feels extremely robust, and can, in occasion, feel really elegant.</p>
<p>On the other hand, getting my head around lifetimes was, I admit, tricky, but even worse were traits! I spent days just browsing trough the <a href="https://docs.rs/image/0.18.0/image/">image</a> crate’s documentation, trying to get my head around all the possible ways to access the underlying pixel data.</p>
<p>Things like</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode rust"><code class="sourceCode rust"><span id="cb1-1"><a href="http://clrnd.com.ar#cb1-1"></a><span class="kw">impl</span><span class="op">&lt;</span>P<span class="op">,</span> Container<span class="op">&gt;</span> GenericImage <span class="kw">for</span> ImageBuffer<span class="op">&lt;</span>P<span class="op">,</span> Container<span class="op">&gt;</span></span>
<span id="cb1-2"><a href="http://clrnd.com.ar#cb1-2"></a><span class="kw">where</span></span>
<span id="cb1-3"><a href="http://clrnd.com.ar#cb1-3"></a>    P<span class="op">:</span> Pixel <span class="op">+</span> <span class="ot">'static</span><span class="op">,</span></span>
<span id="cb1-4"><a href="http://clrnd.com.ar#cb1-4"></a>    Container<span class="op">:</span> <span class="bu">Deref</span><span class="op">&lt;</span>Target <span class="op">=</span> [<span class="pp">P::</span>Subpixel]<span class="op">&gt;</span> <span class="op">+</span> <span class="bu">DerefMut</span><span class="op">,</span></span>
<span id="cb1-5"><a href="http://clrnd.com.ar#cb1-5"></a>    <span class="pp">P::</span>Subpixel<span class="op">:</span> <span class="ot">'static</span><span class="op">,</span></span>
<span id="cb1-6"><a href="http://clrnd.com.ar#cb1-6"></a>  <span class="kw">type</span> Pixel <span class="op">=</span> P<span class="op">;</span></span></code></pre></div>
<p>would confuse me for a long time. Specially because of the mix between types, traits and lifetime parameters that occur.</p>
<p>And I have a decent Haskell background, I should be ready for this kind of things …</p>
<p>By the way, that is basically saying that, an <code>ImageBuffer</code> parameterized over such <code>P</code> and <code>Container</code> types, implements the <code>GenericImage</code> trait and thus has all the trait’s methods.</p>
<p>On the other hand, this crate does a <strong>lot</strong> of things, and it manages to do that in an orderly, pseudo type-safe fashion.</p>
<h1 id="from-the-top">From the top</h1>
<p>Reading the <code>main</code> function in <code>main.rs</code> gives us a basic idea of the full program:</p>
<ol type="1">
<li>parse some options</li>
<li>try to open and decode the image file</li>
<li>sort it</li>
<li>guess the format of the output file (which could be different from the input file)</li>
<li>create the empty file</li>
<li>write to it</li>
</ol>
<p>Every step except for 3 can fail, and in that case it prints the error and exits.</p>
<p>Pattern matching does look cool too, and it let’s you declare and define a variable on a conditional (something which C++ makes really complicated):</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode rust"><code class="sourceCode rust"><span id="cb2-1"><a href="http://clrnd.com.ar#cb2-1"></a><span class="kw">let</span> img <span class="op">=</span> <span class="kw">match</span> <span class="pp">image::</span>open(<span class="op">&amp;</span>opts<span class="op">.</span>inpath) <span class="op">{</span></span>
<span id="cb2-2"><a href="http://clrnd.com.ar#cb2-2"></a>    <span class="cn">Ok</span>(f) <span class="op">=&gt;</span> f<span class="op">,</span></span>
<span id="cb2-3"><a href="http://clrnd.com.ar#cb2-3"></a>    <span class="cn">Err</span>(err) <span class="op">=&gt;</span> <span class="op">{</span></span>
<span id="cb2-4"><a href="http://clrnd.com.ar#cb2-4"></a>        <span class="pp">eprintln!</span>(<span class="st">&quot;{}&quot;</span><span class="op">,</span> err)<span class="op">;</span></span>
<span id="cb2-5"><a href="http://clrnd.com.ar#cb2-5"></a>        <span class="pp">process::</span>exit(<span class="dv">1</span>)<span class="op">;</span></span>
<span id="cb2-6"><a href="http://clrnd.com.ar#cb2-6"></a>    <span class="op">}</span></span>
<span id="cb2-7"><a href="http://clrnd.com.ar#cb2-7"></a><span class="op">};</span></span></code></pre></div>
<p>Yes, I know this is the canonical either monad example, but Rust makes it more elegant to do it like this (for me).</p>
<h2 id="option-parsing">Option parsing</h2>
<p>This is done in <code>options.rs</code> and is extremely straight forward. All the logic is expressed in one single expression:</p>
<div class="sourceCode" id="cb3"><pre class="sourceCode rust"><code class="sourceCode rust"><span id="cb3-1"><a href="http://clrnd.com.ar#cb3-1"></a><span class="kw">let</span> matches <span class="op">=</span> <span class="pp">App::</span>new(<span class="pp">env!</span>(<span class="st">&quot;CARGO_PKG_NAME&quot;</span>))</span>
<span id="cb3-2"><a href="http://clrnd.com.ar#cb3-2"></a>    <span class="op">.</span>version(<span class="pp">env!</span>(<span class="st">&quot;CARGO_PKG_VERSION&quot;</span>))</span>
<span id="cb3-3"><a href="http://clrnd.com.ar#cb3-3"></a>    <span class="op">.</span>about(<span class="pp">env!</span>(<span class="st">&quot;CARGO_PKG_DESCRIPTION&quot;</span>))</span>
<span id="cb3-4"><a href="http://clrnd.com.ar#cb3-4"></a>    <span class="op">.</span>arg(<span class="pp">Arg::</span>with_name(<span class="st">&quot;mode&quot;</span>)</span>
<span id="cb3-5"><a href="http://clrnd.com.ar#cb3-5"></a>        <span class="op">.</span>help(<span class="st">&quot;Sort dimension&quot;</span>)</span>
<span id="cb3-6"><a href="http://clrnd.com.ar#cb3-6"></a>        <span class="op">.</span>long(<span class="st">&quot;mode&quot;</span>)</span>
<span id="cb3-7"><a href="http://clrnd.com.ar#cb3-7"></a>        <span class="op">.</span>short(<span class="st">&quot;m&quot;</span>)</span>
<span id="cb3-8"><a href="http://clrnd.com.ar#cb3-8"></a>        <span class="op">.</span>takes_value(<span class="cn">true</span>)</span>
<span id="cb3-9"><a href="http://clrnd.com.ar#cb3-9"></a>        <span class="op">.</span>default_value(<span class="st">&quot;red&quot;</span>)</span>
<span id="cb3-10"><a href="http://clrnd.com.ar#cb3-10"></a>        <span class="op">.</span>possible_values(<span class="op">&amp;</span>[<span class="st">&quot;red&quot;</span><span class="op">,</span> <span class="st">&quot;green&quot;</span><span class="op">,</span> <span class="st">&quot;blue&quot;</span><span class="op">,</span> <span class="st">&quot;alpha&quot;</span><span class="op">,</span></span>
<span id="cb3-11"><a href="http://clrnd.com.ar#cb3-11"></a>                           <span class="st">&quot;hue&quot;</span><span class="op">,</span> <span class="st">&quot;sat&quot;</span><span class="op">,</span> <span class="st">&quot;lig&quot;</span>]))</span>
<span id="cb3-12"><a href="http://clrnd.com.ar#cb3-12"></a>    <span class="op">.</span>arg(<span class="pp">Arg::</span>with_name(<span class="st">&quot;INFILE&quot;</span>)</span>
<span id="cb3-13"><a href="http://clrnd.com.ar#cb3-13"></a>        <span class="op">.</span>help(<span class="st">&quot;Input image&quot;</span>)</span>
<span id="cb3-14"><a href="http://clrnd.com.ar#cb3-14"></a>        <span class="op">.</span>required(<span class="cn">true</span>))</span>
<span id="cb3-15"><a href="http://clrnd.com.ar#cb3-15"></a>    <span class="op">.</span>arg(<span class="pp">Arg::</span>with_name(<span class="st">&quot;OUTFILE&quot;</span>)</span>
<span id="cb3-16"><a href="http://clrnd.com.ar#cb3-16"></a>        <span class="op">.</span>help(<span class="st">&quot;Output image&quot;</span>)</span>
<span id="cb3-17"><a href="http://clrnd.com.ar#cb3-17"></a>        <span class="op">.</span>required(<span class="cn">true</span>))</span>
<span id="cb3-18"><a href="http://clrnd.com.ar#cb3-18"></a>    <span class="op">.</span>get_matches_from(args)<span class="op">;</span></span></code></pre></div>
<p>I can’t imagine it being simpler or clearer, props to the team behind <a href="http://crates.io/crates/clap">clap</a>.</p>
<p>Also, the <code>env!</code> macros bring information over from the cargo environment, again an excellent feature of the build system.</p>
<h2 id="almost-sorting">Almost sorting</h2>
<p>The sorting function’s type signature looks like</p>
<div class="sourceCode" id="cb4"><pre class="sourceCode rust"><code class="sourceCode rust"><span id="cb4-1"><a href="http://clrnd.com.ar#cb4-1"></a><span class="kw">fn</span> sort_pixels(img<span class="op">:</span> <span class="op">&amp;</span><span class="pp">image::</span>DynamicImage<span class="op">,</span> mode<span class="op">:</span> <span class="op">&amp;</span><span class="pp">options::</span>Mode) <span class="op">-&gt;</span> <span class="pp">image::</span>RgbaImage</span></code></pre></div>
<p>The program starts by choosing which function to use when sorting the pixels. This is (almost) very simple:</p>
<div class="sourceCode" id="cb5"><pre class="sourceCode rust"><code class="sourceCode rust"><span id="cb5-1"><a href="http://clrnd.com.ar#cb5-1"></a><span class="kw">let</span> key_fn <span class="op">=</span> <span class="kw">match</span> <span class="op">*</span>mode <span class="op">{</span></span>
<span id="cb5-2"><a href="http://clrnd.com.ar#cb5-2"></a>    <span class="pp">options::Mode::</span>Red <span class="op">=&gt;</span> <span class="pp">sorters::</span>get_red<span class="op">,</span></span>
<span id="cb5-3"><a href="http://clrnd.com.ar#cb5-3"></a>    <span class="pp">options::Mode::</span>Green <span class="op">=&gt;</span> <span class="pp">sorters::</span>get_green<span class="op">,</span></span>
<span id="cb5-4"><a href="http://clrnd.com.ar#cb5-4"></a>    <span class="pp">options::Mode::</span>Blue <span class="op">=&gt;</span> <span class="pp">sorters::</span>get_blue<span class="op">,</span></span>
<span id="cb5-5"><a href="http://clrnd.com.ar#cb5-5"></a>    <span class="pp">options::Mode::</span>Alpha <span class="op">=&gt;</span> <span class="pp">sorters::</span>get_alpha<span class="op">,</span></span>
<span id="cb5-6"><a href="http://clrnd.com.ar#cb5-6"></a>    <span class="pp">options::Mode::</span>Hue <span class="op">=&gt;</span> <span class="pp">sorters::</span>get_hue<span class="op">,</span></span>
<span id="cb5-7"><a href="http://clrnd.com.ar#cb5-7"></a>    <span class="pp">options::Mode::</span>Saturation <span class="op">=&gt;</span> <span class="pp">sorters::</span>get_sat<span class="op">,</span></span>
<span id="cb5-8"><a href="http://clrnd.com.ar#cb5-8"></a>    <span class="pp">options::Mode::</span>Lightness <span class="op">=&gt;</span> <span class="pp">sorters::</span>get_lig<span class="op">,</span></span>
<span id="cb5-9"><a href="http://clrnd.com.ar#cb5-9"></a><span class="op">};</span></span></code></pre></div>
<p>Where the <code>sorters</code> namespace has functions of the type <code>(p: &amp;&amp;image::Rgba&lt;u8&gt;) -&gt; u8</code>.</p>
<p>Now, what’s up with <code>*mode</code>? This is actually quite interesting. We are matching on a reference, thus we can either match on references (for example, <code>&amp;options::Mode::Red</code>) or dereference it. This language wart isn’t a big deal, but is nevertheless being looked at over at <a href="https://github.com/rust-lang/rfcs/blob/master/text/2005-match-ergonomics.md">RFC 2005</a>.</p>
<p>Fun thing: the compiler error actually takes you there. Nice detail.</p>
<pre><code>error: non-reference pattern used to match a reference (see issue #42640)</code></pre>
<h2 id="actually-sorting">Actually sorting</h2>
<p>This is where I spent most of the time, and still couldn’t get it to do exactly what I wanted to do, but it works.</p>
<p>Here is the actual sorting code:</p>
<div class="sourceCode" id="cb7"><pre class="sourceCode rust"><code class="sourceCode rust"><span id="cb7-1"><a href="http://clrnd.com.ar#cb7-1"></a><span class="kw">let</span> buf2 <span class="op">=</span> buf<span class="op">.</span>clone()<span class="op">;</span></span>
<span id="cb7-2"><a href="http://clrnd.com.ar#cb7-2"></a><span class="kw">let</span> <span class="kw">mut</span> sorted_pixels<span class="op">:</span> <span class="dt">Vec</span><span class="op">&lt;</span>_<span class="op">&gt;</span> <span class="op">=</span> buf2<span class="op">.</span>pixels()<span class="op">.</span>collect()<span class="op">;</span></span>
<span id="cb7-3"><a href="http://clrnd.com.ar#cb7-3"></a>sorted_pixels<span class="op">.</span>sort_by_key(key_fn)<span class="op">;</span></span>
<span id="cb7-4"><a href="http://clrnd.com.ar#cb7-4"></a></span>
<span id="cb7-5"><a href="http://clrnd.com.ar#cb7-5"></a><span class="kw">for</span> (i<span class="op">,</span> pixel) <span class="kw">in</span> buf<span class="op">.</span>pixels_mut()<span class="op">.</span>enumerate() <span class="op">{</span></span>
<span id="cb7-6"><a href="http://clrnd.com.ar#cb7-6"></a>    <span class="op">*</span>pixel <span class="op">=</span> <span class="op">*</span>sorted_pixels[i]<span class="op">;</span></span>
<span id="cb7-7"><a href="http://clrnd.com.ar#cb7-7"></a><span class="op">}</span></span></code></pre></div>
<p>Here <code>buf</code> is an <code>RgbImage = ImageBuffer&lt;Rgb&lt;u8&gt;, Vec&lt;u8&gt;&gt;</code>. As hard as I tried, I couldn’t get to sort that without copying the data (at least I assume it is copying? Could <code>clone()</code> be optimized away?). And I can’t just access the underlying <code>Vec&lt;u8&gt;</code> because that’s flattened to it’s channels, elements aren’t pixels but single colors.</p>
<p>As it is now, it first copies everything into a temporary <code>buf2</code>, sorts that and then iterates over the original buffer, assigning each position the sorted result.</p>
<p>I think it is possible to avoid the copy, but I already spent too much time trying so if you kind reader know how, please contact me.</p>
<h1 id="tests">Tests?</h1>
<p>Testing in cargo is okay. It’s cool to have testing directly built on the build tool, but it’s a little awkward to use and extremely dependent on file and folder names.</p>
<p>For example you need to include the test module in main:</p>
<div class="sourceCode" id="cb8"><pre class="sourceCode rust"><code class="sourceCode rust"><span id="cb8-1"><a href="http://clrnd.com.ar#cb8-1"></a><span class="at">#[</span>cfg<span class="at">(</span>test<span class="at">)]</span></span>
<span id="cb8-2"><a href="http://clrnd.com.ar#cb8-2"></a><span class="kw">mod</span> tests<span class="op">;</span></span></code></pre></div>
<p>Nevertheless, it works like a charm.</p>
<h1 id="wrapping-up">Wrapping up</h1>
<p>For me, the most amazing bit was the tooling. I haven’t tried the debugger (I’ve no idea about this, but LLDB, the llvm debugger, is an excellent tool and I guess a plug-in would work like a charm) but <code>cargo</code>, <a href="https://docs.rs/">docs.rs</a> and <code>rustup</code> make it really simple and ergonomic to work with other people’s code, which for me is a crucial aspect of modern software development.</p>
<p>Safety was also not a problem. I had zero out-of-range-access errors but the code is kind of high level, which makes it not so surprising.</p>
<p>Build times where quite short too: while an order of magnitude slower than C++, think about this: This blog is made in Haskell, and I had to rebuild it from scratch when starting to write this post because I had deleted the <code>~/.stack/</code> folder … well, it just finished building right now.</p>
<p>That’s almost 2 hours.</p>
        <div class="meta">
            <div class="meta-component">
                <i class="fa fa-calendar fa-fw"></i>
                December 10, 2017
            </div>
            <div class="meta-component">
                <i class="fa fa-tags fa-fw"></i>
                <a title="All pages tagged 'rust'." href="http://clrnd.com.ar/tags/rust.html">rust</a>, <a title="All pages tagged 'image'." href="http://clrnd.com.ar/tags/image.html">image</a>, <a title="All pages tagged 'pixels'." href="http://clrnd.com.ar/tags/pixels.html">pixels</a>
            </div>
        </div>
    </section>
</article>
]]></summary>
</entry>
<entry>
    <title>A Temperature Map</title>
    <link href="http://clrnd.com.ar/posts/2017-07-14-a-temperature-map.html" />
    <id>http://clrnd.com.ar/posts/2017-07-14-a-temperature-map.html</id>
    <published>2017-07-14T00:00:00Z</published>
    <updated>2017-07-14T00:00:00Z</updated>
    <summary type="html"><![CDATA[<article id="article">
    <header>
        <h1>A Temperature Map</h1>
    </header>

    <section>
        <p><link rel="stylesheet" type="text/css" href="http://clrnd.com.ar/files/butterfly-temp/styles.css" /></p>
<p>Yesterday I finally decided to port our D3 v3 viz code to the latest D3 v4, and it was a really pleasant experience actually! This came as a nice surprise, since most JavaScript libraries don’t offer a nice upgrading experience, in my opinion (<code>react-router</code> I’m looking at you).</p>
<p>Also, this semester me and some class mates did a lot of viz work for our <a href="http://www-2.dc.uba.ar/materias/metnum/homepage.html">Numerical Methods class</a> which resulted in some <a href="http://clrnd.com.ar/files/hist-cant-gamma-k.png">really</a> <a href="http://clrnd.com.ar/files/ranking_distance.png">nice</a> <a href="http://clrnd.com.ar/files/world_temp_cross_full_poly.png">graphics</a>.</p>
<p>Anyway, during this time it ocurred to me how silly it would be to do a pseudo-statistical map on a polyhedral projection. So, finally with some time available, I decided to do <a href="http://clrnd.com.ar/posts/2015-05-07-primera-division-voronoi.html">another</a> voronoi map!</p>
<div id="map" class="center">

</div>
<p>Let me be clear: this is the least statistically significant map that can be drawn. Don’t show it to your friends.</p>
<p>But also, it looks amazing! Show it to your boss!</p>
<p>(For example, some Antartida zones fall inside some California city’s polygon, so yeah, nope)</p>
<h3 id="how">How?</h3>
<p>The temperature data is from <a href="http://kaggle.com/berkeleyearth/climate-change-earth-surface-temperature-data">Kaggle</a> and the planet from our beloved <a href="http://naturalearthdata.com">Natural Earth</a>.</p>
<p>First of all, the data is grouped by year so we have the average temperature for each city for a given year. For this map I chose 1992. Secondly, we take each city and project it’s latitude and longitude using <code>d3.geoPolyhedralWaterman()</code>.</p>
<p>Finally, we separate the space using a voronoi diagram so each city is given a polygon that contains all the points it is closest to.</p>
<p>Wanna hear awesome? Initially I used <code>d3.geoEquirectangular()</code> for tying everything up, only at the end I switched to the butterfly and it worked at once!</p>
<p>Also I’m using Susie Lu’s excellent <a href="http://d3-legend.susielu.com/">d3-legend</a>. The legend’s entire code is:</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode javascript"><code class="sourceCode javascript"><span id="cb1-1"><a href="http://clrnd.com.ar#cb1-1"></a><span class="kw">let</span> legend <span class="op">=</span> d3<span class="op">.</span><span class="fu">legendColor</span>()</span>
<span id="cb1-2"><a href="http://clrnd.com.ar#cb1-2"></a>    <span class="op">.</span><span class="fu">shapeWidth</span>(<span class="dv">30</span>)</span>
<span id="cb1-3"><a href="http://clrnd.com.ar#cb1-3"></a>    <span class="op">.</span><span class="fu">shapePadding</span>(<span class="dv">0</span>)</span>
<span id="cb1-4"><a href="http://clrnd.com.ar#cb1-4"></a>    <span class="op">.</span><span class="fu">labelFormat</span>(d <span class="kw">=&gt;</span> d3<span class="op">.</span><span class="fu">format</span>(<span class="st">'.0f'</span>)(d) <span class="op">+</span> <span class="st">' ºC'</span>)</span>
<span id="cb1-5"><a href="http://clrnd.com.ar#cb1-5"></a>    <span class="op">.</span><span class="fu">labelAlign</span>(<span class="st">'start'</span>)</span>
<span id="cb1-6"><a href="http://clrnd.com.ar#cb1-6"></a>    <span class="op">.</span><span class="fu">cells</span>(<span class="dv">8</span>)</span>
<span id="cb1-7"><a href="http://clrnd.com.ar#cb1-7"></a>    <span class="op">.</span><span class="fu">orient</span>(<span class="st">'vertical'</span>)</span>
<span id="cb1-8"><a href="http://clrnd.com.ar#cb1-8"></a>    <span class="op">.</span><span class="fu">ascending</span>(<span class="kw">true</span>)</span>
<span id="cb1-9"><a href="http://clrnd.com.ar#cb1-9"></a>    <span class="op">.</span><span class="fu">scale</span>(scale)<span class="op">;</span></span>
<span id="cb1-10"><a href="http://clrnd.com.ar#cb1-10"></a></span>
<span id="cb1-11"><a href="http://clrnd.com.ar#cb1-11"></a><span class="kw">let</span> legend_y <span class="op">=</span> height <span class="op">/</span> <span class="dv">2</span><span class="op">;</span></span>
<span id="cb1-12"><a href="http://clrnd.com.ar#cb1-12"></a>svg<span class="op">.</span><span class="fu">append</span>(<span class="st">'g'</span>)</span>
<span id="cb1-13"><a href="http://clrnd.com.ar#cb1-13"></a>    <span class="op">.</span><span class="fu">attr</span>(<span class="st">'class'</span><span class="op">,</span> <span class="st">'legend'</span>)</span>
<span id="cb1-14"><a href="http://clrnd.com.ar#cb1-14"></a>    <span class="op">.</span><span class="fu">attr</span>(<span class="st">'transform'</span><span class="op">,</span> <span class="st">'translate(10, '</span> <span class="op">+</span> legend_y <span class="op">+</span> <span class="st">')'</span>)</span>
<span id="cb1-15"><a href="http://clrnd.com.ar#cb1-15"></a>    <span class="op">.</span><span class="fu">call</span>(legend)<span class="op">;</span></span></code></pre></div>
<p>Another interesting bit is the clip path. Since the Waterman projection is not continuous, we have to cut some pieces of the map away. For that we use two things: that <code>d3.geoPath()</code> and the projection know how to render a <code>{type: 'Sphere'}</code> GeoJSON datum, and an svg <code>clipPath</code> in a <code>&lt;defs&gt;</code> element (which we also use to render the limit of the world). The full code for the clipping and limit drawing is:</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode javascript"><code class="sourceCode javascript"><span id="cb2-1"><a href="http://clrnd.com.ar#cb2-1"></a><span class="kw">var</span> defs <span class="op">=</span> svg<span class="op">.</span><span class="fu">append</span>(<span class="st">'defs'</span>)<span class="op">;</span></span>
<span id="cb2-2"><a href="http://clrnd.com.ar#cb2-2"></a></span>
<span id="cb2-3"><a href="http://clrnd.com.ar#cb2-3"></a>defs<span class="op">.</span><span class="fu">append</span>(<span class="st">'path'</span>)</span>
<span id="cb2-4"><a href="http://clrnd.com.ar#cb2-4"></a>    <span class="op">.</span><span class="fu">datum</span>({<span class="dt">type</span><span class="op">:</span> <span class="st">'Sphere'</span>})</span>
<span id="cb2-5"><a href="http://clrnd.com.ar#cb2-5"></a>    <span class="op">.</span><span class="fu">attr</span>(<span class="st">'id'</span><span class="op">,</span> <span class="st">'sphere'</span>)</span>
<span id="cb2-6"><a href="http://clrnd.com.ar#cb2-6"></a>    <span class="op">.</span><span class="fu">attr</span>(<span class="st">'d'</span><span class="op">,</span> path)<span class="op">;</span></span>
<span id="cb2-7"><a href="http://clrnd.com.ar#cb2-7"></a></span>
<span id="cb2-8"><a href="http://clrnd.com.ar#cb2-8"></a>defs<span class="op">.</span><span class="fu">append</span>(<span class="st">'clipPath'</span>)</span>
<span id="cb2-9"><a href="http://clrnd.com.ar#cb2-9"></a>    <span class="op">.</span><span class="fu">attr</span>(<span class="st">'id'</span><span class="op">,</span> <span class="st">'clip'</span>)</span>
<span id="cb2-10"><a href="http://clrnd.com.ar#cb2-10"></a>  <span class="op">.</span><span class="fu">append</span>(<span class="st">'use'</span>)</span>
<span id="cb2-11"><a href="http://clrnd.com.ar#cb2-11"></a>    <span class="op">.</span><span class="fu">attr</span>(<span class="st">'xlink:href'</span><span class="op">,</span> <span class="st">'#sphere'</span>)<span class="op">;</span></span>
<span id="cb2-12"><a href="http://clrnd.com.ar#cb2-12"></a></span>
<span id="cb2-13"><a href="http://clrnd.com.ar#cb2-13"></a>svg<span class="op">.</span><span class="fu">append</span>(<span class="st">'use'</span>)</span>
<span id="cb2-14"><a href="http://clrnd.com.ar#cb2-14"></a>    <span class="op">.</span><span class="fu">attr</span>(<span class="st">'class'</span><span class="op">,</span> <span class="st">'limit'</span>)</span>
<span id="cb2-15"><a href="http://clrnd.com.ar#cb2-15"></a>    <span class="op">.</span><span class="fu">attr</span>(<span class="st">'xlink:href'</span><span class="op">,</span> <span class="st">'#sphere'</span>)<span class="op">;</span></span></code></pre></div>
<p>Followed by <code>.attr('clip-path', 'url(#clip)')</code> on the <code>&lt;path&gt;</code> elements we want to clip. So simple!</p>
<h3 id="anyway">Anyway</h3>
<p>Another horribly bad thing going on in this map: <code>d3.voronoi()</code> is two dimensional, it’s not made for spherical coordinates. This is greatly discussed <a href="https://github.com/d3/d3/issues/1820">here</a>. I have over 3500 cities here so using the <code>O(n^2)</code> algorithm mentioned there is just not possible (my tab crashed instantly).</p>
<p>I hope you liked it or found it useful. The code is <a href="https://github.com/clrnd/clrnds-blog/tree/master/files/butterfly-temp/main.js">over at GitHub</a>, like always.</p>
<p>Cheers!</p>
<script src="https://unpkg.com/d3@5"></script>
<script src="https://unpkg.com/lodash@4"></script>
<script src="https://unpkg.com/topojson@3"></script>
<script src="https://unpkg.com/d3-geo-projection@2"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3-legend/2.24.0/d3-legend.min.js"></script>
<script src="http://clrnd.com.ar/files/butterfly-temp/main.js"></script>
        <div class="meta">
            <div class="meta-component">
                <i class="fa fa-calendar fa-fw"></i>
                July 14, 2017
            </div>
            <div class="meta-component">
                <i class="fa fa-tags fa-fw"></i>
                <a title="All pages tagged 'viz'." href="http://clrnd.com.ar/tags/viz.html">viz</a>, <a title="All pages tagged 'd3'." href="http://clrnd.com.ar/tags/d3.html">d3</a>, <a title="All pages tagged 'waterman'." href="http://clrnd.com.ar/tags/waterman.html">waterman</a>
            </div>
        </div>
    </section>
</article>
]]></summary>
</entry>
<entry>
    <title>The Water Jug Problem in Hedgehog</title>
    <link href="http://clrnd.com.ar/posts/2017-04-21-the-water-jug-problem-in-hedgehog.html" />
    <id>http://clrnd.com.ar/posts/2017-04-21-the-water-jug-problem-in-hedgehog.html</id>
    <published>2017-04-21T00:00:00Z</published>
    <updated>2017-04-21T00:00:00Z</updated>
    <summary type="html"><![CDATA[<article id="article">
    <header>
        <h1>The Water Jug Problem in Hedgehog</h1>
    </header>

    <section>
        <p>A couple of weeks ago this <a href="http://hypothesis.works/articles/how-not-to-die-hard-with-hypothesis/">blog post</a> over at the Hypothesis blog caught my eye. I had heard of TLA+ before, but the simplicity of the <a href="https://github.com/tlaplus/Examples/blob/master/specifications/DieHard/DieHard.tla">linked solution</a> surprised me.</p>
<p>And the Python solution was very nice too, I totally have to bring Hypothesis to the office someday.</p>
<p>Anyway, some days later that same week, <span class="citation" data-cites="jystic">@jystic</span> <a href="https://www.reddit.com/r/haskell/comments/646k3d/ann_hedgehog_property_testing/">announced the release of Hedgehog</a>, a property based testing library, much like QuickCheck but with a more modern approach.</p>
<p>Look, I’d never used QuickCheck or property testing for a real project before, so I was kind of surprised when I recognized some of the advantages <span class="citation" data-cites="jystic">@jystic</span> said his library had. Specifically:</p>
<ul>
<li>No Arbitrary instances.</li>
<li><ul>
<li>The amount of boilerplate needed to avoid orphan instances is tedious in general.</li>
</ul></li>
<li>Showing the values and code where a property fails.</li>
<li><ul>
<li>The first <em>frictious</em> moment I had when using QuickCheck was exactly because of this.</li>
</ul></li>
</ul>
<p>So it was set. Let’s try Hedgehog with the Water Jug problem.</p>
<h2 id="the-problem">The problem</h2>
<p>This is better explained in the Hypothesis post, but let’s recapitulate: you have 2 water jugs that you can either fill or empty. One has 5 litter capacity and the other 3. You win by leaving 4 litters in the big one.</p>
<h2 id="the-code">The code</h2>
<p>I didn’t want many dependencies, so no state monads or funny folds. Just a good old finite state machine. The <code>fsm</code> function will take a <strong>state</strong> and a <strong>step</strong>, and return a new <strong>state</strong>.</p>
<p>We start by importing,</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb1-1"><a href="http://clrnd.com.ar#cb1-1"></a><span class="kw">module</span> <span class="dt">Jugs</span> <span class="kw">where</span></span>
<span id="cb1-2"><a href="http://clrnd.com.ar#cb1-2"></a></span>
<span id="cb1-3"><a href="http://clrnd.com.ar#cb1-3"></a><span class="kw">import</span>           <span class="dt">Hedgehog</span></span>
<span id="cb1-4"><a href="http://clrnd.com.ar#cb1-4"></a><span class="kw">import</span>           <span class="dt">Hedgehog.Internal.Property</span> (<span class="dt">TestLimit</span>(..))</span>
<span id="cb1-5"><a href="http://clrnd.com.ar#cb1-5"></a><span class="kw">import</span> <span class="kw">qualified</span> <span class="dt">Hedgehog.Gen</span> <span class="kw">as</span> <span class="dt">Gen</span></span>
<span id="cb1-6"><a href="http://clrnd.com.ar#cb1-6"></a><span class="kw">import</span> <span class="kw">qualified</span> <span class="dt">Hedgehog.Range</span> <span class="kw">as</span> <span class="dt">Range</span></span></code></pre></div>
<p>and then defining our type for the problem:</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb2-1"><a href="http://clrnd.com.ar#cb2-1"></a><span class="kw">data</span> <span class="dt">Step</span> <span class="ot">=</span> <span class="dt">FillBig</span></span>
<span id="cb2-2"><a href="http://clrnd.com.ar#cb2-2"></a>          <span class="op">|</span> <span class="dt">FillSmall</span></span>
<span id="cb2-3"><a href="http://clrnd.com.ar#cb2-3"></a>          <span class="op">|</span> <span class="dt">EmptyBig</span></span>
<span id="cb2-4"><a href="http://clrnd.com.ar#cb2-4"></a>          <span class="op">|</span> <span class="dt">EmptySmall</span></span>
<span id="cb2-5"><a href="http://clrnd.com.ar#cb2-5"></a>          <span class="op">|</span> <span class="dt">SmallIntoBig</span></span>
<span id="cb2-6"><a href="http://clrnd.com.ar#cb2-6"></a>          <span class="op">|</span> <span class="dt">BigIntoSmall</span></span>
<span id="cb2-7"><a href="http://clrnd.com.ar#cb2-7"></a>          <span class="kw">deriving</span> (<span class="dt">Show</span>, <span class="dt">Eq</span>, <span class="dt">Enum</span>)</span></code></pre></div>
<p>Those are all the different kinds of steps we’ll have.</p>
<p>We will also need state to keep track of how much water our jugs have,</p>
<div class="sourceCode" id="cb3"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb3-1"><a href="http://clrnd.com.ar#cb3-1"></a><span class="kw">data</span> <span class="dt">State</span> <span class="ot">=</span> <span class="dt">State</span></span>
<span id="cb3-2"><a href="http://clrnd.com.ar#cb3-2"></a>  {<span class="ot"> bigJug ::</span> <span class="dt">Int</span></span>
<span id="cb3-3"><a href="http://clrnd.com.ar#cb3-3"></a>  ,<span class="ot"> smallJug ::</span> <span class="dt">Int</span></span>
<span id="cb3-4"><a href="http://clrnd.com.ar#cb3-4"></a>  } <span class="kw">deriving</span> (<span class="dt">Show</span>, <span class="dt">Eq</span>)</span></code></pre></div>
<p>which by the way start out empty:</p>
<div class="sourceCode" id="cb4"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb4-1"><a href="http://clrnd.com.ar#cb4-1"></a><span class="ot">initial ::</span> <span class="dt">State</span></span>
<span id="cb4-2"><a href="http://clrnd.com.ar#cb4-2"></a>initial <span class="ot">=</span> <span class="dt">State</span> { bigJug <span class="ot">=</span> <span class="dv">0</span>, smallJug <span class="ot">=</span> <span class="dv">0</span>}</span></code></pre></div>
<p>Now, let’s define what each step does:</p>
<div class="sourceCode" id="cb5"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb5-1"><a href="http://clrnd.com.ar#cb5-1"></a><span class="ot">fsm ::</span> <span class="dt">State</span> <span class="ot">-&gt;</span> <span class="dt">Step</span> <span class="ot">-&gt;</span> <span class="dt">State</span></span>
<span id="cb5-2"><a href="http://clrnd.com.ar#cb5-2"></a>fsm s <span class="dt">FillBig</span> <span class="ot">=</span> s { bigJug <span class="ot">=</span> <span class="dv">5</span> }</span>
<span id="cb5-3"><a href="http://clrnd.com.ar#cb5-3"></a>fsm s <span class="dt">FillSmall</span> <span class="ot">=</span> s { smallJug <span class="ot">=</span> <span class="dv">3</span> }</span>
<span id="cb5-4"><a href="http://clrnd.com.ar#cb5-4"></a>fsm s <span class="dt">EmptyBig</span> <span class="ot">=</span> s { bigJug <span class="ot">=</span> <span class="dv">0</span> }</span>
<span id="cb5-5"><a href="http://clrnd.com.ar#cb5-5"></a>fsm s <span class="dt">EmptySmall</span> <span class="ot">=</span> s { smallJug <span class="ot">=</span> <span class="dv">0</span> }</span>
<span id="cb5-6"><a href="http://clrnd.com.ar#cb5-6"></a>fsm (<span class="dt">State</span> big small) <span class="dt">SmallIntoBig</span> <span class="ot">=</span></span>
<span id="cb5-7"><a href="http://clrnd.com.ar#cb5-7"></a>    <span class="kw">let</span> big' <span class="ot">=</span> <span class="fu">min</span> <span class="dv">5</span> (big <span class="op">+</span> small) <span class="kw">in</span></span>
<span id="cb5-8"><a href="http://clrnd.com.ar#cb5-8"></a>    <span class="dt">State</span> { bigJug <span class="ot">=</span> big'</span>
<span id="cb5-9"><a href="http://clrnd.com.ar#cb5-9"></a>          , smallJug <span class="ot">=</span> small <span class="op">-</span> (big' <span class="op">-</span> big) }</span>
<span id="cb5-10"><a href="http://clrnd.com.ar#cb5-10"></a>fsm (<span class="dt">State</span> big small) <span class="dt">BigIntoSmall</span> <span class="ot">=</span></span>
<span id="cb5-11"><a href="http://clrnd.com.ar#cb5-11"></a>    <span class="kw">let</span> small' <span class="ot">=</span> <span class="fu">min</span> <span class="dv">3</span> (big <span class="op">+</span> small) <span class="kw">in</span></span>
<span id="cb5-12"><a href="http://clrnd.com.ar#cb5-12"></a>    <span class="dt">State</span> { bigJug <span class="ot">=</span> big <span class="op">-</span> (small' <span class="op">-</span> small)</span>
<span id="cb5-13"><a href="http://clrnd.com.ar#cb5-13"></a>          , smallJug <span class="ot">=</span> small' }</span></code></pre></div>
<p>That was easy. Let’s also define a function that executes a list of steps from the initial state:</p>
<div class="sourceCode" id="cb6"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb6-1"><a href="http://clrnd.com.ar#cb6-1"></a><span class="ot">execute ::</span> [<span class="dt">Step</span>] <span class="ot">-&gt;</span> <span class="dt">State</span></span>
<span id="cb6-2"><a href="http://clrnd.com.ar#cb6-2"></a>execute <span class="ot">=</span> <span class="fu">foldl</span> fsm initial</span></code></pre></div>
<p>Finally, the Hedgehog bits. We want to say: give me a random list of steps that has length between 0 and 20. We do it like so:</p>
<div class="sourceCode" id="cb7"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb7-1"><a href="http://clrnd.com.ar#cb7-1"></a><span class="ot">steps ::</span> <span class="dt">Monad</span> m <span class="ot">=&gt;</span> <span class="dt">Gen</span> m [<span class="dt">Step</span>]</span>
<span id="cb7-2"><a href="http://clrnd.com.ar#cb7-2"></a>steps <span class="ot">=</span> Gen.list (Range.linear <span class="dv">0</span> <span class="dv">20</span>) (Gen.enum <span class="dt">FillBig</span> <span class="dt">BigIntoSmall</span>)</span></code></pre></div>
<p>Also we define our property, which we want to see proven false,</p>
<div class="sourceCode" id="cb8"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb8-1"><a href="http://clrnd.com.ar#cb8-1"></a><span class="ot">prop_solution ::</span> <span class="dt">Property</span></span>
<span id="cb8-2"><a href="http://clrnd.com.ar#cb8-2"></a>prop_solution <span class="ot">=</span> withTests (<span class="dt">TestLimit</span> <span class="dv">5000</span>) <span class="op">.</span> property <span class="op">$</span> <span class="kw">do</span></span>
<span id="cb8-3"><a href="http://clrnd.com.ar#cb8-3"></a>    s <span class="ot">&lt;-</span> forAll steps</span>
<span id="cb8-4"><a href="http://clrnd.com.ar#cb8-4"></a>    <span class="kw">let</span> (<span class="dt">State</span> big small) <span class="ot">=</span> execute s</span>
<span id="cb8-5"><a href="http://clrnd.com.ar#cb8-5"></a>    assert <span class="op">$</span> big <span class="op">/=</span> <span class="dv">4</span></span></code></pre></div>
<p>also setting the TestLimit to 5000, so it doesn’t give up too early.</p>
<h2 id="the-solution">The solution</h2>
<p>We can load this file using <code>stack ghci --package=hedgehog-0.1</code>, after adding hedgehog and any other missing deps to the global stack project (that is <code>~/.stack/global-project/stack.yaml</code>). Finally, we get:</p>
<div class="sourceCode" id="cb9"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb9-1"><a href="http://clrnd.com.ar#cb9-1"></a><span class="op">*</span><span class="dt">Jugs</span> λ<span class="op">&gt;</span> check prop_solution</span>
<span id="cb9-2"><a href="http://clrnd.com.ar#cb9-2"></a>  ✗ <span class="op">&lt;</span>interactive<span class="op">&gt;</span> failed after <span class="dv">3290</span> tests <span class="fu">and</span> <span class="dv">5</span> shrinks<span class="op">.</span></span>
<span id="cb9-3"><a href="http://clrnd.com.ar#cb9-3"></a></span>
<span id="cb9-4"><a href="http://clrnd.com.ar#cb9-4"></a>       ┏━━ Jugs.hs ━━━</span>
<span id="cb9-5"><a href="http://clrnd.com.ar#cb9-5"></a>    <span class="dv">44</span> ┃<span class="ot"> prop_solution ::</span> <span class="dt">Property</span></span>
<span id="cb9-6"><a href="http://clrnd.com.ar#cb9-6"></a>    <span class="dv">45</span> ┃ prop_solution <span class="ot">=</span> withTests (<span class="dt">TestLimit</span> <span class="dv">5000</span>) <span class="op">.</span> property <span class="op">$</span> <span class="kw">do</span></span>
<span id="cb9-7"><a href="http://clrnd.com.ar#cb9-7"></a>    <span class="dv">46</span> ┃     s <span class="ot">&lt;-</span> forAll steps</span>
<span id="cb9-8"><a href="http://clrnd.com.ar#cb9-8"></a>       ┃     │ [ <span class="dt">FillBig</span></span>
<span id="cb9-9"><a href="http://clrnd.com.ar#cb9-9"></a>       ┃     │ , <span class="dt">BigIntoSmall</span></span>
<span id="cb9-10"><a href="http://clrnd.com.ar#cb9-10"></a>       ┃     │ , <span class="dt">EmptySmall</span></span>
<span id="cb9-11"><a href="http://clrnd.com.ar#cb9-11"></a>       ┃     │ , <span class="dt">BigIntoSmall</span></span>
<span id="cb9-12"><a href="http://clrnd.com.ar#cb9-12"></a>       ┃     │ , <span class="dt">FillBig</span></span>
<span id="cb9-13"><a href="http://clrnd.com.ar#cb9-13"></a>       ┃     │ , <span class="dt">BigIntoSmall</span></span>
<span id="cb9-14"><a href="http://clrnd.com.ar#cb9-14"></a>       ┃     │ ]</span>
<span id="cb9-15"><a href="http://clrnd.com.ar#cb9-15"></a>    <span class="dv">47</span> ┃     <span class="kw">let</span> (<span class="dt">State</span> big small) <span class="ot">=</span> execute s</span>
<span id="cb9-16"><a href="http://clrnd.com.ar#cb9-16"></a>    <span class="dv">48</span> ┃     assert <span class="op">$</span> big <span class="op">/=</span> <span class="dv">4</span></span>
<span id="cb9-17"><a href="http://clrnd.com.ar#cb9-17"></a>       ┃     <span class="op">^^^^^^^^^^^^^^^^^</span></span></code></pre></div>
<p>Isn’t that pretty? It even has colors on my terminal.</p>
<p>Also, the solution is exactly the same the Hypothesis post had! (I saw other solutions, some even not optimal, but this one was the most common).</p>
<p>I think I’m gonna like Hedgehog.</p>
<p>In the meantime, I’ll see about implementing the <a href="http://vigna.di.unimi.it/ftp/papers/Jugs.pdf">generic solution</a> some day.</p>
        <div class="meta">
            <div class="meta-component">
                <i class="fa fa-calendar fa-fw"></i>
                April 21, 2017
            </div>
            <div class="meta-component">
                <i class="fa fa-tags fa-fw"></i>
                <a title="All pages tagged 'haskell'." href="http://clrnd.com.ar/tags/haskell.html">haskell</a>, <a title="All pages tagged 'hypothesis'." href="http://clrnd.com.ar/tags/hypothesis.html">hypothesis</a>, <a title="All pages tagged 'hedgehog'." href="http://clrnd.com.ar/tags/hedgehog.html">hedgehog</a>, <a title="All pages tagged 'quickcheck'." href="http://clrnd.com.ar/tags/quickcheck.html">quickcheck</a>
            </div>
        </div>
    </section>
</article>
]]></summary>
</entry>
<entry>
    <title>Scraping Dr. Who's IMDB ratings</title>
    <link href="http://clrnd.com.ar/posts/2016-03-15-dr-who-imdb-ratings.html" />
    <id>http://clrnd.com.ar/posts/2016-03-15-dr-who-imdb-ratings.html</id>
    <published>2016-03-15T00:00:00Z</published>
    <updated>2016-03-15T00:00:00Z</updated>
    <summary type="html"><![CDATA[<article id="article">
    <header>
        <h1>Scraping Dr. Who's IMDB ratings</h1>
    </header>

    <section>
        <p>Dr. Who is a hell of a good show, it matches the right amount of sci-fi with a young heart and an amazing production team.</p>
<p>I’ve been trying to watch season 9 since it came out, but somehow I don’t feel the show as I did before, so I thought, is it me or did the quality change? Let’s plot it and see!</p>
<div id="viz">

</div>
<div id="info">
<p><b>Season: </b><span id="info-season"></span> <b>Episode: </b><span id="info-number"></span> <b>Date: </b><span id="info-date"></span></p>
<p><b>Title: </b><span id="info-title"></span></p>
<p><b>Rating: </b><span id="info-rating"></span></p>
</div>
<p>So, first I did some bash-ing of the episodes by season:</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb1-1"><a href="http://clrnd.com.ar#cb1-1"></a><span class="kw">for</span> <span class="ex">x</span> in <span class="dt">{1..9}</span><span class="kw">;</span> <span class="kw">do</span></span>
<span id="cb1-2"><a href="http://clrnd.com.ar#cb1-2"></a>    <span class="fu">wget</span> <span class="st">&quot;http://www.imdb.com/title/tt0436992/episodes?season=</span><span class="va">$x</span><span class="st">&quot;</span><span class="kw">;</span></span>
<span id="cb1-3"><a href="http://clrnd.com.ar#cb1-3"></a><span class="kw">done</span></span></code></pre></div>
<p>Then, I wanted to try <a href="https://hackage.haskell.org/package/scalpel">scalpel</a>, a Haskell scraper. It is a really cool thing, for example:</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb2-1"><a href="http://clrnd.com.ar#cb2-1"></a><span class="ot">title ::</span> <span class="dt">Scraper</span> <span class="dt">Text</span> <span class="dt">Text</span></span>
<span id="cb2-2"><a href="http://clrnd.com.ar#cb2-2"></a>title <span class="ot">=</span> attr <span class="st">&quot;title&quot;</span> <span class="op">$</span> <span class="st">&quot;a&quot;</span> <span class="op">@:</span> [<span class="st">&quot;itemprop&quot;</span> <span class="op">@=</span> <span class="st">&quot;name&quot;</span>]</span></code></pre></div>
<p>matches an “a” tag with the “itemprop” attribute set to “name”, and the extracts the “title” attribute value. <a href="https://gist.github.com/clrnd/3f5221fe2b053265b0b935da8bc374f8">Here is the full gist.</a></p>
<p>Lastly I added some D3js pain (sorry JavaScript, you are awful) and I got the plot.</p>
<p>Now, a couple of things grab my attention:</p>
<h3 id="linear-regression-is-boring">Linear regression is boring</h3>
<p>I spent around an hour plotting the linear regression (it’s the light-gray line), but it turned out to be almost constant!</p>
<p>This kind-of-means that I was wrong, the show is neither “better” or “worse” (for whatever that means in the <a href="http://www.imdb.com/title/tt2975590/?ref_=fn_al_tt_3">context of IMDB ratings</a>).</p>
<p>Actually the slope of the regression is -0.008453710369452755 so yeah, not enough for my elitist palate.</p>
<h3 id="jam-the-lines">Jam the lines</h3>
<p>The lines cross the mean (which is exactly 8, by the way) a lot of times. Episode ratings alternate a lot between almost-7★ and not-quite-9★. (If you are curious, the median gets crossed 40 times.)</p>
<p>For example, episode 9-9 (Sleep No More) rates at 6.2★, while the next one (Face The Raven) jumps all the way up to 8.8★! It’s a difference of 2.6 stars, the largest one in consecutive episodes. Even more, the previous one, episode 9-8 (The Zygon Inversion) is an 8.7★.</p>
<p>Make your own assumptions (because I won’t make a single one, seriously, it doesn’t mean anything).</p>
<h3 id="season-finales">Season finales</h3>
<p>Every season finale scores better than the first episode of the next season, which is kinda obvious considering Dr. Who usually ends seasons in a time-galatic war between pan-dimensional hamburgers and robo-bears.</p>
<p>But wait a minute, <strong>except</strong> for season 9!</p>
<p>There it is, I just made a hiatus on an exceptional low note.</p>
<p>Question answered.</p>
<p>Good bye.</p>
<script src="https://unpkg.com/lodash@4"></script>
<script src="http://clrnd.com.ar/js/dr-who-ratings.js"></script>
<style>
#viz {
    font: 13px sans-serif;
}

#info {
    font: 13px sans-serif;
}

.axis path,
.axis line {
    fill: none;
    stroke: #000;
    shape-rendering: crispEdges;
}

.y.axis path,
.x.axis path {
    display: none;
}

.line {
    fill: none;
    stroke-width: 1.5px;
}

.overlay {
    fill: none;
    pointer-events: all;
}

.focus {
    fill: none;
    stroke-width: 1px;
    stroke: black;
}
</style>
        <div class="meta">
            <div class="meta-component">
                <i class="fa fa-calendar fa-fw"></i>
                March 15, 2016
            </div>
            <div class="meta-component">
                <i class="fa fa-tags fa-fw"></i>
                <a title="All pages tagged 'haskell'." href="http://clrnd.com.ar/tags/haskell.html">haskell</a>, <a title="All pages tagged 'd3'." href="http://clrnd.com.ar/tags/d3.html">d3</a>, <a title="All pages tagged 'viz'." href="http://clrnd.com.ar/tags/viz.html">viz</a>, <a title="All pages tagged 'scraping'." href="http://clrnd.com.ar/tags/scraping.html">scraping</a>, <a title="All pages tagged 'dr who'." href="http://clrnd.com.ar/tags/dr%20who.html">dr who</a>
            </div>
        </div>
    </section>
</article>
]]></summary>
</entry>
<entry>
    <title>Tateti Tateti</title>
    <link href="http://clrnd.com.ar/posts/2015-11-23-tateti-tateti.html" />
    <id>http://clrnd.com.ar/posts/2015-11-23-tateti-tateti.html</id>
    <published>2015-11-23T00:00:00Z</published>
    <updated>2015-11-23T00:00:00Z</updated>
    <summary type="html"><![CDATA[<article id="article">
    <header>
        <h1>Tateti Tateti</h1>
    </header>

    <section>
        <p>In my eternal quest to learn Haskell I decided to implement a game in ncurses.</p>
<p><img class="img-responsive" src="http://clrnd.com.ar/files/tateti-tateti.png" width="400"></p>
<p>The code is over at <a href="https://github.com/clrnd/tateti-tateti">GitHub</a> if anyone wants to check it out.</p>
<p>The game is “Ultimate Tic Tac Toe”, a variant on classic 3x3 Tic Tac Toe where inside each of the 9 cells there is another, smaller cell, where actual gameplay takes place. But there is a catch: the sub-board where the player plays is decided by the playing position of the last player’s move!</p>
<p>I came across this game a while ago in <a href="http://mathwithbaddrawings.com/2013/06/16/ultimate-tic-tac-toe/">this blog post</a>. The link also contains a better explanation of the rules, which <em>you should read</em> for any of this to make sense.</p>
<p>By the way, the main libraries I chose for this project are:</p>
<ul>
<li><a href="https://hackage.haskell.org/package/ncurses">UI.NCurses</a> for good old graphics</li>
<li><a href="https://hackage.haskell.org/package/lens-simple">Lens.Simple</a> for lensing</li>
<li><a href="https://hackage.haskell.org/package/array">Data.Array</a> as the main data structure for the board</li>
</ul>
<h2 id="some-types-for-great-programming">Some types for great programming</h2>
<p>This is the main type:</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb1-1"><a href="http://clrnd.com.ar#cb1-1"></a><span class="kw">type</span> <span class="dt">Game</span> a <span class="ot">=</span> <span class="dt">StateT</span> <span class="dt">GameState</span> <span class="dt">Curses</span> a</span></code></pre></div>
<p>Which means <code>Game a</code> is a Monad that carries a state of type <code>GameState</code>, another Monad inside named <code>Curses</code>, and returns some <code>a</code>.</p>
<p>Convenient fact: <code>Curses</code> is an instance of MonadIO which means we can use liftIO!</p>
<p>Then we have the game state:</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb2-1"><a href="http://clrnd.com.ar#cb2-1"></a><span class="kw">data</span> <span class="dt">GameState</span> <span class="ot">=</span> <span class="dt">GameState</span></span>
<span id="cb2-2"><a href="http://clrnd.com.ar#cb2-2"></a>    {<span class="ot"> _gPlayer ::</span> <span class="dt">Player</span></span>
<span id="cb2-3"><a href="http://clrnd.com.ar#cb2-3"></a>    ,<span class="ot"> _gBoardState ::</span> <span class="dt">BoardState</span> (<span class="dt">BoardState</span> (<span class="dt">Maybe</span> <span class="dt">Player</span>))</span>
<span id="cb2-4"><a href="http://clrnd.com.ar#cb2-4"></a>    ,<span class="ot"> _gMode ::</span> <span class="dt">Mode</span></span>
<span id="cb2-5"><a href="http://clrnd.com.ar#cb2-5"></a>    ,<span class="ot"> _gQuit ::</span> <span class="dt">Bool</span></span>
<span id="cb2-6"><a href="http://clrnd.com.ar#cb2-6"></a>    } <span class="kw">deriving</span> <span class="dt">Show</span></span></code></pre></div>
<p>This record holds most of the game mutable state, namely:</p>
<ul>
<li>who is currently playing</li>
<li>the state of the board</li>
<li>the game mode</li>
<li>if they want to quit</li>
</ul>
<p>The game mode is a simple sum type <code>data Mode = Free | Fixed</code>. <code>Free</code> means the player can choose his/her next sub-board (for example in the first turn), where <code>Fixed</code> means they can’t (for example after a valid move from the other player).</p>
<p>Now, notice that funny nested BoardState? Check out the type:</p>
<div class="sourceCode" id="cb3"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb3-1"><a href="http://clrnd.com.ar#cb3-1"></a><span class="kw">data</span> <span class="dt">BoardState</span> t <span class="ot">=</span> <span class="dt">BoardState</span></span>
<span id="cb3-2"><a href="http://clrnd.com.ar#cb3-2"></a>    {<span class="ot"> _bsCells ::</span> <span class="dt">Array</span> <span class="dt">Position</span> t</span>
<span id="cb3-3"><a href="http://clrnd.com.ar#cb3-3"></a>    ,<span class="ot"> _bsPosition ::</span> <span class="dt">Position</span></span>
<span id="cb3-4"><a href="http://clrnd.com.ar#cb3-4"></a>    ,<span class="ot"> _bsWinner ::</span> <span class="dt">Maybe</span> <span class="dt">Winner</span></span>
<span id="cb3-5"><a href="http://clrnd.com.ar#cb3-5"></a>    } <span class="kw">deriving</span> <span class="dt">Show</span></span></code></pre></div>
<p>A board is three things:</p>
<ul>
<li>a position (where the player currently is)</li>
<li>a winner, maybe</li>
<li>an array indexed by Positions populated by some thing <code>t</code></li>
</ul>
<p>Thus, the big board is just a board with an array of boards, where each one has inside an array of <code>Maybe Player</code>, because either it’s an empty cell or it has a player’s move.</p>
<p>All this arrays are indexed by the Position type:</p>
<div class="sourceCode" id="cb4"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb4-1"><a href="http://clrnd.com.ar#cb4-1"></a><span class="kw">data</span> <span class="dt">Position</span> <span class="ot">=</span> <span class="dt">Position</span> <span class="dt">Vertical</span> <span class="dt">Horizontal</span></span>
<span id="cb4-2"><a href="http://clrnd.com.ar#cb4-2"></a>              <span class="kw">deriving</span> (<span class="dt">Show</span>, <span class="dt">Eq</span>, <span class="dt">Ord</span>, <span class="dt">Ix</span>)</span>
<span id="cb4-3"><a href="http://clrnd.com.ar#cb4-3"></a></span>
<span id="cb4-4"><a href="http://clrnd.com.ar#cb4-4"></a><span class="kw">data</span> <span class="dt">Vertical</span> <span class="ot">=</span> <span class="dt">T</span> <span class="op">|</span> <span class="dt">M</span> <span class="op">|</span> <span class="dt">B</span> <span class="kw">deriving</span> (<span class="dt">Show</span>, <span class="dt">Enum</span>, <span class="dt">Eq</span>, <span class="dt">Ord</span>, <span class="dt">Ix</span>)</span>
<span id="cb4-5"><a href="http://clrnd.com.ar#cb4-5"></a></span>
<span id="cb4-6"><a href="http://clrnd.com.ar#cb4-6"></a><span class="kw">data</span> <span class="dt">Horizontal</span> <span class="ot">=</span> <span class="dt">L</span> <span class="op">|</span> <span class="dt">C</span> <span class="op">|</span> <span class="dt">R</span> <span class="kw">deriving</span> (<span class="dt">Show</span>, <span class="dt">Enum</span>, <span class="dt">Eq</span>, <span class="dt">Ord</span>, <span class="dt">Ix</span>)</span></code></pre></div>
<p>Where each letter stands for Top, Middle, Bottom (for Vertical) and Left, Center, Right (for Horizontal).</p>
<p>This means we can have a 3x3 array filled with ones as easily as:</p>
<div class="sourceCode" id="cb5"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb5-1"><a href="http://clrnd.com.ar#cb5-1"></a><span class="ot">someAray ::</span> <span class="dt">Array</span> <span class="dt">Position</span> <span class="dt">Int</span></span>
<span id="cb5-2"><a href="http://clrnd.com.ar#cb5-2"></a>someArray <span class="ot">=</span> listArray (<span class="dt">Position</span> <span class="dt">T</span> <span class="dt">L</span>, <span class="dt">Position</span> <span class="dt">B</span> <span class="dt">R</span>) (<span class="fu">repeat</span> <span class="dv">1</span>)</span></code></pre></div>
<p>which you can index</p>
<div class="sourceCode" id="cb6"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb6-1"><a href="http://clrnd.com.ar#cb6-1"></a>someArray <span class="op">!</span> (<span class="dt">Position</span> <span class="dt">T</span> <span class="dt">R</span>)</span></code></pre></div>
<p>And of course, deriving <code>Ix</code> knows how to produce all the Position pairs! Isn’t that just lovely?</p>
<p>Finally just make some lenses:</p>
<div class="sourceCode" id="cb7"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb7-1"><a href="http://clrnd.com.ar#cb7-1"></a><span class="op">$</span>(makeLenses '<span class="dt">'GameState</span>)</span>
<span id="cb7-2"><a href="http://clrnd.com.ar#cb7-2"></a><span class="op">$</span>(makeLenses '<span class="dt">'BoardState</span>)</span></code></pre></div>
<p>I also took the liberty to add a lens for arrays (my first custom lens!):</p>
<div class="sourceCode" id="cb8"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb8-1"><a href="http://clrnd.com.ar#cb8-1"></a><span class="ot">ax ::</span> <span class="dt">Ix</span> i <span class="ot">=&gt;</span> i <span class="ot">-&gt;</span> <span class="dt">Lens</span> (<span class="dt">Array</span> i a) (<span class="dt">Array</span> i a) a a</span>
<span id="cb8-2"><a href="http://clrnd.com.ar#cb8-2"></a>ax i <span class="ot">=</span> lens getter setter</span>
<span id="cb8-3"><a href="http://clrnd.com.ar#cb8-3"></a>  <span class="kw">where</span></span>
<span id="cb8-4"><a href="http://clrnd.com.ar#cb8-4"></a>    getter <span class="ot">=</span> (<span class="op">!</span> i)</span>
<span id="cb8-5"><a href="http://clrnd.com.ar#cb8-5"></a>    setter <span class="ot">=</span> (\arr v <span class="ot">-&gt;</span> arr <span class="op">//</span> [(i, v)])</span></code></pre></div>
<h2 id="imperative-programming-in-the-key-of-monad">Imperative programming in the key of Monad</h2>
<p>How does this look on action? Well, quite sexy I’d say. This is what happens when a player presses spacebar on a sub-board’s cell:</p>
<div class="sourceCode" id="cb9"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb9-1"><a href="http://clrnd.com.ar#cb9-1"></a><span class="co">-- if the sub-board's cell is occupied return Nothing,</span></span>
<span id="cb9-2"><a href="http://clrnd.com.ar#cb9-2"></a><span class="co">-- otherwise return the current sub-Position</span></span>
<span id="cb9-3"><a href="http://clrnd.com.ar#cb9-3"></a><span class="ot">actionPlayer ::</span> <span class="dt">Game</span> (<span class="dt">Maybe</span> <span class="dt">Position</span>)</span>
<span id="cb9-4"><a href="http://clrnd.com.ar#cb9-4"></a>actionPlayer <span class="ot">=</span> <span class="kw">do</span></span>
<span id="cb9-5"><a href="http://clrnd.com.ar#cb9-5"></a>    <span class="co">-- `use` applies a lens to the state, giving back it's contents</span></span>
<span id="cb9-6"><a href="http://clrnd.com.ar#cb9-6"></a>    pl <span class="ot">&lt;-</span> use gPlayer</span>
<span id="cb9-7"><a href="http://clrnd.com.ar#cb9-7"></a></span>
<span id="cb9-8"><a href="http://clrnd.com.ar#cb9-8"></a>    <span class="co">-- of course, lenses compose</span></span>
<span id="cb9-9"><a href="http://clrnd.com.ar#cb9-9"></a>    pos <span class="ot">&lt;-</span> use (gBoardState <span class="op">.</span> bsPosition)</span>
<span id="cb9-10"><a href="http://clrnd.com.ar#cb9-10"></a></span>
<span id="cb9-11"><a href="http://clrnd.com.ar#cb9-11"></a>    <span class="co">-- `zoom` runs a State computation inside a piece of our bigger state,</span></span>
<span id="cb9-12"><a href="http://clrnd.com.ar#cb9-12"></a>    <span class="co">-- in this case, inside the sub-board at `pos`</span></span>
<span id="cb9-13"><a href="http://clrnd.com.ar#cb9-13"></a></span>
<span id="cb9-14"><a href="http://clrnd.com.ar#cb9-14"></a>    <span class="co">-- `bsAx p` is just `bsCells . ax p`</span></span>
<span id="cb9-15"><a href="http://clrnd.com.ar#cb9-15"></a>    zoom (gBoardState <span class="op">.</span> bsAx pos) <span class="op">$</span> <span class="kw">do</span></span>
<span id="cb9-16"><a href="http://clrnd.com.ar#cb9-16"></a></span>
<span id="cb9-17"><a href="http://clrnd.com.ar#cb9-17"></a>        pos' <span class="ot">&lt;-</span> use bsPosition</span>
<span id="cb9-18"><a href="http://clrnd.com.ar#cb9-18"></a></span>
<span id="cb9-19"><a href="http://clrnd.com.ar#cb9-19"></a>        <span class="co">-- LambdaCase is surprisingly fun for State monads,</span></span>
<span id="cb9-20"><a href="http://clrnd.com.ar#cb9-20"></a>        <span class="co">-- you can get a field of the state and pattern match</span></span>
<span id="cb9-21"><a href="http://clrnd.com.ar#cb9-21"></a>        <span class="co">-- on it in a single line, just like in the imperative world</span></span>
<span id="cb9-22"><a href="http://clrnd.com.ar#cb9-22"></a>        <span class="co">-- (except the imperative world doesn't have pattern matching)</span></span>
<span id="cb9-23"><a href="http://clrnd.com.ar#cb9-23"></a>        use (bsAx pos') <span class="op">&gt;&gt;=</span> \<span class="kw">case</span></span>
<span id="cb9-24"><a href="http://clrnd.com.ar#cb9-24"></a></span>
<span id="cb9-25"><a href="http://clrnd.com.ar#cb9-25"></a>            <span class="co">-- sow now we are inside a cell in a sub-board and match:</span></span>
<span id="cb9-26"><a href="http://clrnd.com.ar#cb9-26"></a>            <span class="co">-- if the spot is already occupied, return Nothing</span></span>
<span id="cb9-27"><a href="http://clrnd.com.ar#cb9-27"></a>            <span class="dt">Just</span> _ <span class="ot">-&gt;</span> <span class="fu">return</span> <span class="dt">Nothing</span></span>
<span id="cb9-28"><a href="http://clrnd.com.ar#cb9-28"></a></span>
<span id="cb9-29"><a href="http://clrnd.com.ar#cb9-29"></a>            <span class="co">-- if the spot is free, assign the current player to it</span></span>
<span id="cb9-30"><a href="http://clrnd.com.ar#cb9-30"></a>            <span class="co">-- and return this position</span></span>
<span id="cb9-31"><a href="http://clrnd.com.ar#cb9-31"></a>            <span class="dt">Nothing</span> <span class="ot">-&gt;</span> <span class="kw">do</span></span>
<span id="cb9-32"><a href="http://clrnd.com.ar#cb9-32"></a>                bsAx pos' <span class="op">.=</span> <span class="dt">Just</span> pl</span>
<span id="cb9-33"><a href="http://clrnd.com.ar#cb9-33"></a>                <span class="fu">return</span> <span class="op">$</span> <span class="dt">Just</span> pos'</span></code></pre></div>
<p>Two things stand out:</p>
<p>This code looks very Python/Ruby/Javascript like. The syntax is different, but there is less syntax too. I mean, we are super used to reading stuff like <code>myObj['key'][thing].lol</code>, but that’s just syntax. On the other hand, things like <code>&gt;&gt;=</code> or <code>gBoardState . bsPosition</code> are functions. You can check their types, you can pass them around and put them in a list.</p>
<p>(well yeah, <code>&lt;-</code> is syntax too, but one that applies to every Monad ever not just dictionaries)</p>
<p>The second thing is that <code>zoom</code> is great. With it you force a <code>do</code> block to have access to only a part of the entire state, which of course makes your code simpler to reason about and generally safer!</p>
<hr />
<p>Drawing with ncurses was also pretty simple. For example, here we draw all the board’s crosses:</p>
<div class="sourceCode" id="cb10"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb10-1"><a href="http://clrnd.com.ar#cb10-1"></a><span class="ot">drawCrosses ::</span> <span class="dt">GameState</span> <span class="ot">-&gt;</span> <span class="dt">Colors</span> <span class="ot">-&gt;</span> <span class="dt">Update</span> ()</span>
<span id="cb10-2"><a href="http://clrnd.com.ar#cb10-2"></a>drawCrosses gs colors <span class="ot">=</span> <span class="kw">do</span></span>
<span id="cb10-3"><a href="http://clrnd.com.ar#cb10-3"></a>    <span class="co">-- main cross</span></span>
<span id="cb10-4"><a href="http://clrnd.com.ar#cb10-4"></a>    drawCross <span class="dv">7</span> <span class="dt">Nothing</span> (<span class="dv">0</span>, <span class="dv">0</span>)</span>
<span id="cb10-5"><a href="http://clrnd.com.ar#cb10-5"></a></span>
<span id="cb10-6"><a href="http://clrnd.com.ar#cb10-6"></a>    <span class="co">-- small crosses</span></span>
<span id="cb10-7"><a href="http://clrnd.com.ar#cb10-7"></a>    <span class="kw">let</span> offsets <span class="ot">=</span> [<span class="dv">1</span>, <span class="dv">1</span> <span class="op">+</span> <span class="dv">8</span>, <span class="dv">1</span> <span class="op">+</span> <span class="dv">8</span> <span class="op">+</span> <span class="dv">8</span>]</span>
<span id="cb10-8"><a href="http://clrnd.com.ar#cb10-8"></a>        coords <span class="ot">=</span> (,) <span class="op">&lt;$&gt;</span> offsets <span class="op">&lt;*&gt;</span> offsets</span>
<span id="cb10-9"><a href="http://clrnd.com.ar#cb10-9"></a>        poss <span class="ot">=</span> <span class="fu">range</span> (<span class="dt">Position</span> <span class="dt">T</span> <span class="dt">L</span>, <span class="dt">Position</span> <span class="dt">B</span> <span class="dt">R</span>)</span>
<span id="cb10-10"><a href="http://clrnd.com.ar#cb10-10"></a>        winner p <span class="ot">=</span> gs <span class="op">^.</span> gBoardState <span class="op">.</span> bsAx p <span class="op">.</span> bsWinner</span>
<span id="cb10-11"><a href="http://clrnd.com.ar#cb10-11"></a>        color_ids <span class="ot">=</span> <span class="fu">map</span> (winner <span class="op">&gt;=&gt;</span> <span class="fu">return</span> <span class="op">.</span> colors <span class="op">.</span> color) poss</span>
<span id="cb10-12"><a href="http://clrnd.com.ar#cb10-12"></a></span>
<span id="cb10-13"><a href="http://clrnd.com.ar#cb10-13"></a>    <span class="fu">mapM_</span> (<span class="fu">uncurry</span> <span class="op">$</span> drawCross <span class="dv">1</span>) <span class="op">$</span> <span class="fu">zip</span> color_ids coords</span></code></pre></div>
<p>Where <code>drawCross</code> takes the size of a cell, a <code>Maybe ColorID</code> and a coordinate offset, and just draws the horizontal and vertical lines.</p>
<p>Since smaller boards get colored when a player wins, we have to get their winners and colors first.</p>
<p>Also <code>(,) &lt;$&gt; offsets &lt;*&gt; offsets</code> is funny. It builds a list of pairs of all combinations of offsets. Basically \( \{ (x, y) : x \in S , y \in S \} \) with \( S = \{ 1, 1+8, 1+8+8 \} \) because each big-board cell is 7 characters wide plus one for the line.</p>
<h2 id="the-main-loop">The main loop</h2>
<p>It looks like:</p>
<div class="sourceCode" id="cb11"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb11-1"><a href="http://clrnd.com.ar#cb11-1"></a><span class="co">-- I didn't want to add the windows and colors to the state nor use a Reader,</span></span>
<span id="cb11-2"><a href="http://clrnd.com.ar#cb11-2"></a><span class="co">-- so I just used good old arguments</span></span>
<span id="cb11-3"><a href="http://clrnd.com.ar#cb11-3"></a><span class="ot">mainLoop ::</span> <span class="dt">Window</span> <span class="ot">-&gt;</span> <span class="dt">Window</span> <span class="ot">-&gt;</span> <span class="dt">Colors</span> <span class="ot">-&gt;</span> <span class="dt">Game</span> (<span class="dt">Maybe</span> <span class="dt">Winner</span>)</span>
<span id="cb11-4"><a href="http://clrnd.com.ar#cb11-4"></a>mainLoop w1 w2 colors <span class="ot">=</span> <span class="kw">do</span></span>
<span id="cb11-5"><a href="http://clrnd.com.ar#cb11-5"></a></span>
<span id="cb11-6"><a href="http://clrnd.com.ar#cb11-6"></a>    <span class="co">-- we draw everything</span></span>
<span id="cb11-7"><a href="http://clrnd.com.ar#cb11-7"></a>    drawAll w1 w2 colors</span>
<span id="cb11-8"><a href="http://clrnd.com.ar#cb11-8"></a></span>
<span id="cb11-9"><a href="http://clrnd.com.ar#cb11-9"></a>    <span class="co">-- then, depending on the input</span></span>
<span id="cb11-10"><a href="http://clrnd.com.ar#cb11-10"></a>    parseInput w1 <span class="op">&gt;&gt;=</span> \<span class="kw">case</span></span>
<span id="cb11-11"><a href="http://clrnd.com.ar#cb11-11"></a>        <span class="co">-- if a movement key, move accordingly.</span></span>
<span id="cb11-12"><a href="http://clrnd.com.ar#cb11-12"></a>        <span class="co">-- remember: movement is just an update on the Position in the state</span></span>
<span id="cb11-13"><a href="http://clrnd.com.ar#cb11-13"></a>        <span class="co">-- this when rendered moves the cursor around</span></span>
<span id="cb11-14"><a href="http://clrnd.com.ar#cb11-14"></a>        <span class="dt">Movement</span> m <span class="ot">-&gt;</span> movePlayer m</span>
<span id="cb11-15"><a href="http://clrnd.com.ar#cb11-15"></a></span>
<span id="cb11-16"><a href="http://clrnd.com.ar#cb11-16"></a>        <span class="co">-- if they pressed spacebar then</span></span>
<span id="cb11-17"><a href="http://clrnd.com.ar#cb11-17"></a>        <span class="dt">Select</span> <span class="ot">-&gt;</span> use gMode <span class="op">&gt;&gt;=</span> \<span class="kw">case</span></span>
<span id="cb11-18"><a href="http://clrnd.com.ar#cb11-18"></a></span>
<span id="cb11-19"><a href="http://clrnd.com.ar#cb11-19"></a>            <span class="co">-- free mode: just lock into the sub-board</span></span>
<span id="cb11-20"><a href="http://clrnd.com.ar#cb11-20"></a>            <span class="dt">Free</span> <span class="ot">-&gt;</span> <span class="kw">do</span></span>
<span id="cb11-21"><a href="http://clrnd.com.ar#cb11-21"></a>                p <span class="ot">&lt;-</span> use (gBoardState <span class="op">.</span> bsPosition)</span>
<span id="cb11-22"><a href="http://clrnd.com.ar#cb11-22"></a>                use (gBoardState <span class="op">.</span> bsAx p <span class="op">.</span> bsWinner) <span class="op">&gt;&gt;=</span> \<span class="kw">case</span></span>
<span id="cb11-23"><a href="http://clrnd.com.ar#cb11-23"></a>                    <span class="co">-- unless board is already closed (has a winner)</span></span>
<span id="cb11-24"><a href="http://clrnd.com.ar#cb11-24"></a>                    <span class="dt">Just</span> _ <span class="ot">-&gt;</span> <span class="fu">return</span> ()</span>
<span id="cb11-25"><a href="http://clrnd.com.ar#cb11-25"></a></span>
<span id="cb11-26"><a href="http://clrnd.com.ar#cb11-26"></a>                    <span class="co">-- board is open, enter</span></span>
<span id="cb11-27"><a href="http://clrnd.com.ar#cb11-27"></a>                    <span class="dt">Nothing</span> <span class="ot">-&gt;</span> gMode <span class="op">.=</span> <span class="dt">Fixed</span></span>
<span id="cb11-28"><a href="http://clrnd.com.ar#cb11-28"></a></span>
<span id="cb11-29"><a href="http://clrnd.com.ar#cb11-29"></a>            <span class="co">-- fixed mode: lots of things</span></span>
<span id="cb11-30"><a href="http://clrnd.com.ar#cb11-30"></a>            <span class="dt">Fixed</span> <span class="ot">-&gt;</span> actionPlayer <span class="op">&gt;&gt;=</span> \<span class="kw">case</span></span>
<span id="cb11-31"><a href="http://clrnd.com.ar#cb11-31"></a>                <span class="co">-- illegal action, do noting</span></span>
<span id="cb11-32"><a href="http://clrnd.com.ar#cb11-32"></a>                <span class="dt">Nothing</span> <span class="ot">-&gt;</span> <span class="fu">return</span> ()</span>
<span id="cb11-33"><a href="http://clrnd.com.ar#cb11-33"></a></span>
<span id="cb11-34"><a href="http://clrnd.com.ar#cb11-34"></a>                <span class="co">-- legal action, `played_p` is where they played</span></span>
<span id="cb11-35"><a href="http://clrnd.com.ar#cb11-35"></a>                <span class="dt">Just</span> played_p <span class="ot">-&gt;</span> <span class="kw">do</span></span>
<span id="cb11-36"><a href="http://clrnd.com.ar#cb11-36"></a></span>
<span id="cb11-37"><a href="http://clrnd.com.ar#cb11-37"></a>                    <span class="co">-- calculate sub-board and big-board winners</span></span>
<span id="cb11-38"><a href="http://clrnd.com.ar#cb11-38"></a>                    p <span class="ot">&lt;-</span> use (gBoardState <span class="op">.</span> bsPosition)</span>
<span id="cb11-39"><a href="http://clrnd.com.ar#cb11-39"></a>                    gBoardState <span class="op">.</span> bsAx p <span class="op">.</span> bsWinner <span class="op">&lt;~</span> innerWinner played_p</span>
<span id="cb11-40"><a href="http://clrnd.com.ar#cb11-40"></a></span>
<span id="cb11-41"><a href="http://clrnd.com.ar#cb11-41"></a>                    gBoardState <span class="op">.</span> bsWinner <span class="op">&lt;~</span> outerWinner p</span>
<span id="cb11-42"><a href="http://clrnd.com.ar#cb11-42"></a></span>
<span id="cb11-43"><a href="http://clrnd.com.ar#cb11-43"></a>                    <span class="co">-- switch players</span></span>
<span id="cb11-44"><a href="http://clrnd.com.ar#cb11-44"></a>                    gPlayer <span class="op">%=</span> \x <span class="ot">-&gt;</span> <span class="kw">if</span> x <span class="op">==</span> <span class="dt">X</span> <span class="kw">then</span> <span class="dt">O</span> <span class="kw">else</span> <span class="dt">X</span></span>
<span id="cb11-45"><a href="http://clrnd.com.ar#cb11-45"></a></span>
<span id="cb11-46"><a href="http://clrnd.com.ar#cb11-46"></a>                    <span class="co">-- move to next board</span></span>
<span id="cb11-47"><a href="http://clrnd.com.ar#cb11-47"></a>                    <span class="co">-- `%=` updates a field of the state with a function</span></span>
<span id="cb11-48"><a href="http://clrnd.com.ar#cb11-48"></a>                    gBoardState <span class="op">.</span> bsPosition <span class="op">.=</span> played_p</span>
<span id="cb11-49"><a href="http://clrnd.com.ar#cb11-49"></a></span>
<span id="cb11-50"><a href="http://clrnd.com.ar#cb11-50"></a>                    <span class="co">-- enter free mode if closed</span></span>
<span id="cb11-51"><a href="http://clrnd.com.ar#cb11-51"></a>                    use (gBoardState <span class="op">.</span> bsAx played_p <span class="op">.</span> bsWinner) <span class="op">&gt;&gt;=</span> \<span class="kw">case</span></span>
<span id="cb11-52"><a href="http://clrnd.com.ar#cb11-52"></a>                        <span class="dt">Nothing</span> <span class="ot">-&gt;</span> <span class="fu">return</span> ()</span>
<span id="cb11-53"><a href="http://clrnd.com.ar#cb11-53"></a>                        <span class="dt">Just</span> _ <span class="ot">-&gt;</span> gMode <span class="op">.=</span> <span class="dt">Free</span></span>
<span id="cb11-54"><a href="http://clrnd.com.ar#cb11-54"></a></span>
<span id="cb11-55"><a href="http://clrnd.com.ar#cb11-55"></a>        <span class="co">-- finally if quitted update the state</span></span>
<span id="cb11-56"><a href="http://clrnd.com.ar#cb11-56"></a>        <span class="dt">Quit</span> <span class="ot">-&gt;</span> gQuit <span class="op">.=</span> <span class="dt">True</span></span>
<span id="cb11-57"><a href="http://clrnd.com.ar#cb11-57"></a></span>
<span id="cb11-58"><a href="http://clrnd.com.ar#cb11-58"></a>    use gQuit <span class="op">&gt;&gt;=</span> \<span class="kw">case</span></span>
<span id="cb11-59"><a href="http://clrnd.com.ar#cb11-59"></a>        <span class="co">-- now, if they quitted return</span></span>
<span id="cb11-60"><a href="http://clrnd.com.ar#cb11-60"></a>        <span class="dt">True</span> <span class="ot">-&gt;</span> <span class="fu">return</span> <span class="dt">Nothing</span></span>
<span id="cb11-61"><a href="http://clrnd.com.ar#cb11-61"></a></span>
<span id="cb11-62"><a href="http://clrnd.com.ar#cb11-62"></a>        <span class="co">-- otherwise, check if we have a winner and return that, or just loop</span></span>
<span id="cb11-63"><a href="http://clrnd.com.ar#cb11-63"></a>        <span class="dt">False</span> <span class="ot">-&gt;</span> use (gBoardState <span class="op">.</span> bsWinner) <span class="op">&gt;&gt;=</span> \<span class="kw">case</span></span>
<span id="cb11-64"><a href="http://clrnd.com.ar#cb11-64"></a>            <span class="dt">Nothing</span> <span class="ot">-&gt;</span> mainLoop w1 w2 colors</span>
<span id="cb11-65"><a href="http://clrnd.com.ar#cb11-65"></a>            winner <span class="ot">-&gt;</span> <span class="fu">return</span> winner</span></code></pre></div>
<p>Well that’s pretty big, but if you consider that’s almost everything you need for the main loop, it’s quite interesting.</p>
<p>Also, see that last two lines? If you switch them around you introduce a bug, but don’t fear, GHC will saves us (with -Wall enabled, which you should always do) saying:</p>
<div class="sourceCode" id="cb12"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb12-1"><a href="http://clrnd.com.ar#cb12-1"></a><span class="ex">Warning</span>:</span>
<span id="cb12-2"><a href="http://clrnd.com.ar#cb12-2"></a>    <span class="ex">Pattern</span> match(es) <span class="ex">are</span> overlapped</span>
<span id="cb12-3"><a href="http://clrnd.com.ar#cb12-3"></a>        <span class="ex">In</span> a case alternative: Nothing -<span class="op">&gt;</span> ...</span></code></pre></div>
<p>I think that’s super neat.</p>
<h2 id="wrapping-up">Wrapping up</h2>
<p>This was not my first time with a monad transformer, nor with lenses, but I did learn some things. For example, I could read some lens’ errors!</p>
<p>While I can use lenses, the abstraction is quite … abstract. But this time I think I got a step closer to understanding it.</p>
<p>Testing was quite easy too. Since I could just spit the <code>GameState</code> to stderr (and pipe it to a file), I would start the game with a board full of moves! All of this for free deriving Show and Read instances.</p>
<p>I was also about to build a server/client mode for online multiplayer, but I thought: “if anyone is ever gonna play this online, they surely know how to <code>screen -x</code>”.</p>
<p>In the end, doing something actually playable is always fun :D</p>
        <div class="meta">
            <div class="meta-component">
                <i class="fa fa-calendar fa-fw"></i>
                November 23, 2015
            </div>
            <div class="meta-component">
                <i class="fa fa-tags fa-fw"></i>
                <a title="All pages tagged 'haskell'." href="http://clrnd.com.ar/tags/haskell.html">haskell</a>, <a title="All pages tagged 'programming'." href="http://clrnd.com.ar/tags/programming.html">programming</a>
            </div>
        </div>
    </section>
</article>
]]></summary>
</entry>
<entry>
    <title>A Haskell space leak</title>
    <link href="http://clrnd.com.ar/posts/2015-08-21-profiling-a-haskell-space-leak.html" />
    <id>http://clrnd.com.ar/posts/2015-08-21-profiling-a-haskell-space-leak.html</id>
    <published>2015-08-21T00:00:00Z</published>
    <updated>2015-08-21T00:00:00Z</updated>
    <summary type="html"><![CDATA[<article id="article">
    <header>
        <h1>A Haskell space leak</h1>
    </header>

    <section>
        <p>While working on <a href="https://github.com/clrnd/discogs2pg">discogs2pg</a>, a tool for importing <a href="http://www.discogs.com/data/">Discogs’ data dumps</a> into Postgre efficiently, I ran into a space leak.</p>
<p>So, in the beginning, things worked nice and in constant memory.</p>
<p>I opened the XML as a <code>Lazy.Bytestring</code>, <code>Text.XML.Expat.Tree</code> took that and gave me a lazy tree of nodes, I made a list of records with those and finally, they were copied by <code>Database.PostgreSQL.Simple.Copy</code> into de database.</p>
<p>The parsing and storing of the first XML file was done, so I move on to the next one, simplifying and refactoring as needed, all while thinking “oh my Haskell is great, so so good”.</p>
<h2 id="the-problem">The problem</h2>
<p>Suddenly, while trying the thing, I realized something was eating memory. My first suspect was firefox, but <code>htop</code> quickly verified it was the parser.</p>
<p>I’m using <a href="https://github.com/commercialhaskell/stack">stack</a>, which is great by the way, for the first time in a real project, and enabling profiling was super easy.</p>
<p>First I ran <code>stack build --executable-profiling --library-profiling</code> and it cried about <code>base</code> missing. This was because I didn’t have the profiling base library installed, something <code>apt</code> fixed right away. Then I started trying different flags, since profiling in haskell is not really well documented, even though it’s really well supported.</p>
<p>I did</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode bash"><code class="sourceCode bash"><span id="cb1-1"><a href="http://clrnd.com.ar#cb1-1"></a>$ <span class="ex">discogs2pg</span> artists.xml +RTS -hy</span>
<span id="cb1-2"><a href="http://clrnd.com.ar#cb1-2"></a>$ <span class="ex">hp2ps</span> -c discogs.hp</span>
<span id="cb1-3"><a href="http://clrnd.com.ar#cb1-3"></a>$ <span class="ex">evince</span> discogs2pg.ps</span></code></pre></div>
<p>and saw this, which may well be the epitomical example of a space leak:</p>
<p><img class="img-responsive" src="http://clrnd.com.ar/files/discogs2pg_memory_hy1.png"></p>
<p>So I <a href="http://stackoverflow.com/questions/7241470/what-is-arr-words-in-a-ghc-heap-profile">googled ARR_WORDS</a> and found it has to do with ByteStrings (I use a lot of those here because performance). The thing is, I have no idea what they have to do with the space leak because I fixed it with a little change that doesn’t involve them.</p>
<p>But first, let me introduce you to the program.</p>
<h2 id="the-program">The program</h2>
<p>The program ends in the <code>store</code> function which takes a list of things that implement Storable, escapes them (generates some <code>ByteString.Builder</code>) and makes them <code>ByteString</code> for Postgre’s COPY. The class looks like this:</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb2-1"><a href="http://clrnd.com.ar#cb2-1"></a><span class="kw">class</span> <span class="dt">Storable</span> a <span class="kw">where</span></span>
<span id="cb2-2"><a href="http://clrnd.com.ar#cb2-2"></a><span class="ot">    getName ::</span> [a] <span class="ot">-&gt;</span> <span class="dt">String</span></span>
<span id="cb2-3"><a href="http://clrnd.com.ar#cb2-3"></a><span class="ot">    getTables ::</span> [a] <span class="ot">-&gt;</span> [<span class="dt">TableInfo</span>]</span>
<span id="cb2-4"><a href="http://clrnd.com.ar#cb2-4"></a><span class="ot">    toRows ::</span> a <span class="ot">-&gt;</span> [<span class="dt">Builder</span>]</span>
<span id="cb2-5"><a href="http://clrnd.com.ar#cb2-5"></a><span class="ot">    avoid ::</span> a <span class="ot">-&gt;</span> <span class="dt">Maybe</span> <span class="dt">String</span></span>
<span id="cb2-6"><a href="http://clrnd.com.ar#cb2-6"></a></span>
<span id="cb2-7"><a href="http://clrnd.com.ar#cb2-7"></a><span class="kw">data</span> <span class="dt">TableInfo</span> <span class="ot">=</span> <span class="dt">TableInfo</span></span>
<span id="cb2-8"><a href="http://clrnd.com.ar#cb2-8"></a>  {<span class="ot"> tableName ::</span> <span class="dt">String</span></span>
<span id="cb2-9"><a href="http://clrnd.com.ar#cb2-9"></a>  ,<span class="ot"> tableColumns ::</span> [<span class="dt">String</span>] }</span></code></pre></div>
<p>Ignore the weird <code>[a] -&gt; Stuff</code>, that’s gonna change in the future. That just says “a collection of ‘a’ has this attributes”.</p>
<p>So, each Storable can become a <code>[Builder]</code> (one for each table) and a list of them has a <code>[TableInfo]</code> (same size as the <code>[Builder]</code>), which is just a <code>String</code> (the table name) and a <code>[String]</code> (the table columns). This is used in <code>store</code> like this:</p>
<div class="sourceCode" id="cb3"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb3-1"><a href="http://clrnd.com.ar#cb3-1"></a><span class="ot">store ::</span> (<span class="dt">Show</span> a, <span class="dt">Storable</span> a) <span class="ot">=&gt;</span> <span class="dt">ConnectionInfo</span> <span class="ot">-&gt;</span> [a] <span class="ot">-&gt;</span> <span class="dt">IO</span> ()</span>
<span id="cb3-2"><a href="http://clrnd.com.ar#cb3-2"></a>store conf values <span class="ot">=</span> <span class="kw">do</span></span>
<span id="cb3-3"><a href="http://clrnd.com.ar#cb3-3"></a>    <span class="co">-- open a connection per table, TRUNCATE the table</span></span>
<span id="cb3-4"><a href="http://clrnd.com.ar#cb3-4"></a>    <span class="co">-- and start the COPY ... FROM STDIN</span></span>
<span id="cb3-5"><a href="http://clrnd.com.ar#cb3-5"></a>    conns <span class="ot">&lt;-</span> forM (getTables values) <span class="op">$</span> \table <span class="ot">-&gt;</span> <span class="kw">do</span></span>
<span id="cb3-6"><a href="http://clrnd.com.ar#cb3-6"></a>        conn <span class="ot">&lt;-</span> connectPostgreSQL conf</span>
<span id="cb3-7"><a href="http://clrnd.com.ar#cb3-7"></a>        begin conn</span>
<span id="cb3-8"><a href="http://clrnd.com.ar#cb3-8"></a>        _ <span class="ot">&lt;-</span> execute_ conn <span class="op">$</span> fromString (<span class="st">&quot;TRUNCATE &quot;</span> <span class="op">&lt;&gt;</span> tableName table)</span>
<span id="cb3-9"><a href="http://clrnd.com.ar#cb3-9"></a>        copy_ conn <span class="op">$</span> toQuery table</span>
<span id="cb3-10"><a href="http://clrnd.com.ar#cb3-10"></a>        <span class="fu">return</span> conn</span>
<span id="cb3-11"><a href="http://clrnd.com.ar#cb3-11"></a></span>
<span id="cb3-12"><a href="http://clrnd.com.ar#cb3-12"></a>    <span class="co">-- then for each value</span></span>
<span id="cb3-13"><a href="http://clrnd.com.ar#cb3-13"></a>    forM_ values <span class="op">$</span> \val <span class="ot">-&gt;</span></span>
<span id="cb3-14"><a href="http://clrnd.com.ar#cb3-14"></a>        <span class="co">-- we get the [Builder]</span></span>
<span id="cb3-15"><a href="http://clrnd.com.ar#cb3-15"></a>        <span class="kw">let</span> rows <span class="ot">=</span> toRows val</span>
<span id="cb3-16"><a href="http://clrnd.com.ar#cb3-16"></a>        <span class="co">-- zip them with the connections list</span></span>
<span id="cb3-17"><a href="http://clrnd.com.ar#cb3-17"></a>        forM_ (<span class="fu">zip</span> conns rows) <span class="op">$</span> \(c, r) <span class="ot">-&gt;</span></span>
<span id="cb3-18"><a href="http://clrnd.com.ar#cb3-18"></a>            <span class="co">-- make them ByteString and send it to Postgre</span></span>
<span id="cb3-19"><a href="http://clrnd.com.ar#cb3-19"></a>            <span class="fu">mapM_</span> (putCopyData c) (toChunks <span class="op">$</span> toLazyByteString r)</span>
<span id="cb3-20"><a href="http://clrnd.com.ar#cb3-20"></a></span>
<span id="cb3-21"><a href="http://clrnd.com.ar#cb3-21"></a>    <span class="co">-- finally, putCopyEnd for each connection, printing the table name</span></span>
<span id="cb3-22"><a href="http://clrnd.com.ar#cb3-22"></a>    <span class="co">-- in the process and the count of copied elements</span></span>
<span id="cb3-23"><a href="http://clrnd.com.ar#cb3-23"></a>    forM_ (<span class="fu">zip</span> (getTables values) <span class="op">$</span> conns) <span class="op">$</span> \(table, conn) <span class="ot">-&gt;</span> <span class="kw">do</span></span>
<span id="cb3-24"><a href="http://clrnd.com.ar#cb3-24"></a>        n <span class="ot">&lt;-</span> putCopyEnd conn</span>
<span id="cb3-25"><a href="http://clrnd.com.ar#cb3-25"></a>        commit conn</span>
<span id="cb3-26"><a href="http://clrnd.com.ar#cb3-26"></a>        <span class="fu">putStrLn</span> <span class="op">$</span> tableName table <span class="op">&lt;&gt;</span> <span class="st">&quot; = &quot;</span> <span class="op">&lt;&gt;</span> <span class="fu">show</span> n</span></code></pre></div>
<p>Pretty imperative looking, but it works like a charm. Except for the space leak.</p>
<p>Now, the first thing I tried was refactoring the inner loop, avoiding currying and composition but that didn’t work.</p>
<p>I googled a while but nothing.</p>
<p>I was getting ready for making all my records strict, which I knew was not the problem since it worked perfectly a day ago, and then fortunately while looking around, I got rid of the duplicate <code>(getTables values)</code> which was just bothering me … and holy shit that was it!</p>
<h2 id="the-fix">The fix</h2>
<p>The fix is so simple and misterious it’s not even funny:</p>
<div class="sourceCode" id="cb4"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb4-1"><a href="http://clrnd.com.ar#cb4-1"></a><span class="ot">store ::</span> (<span class="dt">Show</span> a, <span class="dt">Storable</span> a) <span class="ot">=&gt;</span> <span class="dt">ConnectionInfo</span> <span class="ot">-&gt;</span> [a] <span class="ot">-&gt;</span> <span class="dt">IO</span> ()</span>
<span id="cb4-2"><a href="http://clrnd.com.ar#cb4-2"></a>store conf values <span class="ot">=</span> <span class="kw">do</span></span>
<span id="cb4-3"><a href="http://clrnd.com.ar#cb4-3"></a>    <span class="kw">let</span> tables <span class="ot">=</span> getTables values <span class="co">-- here</span></span>
<span id="cb4-4"><a href="http://clrnd.com.ar#cb4-4"></a></span>
<span id="cb4-5"><a href="http://clrnd.com.ar#cb4-5"></a>    conns <span class="ot">&lt;-</span> forM tables <span class="op">$</span> \table <span class="ot">-&gt;</span> <span class="kw">do</span></span>
<span id="cb4-6"><a href="http://clrnd.com.ar#cb4-6"></a>        <span class="op">...</span></span>
<span id="cb4-7"><a href="http://clrnd.com.ar#cb4-7"></a></span>
<span id="cb4-8"><a href="http://clrnd.com.ar#cb4-8"></a>    <span class="op">...</span></span>
<span id="cb4-9"><a href="http://clrnd.com.ar#cb4-9"></a></span>
<span id="cb4-10"><a href="http://clrnd.com.ar#cb4-10"></a>    forM_ (<span class="fu">zip</span> tables conns) <span class="op">$</span> \(table, conn) <span class="ot">-&gt;</span> <span class="kw">do</span></span>
<span id="cb4-11"><a href="http://clrnd.com.ar#cb4-11"></a>        <span class="op">...</span></span></code></pre></div>
<p>Which generates this pretty graph:</p>
<p><img class="img-responsive" src="http://clrnd.com.ar/files/discogs2pg_memory_hy2.png"></p>
<p>Somehow a list of <code>String</code> was causing a 60MB space leak of ARR_WORDS.</p>
<p>Damn.</p>
<p>I love Haskell.</p>
<h2 id="update-the-explanation">UPDATE: The explanation</h2>
<p>Over at reddit <a href="https://www.reddit.com/user/pycube">pycube</a> offers what seems to be a very reasonable explanation (<a href="https://www.reddit.com/r/haskell/comments/3hvrm9/a_haskell_space_leak/cubp2on">link</a>).</p>
<p>Basically, even though <code>getTables</code> doesn’t depend on <code>values</code>, GHC doesn’t really know this, all it can see is <code>getTables values</code>.</p>
<p>So in the leaky version, it doesn’t GC the things inside <code>values</code> because it thinks it’s gonna need them later for the last <code>getTables</code>! Meanwhile in the fixed version, nothing prevents those things from being GCed.</p>
<p>That’s also why the profile says the leak is from ARR_WORDS, because what was leaking was <code>values</code>.</p>
<p>Thanks to pycube and the folks over at reddit for helping with this!</p>
        <div class="meta">
            <div class="meta-component">
                <i class="fa fa-calendar fa-fw"></i>
                August 21, 2015
            </div>
            <div class="meta-component">
                <i class="fa fa-tags fa-fw"></i>
                <a title="All pages tagged 'haskell'." href="http://clrnd.com.ar/tags/haskell.html">haskell</a>, <a title="All pages tagged 'profiling'." href="http://clrnd.com.ar/tags/profiling.html">profiling</a>
            </div>
        </div>
    </section>
</article>
]]></summary>
</entry>
<entry>
    <title>Primera Division Voronoi</title>
    <link href="http://clrnd.com.ar/posts/2015-05-07-primera-division-voronoi.html" />
    <id>http://clrnd.com.ar/posts/2015-05-07-primera-division-voronoi.html</id>
    <published>2015-05-07T00:00:00Z</published>
    <updated>2015-05-07T00:00:00Z</updated>
    <summary type="html"><![CDATA[<article id="article">
    <header>
        <h1>Primera Division Voronoi</h1>
    </header>

    <section>
        <p>Se me dio por hacer un mapa de los estadios de los equipos de Primera División del fútbol argentino a la fecha. Osea, tomando cada estadio como un punto en el plano, trazar el diagrama voronoi que se forma.</p>
<p>Además de ser completamente irrelevante, es un lindo ejercicio para practicar D3.</p>
<h2 id="las-shapes">Las shapes</h2>
<p>Primero necesitamos dibujar la Argentina, para lo que necesitamos los shapefiles. Mi fuente favorita es <a href="http://www.naturalearthdata.com/">Natural Earth</a>, específicamente la versión <em>Admin 0 países</em> (para no entrar en discusiones de soberanía).</p>
<p>Para procesar shapefiles mi herramienta es <a href="http://www.gdal.org/ogr2ogr.html">ogr2ogr</a>, parte del conjunto de herramientas de <a href="http://www.gdal.org/gdal_utilities.html">gdal-bin</a>. No es fácil o simple de usar, pero es muy poderosa y sigue de cerca la especificación.</p>
<p>Mi workflow con shapefiles es muy simple:</p>
<ol type="1">
<li>Veo que trae el mismo por arriba con <code>ogrinfo -geom=no ne_10m_admin_0_countries.shp ne_10m_admin_0_countries</code> (-geom=no es crucial para poder ver algo además de muchas coordenadas).</li>
<li>Pasándolo por alguna herramienta de CLI, identifico las features que busco, en este caso <code>grep -i arg</code>.</li>
<li>Uso <code>ogr2ogr</code> para pasarlo a GeoJSON, específicamente <code>ogr2ogr -f GeoJSON argentina.json ne_10m_admin_0_countries.shp ne_10m_admin_0_countries -where 'SOV_A3 = "ARG"'</code>.</li>
</ol>
<h2 id="el-javascript">El javascript</h2>
<p>El código se puede ver en <a href="https://github.com/clrnd/clrnds-blog/blob/master/js/provincias-voronoi.js">el repo de este blog</a></p>
<p>Mike Bostock tiene un formato llamado <a href="https://github.com/mbostock/topojson">TopoJSON</a> que es lo que vamos a usar (porque es mas liviano mas que nada, no trae mas ventajas para esta visualización).</p>
<p>Primero que nada tenemos que elegir una proyección:</p>
<div class="sourceCode" id="cb1"><pre class="sourceCode javascript"><code class="sourceCode javascript"><span id="cb1-1"><a href="http://clrnd.com.ar#cb1-1"></a><span class="kw">var</span> proj <span class="op">=</span> d3<span class="op">.</span><span class="at">geo</span><span class="op">.</span><span class="fu">albers</span>()</span>
<span id="cb1-2"><a href="http://clrnd.com.ar#cb1-2"></a>    <span class="op">.</span><span class="fu">center</span>([<span class="dv">0</span><span class="op">,</span> <span class="dv">-36</span>])</span>
<span id="cb1-3"><a href="http://clrnd.com.ar#cb1-3"></a>    <span class="op">.</span><span class="fu">rotate</span>([<span class="dv">65</span><span class="op">,</span> <span class="dv">0</span><span class="op">,</span> <span class="dv">0</span>])</span>
<span id="cb1-4"><a href="http://clrnd.com.ar#cb1-4"></a>    <span class="op">.</span><span class="fu">parallels</span>([<span class="op">-</span><span class="dv">20</span><span class="op">,</span> <span class="dv">-56</span>])</span>
<span id="cb1-5"><a href="http://clrnd.com.ar#cb1-5"></a>    <span class="op">.</span><span class="fu">scale</span>(<span class="dv">1700</span>)</span>
<span id="cb1-6"><a href="http://clrnd.com.ar#cb1-6"></a>    <span class="op">.</span><span class="fu">translate</span>([width <span class="op">/</span> <span class="dv">2</span><span class="op">,</span> height_full <span class="op">/</span> <span class="dv">2</span>])<span class="op">;</span></span></code></pre></div>
<p>Albers es muy linda y clásica, por lo que no hay mucha vuelta que darle, aunque tardé un rato en encontrar una combinación que me diera el país derecho. Se ve que lo mejor es darle un <code>center</code> vertical y buscar la feature con <code>rotate</code> que hacer todo en uno.</p>
<p>Luego tenemos que agarrar la frontera de la Argentina y transformarla en un <code>path</code> de SVG y en un array de puntos. El primero para dibujarlo, y el segundo para recortar la geometría voronoi.</p>
<div class="sourceCode" id="cb2"><pre class="sourceCode javascript"><code class="sourceCode javascript"><span id="cb2-1"><a href="http://clrnd.com.ar#cb2-1"></a><span class="kw">var</span> border <span class="op">=</span> topojson</span>
<span id="cb2-2"><a href="http://clrnd.com.ar#cb2-2"></a>    <span class="op">.</span><span class="fu">feature</span>(arg<span class="op">,</span> arg<span class="op">.</span><span class="at">objects</span><span class="op">.</span><span class="at">argentina</span>)<span class="op">;</span></span>
<span id="cb2-3"><a href="http://clrnd.com.ar#cb2-3"></a></span>
<span id="cb2-4"><a href="http://clrnd.com.ar#cb2-4"></a><span class="kw">var</span> path <span class="op">=</span> d3<span class="op">.</span><span class="at">geo</span><span class="op">.</span><span class="fu">path</span>()</span>
<span id="cb2-5"><a href="http://clrnd.com.ar#cb2-5"></a>    <span class="op">.</span><span class="fu">pointRadius</span>(<span class="dv">2</span>)</span>
<span id="cb2-6"><a href="http://clrnd.com.ar#cb2-6"></a>    <span class="op">.</span><span class="fu">projection</span>(proj)<span class="op">;</span></span>
<span id="cb2-7"><a href="http://clrnd.com.ar#cb2-7"></a></span>
<span id="cb2-8"><a href="http://clrnd.com.ar#cb2-8"></a>svg<span class="op">.</span><span class="fu">append</span>(<span class="st">'path'</span>)</span>
<span id="cb2-9"><a href="http://clrnd.com.ar#cb2-9"></a>    <span class="op">.</span><span class="fu">datum</span>(border)</span>
<span id="cb2-10"><a href="http://clrnd.com.ar#cb2-10"></a>    <span class="op">.</span><span class="fu">style</span>({</span>
<span id="cb2-11"><a href="http://clrnd.com.ar#cb2-11"></a>        <span class="st">'stroke'</span><span class="op">:</span> <span class="st">'black'</span><span class="op">,</span></span>
<span id="cb2-12"><a href="http://clrnd.com.ar#cb2-12"></a>        <span class="st">'fill'</span><span class="op">:</span> <span class="st">'#eee'</span></span>
<span id="cb2-13"><a href="http://clrnd.com.ar#cb2-13"></a>    })</span>
<span id="cb2-14"><a href="http://clrnd.com.ar#cb2-14"></a>    <span class="op">.</span><span class="fu">attr</span>(<span class="st">'class'</span><span class="op">,</span> <span class="st">'argentina'</span>)</span>
<span id="cb2-15"><a href="http://clrnd.com.ar#cb2-15"></a>    <span class="op">.</span><span class="fu">attr</span>(<span class="st">'d'</span><span class="op">,</span> path)<span class="op">;</span></span>
<span id="cb2-16"><a href="http://clrnd.com.ar#cb2-16"></a></span>
<span id="cb2-17"><a href="http://clrnd.com.ar#cb2-17"></a><span class="kw">var</span> voronoi <span class="op">=</span> d3<span class="op">.</span><span class="at">geom</span><span class="op">.</span><span class="fu">voronoi</span>()<span class="op">;</span></span>
<span id="cb2-18"><a href="http://clrnd.com.ar#cb2-18"></a></span>
<span id="cb2-19"><a href="http://clrnd.com.ar#cb2-19"></a><span class="kw">var</span> points <span class="op">=</span> equipos<span class="op">.</span><span class="at">features</span><span class="op">.</span><span class="fu">map</span>(<span class="kw">function</span>(d){</span>
<span id="cb2-20"><a href="http://clrnd.com.ar#cb2-20"></a>    <span class="cf">return</span> proj(d<span class="op">.</span><span class="at">geometry</span><span class="op">.</span><span class="at">coordinates</span>)<span class="op">;</span></span>
<span id="cb2-21"><a href="http://clrnd.com.ar#cb2-21"></a>})<span class="op">;</span></span>
<span id="cb2-22"><a href="http://clrnd.com.ar#cb2-22"></a></span>
<span id="cb2-23"><a href="http://clrnd.com.ar#cb2-23"></a><span class="kw">var</span> exterior <span class="op">=</span> projectLineString(border<span class="op">,</span> proj)<span class="op">;</span></span>
<span id="cb2-24"><a href="http://clrnd.com.ar#cb2-24"></a></span>
<span id="cb2-25"><a href="http://clrnd.com.ar#cb2-25"></a><span class="kw">var</span> voronois <span class="op">=</span> voronoi(points)<span class="op">.</span><span class="fu">map</span>(<span class="kw">function</span>(d){</span>
<span id="cb2-26"><a href="http://clrnd.com.ar#cb2-26"></a>    <span class="cf">return</span> d3<span class="op">.</span><span class="at">geom</span><span class="op">.</span><span class="fu">polygon</span>(d)<span class="op">.</span><span class="fu">clip</span>(exterior<span class="op">.</span><span class="fu">slice</span>())<span class="op">;</span></span>
<span id="cb2-27"><a href="http://clrnd.com.ar#cb2-27"></a>})<span class="op">;</span></span></code></pre></div>
<p>El resto son detalle estilísticos.</p>
<p>Además, en el código final, puse todo en una función parametrizada por la proyección, para poder dibujar el segunda mapa con “zoom”.</p>
<h2 id="el-mapa">El mapa</h2>
<div id="container-full">

</div>
<p>y con detalle en Buenos Aires:</p>
<div id="container-small">

</div>
<p>Me gustaría dibujar los partidos y provincias en otro contraste pero no pude hacer que quede lindo.</p>
<p>D3 es una de mis librerías favoritas, la uso para hacer tanto para SVG como Canvas y HTML. Es muy versátil y super eficiente, aunque a la documentación a veces le falta (pero bueno, expone mil funciones).</p>
<p>Además, al feeling funcional no hay con que darle.</p>
<script src="http://clrnd.com.ar/js/async.js"></script>
<script src="http://clrnd.com.ar/js/topojson.min.js"></script>
<script src="http://clrnd.com.ar/js/provincias-voronoi.js"></script>
<style>
path {
    stroke-linejoin: round;
    pointer-events: all;
    fill: none;
}
.active path {
    fill: rgba(36, 132, 193, 0.22);
}
.label {
    font-family: verdana;
    font-size: 16px;
    fill: black;
    cursor: default;
}
.label-small {
    font-size: 11px;
    fill: #222;
}
path.dimmed {
    opacity: 0.1;
}
</style>
        <div class="meta">
            <div class="meta-component">
                <i class="fa fa-calendar fa-fw"></i>
                May  7, 2015
            </div>
            <div class="meta-component">
                <i class="fa fa-tags fa-fw"></i>
                <a title="All pages tagged 'viz'." href="http://clrnd.com.ar/tags/viz.html">viz</a>, <a title="All pages tagged 'fútbol'." href="http://clrnd.com.ar/tags/f%C3%BAtbol.html">fútbol</a>, <a title="All pages tagged 'd3'." href="http://clrnd.com.ar/tags/d3.html">d3</a>
            </div>
        </div>
    </section>
</article>
]]></summary>
</entry>

</feed>
