<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>El blog de Andrés</title>
    <link>https://andresrcs.rbind.io/es/</link>
    <description>Recent content on El blog de Andrés</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>es</language>
    <copyright>Copyright © 2020, Andrés Castro Socolich; todos los derechos reservados.</copyright>
    <lastBuildDate>Sat, 11 Feb 2023 00:00:00 +0000</lastBuildDate>
    
	<atom:link href="https://andresrcs.rbind.io/es/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Opciones para instalar R en una Raspberry Pi y otros sistemas ARM</title>
      <link>https://andresrcs.rbind.io/es/2023/02/11/r_on_arm/</link>
      <pubDate>Sat, 11 Feb 2023 00:00:00 +0000</pubDate>
      
      <guid>https://andresrcs.rbind.io/es/2023/02/11/r_on_arm/</guid>
      <description>
&lt;style type=&#34;text/css&#34;&gt;
pre &gt; code.sourceCode { white-space: pre; position: relative; }
pre &gt; code.sourceCode &gt; span { line-height: 1.25; }
pre &gt; code.sourceCode &gt; span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode &gt; span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre &gt; code.sourceCode { white-space: pre-wrap; }
pre &gt; code.sourceCode &gt; span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
  { counter-reset: source-line 0; }
pre.numberSource code &gt; span
  { position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code &gt; span &gt; a:first-child::before
  { content: counter(source-line);
    position: relative; left: -1em; text-align: right; vertical-align: baseline;
    border: none; display: inline-block;
    -webkit-touch-callout: none; -webkit-user-select: none;
    -khtml-user-select: none; -moz-user-select: none;
    -ms-user-select: none; user-select: none;
    padding: 0 4px; width: 4em;
  }
pre.numberSource { margin-left: 3em;  padding-left: 4px; }
div.sourceCode
  { color: #cccccc; background-color: #303030; }
@media screen {
pre &gt; code.sourceCode &gt; span &gt; a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ffcfaf; } /* Alert */
code span.an { color: #7f9f7f; font-weight: bold; } /* Annotation */
code span.at { } /* Attribute */
code span.bn { color: #dca3a3; } /* BaseN */
code span.bu { } /* BuiltIn */
code span.cf { color: #f0dfaf; } /* ControlFlow */
code span.ch { color: #dca3a3; } /* Char */
code span.cn { color: #dca3a3; font-weight: bold; } /* Constant */
code span.co { color: #7f9f7f; } /* Comment */
code span.cv { color: #7f9f7f; font-weight: bold; } /* CommentVar */
code span.do { color: #7f9f7f; } /* Documentation */
code span.dt { color: #dfdfbf; } /* DataType */
code span.dv { color: #dcdccc; } /* DecVal */
code span.er { color: #c3bf9f; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #c0bed1; } /* Float */
code span.fu { color: #efef8f; } /* Function */
code span.im { } /* Import */
code span.in { color: #7f9f7f; font-weight: bold; } /* Information */
code span.kw { color: #f0dfaf; } /* Keyword */
code span.op { color: #f0efd0; } /* Operator */
code span.ot { color: #efef8f; } /* Other */
code span.pp { color: #ffcfaf; font-weight: bold; } /* Preprocessor */
code span.sc { color: #dca3a3; } /* SpecialChar */
code span.ss { color: #cc9393; } /* SpecialString */
code span.st { color: #cc9393; } /* String */
code span.va { } /* Variable */
code span.vs { color: #cc9393; } /* VerbatimString */
code span.wa { color: #7f9f7f; font-weight: bold; } /* Warning */
&lt;/style&gt;

&lt;div id=&#34;TOC&#34;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#instalar-desde-los-repositorios-del-sistema-operativo&#34; id=&#34;toc-instalar-desde-los-repositorios-del-sistema-operativo&#34;&gt;Instalar desde los repositorios del Sistema Operativo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#compilar-r-desde-la-fuente&#34; id=&#34;toc-compilar-r-desde-la-fuente&#34;&gt;Compilar R desde la fuente&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#instalar-r-usando-rig&#34; id=&#34;toc-instalar-r-usando-rig&#34;&gt;Instalar R usando rig&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#instalar-r-desde-el-proyecto-r4pi&#34; id=&#34;toc-instalar-r-desde-el-proyecto-r4pi&#34;&gt;Instalar R desde el Proyecto R4Pi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;Esto comenzó como una sección en algunas de mis otras publicaciones, pero a medida que las opciones de instalación comenzaron a acumularse, comenzó a ocupar demasiado espacio para ser solo una sección en un artículo, por lo que decidí convertirlo en un artículo propio.&lt;/p&gt;
&lt;p&gt;Las opciones descritas aquí se aplican principalmente a la familia de computadoras de placa única Raspberry Pi, pero dado que la mayoría de opciones también funcionan en distribuciones Ubuntu, también pueden aplicarse a otros sistemas Linux ARM como otros SBC o incluso computadoras ARM de “tamaño completo” como Ampere Altra o AWS Gravitón.&lt;/p&gt;
&lt;div id=&#34;instalar-desde-los-repositorios-del-sistema-operativo&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Instalar desde los repositorios del Sistema Operativo&lt;/h2&gt;
&lt;p&gt;Esta es la opción más fácil, puedes instalar R desde los repositorios estándar para tu sistema operativo, pero esas versiones de R suelen ser bastante antiguas, por ejemplo, la última versión de Raspberry Pi OS viene con R 4.2.2 y Ubuntu 22.04 viene con R 4.1.2.&lt;/p&gt;
&lt;p&gt;Para instalar R con esta opción, solo necesitas ejecutar este comando en tu terminal de sistema:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb1&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb1-1&#34;&gt;&lt;a href=&#34;#cb1-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; apt install r-base&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Esto está bien si solo quieres probar R o hacer cosas simples con él, pero si vas a trabajar en un proyecto serio, es probable que desees comenzar con una versión actualizada de R.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;compilar-r-desde-la-fuente&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Compilar R desde la fuente&lt;/h2&gt;
&lt;p&gt;Otra opción es compilar la última versión de R tu mismo (4.3.1 al momento de escribir) a partir de los archivos de código fuente, esta es una tarea que requiere mucho tiempo y puede resultar un poco intimidante para los recién llegados, pero te brinda la mayor flexibilidad cuando se trata de configurar las opciones de compilación, por ejemplo, puede elegir opciones como compilar con BLAS y LAPACK para acelerar cálculos de matriciales.&lt;/p&gt;
&lt;p&gt;Puedes compilar R desde la fuente ejecutando este script en una terminal del sistema, funciona tanto para las distribuciones de Raspberry Pi OS como de Ubuntu:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb2&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb2-1&#34;&gt;&lt;a href=&#34;#cb2-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; su&lt;/span&gt;
&lt;span id=&#34;cb2-2&#34;&gt;&lt;a href=&#34;#cb2-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;/span&gt;
&lt;span id=&#34;cb2-3&#34;&gt;&lt;a href=&#34;#cb2-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Define la version R a instalar&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-4&#34;&gt;&lt;a href=&#34;#cb2-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;va&#34;&gt;R_VERSION&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;=&lt;/span&gt;4.3.1&lt;/span&gt;
&lt;span id=&#34;cb2-5&#34;&gt;&lt;a href=&#34;#cb2-5&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-6&#34;&gt;&lt;a href=&#34;#cb2-6&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;apt&lt;/span&gt; install &lt;span class=&#34;at&#34;&gt;-y&lt;/span&gt; g++ gcc gfortran libreadline-dev libx11-dev libxt-dev &lt;span class=&#34;dt&#34;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-7&#34;&gt;&lt;a href=&#34;#cb2-7&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            libpng-dev libjpeg-dev libcairo2-dev xvfb &lt;span class=&#34;dt&#34;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-8&#34;&gt;&lt;a href=&#34;#cb2-8&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            libbz2-dev libzstd-dev liblzma-dev libtiff5 &lt;span class=&#34;dt&#34;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-9&#34;&gt;&lt;a href=&#34;#cb2-9&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            libssh-dev libgit2-dev libcurl4-openssl-dev &lt;span class=&#34;dt&#34;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-10&#34;&gt;&lt;a href=&#34;#cb2-10&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            libblas-dev liblapack-dev libopenblas-base &lt;span class=&#34;dt&#34;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-11&#34;&gt;&lt;a href=&#34;#cb2-11&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            zlib1g-dev openjdk-11-jdk &lt;span class=&#34;dt&#34;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-12&#34;&gt;&lt;a href=&#34;#cb2-12&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            texinfo texlive texlive-fonts-extra &lt;span class=&#34;dt&#34;&gt;\&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-13&#34;&gt;&lt;a href=&#34;#cb2-13&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            screen wget libpcre2-dev make cmake&lt;/span&gt;
&lt;span id=&#34;cb2-14&#34;&gt;&lt;a href=&#34;#cb2-14&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;bu&#34;&gt;cd&lt;/span&gt; /usr/local/src&lt;/span&gt;
&lt;span id=&#34;cb2-15&#34;&gt;&lt;a href=&#34;#cb2-15&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;wget&lt;/span&gt; https://cran.rstudio.com/src/base/R-&lt;span class=&#34;va&#34;&gt;${R_VERSION&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;dv&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;dv&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;va&#34;&gt;}&lt;/span&gt;/R-&lt;span class=&#34;va&#34;&gt;$R_VERSION&lt;/span&gt;.tar.gz&lt;/span&gt;
&lt;span id=&#34;cb2-16&#34;&gt;&lt;a href=&#34;#cb2-16&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;tar&lt;/span&gt; zxvf R-&lt;span class=&#34;va&#34;&gt;$R_VERSION&lt;/span&gt;.tar.gz&lt;/span&gt;
&lt;span id=&#34;cb2-17&#34;&gt;&lt;a href=&#34;#cb2-17&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;bu&#34;&gt;cd&lt;/span&gt; R-&lt;span class=&#34;va&#34;&gt;$R_VERSION&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-18&#34;&gt;&lt;a href=&#34;#cb2-18&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;./configure&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;--enable-R-shlib&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;--enable-memory-profiling&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;--with-blas&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;--with-lapack&lt;/span&gt; &lt;span class=&#34;co&#34;&gt;#BLAS y LAPACK son opcionales&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-19&#34;&gt;&lt;a href=&#34;#cb2-19&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;make&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-20&#34;&gt;&lt;a href=&#34;#cb2-20&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;make&lt;/span&gt; install&lt;/span&gt;
&lt;span id=&#34;cb2-21&#34;&gt;&lt;a href=&#34;#cb2-21&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;bu&#34;&gt;cd&lt;/span&gt; ..&lt;/span&gt;
&lt;span id=&#34;cb2-22&#34;&gt;&lt;a href=&#34;#cb2-22&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;rm&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-rf&lt;/span&gt; R-&lt;span class=&#34;va&#34;&gt;$R_VERSION&lt;/span&gt;&lt;span class=&#34;pp&#34;&gt;*&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-23&#34;&gt;&lt;a href=&#34;#cb2-23&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;bu&#34;&gt;exit&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;instalar-r-usando-rig&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Instalar R usando rig&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/r-lib/rig&#34;&gt;&lt;code&gt;rig&lt;/code&gt;&lt;/a&gt; es un administrador de instalación de R que te permite instalar varias versiones de R una al lado de la otra. Recientemente agregó soporte para sistemas Linux ARM64 a través del repositorio de GitHub &lt;code&gt;rstudio/r-builds&lt;/code&gt; , aunque se estipula que estas compilaciones son un recurso de la comunidad, Posit no los apoya profesionalmente. Actualmente solo admite distribuciones Ubuntu y Debian (La última versión de Raspberry Pi OS se basa en Debian 12, por lo que también es compatible).&lt;/p&gt;
&lt;p&gt;Puedes instalar &lt;code&gt;rig&lt;/code&gt; en tu sistema ejecutando este comando en una terminal del sistema:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb3&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb3-1&#34;&gt;&lt;a href=&#34;#cb3-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;curl&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-Ls&lt;/span&gt; https://github.com/r-lib/rig/releases/download/latest/rig-linux-arm64-latest.tar.gz &lt;span class=&#34;kw&#34;&gt;|&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb3-2&#34;&gt;&lt;a href=&#34;#cb3-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; tar xz &lt;span class=&#34;at&#34;&gt;-C&lt;/span&gt; /usr/local&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Luego puedes instalar la última versión estable de R con estos comandos:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb4&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb4-1&#34;&gt;&lt;a href=&#34;#cb4-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; rig add release &lt;span class=&#34;co&#34;&gt;# O una versión especifica como 4.3.1&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-2&#34;&gt;&lt;a href=&#34;#cb4-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; rig default release&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Opcionalmente, puedes descargar e instalar R manualmente desde &lt;a href=&#34;https://github.com/r-hub/R/releases&#34;&gt;R-hub&lt;/a&gt; como se explica en el repositorio Github &lt;a href=&#34;https://github.com/rstudio/r-builds&#34;&gt;&lt;code&gt;rstudio/r-builds&lt;/code&gt;&lt;/a&gt;, pero este es un procedimiento más complicado que solo vale la pena si vas a integrarlo en tu propio flujo de trabajo de administración de infraestructura y deseas evitar la sobrecarga de instalar &lt;code&gt;rig&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;instalar-r-desde-el-proyecto-r4pi&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Instalar R desde el Proyecto R4Pi&lt;/h2&gt;
&lt;p&gt;Y por último, pero no menos importante, mi nuevo favorito, puedes instalar R desde el &lt;a href=&#34;https://r4pi.org/es/&#34; title=&#34;R para la Raspberry Pi&#34;&gt;proyecto R4Pi&lt;/a&gt; a través de su repositorio deb, lo que significa que siempre obtendrá actualizaciones de la versión R simplemente ejecutando &lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt upgrade&lt;/code&gt;. Actualmente es compatible con la última versión de Raspberry Pi OS (basada en Debian 12) pero ten presente que el soporte es sólo para 64-bits. Tambien, hay planes para soportar Ubuntu 24.04 LTS arm64 en un futuro cercano.&lt;/p&gt;
&lt;p&gt;Para agregar el repositorio deb de R4Pi a tu lista de fuentes deb e instalar R, ejecuta estos comandos en una terminal del sistema:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb5&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb5-1&#34;&gt;&lt;a href=&#34;#cb5-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;bu&#34;&gt;source&lt;/span&gt; /etc/os-release&lt;/span&gt;
&lt;span id=&#34;cb5-2&#34;&gt;&lt;a href=&#34;#cb5-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;curl&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-O&lt;/span&gt;  https://pkgs.r4pi.org/dl/&lt;span class=&#34;va&#34;&gt;${VERSION_CODENAME}&lt;/span&gt;/r4pi-repo-conf_0.0.1-1_all.deb&lt;/span&gt;
&lt;span id=&#34;cb5-3&#34;&gt;&lt;a href=&#34;#cb5-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; dpkg &lt;span class=&#34;at&#34;&gt;-i&lt;/span&gt;  r4pi-repo-conf_0.0.1-1_all.deb&lt;/span&gt;
&lt;span id=&#34;cb5-4&#34;&gt;&lt;a href=&#34;#cb5-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; apt update&lt;/span&gt;
&lt;span id=&#34;cb5-5&#34;&gt;&lt;a href=&#34;#cb5-5&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; apt upgrade&lt;/span&gt;
&lt;span id=&#34;cb5-6&#34;&gt;&lt;a href=&#34;#cb5-6&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; apt install r4pi&lt;/span&gt;
&lt;span id=&#34;cb5-7&#34;&gt;&lt;a href=&#34;#cb5-7&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;rm&lt;/span&gt; r4pi-repo-conf_0.0.1-1_all.deb&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;El principal beneficio del proyecto R4Pi es que también proporciona repositorios de paquetes R con binarios precompilados para una gran selección de paquetes R, lo que reduce en gran medida el tiempo y el esfuerzo necesarios para instalar paquetes R en Raspberry Pi y, por cierto, también puedes usar el repositorio de paquetes R4Pi con todas las opciones de instalación anteriores simplemente configurando la opción “repos” en un archivo &lt;code&gt;.Rprofile&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb6&#34;&gt;&lt;pre class=&#34;sourceCode r&#34;&gt;&lt;code class=&#34;sourceCode r&#34;&gt;&lt;span id=&#34;cb6-1&#34;&gt;&lt;a href=&#34;#cb6-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;local&lt;/span&gt;({r &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;getOption&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;quot;repos&amp;quot;&lt;/span&gt;)&lt;/span&gt;
&lt;span id=&#34;cb6-2&#34;&gt;&lt;a href=&#34;#cb6-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       r[&lt;span class=&#34;st&#34;&gt;&amp;quot;R4Pi&amp;quot;&lt;/span&gt;] &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;https://pkgs.r4pi.org/bookworm&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-3&#34;&gt;&lt;a href=&#34;#cb6-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       r[&lt;span class=&#34;st&#34;&gt;&amp;quot;CRAN&amp;quot;&lt;/span&gt;] &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;https://cran.rstudio.com/&amp;quot;&lt;/span&gt; &lt;span class=&#34;co&#34;&gt;# Repositorio secundario para cuando no hay binario disponible&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-4&#34;&gt;&lt;a href=&#34;#cb6-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;fu&#34;&gt;options&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;repos=&lt;/span&gt;r)})&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Instalación de Quarto-CLI en sistemas Linux-arm64</title>
      <link>https://andresrcs.rbind.io/es/2022/12/09/quarto_arm64/</link>
      <pubDate>Fri, 09 Dec 2022 00:00:00 +0000</pubDate>
      
      <guid>https://andresrcs.rbind.io/es/2022/12/09/quarto_arm64/</guid>
      <description>
&lt;style type=&#34;text/css&#34;&gt;
pre &gt; code.sourceCode { white-space: pre; position: relative; }
pre &gt; code.sourceCode &gt; span { display: inline-block; line-height: 1.25; }
pre &gt; code.sourceCode &gt; span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode &gt; span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre &gt; code.sourceCode { white-space: pre-wrap; }
pre &gt; code.sourceCode &gt; span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
  { counter-reset: source-line 0; }
pre.numberSource code &gt; span
  { position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code &gt; span &gt; a:first-child::before
  { content: counter(source-line);
    position: relative; left: -1em; text-align: right; vertical-align: baseline;
    border: none; display: inline-block;
    -webkit-touch-callout: none; -webkit-user-select: none;
    -khtml-user-select: none; -moz-user-select: none;
    -ms-user-select: none; user-select: none;
    padding: 0 4px; width: 4em;
  }
pre.numberSource { margin-left: 3em;  padding-left: 4px; }
div.sourceCode
  { color: #cccccc; background-color: #303030; }
@media screen {
pre &gt; code.sourceCode &gt; span &gt; a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ffcfaf; } /* Alert */
code span.an { color: #7f9f7f; font-weight: bold; } /* Annotation */
code span.at { } /* Attribute */
code span.bn { color: #dca3a3; } /* BaseN */
code span.bu { } /* BuiltIn */
code span.cf { color: #f0dfaf; } /* ControlFlow */
code span.ch { color: #dca3a3; } /* Char */
code span.cn { color: #dca3a3; font-weight: bold; } /* Constant */
code span.co { color: #7f9f7f; } /* Comment */
code span.cv { color: #7f9f7f; font-weight: bold; } /* CommentVar */
code span.do { color: #7f9f7f; } /* Documentation */
code span.dt { color: #dfdfbf; } /* DataType */
code span.dv { color: #dcdccc; } /* DecVal */
code span.er { color: #c3bf9f; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #c0bed1; } /* Float */
code span.fu { color: #efef8f; } /* Function */
code span.im { } /* Import */
code span.in { color: #7f9f7f; font-weight: bold; } /* Information */
code span.kw { color: #f0dfaf; } /* Keyword */
code span.op { color: #f0efd0; } /* Operator */
code span.ot { color: #efef8f; } /* Other */
code span.pp { color: #ffcfaf; font-weight: bold; } /* Preprocessor */
code span.sc { color: #dca3a3; } /* SpecialChar */
code span.ss { color: #cc9393; } /* SpecialString */
code span.st { color: #cc9393; } /* String */
code span.va { } /* Variable */
code span.vs { color: #cc9393; } /* VerbatimString */
code span.wa { color: #7f9f7f; font-weight: bold; } /* Warning */
&lt;/style&gt;

&lt;div id=&#34;TOC&#34;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#plataforma-de-prueba&#34; id=&#34;toc-plataforma-de-prueba&#34;&gt;Plataforma de Prueba&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#instalación-de-dependencias&#34; id=&#34;toc-instalación-de-dependencias&#34;&gt;Instalación de Dependencias&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#instalación-de-quarto&#34; id=&#34;toc-instalación-de-quarto&#34;&gt;Instalación de Quarto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;ACTUALIZACIÓN:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Este artículo ya no es relevante debido a la disponibilidad de compilaciones oficiales de Quarto para la arquitecura arm64. Ahora la instalación es bastante simple:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb1&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb1-1&#34;&gt;&lt;a href=&#34;#cb1-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Descarga el instalador deb&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb1-2&#34;&gt;&lt;a href=&#34;#cb1-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;wget&lt;/span&gt; https://github.com/quarto-dev/quarto-cli/releases/download/v1.3.433/quarto-1.3.433-linux-arm64.deb&lt;/span&gt;
&lt;span id=&#34;cb1-3&#34;&gt;&lt;a href=&#34;#cb1-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Instala Quarto&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb1-4&#34;&gt;&lt;a href=&#34;#cb1-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; dpkg &lt;span class=&#34;at&#34;&gt;-i&lt;/span&gt; quarto-1.3.433-linux-arm64.deb&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Dejaré el artículo anterior abajo como referencia.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Quarto es el nuevo sistema de publicación científica y técnica de código abierto de Posit basado en Pandoc que permite entrelazar texto narrativo y código para producir resultados de alta calidad, incluidos informes, presentaciones, sitios web y más. Es el sucesor del ecosistema R Markdown de gran éxito, pero específico de R, que lleva todos los beneficios de R Markdown a otros lenguajes de programación como Python, Julia y Observable.&lt;/p&gt;
&lt;p&gt;Desafortunadamente, debido a la falta de fuentes oficiales de binarios arm64 para algunas de sus dependencias (por ejemplo, Deno, SASS, Pandoc), y como me explicaron, su ancho de banda limitado para soportar arquitecturas no suficientemente populares como Linux arm64. Quarto no admite oficialmente la arquitectura arm64, pero eso no significa que no podamos hacer que funcione en ella nosotros mismos.&lt;/p&gt;
&lt;p&gt;Con la amable ayuda de Carlos Scheidegger (&lt;a href=&#34;https://mastodon.social/@scheidegger&#34;&gt;&lt;span class=&#34;citation&#34;&gt;@scheidegger&lt;/span&gt;&lt;span class=&#34;citation&#34;&gt;@mastodon.social&lt;/span&gt;&lt;/a&gt;), un ingeniero de software de Posit que trabaja en Quarto, Me las arreglé para instalar Quarto en sistemas arm64 y me gustaría compartir cómo lo hice con la comunidad R.&lt;/p&gt;
&lt;div id=&#34;plataforma-de-prueba&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Plataforma de Prueba&lt;/h2&gt;
&lt;p&gt;Probé esto en Raspberry Pi 3B+ y 4B con Raspberry Pi OS y Ubuntu 22.04 LT, y en una máquina virtual Oracle Ampere Altra con Ubuntu 22.04 LTS, por lo que estoy bastante seguro de que debería funcionar en cualquier sistema arm64, siempre que puedas obtener versiones arm64 adecuadas de las dependencias de Quarto en tu distribución de Linux específica. En todos los casos, comencé con una instalación limpia y actualizada del sistema operativo, así que asegurate de actualizar el tuyo también antes de comenzar.&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb2&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb2-1&#34;&gt;&lt;a href=&#34;#cb2-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; apt update&lt;/span&gt;
&lt;span id=&#34;cb2-2&#34;&gt;&lt;a href=&#34;#cb2-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; apt dist-upgrade&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;instalación-de-dependencias&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Instalación de Dependencias&lt;/h2&gt;
&lt;p&gt;Primero, necesitamos una versión arm64 suficientemente moderna de Pandoc, y dado que la versión que viene con los repositorios deb estándar para su sistema operativo probablemente sea demasiado antigua, es mejor que descarguemos una versión moderna nosotros mismos (esto es muy importante ya que Quarto fallará con versiones anteriores de Pandoc).&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb3&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb3-1&#34;&gt;&lt;a href=&#34;#cb3-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;wget&lt;/span&gt; https://github.com/jgm/pandoc/releases/download/2.19.2/pandoc-2.19.2-1-arm64.deb&lt;/span&gt;
&lt;span id=&#34;cb3-2&#34;&gt;&lt;a href=&#34;#cb3-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; dpkg &lt;span class=&#34;at&#34;&gt;-i&lt;/span&gt; pandoc-2.19.2-1-arm64.deb&lt;/span&gt;
&lt;span id=&#34;cb3-3&#34;&gt;&lt;a href=&#34;#cb3-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;rm&lt;/span&gt; pandoc-2.19.2-1-arm64.deb&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Además, necesitamos R y el paquete R &lt;code&gt;rmarkdown&lt;/code&gt;, pero dado que estás leyendo este artículo en un blog relacionado con R, asumiré que ya tienes R instalado en tu sistema y sabes cómo instalar paquetes R, si no lo sabes, puedes revisar esta &lt;a href=&#34;https://andresrcs.rbind.io/es/2023/02/11/r_on_arm/&#34;&gt;otra publicación&lt;/a&gt; donde detallo opciones para instalar R en una Raspberry Pi. Para aclarar, estoy considerando R como una dependencia porque estoy escribiendo en un blog relacionado con R, pero si vas a usar Quarto con algún otro lenguaje de programación, R no es obligatorio.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;instalación-de-quarto&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Instalación de Quarto&lt;/h1&gt;
&lt;p&gt;Dado que no hay binarios arm64 para Quarto, lo instalaremos desde la fuente. Sigue estos pasos de arriba a abajo sin saltarte ninguno ya que todos dependen del anterior:&lt;/p&gt;
&lt;p&gt;Primero, necesitamos clonar el repositorio de GitHub en una ubicación adecuada. Ten en cuenta que, opcionalmente, puedes clonar una versión de lanzamiento específica si lo prefieres utilizando la opción &lt;code&gt;--branch&lt;/code&gt; (por ejemplo, &lt;code&gt;--branch v1.3.47&lt;/code&gt;)&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb4&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb4-1&#34;&gt;&lt;a href=&#34;#cb4-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; su &lt;span class=&#34;at&#34;&gt;-&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-2&#34;&gt;&lt;a href=&#34;#cb4-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-3&#34;&gt;&lt;a href=&#34;#cb4-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;bu&#34;&gt;cd&lt;/span&gt; /usr/local/src&lt;/span&gt;
&lt;span id=&#34;cb4-4&#34;&gt;&lt;a href=&#34;#cb4-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-5&#34;&gt;&lt;a href=&#34;#cb4-5&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;git&lt;/span&gt; clone &lt;span class=&#34;at&#34;&gt;--depth&lt;/span&gt; 1 https://github.com/quarto-dev/quarto-cli&lt;/span&gt;
&lt;span id=&#34;cb4-6&#34;&gt;&lt;a href=&#34;#cb4-6&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-7&#34;&gt;&lt;a href=&#34;#cb4-7&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;bu&#34;&gt;cd&lt;/span&gt; quarto-cli&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A continuación, vamos a engañar a Quarto para que instale una versión arm64 de Deno desde una &lt;a href=&#34;https://github.com/LukeChannings/deno-arm64&#34;&gt;fuente alternativa&lt;/a&gt; modificando su archivo &lt;code&gt;configure.sh&lt;/code&gt; antes de ejecutarlo.&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb5&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb5-1&#34;&gt;&lt;a href=&#34;#cb5-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sed&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-i&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;s/https:\/\/github.com\/denoland\/deno\/releases\/download/https:\/\/github.com\/LukeChannings\/deno-arm64\/releases\/download/&amp;#39;&lt;/span&gt; configure.sh&lt;/span&gt;
&lt;span id=&#34;cb5-2&#34;&gt;&lt;a href=&#34;#cb5-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sed&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-i&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;s/DENOFILES=deno-x86_64-unknown-linux-gnu.zip/DENOFILES=deno-linux-arm64.zip/&amp;#39;&lt;/span&gt; package/scripts/common/utils.sh&lt;/span&gt;
&lt;span id=&#34;cb5-3&#34;&gt;&lt;a href=&#34;#cb5-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sed&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-i&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;s/DENO_DIR=deno-x86_64-unknown-linux-gnu/DENO_DIR=deno-linux-arm64/&amp;#39;&lt;/span&gt; package/scripts/common/utils.sh&lt;/span&gt;
&lt;span id=&#34;cb5-4&#34;&gt;&lt;a href=&#34;#cb5-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-5&#34;&gt;&lt;a href=&#34;#cb5-5&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;./configure.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Finalmente, vamos a reemplazar los binarios externos amd64 que Quarto descarga durante la instalación con binarios arm64.&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb6&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb6-1&#34;&gt;&lt;a href=&#34;#cb6-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;mkdir&lt;/span&gt; package/dist/bin/tools/deno-x86_64-unknown-linux-gnu/&lt;/span&gt;
&lt;span id=&#34;cb6-2&#34;&gt;&lt;a href=&#34;#cb6-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;ln&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-s&lt;/span&gt; /usr/local/src/quarto-cli/package/dist/bin/tools/deno-linux-arm64/deno package/dist/bin/tools/deno-x86_64-unknown-linux-gnu/deno&lt;/span&gt;
&lt;span id=&#34;cb6-3&#34;&gt;&lt;a href=&#34;#cb6-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-4&#34;&gt;&lt;a href=&#34;#cb6-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;rm&lt;/span&gt; package/dist/bin/tools/pandoc&lt;/span&gt;
&lt;span id=&#34;cb6-5&#34;&gt;&lt;a href=&#34;#cb6-5&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;ln&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-s&lt;/span&gt; /usr/bin/pandoc package/dist/bin/tools/pandoc&lt;/span&gt;
&lt;span id=&#34;cb6-6&#34;&gt;&lt;a href=&#34;#cb6-6&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-7&#34;&gt;&lt;a href=&#34;#cb6-7&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;rm&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-rf&lt;/span&gt; package/dist/bin/tools/dart-sass/&lt;/span&gt;
&lt;span id=&#34;cb6-8&#34;&gt;&lt;a href=&#34;#cb6-8&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;wget&lt;/span&gt; https://github.com/sass/dart-sass/releases/download/1.57.1/dart-sass-1.57.1-linux-arm64.tar.gz&lt;/span&gt;
&lt;span id=&#34;cb6-9&#34;&gt;&lt;a href=&#34;#cb6-9&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;tar&lt;/span&gt; zxvf dart-sass-1.57.1-linux-arm64.tar.gz&lt;/span&gt;
&lt;span id=&#34;cb6-10&#34;&gt;&lt;a href=&#34;#cb6-10&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;rm&lt;/span&gt; dart-sass-1.57.1-linux-arm64.tar.gz&lt;/span&gt;
&lt;span id=&#34;cb6-11&#34;&gt;&lt;a href=&#34;#cb6-11&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;mv&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-f&lt;/span&gt; dart-sass/ package/dist/bin/tools/&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si todo salió bien, ahora tienes una instalación funcional de la interfaz de línea de comandos de Quarto en tu sistema, y puedes comenzar a renderizar archivos &lt;code&gt;qmd&lt;/code&gt; desde la terminal. Para probar si realmente funciona, rendericemos un documento de prueba; crea un archivo &lt;code&gt;test.qmd&lt;/code&gt; con el siguiente contenido:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb7&#34;&gt;&lt;pre class=&#34;sourceCode markdown&#34;&gt;&lt;code class=&#34;sourceCode markdown&#34;&gt;&lt;span id=&#34;cb7-1&#34;&gt;&lt;a href=&#34;#cb7-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb7-2&#34;&gt;&lt;a href=&#34;#cb7-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;an&#34;&gt;title:&lt;/span&gt;&lt;span class=&#34;co&#34;&gt; &amp;quot;Test Document&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb7-3&#34;&gt;&lt;a href=&#34;#cb7-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;an&#34;&gt;format:&lt;/span&gt;&lt;span class=&#34;co&#34;&gt; html&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb7-4&#34;&gt;&lt;a href=&#34;#cb7-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb7-5&#34;&gt;&lt;a href=&#34;#cb7-5&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb7-6&#34;&gt;&lt;a href=&#34;#cb7-6&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;## Hello&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb7-7&#34;&gt;&lt;a href=&#34;#cb7-7&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb7-8&#34;&gt;&lt;a href=&#34;#cb7-8&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;in&#34;&gt;```{r}&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb7-9&#34;&gt;&lt;a href=&#34;#cb7-9&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;in&#34;&gt;print(&amp;quot;world&amp;quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb7-10&#34;&gt;&lt;a href=&#34;#cb7-10&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;in&#34;&gt;```&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Y renderiza el documento desde una terminal del sistema con el siguiente comando:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb8&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb8-1&#34;&gt;&lt;a href=&#34;#cb8-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;quarto&lt;/span&gt; render test.qmd&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si todo va bien, obtendrás un archivo &lt;code&gt;test.html&lt;/code&gt; en la ubicación actual.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://andresrcs.rbind.io/post/2022-12-09-quarto_arm64.en_files/test_html.jpg&#34; width=&#34;700&#34; height=&#34;350&#34; /&gt;&lt;/p&gt;
&lt;p&gt;No he descubierto cómo habilitar la integración de RStudio IDE con Quarto (las compilaciones experimentales de RStudio para arm64 vienen con las funciones de integración con Quarto deshabilitadas). He planteado la pregunta en el repositorio de GitHub y actualizaré esta publicación si surge una solución.&lt;/p&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Instalando tu propio Servidor Shiny y RStudio en una Raspberry Pi</title>
      <link>https://andresrcs.rbind.io/es/2022/09/05/shiny_rstudio_server/</link>
      <pubDate>Mon, 05 Sep 2022 00:00:00 +0000</pubDate>
      
      <guid>https://andresrcs.rbind.io/es/2022/09/05/shiny_rstudio_server/</guid>
      <description>
&lt;style type=&#34;text/css&#34;&gt;
html { -webkit-text-size-adjust: 100%; }
pre &gt; code.sourceCode { white-space: pre; position: relative; }
pre &gt; code.sourceCode &gt; span { display: inline-block; line-height: 1.25; }
pre &gt; code.sourceCode &gt; span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode &gt; span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre &gt; code.sourceCode { white-space: pre-wrap; }
pre &gt; code.sourceCode &gt; span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
  { counter-reset: source-line 0; }
pre.numberSource code &gt; span
  { position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code &gt; span &gt; a:first-child::before
  { content: counter(source-line);
    position: relative; left: -1em; text-align: right; vertical-align: baseline;
    border: none; display: inline-block;
    -webkit-touch-callout: none; -webkit-user-select: none;
    -khtml-user-select: none; -moz-user-select: none;
    -ms-user-select: none; user-select: none;
    padding: 0 4px; width: 4em;
  }
pre.numberSource { margin-left: 3em;  padding-left: 4px; }
div.sourceCode
  { color: #cccccc; background-color: #303030; }
@media screen {
pre &gt; code.sourceCode &gt; span &gt; a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ffcfaf; } /* Alert */
code span.an { color: #7f9f7f; font-weight: bold; } /* Annotation */
code span.at { } /* Attribute */
code span.bn { color: #dca3a3; } /* BaseN */
code span.bu { } /* BuiltIn */
code span.cf { color: #f0dfaf; } /* ControlFlow */
code span.ch { color: #dca3a3; } /* Char */
code span.cn { color: #dca3a3; font-weight: bold; } /* Constant */
code span.co { color: #7f9f7f; } /* Comment */
code span.cv { color: #7f9f7f; font-weight: bold; } /* CommentVar */
code span.do { color: #7f9f7f; } /* Documentation */
code span.dt { color: #dfdfbf; } /* DataType */
code span.dv { color: #dcdccc; } /* DecVal */
code span.er { color: #c3bf9f; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #c0bed1; } /* Float */
code span.fu { color: #efef8f; } /* Function */
code span.im { } /* Import */
code span.in { color: #7f9f7f; font-weight: bold; } /* Information */
code span.kw { color: #f0dfaf; } /* Keyword */
code span.op { color: #f0efd0; } /* Operator */
code span.ot { color: #efef8f; } /* Other */
code span.pp { color: #ffcfaf; font-weight: bold; } /* Preprocessor */
code span.sc { color: #dca3a3; } /* SpecialChar */
code span.ss { color: #cc9393; } /* SpecialString */
code span.st { color: #cc9393; } /* String */
code span.va { } /* Variable */
code span.vs { color: #cc9393; } /* VerbatimString */
code span.wa { color: #7f9f7f; font-weight: bold; } /* Warning */
&lt;/style&gt;

&lt;div id=&#34;TOC&#34;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#preparando-la-raspberry-pi&#34; id=&#34;toc-preparando-la-raspberry-pi&#34;&gt;Preparando la Raspberry Pi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#instalar-r&#34; id=&#34;toc-instalar-r&#34;&gt;Instalar R&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#instalar-shiny-server&#34; id=&#34;toc-instalar-shiny-server&#34;&gt;Instalar Shiny Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#instala-rstudio-server&#34; id=&#34;toc-instala-rstudio-server&#34;&gt;Instala RStudio Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#instalar-servicios-de-soporte-adicionales-opcional&#34; id=&#34;toc-instalar-servicios-de-soporte-adicionales-opcional&#34;&gt;Instalar Servicios de Soporte Adicionales (opcional)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#pasos-adicionales-opcional&#34; id=&#34;toc-pasos-adicionales-opcional&#34;&gt;Pasos Adicionales (opcional)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#comentarios-finales&#34; id=&#34;toc-comentarios-finales&#34;&gt;Comentarios finales&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;Este artículo se publicó originalmente en 2018 y muchas cosas han cambiado desde entonces, por lo que lo reescribí por completo para tener en cuenta los avances más recientes en la compatibilidad con la arquitectura arm64 dentro del ecosistema R.&lt;/p&gt;
&lt;p&gt;En 2018, participé en un tema de foro en &lt;a href=&#34;https://forum.posit.co/t/raspberry-pi-as-a-viable-shiny-server/18672?u=andresrcs&#34;&gt;Posit Community&lt;/a&gt; donde &lt;a href=&#34;https://twitter.com/jladata&#34;&gt;@jladata&lt;/a&gt; preguntaba si una Raspberry Pi 3B+ podría convertirse en un servidor Shiny viable. De hecho, yo uso una Raspberry Pi para ese mismo propósito, así que decidí compartir con la comunidad R mi experiencia al configurar Shiny y Rstudio Server de forma nativa en una Raspberry Pi.&lt;/p&gt;
&lt;p&gt;En esos días había casi &lt;strong&gt;cero soporte para arquitecturas ARM&lt;/strong&gt; (ya sea x32 o x64), por lo que la mayor parte del software tenía que compilarse desde la fuente en la misma Pi, lo que hace que el proceso de instalación sea un esfuerzo titánico con muchisimas horas de espera.&lt;/p&gt;
&lt;p&gt;Hoy en día, las cosas han cambiado y tenemos un mejor soporte para la arquitectura arm64 debido a los esfuerzos de la comunidad e incluso soporte oficial de RStudio en proceso. En este renovado artículo, te guiaré a través de las opciones de instalación que tenemos disponibles actualmente.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;✏️ También tengo un &lt;a href=&#34;https://andresrcs.rbind.io/es/2021/01/13/raspberry_pi_server/&#34;&gt;artículo relacionado&lt;/a&gt; que muestra cómo automatizar el proceso de instalación usando Ansible.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div id=&#34;preparando-la-raspberry-pi&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Preparando la Raspberry Pi&lt;/h2&gt;
&lt;p&gt;Primero, necesitas un sistema operativo de 64 bits para tu Pi (asegúrate de que sea de 64 bits ya que RStudio solo es compatible con la arquitectura arm64), estas instrucciones de instalación funcionan tanto para Raspberry Pi OS como para Ubuntu, puedes descargar cualquiera de los dos usando el software Raspberry Pi Imager (&lt;a href=&#34;https://www.raspberrypi.com/software/&#34;&gt;sitio oficial&lt;/a&gt;). También, asegúrate de actualizar las bibliotecas de tu sistema con &lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt dist-upgrade&lt;/code&gt; antes de comenzar.&lt;/p&gt;
&lt;p&gt;Aunque no es obligatorio, recomiendo realizar las siguientes acciones utilizando la aplicación &lt;code&gt;sudo raspi-config&lt;/code&gt; (en Ubuntu, primero debes instalarla con &lt;code&gt;sudo apt install raspi-config&lt;/code&gt;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Expandir el sistema de archivos (Advanced Options / Expand Filesystem).&lt;/li&gt;
&lt;li&gt;Definir tu configuración regional, asegúrate de elegir una opción UTF.8 para evitar problemas de compilación (Localisation Options / Locale).&lt;/li&gt;
&lt;li&gt;Deshabilitar “Interfaces de red predecibles” (Advanced Options / Network Interface Names).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A continuación, debes configurar una IP estática para que puedas encontrar la Pi fácilmente en tu red.&lt;/p&gt;
&lt;p&gt;Para configurar una IP estática en Raspberry Pi OS, ejecuta estos comandos. Esta es una configuración de IP de muestra para una conexión por cable, modificala de acuerdo a tus propias necesidades:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb1&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb1-1&#34;&gt;&lt;a href=&#34;#cb1-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Configuración IP de muestra:&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb1-2&#34;&gt;&lt;a href=&#34;#cb1-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; nmcli c mod &lt;span class=&#34;st&#34;&gt;&amp;#39;Wired connection 1&amp;#39;&lt;/span&gt; ipv4.addresses 192.168.1.101/24 ipv4.method manual&lt;/span&gt;
&lt;span id=&#34;cb1-3&#34;&gt;&lt;a href=&#34;#cb1-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; nmcli con mod &lt;span class=&#34;st&#34;&gt;&amp;#39;Wired connection 1&amp;#39;&lt;/span&gt; ipv4.gateway 192.168.1.1&lt;/span&gt;
&lt;span id=&#34;cb1-4&#34;&gt;&lt;a href=&#34;#cb1-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; nmcli con mod &lt;span class=&#34;st&#34;&gt;&amp;#39;Wired connection 1&amp;#39;&lt;/span&gt; ipv4.dns &lt;span class=&#34;st&#34;&gt;&amp;quot;192.168.1.1&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb1-5&#34;&gt;&lt;a href=&#34;#cb1-5&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; nmcli c down &lt;span class=&#34;st&#34;&gt;&amp;#39;Wired connection 1&amp;#39;&lt;/span&gt; &lt;span class=&#34;kw&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; nmcli c up &lt;span class=&#34;st&#34;&gt;&amp;#39;Wired connection 1&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Y para configurar la IP en Ubuntu, debes crear este archivo, &lt;code&gt;sudo nano /etc/netplan/01-netcfg.yaml&lt;/code&gt;, agregar este contenido (edítalo según sea necesario) y aplicar la configuración con este comando, &lt;code&gt;sudo netplan apply&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb2&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb2-1&#34;&gt;&lt;a href=&#34;#cb2-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;network:&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-2&#34;&gt;&lt;a href=&#34;#cb2-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;version:&lt;/span&gt; 2&lt;/span&gt;
&lt;span id=&#34;cb2-3&#34;&gt;&lt;a href=&#34;#cb2-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;renderer:&lt;/span&gt; networkd&lt;/span&gt;
&lt;span id=&#34;cb2-4&#34;&gt;&lt;a href=&#34;#cb2-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;ethernets:&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-5&#34;&gt;&lt;a href=&#34;#cb2-5&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;eth0:&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-6&#34;&gt;&lt;a href=&#34;#cb2-6&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            &lt;span class=&#34;ex&#34;&gt;dhcp4:&lt;/span&gt; false&lt;/span&gt;
&lt;span id=&#34;cb2-7&#34;&gt;&lt;a href=&#34;#cb2-7&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            &lt;span class=&#34;ex&#34;&gt;addresses:&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-8&#34;&gt;&lt;a href=&#34;#cb2-8&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; 192.168.1.101/24&lt;/span&gt;
&lt;span id=&#34;cb2-9&#34;&gt;&lt;a href=&#34;#cb2-9&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            &lt;span class=&#34;ex&#34;&gt;nameservers:&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-10&#34;&gt;&lt;a href=&#34;#cb2-10&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                &lt;span class=&#34;ex&#34;&gt;addresses:&lt;/span&gt; [8.8.8.8, 8.8.4.4, 192.168.1.1]&lt;/span&gt;
&lt;span id=&#34;cb2-11&#34;&gt;&lt;a href=&#34;#cb2-11&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            &lt;span class=&#34;ex&#34;&gt;routes:&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-12&#34;&gt;&lt;a href=&#34;#cb2-12&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; to: default&lt;/span&gt;
&lt;span id=&#34;cb2-13&#34;&gt;&lt;a href=&#34;#cb2-13&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                  &lt;span class=&#34;ex&#34;&gt;via:&lt;/span&gt; 192.168.1.1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En caso de que tengas un modelo de Raspberry Pi con poca RAM, debes agregar algo de memoria sawp para el proceso de instalación. Para los modelos Pi de 1 GB, 3 GB de sawp serían suficientes, puedes hacerlo con estos comandos:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb3&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb3-1&#34;&gt;&lt;a href=&#34;#cb3-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=3072&lt;/span&gt;
&lt;span id=&#34;cb3-2&#34;&gt;&lt;a href=&#34;#cb3-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; chmod 600 /var/swap.1&lt;/span&gt;
&lt;span id=&#34;cb3-3&#34;&gt;&lt;a href=&#34;#cb3-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; /sbin/mkswap /var/swap.1&lt;/span&gt;
&lt;span id=&#34;cb3-4&#34;&gt;&lt;a href=&#34;#cb3-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; /sbin/swapon /var/swap.1&lt;/span&gt;
&lt;span id=&#34;cb3-5&#34;&gt;&lt;a href=&#34;#cb3-5&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; sh &lt;span class=&#34;at&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;echo &amp;quot;/var/swap.1 swap swap defaults 0 0 &amp;quot; &amp;gt;&amp;gt; /etc/fstab&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Para evitar el uso innecesario de la memoria swap y proteger tu tarjeta SD, abre este archivo, &lt;code&gt;sudo nano /etc/sysctl.conf&lt;/code&gt;, y agrega esta línea al final:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb4&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb4-1&#34;&gt;&lt;a href=&#34;#cb4-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;vm.swappiness=10&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;instalar-r&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Instalar R&lt;/h2&gt;
&lt;p&gt;Tienes varias opciones para instalar R en tu Pi:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Instalar desde los repositorios del Sistema Operativo (No recomendado)&lt;/li&gt;
&lt;li&gt;Compilar R desde la fuente&lt;/li&gt;
&lt;li&gt;Instalar R usando rig&lt;/li&gt;
&lt;li&gt;Instalar R desde el Proyecto R4Pi&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Como ahora hay varias opciones, he movido esta sección a un artículo aparte que puedes consultar &lt;a href=&#34;https://andresrcs.rbind.io/es/2023/02/11/r_on_arm/&#34;&gt;aquí&lt;/a&gt; para obtener más detalles.&lt;/p&gt;
&lt;p&gt;Siempre que sea posible (con un sistema operativo compatible), recomiendo usar el repositorio de paquetes de &lt;a href=&#34;https://r4pi.org/es/&#34;&gt;R4Pi&lt;/a&gt; como tu fuente de paquetes R, ya que proporciona archivos binarios precompilados que hacen que la instalación sea más fácil y rápida.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;instalar-shiny-server&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Instalar Shiny Server&lt;/h2&gt;
&lt;p&gt;Actualmente, &lt;code&gt;shiny-server&lt;/code&gt; no ofrece compatibilidad con ARM, por lo que la única opción para instalarlo en una Pi es compilar desde la fuente. Hay esperanza de que esto cambie en el futuro según la respuesta a este &lt;a href=&#34;https://github.com/rstudio/shiny-server/issues/532#issuecomment-1223282001&#34;&gt;GitHub Issue&lt;/a&gt;, pero por el momento estamos atrapado con esto.&lt;/p&gt;
&lt;p&gt;Primero, debes instalar las dependencias de paquetes R, si estás utilizando un repositorio CRAN, esto llevará un tiempo, pero es mucho más rápido si estás utilizando el repositorio R4Pi (disponible con R instalado desde R4Pi):&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb5&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb5-1&#34;&gt;&lt;a href=&#34;#cb5-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Define tu repositorio de paquetes R (Debes escoger uno de estos)&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-2&#34;&gt;&lt;a href=&#34;#cb5-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# REPO=&amp;quot;&amp;#39;http://cran.rstudio.com/&amp;#39;&amp;quot; # Para sistemas operativos no compatibles con los binarios compilados para RPi OS (basada en Debian 12)&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-3&#34;&gt;&lt;a href=&#34;#cb5-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# REPO=&amp;quot;c(&amp;#39;https://pkgs.r4pi.org/noble&amp;#39;, &amp;#39;http://cran.rstudio.com/&amp;#39;)&amp;quot; # Para Ubuntu 24.04&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-4&#34;&gt;&lt;a href=&#34;#cb5-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;va&#34;&gt;REPO&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;&amp;quot;c(&amp;#39;https://pkgs.r4pi.org/bookworm&amp;#39;, &amp;#39;http://cran.rstudio.com/&amp;#39;)&amp;quot;&lt;/span&gt; &lt;span class=&#34;co&#34;&gt;# Para la versión de RPi OS más reciente (basada en Debian 12)&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-5&#34;&gt;&lt;a href=&#34;#cb5-5&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-6&#34;&gt;&lt;a href=&#34;#cb5-6&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Asegúrate de que las dependencias del sistema estén instaladas&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-7&#34;&gt;&lt;a href=&#34;#cb5-7&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; apt install libcairo2-dev libxt-dev git cmake pandoc&lt;/span&gt;
&lt;span id=&#34;cb5-8&#34;&gt;&lt;a href=&#34;#cb5-8&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-9&#34;&gt;&lt;a href=&#34;#cb5-9&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Instala los paquetes R requeridos como sudo&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-10&#34;&gt;&lt;a href=&#34;#cb5-10&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; su &lt;span class=&#34;at&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;R -e &lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;install.packages(&amp;#39;Rcpp&amp;#39;, repos=&lt;/span&gt;&lt;span class=&#34;va&#34;&gt;$REPO&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-11&#34;&gt;&lt;a href=&#34;#cb5-11&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; su &lt;span class=&#34;at&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;R -e &lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;install.packages(&amp;#39;later&amp;#39;, repos=&lt;/span&gt;&lt;span class=&#34;va&#34;&gt;$REPO&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-12&#34;&gt;&lt;a href=&#34;#cb5-12&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; su &lt;span class=&#34;at&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;R -e &lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;install.packages(&amp;#39;fs&amp;#39;, repos=&lt;/span&gt;&lt;span class=&#34;va&#34;&gt;$REPO&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-13&#34;&gt;&lt;a href=&#34;#cb5-13&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; su &lt;span class=&#34;at&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;R -e &lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;install.packages(&amp;#39;R6&amp;#39;, repos=&lt;/span&gt;&lt;span class=&#34;va&#34;&gt;$REPO&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-14&#34;&gt;&lt;a href=&#34;#cb5-14&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; su &lt;span class=&#34;at&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;R -e &lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;install.packages(&amp;#39;Cairo&amp;#39;, repos=&lt;/span&gt;&lt;span class=&#34;va&#34;&gt;$REPO&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-15&#34;&gt;&lt;a href=&#34;#cb5-15&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; su &lt;span class=&#34;at&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;R -e &lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;install.packages(&amp;#39;httpuv&amp;#39;, repos=&lt;/span&gt;&lt;span class=&#34;va&#34;&gt;$REPO&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-16&#34;&gt;&lt;a href=&#34;#cb5-16&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; su &lt;span class=&#34;at&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;R -e &lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;install.packages(&amp;#39;mime&amp;#39;, repos=&lt;/span&gt;&lt;span class=&#34;va&#34;&gt;$REPO&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-17&#34;&gt;&lt;a href=&#34;#cb5-17&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; su &lt;span class=&#34;at&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;R -e &lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;install.packages(&amp;#39;jsonlite&amp;#39;, repos=&lt;/span&gt;&lt;span class=&#34;va&#34;&gt;$REPO&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-18&#34;&gt;&lt;a href=&#34;#cb5-18&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; su &lt;span class=&#34;at&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;R -e &lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;install.packages(&amp;#39;digest&amp;#39;, repos=&lt;/span&gt;&lt;span class=&#34;va&#34;&gt;$REPO&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-19&#34;&gt;&lt;a href=&#34;#cb5-19&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; su &lt;span class=&#34;at&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;R -e &lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;install.packages(&amp;#39;htmltools&amp;#39;, repos=&lt;/span&gt;&lt;span class=&#34;va&#34;&gt;$REPO&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-20&#34;&gt;&lt;a href=&#34;#cb5-20&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; su &lt;span class=&#34;at&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;R -e &lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;install.packages(&amp;#39;xtable&amp;#39;, repos=&lt;/span&gt;&lt;span class=&#34;va&#34;&gt;$REPO&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-21&#34;&gt;&lt;a href=&#34;#cb5-21&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; su &lt;span class=&#34;at&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;R -e &lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;install.packages(&amp;#39;sourcetools&amp;#39;, repos=&lt;/span&gt;&lt;span class=&#34;va&#34;&gt;$REPO&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-22&#34;&gt;&lt;a href=&#34;#cb5-22&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; su &lt;span class=&#34;at&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;R -e &lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;install.packages(&amp;#39;shiny&amp;#39;, repos=&lt;/span&gt;&lt;span class=&#34;va&#34;&gt;$REPO&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-23&#34;&gt;&lt;a href=&#34;#cb5-23&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; su &lt;span class=&#34;at&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;R -e &lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;install.packages(&amp;#39;rmarkdown&amp;#39;, repos=&lt;/span&gt;&lt;span class=&#34;va&#34;&gt;$REPO&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;dt&#34;&gt;\&amp;quot;&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;✏️ Es necesario instalar los paquetes de R como sudo para que shiny-server pueda usarlos, no instales estos paquetes desde la consola de R usando tu usuario habitual.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ahora, puedes instalar shiny-server con estos comandos:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb6&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb6-1&#34;&gt;&lt;a href=&#34;#cb6-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Descarga el código fuente de la última versión shiny-server desde GitHub&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-2&#34;&gt;&lt;a href=&#34;#cb6-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;git&lt;/span&gt; clone &lt;span class=&#34;at&#34;&gt;--depth&lt;/span&gt; 1 &lt;span class=&#34;at&#34;&gt;--branch&lt;/span&gt; v1.5.23.1030 https://github.com/rstudio/shiny-server.git&lt;/span&gt;
&lt;span id=&#34;cb6-3&#34;&gt;&lt;a href=&#34;#cb6-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-4&#34;&gt;&lt;a href=&#34;#cb6-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Compila el código fuente&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-5&#34;&gt;&lt;a href=&#34;#cb6-5&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;bu&#34;&gt;cd&lt;/span&gt; shiny-server&lt;/span&gt;
&lt;span id=&#34;cb6-6&#34;&gt;&lt;a href=&#34;#cb6-6&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;va&#34;&gt;DIR&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kw&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;bu&#34;&gt;pwd&lt;/span&gt;&lt;span class=&#34;kw&#34;&gt;`&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-7&#34;&gt;&lt;a href=&#34;#cb6-7&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;va&#34;&gt;PATH&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;va&#34;&gt;$DIR&lt;/span&gt;/bin:&lt;span class=&#34;va&#34;&gt;$PATH&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-8&#34;&gt;&lt;a href=&#34;#cb6-8&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;mkdir&lt;/span&gt; tmp&lt;/span&gt;
&lt;span id=&#34;cb6-9&#34;&gt;&lt;a href=&#34;#cb6-9&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;bu&#34;&gt;cd&lt;/span&gt; tmp&lt;/span&gt;
&lt;span id=&#34;cb6-10&#34;&gt;&lt;a href=&#34;#cb6-10&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;va&#34;&gt;PYTHON&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kw&#34;&gt;`&lt;/span&gt;&lt;span class=&#34;fu&#34;&gt;which&lt;/span&gt; python&lt;span class=&#34;kw&#34;&gt;`&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-11&#34;&gt;&lt;a href=&#34;#cb6-11&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; cmake &lt;span class=&#34;at&#34;&gt;-DCMAKE_INSTALL_PREFIX&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;=&lt;/span&gt;/usr/local &lt;span class=&#34;at&#34;&gt;-DPYTHON&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;va&#34;&gt;$PYTHON&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;&amp;quot;&lt;/span&gt; ../&lt;/span&gt;
&lt;span id=&#34;cb6-12&#34;&gt;&lt;a href=&#34;#cb6-12&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; make&lt;/span&gt;
&lt;span id=&#34;cb6-13&#34;&gt;&lt;a href=&#34;#cb6-13&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;mkdir&lt;/span&gt; ../build&lt;/span&gt;
&lt;span id=&#34;cb6-14&#34;&gt;&lt;a href=&#34;#cb6-14&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-15&#34;&gt;&lt;a href=&#34;#cb6-15&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Instala node&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-16&#34;&gt;&lt;a href=&#34;#cb6-16&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;kw&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bu&#34;&gt;cd&lt;/span&gt; .. &lt;span class=&#34;kw&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; ./external/node/install-node.sh&lt;span class=&#34;kw&#34;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-17&#34;&gt;&lt;a href=&#34;#cb6-17&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;kw&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bu&#34;&gt;cd&lt;/span&gt; .. &lt;span class=&#34;kw&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;ex&#34;&gt;./bin/npm&lt;/span&gt; ci &lt;span class=&#34;at&#34;&gt;--omit-dev&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;--python&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;va&#34;&gt;${PYTHON}&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&#34;kw&#34;&gt;)&lt;/span&gt; &lt;/span&gt;
&lt;span id=&#34;cb6-18&#34;&gt;&lt;a href=&#34;#cb6-18&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-19&#34;&gt;&lt;a href=&#34;#cb6-19&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Instala shiny-server&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-20&#34;&gt;&lt;a href=&#34;#cb6-20&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; make install&lt;/span&gt;
&lt;span id=&#34;cb6-21&#34;&gt;&lt;a href=&#34;#cb6-21&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-22&#34;&gt;&lt;a href=&#34;#cb6-22&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Configura shiny-server&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-23&#34;&gt;&lt;a href=&#34;#cb6-23&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; mkdir &lt;span class=&#34;at&#34;&gt;-p&lt;/span&gt; /etc/shiny-server&lt;/span&gt;
&lt;span id=&#34;cb6-24&#34;&gt;&lt;a href=&#34;#cb6-24&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; cp ../config/default.config /etc/shiny-server/shiny-server.conf&lt;/span&gt;
&lt;span id=&#34;cb6-25&#34;&gt;&lt;a href=&#34;#cb6-25&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;bu&#34;&gt;cd&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-26&#34;&gt;&lt;a href=&#34;#cb6-26&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; rm &lt;span class=&#34;at&#34;&gt;-rf&lt;/span&gt; shiny-server&lt;/span&gt;
&lt;span id=&#34;cb6-27&#34;&gt;&lt;a href=&#34;#cb6-27&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; ln &lt;span class=&#34;at&#34;&gt;-s&lt;/span&gt; /usr/local/shiny-server/bin/shiny-server /usr/bin/shiny-server&lt;/span&gt;
&lt;span id=&#34;cb6-28&#34;&gt;&lt;a href=&#34;#cb6-28&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; useradd &lt;span class=&#34;at&#34;&gt;-r&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-m&lt;/span&gt; shiny&lt;/span&gt;
&lt;span id=&#34;cb6-29&#34;&gt;&lt;a href=&#34;#cb6-29&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; mkdir &lt;span class=&#34;at&#34;&gt;-p&lt;/span&gt; /var/log/shiny-server&lt;/span&gt;
&lt;span id=&#34;cb6-30&#34;&gt;&lt;a href=&#34;#cb6-30&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; mkdir &lt;span class=&#34;at&#34;&gt;-p&lt;/span&gt; /srv/shiny-server&lt;/span&gt;
&lt;span id=&#34;cb6-31&#34;&gt;&lt;a href=&#34;#cb6-31&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; mkdir &lt;span class=&#34;at&#34;&gt;-p&lt;/span&gt; /var/lib/shiny-server&lt;/span&gt;
&lt;span id=&#34;cb6-32&#34;&gt;&lt;a href=&#34;#cb6-32&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; chown shiny /var/log/shiny-server&lt;/span&gt;
&lt;span id=&#34;cb6-33&#34;&gt;&lt;a href=&#34;#cb6-33&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-34&#34;&gt;&lt;a href=&#34;#cb6-34&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Edita el archivo shiny-server.service&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-35&#34;&gt;&lt;a href=&#34;#cb6-35&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; nano /etc/systemd/system/shiny-server.service &lt;/span&gt;
&lt;span id=&#34;cb6-36&#34;&gt;&lt;a href=&#34;#cb6-36&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;co&#34;&gt;# Pega el siguiente contenido&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-37&#34;&gt;&lt;a href=&#34;#cb6-37&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;/span&gt;
&lt;span id=&#34;cb6-38&#34;&gt;&lt;a href=&#34;#cb6-38&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;[Unit]&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-39&#34;&gt;&lt;a href=&#34;#cb6-39&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;va&#34;&gt;Description&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;=&lt;/span&gt;ShinyServer&lt;/span&gt;
&lt;span id=&#34;cb6-40&#34;&gt;&lt;a href=&#34;#cb6-40&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-41&#34;&gt;&lt;a href=&#34;#cb6-41&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;[Service]&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-42&#34;&gt;&lt;a href=&#34;#cb6-42&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;va&#34;&gt;Type&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;=&lt;/span&gt;simple&lt;/span&gt;
&lt;span id=&#34;cb6-43&#34;&gt;&lt;a href=&#34;#cb6-43&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;va&#34;&gt;ExecStart&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;=&lt;/span&gt;/usr/bin/env &lt;span class=&#34;fu&#34;&gt;bash&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-c&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;exec /usr/local/shiny-server/bin/shiny-server &amp;gt;&amp;gt;     /var/log/shiny-server.log 2&amp;gt;&amp;amp;1&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-44&#34;&gt;&lt;a href=&#34;#cb6-44&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;va&#34;&gt;KillMode&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;=&lt;/span&gt;process&lt;/span&gt;
&lt;span id=&#34;cb6-45&#34;&gt;&lt;a href=&#34;#cb6-45&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;va&#34;&gt;ExecReload&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;=&lt;/span&gt;/usr/bin/env &lt;span class=&#34;bu&#34;&gt;kill&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-HUP&lt;/span&gt; &lt;span class=&#34;va&#34;&gt;$MAINPID&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-46&#34;&gt;&lt;a href=&#34;#cb6-46&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;va&#34;&gt;ExecStopPost&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;=&lt;/span&gt;/usr/bin/env &lt;span class=&#34;fu&#34;&gt;sleep&lt;/span&gt; 5&lt;/span&gt;
&lt;span id=&#34;cb6-47&#34;&gt;&lt;a href=&#34;#cb6-47&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;va&#34;&gt;Restart&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;=&lt;/span&gt;on-failure&lt;/span&gt;
&lt;span id=&#34;cb6-48&#34;&gt;&lt;a href=&#34;#cb6-48&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;va&#34;&gt;RestartSec&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;=&lt;/span&gt;1&lt;/span&gt;
&lt;span id=&#34;cb6-49&#34;&gt;&lt;a href=&#34;#cb6-49&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;va&#34;&gt;StartLimitInterval&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;=&lt;/span&gt;45&lt;/span&gt;
&lt;span id=&#34;cb6-50&#34;&gt;&lt;a href=&#34;#cb6-50&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;va&#34;&gt;StartLimitBurst&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;=&lt;/span&gt;3&lt;/span&gt;
&lt;span id=&#34;cb6-51&#34;&gt;&lt;a href=&#34;#cb6-51&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-52&#34;&gt;&lt;a href=&#34;#cb6-52&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;[Install]&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-53&#34;&gt;&lt;a href=&#34;#cb6-53&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;va&#34;&gt;WantedBy&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;=&lt;/span&gt;multi-user.target&lt;/span&gt;
&lt;span id=&#34;cb6-54&#34;&gt;&lt;a href=&#34;#cb6-54&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-55&#34;&gt;&lt;a href=&#34;#cb6-55&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Edita el archivo shiny-server para logrotate&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-56&#34;&gt;&lt;a href=&#34;#cb6-56&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; nano /etc/logrotate.d/shiny-server &lt;/span&gt;
&lt;span id=&#34;cb6-57&#34;&gt;&lt;a href=&#34;#cb6-57&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;co&#34;&gt;# Pega el siguiente contenido&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-58&#34;&gt;&lt;a href=&#34;#cb6-58&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;/span&gt;
&lt;span id=&#34;cb6-59&#34;&gt;&lt;a href=&#34;#cb6-59&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;/var/log/shiny-server.log&lt;/span&gt; {&lt;/span&gt;
&lt;span id=&#34;cb6-60&#34;&gt;&lt;a href=&#34;#cb6-60&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;ex&#34;&gt;rotate&lt;/span&gt; 12&lt;/span&gt;
&lt;span id=&#34;cb6-61&#34;&gt;&lt;a href=&#34;#cb6-61&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;ex&#34;&gt;copytruncate&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-62&#34;&gt;&lt;a href=&#34;#cb6-62&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;ex&#34;&gt;compress&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-63&#34;&gt;&lt;a href=&#34;#cb6-63&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;ex&#34;&gt;missingok&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-64&#34;&gt;&lt;a href=&#34;#cb6-64&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;fu&#34;&gt;size&lt;/span&gt; 1M&lt;/span&gt;
&lt;span id=&#34;cb6-65&#34;&gt;&lt;a href=&#34;#cb6-65&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;er&#34;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-66&#34;&gt;&lt;a href=&#34;#cb6-66&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-67&#34;&gt;&lt;a href=&#34;#cb6-67&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Establece los permisos para los archivos&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-68&#34;&gt;&lt;a href=&#34;#cb6-68&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; chown root:root /etc/systemd/system/shiny-server.service&lt;/span&gt;
&lt;span id=&#34;cb6-69&#34;&gt;&lt;a href=&#34;#cb6-69&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; chmod 644 /etc/systemd/system/shiny-server.service&lt;/span&gt;
&lt;span id=&#34;cb6-70&#34;&gt;&lt;a href=&#34;#cb6-70&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; chown root:root /etc/logrotate.d/shiny-server&lt;/span&gt;
&lt;span id=&#34;cb6-71&#34;&gt;&lt;a href=&#34;#cb6-71&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; chmod 644 /etc/logrotate.d/shiny-server&lt;/span&gt;
&lt;span id=&#34;cb6-72&#34;&gt;&lt;a href=&#34;#cb6-72&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-73&#34;&gt;&lt;a href=&#34;#cb6-73&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Inicia el servicio&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-74&#34;&gt;&lt;a href=&#34;#cb6-74&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; systemctl daemon-reload&lt;/span&gt;
&lt;span id=&#34;cb6-75&#34;&gt;&lt;a href=&#34;#cb6-75&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; systemctl enable shiny-server&lt;/span&gt;
&lt;span id=&#34;cb6-76&#34;&gt;&lt;a href=&#34;#cb6-76&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; systemctl start shiny-server&lt;/span&gt;
&lt;span id=&#34;cb6-77&#34;&gt;&lt;a href=&#34;#cb6-77&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-78&#34;&gt;&lt;a href=&#34;#cb6-78&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Crea los enlaces simbolicos para pandoc y las aplicaciones de muestra&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-79&#34;&gt;&lt;a href=&#34;#cb6-79&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; ln &lt;span class=&#34;at&#34;&gt;-s&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-f&lt;/span&gt; /usr/bin/pandoc /usr/local/shiny-server/ext/pandoc/pandoc&lt;/span&gt;
&lt;span id=&#34;cb6-80&#34;&gt;&lt;a href=&#34;#cb6-80&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; ln &lt;span class=&#34;at&#34;&gt;-s&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-f&lt;/span&gt; /usr/bin/pandoc-citeproc-preamble /usr/local/shiny-server/ext/pandoc/pandoc-citeproc&lt;/span&gt;
&lt;span id=&#34;cb6-81&#34;&gt;&lt;a href=&#34;#cb6-81&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; ln &lt;span class=&#34;at&#34;&gt;-s&lt;/span&gt; /usr/local/shiny-server/samples/sample-apps /srv/shiny-server/sample-apps&lt;/span&gt;
&lt;span id=&#34;cb6-82&#34;&gt;&lt;a href=&#34;#cb6-82&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; ln &lt;span class=&#34;at&#34;&gt;-s&lt;/span&gt; /usr/local/shiny-server/samples/welcome.html /srv/shiny-server/index.html&lt;/span&gt;
&lt;span id=&#34;cb6-83&#34;&gt;&lt;a href=&#34;#cb6-83&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-84&#34;&gt;&lt;a href=&#34;#cb6-84&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Establece los permisos de usuario adecuados, estoy asumiendo que tu usuario es &amp;quot;pi&amp;quot;, cámbialo si no lo es&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-85&#34;&gt;&lt;a href=&#34;#cb6-85&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; groupadd shiny-apps&lt;/span&gt;
&lt;span id=&#34;cb6-86&#34;&gt;&lt;a href=&#34;#cb6-86&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; usermod &lt;span class=&#34;at&#34;&gt;-aG&lt;/span&gt; shiny-apps pi&lt;/span&gt;
&lt;span id=&#34;cb6-87&#34;&gt;&lt;a href=&#34;#cb6-87&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; usermod &lt;span class=&#34;at&#34;&gt;-aG&lt;/span&gt; shiny-apps shiny&lt;/span&gt;
&lt;span id=&#34;cb6-88&#34;&gt;&lt;a href=&#34;#cb6-88&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;bu&#34;&gt;cd&lt;/span&gt; /srv/shiny-server&lt;/span&gt;
&lt;span id=&#34;cb6-89&#34;&gt;&lt;a href=&#34;#cb6-89&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; chown &lt;span class=&#34;at&#34;&gt;-R&lt;/span&gt; pi:shiny-apps .&lt;/span&gt;
&lt;span id=&#34;cb6-90&#34;&gt;&lt;a href=&#34;#cb6-90&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; chmod g+w .&lt;/span&gt;
&lt;span id=&#34;cb6-91&#34;&gt;&lt;a href=&#34;#cb6-91&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; chmod g+s .&lt;/span&gt;
&lt;span id=&#34;cb6-92&#34;&gt;&lt;a href=&#34;#cb6-92&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;bu&#34;&gt;cd&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;instala-rstudio-server&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Instala RStudio Server&lt;/h2&gt;
&lt;p&gt;En el pasado, la única forma de instalar RStudio Server en una Pi era compilar desde la fuente y esto requería mucho tiempo (me tomó 3 días la última vez que probé en una Pi 3B+) y era muy propenso a fallar porque RStudio IDE estaba en desarrollo activo.&lt;/p&gt;
&lt;p&gt;Afortunadamente, desde entonces, RStudio ha puesto a disposición compilaciones “experimentales” del IDE para arm64 (escribí un &lt;a href=&#34;https://andresrcs.rbind.io/es/2022/08/22/rstudio_ide_arm/&#34;&gt;artículo al respecto&lt;/a&gt;), están compiladas para Ubuntu 22, 24 LTS, RedHat 9 y 10. Los binarios para Ubuntu 22 y 24 también son compatibles con Raspberry Pi OS. Puedes consultar las compilaciones diarias disponibles &lt;a href=&#34;https://dailies.rstudio.com/rstudio/&#34;&gt;aquí&lt;/a&gt;. Elije un enlace de acuerdo con el sistema operativo que estás utilizando, también ten en cuenta que estas compilaciones están destinadas a pruebas, por lo que es probable que tengan errores o sean inestables, si tienes problemas para instalar la última versión disponible, intenta con una versión anterior .&lt;/p&gt;
&lt;p&gt;Las siguientes instrucciones usan un enlace para Ubuntu 24 (compatible con Raspberry Pi OS), recuerda cambiar el enlace si deseas usar otro sistema operativo o una versión más reciente del IDE:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb7&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb7-1&#34;&gt;&lt;a href=&#34;#cb7-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; apt install gdebi&lt;/span&gt;
&lt;span id=&#34;cb7-2&#34;&gt;&lt;a href=&#34;#cb7-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;wget&lt;/span&gt; https://s3.amazonaws.com/rstudio-ide-build/server/jammy/arm64/rstudio-server-2026.01.0-392-arm64.deb&lt;/span&gt;
&lt;span id=&#34;cb7-3&#34;&gt;&lt;a href=&#34;#cb7-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; gdebi rstudio-server-2026.01.0-392-arm64.deb&lt;/span&gt;
&lt;span id=&#34;cb7-4&#34;&gt;&lt;a href=&#34;#cb7-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; rm rstudio-server-2026.01.0-392-arm64.deb&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;✏️ Actualizaré esta sección una vez que el soporte arm64 se convierta en una función estable del RStudio IDE.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div id=&#34;instalar-servicios-de-soporte-adicionales-opcional&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Instalar Servicios de Soporte Adicionales (opcional)&lt;/h2&gt;
&lt;p&gt;Nginx es un servidor web de bajos requisitos, que resulta útil para autohospedar archivos HTML, pero también para usarlo como proxy inverso (más información sobre esto en la siguiente sección). Puedes instalarlo con este comando:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb8&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb8-1&#34;&gt;&lt;a href=&#34;#cb8-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; apt install nginx&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;También, para trabajar con conjuntos de datos “más grandes que la memoria” (ten en cuenta que la Pi no tiene mucha RAM), tener un RDBMS es útil. Personalmente prefiero PostgreSQL ya que es de código abierto y tiene capacidades impresionantes, puedes instalar PostgreSQL con este comando:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb9&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb9-1&#34;&gt;&lt;a href=&#34;#cb9-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; apt install postgresql libpq-dev postgresql-client postgresql-client-common&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;pasos-adicionales-opcional&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Pasos Adicionales (opcional)&lt;/h2&gt;
&lt;p&gt;Crea direcciones URL agradables para Shiny y Rstudio Server (por ejemplo, &lt;code&gt;http://your-ip/shiny/your-app&lt;/code&gt; en lugar de &lt;code&gt;http://your-ip:3838/your-app&lt;/code&gt;) utilizando Nginx como proxy inverso, solo necesitas reemplazar el contenido de este archivo, &lt;code&gt;sudo nano /etc/nginx/sites-enabled/default&lt;/code&gt;, con esto:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb10&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb10-1&#34;&gt;&lt;a href=&#34;#cb10-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;map&lt;/span&gt; &lt;span class=&#34;va&#34;&gt;$http_upgrade&lt;/span&gt; &lt;span class=&#34;va&#34;&gt;$connection_upgrade&lt;/span&gt; {&lt;/span&gt;
&lt;span id=&#34;cb10-2&#34;&gt;&lt;a href=&#34;#cb10-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;default&lt;/span&gt; upgrade&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-3&#34;&gt;&lt;a href=&#34;#cb10-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;st&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;      close&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-4&#34;&gt;&lt;a href=&#34;#cb10-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;er&#34;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-5&#34;&gt;&lt;a href=&#34;#cb10-5&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-6&#34;&gt;&lt;a href=&#34;#cb10-6&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;server&lt;/span&gt; {&lt;/span&gt;
&lt;span id=&#34;cb10-7&#34;&gt;&lt;a href=&#34;#cb10-7&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;listen&lt;/span&gt; 80 default_server&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-8&#34;&gt;&lt;a href=&#34;#cb10-8&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;listen&lt;/span&gt; &lt;span class=&#34;pp&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;ss&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;pp&#34;&gt;]&lt;/span&gt;:80 default_server&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-9&#34;&gt;&lt;a href=&#34;#cb10-9&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;/span&gt;
&lt;span id=&#34;cb10-10&#34;&gt;&lt;a href=&#34;#cb10-10&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;root&lt;/span&gt; /var/www/html&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-11&#34;&gt;&lt;a href=&#34;#cb10-11&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;/span&gt;
&lt;span id=&#34;cb10-12&#34;&gt;&lt;a href=&#34;#cb10-12&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;index&lt;/span&gt; index.html index.htm&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-13&#34;&gt;&lt;a href=&#34;#cb10-13&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;/span&gt;
&lt;span id=&#34;cb10-14&#34;&gt;&lt;a href=&#34;#cb10-14&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;server_name&lt;/span&gt; _&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-15&#34;&gt;&lt;a href=&#34;#cb10-15&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;/span&gt;
&lt;span id=&#34;cb10-16&#34;&gt;&lt;a href=&#34;#cb10-16&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;location&lt;/span&gt; / {&lt;/span&gt;
&lt;span id=&#34;cb10-17&#34;&gt;&lt;a href=&#34;#cb10-17&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;try_files&lt;/span&gt; &lt;span class=&#34;va&#34;&gt;$uri&lt;/span&gt; &lt;span class=&#34;va&#34;&gt;$uri&lt;/span&gt;/ =404&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-18&#34;&gt;&lt;a href=&#34;#cb10-18&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;er&#34;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-19&#34;&gt;&lt;a href=&#34;#cb10-19&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;/span&gt;
&lt;span id=&#34;cb10-20&#34;&gt;&lt;a href=&#34;#cb10-20&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;rewrite&lt;/span&gt; ^/shiny$ &lt;span class=&#34;va&#34;&gt;$scheme&lt;/span&gt;://&lt;span class=&#34;va&#34;&gt;$http_host&lt;/span&gt;/shiny/ permanent&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-21&#34;&gt;&lt;a href=&#34;#cb10-21&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;/span&gt;
&lt;span id=&#34;cb10-22&#34;&gt;&lt;a href=&#34;#cb10-22&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;location&lt;/span&gt; /shiny/ {&lt;/span&gt;
&lt;span id=&#34;cb10-23&#34;&gt;&lt;a href=&#34;#cb10-23&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;rewrite&lt;/span&gt; ^/shiny/&lt;span class=&#34;er&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bu&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;pp&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;kw&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;ex&#34;&gt;$&lt;/span&gt; /&lt;span class=&#34;va&#34;&gt;$1&lt;/span&gt; break&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-24&#34;&gt;&lt;a href=&#34;#cb10-24&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;proxy_set_header&lt;/span&gt;    Host &lt;span class=&#34;va&#34;&gt;$host&lt;/span&gt;&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-25&#34;&gt;&lt;a href=&#34;#cb10-25&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;proxy_set_header&lt;/span&gt;    X-Real-IP &lt;span class=&#34;va&#34;&gt;$remote_addr&lt;/span&gt;&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-26&#34;&gt;&lt;a href=&#34;#cb10-26&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;proxy_set_header&lt;/span&gt;    X-Forwarded-For &lt;span class=&#34;va&#34;&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-27&#34;&gt;&lt;a href=&#34;#cb10-27&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;proxy_set_header&lt;/span&gt;    X-Forwarded-Proto &lt;span class=&#34;va&#34;&gt;$scheme&lt;/span&gt;&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-28&#34;&gt;&lt;a href=&#34;#cb10-28&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;proxy_pass&lt;/span&gt;          http://localhost:3838&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-29&#34;&gt;&lt;a href=&#34;#cb10-29&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;proxy_read_timeout&lt;/span&gt;  20d&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-30&#34;&gt;&lt;a href=&#34;#cb10-30&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;proxy_buffering&lt;/span&gt; off&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-31&#34;&gt;&lt;a href=&#34;#cb10-31&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;/span&gt;
&lt;span id=&#34;cb10-32&#34;&gt;&lt;a href=&#34;#cb10-32&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;proxy_set_header&lt;/span&gt; Upgrade &lt;span class=&#34;va&#34;&gt;$http_upgrade&lt;/span&gt;&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-33&#34;&gt;&lt;a href=&#34;#cb10-33&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;proxy_set_header&lt;/span&gt; Connection &lt;span class=&#34;va&#34;&gt;$connection_upgrade&lt;/span&gt;&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-34&#34;&gt;&lt;a href=&#34;#cb10-34&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;proxy_http_version&lt;/span&gt; 1.1&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-35&#34;&gt;&lt;a href=&#34;#cb10-35&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;/span&gt;
&lt;span id=&#34;cb10-36&#34;&gt;&lt;a href=&#34;#cb10-36&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;proxy_redirect&lt;/span&gt;      / &lt;span class=&#34;va&#34;&gt;$scheme&lt;/span&gt;://&lt;span class=&#34;va&#34;&gt;$host&lt;/span&gt;/shiny/&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-37&#34;&gt;&lt;a href=&#34;#cb10-37&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;er&#34;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-38&#34;&gt;&lt;a href=&#34;#cb10-38&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;/span&gt;
&lt;span id=&#34;cb10-39&#34;&gt;&lt;a href=&#34;#cb10-39&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;location&lt;/span&gt; /rstudio/ {&lt;/span&gt;
&lt;span id=&#34;cb10-40&#34;&gt;&lt;a href=&#34;#cb10-40&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;rewrite&lt;/span&gt; ^/rstudio/&lt;span class=&#34;er&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bu&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;pp&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;kw&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;ex&#34;&gt;$&lt;/span&gt; /&lt;span class=&#34;va&#34;&gt;$1&lt;/span&gt; break&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-41&#34;&gt;&lt;a href=&#34;#cb10-41&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;/span&gt;
&lt;span id=&#34;cb10-42&#34;&gt;&lt;a href=&#34;#cb10-42&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;proxy_pass&lt;/span&gt; http://localhost:8787&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-43&#34;&gt;&lt;a href=&#34;#cb10-43&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;/span&gt;
&lt;span id=&#34;cb10-44&#34;&gt;&lt;a href=&#34;#cb10-44&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;proxy_http_version&lt;/span&gt; 1.1&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-45&#34;&gt;&lt;a href=&#34;#cb10-45&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;proxy_set_header&lt;/span&gt; Upgrade &lt;span class=&#34;va&#34;&gt;$http_upgrade&lt;/span&gt;&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-46&#34;&gt;&lt;a href=&#34;#cb10-46&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;proxy_set_header&lt;/span&gt; Connection &lt;span class=&#34;va&#34;&gt;$connection_upgrade&lt;/span&gt;&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-47&#34;&gt;&lt;a href=&#34;#cb10-47&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;proxy_read_timeout&lt;/span&gt; 20d&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-48&#34;&gt;&lt;a href=&#34;#cb10-48&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;proxy_buffering&lt;/span&gt; off&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-49&#34;&gt;&lt;a href=&#34;#cb10-49&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;/span&gt;
&lt;span id=&#34;cb10-50&#34;&gt;&lt;a href=&#34;#cb10-50&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;proxy_set_header&lt;/span&gt; X-RStudio-Root-Path /rstudio&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-51&#34;&gt;&lt;a href=&#34;#cb10-51&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;/span&gt;
&lt;span id=&#34;cb10-52&#34;&gt;&lt;a href=&#34;#cb10-52&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;proxy_set_header&lt;/span&gt; Host &lt;span class=&#34;va&#34;&gt;$host&lt;/span&gt;:&lt;span class=&#34;va&#34;&gt;$server_port&lt;/span&gt;&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-53&#34;&gt;&lt;a href=&#34;#cb10-53&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;er&#34;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-54&#34;&gt;&lt;a href=&#34;#cb10-54&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;er&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;En Raspberry Pi OS, hay un problema extraño en el que Nginx se inicia antes de que RStudio Server pueda iniciarse y el proxy inverso falla. Una solución para esto es editar este archivo, &lt;code&gt;sudo nano /etc/systemd/system/multi-user.target.wants/nginx.service&lt;/code&gt;, y reemplazar la parte que dice &lt;code&gt;After=network.target&lt;/code&gt; con &lt;code&gt;After=network-online.target&lt;/code&gt; y recargar el daemon con &lt;code&gt;sudo systemctl daemon-reload&lt;/code&gt;. Puedes omitir esto si estás usando Ubuntu.&lt;/p&gt;
&lt;p&gt;Ahora tienes que reiniciar Nginx para aplicar los cambios:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb11&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb11-1&#34;&gt;&lt;a href=&#34;#cb11-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; systemctl restart nginx&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si deseas tener acceso a tu servidor desde orígenes remotos (a través de Internet), debes seguir estos pasos adicionales:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si no tienes una IP pública estática:
&lt;ul&gt;
&lt;li&gt;Abre una cuenta en un servicio de DNS dinámico (por ejemplo, &lt;a href=&#34;https://www.noip.com&#34; class=&#34;uri&#34;&gt;https://www.noip.com&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Configura Dynamic DNS en tu enrutador/módem, si no tiene esa opción, puedes instalar un cliente DDNS en tu servidor.&lt;/li&gt;
&lt;li&gt;Opcionalmente, configura tu nombre de dominio personal para que apunte a tu servicio DDNS.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Si tienes un IPv4 publico, configura el reenvío de puertos en tu enrutador/módem:
&lt;ul&gt;
&lt;li&gt;Para SSH, SCP y SFPT, abre el puerto TCP/UDP 22&lt;/li&gt;
&lt;li&gt;Si no has configurado Nginx, abre el puerto 8787 para RStudio Server.&lt;/li&gt;
&lt;li&gt;Si no has configurado Nginx, abre el puerto 3838 para Shiny Server.&lt;/li&gt;
&lt;li&gt;Para HTTP abre el puerto TCP 80 (también para usar Nginx como proxy inverso).&lt;/li&gt;
&lt;li&gt;Para PostgreSQL abre el puerto TCP/UDP 5432&lt;/li&gt;
&lt;li&gt;Asegúrate de tener “Block WAN Traffic” deshabilitado en tu enrutador/módem.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si estás interesado, tengo un &lt;a href=&#34;https://andresrcs.rbind.io/es/2021/08/16/port_forwarding/&#34;&gt;artículo&lt;/a&gt; que brinda un ejemplo de cómo configurar el reenvío de puertos en casa.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;comentarios-finales&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Comentarios finales&lt;/h2&gt;
&lt;p&gt;El soporte para arm64 en general está aumentando rápidamente, por lo que es muy probable que las cosas cambien en un futuro próximo. Voy a hacer todo lo posible para mantener este artículo actualizado con los últimos desarrollos para que puedan aprovechar los beneficios.&lt;/p&gt;
&lt;p&gt;El rendimiento es relativamente pobre, especialmente para gráficos, pero es utilizable. Ten en cuenta que aunque la Raspberry Pi tiene 4 núcleos, no son rápidos y la mayoría de los paquetes R no usan computación paralela.&lt;/p&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Prueba el soporte experimental del IDE de RStudio para arquitecturas arm64</title>
      <link>https://andresrcs.rbind.io/es/2022/08/22/rstudio_ide_arm/</link>
      <pubDate>Mon, 22 Aug 2022 00:00:00 +0000</pubDate>
      
      <guid>https://andresrcs.rbind.io/es/2022/08/22/rstudio_ide_arm/</guid>
      <description>
&lt;style type=&#34;text/css&#34;&gt;
pre &gt; code.sourceCode { white-space: pre; position: relative; }
pre &gt; code.sourceCode &gt; span { line-height: 1.25; }
pre &gt; code.sourceCode &gt; span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode &gt; span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre &gt; code.sourceCode { white-space: pre-wrap; }
pre &gt; code.sourceCode &gt; span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
  { counter-reset: source-line 0; }
pre.numberSource code &gt; span
  { position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code &gt; span &gt; a:first-child::before
  { content: counter(source-line);
    position: relative; left: -1em; text-align: right; vertical-align: baseline;
    border: none; display: inline-block;
    -webkit-touch-callout: none; -webkit-user-select: none;
    -khtml-user-select: none; -moz-user-select: none;
    -ms-user-select: none; user-select: none;
    padding: 0 4px; width: 4em;
  }
pre.numberSource { margin-left: 3em;  padding-left: 4px; }
div.sourceCode
  { color: #cccccc; background-color: #303030; }
@media screen {
pre &gt; code.sourceCode &gt; span &gt; a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ffcfaf; } /* Alert */
code span.an { color: #7f9f7f; font-weight: bold; } /* Annotation */
code span.at { } /* Attribute */
code span.bn { color: #dca3a3; } /* BaseN */
code span.bu { } /* BuiltIn */
code span.cf { color: #f0dfaf; } /* ControlFlow */
code span.ch { color: #dca3a3; } /* Char */
code span.cn { color: #dca3a3; font-weight: bold; } /* Constant */
code span.co { color: #7f9f7f; } /* Comment */
code span.cv { color: #7f9f7f; font-weight: bold; } /* CommentVar */
code span.do { color: #7f9f7f; } /* Documentation */
code span.dt { color: #dfdfbf; } /* DataType */
code span.dv { color: #dcdccc; } /* DecVal */
code span.er { color: #c3bf9f; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #c0bed1; } /* Float */
code span.fu { color: #efef8f; } /* Function */
code span.im { } /* Import */
code span.in { color: #7f9f7f; font-weight: bold; } /* Information */
code span.kw { color: #f0dfaf; } /* Keyword */
code span.op { color: #f0efd0; } /* Operator */
code span.ot { color: #efef8f; } /* Other */
code span.pp { color: #ffcfaf; font-weight: bold; } /* Preprocessor */
code span.sc { color: #dca3a3; } /* SpecialChar */
code span.ss { color: #cc9393; } /* SpecialString */
code span.st { color: #cc9393; } /* String */
code span.va { } /* Variable */
code span.vs { color: #cc9393; } /* VerbatimString */
code span.wa { color: #7f9f7f; font-weight: bold; } /* Warning */
&lt;/style&gt;

&lt;div id=&#34;TOC&#34;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#configuración-básica-y-dependencias&#34; id=&#34;toc-configuración-básica-y-dependencias&#34;&gt;Configuración básica y dependencias&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#instalación-del-ide-de-rstudio&#34; id=&#34;toc-instalación-del-ide-de-rstudio&#34;&gt;Instalación del IDE de RStudio&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#comentarios-finales&#34; id=&#34;toc-comentarios-finales&#34;&gt;Comentarios finales&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;La apuesta de Apple por la arquitectura arm con sus procesadores M1 y M2 ha tenido un efecto secundario interesante, los desarrolladores de software convencional ahora se ven obligados a soportar la arquitectura arm64 y, dado que ya soportan macOS para los procesadores Apple Silicon de todos modos, soportar distribuciones Linux arm64 ya no es una carga para ellos. El equipo de desarrollo del RStudio IDE no es ajeno a esta circunstancia y han estado trabajando en el soporte general de arm64, actualmente, han puesto a disposición compilaciones experimentales para la arquitectura arm64 (también conocida como aarch64) compiladas para Ubuntu 20/22 LTS (siendo la compilación para Ubuntu 22 compatible con la última versión de Raspberry Pi OS x64 basada en Bookworm) y RedHat 9. He decidido probarlas en mi Raspberry Pi SBC, si estás interesado, únete a mí en el proceso de instalación.&lt;/p&gt;
&lt;div id=&#34;configuración-básica-y-dependencias&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Configuración básica y dependencias&lt;/h2&gt;
&lt;p&gt;Lo primero que necesitas es una Raspberry Pi (3/3/5) con Raspberry Pi x64 OS (Basado en Debian 12) o Ubuntu 20/22 LTS x64 instalado y actualizado (o cualquier otro sistema Linux arm64 ejecutando un sistema operativo soportado), asegúrate de actualizar las bibliotecas de tu sistema antes de comenzar.&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb1&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb1-1&#34;&gt;&lt;a href=&#34;#cb1-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; apt update&lt;/span&gt;
&lt;span id=&#34;cb1-2&#34;&gt;&lt;a href=&#34;#cb1-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; apt dist-upgrade&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Luego, la dependencia más importante para RStudio es, como era de esperarse, el lenguaje R. Tienes algunas opciones para instalar R en sistemas arm, cada una con sus pros y sus contras:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Instalar desde los repositorios del Sistema Operativo&lt;/li&gt;
&lt;li&gt;Compilar R desde la fuente&lt;/li&gt;
&lt;li&gt;Instalar R usando rig&lt;/li&gt;
&lt;li&gt;Instalar R desde el Proyecto R4Pi&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Como ahora hay varias opciones, he movido esta sección a un artículo aparte que puedes consultar &lt;a href=&#34;https://andresrcs.rbind.io/es/2023/02/11/r_on_arm/&#34;&gt;aquí&lt;/a&gt; para obtener más detalles.&lt;/p&gt;
&lt;p&gt;En todos los casos, recomiendo usar el repositorio de paquetes de &lt;a href=&#34;https://r4pi.org/es/&#34;&gt;R4Pi&lt;/a&gt; como tu fuente de paquetes R, ya que proporciona archivos binarios precompilados que hacen que la instalación sea más fácil y rápida.&lt;/p&gt;
&lt;p&gt;Las últimas compilaciones experimentales del IDE RStudio (compilaciones &amp;gt;= 2023.08.0) para arm64 ahora vienen con Quarto y Pandoc incluidos, por lo que ya no es necesario instalarlos por separado y las características de integración con Quarto ahora son totalmente compatibles con los sistemas arm64, aunque, si deseas un versión más reciente de cualquiera de estos programas, puedes descargar el archivo &lt;code&gt;.deb&lt;/code&gt; correspondiente e instalarlo usando el comando &lt;code&gt;dpkg&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Puedes descargar el último instalador de Pandoc desde aquí: &lt;a href=&#34;https://github.com/jgm/pandoc/releases/&#34; class=&#34;uri&#34;&gt;https://github.com/jgm/pandoc/releases/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Y el último instalador de Quarto desde aquí: &lt;a href=&#34;https://github.com/quarto-dev/quarto-cli/releases&#34; class=&#34;uri&#34;&gt;https://github.com/quarto-dev/quarto-cli/releases&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Y el comando de instalación sería algo como esto:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb2&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb2-1&#34;&gt;&lt;a href=&#34;#cb2-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; dpkg &lt;span class=&#34;at&#34;&gt;-i&lt;/span&gt; &lt;span class=&#34;op&#34;&gt;&amp;lt;&amp;lt;nombre_del_archivo.deb&amp;gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Por último, para instalar el archivo deb del IDE de RStudio, como lo harías en un sistema x86_64, es posible que desees instalar &lt;code&gt;gdebi&lt;/code&gt; para que maneje las dependencias de paquetes por ti:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb3&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb3-1&#34;&gt;&lt;a href=&#34;#cb3-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; apt install gdebi&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;instalación-del-ide-de-rstudio&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Instalación del IDE de RStudio&lt;/h2&gt;
&lt;p&gt;Ahora llegamos al grano. No existe una versión estable del IDE de RStudio para arm64, pero hay compilaciones diarias experimentales disponibles &lt;a href=&#34;https://dailies.rstudio.com/rstudio/&#34;&gt;aquí&lt;/a&gt;, tanto para las versiones de servidor como de escritorio y compiladas para Ubuntu 20/22 LTS y RedHat9. Voy a probar la versión de servidor para Ubuntu 22 porque es compatible con Raspberry Pi OS x64 y prefiero trabajar con el IDE en mi computadora normal en lugar de directamente en la Raspberry Pi, pero puedes instalar la versión de escritorio de la misma manera si lo prefieres, simplemente cambia el enlace en consecuencia.&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb4&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb4-1&#34;&gt;&lt;a href=&#34;#cb4-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;wget&lt;/span&gt; https://s3.amazonaws.com/rstudio-ide-build/server/jammy/arm64/rstudio-server-2023.12.0-daily-232-arm64.deb&lt;/span&gt;
&lt;span id=&#34;cb4-2&#34;&gt;&lt;a href=&#34;#cb4-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; gdebi rstudio-server-2023.12.0-daily-232-arm64.deb&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Una vez completado el proceso de instalación, obtienes una instalación de RStudio IDE funcional en tu Raspberry Pi, si has elegido instalar la versión de servidor como lo hice yo, puedes abrir una sesión de RStudio abriendo un navegador en cualquier dispositivo en tu red y escribiendo la dirección correcta, es decir, &lt;code&gt;http:\\direccion_ip_de_tu_pi:8787&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://andresrcs.rbind.io/post/2022-08-20-rstudio_ide_arm.en_files/rstudio_ide.jpg&#34; width=&#34;800&#34; height=&#34;400&#34; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;comentarios-finales&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Comentarios finales&lt;/h2&gt;
&lt;p&gt;Ten en cuenta que estas son compilaciones experimentales de la versión de desarrollo del IDE de RStudio y es probable que sean inestables y con errores, por lo que no debes confiar en esto para ningún tipo de trabajo crítico. Puedes seguir el progreso en este &lt;a href=&#34;https://github.com/rstudio/rstudio/issues/8809&#34;&gt;GitHub issue&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;El rendimiento en Raspberry Pi es aceptable, dentro de lo razonable para sistemas con poca potencia como estos, pero está bastante lejos del rendimiento que obtendrías en sistemas más potentes como Apple Silicon o computadoras arm64 de tamaño completo si tienes acceso a una de esas (probado en una máquina virtual Ampere y funciona muy bien). Si deseas obtener el máximo rendimiento de tu Pi, usa Raspberry Pi OS Lite, ya que es la opción más liviana.&lt;/p&gt;
&lt;p&gt;Espero que hayas encontrado útil este artículo, actualizaré el contenido a medida que se desarrollen las cosas.&lt;/p&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Cómo hacer que tu servidor Shiny o Rstudio casero sea accesible desde la Internet pública</title>
      <link>https://andresrcs.rbind.io/es/2021/08/16/port_forwarding/</link>
      <pubDate>Mon, 16 Aug 2021 00:00:00 +0000</pubDate>
      
      <guid>https://andresrcs.rbind.io/es/2021/08/16/port_forwarding/</guid>
      <description>
&lt;style type=&#34;text/css&#34;&gt;
pre &gt; code.sourceCode { white-space: pre; position: relative; }
pre &gt; code.sourceCode &gt; span { display: inline-block; line-height: 1.25; }
pre &gt; code.sourceCode &gt; span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode &gt; span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre &gt; code.sourceCode { white-space: pre-wrap; }
pre &gt; code.sourceCode &gt; span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
  { counter-reset: source-line 0; }
pre.numberSource code &gt; span
  { position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code &gt; span &gt; a:first-child::before
  { content: counter(source-line);
    position: relative; left: -1em; text-align: right; vertical-align: baseline;
    border: none; display: inline-block;
    -webkit-touch-callout: none; -webkit-user-select: none;
    -khtml-user-select: none; -moz-user-select: none;
    -ms-user-select: none; user-select: none;
    padding: 0 4px; width: 4em;
  }
pre.numberSource { margin-left: 3em;  padding-left: 4px; }
div.sourceCode
  { color: #cccccc; background-color: #303030; }
@media screen {
pre &gt; code.sourceCode &gt; span &gt; a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ffcfaf; } /* Alert */
code span.an { color: #7f9f7f; font-weight: bold; } /* Annotation */
code span.at { } /* Attribute */
code span.bn { color: #dca3a3; } /* BaseN */
code span.bu { } /* BuiltIn */
code span.cf { color: #f0dfaf; } /* ControlFlow */
code span.ch { color: #dca3a3; } /* Char */
code span.cn { color: #dca3a3; font-weight: bold; } /* Constant */
code span.co { color: #7f9f7f; } /* Comment */
code span.cv { color: #7f9f7f; font-weight: bold; } /* CommentVar */
code span.do { color: #7f9f7f; } /* Documentation */
code span.dt { color: #dfdfbf; } /* DataType */
code span.dv { color: #dcdccc; } /* DecVal */
code span.er { color: #c3bf9f; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #c0bed1; } /* Float */
code span.fu { color: #efef8f; } /* Function */
code span.im { } /* Import */
code span.in { color: #7f9f7f; font-weight: bold; } /* Information */
code span.kw { color: #f0dfaf; } /* Keyword */
code span.op { color: #f0efd0; } /* Operator */
code span.ot { color: #efef8f; } /* Other */
code span.pp { color: #ffcfaf; font-weight: bold; } /* Preprocessor */
code span.sc { color: #dca3a3; } /* SpecialChar */
code span.ss { color: #cc9393; } /* SpecialString */
code span.st { color: #cc9393; } /* String */
code span.va { } /* Variable */
code span.vs { color: #cc9393; } /* VerbatimString */
code span.wa { color: #7f9f7f; font-weight: bold; } /* Warning */
&lt;/style&gt;

&lt;div id=&#34;TOC&#34;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#prerrequisitos&#34; id=&#34;toc-prerrequisitos&#34;&gt;Prerrequisitos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#abrir-los-puertos-necesarios-en-el-servidor&#34; id=&#34;toc-abrir-los-puertos-necesarios-en-el-servidor&#34;&gt;Abrir los Puertos Necesarios en el Servidor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#configura-el-reenvio-de-puertos-en-tu-router&#34; id=&#34;toc-configura-el-reenvio-de-puertos-en-tu-router&#34;&gt;Configura el Reenvio de Puertos en tu Router&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#pasos-adicionales-opcionales&#34; id=&#34;toc-pasos-adicionales-opcionales&#34;&gt;Pasos Adicionales Opcionales&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#configura-un-servicio-de-dns-dinámico-ddns&#34; id=&#34;toc-configura-un-servicio-de-dns-dinámico-ddns&#34;&gt;Configura un Servicio de DNS Dinámico (DDNS)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#configura-un-proxy-inverso&#34; id=&#34;toc-configura-un-proxy-inverso&#34;&gt;Configura un Proxy Inverso&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ ¡Requiere ensamblaje! Este proyecto requerie que investigues los detalles de tu equipo de red por tu cuenta.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Has instalado Shiny y/o RStudio sever en la computadora de tu casa y funciona muy bien siempre que estés conectado a tu red local, sin embargo, no puedes acceder a ellos desde otras ubicaciones, ¿qué puedes hacer?&lt;/p&gt;
&lt;p&gt;La solución es exponer tu servidor a la Internet pública reenviando el tráfico entrante al puerto correspondiente en tu servidor. Ahora, no voy a mentirte diciéndo que este artículo te va a dar instrucciones detalladas sobre cómo hacerlo con tu router específico porque sería virtualmente imposible, cada marca de router (incluso modelo) tiene una interfaz de administración diferente, solo puedo darte los pasos requeridos junto con un ejemplo usando el router que tengo en casa, aunque, en general, el procedimiento implica los mismos pasos independientemente del modelo de router específico que tengas, así que con un poco de esfuerzo de tu parte, deberías poder averiguar cómo hacer que funcione con tu propio router.&lt;/p&gt;
&lt;div id=&#34;prerrequisitos&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Prerrequisitos&lt;/h2&gt;
&lt;ol style=&#34;list-style-type: decimal&#34;&gt;
&lt;li&gt;&lt;p&gt;Estoy escribiendo este artículo asumiendo que tienes Shiny y/o RStudio server correctamente instalados en una computadora en casa.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Debes tener una IP pública asignada a tu router (no importa si cambia dinámicamente), no todos tienen una, ya que algunos proveedores de servicios de Internet (PSI) usan una configuración NAT3, lo que básicamente significa que compartes una IP pública con un grupo de sus clientes y no hay forma de canalizar una solicitud HTTP hacia tu servidor doméstico, sin embargo, es posible que puedas cambiar tu configuración NAT si llamas a tu PSI y solicitas una IP pública, por lo que puede que quieras intentarlo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Necesitas conocer el usuario y la contraseña para acceder a la interfaz de configuración de tu router, algunos PSI lo dejan con los valores de fabrica y solo necesitas buscar en Google la contraseña predeterminada para tu modelo de router, pero en la mayoría de los casos, la cambian, por lo que tendrías que darles una llamada y preguntar por tus credenciales.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div id=&#34;abrir-los-puertos-necesarios-en-el-servidor&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Abrir los Puertos Necesarios en el Servidor&lt;/h2&gt;
&lt;p&gt;Los puertos específicos para Shiny y/o RStudio Server deben estar accesibles en tu servidor para poder conectarse a esos servicios. La mayoría de las distribuciones de Linux vienen con todos los puertos accesibles de forma predeterminada, pero es una práctica común (y buena) instalar un firewall para restringir el acceso a tu servidor; si este es tu caso, debes asegurarte de tener abiertos los puertos necesarios.&lt;/p&gt;
&lt;p&gt;Para Shiny server, el puerto predeterminado es 3838 y para RStudio server es 8787 (esto se puede personalizar). Si has configurado un proxy inverso con &lt;code&gt;Nginx&lt;/code&gt; o&lt;code&gt;Apache&lt;/code&gt;, puedes obviar esos puertos y solo abrir el puerto &lt;code&gt;80&lt;/code&gt; para HTTP o el puerto &lt;code&gt;443&lt;/code&gt; para HTTPS. Por ejemplo, el comando para permitir el tráfico entrante en el puerto 80 usando el firewall &lt;code&gt;ufw&lt;/code&gt; en sistemas basados en Ubuntu sería así:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb1&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb1-1&#34;&gt;&lt;a href=&#34;#cb1-1&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; ufw allow 80/tcp&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Y usando &lt;code&gt;firewalld&lt;/code&gt; en sistemas basados en RHEL sería:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb2&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb2-1&#34;&gt;&lt;a href=&#34;#cb2-1&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; firewall-cmd &lt;span class=&#34;at&#34;&gt;--permanent&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;--zone&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;=&lt;/span&gt;public &lt;span class=&#34;at&#34;&gt;--add-port&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;=&lt;/span&gt;80/tcp&lt;/span&gt;
&lt;span id=&#34;cb2-2&#34;&gt;&lt;a href=&#34;#cb2-2&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; firewall-cmd &lt;span class=&#34;at&#34;&gt;--reload&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Puede que tengas otras reglas que podrían evitar que el tráfico ingrese a tu servidor desde ubicaciones remotas, por lo que es posible que desees inspeccionar las reglas de tu firewall y buscar cualquier cosa que restrinja el tráfico entrante.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;configura-el-reenvio-de-puertos-en-tu-router&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Configura el Reenvio de Puertos en tu Router&lt;/h2&gt;
&lt;p&gt;Abre un navegador web en un dispositivo que esté conectado a tu red local y escribe la IP local de tu router, por lo general, es algo como &lt;code&gt;192.168.0.1&lt;/code&gt; o &lt;code&gt;192.168.1.1&lt;/code&gt;. Todos los routers tienen un servidor web que se ejecuta en el puerto 80 de forma predeterminada, por lo que al escribir su IP se abrirá una página web con la interfaz de configuración.&lt;/p&gt;
&lt;p&gt;En mi caso particular, sigo usando el módem Sagemcom HFC que me dio mi PSI (porque siempre voy a configurar un router &lt;code&gt;pfSense&lt;/code&gt; personalizado muy pronto), así que si abro un navegador Chrome y escribo &lt;code&gt;192.168 .0.1&lt;/code&gt; esto es lo que obtengo.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://andresrcs.rbind.io/post/2021-08-16-port-forwarding.en_files/login.jpg&#34; width=&#34;800&#34; height=&#34;400&#34; /&gt;
En tu caso, la interfaz de usuario se verá diferente y las opciones podrían tener nombres ligeramente distintos, pero son básicamente las mismas.&lt;/p&gt;
&lt;p&gt;Ingresa tus credenciales para acceder a la interfaz de configuración, que en mi caso se ve así.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://andresrcs.rbind.io/post/2021-08-16-port-forwarding.en_files/console.jpg&#34; width=&#34;800&#34; height=&#34;400&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Luego, busca entre todas las pestañas disponibles para encontrar la sección “reenvío de puertos” (Port Forwarding en inglés), no estará en el mismo lugar para ti, pero la mayoría de routers modernos tienen esta opción.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://andresrcs.rbind.io/post/2021-08-16-port-forwarding.en_files/forwarding.jpg&#34; width=&#34;800&#34; height=&#34;400&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Una vez allí, agrega las reglas de reenvío para Shiny y/o Rstudio server (debes reemplazar “IP_del_servidor” con la IP local de tu servidor) y aplica los cambios.&lt;/p&gt;
&lt;table&gt;
&lt;colgroup&gt;
&lt;col width=&#34;19%&#34; /&gt;
&lt;col width=&#34;18%&#34; /&gt;
&lt;col width=&#34;10%&#34; /&gt;
&lt;col width=&#34;22%&#34; /&gt;
&lt;col width=&#34;11%&#34; /&gt;
&lt;col width=&#34;17%&#34; /&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class=&#34;header&#34;&gt;
&lt;th align=&#34;left&#34;&gt;Dirección Local&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;Puerto Inicial&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;Puerto Final&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;Dirección Externa&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;Protocolo&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;Descripción&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;left&#34;&gt;IP_del_servidor&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;3838&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;3838&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;0.0.0.0&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;TCP&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Shiny-Server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;left&#34;&gt;IP_del_servidor&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;8787&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;8787&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;0.0.0.0&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;TCP&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;RStudio-Server&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Si está utilizando un proxy inverso, solo necesitas asegurarte de tener una de estas.&lt;/p&gt;
&lt;table&gt;
&lt;colgroup&gt;
&lt;col width=&#34;18%&#34; /&gt;
&lt;col width=&#34;17%&#34; /&gt;
&lt;col width=&#34;15%&#34; /&gt;
&lt;col width=&#34;21%&#34; /&gt;
&lt;col width=&#34;11%&#34; /&gt;
&lt;col width=&#34;16%&#34; /&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class=&#34;header&#34;&gt;
&lt;th align=&#34;left&#34;&gt;Dirección Local&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;Puerto Inicial&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;Puerto Final&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;Dirección Externa&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;Protocolo&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;Descripción&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;left&#34;&gt;IP_del_servidor&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;80&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;80&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;0.0.0.0&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;TCP&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;HTTP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;left&#34;&gt;IP_del_servidor&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;443&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;443&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;0.0.0.0&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;TCP&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;HTTPS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Además, asegúrate de no tener la opción “Bloquear tráfico WAN” habilitada en tu router, eso bloquearía todo el tráfico entrante en absoluto.&lt;/p&gt;
&lt;p&gt;Después de hacer todo esto, deberías poder acceder a tus aplicaciones Shiny escribiendo &lt;code&gt;tu.ip.publica:3838/nombre_de_tu_app&lt;/code&gt; y/o a tu servidor Rstudio escribiendo &lt;code&gt;tu.ip.publica:8787&lt;/code&gt; en cualquier navegador.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;pasos-adicionales-opcionales&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Pasos Adicionales Opcionales&lt;/h2&gt;
&lt;div id=&#34;configura-un-servicio-de-dns-dinámico-ddns&#34; class=&#34;section level3&#34;&gt;
&lt;h3&gt;Configura un Servicio de DNS Dinámico (DDNS)&lt;/h3&gt;
&lt;p&gt;La mayoría de los servicios de Internet residencial no incluyen una IP pública “estática”, lo que significa que incluso si tienes una IP pública asignada en cada momento dado, no siempre será la misma. Se necesita una IP pública para acceder a tu servidor desde Internet directamente o para apuntar tu dominio personalizado (dirección web) a él, por lo que puedes imaginar lo inconveniente que sería tener que averiguar cuál es el IP en cada momento dado.&lt;/p&gt;
&lt;p&gt;Para solucionar este problema, puedes utilizar un servicio de DNS dinámico (a mí me gusta utilizar &lt;a href=&#34;https://www.noip.com/&#34;&gt;No-IP&lt;/a&gt;). Lo que hace este servicio es actualizar automáticamente tu dominio (incluso pueden darte un subdominio gratis si lo deseas) para apuntar hacia tu IP pública actual cada vez que cambia, lo hace usando un agente DDNS incorporado en tu router si es que está disponible, o si no, usando un servicio instalado en tu servidor que reporta automáticamente la IP actual al servicio DDNS.&lt;/p&gt;
&lt;p&gt;Si tu router tiene un agente DDNS integrado compatible, solo tienes que ingresar tus credenciales y estarás listo para comenzar.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://andresrcs.rbind.io/post/2021-08-16-port-forwarding.en_files/ddns.jpg&#34; width=&#34;700&#34; height=&#34;400&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Si tu router no tiene un angete DDNS, tendrás que instalar uno en tu servidor (proporcionado por el proveedor de DDNS). Cómo instalarlo depende del proveedor de DDNS que estés utilizando y del sistema operativo que esté ejecutando tu servidor, pero seguramente puedes encontrar instrucciones detalladas en la página de documentación de tu proveedor de DDNS.&lt;/p&gt;
&lt;p&gt;Con este paso adicional, accederás a tus aplicaciones Shiny con: &lt;code&gt;tu_dominio:3838/nombre_de_tu_app&lt;/code&gt; y a tu servidor RStudio con: &lt;code&gt;tu_dominio:8787&lt;/code&gt;, lo que no requiere que conozcas tu IP pública actual por adelantado.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;configura-un-proxy-inverso&#34; class=&#34;section level3&#34;&gt;
&lt;h3&gt;Configura un Proxy Inverso&lt;/h3&gt;
&lt;p&gt;Hasta el paso anterior, habíamos resuelto el problema con el cambio de dirección IP, pero todavía tenemos números de puerto extraños en las direcciones web de nuestro servidor, al configurar un proxy inverso podemos usar direcciones más agradables como: &lt;code&gt;tu_dominio/shiny/nombre_de_tu_app&lt;/code&gt; y &lt;code&gt;tu_dominio/rstudio&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Para configurar un proxy inverso, instala Nginx&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb3&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb3-1&#34;&gt;&lt;a href=&#34;#cb3-1&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; apt install nginx&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Edita el archivo de configuración de Nginx: &lt;code&gt;sudo nano /etc/nginx/sites-enabled/default&lt;/code&gt;, agreguando las siguientes líneas antes de la línea que dice &lt;code&gt;server {&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb4&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb4-1&#34;&gt;&lt;a href=&#34;#cb4-1&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;map&lt;/span&gt; &lt;span class=&#34;va&#34;&gt;$http_upgrade&lt;/span&gt; &lt;span class=&#34;va&#34;&gt;$connection_upgrade&lt;/span&gt; {&lt;/span&gt;
&lt;span id=&#34;cb4-2&#34;&gt;&lt;a href=&#34;#cb4-2&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;      &lt;span class=&#34;ex&#34;&gt;default&lt;/span&gt; upgrade&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-3&#34;&gt;&lt;a href=&#34;#cb4-3&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;      &lt;span class=&#34;st&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;      close&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-4&#34;&gt;&lt;a href=&#34;#cb4-4&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;er&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;y las siguientes líneas justo después de la línea que dice &lt;code&gt;server_name _;&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb5&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb5-1&#34;&gt;&lt;a href=&#34;#cb5-1&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;rewrite&lt;/span&gt; ^/shiny$ &lt;span class=&#34;va&#34;&gt;$scheme&lt;/span&gt;://&lt;span class=&#34;va&#34;&gt;$http_host&lt;/span&gt;/shiny/ permanent&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-2&#34;&gt;&lt;a href=&#34;#cb5-2&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;co&#34;&gt;# This part is for Shiny server&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-3&#34;&gt;&lt;a href=&#34;#cb5-3&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;location&lt;/span&gt; /shiny/ {&lt;/span&gt;
&lt;span id=&#34;cb5-4&#34;&gt;&lt;a href=&#34;#cb5-4&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;rewrite&lt;/span&gt; ^/shiny/&lt;span class=&#34;er&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bu&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;pp&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;kw&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;ex&#34;&gt;$&lt;/span&gt; /&lt;span class=&#34;va&#34;&gt;$1&lt;/span&gt; break&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-5&#34;&gt;&lt;a href=&#34;#cb5-5&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;proxy_pass&lt;/span&gt; http://localhost:3838&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-6&#34;&gt;&lt;a href=&#34;#cb5-6&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;proxy_redirect&lt;/span&gt; / &lt;span class=&#34;va&#34;&gt;$scheme&lt;/span&gt;://&lt;span class=&#34;va&#34;&gt;$http_host&lt;/span&gt;/shiny/&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-7&#34;&gt;&lt;a href=&#34;#cb5-7&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;proxy_http_version&lt;/span&gt; 1.1&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-8&#34;&gt;&lt;a href=&#34;#cb5-8&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;proxy_set_header&lt;/span&gt; Upgrade &lt;span class=&#34;va&#34;&gt;$http_upgrade&lt;/span&gt;&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-9&#34;&gt;&lt;a href=&#34;#cb5-9&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;proxy_set_header&lt;/span&gt; Connection &lt;span class=&#34;va&#34;&gt;$connection_upgrade&lt;/span&gt;&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-10&#34;&gt;&lt;a href=&#34;#cb5-10&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;proxy_read_timeout&lt;/span&gt; 20d&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-11&#34;&gt;&lt;a href=&#34;#cb5-11&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;proxy_buffering&lt;/span&gt; off&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-12&#34;&gt;&lt;a href=&#34;#cb5-12&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;er&#34;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-13&#34;&gt;&lt;a href=&#34;#cb5-13&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;co&#34;&gt;# This part is for RStudio server&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-14&#34;&gt;&lt;a href=&#34;#cb5-14&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;location&lt;/span&gt; /rstudio {&lt;/span&gt;
&lt;span id=&#34;cb5-15&#34;&gt;&lt;a href=&#34;#cb5-15&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;co&#34;&gt;# Needed only for prefix of /rstudio&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-16&#34;&gt;&lt;a href=&#34;#cb5-16&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;ex&#34;&gt;rewrite&lt;/span&gt; ^/rstudio/&lt;span class=&#34;er&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;bu&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;pp&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;kw&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;ex&#34;&gt;$&lt;/span&gt; /&lt;span class=&#34;va&#34;&gt;$1&lt;/span&gt; break&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-17&#34;&gt;&lt;a href=&#34;#cb5-17&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-18&#34;&gt;&lt;a href=&#34;#cb5-18&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;co&#34;&gt;# Use http here when ssl-enabled=0 is set in rserver.conf&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-19&#34;&gt;&lt;a href=&#34;#cb5-19&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;ex&#34;&gt;proxy_pass&lt;/span&gt; http://localhost:8787&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-20&#34;&gt;&lt;a href=&#34;#cb5-20&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;ex&#34;&gt;proxy_http_version&lt;/span&gt; 1.1&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-21&#34;&gt;&lt;a href=&#34;#cb5-21&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-22&#34;&gt;&lt;a href=&#34;#cb5-22&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;ex&#34;&gt;proxy_set_header&lt;/span&gt; Upgrade &lt;span class=&#34;va&#34;&gt;$http_upgrade&lt;/span&gt;&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-23&#34;&gt;&lt;a href=&#34;#cb5-23&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;ex&#34;&gt;proxy_set_header&lt;/span&gt; Connection &lt;span class=&#34;va&#34;&gt;$connection_upgrade&lt;/span&gt;&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-24&#34;&gt;&lt;a href=&#34;#cb5-24&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-25&#34;&gt;&lt;a href=&#34;#cb5-25&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;co&#34;&gt;# Optionally, use an explicit hostname and omit the port if using 80/443&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-26&#34;&gt;&lt;a href=&#34;#cb5-26&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;ex&#34;&gt;proxy_set_header&lt;/span&gt; Host &lt;span class=&#34;va&#34;&gt;$host&lt;/span&gt;:&lt;span class=&#34;va&#34;&gt;$server_port&lt;/span&gt;&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-27&#34;&gt;&lt;a href=&#34;#cb5-27&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-28&#34;&gt;&lt;a href=&#34;#cb5-28&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;co&#34;&gt;# Not needed if there&amp;#39;s no prefix or www-root-path is set in rserver.conf&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-29&#34;&gt;&lt;a href=&#34;#cb5-29&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;ex&#34;&gt;proxy_set_header&lt;/span&gt; X-RStudio-Root-Path /rstudio&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-30&#34;&gt;&lt;a href=&#34;#cb5-30&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-31&#34;&gt;&lt;a href=&#34;#cb5-31&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;ex&#34;&gt;proxy_read_timeout&lt;/span&gt; 20d&lt;span class=&#34;kw&#34;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-32&#34;&gt;&lt;a href=&#34;#cb5-32&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;er&#34;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ahora solo tienes que reiniciar Nginx para aplicar los cambios y listo.&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb6&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb6-1&#34;&gt;&lt;a href=&#34;#cb6-1&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; service nginx restart&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Instalación automática de Shiny y RStudio server en Amazon Web Services con Ansible</title>
      <link>https://andresrcs.rbind.io/es/2021/03/28/aws_r_server/</link>
      <pubDate>Sun, 28 Mar 2021 00:00:00 +0000</pubDate>
      
      <guid>https://andresrcs.rbind.io/es/2021/03/28/aws_r_server/</guid>
      <description>
&lt;style type=&#34;text/css&#34;&gt;
pre &gt; code.sourceCode { white-space: pre; position: relative; }
pre &gt; code.sourceCode &gt; span { line-height: 1.25; }
pre &gt; code.sourceCode &gt; span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode &gt; span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre &gt; code.sourceCode { white-space: pre-wrap; }
pre &gt; code.sourceCode &gt; span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
  { counter-reset: source-line 0; }
pre.numberSource code &gt; span
  { position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code &gt; span &gt; a:first-child::before
  { content: counter(source-line);
    position: relative; left: -1em; text-align: right; vertical-align: baseline;
    border: none; display: inline-block;
    -webkit-touch-callout: none; -webkit-user-select: none;
    -khtml-user-select: none; -moz-user-select: none;
    -ms-user-select: none; user-select: none;
    padding: 0 4px; width: 4em;
  }
pre.numberSource { margin-left: 3em;  padding-left: 4px; }
div.sourceCode
  { color: #cccccc; background-color: #303030; }
@media screen {
pre &gt; code.sourceCode &gt; span &gt; a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ffcfaf; } /* Alert */
code span.an { color: #7f9f7f; font-weight: bold; } /* Annotation */
code span.at { } /* Attribute */
code span.bn { color: #dca3a3; } /* BaseN */
code span.bu { } /* BuiltIn */
code span.cf { color: #f0dfaf; } /* ControlFlow */
code span.ch { color: #dca3a3; } /* Char */
code span.cn { color: #dca3a3; font-weight: bold; } /* Constant */
code span.co { color: #7f9f7f; } /* Comment */
code span.cv { color: #7f9f7f; font-weight: bold; } /* CommentVar */
code span.do { color: #7f9f7f; } /* Documentation */
code span.dt { color: #dfdfbf; } /* DataType */
code span.dv { color: #dcdccc; } /* DecVal */
code span.er { color: #c3bf9f; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #c0bed1; } /* Float */
code span.fu { color: #efef8f; } /* Function */
code span.im { } /* Import */
code span.in { color: #7f9f7f; font-weight: bold; } /* Information */
code span.kw { color: #f0dfaf; } /* Keyword */
code span.op { color: #f0efd0; } /* Operator */
code span.ot { color: #efef8f; } /* Other */
code span.pp { color: #ffcfaf; font-weight: bold; } /* Preprocessor */
code span.sc { color: #dca3a3; } /* SpecialChar */
code span.ss { color: #cc9393; } /* SpecialString */
code span.st { color: #cc9393; } /* String */
code span.va { } /* Variable */
code span.vs { color: #cc9393; } /* VerbatimString */
code span.wa { color: #7f9f7f; font-weight: bold; } /* Warning */
&lt;/style&gt;

&lt;div id=&#34;TOC&#34;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#crea-una-cuenta-de-aws-y-credenciales-de-seguridad&#34; id=&#34;toc-crea-una-cuenta-de-aws-y-credenciales-de-seguridad&#34;&gt;Crea una Cuenta de AWS y Credenciales de Seguridad&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#instala-ansible&#34; id=&#34;toc-instala-ansible&#34;&gt;Instala Ansible&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#descarga-y-configura-los-playbooks&#34; id=&#34;toc-descarga-y-configura-los-playbooks&#34;&gt;Descarga y Configura los Playbooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#ejecuta-los-playbooks&#34; id=&#34;toc-ejecuta-los-playbooks&#34;&gt;Ejecuta los Playbooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#notas-finales&#34; id=&#34;toc-notas-finales&#34;&gt;Notas Finales&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;Despues de escribir una &lt;a href=&#34;https://andresrcs.rbind.io/es/2021/01/13/raspberry_pi_server/&#34;&gt;publicación muy similar&lt;/a&gt; sobre la instalación de Shiny y RStudio server en una Raspberry Pi usando automatización con Ansible, me di cuenta de que el mismo enfoque se puede portar fácilmente para trabajar con servicios de computación en la nube, así que, básicamente, esta será la versión Amazon Web Services (AWS a partir de ahora) de esa publicación.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;✏️ Ten en cuenta que este es un proyecto orientado a principiantes, no está destinado a ser una herramienta de producción, por lo que si ya estás familiarizado con Ansible, es posible que quieras simplemente descargar algunos roles de Ansible Galaxy e integrarlos en tu flujo de trabajo en lugar de seguir este artículo.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;En caso de que no hayas leído la publicación antes mencionada, te voy a contar de qué se trata. El proceso de instalación y configuración de un servidor de ciencia de datos basado en R en AWS se puede automatizar usando una herramienta llamada &lt;a href=&#34;https://es.wikipedia.org/wiki/Ansible_(software)&#34;&gt;Ansible&lt;/a&gt;, aquellos en DevOps deben estar familiarizados con el poder de Ansible, pero incluso si nunca has oído hablar de ello, no te preocupe, no necesitas saber Ansible para aprovechar sus capacidades de automatización, yo mismo no soy un experto en Ansible y he sido capaz de realizar este proyecto con solo conocimientos básicos de la herramienta, así que si yo puedo hacerlo, tu también. Te guiaré a través del proceso asumiendo que no tienes experiencia previa con esta herramienta y solo algunas habilidades básicas de terminal de Linux.&lt;/p&gt;
&lt;p&gt;Ansible es una herramienta de implementación de aplicaciones, administración de configuración y aprovisionamiento de software de código abierto que habilita la infraestructura como código. Se ejecuta en muchos sistemas de tipo Unix y puede configurar tanto sistemas tipo Unix como Microsoft Windows. En términos simples, te permite automatizar tareas en tu infraestructura (una, o muchas instancias EC2 a la vez, en nuestro caso) definiendo un conjunto de pasos para ejecutar en archivos &lt;a href=&#34;https://es.wikipedia.org/wiki/YAML&#34;&gt;YAML&lt;/a&gt;, llamados “playbooks”.&lt;/p&gt;
&lt;p&gt;Escribí algunos playbooks de Ansible para automatizar la mayor parte del proceso de instalación, pero dejé algo de espacio para que configures la instalación a tu gusto sin tener que modificar los playbooks (lo que requeriría que sepas cómo editarlos) a través de un archivo de configuración. Aunque, si deseas tener una comprensión básica de cómo funciona esta herramienta, hay una buena serie de Ansible para principiantes en el &lt;a href=&#34;https://www.youtube.com/playlist?list=PL2_OBreMn7FqZkvMYt6ATmgC0KAGGJNAN&#34;&gt;canal de YouTube de Jeff Geerling&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En caso de que no estés familiarizado con AWS, es un proveedor de servicios en la nube que, entre muchas otras cosas, brinda acceso a servidores virtuales alojados en la nube, por lo que no tienes que encargarte tu mismo de una infraestructura física, también, para seguir con este artículo, hay algunos términos específicos de AWS que debemos definir en términos simples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instancia EC2&lt;/strong&gt;: Se refiere a una instancia individual de un servidor virtual.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Amazon Machine Images (AMI)&lt;/strong&gt;: Proporciona la información necesaria para lanzar una instancia, como el sistema operativo, las bibliotecas preinstaladas y las configuraciones necesarias para que funcione un servidor. Tenga en cuenta que puede crear sus propias AMI.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Regiones&lt;/strong&gt;: Amazon EC2 está alojado en varias ubicaciones en todo el mundo. Estas ubicaciones se componen de Regiones y cada región es un área geográfica separada.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grupo de Seguridad&lt;/strong&gt;: Un grupo de seguridad actúa como un firewall virtual para que su instancia controle el tráfico entrante y saliente.&lt;/li&gt;
&lt;/ul&gt;
&lt;div id=&#34;crea-una-cuenta-de-aws-y-credenciales-de-seguridad&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Crea una Cuenta de AWS y Credenciales de Seguridad&lt;/h2&gt;
&lt;p&gt;Para utilizar los servicios de AWS, debes tener una cuenta, si ya tienes una, puedes omitir esta parte; de lo contrario, para crear una, ve a &lt;a href=&#34;https://aws.amazon.com/es/&#34;&gt;https://aws.amazon.com/es/&lt;/a&gt; y haz clic en “Crear una cuenta de AWS”, completa la información requerida y sigue presionando “Continuar”, se te pedirá que proporciones la información de tu tarjeta de crédito, pero no se te cobrará por usar los productos incluidos en el “Nivel gratuito” al menos por un año.&lt;/p&gt;
&lt;p&gt;Una vez creada tu cuenta, ve a la “Consola de administración de AWS” e inicia sesión, una vez allí, haz clic en el botón de búsqueda, escribe “EC2” y selecciona “EC2 Servidores virtuales en la nube”.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://andresrcs.rbind.io/post/2021-03-28-aws-server.es_files/aws_ec2.jpg&#34; width=&#34;700&#34; height=&#34;200&#34; /&gt;&lt;/p&gt;
&lt;p&gt;En la esquina superior derecha, elije una región adecuada, cuanto más cerca geográficamente de ti, mejor. Recuerda tu elección, ya que debes establecer esta misma ubicación en los playbooks más adelante.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://andresrcs.rbind.io/post/2021-03-28-aws-server.es_files/region.jpg&#34; width=&#34;300&#34; height=&#34;600&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Luego, en el menú de la izquierda, busca “Red y seguridad -&amp;gt; Pares de claves” y haz clic ahí.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://andresrcs.rbind.io/post/2021-03-28-aws-server.es_files/aws_key_pair.jpg&#34; width=&#34;200&#34; height=&#34;600&#34; /&gt;&lt;/p&gt;
&lt;p&gt;En la esquina superior derecha, busca “Crear par de claves” y haz clic ahí.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://andresrcs.rbind.io/post/2021-03-28-aws-server.es_files/aws_create_key.jpg&#34; width=&#34;700&#34; height=&#34;200&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Verás este cuadro de diálogo, llénalo de esta manera, haz clic en “Crear par de claves” y guarda el archivo resultante en esta ruta, &lt;code&gt;~/.ssh/aws_server.pem&lt;/code&gt;, en tu máquina.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://andresrcs.rbind.io/post/2021-03-28-aws-server.es_files/key_pair.jpg&#34; width=&#34;600&#34; height=&#34;500&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Establece los permisos adecuados para tu archivo de claves, los permisos del directorio .ssh deben ser 700 (rwx______) y la clave privada (aws_server.pem) debe ser 600 (rw_______).&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb1&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb1-1&#34;&gt;&lt;a href=&#34;#cb1-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; chmod 700 ~/.ssh/&lt;/span&gt;
&lt;span id=&#34;cb1-2&#34;&gt;&lt;a href=&#34;#cb1-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; chmod 600 ~/.ssh/aws_server.pem&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A continuación, debes crear una clave de acceso, para que puedas tener acceso a tu cuenta mediante programación, ve al menú de tu cuenta y selecciona “Mis credenciales de seguridad”.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://andresrcs.rbind.io/post/2021-03-28-aws-server.es_files/aws_security_settings.jpg&#34; width=&#34;700&#34; height=&#34;300&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Luego selecciona “Crear una clave de acceso” y guarda el archivo con tus credenciales&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://andresrcs.rbind.io/post/2021-03-28-aws-server.es_files/aws_access_key.jpg&#34; width=&#34;600&#34; height=&#34;400&#34; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ Manten el archivo descargado seguro y a mano, lo necesitarás más adelante. Ten cuidado de no compartir este archivo, ya que podría permitir que otras personas generen cargos en tu tarjeta de crédito.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div id=&#34;instala-ansible&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Instala Ansible&lt;/h2&gt;
&lt;p&gt;Es posible instalar Ansible localmente en la propia instancia EC2 y ejecutar playbooks directamente en ella con &lt;code&gt;connection: local&lt;/code&gt; pero no sería práctico porque, entre otras cosas, requeriría que lancemos manualmente la instancia EC2, es mejor ejecutar los playbooks desde un sistema que no sea tu instancia EC2.&lt;/p&gt;
&lt;p&gt;Para instalar Ansible, si tienes un sistema basado en Unix (es decir, Linux, macOS) a tu disposición, tienes suerte, instalar Ansible es muy simple.&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb2&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb2-1&#34;&gt;&lt;a href=&#34;#cb2-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Instala python3&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-2&#34;&gt;&lt;a href=&#34;#cb2-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; apt install python3 &lt;span class=&#34;co&#34;&gt;# En macOS usa `brew install python3`&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-3&#34;&gt;&lt;a href=&#34;#cb2-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Instala pip3&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-4&#34;&gt;&lt;a href=&#34;#cb2-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; apt install python3-pip &lt;/span&gt;
&lt;span id=&#34;cb2-5&#34;&gt;&lt;a href=&#34;#cb2-5&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Instala la versión 9.5.1 de Ansible con pip3 (Por reproducibilidad) &lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-6&#34;&gt;&lt;a href=&#34;#cb2-6&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; pip3 install ansible==9.5.1 &lt;span class=&#34;at&#34;&gt;--break-system-packages&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si estás en Windows, lamentablemente, no hay forma de ejecutar Ansible de forma nativa, tu mejor opción es habilitar WSL (Subsistema de Windows para Linux), instalar una distribución de Linux del Microsoft Store (recomiendo Ubuntu) y ejecutar los pasos anteriores en tu máquina virtual Linux.&lt;/p&gt;
&lt;p&gt;Puedes encontrar una guía detallada para instalar WSL &lt;a href=&#34;https://docs.microsoft.com/en-us/windows/wsl/install-win10&#34;&gt;aquí&lt;/a&gt; y puede encontrar más información sobre la instalación de Ansible en el &lt;a href=&#34;https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html&#34;&gt;sitio de documentación oficial&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Además, dado que vamos a estar probando esto en una instancia EC2 con poca potencia, algunas de estas tareas van a tomar bastante tiempo y la conexión &lt;code&gt;SSH&lt;/code&gt; podría cerrarse automáticamente por inactividad, para evitar esta situación, activa el envío de paquetes “keep-alive” al servidor editando el archivo &lt;code&gt;ssh_config&lt;/code&gt; con &lt;code&gt;sudo nano /etc/ssh/ssh_config&lt;/code&gt; y agregando estas dos líneas debajo de &lt;code&gt;Host *&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb3&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb3-1&#34;&gt;&lt;a href=&#34;#cb3-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;ServerAliveInterval&lt;/span&gt; 300&lt;/span&gt;
&lt;span id=&#34;cb3-2&#34;&gt;&lt;a href=&#34;#cb3-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;ServerAliveCountMax&lt;/span&gt; 2&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ Es muy importante no saltarse el paso anterior, de lo contrario, la conexión SSH fallará silenciosamente mientras se ejecutan tareas largas en Ansible y vas a estar esperando inútilmente con tu instancia EC2 sin hacer nada en realidad.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div id=&#34;descarga-y-configura-los-playbooks&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Descarga y Configura los Playbooks&lt;/h2&gt;
&lt;p&gt;Los playbooks están en un repositorio público en GitHub, puedes clonar el repositorio con estos comandos:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb4&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb4-1&#34;&gt;&lt;a href=&#34;#cb4-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Instala git si aún no lo tienes&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-2&#34;&gt;&lt;a href=&#34;#cb4-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; apt install git &lt;span class=&#34;co&#34;&gt;# En macOS usa `brew install git`&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-3&#34;&gt;&lt;a href=&#34;#cb4-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Clona el último commit del repositorio&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-4&#34;&gt;&lt;a href=&#34;#cb4-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;git&lt;/span&gt; clone https://github.com/andresrcs/aws_r_server.git &lt;span class=&#34;at&#34;&gt;--depth&lt;/span&gt; 1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Para comenzar a configurar los playbooks, por lo general, primero debes definir un “inventario” (una lista de servidores a los que conectarse), pero en este caso, el playbook &lt;code&gt;provision_ec2_instance.yml&lt;/code&gt; creará uno automáticamente para ti cuando lo ejecutes y los otros playbooks obtendrán un inventario actualizado de AWS automáticamente usando el plugging &lt;code&gt;aws_ec2&lt;/code&gt; cuando sea necesario, esta es una de las ventajas de trabajar con servicios de computación en la nube bien soportados como AWS, pero para que el plugging &lt;code&gt;aws_ec2&lt;/code&gt; pueda hacer su magia, debes proporcionarle tus credenciales de AWS y definir tu &lt;a href=&#34;https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-available-regions&#34;&gt;región de AWS EC2&lt;/a&gt;, así que edita el archivo &lt;code&gt;aws_r_server/inventories/aws_ec2.yml&lt;/code&gt;, y completa tus credenciales y región en las variables respectivas. Recuerda que ya creaste estas credenciales en un paso anterior y guardaste un archivo .csv que las contiene, además, la región de AWS que configures aquí debe ser la misma que seleccionaste cuando comenzaste a crear tus credenciales.&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb5&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb5-1&#34;&gt;&lt;a href=&#34;#cb5-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-2&#34;&gt;&lt;a href=&#34;#cb5-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;plugin:&lt;/span&gt; aws_ec2&lt;/span&gt;
&lt;span id=&#34;cb5-3&#34;&gt;&lt;a href=&#34;#cb5-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-4&#34;&gt;&lt;a href=&#34;#cb5-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;aws_access_key:&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;tu_código_de_acceso_va_aqui&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-5&#34;&gt;&lt;a href=&#34;#cb5-5&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;aws_secret_key:&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;tu_código_secreto_va_aqui&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-6&#34;&gt;&lt;a href=&#34;#cb5-6&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-7&#34;&gt;&lt;a href=&#34;#cb5-7&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;regions:&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-8&#34;&gt;&lt;a href=&#34;#cb5-8&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;regin_aws_más_cercana&amp;#39;&lt;/span&gt; &lt;span class=&#34;co&#34;&gt;# Por ejemplo sa-east-1&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-9&#34;&gt;&lt;a href=&#34;#cb5-9&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-10&#34;&gt;&lt;a href=&#34;#cb5-10&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;hostnames:&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-11&#34;&gt;&lt;a href=&#34;#cb5-11&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;ip-address&amp;#39;&lt;/span&gt; &lt;span class=&#34;co&#34;&gt;# No cambies esto&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-12&#34;&gt;&lt;a href=&#34;#cb5-12&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-13&#34;&gt;&lt;a href=&#34;#cb5-13&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;keyed_groups:&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-14&#34;&gt;&lt;a href=&#34;#cb5-14&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; key: tags.inventory_group&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ahora, si deseas cambiar la configuración de instalación predeterminada, puedes hacerlo editando las variables en el archivo &lt;code&gt;aws_r_server/vars/config_vars.yml&lt;/code&gt;, aunque las opciones predeterminadas están bien para la mayoría de los casos de uso, incluida una configuración de seguridad razonable para usar en aplicaciones del mundo real. Lo único que debes cambiar aquí son las credenciales de AWS, la región de AWS, la AMI de AWS (esto cambia constantemente incluso para la misma version del sistema operativo), el usuario personal y su contraseña, y la contraseña del usuario principal de PostgreSQL.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;✏️ Esta publicación se ha escrito como un ejemplo de la aplicación de este enfoque con servicios de computación en la nube, por lo que, en aras de la simplicidad, lo hice funcionar solo con la AMI de Ubuntu Server 22.04 LTS, por lo que, para ser claro, no es independiente del sistema operativo. Si deseas utilizarlo con una AMI basada en RHEL, deberás modificar considerablemente los playbooks.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb6&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb6-1&#34;&gt;&lt;a href=&#34;#cb6-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-2&#34;&gt;&lt;a href=&#34;#cb6-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Variables de Congiguración de AWS ############################################&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-3&#34;&gt;&lt;a href=&#34;#cb6-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-4&#34;&gt;&lt;a href=&#34;#cb6-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Credenciales de AWS&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-5&#34;&gt;&lt;a href=&#34;#cb6-5&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;aws_access_key:&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;tu_código_de_acceso_va_aqui&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-6&#34;&gt;&lt;a href=&#34;#cb6-6&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;aws_secret_key:&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;tu_código_secreto_va_aqui&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-7&#34;&gt;&lt;a href=&#34;#cb6-7&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-8&#34;&gt;&lt;a href=&#34;#cb6-8&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Configuración General de AWS&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-9&#34;&gt;&lt;a href=&#34;#cb6-9&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;aws_region:&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;regin_aws_más_cercana&amp;#39;&lt;/span&gt; &lt;span class=&#34;co&#34;&gt;# Por ejemplo sa-east-1&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-10&#34;&gt;&lt;a href=&#34;#cb6-10&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;aws_ec2_ami:&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;ami-08ae71fd7f1449df1&amp;#39;&lt;/span&gt; &lt;span class=&#34;co&#34;&gt;# Ubuntu 22.04 LTS&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-11&#34;&gt;&lt;a href=&#34;#cb6-11&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-12&#34;&gt;&lt;a href=&#34;#cb6-12&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Lista de instancias&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-13&#34;&gt;&lt;a href=&#34;#cb6-13&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;instances:&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-14&#34;&gt;&lt;a href=&#34;#cb6-14&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; name: rstudio&lt;/span&gt;
&lt;span id=&#34;cb6-15&#34;&gt;&lt;a href=&#34;#cb6-15&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;group:&lt;/span&gt; aws&lt;/span&gt;
&lt;span id=&#34;cb6-16&#34;&gt;&lt;a href=&#34;#cb6-16&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;security_group:&lt;/span&gt; [&lt;span class=&#34;st&#34;&gt;&amp;quot;default&amp;quot;&lt;/span&gt;, &lt;span class=&#34;st&#34;&gt;&amp;quot;public_server&amp;quot;&lt;/span&gt;]&lt;/span&gt;
&lt;span id=&#34;cb6-17&#34;&gt;&lt;a href=&#34;#cb6-17&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;ssh_key:&lt;/span&gt; aws_server&lt;/span&gt;
&lt;span id=&#34;cb6-18&#34;&gt;&lt;a href=&#34;#cb6-18&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;type:&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;t2.micro&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-19&#34;&gt;&lt;a href=&#34;#cb6-19&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-20&#34;&gt;&lt;a href=&#34;#cb6-20&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Configuración del firewall de AWS&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-21&#34;&gt;&lt;a href=&#34;#cb6-21&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;security_groups:&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-22&#34;&gt;&lt;a href=&#34;#cb6-22&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; name: public_server&lt;/span&gt;
&lt;span id=&#34;cb6-23&#34;&gt;&lt;a href=&#34;#cb6-23&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;rules:&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-24&#34;&gt;&lt;a href=&#34;#cb6-24&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;      &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; proto: tcp &lt;span class=&#34;co&#34;&gt;# http&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-25&#34;&gt;&lt;a href=&#34;#cb6-25&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;from_port:&lt;/span&gt; 80&lt;/span&gt;
&lt;span id=&#34;cb6-26&#34;&gt;&lt;a href=&#34;#cb6-26&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;to_port:&lt;/span&gt; 80&lt;/span&gt;
&lt;span id=&#34;cb6-27&#34;&gt;&lt;a href=&#34;#cb6-27&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;cidr_ip:&lt;/span&gt; 0.0.0.0/0&lt;/span&gt;
&lt;span id=&#34;cb6-28&#34;&gt;&lt;a href=&#34;#cb6-28&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;      &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; proto: tcp  &lt;span class=&#34;co&#34;&gt;# https&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-29&#34;&gt;&lt;a href=&#34;#cb6-29&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;from_port:&lt;/span&gt; 443&lt;/span&gt;
&lt;span id=&#34;cb6-30&#34;&gt;&lt;a href=&#34;#cb6-30&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;to_port:&lt;/span&gt; 443&lt;/span&gt;
&lt;span id=&#34;cb6-31&#34;&gt;&lt;a href=&#34;#cb6-31&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;cidr_ip:&lt;/span&gt; 0.0.0.0/0&lt;/span&gt;
&lt;span id=&#34;cb6-32&#34;&gt;&lt;a href=&#34;#cb6-32&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;      &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; proto: tcp  &lt;span class=&#34;co&#34;&gt;# SSH TCP&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-33&#34;&gt;&lt;a href=&#34;#cb6-33&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;from_port:&lt;/span&gt; 22&lt;/span&gt;
&lt;span id=&#34;cb6-34&#34;&gt;&lt;a href=&#34;#cb6-34&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;to_port:&lt;/span&gt; 22&lt;/span&gt;
&lt;span id=&#34;cb6-35&#34;&gt;&lt;a href=&#34;#cb6-35&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;cidr_ip:&lt;/span&gt; 0.0.0.0/0&lt;/span&gt;
&lt;span id=&#34;cb6-36&#34;&gt;&lt;a href=&#34;#cb6-36&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;      &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; proto: udp  &lt;span class=&#34;co&#34;&gt;# SSH UDP&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-37&#34;&gt;&lt;a href=&#34;#cb6-37&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;from_port:&lt;/span&gt; 22&lt;/span&gt;
&lt;span id=&#34;cb6-38&#34;&gt;&lt;a href=&#34;#cb6-38&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;to_port:&lt;/span&gt; 22&lt;/span&gt;
&lt;span id=&#34;cb6-39&#34;&gt;&lt;a href=&#34;#cb6-39&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;cidr_ip:&lt;/span&gt; 0.0.0.0/0&lt;/span&gt;
&lt;span id=&#34;cb6-40&#34;&gt;&lt;a href=&#34;#cb6-40&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;      &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; proto: tcp  &lt;span class=&#34;co&#34;&gt;# PostgreSQL&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-41&#34;&gt;&lt;a href=&#34;#cb6-41&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;from_port:&lt;/span&gt; 5432&lt;/span&gt;
&lt;span id=&#34;cb6-42&#34;&gt;&lt;a href=&#34;#cb6-42&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;to_port:&lt;/span&gt; 5432&lt;/span&gt;
&lt;span id=&#34;cb6-43&#34;&gt;&lt;a href=&#34;#cb6-43&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;cidr_ip:&lt;/span&gt; 0.0.0.0/0&lt;/span&gt;
&lt;span id=&#34;cb6-44&#34;&gt;&lt;a href=&#34;#cb6-44&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;rules_egress:&lt;/span&gt; []&lt;/span&gt;
&lt;span id=&#34;cb6-45&#34;&gt;&lt;a href=&#34;#cb6-45&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-46&#34;&gt;&lt;a href=&#34;#cb6-46&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Configuraciones del Sistema ##################################################&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-47&#34;&gt;&lt;a href=&#34;#cb6-47&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-48&#34;&gt;&lt;a href=&#34;#cb6-48&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Usuario Personal&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-49&#34;&gt;&lt;a href=&#34;#cb6-49&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;personal_user:&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;tu_usuario_de_linux&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-50&#34;&gt;&lt;a href=&#34;#cb6-50&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;personal_user_password:&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;password_muy_seguro&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-51&#34;&gt;&lt;a href=&#34;#cb6-51&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-52&#34;&gt;&lt;a href=&#34;#cb6-52&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Parametros Swap&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-53&#34;&gt;&lt;a href=&#34;#cb6-53&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;swap_file_path:&lt;/span&gt; /var/swap&lt;/span&gt;
&lt;span id=&#34;cb6-54&#34;&gt;&lt;a href=&#34;#cb6-54&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Use any of the following suffixes&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-55&#34;&gt;&lt;a href=&#34;#cb6-55&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# c=1&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-56&#34;&gt;&lt;a href=&#34;#cb6-56&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# w=2&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-57&#34;&gt;&lt;a href=&#34;#cb6-57&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# b=512&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-58&#34;&gt;&lt;a href=&#34;#cb6-58&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# kB=1000&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-59&#34;&gt;&lt;a href=&#34;#cb6-59&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# K=1024&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-60&#34;&gt;&lt;a href=&#34;#cb6-60&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# MB=1000*1000&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-61&#34;&gt;&lt;a href=&#34;#cb6-61&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# M=1024*1024&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-62&#34;&gt;&lt;a href=&#34;#cb6-62&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# xM=M&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-63&#34;&gt;&lt;a href=&#34;#cb6-63&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# GB=1000*1000*1000&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-64&#34;&gt;&lt;a href=&#34;#cb6-64&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# G=1024*1024*1024&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-65&#34;&gt;&lt;a href=&#34;#cb6-65&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;swap_file_size:&lt;/span&gt; 3GB&lt;/span&gt;
&lt;span id=&#34;cb6-66&#34;&gt;&lt;a href=&#34;#cb6-66&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;swappiness:&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;10&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-67&#34;&gt;&lt;a href=&#34;#cb6-67&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-68&#34;&gt;&lt;a href=&#34;#cb6-68&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Lenguaje y configuración local&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-69&#34;&gt;&lt;a href=&#34;#cb6-69&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;language_pack:&lt;/span&gt; []                 &lt;span class=&#34;co&#34;&gt;#  Por ejemplo language-pack-es-base&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-70&#34;&gt;&lt;a href=&#34;#cb6-70&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;default_locale:&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;en_US.UTF-8&amp;#39;&lt;/span&gt;     &lt;span class=&#34;co&#34;&gt;#  Por ejemplo es_PE.UTF-8&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-71&#34;&gt;&lt;a href=&#34;#cb6-71&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-72&#34;&gt;&lt;a href=&#34;#cb6-72&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Configuraciones de Seguridad #################################################&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-73&#34;&gt;&lt;a href=&#34;#cb6-73&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-74&#34;&gt;&lt;a href=&#34;#cb6-74&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Password para Postgresql&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-75&#34;&gt;&lt;a href=&#34;#cb6-75&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;postgres_password:&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;password_muy_seguro&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-76&#34;&gt;&lt;a href=&#34;#cb6-76&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-77&#34;&gt;&lt;a href=&#34;#cb6-77&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Reglas de acceso para Postgresql&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-78&#34;&gt;&lt;a href=&#34;#cb6-78&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;postgresql_rules:&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-79&#34;&gt;&lt;a href=&#34;#cb6-79&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; { contype: local, users: all, address: samehost, method: trust }&lt;/span&gt;
&lt;span id=&#34;cb6-80&#34;&gt;&lt;a href=&#34;#cb6-80&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; { contype: local, users: postgres, address: samehost, method: trust }&lt;/span&gt;
&lt;span id=&#34;cb6-81&#34;&gt;&lt;a href=&#34;#cb6-81&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; { contype: host, users: all, address: 0.0.0.0/0, method: password }&lt;/span&gt;
&lt;span id=&#34;cb6-82&#34;&gt;&lt;a href=&#34;#cb6-82&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; { contype: host, users: all, address: 127.0.0.1/32, method: md5 }&lt;/span&gt;
&lt;span id=&#34;cb6-83&#34;&gt;&lt;a href=&#34;#cb6-83&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; { contype: host, users: all, address: &lt;span class=&#34;st&#34;&gt;&amp;#39;::1/128&amp;#39;&lt;/span&gt;, method: trust }&lt;/span&gt;
&lt;span id=&#34;cb6-84&#34;&gt;&lt;a href=&#34;#cb6-84&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-85&#34;&gt;&lt;a href=&#34;#cb6-85&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Versiones del Software Principal #############################################&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-86&#34;&gt;&lt;a href=&#34;#cb6-86&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-87&#34;&gt;&lt;a href=&#34;#cb6-87&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Versión de Shiny-server a instalar&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-88&#34;&gt;&lt;a href=&#34;#cb6-88&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;shiny_server_version:&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;1.5.19.995&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-89&#34;&gt;&lt;a href=&#34;#cb6-89&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-90&#34;&gt;&lt;a href=&#34;#cb6-90&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Versión de RStudio a instalar&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-91&#34;&gt;&lt;a href=&#34;#cb6-91&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;rstudio_version:&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;2022.07.1+554&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-92&#34;&gt;&lt;a href=&#34;#cb6-92&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;preview_version:&lt;/span&gt; false&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;ejecuta-los-playbooks&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Ejecuta los Playbooks&lt;/h2&gt;
&lt;p&gt;Simplemente puede acceder a la carpeta &lt;code&gt;aws_r_server&lt;/code&gt; y ejecutar el playbook &lt;code&gt;main.yml&lt;/code&gt; para instalar todo a la vez de esta manera:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb7&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb7-1&#34;&gt;&lt;a href=&#34;#cb7-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;bu&#34;&gt;cd&lt;/span&gt; aws_r_server&lt;/span&gt;
&lt;span id=&#34;cb7-2&#34;&gt;&lt;a href=&#34;#cb7-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;ansible-playbook&lt;/span&gt; main.yml&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pero para hacer que el proceso de instalación sea más flexible, he dividido el proceso en cuatro playbooks individuales:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb8&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb8-1&#34;&gt;&lt;a href=&#34;#cb8-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;ansible-playbook&lt;/span&gt; provision_ec2_instance.yml&lt;/span&gt;
&lt;span id=&#34;cb8-2&#34;&gt;&lt;a href=&#34;#cb8-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;ansible-playbook&lt;/span&gt; install_basic_services.yml&lt;/span&gt;
&lt;span id=&#34;cb8-3&#34;&gt;&lt;a href=&#34;#cb8-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;ansible-playbook&lt;/span&gt; install_shiny_server.yml&lt;/span&gt;
&lt;span id=&#34;cb8-4&#34;&gt;&lt;a href=&#34;#cb8-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;ansible-playbook&lt;/span&gt; install_rstudio_server.yml&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ Al aprovisionar la instancia ec2, la API de AWS a veces no devuelve la IP de la instancia, lo que hace que falle el playbook. Este es un error aleatorio no causado por el playbook, puedes ignorarlo con seguridad si estás ejecutando playbooks individuales y la instancia ya se ha aprovisionado.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Si decides que solo necesitas Shiny server o RStudio server pero no el otro, o si ya has instalado los servicios de soporte que vas a utilizar, puedes ejecutar solo los playbooks que realmente necesitas.&lt;/p&gt;
&lt;p&gt;Si deseas actualizar algo en el futuro, como RStudio o Shiny (no puedo garantizar que siempre funcionará sin necesidad de cambios), simplemente puedes cambiar la versión en el archivo de configuración y ejecutar la parte específica del playbook aprovechando las “etiquetas” definidas.&lt;/p&gt;
&lt;p&gt;Por ejemplo, esto solo instalará la versión de RStudio definida en el archivo de configuración y nada más:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb9&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb9-1&#34;&gt;&lt;a href=&#34;#cb9-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;ansible-playbook&lt;/span&gt; install_rstudio_server.yml &lt;span class=&#34;at&#34;&gt;--tags&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;rstudio&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Las etiquetas disponibles son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;install_basic_services.yml
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;secure&lt;/code&gt;: Establecer la configuración de seguridad en el servidor&lt;/li&gt;
&lt;li&gt;&lt;code&gt;swap&lt;/code&gt;: Agregar memoria swap al servidor&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nginx&lt;/code&gt;: Instalar y configurar Nginx + PHP&lt;/li&gt;
&lt;li&gt;&lt;code&gt;postgresql&lt;/code&gt;: Instalar y configurar PostgreSQL&lt;/li&gt;
&lt;li&gt;&lt;code&gt;r&lt;/code&gt;: Instalar R desde el repositorio CRAN&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;install_shiny_server.yml
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;shiny-server&lt;/code&gt;: Instalar shiny-server&lt;/li&gt;
&lt;li&gt;&lt;code&gt;configure_shiny&lt;/code&gt;: Configurar shiny-server&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;install_rstudio_server.yml
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rstudio&lt;/code&gt;: Instalar RStudio server&lt;/li&gt;
&lt;li&gt;&lt;code&gt;configure_rstudio&lt;/code&gt;: Configurar RStudio server&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;También puedes hacer lo contrario y omitir partes específicas de los playbooks usando la opción &lt;code&gt;--skip-tags&lt;/code&gt;, por ejemplo, si no necesitas PostgreSQL, puedes evitar instalarlo ejecutando el playbook de esta manera:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb10&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb10-1&#34;&gt;&lt;a href=&#34;#cb10-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;ansible-playbook&lt;/span&gt; install_basic_services.yml &lt;span class=&#34;at&#34;&gt;--skip-tags&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;postgresql&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Después de ejecutar con éxito todos los playbooks, tendrás una instalación completamente funcional lista para ser utilizada, por lo que podras simplemente abrir una sesión de RStudio en &lt;code&gt;http://ip_de_tu_servidor/rstudio/&lt;/code&gt; y/o publicar tus aplicaciones Shiny en la carpeta &lt;code&gt;/srv/shiny-server&lt;/code&gt; y acceder a ellas en &lt;code&gt;http://ip_de_tu_servidor/shiny/nombre_de_tu_app&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;notas-finales&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Notas Finales&lt;/h2&gt;
&lt;p&gt;Para terminar, solo quiero informarte que hay otras opciones para obtener RStudio y Shiny server en AWS que podrías considerar más simples, como usar una AMI o contenedores prefabricados, pero no son tan flexibles y personalizables como definir tu propia infraestructura en código con Ansible. Obviamente, el ejemplo de este artículo es mi concepción de una instalación básica para un servidor de ciencia de datos basado en R, pero puedes usarlo como punto de partida para personalizar tu propia infraestructura y hacer que tu flujo de trabajo sea más eficiente a medida que te vuelvas más competente con Ansible.&lt;/p&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Instalación automática de Shiny y RStudio server en Raspberry Pi con Ansible</title>
      <link>https://andresrcs.rbind.io/es/2021/01/13/raspberry_pi_server/</link>
      <pubDate>Wed, 13 Jan 2021 00:00:00 +0000</pubDate>
      
      <guid>https://andresrcs.rbind.io/es/2021/01/13/raspberry_pi_server/</guid>
      <description>
&lt;style type=&#34;text/css&#34;&gt;
pre &gt; code.sourceCode { white-space: pre; position: relative; }
pre &gt; code.sourceCode &gt; span { line-height: 1.25; }
pre &gt; code.sourceCode &gt; span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode &gt; span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre &gt; code.sourceCode { white-space: pre-wrap; }
pre &gt; code.sourceCode &gt; span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
  { counter-reset: source-line 0; }
pre.numberSource code &gt; span
  { position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code &gt; span &gt; a:first-child::before
  { content: counter(source-line);
    position: relative; left: -1em; text-align: right; vertical-align: baseline;
    border: none; display: inline-block;
    -webkit-touch-callout: none; -webkit-user-select: none;
    -khtml-user-select: none; -moz-user-select: none;
    -ms-user-select: none; user-select: none;
    padding: 0 4px; width: 4em;
  }
pre.numberSource { margin-left: 3em;  padding-left: 4px; }
div.sourceCode
  { color: #cccccc; background-color: #303030; }
@media screen {
pre &gt; code.sourceCode &gt; span &gt; a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ffcfaf; } /* Alert */
code span.an { color: #7f9f7f; font-weight: bold; } /* Annotation */
code span.at { } /* Attribute */
code span.bn { color: #dca3a3; } /* BaseN */
code span.bu { } /* BuiltIn */
code span.cf { color: #f0dfaf; } /* ControlFlow */
code span.ch { color: #dca3a3; } /* Char */
code span.cn { color: #dca3a3; font-weight: bold; } /* Constant */
code span.co { color: #7f9f7f; } /* Comment */
code span.cv { color: #7f9f7f; font-weight: bold; } /* CommentVar */
code span.do { color: #7f9f7f; } /* Documentation */
code span.dt { color: #dfdfbf; } /* DataType */
code span.dv { color: #dcdccc; } /* DecVal */
code span.er { color: #c3bf9f; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #c0bed1; } /* Float */
code span.fu { color: #efef8f; } /* Function */
code span.im { } /* Import */
code span.in { color: #7f9f7f; font-weight: bold; } /* Information */
code span.kw { color: #f0dfaf; } /* Keyword */
code span.op { color: #f0efd0; } /* Operator */
code span.ot { color: #efef8f; } /* Other */
code span.pp { color: #ffcfaf; font-weight: bold; } /* Preprocessor */
code span.sc { color: #dca3a3; } /* SpecialChar */
code span.ss { color: #cc9393; } /* SpecialString */
code span.st { color: #cc9393; } /* String */
code span.va { } /* Variable */
code span.vs { color: #cc9393; } /* VerbatimString */
code span.wa { color: #7f9f7f; font-weight: bold; } /* Warning */
&lt;/style&gt;

&lt;div id=&#34;TOC&#34;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#prepara-la-raspberry-pi&#34; id=&#34;toc-prepara-la-raspberry-pi&#34;&gt;Prepara la Raspberry Pi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#instala-ansible&#34; id=&#34;toc-instala-ansible&#34;&gt;Instala Ansible&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#descarga-y-configura-los-playbooks&#34; id=&#34;toc-descarga-y-configura-los-playbooks&#34;&gt;Descarga y configura los Playbooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#ejecuta-los-playbooks&#34; id=&#34;toc-ejecuta-los-playbooks&#34;&gt;Ejecuta los Playbooks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#notas-finales&#34; id=&#34;toc-notas-finales&#34;&gt;Notas Finales&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;Tengo una &lt;a href=&#34;https://andresrcs.rbind.io/es/2022/09/05/shiny_rstudio_server/&#34;&gt;publicación relacionada&lt;/a&gt; sobre la instalación manual de Shiny y RStudio Server en una Raspberry Pi, pero incluso con los últimos avances en el soporte de software para la arquitectura ARM, este proceso aún consume mucho tiempo y requiere mucho copiar/pegar y observar la terminal esperando que se complete una tarea para poder comenzar con la siguiente, así que decidí idear una mejor solución, y es automatizar el proceso para que pueda dejarse desatendido y regresar más tarde cuando haya terminado.&lt;/p&gt;
&lt;p&gt;Para automatizar el proceso de instalación y configuración, decidí usar &lt;a href=&#34;https://es.wikipedia.org/wiki/Ansible_(software)&#34;&gt;Ansible&lt;/a&gt;, aquellos en DevOps deben estar familiarizados con el poder de Ansible, pero incluso si nunca has escuchado de ello, no te preocupes, no necesitas conocer Ansible para aprovechar sus capacidades de automatización, yo mismo no soy un experto en Ansible y he sido capaz de realizar este proyecto con solo conocimientos básicos de la herramienta, así que si yo puedo hacerlo, tú también puedes. Te guiaré a través del proceso asumiendo que no tienes experiencia previa con esta herramienta y solo algunas habilidades básicas de terminal de Linux.&lt;/p&gt;
&lt;p&gt;Ansible es una herramienta de implementación de aplicaciones, administración de configuración y aprovisionamiento de software de código abierto que habilita la infraestructura como código. Se ejecuta en muchos sistemas de tipo Unix y puede configurar tanto sistemas tipo Unix como Microsoft Windows. En términos simples, te permite automatizar tareas en tu infraestructura (una, o muchas Raspberry Pi a la vez en nuestro caso) definiendo un conjunto de pasos para ejecutar en archivos &lt;a href=&#34;https://es.wikipedia.org/wiki/YAML&#34;&gt;YAML&lt;/a&gt; llamados “playbooks”. Me sacrifique por el equipo y escribí algunos playbooks de Ansible para automatizar la mayor parte del proceso de instalación, pero dejando algo de espacio para que configures la instalación a tu gusto a través de un archivo de configuración, por lo que no necesitas modificar los playbooks (lo que requerirá que sepas cómo funcionan). Aunque, si deseas tener una comprensión básica de cómo funciona esta herramienta, hay una buena serie de Ansible para principiantes en &lt;a href=&#34;https://www.youtube.com/playlist?list=PL2_OBreMn7FqZkvMYt6ATmgC0KAGGJNAN&#34;&gt;el canal de YouTube de Jeff Geerling&lt;/a&gt; y si eres el tipo de personas que prefiere leer en lugar de ver cosas, aquí hay un &lt;a href=&#34;https://spacelift.io/blog/ansible-tutorial&#34;&gt;Tutorial de Ansible para principiantes&lt;/a&gt; bastante agradable pero lamentablemente, está sólo en inglés.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;✏️ Ten en cuenta que esto solo se ha probado con las versiones de software especificadas en el archivo &lt;code&gt;config_vars.yml&lt;/code&gt;, es muy probable que funcione aún con las versiones de software más nuevas, pero en algunos casos, podría requerir algunas modificaciones a los playbooks, las que haré tan pronto como note el problema.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div id=&#34;prepara-la-raspberry-pi&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Prepara la Raspberry Pi&lt;/h2&gt;
&lt;p&gt;Incluso si la mayor parte del proceso se puede automatizar con Ansible, aún necesitamos al menos una Raspberry Pi en funcionamiento para configurar, por lo tanto, debemos comenzar cargando un sistema operativo (SO) en una tarjeta SD (recomiendo al menos 32 GB clase 10 HC1). Ten en cuenta que RStudio Server es compatible solo con los sistemas operativos arm64, por lo que si deseas poder instalarlo, deberás elegir un sistema operativo de 64 bits, los playbooks funcionan tanto con Raspberry Pi OS como con Ubuntu.&lt;/p&gt;
&lt;p&gt;Descarga “Raspberry Pi Imager” del &lt;a href=&#34;https://www.raspberrypi.com/software/&#34;&gt;sitio oficial&lt;/a&gt; e instálalo en tu sistema, ejecuta “Raspberry Pi Imager”, selecciona un sistema operativo adecuado, elije tu “Tarjeta SD” y presiona “Escribir”.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://andresrcs.rbind.io/post/2021-01-13-raspberry-pi-server.en_files/raspberri_pi_imager.jpg&#34; width=&#34;400&#34; height=&#34;300&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Una vez finalizado el proceso, tendras una instalación limpia de un sistema operativo en tu tarjeta micro SD, inserta la tarjeta en tu Raspberry Pi, conecta un teclado y una pantalla y enciéndela.&lt;/p&gt;
&lt;p&gt;Inicia sesión en el sistema (el usuario y la contraseña predeterminados son &lt;code&gt;pi&lt;/code&gt; y &lt;code&gt;raspberry&lt;/code&gt; para Raspberry Pi OS, y en Ubuntu es &lt;code&gt;ubuntu&lt;/code&gt; tanto para el usuario como para la contraseña) y ejecuta una actualización inicial del sistema con estos comandos:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb1&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb1-1&#34;&gt;&lt;a href=&#34;#cb1-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; apt update&lt;/span&gt;
&lt;span id=&#34;cb1-2&#34;&gt;&lt;a href=&#34;#cb1-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; apt dist-upgrade&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A continuación, debes configurar una IP estática para que puedas encontrar tu Pi fácilmente en tu red más adelante.&lt;/p&gt;
&lt;p&gt;Para configurar una IP estática en Raspberry Pi OS, ejecuta estos comandos. Esta es una configuración de IP de muestra para una conexión por cable, modificala de acuerdo a tus propias necesidades:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb2&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb2-1&#34;&gt;&lt;a href=&#34;#cb2-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Configuración IP de muestra:&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-2&#34;&gt;&lt;a href=&#34;#cb2-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; nmcli c mod &lt;span class=&#34;st&#34;&gt;&amp;#39;Wired connection 1&amp;#39;&lt;/span&gt; ipv4.addresses 192.168.3.101/24 ipv4.method manual&lt;/span&gt;
&lt;span id=&#34;cb2-3&#34;&gt;&lt;a href=&#34;#cb2-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; nmcli con mod &lt;span class=&#34;st&#34;&gt;&amp;#39;Wired connection 1&amp;#39;&lt;/span&gt; ipv4.gateway 192.168.3.1&lt;/span&gt;
&lt;span id=&#34;cb2-4&#34;&gt;&lt;a href=&#34;#cb2-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; nmcli con mod &lt;span class=&#34;st&#34;&gt;&amp;#39;Wired connection 1&amp;#39;&lt;/span&gt; ipv4.dns &lt;span class=&#34;st&#34;&gt;&amp;quot;192.168.3.1&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-5&#34;&gt;&lt;a href=&#34;#cb2-5&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; nmcli c down &lt;span class=&#34;st&#34;&gt;&amp;#39;Wired connection 1&amp;#39;&lt;/span&gt; &lt;span class=&#34;kw&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; nmcli c up &lt;span class=&#34;st&#34;&gt;&amp;#39;Wired connection 1&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Luego debes volver a establecer una nueva conexión SSH con tu Pi ya que el IP ha cambiado.&lt;/p&gt;
&lt;p&gt;Y para configurar la IP en Ubuntu, debes crear este archivo, &lt;code&gt;sudo nano /etc/netplan/01-netcfg.yaml&lt;/code&gt;, agregar el siguiente contenido (edita según sea necesario) y aplicar la configuración con &lt;code&gt;sudo netplan apply&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb3&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb3-1&#34;&gt;&lt;a href=&#34;#cb3-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;network:&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb3-2&#34;&gt;&lt;a href=&#34;#cb3-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;version:&lt;/span&gt; 2&lt;/span&gt;
&lt;span id=&#34;cb3-3&#34;&gt;&lt;a href=&#34;#cb3-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;renderer:&lt;/span&gt; networkd&lt;/span&gt;
&lt;span id=&#34;cb3-4&#34;&gt;&lt;a href=&#34;#cb3-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;ethernets:&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb3-5&#34;&gt;&lt;a href=&#34;#cb3-5&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;ex&#34;&gt;eth0:&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb3-6&#34;&gt;&lt;a href=&#34;#cb3-6&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            &lt;span class=&#34;ex&#34;&gt;dhcp4:&lt;/span&gt; false&lt;/span&gt;
&lt;span id=&#34;cb3-7&#34;&gt;&lt;a href=&#34;#cb3-7&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            &lt;span class=&#34;ex&#34;&gt;addresses:&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb3-8&#34;&gt;&lt;a href=&#34;#cb3-8&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; 192.168.3.101/24&lt;/span&gt;
&lt;span id=&#34;cb3-9&#34;&gt;&lt;a href=&#34;#cb3-9&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            &lt;span class=&#34;ex&#34;&gt;nameservers:&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb3-10&#34;&gt;&lt;a href=&#34;#cb3-10&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                &lt;span class=&#34;ex&#34;&gt;addresses:&lt;/span&gt; [8.8.8.8, 8.8.4.4, 192.168.3.1]&lt;/span&gt;
&lt;span id=&#34;cb3-11&#34;&gt;&lt;a href=&#34;#cb3-11&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            &lt;span class=&#34;ex&#34;&gt;routes:&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb3-12&#34;&gt;&lt;a href=&#34;#cb3-12&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; to: default&lt;/span&gt;
&lt;span id=&#34;cb3-13&#34;&gt;&lt;a href=&#34;#cb3-13&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                  &lt;span class=&#34;ex&#34;&gt;via:&lt;/span&gt; 192.168.3.1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Luego necesitamos establecer algunas configuraciones básicas con &lt;code&gt;raspi-config&lt;/code&gt;. Ejecuta &lt;code&gt;sudo raspi-config&lt;/code&gt; y realiza las siguientes tareas (en Ubuntu debes instalarlo primero con &lt;code&gt;sudo apt install raspi-config&lt;/code&gt;):&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://andresrcs.rbind.io/post/2021-01-13-raspberry-pi-server.es_files/raspi_config.jpg&#34; width=&#34;600&#34; height=&#34;300&#34; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Opcionalmente, cambia la contraseña del usuario “pi” (System Options –&amp;gt; Password)&lt;/li&gt;
&lt;li&gt;Habilita el servidor SSH (Interface Options –&amp;gt; SSH)&lt;/li&gt;
&lt;li&gt;Establece tu configuración regional (Localization Options)&lt;/li&gt;
&lt;li&gt;Expande el sistema de archivos para utilizar la capacidad total de tu tarjeta SD (Advanced Options –&amp;gt; Expand Filesystem)&lt;/li&gt;
&lt;li&gt;Deshabilita los nombres de interfaz de red predecibles (Advanced Options –&amp;gt; Network Interface Names)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cuando hayas terminado, sal de la herramienta &lt;code&gt;raspi-config&lt;/code&gt; y reinicia tu Pi.&lt;/p&gt;
&lt;p&gt;Si no tienes una, debes crear una clave SSH, incluso si es posible usar Ansible proporcionando una contraseña para tus hosts de forma interactiva, una forma más conveniente y segura de hacerlo es usando un par de claves SSH. Para crear una, ejecuta los siguientes comandos en la terminal:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb4&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb4-1&#34;&gt;&lt;a href=&#34;#cb4-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Crea la carpeta .ssh&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-2&#34;&gt;&lt;a href=&#34;#cb4-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;bu&#34;&gt;cd&lt;/span&gt; ~&lt;/span&gt;
&lt;span id=&#34;cb4-3&#34;&gt;&lt;a href=&#34;#cb4-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;mkdir&lt;/span&gt; .ssh&lt;/span&gt;
&lt;span id=&#34;cb4-4&#34;&gt;&lt;a href=&#34;#cb4-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;bu&#34;&gt;cd&lt;/span&gt; .ssh&lt;/span&gt;
&lt;span id=&#34;cb4-5&#34;&gt;&lt;a href=&#34;#cb4-5&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Crea el archivo authorized_keys&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-6&#34;&gt;&lt;a href=&#34;#cb4-6&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;touch&lt;/span&gt; authorized_keys&lt;/span&gt;
&lt;span id=&#34;cb4-7&#34;&gt;&lt;a href=&#34;#cb4-7&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-8&#34;&gt;&lt;a href=&#34;#cb4-8&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Establece permisos de acceso adecuados&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-9&#34;&gt;&lt;a href=&#34;#cb4-9&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;chmod&lt;/span&gt; 700 ~/.ssh&lt;/span&gt;
&lt;span id=&#34;cb4-10&#34;&gt;&lt;a href=&#34;#cb4-10&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;chmod&lt;/span&gt; 600 ~/.ssh/authorized_keys&lt;/span&gt;
&lt;span id=&#34;cb4-11&#34;&gt;&lt;a href=&#34;#cb4-11&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-12&#34;&gt;&lt;a href=&#34;#cb4-12&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Crea el par de claves&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-13&#34;&gt;&lt;a href=&#34;#cb4-13&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;ssh-keygen&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-14&#34;&gt;&lt;a href=&#34;#cb4-14&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Agregua la nueva clave al archivo authorized_keys&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-15&#34;&gt;&lt;a href=&#34;#cb4-15&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;cat&lt;/span&gt; id_rsa.pub &lt;span class=&#34;op&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; authorized_keys&lt;/span&gt;
&lt;span id=&#34;cb4-16&#34;&gt;&lt;a href=&#34;#cb4-16&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-17&#34;&gt;&lt;a href=&#34;#cb4-17&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Si usas Putty como tu cliente SSH (Windows), genera una clave ppk; de lo contrario, ignora estos pasos&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-18&#34;&gt;&lt;a href=&#34;#cb4-18&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; apt install putty-tools&lt;/span&gt;
&lt;span id=&#34;cb4-19&#34;&gt;&lt;a href=&#34;#cb4-19&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;puttygen&lt;/span&gt; id_rsa &lt;span class=&#34;at&#34;&gt;-o&lt;/span&gt; id_rsa.ppk&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Copia los archivos id_rsa e id_rsa.pub (id_rsa.ppk si corresponde) a la máquina que va a usar para ejecutar los playbooks, a mí me gusta usar &lt;code&gt;sftp&lt;/code&gt; pero puedes hacerlo de la manera que prefieras (por ejemplo, con una memoria USB). Después de haber copiado los archivos de clave, elimínalos de tu Pi con &lt;code&gt;rm ~/.ssh/id_rsa*&lt;/code&gt;. Si ya tienes una clave SSH, confío en que sabes cómo agregarla a tu sistema operativo en el momento de cargarlo con Raspberry Pi Imager.&lt;/p&gt;
&lt;p&gt;Ahora tu Pi está lista, desconecta el teclado y el monitor, conecta la Raspberry Pi a tu red (recomiendo usar una conexión por cable).&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;instala-ansible&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Instala Ansible&lt;/h2&gt;
&lt;p&gt;En teoría, podrías instalar Ansible en la propia Raspberry Pi y ejecutar los playbooks directamente en ella con &lt;code&gt;connection: local&lt;/code&gt; pero no sería práctico, es mejor ejecutar los playbooks desde una computadora que no sea tu Raspberry Pi.&lt;/p&gt;
&lt;p&gt;Para instalar Ansible, si tienes un sistema basado en Unix (es decir, Linux, macOS) a tu disposición, tienes suerte, instalar Ansible es muy simple.&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb5&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb5-1&#34;&gt;&lt;a href=&#34;#cb5-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Instala python3&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-2&#34;&gt;&lt;a href=&#34;#cb5-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; apt install python3 &lt;span class=&#34;co&#34;&gt;# En macOS usa `brew install python3`&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-3&#34;&gt;&lt;a href=&#34;#cb5-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Instala pip3&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-4&#34;&gt;&lt;a href=&#34;#cb5-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; apt install python3-pip &lt;/span&gt;
&lt;span id=&#34;cb5-5&#34;&gt;&lt;a href=&#34;#cb5-5&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Instala la versión 9.5.1 de Ansible con pip3 (Por reproducibilidad) &lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-6&#34;&gt;&lt;a href=&#34;#cb5-6&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; pip3 install ansible==9.5.1 &lt;span class=&#34;at&#34;&gt;--break-system-packages&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si estás en Windows, lamentablemente, no hay forma de ejecutar Ansible de forma nativa, tu mejor opción es habilitar WSL (Subsistema de Windows para Linux), instalar una distribución de Linux del Microsoft Store (recomiendo Ubuntu) y ejecutar los pasos anteriores en tu máquina virtual Linux.&lt;/p&gt;
&lt;p&gt;Puedes encontrar una guía detallada para instalar WSL &lt;a href=&#34;https://docs.microsoft.com/en-us/windows/wsl/install-win10&#34;&gt;aquí&lt;/a&gt; y puede encontrar más información sobre la instalación de Ansible en el &lt;a href=&#34;https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html&#34;&gt;sitio de documentación oficial&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Además, dado que vamos a estar instalando varios paquetes desde la fuente en una SBC de baja potencia, algunas de estas tareas van a tomar bastante tiempo y la conexión &lt;code&gt;SSH&lt;/code&gt; podría cerrarse automáticamente por inactividad, para evitar esta situación, activa el envío de paquetes “keep-alive” al servidor editando el archivo &lt;code&gt;ssh_config&lt;/code&gt; con &lt;code&gt;sudo nano /etc/ssh/ssh_config&lt;/code&gt; en la computadora que está ejecuntado Ansible y agregando estas dos líneas debajo de &lt;code&gt;Host *&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb6&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb6-1&#34;&gt;&lt;a href=&#34;#cb6-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;ServerAliveInterval&lt;/span&gt; 300&lt;/span&gt;
&lt;span id=&#34;cb6-2&#34;&gt;&lt;a href=&#34;#cb6-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;ex&#34;&gt;ServerAliveCountMax&lt;/span&gt; 2&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ Es muy importante no saltarse el paso anterior, de lo contrario, la conexión SSH podría fallar silenciosamente mientras se ejecutan tareas largas en Ansible y vas a estar esperando inútilmente con tu Raspberry Pi sin hacer nada en realidad.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div id=&#34;descarga-y-configura-los-playbooks&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Descarga y configura los Playbooks&lt;/h2&gt;
&lt;p&gt;Los playbooks están en un repositorio público en GitHub, puedes clonar el repositorio con estos comandos:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb7&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb7-1&#34;&gt;&lt;a href=&#34;#cb7-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Instala git si aún no lo tienes&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb7-2&#34;&gt;&lt;a href=&#34;#cb7-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; apt install git&lt;/span&gt;
&lt;span id=&#34;cb7-3&#34;&gt;&lt;a href=&#34;#cb7-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Clonar el último commit del repositorio&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb7-4&#34;&gt;&lt;a href=&#34;#cb7-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;git&lt;/span&gt; clone https://github.com/andresrcs/raspberry_pi_server.git &lt;span class=&#34;at&#34;&gt;--depth&lt;/span&gt; 1&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ansible no ejecuta playbooks en “carpetas de escritura global”, por lo que debes configurar los permisos de la carpeta &lt;code&gt;raspberry_pi_server&lt;/code&gt; en &lt;code&gt;755&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb8&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb8-1&#34;&gt;&lt;a href=&#34;#cb8-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; chmod 755 raspberry_pi_server&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ten en cuenta que en WSL es necesario volver a montar la unidad &lt;code&gt;C&lt;/code&gt; para poder cambiar los permisos de los archivos, por lo que debes hacer esto antes de cambiar los permisos:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb9&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb9-1&#34;&gt;&lt;a href=&#34;#cb9-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; umount /mnt/c &lt;/span&gt;
&lt;span id=&#34;cb9-2&#34;&gt;&lt;a href=&#34;#cb9-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; mount &lt;span class=&#34;at&#34;&gt;-t&lt;/span&gt; drvfs C: /mnt/c &lt;span class=&#34;at&#34;&gt;-o&lt;/span&gt; metadata&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Para configurar los playbooks, primero debes definir tu “inventario”, esta es una lista de los hosts a los que te vas a conectar, edita el archivo &lt;code&gt;raspberry_pi_server/inventory.ini&lt;/code&gt; y agrega la IP de tu(s) Raspberry Pi(s):&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb10&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb10-1&#34;&gt;&lt;a href=&#34;#cb10-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;[raspberries]&lt;/span&gt; &lt;span class=&#34;co&#34;&gt;# Esto representa un grupo de Raspberries&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-2&#34;&gt;&lt;a href=&#34;#cb10-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;raspberry_01&lt;/span&gt; ansible_host=192.168.3.101 &lt;span class=&#34;co&#34;&gt;# Este es el nombre de host y la IP de una Raspberry Pi individual&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb10-3&#34;&gt;&lt;a href=&#34;#cb10-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Puedes agregar tantas Raspberries como necesites&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Luego, configura las variables comunes para el grupo &lt;code&gt;[raspberries]&lt;/code&gt; editando el archivo &lt;code&gt;raspberry_pi_server/group_vars/raspberries.yml&lt;/code&gt;, lo más importante para verificar aquí es la ruta a tu clave ssh y el usuario predeterminado para el sistema operativo que estes usando.&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb11&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb11-1&#34;&gt;&lt;a href=&#34;#cb11-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb11-2&#34;&gt;&lt;a href=&#34;#cb11-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;ansible_user:&lt;/span&gt; pi &lt;span class=&#34;co&#34;&gt;# Este es el usuario predeterminado para el sistema operativo&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb11-3&#34;&gt;&lt;a href=&#34;#cb11-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;ansible_become_method:&lt;/span&gt; sudo&lt;/span&gt;
&lt;span id=&#34;cb11-4&#34;&gt;&lt;a href=&#34;#cb11-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;ansible_python_interpreter:&lt;/span&gt; /usr/bin/python3&lt;/span&gt;
&lt;span id=&#34;cb11-5&#34;&gt;&lt;a href=&#34;#cb11-5&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;ansible_ssh_private_key_file:&lt;/span&gt; ~/.ssh/raspberrypi_key &lt;span class=&#34;co&#34;&gt;# La ubicación de la clave ssh en la computadora que está ejecuntando Ansible.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ahora, puedes configurar las opciones de instalación editando las variables en el archivo &lt;code&gt;raspberry_pi_server/vars/config_vars.yml&lt;/code&gt;, las opciones ya configuradas están bien para la mayoría de los casos de uso, incluidas configuraciones de seguridad razonables, pero como mínimo, debes configurar tu contraseña personal para el usuario principal de PostgreSQL. También puedes elegir tu método preferido para instalar R, si no deseas usar la opción predeterminada, ten en cuenta que usar la opción &lt;a href=&#34;https://r4pi.org/es/&#34;&gt;R4Pi&lt;/a&gt; solo es posible con Raspberry Pi OS y siempre instalará la última versión de R disponible.&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb12&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb12-1&#34;&gt;&lt;a href=&#34;#cb12-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;---&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-2&#34;&gt;&lt;a href=&#34;#cb12-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Configuraciones del sistema ##################################################&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-3&#34;&gt;&lt;a href=&#34;#cb12-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-4&#34;&gt;&lt;a href=&#34;#cb12-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Parametros Swap&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-5&#34;&gt;&lt;a href=&#34;#cb12-5&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;swap_file_path:&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;/var/swap.1&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-6&#34;&gt;&lt;a href=&#34;#cb12-6&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Utiliza cualquiera de los siguientes sufijos&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-7&#34;&gt;&lt;a href=&#34;#cb12-7&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# c=1&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-8&#34;&gt;&lt;a href=&#34;#cb12-8&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# w=2&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-9&#34;&gt;&lt;a href=&#34;#cb12-9&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# b=512&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-10&#34;&gt;&lt;a href=&#34;#cb12-10&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# kB=1000&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-11&#34;&gt;&lt;a href=&#34;#cb12-11&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# K=1024&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-12&#34;&gt;&lt;a href=&#34;#cb12-12&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# MB=1000*1000&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-13&#34;&gt;&lt;a href=&#34;#cb12-13&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# M=1024*1024&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-14&#34;&gt;&lt;a href=&#34;#cb12-14&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# xM=M&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-15&#34;&gt;&lt;a href=&#34;#cb12-15&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# GB=1000*1000*1000&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-16&#34;&gt;&lt;a href=&#34;#cb12-16&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# G=1024*1024*1024&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-17&#34;&gt;&lt;a href=&#34;#cb12-17&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;swap_file_size:&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;3GB&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-18&#34;&gt;&lt;a href=&#34;#cb12-18&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;swappiness:&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;10&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-19&#34;&gt;&lt;a href=&#34;#cb12-19&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-20&#34;&gt;&lt;a href=&#34;#cb12-20&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Instalar Nginx?&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-21&#34;&gt;&lt;a href=&#34;#cb12-21&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;install_nginx:&lt;/span&gt; true&lt;/span&gt;
&lt;span id=&#34;cb12-22&#34;&gt;&lt;a href=&#34;#cb12-22&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-23&#34;&gt;&lt;a href=&#34;#cb12-23&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Instalar PostgreSQL?&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-24&#34;&gt;&lt;a href=&#34;#cb12-24&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;install_postgresql:&lt;/span&gt; true&lt;/span&gt;
&lt;span id=&#34;cb12-25&#34;&gt;&lt;a href=&#34;#cb12-25&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-26&#34;&gt;&lt;a href=&#34;#cb12-26&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Configuraciones de seguridad #################################################&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-27&#34;&gt;&lt;a href=&#34;#cb12-27&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-28&#34;&gt;&lt;a href=&#34;#cb12-28&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Puertos para abrir&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-29&#34;&gt;&lt;a href=&#34;#cb12-29&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;exposed_ports:&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-30&#34;&gt;&lt;a href=&#34;#cb12-30&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; { rule: &lt;span class=&#34;st&#34;&gt;&amp;#39;allow&amp;#39;&lt;/span&gt;, port: 22, proto: &lt;span class=&#34;st&#34;&gt;&amp;#39;tcp&amp;#39;&lt;/span&gt; }     &lt;span class=&#34;co&#34;&gt;# ssh&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-31&#34;&gt;&lt;a href=&#34;#cb12-31&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; { rule: &lt;span class=&#34;st&#34;&gt;&amp;#39;allow&amp;#39;&lt;/span&gt;, port: 22, proto: &lt;span class=&#34;st&#34;&gt;&amp;#39;udp&amp;#39;&lt;/span&gt; }     &lt;span class=&#34;co&#34;&gt;# ssh&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-32&#34;&gt;&lt;a href=&#34;#cb12-32&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; { rule: &lt;span class=&#34;st&#34;&gt;&amp;#39;allow&amp;#39;&lt;/span&gt;, port: 80, proto: &lt;span class=&#34;st&#34;&gt;&amp;#39;tcp&amp;#39;&lt;/span&gt; }     &lt;span class=&#34;co&#34;&gt;# http&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-33&#34;&gt;&lt;a href=&#34;#cb12-33&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; { rule: &lt;span class=&#34;st&#34;&gt;&amp;#39;allow&amp;#39;&lt;/span&gt;, port: 5432, proto: &lt;span class=&#34;st&#34;&gt;&amp;#39;tcp&amp;#39;&lt;/span&gt; }   &lt;span class=&#34;co&#34;&gt;# Postgresql (omitir si Postgresql no está instalado)&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-34&#34;&gt;&lt;a href=&#34;#cb12-34&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; { rule: &lt;span class=&#34;st&#34;&gt;&amp;#39;allow&amp;#39;&lt;/span&gt;, port: 5432, proto: &lt;span class=&#34;st&#34;&gt;&amp;#39;udp&amp;#39;&lt;/span&gt; }   &lt;span class=&#34;co&#34;&gt;# Postgresql (omitir si Postgresql no está instalado)&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-35&#34;&gt;&lt;a href=&#34;#cb12-35&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;co&#34;&gt;# - { rule: &amp;#39;allow&amp;#39;, port: 8787, proto: &amp;#39;tcp&amp;#39; } # RStudio Server (descomentar si Nginx no está instalado)&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-36&#34;&gt;&lt;a href=&#34;#cb12-36&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;co&#34;&gt;# - { rule: &amp;#39;allow&amp;#39;, port: 3838, proto: &amp;#39;tcp&amp;#39; } # Shiny Server (descomentar si Nginx no está instalado)&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-37&#34;&gt;&lt;a href=&#34;#cb12-37&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-38&#34;&gt;&lt;a href=&#34;#cb12-38&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Contraseña para el usuario principal de PostgreSQL&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-39&#34;&gt;&lt;a href=&#34;#cb12-39&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;postgres_password:&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;very_secure_password&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-40&#34;&gt;&lt;a href=&#34;#cb12-40&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-41&#34;&gt;&lt;a href=&#34;#cb12-41&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Reglas de acceso para PostgreSQL&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-42&#34;&gt;&lt;a href=&#34;#cb12-42&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;postgresql_rules:&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-43&#34;&gt;&lt;a href=&#34;#cb12-43&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;postgresql_rules:&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-44&#34;&gt;&lt;a href=&#34;#cb12-44&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; { contype: local, users: postgres, address: samehost, method: trust }&lt;/span&gt;
&lt;span id=&#34;cb12-45&#34;&gt;&lt;a href=&#34;#cb12-45&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; { contype: local, users: all, address: samehost, method: trust }&lt;/span&gt;
&lt;span id=&#34;cb12-46&#34;&gt;&lt;a href=&#34;#cb12-46&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; { contype: hostssl, users: all, address: 0.0.0.0/0, method: scram-sha-256 }&lt;/span&gt;
&lt;span id=&#34;cb12-47&#34;&gt;&lt;a href=&#34;#cb12-47&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; { contype: host, users: all, address: 0.0.0.0/0, method: scram-sha-256 }&lt;/span&gt;
&lt;span id=&#34;cb12-48&#34;&gt;&lt;a href=&#34;#cb12-48&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; { contype: hostssl, users: all, address: &lt;span class=&#34;st&#34;&gt;&amp;#39;::0/0&amp;#39;&lt;/span&gt;, method: scram-sha-256 }&lt;/span&gt;
&lt;span id=&#34;cb12-49&#34;&gt;&lt;a href=&#34;#cb12-49&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; { contype: host, users: all, address: &lt;span class=&#34;st&#34;&gt;&amp;#39;::0/0&amp;#39;&lt;/span&gt;, method: scram-sha-256 }&lt;/span&gt;
&lt;span id=&#34;cb12-50&#34;&gt;&lt;a href=&#34;#cb12-50&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; { contype: host, users: all, address: 127.0.0.1/32, method: scram-sha-256 }&lt;/span&gt;
&lt;span id=&#34;cb12-51&#34;&gt;&lt;a href=&#34;#cb12-51&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;ex&#34;&gt;-&lt;/span&gt; { contype: host, users: all, address: &lt;span class=&#34;st&#34;&gt;&amp;#39;::1/128&amp;#39;&lt;/span&gt;, method: scram-sha-256 }&lt;/span&gt;
&lt;span id=&#34;cb12-52&#34;&gt;&lt;a href=&#34;#cb12-52&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-53&#34;&gt;&lt;a href=&#34;#cb12-53&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Versiones principales de software ############################################&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-54&#34;&gt;&lt;a href=&#34;#cb12-54&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-55&#34;&gt;&lt;a href=&#34;#cb12-55&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Versión de R a instalar&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-56&#34;&gt;&lt;a href=&#34;#cb12-56&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;use_r4pi:&lt;/span&gt; true &lt;span class=&#34;co&#34;&gt;# Si se establece en verdadero, se instalará la última versión de R, esto solo es compatible con&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-57&#34;&gt;&lt;a href=&#34;#cb12-57&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                &lt;span class=&#34;co&#34;&gt;# Raspberry Pi OS.&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-58&#34;&gt;&lt;a href=&#34;#cb12-58&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;use_rig:&lt;/span&gt; false &lt;span class=&#34;co&#34;&gt;# Si se establece en verdadero, no olvide especificar una versión R en la siguiente línea&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-59&#34;&gt;&lt;a href=&#34;#cb12-59&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;r_version:&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span class=&#34;co&#34;&gt;# (e.g. &amp;#39;4.3.3&amp;#39;) Actualmente, solo puede elegir la versión R si va a ser&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-60&#34;&gt;&lt;a href=&#34;#cb12-60&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                   &lt;span class=&#34;co&#34;&gt;# instalado con rig o compilado (con &amp;#39;use_r4pi&amp;#39; y &amp;#39;use_rig&amp;#39; establecidos como false).&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-61&#34;&gt;&lt;a href=&#34;#cb12-61&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-62&#34;&gt;&lt;a href=&#34;#cb12-62&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Versión de shiny-server a instalar&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-63&#34;&gt;&lt;a href=&#34;#cb12-63&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;shiny_server_version:&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;v1.5.21.1012&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-64&#34;&gt;&lt;a href=&#34;#cb12-64&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-65&#34;&gt;&lt;a href=&#34;#cb12-65&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Versión del servidor rstudio-server a instalar&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb12-66&#34;&gt;&lt;a href=&#34;#cb12-66&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;rstudio_version:&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;2024.04.0-daily+651&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;ejecuta-los-playbooks&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Ejecuta los Playbooks&lt;/h2&gt;
&lt;p&gt;En condiciones ideales, como usando el último modelo de Raspberry Pi, con 8 GB de RAM, booteando desde un SSD, y conectado a una red estable, puedes simplemente acceder a la carpeta &lt;code&gt;raspberry_pi_server&lt;/code&gt; y ejecutar el libro de jugadas &lt;code&gt;site.yml&lt;/code&gt; para instalar todo de una sóla vez:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb13&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb13-1&#34;&gt;&lt;a href=&#34;#cb13-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;bu&#34;&gt;cd&lt;/span&gt; raspberry_pi_server&lt;/span&gt;
&lt;span id=&#34;cb13-2&#34;&gt;&lt;a href=&#34;#cb13-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;ansible-playbook&lt;/span&gt; site.yml&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Pero en condiciones menos que ideales, es muy probable que encuentres algunos errores aleatorios causados por la sobrecarga de la Pi o conexiones de red inestables, por lo que, para mitigar este problema y hacer que el proceso de instalación sea más flexible, he dividido el proceso en tres playbooks individuales:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb14&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb14-1&#34;&gt;&lt;a href=&#34;#cb14-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;bu&#34;&gt;cd&lt;/span&gt; raspberry_pi_server&lt;/span&gt;
&lt;span id=&#34;cb14-2&#34;&gt;&lt;a href=&#34;#cb14-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;ansible-playbook&lt;/span&gt; install_basic_services.yml&lt;/span&gt;
&lt;span id=&#34;cb14-3&#34;&gt;&lt;a href=&#34;#cb14-3&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;ansible-playbook&lt;/span&gt; install_shiny_server.yml&lt;/span&gt;
&lt;span id=&#34;cb14-4&#34;&gt;&lt;a href=&#34;#cb14-4&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;ansible-playbook&lt;/span&gt; install_rstudio_server.yml&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Si decides que solo necesitas el servidor Shiny o el servidor RStudio pero no el otro, o si ya has instalado los servicios de soporte que deseas, puedes ejecutar solo los playbooks que necesitas.&lt;/p&gt;
&lt;p&gt;Si deseas actualizar algo en el futuro, como R, RStudio o Shiny server (no puedo garantizar que siempre funcionará sin necesidad de cambios), puedes simplemente cambiar la versión en el archivo de configuración y ejecutar la parte específica del playbook aprovechando las “etiquetas” definidas.&lt;/p&gt;
&lt;p&gt;Por ejemplo, esto solo instalará la versión R definida en el archivo de configuración y nada más:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb15&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb15-1&#34;&gt;&lt;a href=&#34;#cb15-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;bu&#34;&gt;cd&lt;/span&gt; raspberry_pi_server&lt;/span&gt;
&lt;span id=&#34;cb15-2&#34;&gt;&lt;a href=&#34;#cb15-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;ansible-playbook&lt;/span&gt; install_basic_services.yml &lt;span class=&#34;at&#34;&gt;--tags&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;r&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Las etiquetas disponibles son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;install_basic_services.yml
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;secure&lt;/code&gt;: Establecer la configuración de seguridad en el servidor&lt;/li&gt;
&lt;li&gt;&lt;code&gt;swap&lt;/code&gt;: Agregar memoria swap al servidor&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nginx&lt;/code&gt;: Instalar y configurar Nginx + PHP&lt;/li&gt;
&lt;li&gt;&lt;code&gt;postgresql&lt;/code&gt;: Instalar y configurar PostgreSQL&lt;/li&gt;
&lt;li&gt;&lt;code&gt;r&lt;/code&gt;: Instalar R desde la fuente&lt;/li&gt;
&lt;li&gt;&lt;code&gt;disable_wifi&lt;/code&gt;: Desactivar el módulo Wifi y Bluetooth&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;install_shiny_server.yml
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;shiny-server&lt;/code&gt;: Instalar shiny-server desde la fuente&lt;/li&gt;
&lt;li&gt;&lt;code&gt;configure_shiny&lt;/code&gt;: Configurar shiny-server&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;install_rstudio_server.yml
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;rstudio&lt;/code&gt;: Instalar RStudio server desde la fuente&lt;/li&gt;
&lt;li&gt;&lt;code&gt;configure_rstudio&lt;/code&gt;: Configurar RStudio server&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;También puedes hacer lo contrario y omitir partes específicas de los playbooks usando la opción &lt;code&gt;--skip-tags&lt;/code&gt;, por ejemplo, si no necesitas PostgreSQL, puedes evitar instalarlo ejecutando el playbook de esta manera:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb16&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb16-1&#34;&gt;&lt;a href=&#34;#cb16-1&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;bu&#34;&gt;cd&lt;/span&gt; raspberry_pi_server&lt;/span&gt;
&lt;span id=&#34;cb16-2&#34;&gt;&lt;a href=&#34;#cb16-2&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;ansible-playbook&lt;/span&gt; install_basic_services.yml &lt;span class=&#34;at&#34;&gt;--skip-tags&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;postgresql&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Después de ejecutar con éxito todos los playbooks, tendrás una instalación completamente funcional lista para ser utilizada, por lo que podras simplemente abrir una sesión de RStudio en &lt;code&gt;http://ip_de_tu_servidor/rstudio&lt;/code&gt; y/o publicar tus aplicaciones Shiny en la carpeta &lt;code&gt;/srv/shiny-server&lt;/code&gt; y acceder a ellas en &lt;code&gt;http://ip_de_tu_servidor/shiny/nombre_de_tu_app&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ Si la configuración de Nginx no ha sido establecida por el playbook &lt;code&gt;install_basic_services.yml&lt;/code&gt; porque lo has omitido, debes configurar el proxy inverso manualmente o acceder a los servicios con su puerto específico, por ejemplo &lt;code&gt;http://your_server_ip/3838/your_app_name&lt;/code&gt;, esto también requiere que abras el puerto correspondiente en el firewall.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div id=&#34;notas-finales&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Notas Finales&lt;/h2&gt;
&lt;p&gt;Incluso con la automatización, la instalación de forma nativa llevará mucho más tiempo que, por ejemplo, con el uso de contenedores, especialmente si usas una Raspberry Pi con poca memoria RAM (&amp;lt; 4GB) pero como está automatizado, simplemente puedes dejar que se ejecute y volver más tarde, y disfrutarás de la facilidad de gestión de una instalación nativa.&lt;/p&gt;
&lt;p&gt;Además, ten en cuenta que el proceso de instalación llevará tu Raspberry Pi a sus límites, por lo que puedes esperar algunos errores aleatorios, pero eso no significa que no va ha funcionar, simplemente reinicia tu Pi, vuelve a ejecutar el playbook problemático y ve si funciona la segunda vez. He hecho todo lo posible para que esto sea funcional a largo plazo estableciendo versiones de software específicas, pero aún es posible que una actualización de librerias del sistema inutilice los playbooks. Si encuentras algún problema, ve al repositorio de GitHub para los playbooks y registra un “issue”, o mejor aún, si sabes cómo solucionarlo, haz un “pull request”.&lt;/p&gt;
&lt;p&gt;Como nota final, quiero señalar que este enfoque se puede extender aún más de acuerdo con tus propias necesidades, por ejemplo, puedes implementar la restauración automática de tu servidor, incluido el contenido desplegado. Por ejemplo, yo tengo un playbook adicional para restaurar las aplicaciones, servicios y bases de datos que normalmente ejecuto en mi Raspberry Pi, por lo que, en caso de una falla catastrófica, puedo volver a un estado operativo en un período corto de tiempo y con poco esfuerzo, comparado con hacer una restauración manual de mi sistema.&lt;/p&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Personalizando la ubicación de tu librería de paquetes</title>
      <link>https://andresrcs.rbind.io/es/2020/10/26/customizing_library_path/</link>
      <pubDate>Mon, 26 Oct 2020 00:00:00 +0000</pubDate>
      
      <guid>https://andresrcs.rbind.io/es/2020/10/26/customizing_library_path/</guid>
      <description>
&lt;script src=&#34;https://andresrcs.rbind.io/rmarkdown-libs/header-attrs/header-attrs.js&#34;&gt;&lt;/script&gt;
&lt;link href=&#34;https://andresrcs.rbind.io/rmarkdown-libs/anchor-sections/anchor-sections.css&#34; rel=&#34;stylesheet&#34; /&gt;
&lt;script src=&#34;https://andresrcs.rbind.io/rmarkdown-libs/anchor-sections/anchor-sections.js&#34;&gt;&lt;/script&gt;
&lt;style type=&#34;text/css&#34;&gt;
pre &gt; code.sourceCode { white-space: pre; position: relative; }
pre &gt; code.sourceCode &gt; span { display: inline-block; line-height: 1.25; }
pre &gt; code.sourceCode &gt; span:empty { height: 1.2em; }
code.sourceCode &gt; span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre &gt; code.sourceCode { white-space: pre-wrap; }
pre &gt; code.sourceCode &gt; span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
  { counter-reset: source-line 0; }
pre.numberSource code &gt; span
  { position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code &gt; span &gt; a:first-child::before
  { content: counter(source-line);
    position: relative; left: -1em; text-align: right; vertical-align: baseline;
    border: none; display: inline-block;
    -webkit-touch-callout: none; -webkit-user-select: none;
    -khtml-user-select: none; -moz-user-select: none;
    -ms-user-select: none; user-select: none;
    padding: 0 4px; width: 4em;
  }
pre.numberSource { margin-left: 3em;  padding-left: 4px; }
div.sourceCode
  { color: #cccccc; background-color: #303030; }
@media screen {
pre &gt; code.sourceCode &gt; span &gt; a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ffcfaf; } /* Alert */
code span.an { color: #7f9f7f; font-weight: bold; } /* Annotation */
code span.at { } /* Attribute */
code span.bn { color: #dca3a3; } /* BaseN */
code span.bu { } /* BuiltIn */
code span.cf { color: #f0dfaf; } /* ControlFlow */
code span.ch { color: #dca3a3; } /* Char */
code span.cn { color: #dca3a3; font-weight: bold; } /* Constant */
code span.co { color: #7f9f7f; } /* Comment */
code span.cv { color: #7f9f7f; font-weight: bold; } /* CommentVar */
code span.do { color: #7f9f7f; } /* Documentation */
code span.dt { color: #dfdfbf; } /* DataType */
code span.dv { color: #dcdccc; } /* DecVal */
code span.er { color: #c3bf9f; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #c0bed1; } /* Float */
code span.fu { color: #efef8f; } /* Function */
code span.im { } /* Import */
code span.in { color: #7f9f7f; font-weight: bold; } /* Information */
code span.kw { color: #f0dfaf; } /* Keyword */
code span.op { color: #f0efd0; } /* Operator */
code span.ot { color: #efef8f; } /* Other */
code span.pp { color: #ffcfaf; font-weight: bold; } /* Preprocessor */
code span.sc { color: #dca3a3; } /* SpecialChar */
code span.ss { color: #cc9393; } /* SpecialString */
code span.st { color: #cc9393; } /* String */
code span.va { } /* Variable */
code span.vs { color: #cc9393; } /* VerbatimString */
code span.wa { color: #7f9f7f; font-weight: bold; } /* Warning */
&lt;/style&gt;


&lt;p&gt;Para los usuarios de R razonablemente experimentados, este simple tema puede no parecer digno de una publicación de blog, por lo que si no eres un principiante de R, es posible que desees omitir esta publicación. Dicho esto, he tenido que explicar esta tarea tantas veces en los foros de la comunidad R, que escribir una se vuelve obligatorio para evitar escribir el mismo texto una vez más.&lt;/p&gt;
&lt;p&gt;Las razones para personalizar la ruta de tu biblioteca en lugar de seguir los valores predeterminados pueden ser variadas, pero para los principiantes de R, la más común es evitar problemas de instalación de paquetes debido a permisos de escritura, caracteres no ASCII en rutas de carpetas, carpetas sincronizadas en la nube o unidades de red, que conducen a mensajes de error como:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb1&#34;&gt;&lt;pre class=&#34;sourceCode r&#34;&gt;&lt;code class=&#34;sourceCode r&#34;&gt;&lt;span id=&#34;cb1-1&#34;&gt;&lt;a href=&#34;#cb1-1&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;Warning &lt;span class=&#34;cf&#34;&gt;in&lt;/span&gt; install.packages &lt;span class=&#34;sc&#34;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb1-2&#34;&gt;&lt;a href=&#34;#cb1-2&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;st&#34;&gt;&amp;#39;lib = &amp;quot;/path/to/your/library&amp;quot;&amp;#39;&lt;/span&gt; is not writable&lt;/span&gt;
&lt;span id=&#34;cb1-3&#34;&gt;&lt;a href=&#34;#cb1-3&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;Error &lt;span class=&#34;cf&#34;&gt;in&lt;/span&gt; install.packages &lt;span class=&#34;sc&#34;&gt;:&lt;/span&gt; unable to install packages&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb2&#34;&gt;&lt;pre class=&#34;sourceCode r&#34;&gt;&lt;code class=&#34;sourceCode r&#34;&gt;&lt;span id=&#34;cb2-1&#34;&gt;&lt;a href=&#34;#cb2-1&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;sc&#34;&gt;**&lt;/span&gt; byte&lt;span class=&#34;sc&#34;&gt;-&lt;/span&gt;compile and prepare package &lt;span class=&#34;cf&#34;&gt;for&lt;/span&gt; lazy loading&lt;/span&gt;
&lt;span id=&#34;cb2-2&#34;&gt;&lt;a href=&#34;#cb2-2&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;Error&lt;span class=&#34;sc&#34;&gt;:&lt;/span&gt; unexpected symbol &lt;span class=&#34;cf&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;setwd(&amp;#39;incomplete/path/to/your/library&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-3&#34;&gt;&lt;a href=&#34;#cb2-3&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;Execution halted&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Muy a menudo, la solución a estos problemas es configurar tu biblioteca de paquetes en algún otro lugar de tu sistema, donde tengas los permisos adecuados y no existan incompatibilidades con R conocidas. La forma de cambiar la ubicación de una biblioteca de paquetes es configurarla manualmente en un archivo de inicio, es decir, archivos &lt;code&gt;Rprofile.site&lt;/code&gt; y &lt;code&gt;Renviron.site&lt;/code&gt; a nivel de versión R (ubicado en &lt;code&gt;R_HOME/etc/&lt;/code&gt;) o archivos &lt;code&gt;.Rprofile&lt;/code&gt; y &lt;code&gt;.Renviron&lt;/code&gt;, a nivel de usuario (ubicado en su carpeta &lt;code&gt;HOME&lt;/code&gt;) o a nivel de proyecto (ubicado en el directorio de trabajo actual).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;✏️ Para obtener más información sobre los archivos de inicio de R, puedes leer el siguiente &lt;a href=&#34;https://support.rstudio.com/hc/en-us/articles/360047157094-Managing-R-with-Rprofile-Renviron-Rprofile-site-Renviron-site-rsession-conf-and-repos-conf&#34;&gt;artículo de soporte&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Para archivos de tipo &lt;code&gt;Renviron&lt;/code&gt;, se debe especificar la variable de entorno correspondiente, por ejemplo, si quiero cambiar los árboles de la biblioteca R en un sistema Linux, agregaría una línea como esta al archivo &lt;code&gt;Renviron.site&lt;/code&gt; ubicado en &lt;code&gt;/usr/lib/R/etc/&lt;/code&gt; (En este caso, la variable de entorno &lt;code&gt;R_HOME&lt;/code&gt; se traduce a &lt;code&gt;/usr/lib/R/&lt;/code&gt;).&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb3&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb3-1&#34;&gt;&lt;a href=&#34;#cb3-1&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;va&#34;&gt;R_LIBS_SITE=&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;&amp;quot;/usr/lib/R/site-library:/usr/lib/R/library&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Siendo la primera ubicación desde la izquierda la predeterminada, que es utilizada por &lt;code&gt;install.packages()&lt;/code&gt; si no se especifica el argumento &lt;code&gt;lib&lt;/code&gt;, y todas ellas (que están separadas por dos puntos) se escanean en orden en busca de paquetes al iniciar R. Ten en cuenta que solo se incluirán los directorios que existan en ese momento.&lt;/p&gt;
&lt;p&gt;Para archivos de tipo &lt;code&gt;Rprofile&lt;/code&gt;, se debe usar la función &lt;code&gt;.libPaths()&lt;/code&gt;, ya que estos archivos deben contener código R válido para ser ejecutados al inicar R. El comando R equivalente al ejemplo anterior sería:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb4&#34;&gt;&lt;pre class=&#34;sourceCode r&#34;&gt;&lt;code class=&#34;sourceCode r&#34;&gt;&lt;span id=&#34;cb4-1&#34;&gt;&lt;a href=&#34;#cb4-1&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;.libPaths&lt;/span&gt;(&lt;span class=&#34;fu&#34;&gt;c&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;quot;/usr/lib/R/site-library&amp;quot;&lt;/span&gt;, &lt;span class=&#34;st&#34;&gt;&amp;quot;/usr/lib/R/library&amp;quot;&lt;/span&gt;))&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Obviamente, las rutas de las carpetas serán diferentes según tu sistema operativo y configuración específicos, pero espero que se entienda la idea general de que debes especificar una ruta de carpeta que sea adecuada para tus necesidades específicas, por ejemplo, en un sistema Windows el equivalente sería:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb5&#34;&gt;&lt;pre class=&#34;sourceCode r&#34;&gt;&lt;code class=&#34;sourceCode r&#34;&gt;&lt;span id=&#34;cb5-1&#34;&gt;&lt;a href=&#34;#cb5-1&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;.libPaths&lt;/span&gt;(&lt;span class=&#34;fu&#34;&gt;c&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;quot;C:/Program Files/R/R-4.0.3/library&amp;quot;&lt;/span&gt;))&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;De forma predeterminada, la biblioteca de paquetes predeterminada se establece a nivel de usuario (carpeta &lt;code&gt;HOME&lt;/code&gt;), lo que en algunos casos, puede causar los problemas mencionados anteriormente. Ahora, este es un consejo sesgado, pero para un uso individual simple, me resulta más práctico establecer la biblioteca de paquetes predeterminada a nivel de la versión R (carpeta &lt;code&gt;R_HOME/library/&lt;/code&gt;) y hacer uso explícito de otras ubicaciones, de forma selectiva, y según los casos de uso específicos. Ten en cuenta que dependiendo de tu configuración de seguridad y sistema operativo, es posible que debas ejecutar tu sesión R con derechos de “administrador” o desde un usuario con derechos “sudo” para que esto funcione.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Alternativas para obtener datos de sensores desde microcontroladores compatibles con Arduino en R</title>
      <link>https://andresrcs.rbind.io/es/2020/02/09/arduino_microcontroller_r/</link>
      <pubDate>Sun, 09 Feb 2020 00:00:00 +0000</pubDate>
      
      <guid>https://andresrcs.rbind.io/es/2020/02/09/arduino_microcontroller_r/</guid>
      <description>
&lt;style type=&#34;text/css&#34;&gt;
pre &gt; code.sourceCode { white-space: pre; position: relative; }
pre &gt; code.sourceCode &gt; span { display: inline-block; line-height: 1.25; }
pre &gt; code.sourceCode &gt; span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode &gt; span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre &gt; code.sourceCode { white-space: pre-wrap; }
pre &gt; code.sourceCode &gt; span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
  { counter-reset: source-line 0; }
pre.numberSource code &gt; span
  { position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code &gt; span &gt; a:first-child::before
  { content: counter(source-line);
    position: relative; left: -1em; text-align: right; vertical-align: baseline;
    border: none; display: inline-block;
    -webkit-touch-callout: none; -webkit-user-select: none;
    -khtml-user-select: none; -moz-user-select: none;
    -ms-user-select: none; user-select: none;
    padding: 0 4px; width: 4em;
  }
pre.numberSource { margin-left: 3em;  padding-left: 4px; }
div.sourceCode
  { color: #cccccc; background-color: #303030; }
@media screen {
pre &gt; code.sourceCode &gt; span &gt; a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ffcfaf; } /* Alert */
code span.an { color: #7f9f7f; font-weight: bold; } /* Annotation */
code span.at { } /* Attribute */
code span.bn { color: #dca3a3; } /* BaseN */
code span.bu { } /* BuiltIn */
code span.cf { color: #f0dfaf; } /* ControlFlow */
code span.ch { color: #dca3a3; } /* Char */
code span.cn { color: #dca3a3; font-weight: bold; } /* Constant */
code span.co { color: #7f9f7f; } /* Comment */
code span.cv { color: #7f9f7f; font-weight: bold; } /* CommentVar */
code span.do { color: #7f9f7f; } /* Documentation */
code span.dt { color: #dfdfbf; } /* DataType */
code span.dv { color: #dcdccc; } /* DecVal */
code span.er { color: #c3bf9f; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #c0bed1; } /* Float */
code span.fu { color: #efef8f; } /* Function */
code span.im { } /* Import */
code span.in { color: #7f9f7f; font-weight: bold; } /* Information */
code span.kw { color: #f0dfaf; } /* Keyword */
code span.op { color: #f0efd0; } /* Operator */
code span.ot { color: #efef8f; } /* Other */
code span.pp { color: #ffcfaf; font-weight: bold; } /* Preprocessor */
code span.sc { color: #dca3a3; } /* SpecialChar */
code span.ss { color: #cc9393; } /* SpecialString */
code span.st { color: #cc9393; } /* String */
code span.va { } /* Variable */
code span.vs { color: #cc9393; } /* VerbatimString */
code span.wa { color: #7f9f7f; font-weight: bold; } /* Warning */
&lt;/style&gt;

&lt;div id=&#34;TOC&#34;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#conexión-serial&#34; id=&#34;toc-conexión-serial&#34;&gt;Conexión Serial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#guardar-en-un-servidor-sql&#34; id=&#34;toc-guardar-en-un-servidor-sql&#34;&gt;Guardar en un Servidor SQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#usando-el-protocolo-mqtt&#34; id=&#34;toc-usando-el-protocolo-mqtt&#34;&gt;Usando el Protocolo MQTT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#descargo&#34; id=&#34;toc-descargo&#34;&gt;Descargo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;¿Alguna vez ha querido obtener sus propios datos del mundo real utilizando sensores? Con la llegada del movimiento de &lt;a href=&#34;https://es.wikipedia.org/wiki/Hardware_libre&#34;&gt;Hardware Libre&lt;/a&gt;, esto se ha vuelto más accesible para el público en general, los microcontroladores y sensores se han vuelto más baratos y fáciles de programar con lenguajes amigables para los humanos como Arduino (C ++) y MicroPython (Python), por lo que ahora cualquiera puede producir sus propios datos sensoriales del mundo real, pero, todavía hay un problema, ¿cómo podemos obtener estos datos en R para poder analizarlos?&lt;/p&gt;
&lt;p&gt;Dependiendo de los requisitos de su aplicación, puede elegir entre una gran cantidad de opciones. Por ejemplo, si solo necesita datos en lotes y puede tener fácil acceso físico a su dispositivo, simplemente puede agregar un módulo de tarjeta SD a su proyecto y registrar los datos en un archivo .csv en una tarjeta SD, pero eso no sería divertido, ¿verdad? Una solución mucho mejor sería obtener datos de forma remota y preferiblemente de forma inalámbrica, ¿no cree? Exploremos algunas opciones.&lt;/p&gt;
&lt;div id=&#34;conexión-serial&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Conexión Serial&lt;/h2&gt;
&lt;p&gt;Si nunca antes ha pensado en obtener datos desde microcontroladores, apuesto a que el primer pensamiento que le viene a la mente es conectar directamente el microcontrolador con R para obtener los datos, pero esta es actualmente la opción más desafiante técnicamente, puede hacerse usando una conexión serial entre el microcontrolador y su computadora, pero que yo sepa, solo hay un &lt;a href=&#34;https://github.com/r-arduino/arduinor&#34;&gt;paquete R implementando esto&lt;/a&gt; y solo se ejecuta en sistemas compatibles con POSIX (adiós Windows).&lt;/p&gt;
&lt;p&gt;No puedo probar este enfoque yo mismo, ya que no tengo una máquina física Linux o macOS para conectar un microcontrolador, por lo que para este caso, solo voy a referirlos a una &lt;a href=&#34;https://zhuhao.org/post/connect-arduino-chips-with-r/&#34;&gt;publicación de blog&lt;/a&gt; por &lt;a href=&#34;https://twitter.com/haozhu233&#34;&gt;@haozhu233&lt;/a&gt; (el autor del paquete) mostrando su funcionalidad.&lt;/p&gt;
&lt;p&gt;Si su aplicación requiere adquisición de datos en tiempo real o una latencia muy baja, esta podría ser su única opción y es posible que desee profundizar en esto.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;Streaming arduino sensor signals right into &lt;a href=&#34;https://twitter.com/rstudio?ref_src=twsrc%5Etfw&#34;&gt;@rstudio&lt;/a&gt;! I wonder if there is really anything &lt;a href=&#34;https://twitter.com/hashtag/rstats?src=hash&amp;amp;ref_src=twsrc%5Etfw&#34;&gt;#rstats&lt;/a&gt; can’t do 😎😎😎 &lt;a href=&#34;https://t.co/nT6q6TT6xc&#34;&gt;pic.twitter.com/nT6q6TT6xc&lt;/a&gt;&lt;/p&gt;&amp;mdash; Hao Zhu (@haozhu233) &lt;a href=&#34;https://twitter.com/haozhu233/status/1088851449096880128?ref_src=twsrc%5Etfw&#34;&gt;January 25, 2019&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;/div&gt;
&lt;div id=&#34;guardar-en-un-servidor-sql&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Guardar en un Servidor SQL&lt;/h2&gt;
&lt;p&gt;Hay dos formas de hacer esto, una es conectar directamente el microcontrolador a la base de datos y la otra es usar otro servicio para extraer datos del microcontrolador y escribirlos en la base de datos.&lt;/p&gt;
&lt;p&gt;La primera opción es más difícil de lograr, que yo sepa, solo hay una &lt;a href=&#34;https://www.arduinolibraries.info/libraries/my-sql-connector-arduino&#34;&gt;biblioteca Arduino&lt;/a&gt; que proporciona un conector SQL para servidores MySQL, pero no hay soluciones ya hechas para otros servidores SQL y, aunque podría escribir su propio conector para otros servidores SQL de código abierto (como PostgreSQL), eso requeriría una considerable cantidad de habilidades técnicas.&lt;/p&gt;
&lt;p&gt;La segunda opción es más fácil de implementar, y mi favorito personal.&lt;/p&gt;
&lt;p&gt;El primer paso es transmitir los datos desde el microcontrolador, una forma de hacerlo es implementar un servidor web simple en el microcontrolador y servir los datos en un formato adecuado como HTML, JSON o CSV.&lt;/p&gt;
&lt;p&gt;Este es un ejemplo simple de un Sketch Arduino para una placa ESP8266 (Wemos D1 mini) y sensores de temperatura tipo sonda DS18B20, que sirve salidas HTML y JSON a través de un servidor web.&lt;/p&gt;
&lt;script type=&#34;application/javascript&#34; src=&#34;https://gist.github.com/andresrcs/fa631e15f2f665335b0592fdeba20992.js&#34;&gt;&lt;/script&gt;

&lt;p&gt;El segundo paso es extraer los datos del microcontrolador y ponerlos en un servidor SQL, hay muchos enfoques y lenguages que puede usar para implementar esta parte, pero obviamente vamos a usar R. Puede escribir un script R que se conecte al microcontrolador, recupere los datos y los escriba en un servidor SQL, y programar el script con un trabajo &lt;code&gt;cron&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb1&#34;&gt;&lt;pre class=&#34;sourceCode r&#34;&gt;&lt;code class=&#34;sourceCode r&#34;&gt;&lt;span id=&#34;cb1-1&#34;&gt;&lt;a href=&#34;#cb1-1&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;#! /usr/bin/env Rscript&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb1-2&#34;&gt;&lt;a href=&#34;#cb1-2&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb1-3&#34;&gt;&lt;a href=&#34;#cb1-3&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# ADQUISICIÓN DE DATOS #########################################################&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb1-4&#34;&gt;&lt;a href=&#34;#cb1-4&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;raw_data &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; rjson&lt;span class=&#34;sc&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;fu&#34;&gt;fromJSON&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;file=&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;&amp;quot;http://192.168.0.102/reading.json&amp;quot;&lt;/span&gt;) &lt;/span&gt;
&lt;span id=&#34;cb1-5&#34;&gt;&lt;a href=&#34;#cb1-5&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;current_time &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;as.character&lt;/span&gt;(&lt;span class=&#34;fu&#34;&gt;Sys.time&lt;/span&gt;())&lt;/span&gt;
&lt;span id=&#34;cb1-6&#34;&gt;&lt;a href=&#34;#cb1-6&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb1-7&#34;&gt;&lt;a href=&#34;#cb1-7&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# PARAMETROS ###################################################################&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb1-8&#34;&gt;&lt;a href=&#34;#cb1-8&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;current_location &lt;span class=&#34;ot&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;some_place&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb1-9&#34;&gt;&lt;a href=&#34;#cb1-9&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;point_names &lt;span class=&#34;ot&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;c&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;quot;probe0&amp;quot;&lt;/span&gt; &lt;span class=&#34;ot&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;measurement_point_0&amp;quot;&lt;/span&gt;, &lt;/span&gt;
&lt;span id=&#34;cb1-10&#34;&gt;&lt;a href=&#34;#cb1-10&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                &lt;span class=&#34;st&#34;&gt;&amp;quot;probe1&amp;quot;&lt;/span&gt; &lt;span class=&#34;ot&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;measurement_point_1&amp;quot;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb1-11&#34;&gt;&lt;a href=&#34;#cb1-11&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                &lt;span class=&#34;st&#34;&gt;&amp;quot;probe2&amp;quot;&lt;/span&gt; &lt;span class=&#34;ot&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;measurement_point_2&amp;quot;&lt;/span&gt;)&lt;/span&gt;
&lt;span id=&#34;cb1-12&#34;&gt;&lt;a href=&#34;#cb1-12&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb1-13&#34;&gt;&lt;a href=&#34;#cb1-13&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# LIBRERIAS ####################################################################&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb1-14&#34;&gt;&lt;a href=&#34;#cb1-14&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;library&lt;/span&gt;(dplyr)&lt;/span&gt;
&lt;span id=&#34;cb1-15&#34;&gt;&lt;a href=&#34;#cb1-15&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb1-16&#34;&gt;&lt;a href=&#34;#cb1-16&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# DATA CLEANING ################################################################&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb1-17&#34;&gt;&lt;a href=&#34;#cb1-17&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;tidy_data &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;as_tibble&lt;/span&gt;(raw_data) &lt;span class=&#34;sc&#34;&gt;%&amp;gt;%&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb1-18&#34;&gt;&lt;a href=&#34;#cb1-18&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    tidyr&lt;span class=&#34;sc&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;fu&#34;&gt;gather&lt;/span&gt;(measurement_point, value) &lt;span class=&#34;sc&#34;&gt;%&amp;gt;%&lt;/span&gt; &lt;/span&gt;
&lt;span id=&#34;cb1-19&#34;&gt;&lt;a href=&#34;#cb1-19&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;fu&#34;&gt;mutate&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;time =&lt;/span&gt; current_time,&lt;/span&gt;
&lt;span id=&#34;cb1-20&#34;&gt;&lt;a href=&#34;#cb1-20&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           &lt;span class=&#34;at&#34;&gt;location =&lt;/span&gt; current_location,&lt;/span&gt;
&lt;span id=&#34;cb1-21&#34;&gt;&lt;a href=&#34;#cb1-21&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           &lt;span class=&#34;at&#34;&gt;variable =&lt;/span&gt; stringr&lt;span class=&#34;sc&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;fu&#34;&gt;str_extract&lt;/span&gt;(measurement_point, &lt;span class=&#34;st&#34;&gt;&amp;quot;^.+(?=-)&amp;quot;&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb1-22&#34;&gt;&lt;a href=&#34;#cb1-22&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           &lt;span class=&#34;at&#34;&gt;measurement_point =&lt;/span&gt; stringr&lt;span class=&#34;sc&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;fu&#34;&gt;str_extract&lt;/span&gt;(measurement_point, &lt;span class=&#34;st&#34;&gt;&amp;quot;(?&amp;lt;=-).+$&amp;quot;&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb1-23&#34;&gt;&lt;a href=&#34;#cb1-23&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           &lt;span class=&#34;at&#34;&gt;measurement_point =&lt;/span&gt; stringr&lt;span class=&#34;sc&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;fu&#34;&gt;str_replace_all&lt;/span&gt;(measurement_point, point_names)&lt;/span&gt;
&lt;span id=&#34;cb1-24&#34;&gt;&lt;a href=&#34;#cb1-24&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           ) &lt;span class=&#34;sc&#34;&gt;%&amp;gt;%&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb1-25&#34;&gt;&lt;a href=&#34;#cb1-25&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;fu&#34;&gt;select&lt;/span&gt;(time, location, variable, measurement_point, value)&lt;/span&gt;
&lt;span id=&#34;cb1-26&#34;&gt;&lt;a href=&#34;#cb1-26&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb1-27&#34;&gt;&lt;a href=&#34;#cb1-27&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# CARGAR DATOS #################################################################&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb1-28&#34;&gt;&lt;a href=&#34;#cb1-28&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;con &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;dbConnect&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;drv =&lt;/span&gt; odbc&lt;span class=&#34;sc&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;fu&#34;&gt;odbc&lt;/span&gt;(),&lt;/span&gt;
&lt;span id=&#34;cb1-29&#34;&gt;&lt;a href=&#34;#cb1-29&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;driver =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;PostgreSQL ANSI&amp;#39;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb1-30&#34;&gt;&lt;a href=&#34;#cb1-30&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;server =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;localhost&amp;#39;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb1-31&#34;&gt;&lt;a href=&#34;#cb1-31&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;database =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;sensors&amp;#39;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb1-32&#34;&gt;&lt;a href=&#34;#cb1-32&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;port =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;5432&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb1-33&#34;&gt;&lt;a href=&#34;#cb1-33&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;uid =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;Sys.getenv&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;#39;MY_UID&amp;#39;&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb1-34&#34;&gt;&lt;a href=&#34;#cb1-34&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;pwd =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;Sys.getenv&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;#39;MY_PWD&amp;#39;&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb1-35&#34;&gt;&lt;a href=&#34;#cb1-35&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;encoding =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;utf8&amp;#39;&lt;/span&gt;)&lt;/span&gt;
&lt;span id=&#34;cb1-36&#34;&gt;&lt;a href=&#34;#cb1-36&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb1-37&#34;&gt;&lt;a href=&#34;#cb1-37&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;DBI&lt;span class=&#34;sc&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;fu&#34;&gt;dbAppendTable&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;conn =&lt;/span&gt; con,&lt;/span&gt;
&lt;span id=&#34;cb1-38&#34;&gt;&lt;a href=&#34;#cb1-38&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                   &lt;span class=&#34;at&#34;&gt;name =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;sensors_data&amp;#39;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb1-39&#34;&gt;&lt;a href=&#34;#cb1-39&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                   &lt;span class=&#34;at&#34;&gt;value =&lt;/span&gt; tidy_data)&lt;/span&gt;
&lt;span id=&#34;cb1-40&#34;&gt;&lt;a href=&#34;#cb1-40&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb1-41&#34;&gt;&lt;a href=&#34;#cb1-41&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;odbc&lt;span class=&#34;sc&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;fu&#34;&gt;dbDisconnect&lt;/span&gt;(con)&lt;/span&gt;
&lt;span id=&#34;cb1-42&#34;&gt;&lt;a href=&#34;#cb1-42&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb1-43&#34;&gt;&lt;a href=&#34;#cb1-43&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;unlink&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;x =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;*.log&amp;quot;&lt;/span&gt;, &lt;span class=&#34;at&#34;&gt;force =&lt;/span&gt; &lt;span class=&#34;cn&#34;&gt;TRUE&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ahora que tiene los datos en un servidor SQL, está en una consulta SQL de distancia de tenerlos en R&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb2&#34;&gt;&lt;pre class=&#34;sourceCode r&#34;&gt;&lt;code class=&#34;sourceCode r&#34;&gt;&lt;span id=&#34;cb2-1&#34;&gt;&lt;a href=&#34;#cb2-1&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;library&lt;/span&gt;(odbc)&lt;/span&gt;
&lt;span id=&#34;cb2-2&#34;&gt;&lt;a href=&#34;#cb2-2&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-3&#34;&gt;&lt;a href=&#34;#cb2-3&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;con &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;dbConnect&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;drv =&lt;/span&gt; odbc&lt;span class=&#34;sc&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;fu&#34;&gt;odbc&lt;/span&gt;(),&lt;/span&gt;
&lt;span id=&#34;cb2-4&#34;&gt;&lt;a href=&#34;#cb2-4&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;driver =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;PostgreSQL ANSI&amp;#39;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb2-5&#34;&gt;&lt;a href=&#34;#cb2-5&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;server =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;localhost&amp;#39;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb2-6&#34;&gt;&lt;a href=&#34;#cb2-6&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;database =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;sensors&amp;#39;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb2-7&#34;&gt;&lt;a href=&#34;#cb2-7&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;port =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;5432&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb2-8&#34;&gt;&lt;a href=&#34;#cb2-8&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;uid =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;Sys.getenv&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;#39;MY_UID&amp;#39;&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb2-9&#34;&gt;&lt;a href=&#34;#cb2-9&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;pwd =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;Sys.getenv&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;#39;MY_PWD&amp;#39;&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb2-10&#34;&gt;&lt;a href=&#34;#cb2-10&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;encoding =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;utf8&amp;#39;&lt;/span&gt;)&lt;/span&gt;
&lt;span id=&#34;cb2-11&#34;&gt;&lt;a href=&#34;#cb2-11&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-12&#34;&gt;&lt;a href=&#34;#cb2-12&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;query &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-13&#34;&gt;&lt;a href=&#34;#cb2-13&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;st&#34;&gt;    SELECT * &lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-14&#34;&gt;&lt;a href=&#34;#cb2-14&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;st&#34;&gt;    FROM public.sensors_data&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-15&#34;&gt;&lt;a href=&#34;#cb2-15&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;st&#34;&gt;    &amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-16&#34;&gt;&lt;a href=&#34;#cb2-16&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-17&#34;&gt;&lt;a href=&#34;#cb2-17&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;raw_data &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;dbGetQuery&lt;/span&gt;(&lt;/span&gt;
&lt;span id=&#34;cb2-18&#34;&gt;&lt;a href=&#34;#cb2-18&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;at&#34;&gt;conn =&lt;/span&gt; con,&lt;/span&gt;
&lt;span id=&#34;cb2-19&#34;&gt;&lt;a href=&#34;#cb2-19&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;at&#34;&gt;statement =&lt;/span&gt; query&lt;/span&gt;
&lt;span id=&#34;cb2-20&#34;&gt;&lt;a href=&#34;#cb2-20&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;)&lt;/span&gt;
&lt;span id=&#34;cb2-21&#34;&gt;&lt;a href=&#34;#cb2-21&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-22&#34;&gt;&lt;a href=&#34;#cb2-22&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;dbDisconnect&lt;/span&gt;(con)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Lo que hace que este enfoque sea mi favorito personal es que es fácil de implementar, muy flexible y le permite implementar casi cualquier medida de seguridad que pueda necesitar.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;usando-el-protocolo-mqtt&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Usando el Protocolo MQTT&lt;/h2&gt;
&lt;p&gt;Para aplicaciones con recursos más limitados, puede usar un enfoque similar al anterior, pero con una tecnología diferente, el protocolo MQTT es ideal para dispositivos de baja potencia en conexiones lentas y poco confiables, además, esta es también una forma de obtener datos de redes LoRa como la disponible públicamente &lt;a href=&#34;https://www.thethingsnetwork.org/&#34;&gt;TTN (The Things Network)&lt;/a&gt; que proporciona una API sobre MQTT, que le da acceso a una &lt;a href=&#34;https://es.wikipedia.org/wiki/LoRaWAN&#34;&gt;red de área amplia de baja potencia&lt;/a&gt; para la implementación remota de sensores a mayores distancias.&lt;/p&gt;
&lt;p&gt;Este enfoque también le permite escribir datos en un servidor SQL como en el ejemplo anterior, pero una aplicación más interesante para esto sería obtener actualizaciones de estado instantáneas para mostrar en Dashboards o aplicaciones Shiny. Considere esta sencilla aplicación Shiny que recibe un mensaje de un sensor remoto simulado y actualiza el color de un círculo en consecuencia, puede actualizar el valor de temperatura del sensor simulado enviando un mensaje MQTT al tema de prueba desde una terminal de sistema en cualquier computadora con este comando &lt;code&gt;mosquitto_pub -h test.mosquitto.org -t simulated_sensor -q 1 -m 25.9 -r&lt;/code&gt; y ver cómo cambia el color.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;✏️ Para que esto funcione, debe tener el cliente &lt;code&gt;mosquitto&lt;/code&gt; instalado en su sistema.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install mosquitto-clients&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb4&#34;&gt;&lt;pre class=&#34;sourceCode r&#34;&gt;&lt;code class=&#34;sourceCode r&#34;&gt;&lt;span id=&#34;cb4-1&#34;&gt;&lt;a href=&#34;#cb4-1&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;library&lt;/span&gt;(shiny)&lt;/span&gt;
&lt;span id=&#34;cb4-2&#34;&gt;&lt;a href=&#34;#cb4-2&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;library&lt;/span&gt;(ggplot2)&lt;/span&gt;
&lt;span id=&#34;cb4-3&#34;&gt;&lt;a href=&#34;#cb4-3&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;library&lt;/span&gt;(rmqtt)  &lt;span class=&#34;co&#34;&gt;# Este paquete es simplemente una envoltura para un cliente MQTT que usa&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-4&#34;&gt;&lt;a href=&#34;#cb4-4&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                &lt;span class=&#34;co&#34;&gt;# llamadas al sistema `system()`, necesita tener el cliente mosquitto&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-5&#34;&gt;&lt;a href=&#34;#cb4-5&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                &lt;span class=&#34;co&#34;&gt;# instalado en su sistema para que esto funcione.&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-6&#34;&gt;&lt;a href=&#34;#cb4-6&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-7&#34;&gt;&lt;a href=&#34;#cb4-7&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Inicializar el sensor simulado&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-8&#34;&gt;&lt;a href=&#34;#cb4-8&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;mqtt_topic_publish&lt;/span&gt;(&lt;/span&gt;
&lt;span id=&#34;cb4-9&#34;&gt;&lt;a href=&#34;#cb4-9&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;at&#34;&gt;topic =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;simulated_sensor&amp;quot;&lt;/span&gt;, &lt;/span&gt;
&lt;span id=&#34;cb4-10&#34;&gt;&lt;a href=&#34;#cb4-10&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;at&#34;&gt;message_to_send =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;24.9&amp;quot;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb4-11&#34;&gt;&lt;a href=&#34;#cb4-11&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;at&#34;&gt;host =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;test.mosquitto.org&amp;quot;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb4-12&#34;&gt;&lt;a href=&#34;#cb4-12&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;at&#34;&gt;port =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;1883&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb4-13&#34;&gt;&lt;a href=&#34;#cb4-13&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;at&#34;&gt;qos =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;1&lt;/span&gt;, &lt;/span&gt;
&lt;span id=&#34;cb4-14&#34;&gt;&lt;a href=&#34;#cb4-14&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;at&#34;&gt;retain_message =&lt;/span&gt; &lt;span class=&#34;cn&#34;&gt;TRUE&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-15&#34;&gt;&lt;a href=&#34;#cb4-15&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;)&lt;/span&gt;
&lt;span id=&#34;cb4-16&#34;&gt;&lt;a href=&#34;#cb4-16&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-17&#34;&gt;&lt;a href=&#34;#cb4-17&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;ui &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;fluidPage&lt;/span&gt;(&lt;/span&gt;
&lt;span id=&#34;cb4-18&#34;&gt;&lt;a href=&#34;#cb4-18&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;fu&#34;&gt;titlePanel&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;quot;Dashboard&amp;quot;&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb4-19&#34;&gt;&lt;a href=&#34;#cb4-19&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;fu&#34;&gt;mainPanel&lt;/span&gt;(&lt;/span&gt;
&lt;span id=&#34;cb4-20&#34;&gt;&lt;a href=&#34;#cb4-20&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;fu&#34;&gt;h2&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;quot;Indicador de Temperatura&amp;quot;&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb4-21&#34;&gt;&lt;a href=&#34;#cb4-21&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;fu&#34;&gt;plotOutput&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;quot;indicator_estado&amp;quot;&lt;/span&gt;)&lt;/span&gt;
&lt;span id=&#34;cb4-22&#34;&gt;&lt;a href=&#34;#cb4-22&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    )&lt;/span&gt;
&lt;span id=&#34;cb4-23&#34;&gt;&lt;a href=&#34;#cb4-23&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;)&lt;/span&gt;
&lt;span id=&#34;cb4-24&#34;&gt;&lt;a href=&#34;#cb4-24&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-25&#34;&gt;&lt;a href=&#34;#cb4-25&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;server &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;cf&#34;&gt;function&lt;/span&gt;(input, output, session) {&lt;/span&gt;
&lt;span id=&#34;cb4-26&#34;&gt;&lt;a href=&#34;#cb4-26&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;/span&gt;
&lt;span id=&#34;cb4-27&#34;&gt;&lt;a href=&#34;#cb4-27&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    get_color &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;cf&#34;&gt;function&lt;/span&gt;() {&lt;/span&gt;
&lt;span id=&#34;cb4-28&#34;&gt;&lt;a href=&#34;#cb4-28&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        message &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;mqtt_topic_subscribe&lt;/span&gt;(&lt;/span&gt;
&lt;span id=&#34;cb4-29&#34;&gt;&lt;a href=&#34;#cb4-29&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            &lt;span class=&#34;at&#34;&gt;topic =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;simulated_sensor&amp;quot;&lt;/span&gt;, &lt;/span&gt;
&lt;span id=&#34;cb4-30&#34;&gt;&lt;a href=&#34;#cb4-30&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            &lt;span class=&#34;at&#34;&gt;host =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;test.mosquitto.org&amp;quot;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb4-31&#34;&gt;&lt;a href=&#34;#cb4-31&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            &lt;span class=&#34;at&#34;&gt;port =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;1883&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb4-32&#34;&gt;&lt;a href=&#34;#cb4-32&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            &lt;span class=&#34;at&#34;&gt;qos =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;1&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb4-33&#34;&gt;&lt;a href=&#34;#cb4-33&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            &lt;span class=&#34;at&#34;&gt;intern =&lt;/span&gt; &lt;span class=&#34;cn&#34;&gt;TRUE&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb4-34&#34;&gt;&lt;a href=&#34;#cb4-34&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            &lt;span class=&#34;at&#34;&gt;num.messages =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-35&#34;&gt;&lt;a href=&#34;#cb4-35&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        )&lt;/span&gt;
&lt;span id=&#34;cb4-36&#34;&gt;&lt;a href=&#34;#cb4-36&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;/span&gt;
&lt;span id=&#34;cb4-37&#34;&gt;&lt;a href=&#34;#cb4-37&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;cf&#34;&gt;if&lt;/span&gt; (&lt;span class=&#34;fu&#34;&gt;as.numeric&lt;/span&gt;(message) &lt;span class=&#34;sc&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;25&lt;/span&gt;) {&lt;/span&gt;
&lt;span id=&#34;cb4-38&#34;&gt;&lt;a href=&#34;#cb4-38&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            color &lt;span class=&#34;ot&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;red&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-39&#34;&gt;&lt;a href=&#34;#cb4-39&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        } &lt;span class=&#34;cf&#34;&gt;else&lt;/span&gt; {&lt;/span&gt;
&lt;span id=&#34;cb4-40&#34;&gt;&lt;a href=&#34;#cb4-40&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            color &lt;span class=&#34;ot&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;green&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-41&#34;&gt;&lt;a href=&#34;#cb4-41&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        }&lt;/span&gt;
&lt;span id=&#34;cb4-42&#34;&gt;&lt;a href=&#34;#cb4-42&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;/span&gt;
&lt;span id=&#34;cb4-43&#34;&gt;&lt;a href=&#34;#cb4-43&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;fu&#34;&gt;return&lt;/span&gt;(color)&lt;/span&gt;
&lt;span id=&#34;cb4-44&#34;&gt;&lt;a href=&#34;#cb4-44&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    }&lt;/span&gt;
&lt;span id=&#34;cb4-45&#34;&gt;&lt;a href=&#34;#cb4-45&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;/span&gt;
&lt;span id=&#34;cb4-46&#34;&gt;&lt;a href=&#34;#cb4-46&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    pollData &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;reactivePoll&lt;/span&gt;(&lt;span class=&#34;dv&#34;&gt;100&lt;/span&gt;, session,&lt;/span&gt;
&lt;span id=&#34;cb4-47&#34;&gt;&lt;a href=&#34;#cb4-47&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                             &lt;span class=&#34;at&#34;&gt;checkFunc =&lt;/span&gt; get_color,&lt;/span&gt;
&lt;span id=&#34;cb4-48&#34;&gt;&lt;a href=&#34;#cb4-48&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                             &lt;span class=&#34;at&#34;&gt;valueFunc =&lt;/span&gt; get_color&lt;/span&gt;
&lt;span id=&#34;cb4-49&#34;&gt;&lt;a href=&#34;#cb4-49&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    )&lt;/span&gt;
&lt;span id=&#34;cb4-50&#34;&gt;&lt;a href=&#34;#cb4-50&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;/span&gt;
&lt;span id=&#34;cb4-51&#34;&gt;&lt;a href=&#34;#cb4-51&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    output&lt;span class=&#34;sc&#34;&gt;$&lt;/span&gt;indicator_estado &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;renderPlot&lt;/span&gt;({&lt;/span&gt;
&lt;span id=&#34;cb4-52&#34;&gt;&lt;a href=&#34;#cb4-52&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;        &lt;span class=&#34;fu&#34;&gt;ggplot&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;data =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;data.frame&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;x =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;at&#34;&gt;y =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;1&lt;/span&gt;), &lt;span class=&#34;fu&#34;&gt;aes&lt;/span&gt;(x, y)) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-53&#34;&gt;&lt;a href=&#34;#cb4-53&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            &lt;span class=&#34;fu&#34;&gt;geom_point&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;size =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;50&lt;/span&gt;, &lt;span class=&#34;at&#34;&gt;color =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;pollData&lt;/span&gt;()) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-54&#34;&gt;&lt;a href=&#34;#cb4-54&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            &lt;span class=&#34;fu&#34;&gt;scale_x_discrete&lt;/span&gt;() &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-55&#34;&gt;&lt;a href=&#34;#cb4-55&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            &lt;span class=&#34;fu&#34;&gt;scale_y_discrete&lt;/span&gt;() &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-56&#34;&gt;&lt;a href=&#34;#cb4-56&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            &lt;span class=&#34;fu&#34;&gt;theme_void&lt;/span&gt;() &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-57&#34;&gt;&lt;a href=&#34;#cb4-57&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            &lt;span class=&#34;fu&#34;&gt;theme&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;axis.title =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;element_blank&lt;/span&gt;())&lt;/span&gt;
&lt;span id=&#34;cb4-58&#34;&gt;&lt;a href=&#34;#cb4-58&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    })&lt;/span&gt;
&lt;span id=&#34;cb4-59&#34;&gt;&lt;a href=&#34;#cb4-59&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;}&lt;/span&gt;
&lt;span id=&#34;cb4-60&#34;&gt;&lt;a href=&#34;#cb4-60&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-61&#34;&gt;&lt;a href=&#34;#cb4-61&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;shinyApp&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;ui =&lt;/span&gt; ui, &lt;span class=&#34;at&#34;&gt;server =&lt;/span&gt; server)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src=&#34;https://andresrcs.rbind.io/post/2020-02-09-arduino-compatible-microcontrollers-r.es_files/shiny.jpg&#34; width=&#34;400&#34; height=&#34;300&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Si está interesado en probar esto, aquí hay un GitHub Gist con el &lt;a href=&#34;https://gist.github.com/andresrcs/a2000bf54bf98be64351bbad34bdb838&#34;&gt;Sketch Arduino&lt;/a&gt; para una placa ESP8266 con un sensor de temperatura tipo sonda DS18B20 que puede actualizar los valores en la aplicación de ejemplo.&lt;/p&gt;
&lt;p&gt;Sé que esto no parece muy interesante en este momento, pero tenga en cuenta las implicaciones. ¡Podría recibir actualizaciones instantáneas en su Dashboard de sensores desplegados a kilómetros de distancia e incluso podría controlar actuadores remotos desde su aplicación Shiny enviando un mensaje MQTT desde ella con solo hacer clic en un botón!&lt;/p&gt;
&lt;p&gt;La desventaja de este método es que debe configurar un agente MQTT (no debe abusar de los disponibles públicamente que están destinados a pruebas), pero se puede hacer con poco o ningún dinero en una Raspberry Pi o una instancia EC2 AWS.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;descargo&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Descargo&lt;/h2&gt;
&lt;p&gt;Quiero dejar en claro que esta no es una lista exhaustiva, hay otras alternativas e innumerables variaciones de las que se presentan aquí, así que si ninguna de estas se ajusta a las necesidades de su proyecto en particular, siga buscando, es muy probable que alguien haya encontrado una método más adecuado.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;✏️ Si desea ver un ejemplo detallado paso a paso de cualquiera de estas opciones, escríbalo en los comentarios e intentaré hacer una publicación de blog al respecto.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Monitoreando su velocidad real de Internet a lo largo del tiempo, utilizando R y Speedtest-CLI</title>
      <link>https://andresrcs.rbind.io/es/2020/01/21/speed_test/</link>
      <pubDate>Tue, 21 Jan 2020 00:00:00 +0000</pubDate>
      
      <guid>https://andresrcs.rbind.io/es/2020/01/21/speed_test/</guid>
      <description>
&lt;style type=&#34;text/css&#34;&gt;
pre &gt; code.sourceCode { white-space: pre; position: relative; }
pre &gt; code.sourceCode &gt; span { display: inline-block; line-height: 1.25; }
pre &gt; code.sourceCode &gt; span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode &gt; span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre &gt; code.sourceCode { white-space: pre-wrap; }
pre &gt; code.sourceCode &gt; span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
  { counter-reset: source-line 0; }
pre.numberSource code &gt; span
  { position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code &gt; span &gt; a:first-child::before
  { content: counter(source-line);
    position: relative; left: -1em; text-align: right; vertical-align: baseline;
    border: none; display: inline-block;
    -webkit-touch-callout: none; -webkit-user-select: none;
    -khtml-user-select: none; -moz-user-select: none;
    -ms-user-select: none; user-select: none;
    padding: 0 4px; width: 4em;
  }
pre.numberSource { margin-left: 3em;  padding-left: 4px; }
div.sourceCode
  { color: #cccccc; background-color: #303030; }
@media screen {
pre &gt; code.sourceCode &gt; span &gt; a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ffcfaf; } /* Alert */
code span.an { color: #7f9f7f; font-weight: bold; } /* Annotation */
code span.at { } /* Attribute */
code span.bn { color: #dca3a3; } /* BaseN */
code span.bu { } /* BuiltIn */
code span.cf { color: #f0dfaf; } /* ControlFlow */
code span.ch { color: #dca3a3; } /* Char */
code span.cn { color: #dca3a3; font-weight: bold; } /* Constant */
code span.co { color: #7f9f7f; } /* Comment */
code span.cv { color: #7f9f7f; font-weight: bold; } /* CommentVar */
code span.do { color: #7f9f7f; } /* Documentation */
code span.dt { color: #dfdfbf; } /* DataType */
code span.dv { color: #dcdccc; } /* DecVal */
code span.er { color: #c3bf9f; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #c0bed1; } /* Float */
code span.fu { color: #efef8f; } /* Function */
code span.im { } /* Import */
code span.in { color: #7f9f7f; font-weight: bold; } /* Information */
code span.kw { color: #f0dfaf; } /* Keyword */
code span.op { color: #f0efd0; } /* Operator */
code span.ot { color: #efef8f; } /* Other */
code span.pp { color: #ffcfaf; font-weight: bold; } /* Preprocessor */
code span.sc { color: #dca3a3; } /* SpecialChar */
code span.ss { color: #cc9393; } /* SpecialString */
code span.st { color: #cc9393; } /* String */
code span.va { } /* Variable */
code span.vs { color: #cc9393; } /* VerbatimString */
code span.wa { color: #7f9f7f; font-weight: bold; } /* Warning */
&lt;/style&gt;

&lt;div id=&#34;TOC&#34;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;#preparando-su-configuración&#34; id=&#34;toc-preparando-su-configuración&#34;&gt;Preparando su Configuración&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#reuniendo-dato&#34; id=&#34;toc-reuniendo-dato&#34;&gt;Reuniendo Dato&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;#visualizando-los-datos&#34; id=&#34;toc-visualizando-los-datos&#34;&gt;Visualizando los Datos&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;

&lt;p&gt;Pensé que esto solo sucedía en mi país (Perú), pero resulta que les sucede a personas en todo el mundo, uno contrata un plan de Internet que ofrece &lt;strong&gt;hasta&lt;/strong&gt; &lt;code&gt;X&lt;/code&gt; Mbps, donde &lt;code&gt;X&lt;/code&gt; es un valor impresionante (relativo al contexto de cada país), pero la trampa está en esa palabra, &lt;strong&gt;Hasta&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;en&#34; dir=&#34;ltr&#34;&gt;If it makes you feel better, it could be worse if you lived in another country, trust me, I know... &lt;a href=&#34;https://t.co/Rm3J2J2Cdz&#34;&gt;pic.twitter.com/Rm3J2J2Cdz&lt;/a&gt;&lt;/p&gt;&amp;mdash; Andrés Castro Socolich (@Andresrcs) &lt;a href=&#34;https://twitter.com/Andresrcs/status/1217915622023147542?ref_src=twsrc%5Etfw&#34;&gt;January 16, 2020&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;


&lt;p&gt;En realidad, termina obteniendo velocidades de descarga mucho más lentas de lo anunciado, y los ISP (Proveedores de Servicios de Internet por sus siglas en inglés) se salen con la suya, ya que solo prueban la velocidad de descarga con usted, una vez, cuando instalan el servicio (sospechosamente funciona muy bien en ese momento) y la mayoría de personas no se molestan en realizar un seguimiento de sus velocidades de descarga a lo largo del tiempo, ya que no es práctico realizar pruebas de velocidad manualmente cada corto período de tiempo, afortunadamente hay una mejor manera, el servicio &lt;a href=&#34;https://www.speedtest.net/&#34;&gt;Speedtest de Ookla&lt;/a&gt; provee una &lt;em&gt;&lt;strong&gt;Interfaz de Línea de Comandos (CLI por sus siglas en inglés)&lt;/strong&gt;&lt;/em&gt;, que le permite realizar pruebas desde la terminal de su sistema, dándole la capacidad de configurar scripts automáticos para recopilar datos de rendimiento de la conexión.&lt;/p&gt;
&lt;p&gt;En las siguientes líneas, le mostraré cómo hacer esto desde R y obtener los resultados en forma de bonitos gráficos que puede twittear a su ISP para molestarlos un poco. 😆&lt;/p&gt;
&lt;div id=&#34;preparando-su-configuración&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Preparando su Configuración&lt;/h2&gt;
&lt;p&gt;Tenemos que configurar nuestro entorno de trabajo para este proyecto. Primero, necesitamos una máquina que esté constantemente encendida y conectada a la misma conexión de Internet que desea probar, para que pueda realizar las pruebas y almacenar los datos, podría ser cualquier computadora conectada a su red local pero la solución más práctica (y económica) que he encontrado es usando una Raspberry Pi, así que usaré una para este proyecto.&lt;/p&gt;
&lt;p&gt;Dado que está leyendo un artículo relacionado con R, voy a suponer que ya tiene su entorno de R básico configurado, por lo que nos centraremos en las cosas adicionales, necesitamos instalar la interfaz de línea de comandos (CLI) de Speedtest, si está en una máquina Linux, puede hacerlo con estos comandos en una terminal del sistema:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;✏️ Hay &lt;a href=&#34;https://www.speedtest.net/apps/cli&#34;&gt;instrucciones de instalación para otros sistemas operativos&lt;/a&gt; en el sitio web de Speedtest.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb1&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb1-1&#34;&gt;&lt;a href=&#34;#cb1-1&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; apt-get install curl&lt;/span&gt;
&lt;span id=&#34;cb1-2&#34;&gt;&lt;a href=&#34;#cb1-2&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;ex&#34;&gt;curl&lt;/span&gt; &lt;span class=&#34;at&#34;&gt;-s&lt;/span&gt; https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.deb.sh &lt;span class=&#34;kw&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; bash&lt;/span&gt;
&lt;span id=&#34;cb1-3&#34;&gt;&lt;a href=&#34;#cb1-3&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; apt-get install speedtest&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;✏️ Compruebe si tiene instalada una versión anterior Python de la CLI en su sistema y asegúrese de desinstalarla con este comando &lt;code&gt;sudo pip uninstall speedtes-cli&lt;/code&gt;, ya que podría causar conflictos con la versión oficial más reciente. Esto me sucedió y no me di cuenta 😳, gracias a &lt;a href=&#34;https://twitter.com/jasongrahn&#34;&gt;@jasongrahn&lt;/a&gt; por el aviso.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
&lt;div id=&#34;reuniendo-dato&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Reuniendo Dato&lt;/h2&gt;
&lt;p&gt;Ahora podemos escribir un script R que recupere el resultado de la prueba, procese el contenido y almacene los datos. En este ejemplo, los voy a almacenar en una base de datos PostgreSQL, pero podría elegir otras opciones como otro servidor SQL, Hojas de cálculo de Google, un archivo CSV, etc. He llamado a este script &lt;code&gt;speedtest_job.R&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb2&#34;&gt;&lt;pre class=&#34;sourceCode r&#34;&gt;&lt;code class=&#34;sourceCode r&#34;&gt;&lt;span id=&#34;cb2-1&#34;&gt;&lt;a href=&#34;#cb2-1&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;#! /usr/bin/env Rscript&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-2&#34;&gt;&lt;a href=&#34;#cb2-2&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-3&#34;&gt;&lt;a href=&#34;#cb2-3&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Data adquisition&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-4&#34;&gt;&lt;a href=&#34;#cb2-4&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;output &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;read.csv&lt;/span&gt;(&lt;/span&gt;
&lt;span id=&#34;cb2-5&#34;&gt;&lt;a href=&#34;#cb2-5&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;at&#34;&gt;text =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;system&lt;/span&gt;(&lt;/span&gt;
&lt;span id=&#34;cb2-6&#34;&gt;&lt;a href=&#34;#cb2-6&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;at&#34;&gt;command =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;speedtest -f csv --output-header --accept-license&amp;quot;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb2-7&#34;&gt;&lt;a href=&#34;#cb2-7&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;at&#34;&gt;intern =&lt;/span&gt; &lt;span class=&#34;cn&#34;&gt;TRUE&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-8&#34;&gt;&lt;a href=&#34;#cb2-8&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  )&lt;/span&gt;
&lt;span id=&#34;cb2-9&#34;&gt;&lt;a href=&#34;#cb2-9&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;)&lt;/span&gt;
&lt;span id=&#34;cb2-10&#34;&gt;&lt;a href=&#34;#cb2-10&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-11&#34;&gt;&lt;a href=&#34;#cb2-11&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;results &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;data.frame&lt;/span&gt;(&lt;/span&gt;
&lt;span id=&#34;cb2-12&#34;&gt;&lt;a href=&#34;#cb2-12&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;at&#34;&gt;stringsAsFactors =&lt;/span&gt; &lt;span class=&#34;cn&#34;&gt;FALSE&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb2-13&#34;&gt;&lt;a href=&#34;#cb2-13&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;at&#34;&gt;time =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;as.POSIXct&lt;/span&gt;(&lt;span class=&#34;fu&#34;&gt;Sys.time&lt;/span&gt;()),&lt;/span&gt;
&lt;span id=&#34;cb2-14&#34;&gt;&lt;a href=&#34;#cb2-14&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;at&#34;&gt;ip =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;system&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;quot;curl ifconfig.me&amp;quot;&lt;/span&gt;, &lt;span class=&#34;at&#34;&gt;intern =&lt;/span&gt; &lt;span class=&#34;cn&#34;&gt;TRUE&lt;/span&gt;), &lt;span class=&#34;co&#34;&gt;# This field is no longer provided on the new CLI version&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-15&#34;&gt;&lt;a href=&#34;#cb2-15&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;at&#34;&gt;ping =&lt;/span&gt; output&lt;span class=&#34;sc&#34;&gt;$&lt;/span&gt;latency,&lt;/span&gt;
&lt;span id=&#34;cb2-16&#34;&gt;&lt;a href=&#34;#cb2-16&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;at&#34;&gt;download =&lt;/span&gt; output&lt;span class=&#34;sc&#34;&gt;$&lt;/span&gt;download &lt;span class=&#34;sc&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;fl&#34;&gt;7.629395E-6&lt;/span&gt;, &lt;span class=&#34;co&#34;&gt;# Convert to Mbps&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-17&#34;&gt;&lt;a href=&#34;#cb2-17&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;at&#34;&gt;upload =&lt;/span&gt; output&lt;span class=&#34;sc&#34;&gt;$&lt;/span&gt;upload &lt;span class=&#34;sc&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;fl&#34;&gt;7.629395E-6&lt;/span&gt;, &lt;span class=&#34;co&#34;&gt;# Convert to Mbps&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-18&#34;&gt;&lt;a href=&#34;#cb2-18&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;at&#34;&gt;isp =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;movistar&amp;quot;&lt;/span&gt; &lt;span class=&#34;co&#34;&gt;# This field is not provided on CSV format&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-19&#34;&gt;&lt;a href=&#34;#cb2-19&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;)&lt;/span&gt;
&lt;span id=&#34;cb2-20&#34;&gt;&lt;a href=&#34;#cb2-20&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-21&#34;&gt;&lt;a href=&#34;#cb2-21&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Data storing&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-22&#34;&gt;&lt;a href=&#34;#cb2-22&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;con &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;dbConnect&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;drv =&lt;/span&gt; odbc&lt;span class=&#34;sc&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;fu&#34;&gt;odbc&lt;/span&gt;(),&lt;/span&gt;
&lt;span id=&#34;cb2-23&#34;&gt;&lt;a href=&#34;#cb2-23&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;driver =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;PostgreSQL ANSI&amp;#39;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb2-24&#34;&gt;&lt;a href=&#34;#cb2-24&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;server =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;localhost&amp;#39;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb2-25&#34;&gt;&lt;a href=&#34;#cb2-25&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;database =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;internet&amp;#39;&lt;/span&gt;, &lt;span class=&#34;co&#34;&gt;# Name of the database on the sql server&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-26&#34;&gt;&lt;a href=&#34;#cb2-26&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;port =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;5432&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb2-27&#34;&gt;&lt;a href=&#34;#cb2-27&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;uid =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;Sys.getenv&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;#39;MY_UID&amp;#39;&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb2-28&#34;&gt;&lt;a href=&#34;#cb2-28&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;pwd =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;Sys.getenv&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;#39;MY_PWD&amp;#39;&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb2-29&#34;&gt;&lt;a href=&#34;#cb2-29&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;encoding =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;utf8&amp;#39;&lt;/span&gt;)&lt;/span&gt;
&lt;span id=&#34;cb2-30&#34;&gt;&lt;a href=&#34;#cb2-30&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-31&#34;&gt;&lt;a href=&#34;#cb2-31&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;DBI&lt;span class=&#34;sc&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;fu&#34;&gt;dbAppendTable&lt;/span&gt;(&lt;/span&gt;
&lt;span id=&#34;cb2-32&#34;&gt;&lt;a href=&#34;#cb2-32&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;at&#34;&gt;conn =&lt;/span&gt; con,&lt;/span&gt;
&lt;span id=&#34;cb2-33&#34;&gt;&lt;a href=&#34;#cb2-33&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;at&#34;&gt;name =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;speed_test&amp;quot;&lt;/span&gt;, &lt;span class=&#34;co&#34;&gt;# Table name on the sql server&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-34&#34;&gt;&lt;a href=&#34;#cb2-34&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;at&#34;&gt;value =&lt;/span&gt; results&lt;/span&gt;
&lt;span id=&#34;cb2-35&#34;&gt;&lt;a href=&#34;#cb2-35&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;)&lt;/span&gt;
&lt;span id=&#34;cb2-36&#34;&gt;&lt;a href=&#34;#cb2-36&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-37&#34;&gt;&lt;a href=&#34;#cb2-37&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;odbc&lt;span class=&#34;sc&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;fu&#34;&gt;dbDisconnect&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;conn =&lt;/span&gt; con)&lt;/span&gt;
&lt;span id=&#34;cb2-38&#34;&gt;&lt;a href=&#34;#cb2-38&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-39&#34;&gt;&lt;a href=&#34;#cb2-39&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Cleaning log files&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb2-40&#34;&gt;&lt;a href=&#34;#cb2-40&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;unlink&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;x =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;*.log&amp;quot;&lt;/span&gt;, &lt;span class=&#34;at&#34;&gt;force =&lt;/span&gt; &lt;span class=&#34;cn&#34;&gt;TRUE&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ahora podemos programar un trabajo &lt;code&gt;cron&lt;/code&gt; para ejecutar este script a intervalos regulares, voy a configurarlo para que se ejecute una vez cada hora ejecutando estos comandos en un terminal del sistema:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;✏️ Esto también se puede hacer desde R usando el paquete &lt;code&gt;cronR&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb3&#34;&gt;&lt;pre class=&#34;sourceCode bash&#34;&gt;&lt;code class=&#34;sourceCode bash&#34;&gt;&lt;span id=&#34;cb3-1&#34;&gt;&lt;a href=&#34;#cb3-1&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;env&lt;/span&gt; EDITOR=nano crontab &lt;span class=&#34;at&#34;&gt;-e&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb3-2&#34;&gt;&lt;a href=&#34;#cb3-2&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;co&#34;&gt;# Agregue esta línea&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb3-3&#34;&gt;&lt;a href=&#34;#cb3-3&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;ex&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;pp&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;pp&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;pp&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;pp&#34;&gt;*&lt;/span&gt; /usr/local/lib/R/bin/Rscript &lt;span class=&#34;st&#34;&gt;&amp;#39;/home/pi/speedtest_job.R&amp;#39;&lt;/span&gt; &lt;span class=&#34;op&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;/dev/null&amp;#39;&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;op&#34;&gt;&amp;gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;dv&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;co&#34;&gt;# Modifique la ruta del archivo según sea necesario. &lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb3-4&#34;&gt;&lt;a href=&#34;#cb3-4&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;sudo&lt;/span&gt; service cron reload&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Después de dejar pasar un tiempo para que se acumulen los registros, podemos obtener datos del servidor con una consulta SQL:&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb4&#34;&gt;&lt;pre class=&#34;sourceCode r&#34;&gt;&lt;code class=&#34;sourceCode r&#34;&gt;&lt;span id=&#34;cb4-1&#34;&gt;&lt;a href=&#34;#cb4-1&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;library&lt;/span&gt;(odbc)&lt;/span&gt;
&lt;span id=&#34;cb4-2&#34;&gt;&lt;a href=&#34;#cb4-2&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-3&#34;&gt;&lt;a href=&#34;#cb4-3&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;con &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;dbConnect&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;drv =&lt;/span&gt; odbc&lt;span class=&#34;sc&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;fu&#34;&gt;odbc&lt;/span&gt;(),&lt;/span&gt;
&lt;span id=&#34;cb4-4&#34;&gt;&lt;a href=&#34;#cb4-4&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;driver =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;PostgreSQL ANSI&amp;#39;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb4-5&#34;&gt;&lt;a href=&#34;#cb4-5&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;server =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;Sys.getenv&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;#39;MY_REMOTE&amp;#39;&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb4-6&#34;&gt;&lt;a href=&#34;#cb4-6&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;database =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;internet&amp;#39;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb4-7&#34;&gt;&lt;a href=&#34;#cb4-7&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;port =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;5432&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb4-8&#34;&gt;&lt;a href=&#34;#cb4-8&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;uid =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;Sys.getenv&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;#39;MY_UID&amp;#39;&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb4-9&#34;&gt;&lt;a href=&#34;#cb4-9&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;pwd =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;Sys.getenv&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;#39;MY_PWD&amp;#39;&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb4-10&#34;&gt;&lt;a href=&#34;#cb4-10&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                 &lt;span class=&#34;at&#34;&gt;encoding =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;utf8&amp;#39;&lt;/span&gt;)&lt;/span&gt;
&lt;span id=&#34;cb4-11&#34;&gt;&lt;a href=&#34;#cb4-11&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-12&#34;&gt;&lt;a href=&#34;#cb4-12&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;query &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-13&#34;&gt;&lt;a href=&#34;#cb4-13&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;st&#34;&gt;    SELECT * &lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-14&#34;&gt;&lt;a href=&#34;#cb4-14&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;st&#34;&gt;    FROM public.speed_test &lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-15&#34;&gt;&lt;a href=&#34;#cb4-15&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;st&#34;&gt;    ORDER BY time&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-16&#34;&gt;&lt;a href=&#34;#cb4-16&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;st&#34;&gt;    &amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-17&#34;&gt;&lt;a href=&#34;#cb4-17&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-18&#34;&gt;&lt;a href=&#34;#cb4-18&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;raw_data &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;dbGetQuery&lt;/span&gt;(&lt;/span&gt;
&lt;span id=&#34;cb4-19&#34;&gt;&lt;a href=&#34;#cb4-19&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;at&#34;&gt;conn =&lt;/span&gt; con,&lt;/span&gt;
&lt;span id=&#34;cb4-20&#34;&gt;&lt;a href=&#34;#cb4-20&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;at&#34;&gt;statement =&lt;/span&gt; query&lt;/span&gt;
&lt;span id=&#34;cb4-21&#34;&gt;&lt;a href=&#34;#cb4-21&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;)&lt;/span&gt;
&lt;span id=&#34;cb4-22&#34;&gt;&lt;a href=&#34;#cb4-22&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb4-23&#34;&gt;&lt;a href=&#34;#cb4-23&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;dbDisconnect&lt;/span&gt;(con)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;visualizando-los-datos&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Visualizando los Datos&lt;/h2&gt;
&lt;p&gt;Ahora que tenemos algunos datos para trabajar, podemos comenzar a hacer algunos gráficos. Dado que este no es un artículo sobre &lt;code&gt;ggplopt2&lt;/code&gt;, no voy a entrar en detalles sobre esta parte, solo voy a mostrar algunos gráficos interesantes que puede obtener sobre la velocidad de su conexión a Internet.&lt;/p&gt;
&lt;p&gt;En la Figura &lt;a href=&#34;#fig:histogram&#34;&gt;1&lt;/a&gt; podemos ver cómo se distribuyen las velocidades de descarga observadas, dejando de lado el hecho de que la velocidad anunciada ya es lenta (para los estándares de los países desarrollados), esto revela un patrón que es muy común, la mayoría de las veces usted obtiene velocidades de descarga que son mucho más lentas de lo anunciado por el ISP e incluso tan lentas que no cumplen con los términos de su contrato, como en mi caso (en realidad usé esta imagen para presentar una queja).&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb5&#34;&gt;&lt;pre class=&#34;sourceCode r&#34;&gt;&lt;code class=&#34;sourceCode r&#34;&gt;&lt;span id=&#34;cb5-1&#34;&gt;&lt;a href=&#34;#cb5-1&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;library&lt;/span&gt;(tidyverse)&lt;/span&gt;
&lt;span id=&#34;cb5-2&#34;&gt;&lt;a href=&#34;#cb5-2&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;library&lt;/span&gt;(xkcd)&lt;/span&gt;
&lt;span id=&#34;cb5-3&#34;&gt;&lt;a href=&#34;#cb5-3&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;library&lt;/span&gt;(lubridate)&lt;/span&gt;
&lt;span id=&#34;cb5-4&#34;&gt;&lt;a href=&#34;#cb5-4&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;library&lt;/span&gt;(tibbletime)&lt;/span&gt;
&lt;span id=&#34;cb5-5&#34;&gt;&lt;a href=&#34;#cb5-5&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;library&lt;/span&gt;(scales)&lt;/span&gt;
&lt;span id=&#34;cb5-6&#34;&gt;&lt;a href=&#34;#cb5-6&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-7&#34;&gt;&lt;a href=&#34;#cb5-7&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;co&#34;&gt;# Estas son mis configuraciones de tema personales, puede ignorarlas si lo prefiere&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-8&#34;&gt;&lt;a href=&#34;#cb5-8&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;span class=&#34;fu&#34;&gt;theme_set&lt;/span&gt;(&lt;/span&gt;
&lt;span id=&#34;cb5-9&#34;&gt;&lt;a href=&#34;#cb5-9&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;theme_gray&lt;/span&gt;() &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-10&#34;&gt;&lt;a href=&#34;#cb5-10&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;fu&#34;&gt;theme_xkcd&lt;/span&gt;() &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-11&#34;&gt;&lt;a href=&#34;#cb5-11&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;fu&#34;&gt;theme&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;legend.position =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;right&amp;quot;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb5-12&#34;&gt;&lt;a href=&#34;#cb5-12&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;          &lt;span class=&#34;at&#34;&gt;plot.title.position =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;plot&amp;quot;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb5-13&#34;&gt;&lt;a href=&#34;#cb5-13&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;          &lt;span class=&#34;at&#34;&gt;axis.title.x =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;element_text&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;margin =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;margin&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;t =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;10&lt;/span&gt;)),&lt;/span&gt;
&lt;span id=&#34;cb5-14&#34;&gt;&lt;a href=&#34;#cb5-14&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;          &lt;span class=&#34;at&#34;&gt;axis.title.y =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;element_text&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;margin =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;margin&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;r =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;10&lt;/span&gt;)),&lt;/span&gt;
&lt;span id=&#34;cb5-15&#34;&gt;&lt;a href=&#34;#cb5-15&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;          &lt;span class=&#34;at&#34;&gt;axis.text.x =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;element_text&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;angle =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;20&lt;/span&gt;, &lt;span class=&#34;at&#34;&gt;hjust =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;1&lt;/span&gt;, &lt;span class=&#34;at&#34;&gt;vjust =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;1&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb5-16&#34;&gt;&lt;a href=&#34;#cb5-16&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;          &lt;span class=&#34;at&#34;&gt;plot.margin =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;margin&lt;/span&gt;(&lt;span class=&#34;dv&#34;&gt;10&lt;/span&gt;, &lt;span class=&#34;dv&#34;&gt;10&lt;/span&gt;, &lt;span class=&#34;dv&#34;&gt;10&lt;/span&gt;, &lt;span class=&#34;dv&#34;&gt;10&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb5-17&#34;&gt;&lt;a href=&#34;#cb5-17&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;          &lt;span class=&#34;at&#34;&gt;text =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;element_text&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;family =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;Cloud Calligraphy&amp;quot;&lt;/span&gt;))&lt;/span&gt;
&lt;span id=&#34;cb5-18&#34;&gt;&lt;a href=&#34;#cb5-18&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;)&lt;/span&gt;
&lt;span id=&#34;cb5-19&#34;&gt;&lt;a href=&#34;#cb5-19&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-20&#34;&gt;&lt;a href=&#34;#cb5-20&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;color &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;c&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;quot;Moda&amp;quot;&lt;/span&gt; &lt;span class=&#34;ot&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;#008B00&amp;quot;&lt;/span&gt;, &lt;span class=&#34;st&#34;&gt;&amp;quot;Parámetros&amp;quot;&lt;/span&gt; &lt;span class=&#34;ot&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;orange&amp;quot;&lt;/span&gt;)&lt;/span&gt;
&lt;span id=&#34;cb5-21&#34;&gt;&lt;a href=&#34;#cb5-21&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-22&#34;&gt;&lt;a href=&#34;#cb5-22&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;raw_data &lt;span class=&#34;sc&#34;&gt;%&amp;gt;%&lt;/span&gt; &lt;/span&gt;
&lt;span id=&#34;cb5-23&#34;&gt;&lt;a href=&#34;#cb5-23&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;ggplot&lt;/span&gt;(&lt;span class=&#34;fu&#34;&gt;aes&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;x =&lt;/span&gt; download)) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-24&#34;&gt;&lt;a href=&#34;#cb5-24&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;geom_histogram&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;binwidth =&lt;/span&gt; &lt;span class=&#34;fl&#34;&gt;0.1&lt;/span&gt;, &lt;span class=&#34;at&#34;&gt;fill =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;#00B2EE&amp;quot;&lt;/span&gt;) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-25&#34;&gt;&lt;a href=&#34;#cb5-25&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;geom_vline&lt;/span&gt;(&lt;span class=&#34;fu&#34;&gt;aes&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;xintercept =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;20&lt;/span&gt;, &lt;span class=&#34;at&#34;&gt;color =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;Parámetros&amp;quot;&lt;/span&gt;),  &lt;span class=&#34;at&#34;&gt;linetype =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;dashed&amp;quot;&lt;/span&gt;) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-26&#34;&gt;&lt;a href=&#34;#cb5-26&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;geom_vline&lt;/span&gt;(&lt;span class=&#34;fu&#34;&gt;aes&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;xintercept =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;8&lt;/span&gt;, &lt;span class=&#34;at&#34;&gt;color =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;Parámetros&amp;quot;&lt;/span&gt;),  &lt;span class=&#34;at&#34;&gt;linetype =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;dashed&amp;quot;&lt;/span&gt;) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-27&#34;&gt;&lt;a href=&#34;#cb5-27&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;stat_bin&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;geom =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;vline&amp;quot;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb5-28&#34;&gt;&lt;a href=&#34;#cb5-28&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           &lt;span class=&#34;fu&#34;&gt;aes&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;xintercept =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;stat&lt;/span&gt;(&lt;span class=&#34;fu&#34;&gt;ifelse&lt;/span&gt;(count &lt;span class=&#34;sc&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;max&lt;/span&gt;(count), x, &lt;span class=&#34;cn&#34;&gt;NA&lt;/span&gt;)),&lt;/span&gt;
&lt;span id=&#34;cb5-29&#34;&gt;&lt;a href=&#34;#cb5-29&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;               &lt;span class=&#34;at&#34;&gt;color =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;Moda&amp;quot;&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb5-30&#34;&gt;&lt;a href=&#34;#cb5-30&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           &lt;span class=&#34;at&#34;&gt;binwidth =&lt;/span&gt; &lt;span class=&#34;fl&#34;&gt;0.1&lt;/span&gt;) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-31&#34;&gt;&lt;a href=&#34;#cb5-31&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;annotate&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;quot;text&amp;quot;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb5-32&#34;&gt;&lt;a href=&#34;#cb5-32&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           &lt;span class=&#34;at&#34;&gt;x =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;c&lt;/span&gt;(&lt;span class=&#34;fl&#34;&gt;8.4&lt;/span&gt;, &lt;span class=&#34;fl&#34;&gt;20.4&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb5-33&#34;&gt;&lt;a href=&#34;#cb5-33&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           &lt;span class=&#34;at&#34;&gt;y =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;c&lt;/span&gt;(&lt;span class=&#34;dv&#34;&gt;8&lt;/span&gt;, &lt;span class=&#34;dv&#34;&gt;8&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb5-34&#34;&gt;&lt;a href=&#34;#cb5-34&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           &lt;span class=&#34;at&#34;&gt;label =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;c&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;quot;Velocidad Mínima Garantizada&amp;quot;&lt;/span&gt;, &lt;span class=&#34;st&#34;&gt;&amp;quot;Velocidad Ofrecida&amp;quot;&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb5-35&#34;&gt;&lt;a href=&#34;#cb5-35&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           &lt;span class=&#34;at&#34;&gt;family =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;Cloud Calligraphy&amp;quot;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb5-36&#34;&gt;&lt;a href=&#34;#cb5-36&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           &lt;span class=&#34;at&#34;&gt;size =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;5&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb5-37&#34;&gt;&lt;a href=&#34;#cb5-37&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           &lt;span class=&#34;at&#34;&gt;angle =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;90&lt;/span&gt;) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-38&#34;&gt;&lt;a href=&#34;#cb5-38&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;stat_bin&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;geom =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;label&amp;quot;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb5-39&#34;&gt;&lt;a href=&#34;#cb5-39&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           &lt;span class=&#34;fu&#34;&gt;aes&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;label =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;stat&lt;/span&gt;(&lt;span class=&#34;fu&#34;&gt;ifelse&lt;/span&gt;(count &lt;span class=&#34;sc&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;max&lt;/span&gt;(count), &lt;span class=&#34;fu&#34;&gt;round&lt;/span&gt;(x, &lt;span class=&#34;dv&#34;&gt;1&lt;/span&gt;), &lt;span class=&#34;cn&#34;&gt;NA&lt;/span&gt;))),&lt;/span&gt;
&lt;span id=&#34;cb5-40&#34;&gt;&lt;a href=&#34;#cb5-40&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           &lt;span class=&#34;at&#34;&gt;binwidth =&lt;/span&gt; &lt;span class=&#34;fl&#34;&gt;0.1&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb5-41&#34;&gt;&lt;a href=&#34;#cb5-41&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           &lt;span class=&#34;at&#34;&gt;family =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;xkcd&amp;quot;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb5-42&#34;&gt;&lt;a href=&#34;#cb5-42&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           &lt;span class=&#34;at&#34;&gt;color =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;#008B00&amp;quot;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb5-43&#34;&gt;&lt;a href=&#34;#cb5-43&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           &lt;span class=&#34;at&#34;&gt;vjust =&lt;/span&gt; &lt;span class=&#34;sc&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;fl&#34;&gt;0.2&lt;/span&gt;) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-44&#34;&gt;&lt;a href=&#34;#cb5-44&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;labs&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;title =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;HISTOGRAMA DE VELOCIDADES DE DESCARGA OBSERVADAS&amp;#39;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb5-45&#34;&gt;&lt;a href=&#34;#cb5-45&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;at&#34;&gt;subtitle =&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;&amp;#39;ISP: MOVISTAR 20 Mbps&amp;#39;&lt;/span&gt;, &lt;/span&gt;
&lt;span id=&#34;cb5-46&#34;&gt;&lt;a href=&#34;#cb5-46&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;at&#34;&gt;x =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;Velocidad (Mbps)&amp;#39;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb5-47&#34;&gt;&lt;a href=&#34;#cb5-47&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;at&#34;&gt;y =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;Frecuencia&amp;#39;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb5-48&#34;&gt;&lt;a href=&#34;#cb5-48&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;at&#34;&gt;colour =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-49&#34;&gt;&lt;a href=&#34;#cb5-49&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;scale_x_continuous&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;breaks =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;seq&lt;/span&gt;(&lt;span class=&#34;dv&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;dv&#34;&gt;22&lt;/span&gt;, &lt;span class=&#34;at&#34;&gt;by =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;2&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb5-50&#34;&gt;&lt;a href=&#34;#cb5-50&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                     &lt;span class=&#34;at&#34;&gt;limits =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;c&lt;/span&gt;(&lt;span class=&#34;dv&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;dv&#34;&gt;23&lt;/span&gt;)) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-51&#34;&gt;&lt;a href=&#34;#cb5-51&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;scale_colour_manual&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;values =&lt;/span&gt; color) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-52&#34;&gt;&lt;a href=&#34;#cb5-52&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;coord_cartesian&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;clip =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;off&amp;#39;&lt;/span&gt;) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb5-53&#34;&gt;&lt;a href=&#34;#cb5-53&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;cn&#34;&gt;NULL&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&#34;figure&#34; style=&#34;text-align: center&#34;&gt;&lt;span style=&#34;display:block;&#34; id=&#34;fig:histogram&#34;&gt;&lt;/span&gt;
&lt;img src=&#34;https://andresrcs.rbind.io/post/2020-01-20-internet-speed-test.es_files/figure-html/histogram-1.png&#34; alt=&#34;Histograma de Velocidades de Descarga Observadas&#34; width=&#34;768&#34; /&gt;
&lt;p class=&#34;caption&#34;&gt;
Figure 1: Histograma de Velocidades de Descarga Observadas
&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Con las Figuras &lt;a href=&#34;#fig:line&#34;&gt;2&lt;/a&gt; y &lt;a href=&#34;#fig:box&#34;&gt;3&lt;/a&gt;, podemos mostrar con qué frecuencia las velocidades de descarga caen por debajo de la velocidad mínima garantizada.&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb6&#34;&gt;&lt;pre class=&#34;sourceCode r&#34;&gt;&lt;code class=&#34;sourceCode r&#34;&gt;&lt;span id=&#34;cb6-1&#34;&gt;&lt;a href=&#34;#cb6-1&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-2&#34;&gt;&lt;a href=&#34;#cb6-2&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;colors &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;c&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;quot;Velocidad Promedio&amp;quot;&lt;/span&gt; &lt;span class=&#34;ot&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;blue&amp;quot;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb6-3&#34;&gt;&lt;a href=&#34;#cb6-3&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            &lt;span class=&#34;st&#34;&gt;&amp;quot;Parámetros&amp;quot;&lt;/span&gt; &lt;span class=&#34;ot&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;orange&amp;quot;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb6-4&#34;&gt;&lt;a href=&#34;#cb6-4&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            &lt;span class=&#34;st&#34;&gt;&amp;quot;Falla&amp;quot;&lt;/span&gt; &lt;span class=&#34;ot&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;red&amp;quot;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb6-5&#34;&gt;&lt;a href=&#34;#cb6-5&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;            &lt;span class=&#34;st&#34;&gt;&amp;quot;Velocidad de Descarga&amp;quot;&lt;/span&gt; &lt;span class=&#34;ot&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;#00B2EE&amp;quot;&lt;/span&gt;)&lt;/span&gt;
&lt;span id=&#34;cb6-6&#34;&gt;&lt;a href=&#34;#cb6-6&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-7&#34;&gt;&lt;a href=&#34;#cb6-7&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;plot_data &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; raw_data &lt;span class=&#34;sc&#34;&gt;%&amp;gt;%&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-8&#34;&gt;&lt;a href=&#34;#cb6-8&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;as_tbl_time&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;index =&lt;/span&gt; time) &lt;span class=&#34;sc&#34;&gt;%&amp;gt;%&lt;/span&gt; &lt;/span&gt;
&lt;span id=&#34;cb6-9&#34;&gt;&lt;a href=&#34;#cb6-9&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;collapse_by&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;#39;1 hour&amp;#39;&lt;/span&gt;, &lt;span class=&#34;at&#34;&gt;side =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;start&amp;#39;&lt;/span&gt;, &lt;span class=&#34;at&#34;&gt;clean =&lt;/span&gt; &lt;span class=&#34;cn&#34;&gt;TRUE&lt;/span&gt;)&lt;/span&gt;
&lt;span id=&#34;cb6-10&#34;&gt;&lt;a href=&#34;#cb6-10&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-11&#34;&gt;&lt;a href=&#34;#cb6-11&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;mean_speed &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; plot_data &lt;span class=&#34;sc&#34;&gt;%&amp;gt;%&lt;/span&gt; &lt;/span&gt;
&lt;span id=&#34;cb6-12&#34;&gt;&lt;a href=&#34;#cb6-12&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;pull&lt;/span&gt;(download) &lt;span class=&#34;sc&#34;&gt;%&amp;gt;%&lt;/span&gt; &lt;/span&gt;
&lt;span id=&#34;cb6-13&#34;&gt;&lt;a href=&#34;#cb6-13&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;mean&lt;/span&gt;() &lt;span class=&#34;sc&#34;&gt;%&amp;gt;%&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-14&#34;&gt;&lt;a href=&#34;#cb6-14&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;round&lt;/span&gt;(&lt;span class=&#34;dv&#34;&gt;1&lt;/span&gt;)&lt;/span&gt;
&lt;span id=&#34;cb6-15&#34;&gt;&lt;a href=&#34;#cb6-15&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-16&#34;&gt;&lt;a href=&#34;#cb6-16&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;plot_data &lt;span class=&#34;sc&#34;&gt;%&amp;gt;%&lt;/span&gt; &lt;/span&gt;
&lt;span id=&#34;cb6-17&#34;&gt;&lt;a href=&#34;#cb6-17&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;ggplot&lt;/span&gt;(&lt;span class=&#34;fu&#34;&gt;aes&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;x =&lt;/span&gt; time, &lt;span class=&#34;at&#34;&gt;y =&lt;/span&gt; download)) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-18&#34;&gt;&lt;a href=&#34;#cb6-18&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;geom_line&lt;/span&gt;(&lt;span class=&#34;fu&#34;&gt;aes&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;color =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;Velocidad de Descarga&amp;quot;&lt;/span&gt;)) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-19&#34;&gt;&lt;a href=&#34;#cb6-19&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;geom_point&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;data =&lt;/span&gt; plot_data &lt;span class=&#34;sc&#34;&gt;%&amp;gt;%&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;filter&lt;/span&gt;(download &lt;span class=&#34;sc&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;8&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb6-20&#34;&gt;&lt;a href=&#34;#cb6-20&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;             &lt;span class=&#34;fu&#34;&gt;aes&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;color =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;Falla&amp;quot;&lt;/span&gt;)) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-21&#34;&gt;&lt;a href=&#34;#cb6-21&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;geom_point&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;data =&lt;/span&gt; plot_data &lt;span class=&#34;sc&#34;&gt;%&amp;gt;%&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;filter&lt;/span&gt;(download &lt;span class=&#34;sc&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;8&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb6-22&#34;&gt;&lt;a href=&#34;#cb6-22&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;             &lt;span class=&#34;at&#34;&gt;shape =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;1&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb6-23&#34;&gt;&lt;a href=&#34;#cb6-23&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;             &lt;span class=&#34;at&#34;&gt;color =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;red&amp;quot;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb6-24&#34;&gt;&lt;a href=&#34;#cb6-24&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;             &lt;span class=&#34;at&#34;&gt;size =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;5&lt;/span&gt;) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-25&#34;&gt;&lt;a href=&#34;#cb6-25&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;geom_hline&lt;/span&gt;(&lt;span class=&#34;fu&#34;&gt;aes&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;yintercept =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;20&lt;/span&gt;, &lt;span class=&#34;at&#34;&gt;color =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;Parámetros&amp;quot;&lt;/span&gt;),  &lt;span class=&#34;at&#34;&gt;linetype =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;dashed&amp;quot;&lt;/span&gt;) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-26&#34;&gt;&lt;a href=&#34;#cb6-26&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;geom_hline&lt;/span&gt;(&lt;span class=&#34;fu&#34;&gt;aes&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;yintercept =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;8&lt;/span&gt;, &lt;span class=&#34;at&#34;&gt;color =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;Parámetros&amp;quot;&lt;/span&gt;),  &lt;span class=&#34;at&#34;&gt;linetype =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;dashed&amp;quot;&lt;/span&gt;) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-27&#34;&gt;&lt;a href=&#34;#cb6-27&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;geom_hline&lt;/span&gt;(&lt;span class=&#34;fu&#34;&gt;aes&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;yintercept =&lt;/span&gt; mean_speed, &lt;span class=&#34;at&#34;&gt;color =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;Velocidad Promedio&amp;quot;&lt;/span&gt;)) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-28&#34;&gt;&lt;a href=&#34;#cb6-28&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;annotate&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;quot;text&amp;quot;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb6-29&#34;&gt;&lt;a href=&#34;#cb6-29&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           &lt;span class=&#34;at&#34;&gt;x =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;as.POSIXct&lt;/span&gt;(&lt;span class=&#34;fu&#34;&gt;c&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;quot;2019-06-24 11:00:00 UTC&amp;quot;&lt;/span&gt;, &lt;span class=&#34;st&#34;&gt;&amp;quot;2019-06-24 11:00:00 UTC&amp;quot;&lt;/span&gt;)),&lt;/span&gt;
&lt;span id=&#34;cb6-30&#34;&gt;&lt;a href=&#34;#cb6-30&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           &lt;span class=&#34;at&#34;&gt;y =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;c&lt;/span&gt;(&lt;span class=&#34;dv&#34;&gt;7&lt;/span&gt;, &lt;span class=&#34;dv&#34;&gt;19&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb6-31&#34;&gt;&lt;a href=&#34;#cb6-31&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           &lt;span class=&#34;at&#34;&gt;label =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;c&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;quot;Velocidad Mínima Garantizada&amp;quot;&lt;/span&gt;, &lt;span class=&#34;st&#34;&gt;&amp;quot;Velocidad Ofrecida&amp;quot;&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb6-32&#34;&gt;&lt;a href=&#34;#cb6-32&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           &lt;span class=&#34;at&#34;&gt;family =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;Cloud Calligraphy&amp;quot;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb6-33&#34;&gt;&lt;a href=&#34;#cb6-33&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           &lt;span class=&#34;at&#34;&gt;size=&lt;/span&gt;&lt;span class=&#34;dv&#34;&gt;5&lt;/span&gt;) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-34&#34;&gt;&lt;a href=&#34;#cb6-34&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;geom_label&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;x =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;as.POSIXct&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;quot;2019-08-01 11:00:00 UTC&amp;quot;&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb6-35&#34;&gt;&lt;a href=&#34;#cb6-35&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;             &lt;span class=&#34;at&#34;&gt;y =&lt;/span&gt; mean_speed,&lt;/span&gt;
&lt;span id=&#34;cb6-36&#34;&gt;&lt;a href=&#34;#cb6-36&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;             &lt;span class=&#34;at&#34;&gt;label =&lt;/span&gt; mean_speed,&lt;/span&gt;
&lt;span id=&#34;cb6-37&#34;&gt;&lt;a href=&#34;#cb6-37&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;             &lt;span class=&#34;at&#34;&gt;family =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;xkcd&amp;quot;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb6-38&#34;&gt;&lt;a href=&#34;#cb6-38&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;             &lt;span class=&#34;at&#34;&gt;show.legend =&lt;/span&gt; &lt;span class=&#34;cn&#34;&gt;FALSE&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb6-39&#34;&gt;&lt;a href=&#34;#cb6-39&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;             &lt;span class=&#34;at&#34;&gt;inherit.aes =&lt;/span&gt; &lt;span class=&#34;cn&#34;&gt;FALSE&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb6-40&#34;&gt;&lt;a href=&#34;#cb6-40&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;             &lt;span class=&#34;at&#34;&gt;color =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;blue&amp;quot;&lt;/span&gt;)  &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-41&#34;&gt;&lt;a href=&#34;#cb6-41&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;labs&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;title =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;VELOCIDADES DE DESCARGA OBSERVADAS&amp;#39;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb6-42&#34;&gt;&lt;a href=&#34;#cb6-42&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;at&#34;&gt;subtitle =&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;&amp;#39;ISP: MOVISTAR 20 Mbps&amp;#39;&lt;/span&gt;, &lt;/span&gt;
&lt;span id=&#34;cb6-43&#34;&gt;&lt;a href=&#34;#cb6-43&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;at&#34;&gt;x =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;Fecha&amp;#39;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb6-44&#34;&gt;&lt;a href=&#34;#cb6-44&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;at&#34;&gt;y =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;Velocidad (Mbps)&amp;#39;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb6-45&#34;&gt;&lt;a href=&#34;#cb6-45&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;at&#34;&gt;color =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;Leyenda:&amp;#39;&lt;/span&gt;) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-46&#34;&gt;&lt;a href=&#34;#cb6-46&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;scale_x_datetime&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;date_breaks =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;5 days&amp;quot;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb6-47&#34;&gt;&lt;a href=&#34;#cb6-47&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                   &lt;span class=&#34;at&#34;&gt;labels =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;label_date_short&lt;/span&gt;(), &lt;/span&gt;
&lt;span id=&#34;cb6-48&#34;&gt;&lt;a href=&#34;#cb6-48&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                   &lt;span class=&#34;at&#34;&gt;expand =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;expansion&lt;/span&gt;(&lt;span class=&#34;fu&#34;&gt;c&lt;/span&gt;(&lt;span class=&#34;dv&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;fl&#34;&gt;0.04&lt;/span&gt;))) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-49&#34;&gt;&lt;a href=&#34;#cb6-49&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;scale_y_continuous&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;breaks =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;seq&lt;/span&gt;(&lt;span class=&#34;dv&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;dv&#34;&gt;22&lt;/span&gt;, &lt;span class=&#34;at&#34;&gt;by =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;2&lt;/span&gt;), &lt;span class=&#34;at&#34;&gt;limits =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;c&lt;/span&gt;(&lt;span class=&#34;dv&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;dv&#34;&gt;23&lt;/span&gt;)) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-50&#34;&gt;&lt;a href=&#34;#cb6-50&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;scale_colour_manual&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;values =&lt;/span&gt; colors) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-51&#34;&gt;&lt;a href=&#34;#cb6-51&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;coord_cartesian&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;clip =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;off&amp;#39;&lt;/span&gt;) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb6-52&#34;&gt;&lt;a href=&#34;#cb6-52&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;cn&#34;&gt;NULL&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&#34;figure&#34; style=&#34;text-align: center&#34;&gt;&lt;span style=&#34;display:block;&#34; id=&#34;fig:line&#34;&gt;&lt;/span&gt;
&lt;img src=&#34;https://andresrcs.rbind.io/post/2020-01-20-internet-speed-test.es_files/figure-html/line-1.png&#34; alt=&#34;Velocidades de Descarga Observadas&#34; width=&#34;768&#34; /&gt;
&lt;p class=&#34;caption&#34;&gt;
Figure 2: Velocidades de Descarga Observadas
&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb7&#34;&gt;&lt;pre class=&#34;sourceCode r&#34;&gt;&lt;code class=&#34;sourceCode r&#34;&gt;&lt;span id=&#34;cb7-1&#34;&gt;&lt;a href=&#34;#cb7-1&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;faults &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; plot_data &lt;span class=&#34;sc&#34;&gt;%&amp;gt;%&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb7-2&#34;&gt;&lt;a href=&#34;#cb7-2&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;mutate&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;event_type =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;ifelse&lt;/span&gt;(download &lt;span class=&#34;sc&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;8&lt;/span&gt;, &lt;span class=&#34;st&#34;&gt;&amp;#39;fault&amp;#39;&lt;/span&gt;, &lt;span class=&#34;st&#34;&gt;&amp;#39;normal&amp;#39;&lt;/span&gt;)) &lt;span class=&#34;sc&#34;&gt;%&amp;gt;%&lt;/span&gt; &lt;/span&gt;
&lt;span id=&#34;cb7-3&#34;&gt;&lt;a href=&#34;#cb7-3&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;filter&lt;/span&gt;(event_type &lt;span class=&#34;sc&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;fault&amp;#39;&lt;/span&gt;) &lt;span class=&#34;sc&#34;&gt;%&amp;gt;%&lt;/span&gt; &lt;/span&gt;
&lt;span id=&#34;cb7-4&#34;&gt;&lt;a href=&#34;#cb7-4&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;mutate&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;tbf =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;as.numeric&lt;/span&gt;(&lt;span class=&#34;fu&#34;&gt;as.period&lt;/span&gt;(&lt;span class=&#34;fu&#34;&gt;interval&lt;/span&gt;(&lt;span class=&#34;fu&#34;&gt;lag&lt;/span&gt;(time), time),&lt;/span&gt;
&lt;span id=&#34;cb7-5&#34;&gt;&lt;a href=&#34;#cb7-5&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                                    &lt;span class=&#34;at&#34;&gt;unit =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;seconds&amp;#39;&lt;/span&gt;)) &lt;span class=&#34;sc&#34;&gt;/&lt;/span&gt; (&lt;span class=&#34;dv&#34;&gt;3600&lt;/span&gt;)) &lt;span class=&#34;sc&#34;&gt;%&amp;gt;%&lt;/span&gt; &lt;/span&gt;
&lt;span id=&#34;cb7-6&#34;&gt;&lt;a href=&#34;#cb7-6&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;tail&lt;/span&gt;(&lt;span class=&#34;sc&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;dv&#34;&gt;1&lt;/span&gt;)&lt;/span&gt;
&lt;span id=&#34;cb7-7&#34;&gt;&lt;a href=&#34;#cb7-7&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb7-8&#34;&gt;&lt;a href=&#34;#cb7-8&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;faults &lt;span class=&#34;sc&#34;&gt;%&amp;gt;%&lt;/span&gt; &lt;/span&gt;
&lt;span id=&#34;cb7-9&#34;&gt;&lt;a href=&#34;#cb7-9&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;ggplot&lt;/span&gt;(&lt;span class=&#34;fu&#34;&gt;aes&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;x =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;, &lt;span class=&#34;at&#34;&gt;y =&lt;/span&gt; tbf)) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb7-10&#34;&gt;&lt;a href=&#34;#cb7-10&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;geom_boxplot&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;fill =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;#FF303094&amp;#39;&lt;/span&gt;) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb7-11&#34;&gt;&lt;a href=&#34;#cb7-11&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;coord_flip&lt;/span&gt;() &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb7-12&#34;&gt;&lt;a href=&#34;#cb7-12&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;geom_label&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;y =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;median&lt;/span&gt;(faults&lt;span class=&#34;sc&#34;&gt;$&lt;/span&gt;tbf),&lt;/span&gt;
&lt;span id=&#34;cb7-13&#34;&gt;&lt;a href=&#34;#cb7-13&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;             &lt;span class=&#34;at&#34;&gt;label =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;paste&lt;/span&gt;(&lt;span class=&#34;fu&#34;&gt;round&lt;/span&gt;(&lt;span class=&#34;fu&#34;&gt;median&lt;/span&gt;(faults&lt;span class=&#34;sc&#34;&gt;$&lt;/span&gt;tbf),&lt;span class=&#34;dv&#34;&gt;1&lt;/span&gt;), &lt;span class=&#34;st&#34;&gt;&amp;#39;h&amp;#39;&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb7-14&#34;&gt;&lt;a href=&#34;#cb7-14&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;             &lt;span class=&#34;at&#34;&gt;family =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;xkcd&amp;quot;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb7-15&#34;&gt;&lt;a href=&#34;#cb7-15&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;             &lt;span class=&#34;at&#34;&gt;show.legend =&lt;/span&gt; &lt;span class=&#34;cn&#34;&gt;FALSE&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb7-16&#34;&gt;&lt;a href=&#34;#cb7-16&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;             &lt;span class=&#34;at&#34;&gt;color =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;blue&amp;quot;&lt;/span&gt;) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb7-17&#34;&gt;&lt;a href=&#34;#cb7-17&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;labs&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;title =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;DIAGRAMA DE CAJA DE TIEMPO ENTRE FALLAS&amp;#39;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb7-18&#34;&gt;&lt;a href=&#34;#cb7-18&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;at&#34;&gt;subtitle =&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;&amp;#39;ISP: MOVISTAR 20 Mbps&amp;#39;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb7-19&#34;&gt;&lt;a href=&#34;#cb7-19&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;at&#34;&gt;x =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb7-20&#34;&gt;&lt;a href=&#34;#cb7-20&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;at&#34;&gt;y =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;Horas&amp;#39;&lt;/span&gt;) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb7-21&#34;&gt;&lt;a href=&#34;#cb7-21&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;cn&#34;&gt;NULL&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&#34;figure&#34; style=&#34;text-align: center&#34;&gt;&lt;span style=&#34;display:block;&#34; id=&#34;fig:box&#34;&gt;&lt;/span&gt;
&lt;img src=&#34;https://andresrcs.rbind.io/post/2020-01-20-internet-speed-test.es_files/figure-html/box-1.png&#34; alt=&#34;Diagrama de Caja de Tiempo Entre Fallas&#34; width=&#34;672&#34; /&gt;
&lt;p class=&#34;caption&#34;&gt;
Figure 3: Diagrama de Caja de Tiempo Entre Fallas
&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Y con la Figura &lt;a href=&#34;#fig:boxes&#34;&gt;4&lt;/a&gt; podemos saber cuándo ocurren las horas pico, para saber a qué hora del día es más probable que experimentemos velocidades de Internet lentas.&lt;/p&gt;
&lt;div class=&#34;sourceCode&#34; id=&#34;cb8&#34;&gt;&lt;pre class=&#34;sourceCode r&#34;&gt;&lt;code class=&#34;sourceCode r&#34;&gt;&lt;span id=&#34;cb8-1&#34;&gt;&lt;a href=&#34;#cb8-1&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;hour_data &lt;span class=&#34;ot&#34;&gt;&amp;lt;-&lt;/span&gt; plot_data &lt;span class=&#34;sc&#34;&gt;%&amp;gt;%&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb8-2&#34;&gt;&lt;a href=&#34;#cb8-2&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;fu&#34;&gt;as_data_frame&lt;/span&gt;() &lt;span class=&#34;sc&#34;&gt;%&amp;gt;%&lt;/span&gt; &lt;/span&gt;
&lt;span id=&#34;cb8-3&#34;&gt;&lt;a href=&#34;#cb8-3&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;    &lt;span class=&#34;fu&#34;&gt;mutate&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;time =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;format&lt;/span&gt;(time, &lt;span class=&#34;st&#34;&gt;&amp;quot;%H:%M&amp;quot;&lt;/span&gt;))&lt;/span&gt;
&lt;span id=&#34;cb8-4&#34;&gt;&lt;a href=&#34;#cb8-4&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;&lt;/span&gt;
&lt;span id=&#34;cb8-5&#34;&gt;&lt;a href=&#34;#cb8-5&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;hour_data &lt;span class=&#34;sc&#34;&gt;%&amp;gt;%&lt;/span&gt; &lt;/span&gt;
&lt;span id=&#34;cb8-6&#34;&gt;&lt;a href=&#34;#cb8-6&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;ggplot&lt;/span&gt;(&lt;span class=&#34;fu&#34;&gt;aes&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;x =&lt;/span&gt; time, &lt;span class=&#34;at&#34;&gt;y =&lt;/span&gt; download)) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb8-7&#34;&gt;&lt;a href=&#34;#cb8-7&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;geom_boxplot&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;fill =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;#00B2EE&amp;quot;&lt;/span&gt;) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb8-8&#34;&gt;&lt;a href=&#34;#cb8-8&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;geom_point&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;data =&lt;/span&gt; hour_data &lt;span class=&#34;sc&#34;&gt;%&amp;gt;%&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;filter&lt;/span&gt;(download &lt;span class=&#34;sc&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;8&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb8-9&#34;&gt;&lt;a href=&#34;#cb8-9&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;             &lt;span class=&#34;at&#34;&gt;shape =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;1&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb8-10&#34;&gt;&lt;a href=&#34;#cb8-10&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;             &lt;span class=&#34;at&#34;&gt;color =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;red&amp;quot;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb8-11&#34;&gt;&lt;a href=&#34;#cb8-11&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;             &lt;span class=&#34;at&#34;&gt;size =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;5&lt;/span&gt;) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb8-12&#34;&gt;&lt;a href=&#34;#cb8-12&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;geom_hline&lt;/span&gt;(&lt;span class=&#34;fu&#34;&gt;aes&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;yintercept =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;20&lt;/span&gt;), &lt;span class=&#34;at&#34;&gt;color =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;orange&amp;quot;&lt;/span&gt;,  &lt;span class=&#34;at&#34;&gt;linetype =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;dashed&amp;quot;&lt;/span&gt;) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb8-13&#34;&gt;&lt;a href=&#34;#cb8-13&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;geom_hline&lt;/span&gt;(&lt;span class=&#34;fu&#34;&gt;aes&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;yintercept =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;8&lt;/span&gt;), &lt;span class=&#34;at&#34;&gt;color =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;orange&amp;quot;&lt;/span&gt;,  &lt;span class=&#34;at&#34;&gt;linetype =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;dashed&amp;quot;&lt;/span&gt;) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb8-14&#34;&gt;&lt;a href=&#34;#cb8-14&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;annotate&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;quot;text&amp;quot;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb8-15&#34;&gt;&lt;a href=&#34;#cb8-15&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           &lt;span class=&#34;at&#34;&gt;x =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;c&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;quot;04:00&amp;quot;&lt;/span&gt;, &lt;span class=&#34;st&#34;&gt;&amp;quot;04:00&amp;quot;&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb8-16&#34;&gt;&lt;a href=&#34;#cb8-16&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           &lt;span class=&#34;at&#34;&gt;y =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;c&lt;/span&gt;(&lt;span class=&#34;dv&#34;&gt;7&lt;/span&gt;, &lt;span class=&#34;dv&#34;&gt;19&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb8-17&#34;&gt;&lt;a href=&#34;#cb8-17&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           &lt;span class=&#34;at&#34;&gt;label =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;c&lt;/span&gt;(&lt;span class=&#34;st&#34;&gt;&amp;quot;Velocidad Mínima Garantizada&amp;quot;&lt;/span&gt;, &lt;span class=&#34;st&#34;&gt;&amp;quot;Velocidad Ofrecida&amp;quot;&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb8-18&#34;&gt;&lt;a href=&#34;#cb8-18&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           &lt;span class=&#34;at&#34;&gt;family =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;quot;Cloud Calligraphy&amp;quot;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb8-19&#34;&gt;&lt;a href=&#34;#cb8-19&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;           &lt;span class=&#34;at&#34;&gt;size =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;5&lt;/span&gt;) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb8-20&#34;&gt;&lt;a href=&#34;#cb8-20&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;labs&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;title =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;DIAGRAMA DE CAJA DE VELOCIDADES DES DESCARGA OBSERVADAS&lt;/span&gt;&lt;span class=&#34;sc&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;POR HORA DEL DÍA&amp;#39;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb8-21&#34;&gt;&lt;a href=&#34;#cb8-21&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;at&#34;&gt;subtitle =&lt;/span&gt;&lt;span class=&#34;st&#34;&gt;&amp;#39;ISP: MOVISTAR 20 Mbps&amp;#39;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb8-22&#34;&gt;&lt;a href=&#34;#cb8-22&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;at&#34;&gt;x =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;Hora&amp;#39;&lt;/span&gt;,&lt;/span&gt;
&lt;span id=&#34;cb8-23&#34;&gt;&lt;a href=&#34;#cb8-23&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;       &lt;span class=&#34;at&#34;&gt;y =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;Velocidad (Mbps)&amp;#39;&lt;/span&gt;) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb8-24&#34;&gt;&lt;a href=&#34;#cb8-24&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;scale_y_continuous&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;breaks =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;seq&lt;/span&gt;(&lt;span class=&#34;dv&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;dv&#34;&gt;22&lt;/span&gt;, &lt;span class=&#34;at&#34;&gt;by =&lt;/span&gt; &lt;span class=&#34;dv&#34;&gt;2&lt;/span&gt;),&lt;/span&gt;
&lt;span id=&#34;cb8-25&#34;&gt;&lt;a href=&#34;#cb8-25&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;                     &lt;span class=&#34;at&#34;&gt;limits =&lt;/span&gt; &lt;span class=&#34;fu&#34;&gt;c&lt;/span&gt;(&lt;span class=&#34;dv&#34;&gt;0&lt;/span&gt;, &lt;span class=&#34;dv&#34;&gt;22&lt;/span&gt;)) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb8-26&#34;&gt;&lt;a href=&#34;#cb8-26&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;fu&#34;&gt;coord_cartesian&lt;/span&gt;(&lt;span class=&#34;at&#34;&gt;clip =&lt;/span&gt; &lt;span class=&#34;st&#34;&gt;&amp;#39;off&amp;#39;&lt;/span&gt;) &lt;span class=&#34;sc&#34;&gt;+&lt;/span&gt;&lt;/span&gt;
&lt;span id=&#34;cb8-27&#34;&gt;&lt;a href=&#34;#cb8-27&#34; aria-hidden=&#34;true&#34; tabindex=&#34;-1&#34;&gt;&lt;/a&gt;  &lt;span class=&#34;cn&#34;&gt;NULL&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&#34;figure&#34; style=&#34;text-align: center&#34;&gt;&lt;span style=&#34;display:block;&#34; id=&#34;fig:boxes&#34;&gt;&lt;/span&gt;
&lt;img src=&#34;https://andresrcs.rbind.io/post/2020-01-20-internet-speed-test.es_files/figure-html/boxes-1.png&#34; alt=&#34;Diagrama de Caja de Velocidades de Descarga Observadas por Hora del Día&#34; width=&#34;768&#34; /&gt;
&lt;p class=&#34;caption&#34;&gt;
Figure 4: Diagrama de Caja de Velocidades de Descarga Observadas por Hora del Día
&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Una vez que tiene datos, las posibilidades de gráficos solo están limitadas por su imaginación, por lo que me detendré aquí, espero que haya disfrutado leyendo este artículo y ahora esté motivado para comenzar a monitorear su propia velocidad de Internet. ¡Que se divierta!, ¡lo veo pronto!.&lt;/p&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Acerca de</title>
      <link>https://andresrcs.rbind.io/es/about/</link>
      <pubDate>Sat, 18 Jan 2020 00:00:00 +0000</pubDate>
      
      <guid>https://andresrcs.rbind.io/es/about/</guid>
      <description>&lt;figure class=&#34;figure&#34;&gt;
    &lt;a href=&#34;https://andresrcs.rbind.io/images/andres_about.jpg&#34; class=&#34;d-block&#34; data-toggle=&#34;lightbox&#34; data-gallery=&#34;post-gallery&#34;&gt;
        &lt;img src=&#34;https://andresrcs.rbind.io/images/andres_about.jpg&#34; width=&#34;275&#34; height=&#34;400&#34;class=&#34;figure-img img-fluid&#34;
        /&gt; 
    &lt;/a&gt;&lt;figcaption class=&#34;figure-caption text-center&#34;&gt;
            Andrés Castro Socolich
        &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Hola! mi nombre es Andrés, soy de Arequipa-Perú, soy un Ingeniero Industrial con una especialización
en Ciencia de Datos y mi herramienta favorita es R, principalemnte por su comunidad amigable y
solidaria, así que he creado este blog para compartir mis proyectos personales de ciencia datos con la comunidad.&lt;/p&gt;
&lt;p&gt;Las publicaciones aquí tendrán una amplia variedad de temas, pero todas estarán basadas en datos, así que espero que disfruten leyendo mis publicaciones y las encuentren útiles.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>