blog.thermosilla.infohttp://blog.thermosilla.info/2015-11-11T23:39:00-03:00Speedtest2015-11-11T23:39:00-03:00Tomás Hermosillatag:blog.thermosilla.info,2015-11-11:speedtest.html<p>Desde septiembre comencé a medir la velocidad de conexion de mi enlace a internet y he publicado algunos resultados en twitter. Cada vez que publíco algo, me preguntan con qué mido o cual es la metodología que estoy ocupando.</p>
<p>Para no tener que estar repitiendo lo mismo cada vez, en este post voy a detallar el proceso que uso para obtener y procesar las mediciones.</p>
<h2>¿Cómo mido mi velocidad de descarga?</h2>
<p>Lo más importante es asegurarse que las condiciones de la conexión no cambien por "factores ambientales", por esto no es recomendable usar wifi para realizar las mediciones. Otro punto importante es medir la velocidad de descarga nacional, que es la que los ISP aseguran.</p>
<p>En mi caso, tengo un computador con linux conectado por cable a la red y que está encendido todo el dia. En este computador dejé programada una tarea, mediante un cron que corre cada media hora y descarga un archivo de 10MB</p>
<div class="highlight"><pre>*/30 * * * * wget -O /dev/null http://nacional.grupogtd.com/archivos/10MB.bin 2><span class="p">&</span><span class="m">1</span> <span class="p">|</span> grep <span class="s1">'\([0-9,]\+ [KM]B/s\)'</span> >> <span class="nb">test</span>-velocidad.txt
</pre></div>
<p>Este comando genera un archivo con el siguiente formato</p>
<div class="highlight"><pre>2015-12-17 05:00:04 (3,35 MB/s) - ‘/dev/null’ saved [10485760/10485760]
2015-12-17 05:30:04 (3,99 MB/s) - ‘/dev/null’ saved [10485760/10485760]
2015-12-17 06:00:07 (2,81 MB/s) - ‘/dev/null’ saved [10485760/10485760]
2015-12-17 06:30:05 (3,07 MB/s) - ‘/dev/null’ saved [10485760/10485760]
2015-12-17 07:00:03 (4,76 MB/s) - ‘/dev/null’ saved [10485760/10485760]
2015-12-17 07:30:04 (4,39 MB/s) - ‘/dev/null’ saved [10485760/10485760]
2015-12-17 08:00:10 (1,01 MB/s) - ‘/dev/null’ saved [10485760/10485760]
2015-12-17 08:30:04 (4,04 MB/s) - ‘/dev/null’ saved [10485760/10485760]
2015-12-17 09:00:11 (1,04 MB/s) - ‘/dev/null’ saved [10485760/10485760]
2015-12-17 09:30:04 (3,32 MB/s) - ‘/dev/null’ saved [10485760/10485760]
</pre></div>
<p>El formato de este archivo no es muy facil de procesar, por lo que lo transformo a CSV con este comando</p>
<div class="highlight"><pre>awk <span class="s1">'{gsub ("\\(","",$3); gsub(",",".",$3); gsub("\\)","",$4); print $1, $2 ",", $3 ",", $4}'</span> <span class="nb">test</span>-velocidad.txt > <span class="nb">test</span>-velocidad.csv
</pre></div>
<p>El archivo resultante queda así</p>
<div class="highlight"><pre>2015-12-17 05:00:04, 3.35, MB/s
2015-12-17 05:30:04, 3.99, MB/s
2015-12-17 06:00:07, 2.81, MB/s
2015-12-17 06:30:05, 3.07, MB/s
2015-12-17 07:00:03, 4.76, MB/s
2015-12-17 07:30:04, 4.39, MB/s
2015-12-17 08:00:10, 1.01, MB/s
2015-12-17 08:30:04, 4.04, MB/s
2015-12-17 09:00:11, 1.04, MB/s
2015-12-17 09:30:04, 3.32, MB/s
</pre></div>
<p>Este formato puede ser llevado fácilmente a excel o libreoffice para poder tabularlo o graficarlo. Para estos fines yo utilizo R, que es un lenguage de programación estadística que me permite obtener datos estadísticos básicos, generar gráficos y hacer modelos de predicción con los datos obtenidos.</p>
<h2>Conclusiones</h2>
<p>En este gráfico se puede ver como se ha comportado la velocidad de descarga durante el tiempo. Cada punto del gráfico representa una descarga del archivo.</p>
<p><img alt="Serie de Tiempo" src="images/time_series.png" /></p>
<p>Como se puede ver, mi velocidad de descarga en Septiembre era pésima, mejorando notoriamente en Octubre. Otra cosa que se puede visualizar es que a fines de noviembre, la velocidad de descarga nuevamente ha disminuido.</p>Git Branching2015-08-19T13:40:00-03:00Tomás Hermosillatag:blog.thermosilla.info,2015-08-19:git-branching.html<p>Una de las principales ventajas de GIT con respecto a otros controladores de versiones como SVN, es la preponderancia que da GIT a los procesos de branch y merge dentro de la herramienta.</p>
<p>Esta capacidad de GIT para crear ramas, permite elaborar nuevas formas de desarrollo, que antes no eran posibles,</p>
<p>Uno de los workflows más populares entre los desarrolladores es el <a href="http://martinfowler.com/bliki/FeatureBranch.html" target="_blank">Feature Branch</a>, consistente en desarrollar nueva funcionalidad dentro de su propia rama y una vez terminado el desarrollo, ejecutar un merge con la rama principal.</p>
<p><img alt="Feature Branch Workflow" src="images/feature_branch.svg" /></p>
<h2>Brancheo por ambiente</h2>
<p>En el caso de integración y deploy continuo, podemos utilizar esta capacidad, a fin de aprovechar al máximo las capacidades de GIT a la hora de deployar nuevas versiones de la aplicación a los distintos ambientes.</p>
<p>Para esto, se utiliza principalmente el modelo <a href="http://nvie.com/posts/a-successful-git-branching-model/" target="_blank">Gitflow</a>, el cual trabaja con ramas permanentes por ambiente, dejando para producción la rama <strong>master</strong>.</p>
<p><img alt="Gitflow Workflow" src="images/gitflow.svg" /></p>
<p>En este workflow, la corrección de errores se hace mediante feature branches, los que se añaden simultáneamente a las ramas master y de ambientes de desarrollo y staging (QA) y las nuevas funcionalidades, se desarrollan en una rama derivada de la rama de desarrollo.</p>
<p>Con este tipo de estructuras de repositorio, podemos generar trabajos de integración y deploy automáticos ante un nuevo commit en cada una de las ramas de ambientes.</p>Ansible2015-08-17T21:02:00-03:00Tomás Hermosillatag:blog.thermosilla.info,2015-08-17:ansible.html<p><a href="">Ansible</a> es una herramienta de configuration management, que es parte de lo que se denomina "Infraestructura como Código". Esta herramienta permite definir una plantilla de configuración deseada, o playbook, y aplicarla en todos los servidores que queramos.</p>
<p>La gracia principal que tienen los <em>Playbooks</em> de Ansible es que están escritos en YAML, es decir, un archivo de texto plano, que es muy fácil de versionar. Estos archivos se ven así:</p>
<div class="highlight"><pre><span class="p-Indicator">-</span> <span class="l-Scalar-Plain">hosts</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">all</span>
<span class="l-Scalar-Plain">remote_user</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">root</span>
<span class="l-Scalar-Plain">tasks</span><span class="p-Indicator">:</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">name</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">Instala dependencias</span>
<span class="l-Scalar-Plain">apt</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">name=python-pip state=present</span>
<span class="l-Scalar-Plain">apt</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">name=python-virtualenv state=present</span>
<span class="l-Scalar-Plain">apt</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">name=python-dev state=presenit</span>
<span class="l-Scalar-Plain">apt</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">name=postgresql state=present</span>
<span class="l-Scalar-Plain">apt</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">name=nginx state=present</span>
<span class="l-Scalar-Plain">apt</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">name=git state=present</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">name</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">Crea usuario de aplicación</span>
<span class="l-Scalar-Plain">user</span><span class="p-Indicator">:</span>
<span class="l-Scalar-Plain">name</span><span class="p-Indicator">:</span> <span class="s">"{{flask_user}}"</span>
<span class="l-Scalar-Plain">groups</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">users,www-data</span>
<span class="p-Indicator">-</span> <span class="l-Scalar-Plain">name</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">Crea virtualenv e instala paquetes</span>
<span class="l-Scalar-Plain">pip</span><span class="p-Indicator">:</span>
<span class="l-Scalar-Plain">virtualenv</span><span class="p-Indicator">:</span> <span class="l-Scalar-Plain">/home/{{flask_user}}/.virtualenvs/{{flask_app_name}}</span>
<span class="l-Scalar-Plain">requirements</span><span class="p-Indicator">:</span> <span class="s">"{{flask_requirement_file}}"</span>
</pre></div>
<p>La sintaxis de estos archivos es bastante simple de entender y seguir, por lo que se simplifica bastante su mantención y modificación futura.</p>
<p>Los módulos que trae por defecto Ansible, permiten provisionar ambientes en AWS, DigitalOcean, Docker o en cualquier servidor Debian o RHEL. Además, trae incorporadas utilidades como checkouts de código desde un repositorio Git, manejar servicios systemd, descarga de archivos, y un largo etc.</p>
<h2>Usos prácticos</h2>
<p>En estos momentos estoy utilizando esta herramienta para crear los ambientes de las aplicaciones que hago, desde el inicio. Cada nuevo paquete que instalo en mi ambiente de desarrollo y cada cambio en la configuración, lo agrego a un playbook de ansible y lo ejecuto con esta herramienta. </p>
<p>Esto permite que mis ambientes sean repetibles y me evito estar haciendo un manual de deploy.</p>
<p>Otro uso que hago de esta herramienta es el de hardening de servidores. Con el tiempo he ido mejorando algunas prácticas de securitización de ambientes, las que he vaciado a playbooks de ansible.</p>
<p>Lo que últimamente me ha llamado la atención es poder crear los servidores desde cero, dado un cambio de versión de sistema operativo o nuevos parches de seguridad que vayan apareciendo.</p>
<p>Esto último me permite revisar la compatibilidad de mis aplicaciones con los nuevos sistemas operativos y versiones de librerías que vayan apareciendo.</p>
<p>Finalmente, los experimentos que he estado haciendo se han basado en tratar de integrar ansible con herramientas como <a href="">Jenkins</a> o <a href="">Bamboo</a>, las que permiten generar releases de aplicaciones, con pruebas automáticas de código.</p>
<p>No me ha ido muy bien en esta parte, dado que estas herramientas están más orientadas a la integración continua, más que a la entrega de artefactos de código a ambientes productivos cambiantes (como es el caso de generación de ambientes dinámicos en la nube).</p>Introducción2015-03-01T23:00:00-03:00Tomás Hermosillatag:blog.thermosilla.info,2015-03-01:introduccion.html<p>Hace tiempo quería volver a escribir un blog, pero no me había dado el tiempo ni las ganas. Pero como ahora estoy estudiando más seriamente varias ideas y tecnologías nuevas (y no tan nuevas) que andan dando vueltas por ahí, es un buen momento para retomar la escritura.</p>
<p>Primero, estoy muy interesado en este mundillo de <a href="http://es.wikipedia.org/wiki/DevOps">DevOps</a> ya que me parece que todo el movimiento ágil se sentía un poco cojo sin atacar el problema del deployment de las aplicaciones y el manejo de la infraestructura.</p>
<p>Estoy experimentando con herramientas como <a href="">Ansible</a>, <a href="">SaltStack</a> y <a href="">Docker</a> y complementándolas con otras que ya usaba, como <a href="">git hooks</a> y <a href="">jenkins</a> principalmente. Por lo que aprovecharé de guardar aquí lo que vaya aprendiendo y creando.</p>