<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>DMTS</title>
<link>https://dmts.es/</link>
<atom:link href="https://dmts.es/index.xml" rel="self" type="application/rss+xml"/>
<description>Blog DMTS</description>
<generator>quarto-1.8.24</generator>
<lastBuildDate>Thu, 28 Aug 2025 22:00:00 GMT</lastBuildDate>
<item>
  <title>Gestión de dotfiles con Stow</title>
  <dc:creator>David Mateos</dc:creator>
  <link>https://dmts.es/posts/gestion-dotfiles-stow/</link>
  <description><![CDATA[ 





<p>Los dotfiles están repartidos en distintas carpetas del sistema. Para poder tener un repo con el que hacerles seguimiento y mantenerlo actualizado hace falta usar symlinks, para vincularlos todos a una misma carpeta. Una opción para gestionar estos symlinks es Stow (en los repos), que es <a href="https://www.gnu.org/software/stow/">“a symlink farm manager which takes distinct packages of software and/or data located in separate directories on the filesystem, and makes them appear to be installed in the same place”</a>.</p>
<p>Stow maneja los siguientes conceptos:</p>
<ul>
<li><p>Package. Una colección de archivos y/o directorios que te gustaría manejar como una unidad pero que se tienen que instalar en directorios específicos del sistema.</p></li>
<li><p>Target Directory — Donde los dotfiles deberian aparentar estar instalados (en <code>home</code>, <code>.config</code>, etc).</p></li>
<li><p>Stow Directory — Donde los “packages” (en este caso los diferentes dotfiles) serán instalados. Este será el directorio <code>~/.dotfiles</code> (por ejemplo).</p></li>
<li><p>Package Directory — Un directorio que contiene los archivos de instalación (o en este caso los ficheros de configuración) de un sólo programa, por ejemplo el directorio zsh que contiene el archivo .zshrc. Estos “package directories” estarán dentro del “stow directory”.</p></li>
</ul>
<p>Los symlinks son entradas del sistema de archivos cuya ruta se llama <code>symlink source</code> que apunta a otra localización del sistema de archivos llamada <code>symlink destination</code>, la cual no tiene por que existir. Si se cambia cualquiera de ellos, ambos cambian.</p>
<p>El proceso sería el siguiente:</p>
<ul>
<li><p>Se crea el directorio donde estarán los dotfiles (stow directory), por ejemplo <code>~/.dotfiles</code>. El target directory es por defecto el directorio superior al stow directorio, por lo tanto <code>$HOME</code></p></li>
<li><p>Se mueven los dotfiles desde sus directorios de orgen a éste. Se pueden clasificar en distintos directorios (package directories). Si el directorio de origen no es el raiz, si no que está anidadao, hay que crear la misma estructura de directorios dentro del stow directory (o del package directory correspondiente). Por ejemplo, si el dotfile está en <code>~/.config/rstudio/rstudio.conf</code>, en el stow directory podríamos tener <code>~/.dotfiles/rstudio/.config/rstudio/rstudio.conf</code>.</p></li>
<li><p>Desde <code>.dotfiles</code> se lanza <code>stow .</code> (si están sueltos) o <code>stow nombre_package_directory</code> para cada paquete.</p></li>
</ul>
<section id="más-cosas" class="level2">
<h2 class="anchored" data-anchor-id="más-cosas">Más cosas</h2>
<ul>
<li><p>Ignorar archivos. Stow ignora por defecto (no se le hacen symliks) la carpeta <code>.git</code> entre otros archivos y directorios: <a href="https://www.gnu.org/software/stow/manual/html_node/Types-And-Syntax-Of-Ignore-Lists.html">Default ignore list</a>. Podemos cambiar los archivos que se ignorarán creando un fichero <code>.stow-local-ignore</code>en cada package directory o en el home. En este caso, nuestro archivo sustituye a los valores por defecto, por lo que si también se quiere ignorar el directorio <code>.git</code> (por ejemplo), habrá que añadirlo.</p></li>
<li><p>No es imprescindible que el target directory sea el directorio padre del stow directory. Se puede especificar otro con la opción <code>--target=dir</code>.</p></li>
</ul>
</section>
<section id="fuentes" class="level2">
<h2 class="anchored" data-anchor-id="fuentes">Fuentes</h2>
<ul>
<li><p><a href="https://medium.com/@jacksmithxyz/git-symlinks-and-gnu-stow-how-to-manage-your-dotfiles-103c42cea485">Git, Symlinks, and GNU Stow: How To Manage Your Dotfiles</a>. Jack Smith.</p></li>
<li><p><a href="https://www.gnu.org/software/stow/">GNU Stow</a>.</p></li>
</ul>


</section>

 ]]></description>
  <category>git</category>
  <category>dotfiles</category>
  <guid>https://dmts.es/posts/gestion-dotfiles-stow/</guid>
  <pubDate>Thu, 28 Aug 2025 22:00:00 GMT</pubDate>
