﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Pensamientos de otro más &#187; codigo</title>
	<atom:link href="http://www.superjueves.net/pensamientosdeotromas/tag/codigo/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.superjueves.net/pensamientosdeotromas</link>
	<description>Sitio sobre Agilidad, desarrollo de software, programación, etc</description>
	<lastBuildDate>Tue, 24 Jul 2018 19:15:07 +0000</lastBuildDate>
	<language>es-ES</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.8.41</generator>
	<item>
		<title>¿Escribes tu mejor código a la primera? No me lo creo!</title>
		<link>http://www.superjueves.net/pensamientosdeotromas/2011/09/05/%c2%bfescribes-tu-mejor-codigo-a-la-primera-no-me-lo-creo/</link>
		<comments>http://www.superjueves.net/pensamientosdeotromas/2011/09/05/%c2%bfescribes-tu-mejor-codigo-a-la-primera-no-me-lo-creo/#comments</comments>
		<pubDate>Mon, 05 Sep 2011 15:37:32 +0000</pubDate>
		<dc:creator><![CDATA[Alvaro García Loaisa]]></dc:creator>
				<category><![CDATA[Agilidad]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Productividad]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[arte]]></category>
		<category><![CDATA[ciencia]]></category>
		<category><![CDATA[codigo]]></category>
		<category><![CDATA[programación]]></category>
		<category><![CDATA[refactorización]]></category>

		<guid isPermaLink="false">http://www.superjueves.net/pensamientosdeotromas/?p=271</guid>
		<description><![CDATA[&#160; &#160; La mayoría de gente con la que he trabajado programando, cuando tenían que hacer alguna aplicación, una parte, API, clase o lo que fuera, lo escribían y ya está. Incluso yo hasta hace no mucho tiempo, escribía el código que mejor me salía a la primera y ahí lo dejaba, a veces orgulloso [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>&nbsp;</p>
<div style="text-align: center;"><img class="aligncenter size-full wp-image-273" title="UncleBob" src="http://www.superjueves.net/pensamientosdeotromas/wp-content/uploads/2011/09/UncleBob1.jpg" alt="" width="235" height="175" /></div>
<p>&nbsp;</p>
<div>La mayoría de gente con la que he trabajado programando, cuando tenían que hacer alguna aplicación, una parte, API, clase o lo que fuera, lo escribían y ya está. Incluso yo hasta hace no mucho tiempo, escribía el código que mejor me salía a la primera y ahí lo dejaba, a veces orgulloso de él y todo :S . Por suerte, después de unos años de experiencia he aprendido que esto no debe ser así.&nbsp;</p>
<p>No nos deberíamos limitar a  escribir un programa de principio a fin a la primera. Más importante aún, no deberíamos esperar ser capaces de escribir programas limpios y elegantes a la primera. Si algo he aprendido durante todo el periplo que ha supuesto mi carrera estudiantil y profesional, es que la programación es un arte más que una ciencia. Para escribir un código limpio, primero debemos escribir código sucio y luego limpiarlo.</p>
<p>Esto no debería ser una sorpresa para nadie. Escribir código limpio, es una cuestión de refinamientos sucesivos. Primero debemos escribir una primera versión, después revisarla, corregir lo que creamos conveniente, a continuación, volver a revisar y volver a refinar, y así sucesivas veces. Tener un ciclo de refactorizaciones sucesivas.</p>
<p>Un símil muy bueno se puede hacer con los polinomios de álgebra, donde los descomponemos en factores y los factorizamos paso a paso para hacerlos más simples y comprensibles sin modificar su resultado para llegar a una solución. Bien, pues con el código debemos hacer lo mismo, llegar a una solución lo más comprensible y simple para todo el mundo que vaya a meter mano a ese código.</p>
<p>La mayoría de los programadores jóvenes (con pocos años de experiencia en este tema) no están de acuerdo con esta técnica y no sigue este consejo muy bien. Ellos creen que el objetivo principal es conseguir que el programa funcione, dando igual como esté escrito por dentro. Terminando así con un código ilegible, código espagueti, o como le queráis llamar. Solo preocupa que funcione lo requerido y poder pasar así rápidamente a la siguiente tarea. Parafraseando a Uncle Bob “Los programadores más experimentados saben que esto es un suicidio profesional”.</p>
<p>El principal problema de que un programador se acostumbre a hacer refactorizaciones sucesivas de su código y cuidarlo con mucho más mimo, es que supone un esfuerzo y este esfuerzo no se ve plasmado en funcionalidades para el proyecto. A pesar de ello, si utilizamos esta forma de programar refactorizando, como técnica de desarrollo a lo largo del proyecto, conseguiremos que nuestro código sea de calidad y mucho más legible, ya no solo para nosotros, sino también para el resto de programadores del equipo. La experiencia dice (y no solo la mía) que este tiempo empleado en cada refinamiento sucesivo, será recuperado repercutiendo con creces en el avance del proyecto en el futuro.</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.superjueves.net/pensamientosdeotromas/2011/09/05/%c2%bfescribes-tu-mejor-codigo-a-la-primera-no-me-lo-creo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Automatiza todo lo que puedas con Expect</title>
		<link>http://www.superjueves.net/pensamientosdeotromas/2011/07/18/automatiza-todo-lo-que-puedas-con-expect/</link>
		<comments>http://www.superjueves.net/pensamientosdeotromas/2011/07/18/automatiza-todo-lo-que-puedas-con-expect/#comments</comments>
		<pubDate>Mon, 18 Jul 2011 19:34:38 +0000</pubDate>
		<dc:creator><![CDATA[Alvaro García Loaisa]]></dc:creator>
				<category><![CDATA[Productividad]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[autoexpect]]></category>
		<category><![CDATA[automatizar]]></category>
		<category><![CDATA[codigo]]></category>
		<category><![CDATA[expect]]></category>

		<guid isPermaLink="false">http://www.superjueves.net/pensamientosdeotromas/?p=167</guid>
		<description><![CDATA[Muchas veces nos toca hacer tareas repetitivas una y otra vez que nos quitan mucho tiempo. Normalmente no las damos la mayor importancia, ya que estamos acostumbrados a hacerlas y nos salen casi sin pensar. Desde un simple ssh o una copia de backup, hasta un despliegue de la aplicación a producción. Este tipo de [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter size-full wp-image-155" title="entrenamiento" src="http://www.superjueves.net/pensamientosdeotromas/wp-content/uploads/2011/07/automatiza.jpg" alt="" width="235" height="175" /></p>
<div>
<p>Muchas veces nos toca hacer tareas repetitivas una y otra vez que nos quitan mucho tiempo. Normalmente no las damos la mayor importancia, ya que estamos acostumbrados a hacerlas y nos salen casi sin pensar. Desde un simple ssh o una copia de backup, hasta un despliegue de la aplicación a producción.</p>
<p>Este tipo de tarea son subceptibles a fallos, ya que estamos tan habituados a ellas, que las hacemos sin pensar. ¿Cuántas veces has cometido fallos al hacerlas? ¿cuántas veces has puesto mal el nombre de la máquina a la que te vas a conectar, has metido mal la password, o incluso hasta te has cargado algo por un error tonto? Yo multitud de ellas.</p>
<p>Una de las mejores cosas que tiene la informática, es que podemos automatizar las tareas para ahorrarnos un tiempo valiosísimo y evitar esta serie de errores tontos, pero que pueden ser garrafales.</p>
<p>Hoy voy a intentan enseñaros una herramienta simple para automatizar estas tareas, llamada <a href="http://expect.sourceforge.net/">Expect</a>.</p>
<p>Me diréis, “¿por qué nos cuentas esto? create un programa en bash o en cualquier lenguaje y ala!” Pero hay muchas veces que tenemos que pegarnos contra una interfaz interactiva, a la cual tenemos que contestar y esperar a que nos conteste, por eso solemos hacer estas tareas a mano. Bien, pues con Expect podemos interactuar con la terminal de turno y de una manera realmente fácil <img src="http://www.superjueves.net/pensamientosdeotromas/wp-includes/images/smilies/icon_biggrin.gif" alt=":D" class="wp-smiley" /> </p>
<p>Expect es una herramienta basada en el lenguaje Tcl, utilizada para automatizar aplicaciones interactivas como ssh, telnet, scp, ftp, etc, y todo esto de una manera rápida y sencilla.</p>
<p>Bien, pues empecemos con un ejemplo de una simple conexión por ssh:
</p></div>
<p>&nbsp;</p>
<div class="codecolorer-container tcl vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br /></div></td><td><div class="tcl codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">#!/usr/bin/expect -f</span><br />
<span style="color: #808080; font-style: italic;">########################</span><br />
<br />
<span style="color: #808080; font-style: italic;"># Desactivamos el timeout</span><br />
<span style="color: #ff7700;font-weight:bold;">set</span> timeout -<span style="color: #ff4500;">1</span><br />
<br />
<span style="color: #808080; font-style: italic;">## Definimos variables de la conexion</span><br />
<span style="color: #ff7700;font-weight:bold;">set</span> server dns_o_IP<br />
<span style="color: #ff7700;font-weight:bold;">set</span> port <span style="color: #ff4500;">22</span> <span style="color: #808080; font-style: italic;"># Por defecto el 22</span><br />
<span style="color: #ff7700;font-weight:bold;">set</span> user usuario_para_la_conexion<br />
<span style="color: #ff7700;font-weight:bold;">set</span> pass password_del_usuario<br />
<br />
<span style="color: #808080; font-style: italic;">#####################################</span><br />
<span style="color: #808080; font-style: italic;">## Inicio Script</span><br />
<span style="color: #808080; font-style: italic;">#####################################</span><br />
<span style="color: #808080; font-style: italic;">## Sacamos un mensaje al usuario</span><br />
send_user <span style="color: #483d8b;">&quot;Conectando a $server<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><br />
<br />
<span style="color: #808080; font-style: italic;">## Lanzamos un proceso que podemos controlar</span><br />
spawn ssh <span style="color: #ff3333;">$user</span>@<span style="color: #ff3333;">$server</span> -p <span style="color: #ff3333;">$port</span><br />
<br />
<span style="color: #808080; font-style: italic;">## Una especie de switch-case para controlar</span><br />
<span style="color: #808080; font-style: italic;">## &nbsp; lo que devuelve el comando</span><br />
expect <span style="color: black;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; -re <span style="color: #483d8b;">&quot;.*Are.*.*yes.*no.*&quot;</span> <span style="color: black;">&#123;</span> <span style="color: #808080; font-style: italic;">## Lo esperado como expresion regular.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; send <span style="color: #483d8b;">&quot;yes<span style="color: #000099; font-weight: bold;">\r</span>&quot;</span> <span style="color: #808080; font-style: italic;">## Si se cumple lo anterior pasamos a la terminar “yes\r”</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; exp_continue <span style="color: #808080; font-style: italic;">## Continua con el siguiente resultado al comando expect</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: black;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">&quot;assword: &quot;</span> <span style="color: black;">&#123;</span> <span style="color: #808080; font-style: italic;">## Al ver que nos pide la password</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; send &nbsp;<span style="color: #483d8b;">&quot;$pass<span style="color: #000099; font-weight: bold;">\r</span>&quot;</span> <span style="color: #808080; font-style: italic;">## se la pasamos</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: black;">&#125;</span><br />
<span style="color: black;">&#125;</span><br />
send_user <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>Conectado a $server<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><br />
<br />
<span style="color: #808080; font-style: italic;">## Le decimos al script que pase el control al usuario</span><br />
<span style="color: #808080; font-style: italic;">## &nbsp; &nbsp;para que el continue utilizando la terminal</span><br />
interact</div></td></tr></tbody></table></div>
<p>&nbsp;</p>
<div>Bueno, como veis es bastante sencillito, no hace falta controlar mucho del lenguaje para manejar este tipo de scripts. Ahora simplemente modificando las variables tenéis un script que se conecta por ssh a la máquina que le digáis, de una manera muy rápida. Hasta podéis configurar el prompt sin necesidad de modificarlo en el .bashrc del servidor.<br />
Yo concretamente uso este tipo de script para conectarme a mis máquinas en el trabajo, y nunca me equivoco en la ip ni en el usuario ni en el password <img src="http://www.superjueves.net/pensamientosdeotromas/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> </div>
<p>&nbsp;</p>
<div> Ahora, podemos comprimir un directorio del que queramos hacer un backup (por ejemplo) una vez conectados a él con el script anterior y quitando el comando interact:
</div>
<p>&nbsp;</p>
<div class="codecolorer-container tcl vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br /></div></td><td><div class="tcl codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">#######################################</span><br />
<span style="color: #808080; font-style: italic;">## Creando tar</span><br />
<span style="color: #808080; font-style: italic;">######################################</span><br />
<span style="color: #808080; font-style: italic;">## Definimos variables</span><br />
<span style="color: #ff7700;font-weight:bold;">set</span> dirToBackup directorio_para_backup<br />
<span style="color: #ff7700;font-weight:bold;">set</span> tarFile /tmp/backup.tgz<br />
<span style="color: #ff7700;font-weight:bold;">set</span> tarCommand /bin/tar<br />
<br />
send_user <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>Creando tar de $server:$dirToBackup...<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><br />
<br />
<span style="color: #808080; font-style: italic;">## Lanzamos el comando</span><br />
send -- <span style="color: #483d8b;">&quot;$tarCommand zcvf $tarFile $dirToBackup<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><br />
expect <span style="color: black;">&#123;</span> &nbsp; <span style="color: #808080; font-style: italic;">## Este expect espera a que termine el comando y</span><br />
&nbsp; &nbsp; &nbsp; “<span style="color: #66cc66;">&gt;</span> “ <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span> <span style="color: #808080; font-style: italic;">## salgamos a la shell, vale para shells que terminan</span><br />
&nbsp; &nbsp; &nbsp; “<span style="color: #66cc66;">$</span> “ <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span> &nbsp; <span style="color: #808080; font-style: italic;">## por &gt; y $</span><br />
<span style="color: black;">&#125;</span><br />
send_user <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>Tar Generado.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><br />
<span style="color: #ff7700;font-weight:bold;">exit</span></div></td></tr></tbody></table></div>
<p>&nbsp;<br />
Y a continuación por ejemplo podemos copiarlo a local:<br />
&nbsp;</p>
<div class="codecolorer-container tcl vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br /></div></td><td><div class="tcl codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">########################################</span><br />
<span style="color: #808080; font-style: italic;">## Cerrando conexion con el servidor</span><br />
<span style="color: #808080; font-style: italic;">#######################################</span><br />
send -- <span style="color: #483d8b;">&quot;exit<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><br />
expect <span style="color: black;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">&quot;&gt; &quot;</span> <span style="color: black;">&#123;</span> <span style="color: black;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">&quot;$ &quot;</span> <span style="color: black;">&#123;</span> <span style="color: black;">&#125;</span><br />
<span style="color: black;">&#125;</span><br />
send_user <span style="color: #483d8b;">&quot;Salimos del servidor<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><br />
<br />
<span style="color: #808080; font-style: italic;">########################################</span><br />
<span style="color: #808080; font-style: italic;">## Copiamos backup a local</span><br />
<span style="color: #808080; font-style: italic;">########################################</span><br />
<span style="color: #ff7700;font-weight:bold;">set</span> scpCommand /usr/bin/scp<br />
<br />
send_user <span style="color: #483d8b;">&quot;Copiando tar...=&gt; $tarFile <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><br />
<br />
<span style="color: #808080; font-style: italic;">## Lanzamos el comando de copia remota scp</span><br />
spawn <span style="color: #ff3333;">$scpCommand</span> <span style="color: #ff3333;">$user</span>@<span style="color: #ff3333;">$server</span>:<span style="color: #ff3333;">$tarFile</span> .<br />
expect <span style="color: black;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; “<span style="color: #66cc66;">&gt;</span> ” <span style="color: black;">&#123;</span> <span style="color: black;">&#125;</span><br />
&nbsp; &nbsp; &nbsp; “<span style="color: #66cc66;">$</span> ” <span style="color: black;">&#123;</span> <span style="color: black;">&#125;</span><br />
<span style="color: black;">&#125;</span><br />
send_user “Fin.\n”<br />
<span style="color: #ff7700;font-weight:bold;">exit</span></div></td></tr></tbody></table></div>
<p>&nbsp;</p>
<div>
Para más ayuda, tenemos el comando <a href="http://expect.sourceforge.net/example/autoexpect.man.html">autoexpect</a>. Este comando graba todo lo que hagamos en una terminal y lo va guardando en un archivo en formato expect, y una vez hayamos terminado podemos ejecutarlo. Esto, repetirá fiel y exactamente los mismo pasos que habíamos hecho. Esto ya es el colmo! <img src="http://www.superjueves.net/pensamientosdeotromas/wp-includes/images/smilies/icon_biggrin.gif" alt=":D" class="wp-smiley" /> </p>
<p>Imaginaros que cantidad de cosas podemos automatizar de una forma sencillita y cuanto tiempo y errores podemos ahorrarnos. Ahora piensa que cosas repites una y otra vez de forma repetitiva todos los días y podrías automatizar&#8230;. y hazlo!! <img src="http://www.superjueves.net/pensamientosdeotromas/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /> </p>
</div>
<p>&nbsp;<br />
&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.superjueves.net/pensamientosdeotromas/2011/07/18/automatiza-todo-lo-que-puedas-con-expect/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