</item>
<item>
  <title>Unir varios archivos espaciales en un solo objeto sf</title>
  <dc:creator>David Mateos</dc:creator>
  <link>https://dmts.es/posts/uniendo_archivos_geo_sf/</link>
  <description><![CDATA[ 





<p>Las funciones del paquete purrr <code>map_dfr()</code> y <code>map_dfc()</code> permitian devolver un data frame a partir de la salida de un comando <code>purrr::map</code>, uniendo los elementos de la lista resultante por filas o por columnas. A partir de purrr 1.0.0 estas funcionalidades se eliminaron, por la posible confusión que podían producir sus nombres, al dar a entender que funcionarían de forma similar a como lo hacen las funciones <code>map_lgl()</code>, <code>map_int()</code>, etc. En lugar de eso, los autores de <code>purrr</code> proponian usar <code>list_rbind()</code> y <code>list_cbind()</code> sobre la lista resultado de los comandos map, que a su vez utilizan por debajo <code>vctrs::vec_rbind()</code> y <code>vctrs::vec_cbind()</code>. De esta forma:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1">tabla_unida <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">list.files</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ruta_archivos_excel"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">pattern =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"xlsx"</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb1-2">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">map</span>(read_xlsx) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span></span>
<span id="cb1-3">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">list_rbind</span>()</span></code></pre></div></div>
<p>El problema con estas opciones es que no funcionan con objetos espaciales de clase <code>sf</code>. De hecho es más problemático, porque no es que el proceso falle, si no que el resultado es un data.frame normal (no un objeto sf) que pierde su columna geométrica.</p>
<p>Así que para leer un conjunto de archivos vectoriales y cargarlos todos en el mismo objeto sf, usamos <code>dplyr::bind_rows</code>:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb2-1">objeto_sf <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">list.files</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"ruta_archivos_espaciales/"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">pattern =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gpkg"</span>) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span> </span>
<span id="cb2-2">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">map</span>(st_read) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span> </span>
<span id="cb2-3">    <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">do.call</span>(bind_rows, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">args =</span> _)</span></code></pre></div></div>
<p>Para leer los archivos cada uno en un objeto diferente, podríamos usar <code>assign</code>:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb3-1">lista_sfs <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">list.files</span>(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"files/geo"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">pattern =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"gpkg"</span>, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">full.names =</span> T) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span> </span>
<span id="cb3-2">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">set_names</span>(basename) <span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">|&gt;</span> </span>
<span id="cb3-3">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">map</span>(st_read) </span>
<span id="cb3-4"></span>
<span id="cb3-5"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">for</span> (i <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">in</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">seq_along</span>(lista_sfs )) {</span>
<span id="cb3-6">  <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">assign</span>(<span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">names</span>(lista_sfs [i]), lista_sfs [[i]])</span>
<span id="cb3-7">}</span></code></pre></div></div>



 ]]></description>
  <category>R</category>
  <category>geo</category>
  <category>sf</category>
  <guid>https://dmts.es/posts/uniendo_archivos_geo_sf/</guid>
  <pubDate>Tue, 14 Jan 2025 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Usando Regresión Bayesiana por defecto para predicciones</title>
  <dc:creator>David Mateos</dc:creator>
  <link>https://dmts.es/posts/regresion-bayesiana-default/</link>
  <description><![CDATA[ 





<p>En “Regression and other stories”<sup>1</sup>, Gelman y compañía comentan que una de las ventajas del planteamiento bayesiano es que todas las inferencias son probabilísticas y por tanto se pueden representar como simulaciones aleatorias. Por eso, cuando quieren resumir la incertidumbre de una estimación más allá de los simples intervalos de confianza y cuando quieren usar modelos de regresión para predicciones, se van al método bayesiano.</p>
<p>Así que recomiendan usar en general la inferencia bayesiana para las regresiones: si hay información previa disponible, se usa; y si no, una regresión bayesiana como prioris poco informativos aun tiene la ventaja de proporcionar estimaciones estables y producir simulaciones que nos permiten expresar incertidumbre inferencial y predictiva (o sea, estimadores con incertidumbres y predicciones probabilísticas).</p>
<p>Así, en general, en vez de:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1">fit <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">lm</span>(y<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span>x, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">data=</span>mis_datos)</span></code></pre></div></div>
<p>usar:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb2-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(rstanarm)</span>
<span id="cb2-2">fit <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">stan_glm</span>(y<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span>x, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">data=</span>mis_datos)</span></code></pre></div></div>
<p>Advierten que <code>stan_glm</code> puede ser lento con problemas grandes (no está claro cuánto es “grande”), en cuyo caso habría que usar la forma optimizada:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb3" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb3-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">library</span>(rstanarm)</span>
<span id="cb3-2">fit <span class="ot" style="color: #003B4F;
background-color: null;
font-style: inherit;">&lt;-</span> <span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">stan_glm</span>(y<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">~</span>x, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">data=</span>mis_datos, <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">algorith =</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"optimizing"</span>)</span></code></pre></div></div>




<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Notas</h2>

<ol>
<li id="fn1"><p>Gelman, A., Hill, J., &amp; Vehtari, A. (2021). Regression and other stories. Cambridge University Press.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>ciencia de datos</category>
  <category>R</category>
  <guid>https://dmts.es/posts/regresion-bayesiana-default/</guid>
  <pubDate>Wed, 11 Sep 2024 22:00:00 GMT</pubDate>
  <media:content url="https://dmts.es/posts/regresion-bayesiana-default/thumbnail.jpg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>El Teorema de Gauss-Markov</title>
  <dc:creator>David Mateos</dc:creator>
  <link>https://dmts.es/posts/teorema-gauss-markov/</link>
  <description><![CDATA[ 





<p>El Teorema implica que el estimador de mínimos cuadrados tiene el menor error mínimo cuadrático de entre todos los estimadores lineales insesgados. Lo que, por otro lado, tiene sentido, dado que se llama “de mínimos cuadrados” ;-)<br>
No obstante, Hastie y compañía nos recuerdan en ESL<sup>1</sup> que puede exisitir un estimador sesgado con un error mínimo cuadrático menor. Tal estimador podría sacrificar un poco de sesgo por una reducción mayor en la varianza, por lo que para la elección del modelo más apropiado habrá que encontrar el balance adecuado entre sesgo y varianza.</p>




<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Notas</h2>

<ol>
<li id="fn1"><p><a href="https://hastie.su.domains/ElemStatLearn/">The Elements of Statistical Learning</a>, Hastie, Tibshirani and Friedman (2009). Springer-Verlag.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>ciencia de datos</category>
  <guid>https://dmts.es/posts/teorema-gauss-markov/</guid>
  <pubDate>Sat, 25 May 2024 22:00:00 GMT</pubDate>
  <media:content url="https://dmts.es/posts/teorema-gauss-markov/thumbnail.png" medium="image" type="image/png" height="95" width="144"/>
</item>
<item>
  <title>How to solve it</title>
  <dc:creator>David Mateos</dc:creator>
  <link>https://dmts.es/posts/tips-de-r/230927-how-solve/</link>
  <description><![CDATA[ 





<p>Este verano me he empezado a leer el libro que en inglés se titula “How to solve it”, del matemático húngaro George Pólya. Al final me he liado con otras cosas y se ha quedado en la pila de pendientes, pero ya en las primeras páginas incluye este esquemita con los pasos para resolver un problema (matemático o no), que me parece una maravilla. Se ha ganado un sitio en mi corchera (grinningfacewithbigeyes) . En concreto, me parece que son los pasos perfectos para cuando nos encontramos un problema programando (cambiando algunas palabras)</p>
<p>files/how_solve.pdf</p>



 ]]></description>
  <category>R</category>
  <category>R Tips</category>
  <guid>https://dmts.es/posts/tips-de-r/230927-how-solve/</guid>
  <pubDate>Tue, 26 Sep 2023 22:00:00 GMT</pubDate>
</item>
<item>
  <title>Testing I</title>
  <dc:creator>David Mateos</dc:creator>
  <link>https://dmts.es/posts/testing_I/</link>
  <description><![CDATA[ 





<blockquote class="blockquote">
<p>Nadie quiere hablar sobre <em>testing</em>. <em>Testing</em> es el patito feo del desarrollo de software. El problema es que todos/as sabemos que el testeo es importante y que no lo hacemos lo suficiente. Y sentimos que nuestros proyectos no van tan bien como deberían y que probablemente más testeo haría que fueran mejor. Pero entonces leemos un libro sobre <em>testing</em> e instantaneamente nos venimos abajo con los múltiples tipos de testeos y las múltiples formas de hacerlos. No hay forma de que añadamos todo eso y aún nos de tiempo a programar.</p>
</blockquote>
<p><strong>Extreme Programming explained</strong> - Kent Beck</p>



 ]]></description>
  <category>programación</category>
  <category>test</category>
  <category>XP</category>
  <guid>https://dmts.es/posts/testing_I/</guid>
  <pubDate>Mon, 04 Oct 2021 22:00:00 GMT</pubDate>
</item>
<item>
  <title>Importar funciones de otro paquete en R</title>
  <dc:creator>David Mateos</dc:creator>
  <link>https://dmts.es/posts/importacion-paquetes-metodos-R/</link>
  <description><![CDATA[ 





<p>Para <strong>usar una función de otro paquete</strong> en un paquete que estamos creando , necestiamos añadirlo a la sección <strong>Imports</strong> del <code>DESCRIPTION</code> y en el código, referirnos a la función de la forma <code>paquete::función</code>.</p>
<p>En el caso de funciones que usemos constantemente y especialmente para el caso de operadores (por ejemplo <code>%&gt;%</code>), podemos <strong>evitar usar la notación <code>paquete::</code></strong> usando</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb1-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#' @importFrom paquete funcion</span></span></code></pre></div></div>
<p>Para importar <strong>métodos de una clase S3 que no están explícitamente exportados</strong> en su paquete, algo que sucede habitualmente para funciones como <code>plot</code> o <code>predict</code>. Por ejemplo, para poder usar el predict del paquete randomForest, es necesario tener <code>Depends: randomForest</code> en <code>DESCRIPTION</code> y además importar el <code>predict</code>genérico del namespace <strong>stats</strong> con</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode r code-with-copy"><code class="sourceCode r"><span id="cb2-1"><span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">#' @importFrom stats predict</span></span></code></pre></div></div>
<section id="referencias" class="level3">
<h3 class="anchored" data-anchor-id="referencias">Referencias</h3>
<ul>
<li><p>Libro <a href="https://r-pkgs.org/description.html#dependencies">R packages</a>.</p></li>
<li><p>https://stackoverflow.com/a/15563774 https://stackoverflow.com/questions/15563640/importing-s3-method-from-another-package</p></li>
</ul>


</section>

 ]]></description>
  <category>programación</category>
  <category>R</category>
  <category>paquetes</category>
  <guid>https://dmts.es/posts/importacion-paquetes-metodos-R/</guid>
  <pubDate>Thu, 05 Aug 2021 22:00:00 GMT</pubDate>
</item>
<item>
  <title>Understanding Software I</title>
  <dc:creator>David Mateos</dc:creator>
  <link>https://dmts.es/posts/understanding_software_I/</link>
  <description><![CDATA[ 





<p>Max Kanat-Alexander, en su libro “<a href="https://www.codesimplicity.com/post/understanding-software/">Understanding Software</a>” nos revela cual es la “forma correcta” (“<em>the right way</em>”) de escribir código (la traducción es mía):</p>
<blockquote class="blockquote">
<p>El código que mantiene su simplicidad a la vez que proporciona la flexibilidad necesaria para realizar posibles mejoras razonables en el futuro estaría diseñado de la manera correcta. Se usan muchas excusas para no resolver los problemas de la forma correcta:</p>
</blockquote>
<ul>
<li><p>No conozco la forma correcta.</p></li>
<li><p>El grupo no se pone de acuerdo en cuál sería la forma correcta.</p></li>
<li><p>Estoy demasiado cansado/hambriento/desanimado para hacerlo de la forma correcta en este momento.</p></li>
</ul>
<p>Understanding Software. Max Kanat-Alexander. 2017 Packt Publishing</p>



 ]]></description>
  <category>programación</category>
  <guid>https://dmts.es/posts/understanding_software_I/</guid>
  <pubDate>Sat, 19 Sep 2020 22:00:00 GMT</pubDate>
  <media:content url="https://dmts.es/posts/understanding_software_I/thumbnail.jpeg" medium="image" type="image/jpeg"/>
</item>
<item>
  <title>Dos notas sobre los triggers en PostgreSQL</title>
  <dc:creator>David Mateos</dc:creator>
  <link>https://dmts.es/posts/pasar_argumentos_trigger_postgres/</link>
  <description><![CDATA[ 





<p>Para crear <em>triggers</em> (disparadores) en PostgreSQL hay que generar dos objetos:</p>
<ul>
<li><p>Una función trigger que realiza las acciones que se quiera.</p></li>
<li><p>El <em>trigger</em> propiamente dicho, que es el que se encarga de enlazar la función con una tabla y establecer en qué casos se va a lanzar.</p></li>
</ul>
<p>Algunas notas:</p>
<ul>
<li><p>El trigger no lleva schema en el nombre. Los triggers se crean específicamente para cada tabla, por lo que su nombre debe ser único sólamente entre los otros triggers de esa tabla.</p></li>
<li><p>La función trigger no puede llevar argumentos en su definición. Sin embargo, cuando es llamada por un trigger, se generan varias variables especiales en su interior, una de las cuales, TG_ARGV, es un array (empieza en 0) de texto de los argumentos pasados en la sentencia <code>CREATE TRIGGER</code>.</p></li>
</ul>



 ]]></description>
  <category>postgres</category>
  <guid>https://dmts.es/posts/pasar_argumentos_trigger_postgres/</guid>
  <pubDate>Wed, 12 Aug 2020 22:00:00 GMT</pubDate>
</item>
<item>
  <title>Programación funcional</title>
  <dc:creator>David Mateos</dc:creator>
  <link>https://dmts.es/posts/programacion_funcional/</link>
  <description><![CDATA[ 





<blockquote class="blockquote">
<p>Los tres principales criterios de la programción funcional como paradigma de computación se pueden resumir:</p>
<ol type="1">
<li>Cualquier operación se puede expresar como una llamada a una función.</li>
<li>El resultado de la llamada está definido únicamente por los valores de los argumentos.</li>
<li>El efecto de la llamada a una función es simplemente el valor devuelto.</li>
</ol>
</blockquote>
<p>John M. Chambers. <a href="https://www.crcpress.com/Extending-R/Chambers/p/book/9781498775717">Extending R</a>.</p>



 ]]></description>
  <category>R</category>
  <category>programación</category>
  <guid>https://dmts.es/posts/programacion_funcional/</guid>
  <pubDate>Tue, 05 Nov 2019 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Renombrar ficheros con git</title>
  <dc:creator>David Mateos</dc:creator>
  <link>https://dmts.es/posts/git_renombrar/</link>
  <description><![CDATA[ 





<p>Para renombrar un fichero que está dentro de un repositorio git y seguir haciéndole seguimiento, se pueden utilizar los comandos individuales: <!--more--></p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb1-1"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">mv</span> nombre_antiguo nombre_nuevo</span>
<span id="cb1-2"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">git</span> rm nombre_antiguo</span>
<span id="cb1-3"><span class="fu" style="color: #4758AB;
background-color: null;
font-style: inherit;">git</span> add nombre_nuevo</span></code></pre></div></div>
<p>o usar el atajo</p>
<pre class="shell"><code>git mv nombre_antiguo nombre_nuevo</code></pre>
<p>Ambas opciones son equivalentes.</p>
<p>Si después se quieren ver los commits que han afectado a ese archivo, con</p>
<pre class="shell"><code>git log nombre_nuevo</code></pre>
<p>sólo se obtendrán los commits realizados desde el cambio de nombre. Si se quieren visualizar todos los commits que le han afectado, incluyendo los anteriores al cambio de nombre, se puede realizar mediante:</p>
<pre class="shell"><code>git log --follow nombre_nuevo</code></pre>



 ]]></description>
  <category>git</category>
  <category>programación</category>
  <guid>https://dmts.es/posts/git_renombrar/</guid>
  <pubDate>Wed, 16 Oct 2019 22:00:00 GMT</pubDate>
</item>
<item>
  <title>Inicio de arrays</title>
  <dc:creator>David Mateos</dc:creator>
  <link>https://dmts.es/posts/indices-de-arrays/</link>
  <description><![CDATA[ 





<p>Recientemente le comentaba a un compañero que en R los índices de los arrays (sus equivalentes, vectores, listas, etc) empezaban en uno. Su respuesta fue elocuente:</p>
<blockquote class="blockquote">
<p>1?? herejia!</p>
</blockquote>
<p>Aunque no sea un lenguaje de programación, también en Postgres los arrays empiezan la cuenta en 1. Junto con AWK, y Matlab/Octave son de los pocos que no empiezan por cero.</p>
<p>Y aunque se suelen escuchar distintos motivos sobre el porqué los índices de los arrays empiezan en cero (algo que resulta poco intuitivo en principio), parece que realmente poca gente conoce los motivos reales.</p>
<p>En su interesante artículo <a href="http://exple.tive.org/blarg/2013/10/22/citation-needed/">Citation Needed</a>, Mike Hoye hace una investigación muy completa para encontrar la solución.</p>
<p><img src="https://dmts.es/posts/indices-de-arrays/arrays_0_1.png" class="img-fluid" alt="XKCD Volume 0. Munroe, Randall."></p>



 ]]></description>
  <category>programación</category>
  <category>array</category>
  <guid>https://dmts.es/posts/indices-de-arrays/</guid>
  <pubDate>Sun, 15 Sep 2019 22:00:00 GMT</pubDate>
</item>
<item>
  <title>Escritura de funciones ‘tidy’</title>
  <dc:creator>David Mateos</dc:creator>
  <link>https://dmts.es/posts/escribir-funciones-R/</link>
  <description><![CDATA[ 





<p><a href="http://hadley.nz/">Hadley Wickham</a> nos cuenta en su <em>The tidy tools manifesto</em><sup>1</sup>, algunas de sus claves a la hora de escribir funciones (la traducción es mía):</p>
<blockquote class="blockquote">
<ul>
<li>Esforzarse por mantener las funciones tan simples como sea posible (¡pero no más!). Generalmente, cada función debería hacer una cosa bien, y el propósito de la función se debería poder definir en una sola frase.<!--more--></li>
</ul>
</blockquote>
<ul>
<li><p>Evitar mezclar efectos secundarions (<em>side-effects</em>) con transformaciones. Asegurarse que cada función o devuelve un objeto o tiene un efecto secundario. No ambas.</p></li>
<li><p>Los nombres de las funciones deberían ser verbos. La excepción es cuando muchas funciones usan el mismo verbo (normalmente algo como “modificar”, “añadir” o “calcular”). En ese caso, evitar duplicar el verbo común y en su lugar centrarse en el nombre. En ggplot2 hay un buen ejemplo de esto: casi cualquier función añade algo a un gráfico ya existente.</p></li>
</ul>




<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Notas</h2>

<ol>
<li id="fn1"><p><a href="https://cran.r-project.org/web/packages/tidyverse/vignettes/manifesto.html">https://cran.r-project.org/web/packages/tidyverse/vignettes/manifesto.html</a>↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>ciencia de datos</category>
  <category>R</category>
  <guid>https://dmts.es/posts/escribir-funciones-R/</guid>
  <pubDate>Thu, 24 May 2018 22:00:00 GMT</pubDate>
</item>
<item>
  <title>Programas para usar git</title>
  <dc:creator>David Mateos</dc:creator>
  <link>https://dmts.es/posts/programas-para-usar-git/</link>
  <description><![CDATA[ 





<p>En general utilizo bastante los comandos en terminal (por cierto, suelo usar <a href="http://guake.org/">Guake</a> como emulador de terminal) directamente. Tengo definidos algunos alias para tareas comunes, no como alias en git, si no directamente en Bash<sup>1</sup>. <!--more--></p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb1-1"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">alias</span> add=<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'git add'</span></span>
<span id="cb1-2"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">alias</span> br=<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'git branch -v'</span></span>
<span id="cb1-3"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">alias</span> cambios=<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'git log --date-order --date=short --graph --full-history --all --pretty=format:"%h - %ad - %s"'</span></span>
<span id="cb1-4"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">alias</span> cambios_autor=<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'git log --date-order --date=short --graph --full-history --all --pretty=format:"%h - %ad - %an - %s"'</span></span>
<span id="cb1-5"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">alias</span> ci=<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'git commit -m'</span></span>
<span id="cb1-6"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">alias</span> cia=<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'git commit -a -m'</span></span>
<span id="cb1-7"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">alias</span> co=<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'git checkout'</span></span>
<span id="cb1-8"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">alias</span> cob=<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'git checkout -b'</span></span>
<span id="cb1-9"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">alias</span> deshacer_ci=<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'git reset --soft HEAD~1'</span></span>
<span id="cb1-10"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">alias</span> gcaa=<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'git commit -a --amend -C HEAD'</span></span>
<span id="cb1-11"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">alias</span> nuevo=<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'git log HEAD@{1}..HEAD@{0}'</span></span>
<span id="cb1-12"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">alias</span> push=<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'git push'</span></span>
<span id="cb1-13"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">alias</span> pushom=<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'git push origin master'</span></span>
<span id="cb1-14"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">alias</span> st=<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'git status'</span></span>
<span id="cb1-15"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">alias</span> unstage=<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">'git reset HEAD'</span></span></code></pre></div></div>
<p>Como interfaz gráfica suelo usar <em>git-cola</em>. Como visor de historial y de ramas no he llegado a encontrar ninguno que me guste demasiado, pero suelo usar el DAG que viene con git-cola o <code>gitk</code> que viene con la propia instalación de git.</p>
<p>Cuando trabajo con R, utilizo el panel de Git que incluye RStudio, ya que es lo más ágil.</p>




<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Notas</h2>

<ol>
<li id="fn1"><p>En este <a href="https://github.com/damateos/dotfiles/blob/master/bash_aliases">gist</a> están todos los alias de <em>bash</em> que utilizo habitualmente.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>git</category>
  <category>bash</category>
  <guid>https://dmts.es/posts/programas-para-usar-git/</guid>
  <pubDate>Tue, 01 May 2018 22:00:00 GMT</pubDate>
</item>
<item>
  <title>Exportar issues de bitbucket a una tabla</title>
  <dc:creator>David Mateos</dc:creator>
  <link>https://dmts.es/posts/leer-issues-bitbucket/</link>
  <description><![CDATA[ 





<p><strong>TL;DR:</strong> Una forma rápida de convertir la información principal de un fichero de <em>issues</em> exportado de Bitbucket a una tabla es usando el siguiente comando:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb1-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">in2csv</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-f</span> json <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-k</span> issues archivo_exportado.json <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> tabla_salida.csv</span></code></pre></div></div>
<!--more-->
<hr>
<p>Desde Bitbucket se pueden exportar los “issues” a un archivo json que guarda todos los datos relacionados con los mismos: contenido, comentarios, adjuntos, versiones, logs, etc. Aunque es un formato <sup>1</sup> muy completo, que permite exportar e importar cómodamente entre repositorios git, no es lo más cómodo para ser leido por personas (es lo que tiene el json, muy fácilmente procesable por máquinas, pero aunque legible por humanos, no es especialmente amigable).</p>
<p>Una forma rápida de extraer parte de la información es a través del comando in2csv del paquete <sup>2</sup> <a href="https://csvkit.readthedocs.io">csvkit</a>. En este caso, nos quedaríamos con las características principales (estatus, prioridad, tipo, titulo y contenido, usuario que reporta, etc) y se quedarían fuera comentarios, adjuntos y otras informaciones.</p>
<p>En primer lugar hay que descomprimir el archivo que se genera al exportar desde Bitbucket y quedarse con el fichero llamado <code>db-1.0.json</code> o similar.</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb2-1"><span class="ex" style="color: null;
background-color: null;
font-style: inherit;">in2csv</span> <span class="at" style="color: #657422;
background-color: null;
font-style: inherit;">-k</span> issues archivo_exportado.json <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> tabla_salida.csv</span></code></pre></div></div>
<p>Tras el parámetro <code>-k</code> hay que indicar la clave “top-level” que se quiere extraer y es obligatorio si el JSON contiene más de una de estas claves. En nuestro caso, las claves son:</p>
<ul>
<li><p>issues,</p></li>
<li><p>comments,</p></li>
<li><p>attachments,</p></li>
<li><p>logs,</p></li>
<li><p>meta,</p></li>
<li><p>components,</p></li>
<li><p>milestones</p></li>
<li><p>versions</p></li>
</ul>




<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Notas</h2>

<ol>
<li id="fn1"><p>En <a href="https://confluence.atlassian.com/bitbucket/issue-import-export-data-format-330796872.html">esta página</a> se puede encontrar una descripción del formato. A veces es útil poder visualizarlos en un formato más cómodo, para, por ejemplo, poder trabajarlos en el marco de la gestión de proyectos con personas que no trabajen habitualmente con código.↩︎</p></li>
<li id="fn2"><p><strong>csvkit</strong> es un conjunto de herramientas de línea de comandos, escritas en Python, para trabajar con ficheros CSV.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>git</category>
  <category>bitbucket</category>
  <category>csvkit</category>
  <guid>https://dmts.es/posts/leer-issues-bitbucket/</guid>
  <pubDate>Thu, 05 Apr 2018 22:00:00 GMT</pubDate>
</item>
<item>
  <title>Problema con variables en un bucle que está en una tubería</title>
  <dc:creator>David Mateos</dc:creator>
  <link>https://dmts.es/posts/variable-bucle-pipeline/</link>
  <description><![CDATA[ 





<section id="tl-dr" class="level3">
<h3 class="anchored" data-anchor-id="tl-dr">TL; DR</h3>
<p><strong>Cada comando de una tubería se ejecuta dentro de una subshell, con su propio contexto y entorno de variables. Incluyendo los bucles si estos forman parte de la tubería</strong>.</p>
</section>
<section id="la-variable-que-desaparecía" class="level3">
<h3 class="anchored" data-anchor-id="la-variable-que-desaparecía">La variable que desaparecía</h3>
<p>El otro día trabajando con un script en <code>bash</code> me volví un poco loco con una variable que modificaba dentro de un bucle <code>while</code> y que luego parecía no guardar su valor una vez terminado el bucle. Como era un comportamiento que para nada esperaba me costó lo mio dar con el problema. No era un problema del bucle, si no de que éste formaba parte de una tubería (<em>pipe</em>):</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb1-1"><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">var1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>0</span>
<span id="cb1-2"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">echo</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">$VARIABLE1</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">|</span> </span>
<span id="cb1-3"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">while</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">read</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">task</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">;</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">do</span></span>
<span id="cb1-4">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># cuerpo del bucle</span></span>
<span id="cb1-5">  <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">var1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>2</span>
<span id="cb1-6">  <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ...</span></span>
<span id="cb1-7"><span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">done</span></span>
<span id="cb1-8"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">echo</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">$var1</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span></span>
<span id="cb1-9"></span>
<span id="cb1-10"></span>
<span id="cb1-11"><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> 0</span></code></pre></div></div>
<p>Efectivamente, cada comando de una tubería se ejecuta dentro de una subshell, con su propio contexto y entorno de variables. Incluyendo los bucles si estos forman parte de la tubería.</p>
<p>En esta <a href="http://mywiki.wooledge.org/BashFAQ/024">web</a> se puede leer una descripción detallada de este comportamiento, qué sucede en las diferentes versiones de shell, así como diferentes maneras de sortearlo.</p>
<p>De las propuestas, la solución que decidí adoptar en mi caso fue el agrupamiento de comandos (<em>Command grouping</em>) así:</p>
<div class="code-copy-outer-scaffold"><div class="sourceCode" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode bash code-with-copy"><code class="sourceCode bash"><span id="cb2-1"><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">var1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>0</span>
<span id="cb2-2"> </span>
<span id="cb2-3"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">echo</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">$VARIABLE1</span> <span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">|</span></span>
<span id="cb2-4"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">{</span> </span>
<span id="cb2-5">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">while</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">read</span> <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">task</span><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">;</span> <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">do</span></span>
<span id="cb2-6">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># cuerpo del bucle</span></span>
<span id="cb2-7">    <span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">var1</span><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>2</span>
<span id="cb2-8">    <span class="co" style="color: #5E5E5E;
background-color: null;
font-style: inherit;"># ...</span></span>
<span id="cb2-9">  <span class="cf" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">done</span></span>
<span id="cb2-10">  <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">echo</span> <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">$var1</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span></span>
<span id="cb2-11"><span class="kw" style="color: #003B4F;
background-color: null;
font-weight: bold;
font-style: inherit;">}</span></span>
<span id="cb2-12"></span>
<span id="cb2-13"><span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">&gt;</span> 2</span></code></pre></div></div>
<p>Que, como explican en la página, no altera para nada el tema de la subshell, pero como en este caso no necesitaba reutilizar nada de lo que allí había en el resto del código, resulta una solución suficiente y rápida de aplicar.</p>
<p>De paso, he descubierto esta página que parece que va a ser una referencia útil a la que volver de vez en cuando.</p>
</section>
<section id="fuente" class="level2">
<h2 class="anchored" data-anchor-id="fuente">Fuente:</h2>
<p><a href="http://mywiki.wooledge.org/BashFAQ/">BashFAQ</a></p>


</section>

 ]]></description>
  <category>bash</category>
  <category>tubería</category>
  <guid>https://dmts.es/posts/variable-bucle-pipeline/</guid>
  <pubDate>Wed, 23 Aug 2017 22:00:00 GMT</pubDate>
</item>
<item>
  <title>Reglas básicas para crear gráficos</title>
  <dc:creator>David Mateos</dc:creator>
  <link>https://dmts.es/posts/reglas-para-graficos/</link>
  <description><![CDATA[ 





<p>En un post de 2015<sup>1</sup> de su blog <a href="https://flowingdata.com">FlowingData</a>, Nathan Yau nos da algunas de las reglas que debemos tener siempre en cuenta a la hora de realizar gráficos:</p>
<section id="la-línea-base-de-los-gráficos-de-barras-debe-empezar-en-cero" class="level3">
<h3 class="anchored" data-anchor-id="la-línea-base-de-los-gráficos-de-barras-debe-empezar-en-cero">La línea base de los gráficos de barras debe empezar en cero</h3>
<p>Los gráficos de barras se basan en la longitud de las barras para mostrar la información. Si se desplaza la línea base, se distorsiona el significado. Ejemplo:</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://dmts.es/posts/reglas-para-graficos/graficoBarras-1.png" class="img-fluid figure-img"></p>
<figcaption>plot of chunk graficoBarras</figcaption>
</figure>
</div>
</section>
<section id="no-pasarse-haciendo-trozos-en-los-gráficos-de-tarta" class="level3">
<h3 class="anchored" data-anchor-id="no-pasarse-haciendo-trozos-en-los-gráficos-de-tarta">No pasarse haciendo trozos en los gráficos de tarta</h3>
<p>De hecho hay quien considera que los gráficos de tarta no deben usarse en ningún caso. Ejemplo:</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://dmts.es/posts/reglas-para-graficos/graficoTrozos-1.png" class="img-fluid figure-img"></p>
<figcaption>plot of chunk graficoTrozos</figcaption>
</figure>
</div>
</section>
<section id="respetar-las-partes-de-un-todo" class="level3">
<h3 class="anchored" data-anchor-id="respetar-las-partes-de-un-todo">Respetar las partes de un todo</h3>
<p>Los gráficos que representan partes de un todo (como los gráficos de tarta, mosaicos, etc.) deben comportarse como tales y cada sección de los mismos debe representar una proporción separada, que no se superpone con las otras.</p>
<div class="quarto-figure quarto-figure-center">
<figure class="figure">
<p><img src="https://dmts.es/posts/reglas-para-graficos/partesTodo-1.png" class="img-fluid figure-img"></p>
<figcaption>plot of chunk partesTodo</figcaption>
</figure>
</div>
</section>
<section id="mostrar-los-datos" class="level3">
<h3 class="anchored" data-anchor-id="mostrar-los-datos">Mostrar los datos</h3>
<p>Esto parece algo obvio, ya que es la función principal del gráfico. Sin embargo, se suele fallar en este propósito cuando se muestran demasiados datos de una vez. Algunas soluciones sencillas que se pueden aplicar:</p>
<ul>
<li><p>Cambiar el tamaño de los símbolos para que no ocupen tanto espacio. Se trata de incrementar el espacio en blanco.</p></li>
<li><p>Usar transparencias para que todos los símbolos se vean aun cuando tengan otros encima.</p></li>
<li><p>Separar la población en subgrupos, bien por muestreo o usando categorías.</p></li>
</ul>
</section>
<section id="explicar-lo-que-se-muestra" class="level3">
<h3 class="anchored" data-anchor-id="explicar-lo-que-se-muestra">Explicar lo que se muestra</h3>
<p>Cuando realizamos gráficos, codificamos los datos a través de formas, colores y tamaños. Es necesario por tanto incluir siempre las claves que nos permitan entender el gráfico. Esto incluye ponerle título, etiquetar los ejes, añadir leyenda, etc.</p>
<p>Por último, os recomiendo leer el libro de Nathan Yau, <a href="https://www.amazon.com/Data-Points-Visualization-Means-Something/dp/111846219X/?tag=flowingdata-20">Data Points</a> (recomiendo éste porque es el único que he leído, pero los demás tienen muy buena pinta también) y visitar su página <a href="https://flowingdata.com">FlowingData.com</a> que contiene multitud de información sobre estadística y visualización de datos, parte de ella de libre acceso y otra parte accesible mediante subscripción.</p>
</section>
<section id="fuente" class="level2">
<h2 class="anchored" data-anchor-id="fuente">Fuente:</h2>


</section>


<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Notas</h2>

<ol>
<li id="fn1"><p><a href="https://flowingdata.com/2015/08/11/real-chart-rules-to-follow/">Real Chart Rules to Follow - FlowingData</a>.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>gráficos</category>
  <category>ciencia de datos</category>
  <guid>https://dmts.es/posts/reglas-para-graficos/</guid>
  <pubDate>Thu, 04 May 2017 22:00:00 GMT</pubDate>
</item>
<item>
  <title>Reproducibilidad (I)</title>
  <dc:creator>David Mateos</dc:creator>
  <link>https://dmts.es/posts/reproducibilidad-i/</link>
  <description><![CDATA[ 





<blockquote class="blockquote">
<p>No puedes reproducirlo si no entiendes de dónde viene un número.<br>
No puedes reproducir lo que no recuerdas. Y creéme: no lo recordarás.<br>
No puedes reproducir lo que has perdido. ¿Y si necesitas acceder a cómo era un archivo hace 1, 10, 100 o 1000 dias?</p>
</blockquote>
<p>Ben Bond-Lamberty <a href="https://twitter.com/benbondlamberty"><span class="citation" data-cites="BenBondLamberty">@BenBondLamberty</span></a></p>



 ]]></description>
  <category>ciencia de datos</category>
  <category>reproducibilidad</category>
  <guid>https://dmts.es/posts/reproducibilidad-i/</guid>
  <pubDate>Wed, 29 Mar 2017 22:00:00 GMT</pubDate>
</item>
<item>
  <title>Hosting para Jekyll</title>
  <dc:creator>David Mateos</dc:creator>
  <link>https://dmts.es/posts/cambio-de-alojamiento/</link>
  <description><![CDATA[ 





<section id="aerobatic" class="level2">
<h2 class="anchored" data-anchor-id="aerobatic">Aerobatic</h2>
<p>Hasta ahora <a href="../sobre_esta_web/">esta web</a> se desplegaba usando <a href="https://www.aerobatic.com/">Aerobatic</a>. Aerobatic se instalaba como un complemento de Bitbucket. Se indicaba una rama del <em>repo</em> y con cada <code>push</code>, Aerobatic ejecutaba Jekyll de forma interna y volvía a construir el directorio <code>_site</code> y a servirlo en forma de página web. <!--more--> El plan gratuito permitía utilizarlo con un máximo de dos repositorios y utilizar un dominio personalizado.</p>
<p>Por desgracia, han avisado que para marzo (de 2017) se introducen cambios en el sistema de precios del producto, de forma que ahora, aunque el plan gratuito permite tener tantos proyectos como se quiera, no permite usar un dominio personalizado (sólo se pueden usar direcciones del tipo: https://nombre-del-sitio.aerobatic.io ), de forma que no podía seguir usando mi dominio dmts.es. El plan de pago más barato suponen 15$ al mes, lo que para un blog tan sencillo como este me parecía excesivo <sup>1</sup>.</p>
</section>
<section id="buscando-alojamiento" class="level2">
<h2 class="anchored" data-anchor-id="buscando-alojamiento">Buscando alojamiento</h2>
<p>Había que buscar un substituto. El precio era importante. Buscaba una opción gratuita o de bajo coste. También un mínimo de calidad. El despliegue automático de Jekyll a partir de un repositorio <em>git</em>, aunque cómodo, no era necesario. Construir la página en local y después subir el directorio <code>_site</code> tampoco supone mucho trabajo.</p>
<p>En este momento, me era posible usar el servidor de Terrativa, donde estaban alojadas la <a href="http://terrativa.net">web</a>, la <a href="http://cursos-medioambiente.com">página de cursos</a> y algunos otros servicios. Pero prefería una solución independiente.</p>
<p>Contemplé tres opciones:</p>
<ul>
<li><p>La más obvia es la opción de usar <strong>Github Pages</strong>. Al igual que ocurria antes con Bitbucket+Aerobatic, <a href="https://pages.github.com/">Github Pages</a> da la opción de construir automáticamente un sitio Jekyll a partir de un repositorio y servirlo a través de una URL tipo <code>usuario.github.io</code> o una URL personalizada. Los “peros” de esta opción son dos: por una lado este despliegue automático de sitios Jekyll, por motivos de seguridad sólo está disponible para sitios que no incorporen plugins de Jekyll; por otro, la versión gratuita de Github es sólo para proyectos de código abierto, por lo que todo el código tendría que ser público, incluyendo borradores y otra información que en principio no se pensara en compartir. Ambos problemas tienen fácil solución si lo que se utiliza como repositorio en Github es el directorio <code>_site</code>.</p></li>
<li><p><strong>Amazon AWS</strong>. Nunca he usado el servicio de Amazon y me apetecía cacharrear con ello. Además tienen su plan gratuito durante el primer año precisamente para eso, para que cacharrees sin miedo.</p></li>
<li><p><strong>Google Firebase</strong>. Es una plataforma en principio para diseño de app en la nube, pero que se ha convertido en una plataforma en la nube para todo tipo de desarrollos y almacenaje. En este caso el plan gratuito no parece tener más “peros” que sus menores capacidades, que desde luego dan más que de sobra para proyectos personales.</p></li>
</ul>
<p>Finalmente, como ya estaba estudiando utilizar <a href="https://firebase.google.com/">Firebase</a> como medio para implementar los comentarios en el blog sin tener que recurrir a servicios de terceros (usar DISQUS o los comentarios de Facebook suele ser una opción habitual en los blogs con Jekyll), me he decantado por esta última opción.</p>
<p>En un próximo post contaré cómo utilizar Google Firebase para un blog Jekyll.</p>


</section>


<div id="quarto-appendix" class="default"><section id="footnotes" class="footnotes footnotes-end-of-document"><h2 class="anchored quarto-appendix-heading">Notas</h2>

<ol>
<li id="fn1"><p>No es el único cambio que implementaba Aerobatic. Lo más relevante es que pasa de ser un plugin para Bitbucket a una aplicación independiente, con opción de línea de comando o de panel web. <a href="https://www.aerobatic.com/blog/announcing-aerobatic-transition/#background">Aquí</a> está el post que detalla todos los cambios. Sigue siendo un servicio muy interesante, que incluye CDN, SSL, etc, pero queda un poco sobredimensionado para lo que yo necesito.↩︎</p></li>
</ol>
</section></div> ]]></description>
  <category>jekyll</category>
  <category>git</category>
  <category>hosting</category>
  <category>dmts.es</category>
  <guid>https://dmts.es/posts/cambio-de-alojamiento/</guid>
  <pubDate>Fri, 10 Feb 2017 23:00:00 GMT</pubDate>
</item>
<item>
  <title>Excelencia gráfica</title>
  <dc:creator>David Mateos</dc:creator>
  <link>https://dmts.es/posts/excelencia-grafica/</link>
  <description><![CDATA[ 





<p>Edward Tutfe no se anda por las ramas. Ya en la primera página de su excelente “<a href="https://www.edwardtufte.com/tufte/books_vdqi">The Visual Display of Quantitative Information</a>” nos cuenta que los gráficos deben (la traducción es mía):</p>
<blockquote class="blockquote">
<ul>
<li>mostrar los datos,</li>
</ul>
</blockquote>
<ul>
<li><p>inducir al observador a pensar sobre el contenido y sentido de los datos más que sobre la metodología, el diseño, la tecnología con que se ha construido el gráfico o cualquier otra cosa,</p></li>
<li><p>evitar deformar lo que los datos tienen que contar,</p></li>
<li><p>presentar muchos números en un espacio pequeño,</p></li>
<li><p>conseguir que los grandes conjuntos de datos sean coherentes,</p></li>
<li><p>animar al observador a comparar diferentes porciones de los datos,</p></li>
<li><p>revelar los datos a diferentes niveles de detalle, desde la vista general al detalle,</p></li>
<li><p>servir de forma clara a un propósito razonable: descripción, exploración, tabulado o decoración,</p></li>
<li><p>estar perfectamente integrado con la descripción estadística y verbal del conjunto de datos.</p></li>
</ul>



 ]]></description>
  <category>ciencia de datos</category>
  <category>gráficos</category>
  <category>Tufte</category>
  <guid>https://dmts.es/posts/excelencia-grafica/</guid>
  <pubDate>Fri, 10 Feb 2017 23:00:00 GMT</pubDate>
</item>
</channel>
</rss>
