<?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>Nos pasa algo lo mismo &#187; Programación</title>
	<atom:link href="http://www.tatai.es/category/programacion/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.tatai.es</link>
	<description>...está claro...</description>
	<lastBuildDate>Thu, 09 Jun 2011 18:12:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Quomai</title>
		<link>http://www.tatai.es/2011/02/17/quomai/</link>
		<comments>http://www.tatai.es/2011/02/17/quomai/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 19:21:28 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Mundo web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[Tecnología]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=917</guid>
		<description><![CDATA[Con este nombre, es como hemos bautizado a este nuevo proyecto y aventura en el que nos hemos metido. Quomai. Queremos que suene mucho y fuerte entre todos vosotros y estamos trabajando muy duro para que en breve veáis la idea en funcionamiento. Y así para empezar&#8230; os gusta el nombre? Y el logo? Stay tuned! Estos [...]]]></description>
			<content:encoded><![CDATA[<p>Con este nombre, es como hemos bautizado a este nuevo proyecto y aventura en el que nos hemos metido. <a href="http://www.quomai.com">Quomai</a>.</p>
<p><a href="http://www.tatai.es/wp-content/uploads/2011/02/Quomai.inline.plain_.light_.300.png"><img class="aligncenter size-full wp-image-921" title="Quomai" src="http://www.tatai.es/wp-content/uploads/2011/02/Quomai.inline.plain_.light_.300.png" alt="Logo de Quomai" width="300" height="68" /></a></p>
<p>Queremos que suene mucho y fuerte entre todos vosotros y estamos trabajando muy duro para que en breve veáis la idea en funcionamiento.</p>
<p>Y así para empezar&#8230; os gusta el nombre? Y el logo?</p>
<p><strong>Stay tuned!</strong></p>
<p>Estos son algunos de los sitios donde daremos guerra:</p>
<ul>
<li><a href="http://quomai.com">Quomai</a></li>
<li><a href="http://twitter.com/quomai">Twitter</a></li>
<li><a href="http://facebook.com/quomai">Facebook</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2011/02/17/quomai/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>El patito de goma como método de debug</title>
		<link>http://www.tatai.es/2010/11/22/el-patito-de-goma-como-metodo-de-debug/</link>
		<comments>http://www.tatai.es/2010/11/22/el-patito-de-goma-como-metodo-de-debug/#comments</comments>
		<pubDate>Mon, 22 Nov 2010 14:33:01 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[trucos]]></category>
		<category><![CDATA[patito goma]]></category>
		<category><![CDATA[truco]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=872</guid>
		<description><![CDATA[Uno de los métodos más baratos y conocido para hacer debugging &#8220;en parejas&#8221; es el método denominado &#8220;el patito de goma&#8221;. Creo que esta es la primera vez que se habla sobre él. Es realmente sencillo y he tenido he podido comprobar (conmigo y con otros) como la eficacia de este método es elevadísima. Hay [...]]]></description>
			<content:encoded><![CDATA[<p>Uno de los métodos más baratos y conocido para hacer debugging &#8220;en parejas&#8221; es el método denominado &#8220;el patito de goma&#8221;. Creo que <a href="http://lists.ethernal.org/oldarchives/cantlug-0211/msg00174.html">esta es la primera vez que se habla sobre él</a>.</p>
<p>Es realmente sencillo y he tenido he podido comprobar (conmigo y con otros) como la eficacia de este método es elevadísima. Hay que seguir unos sencillos pasos:</p>
<ol>
<li>Conseguir un patito de goma, preferiblemente variedad baño</li>
<li>Colocar el patito cerca nuestra, en el escritorio por ejemplo e informarle que vais a ver un poco de código, a ver si está de acuerdo.</li>
<li>Explicar al pato qué es lo que se supone que hace el código y tras esto, entrar en detalle explicándolo línea a línea.</li>
<li>En algún momento le dirás al patito lo que se supone que es lo siguiente a hacer y te darás cuenta que eso no es lo que realmente está haciendo tu código. El pato se mantendrá sentado serenamente, contento de saber que te ha ayudado en tu tarea.</li>
</ol>
<p>Existen variantes al patito de goma, como otro tipo de peluches y objetos, pero su efectividad no está tan demostrada como con el patito de goma.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2010/11/22/el-patito-de-goma-como-metodo-de-debug/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Problemas con mocks en PHPUnit</title>
		<link>http://www.tatai.es/2010/11/22/problemas-con-mocks-en-phpunit/</link>
		<comments>http://www.tatai.es/2010/11/22/problemas-con-mocks-en-phpunit/#comments</comments>
		<pubDate>Mon, 22 Nov 2010 11:03:52 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[error]]></category>
		<category><![CDATA[mocks]]></category>
		<category><![CDATA[phpunit]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=870</guid>
		<description><![CDATA[A petición de Mariotux, va este post sobre uno de los problemas que me he encontrado cuando he tenido que usar mocks en PHPUnit. Es uno de los errores ya reportados y se da al intentar comprobar llamadas a un método con distintos parámetros. Supongamos que tenemos una clase como esta que queremos mockear: class [...]]]></description>
			<content:encoded><![CDATA[<p>A petición de <a href="http://www.pensandoenred.com">Mariotux</a>, va este post sobre uno de los problemas que me he encontrado cuando he tenido que usar <a href="https://github.com/sebastianbergmann/phpunit-mock-objects">mocks</a> en <a href="https://github.com/sebastianbergmann/phpunit">PHPUnit</a>. Es uno de los errores <a href="https://github.com/sebastianbergmann/phpunit-mock-objects/issues#issue/11">ya reportados</a> y se da al intentar comprobar llamadas a un método con distintos parámetros.</p>
<p>Supongamos que tenemos una clase como esta que queremos mockear:</p>
<pre><code>class MyClass {
  public function check($param) {
    // Código
  }
}</code></pre>
<p>En el caso concreto de querer comprobar si se realizan, por ejemplo, dos llamadas a esta función pasando $param = &#8216;one&#8217; y una llamada con $param = &#8216;two&#8217;, es cuando nos encontremos el problema. Por ejemplo:</p>
<pre><code>$mock = $this-&gt;getMock('MyClass');
$first = 'one';
$mock-&gt;expect($this-&gt;exactly(2))-&gt;method('check')-&gt;with($first);
$second = 'two';
$mock-&gt;expect($this-&gt;once())-&gt;method('check')-&gt;with($second);</code></pre>
<p>Aunque la clase que programemos realice correctamente las llamadas, PHPUnit nos indicará que se esperaban 2 llamadas a check, pero se han realizado 3 y, por lo tanto, no pasará el test.</p>
<p>Esta misma semana comentaba con <a href="http://www.twitter.com/carlosble">Carlos Ble</a> y hay posibles soluciones, como es generar una clase intermedia que separe ambas llamadas, siempre teniendo en cuenta que podamos hacer ese código y quizás no sea tan sencillo con código legado o con mucho acoplamiento.</p>
<p>A ver si en los próximos releases de phpunit-mock-objects se soluciona este problema.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2010/11/22/problemas-con-mocks-en-phpunit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Configurar el fichero hosts de Android Emulator</title>
		<link>http://www.tatai.es/2010/11/17/configurar-el-fichero-hosts-de-android-emulator/</link>
		<comments>http://www.tatai.es/2010/11/17/configurar-el-fichero-hosts-de-android-emulator/#comments</comments>
		<pubDate>Wed, 17 Nov 2010 15:53:59 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[trucos]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[hosts]]></category>
		<category><![CDATA[truco]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=864</guid>
		<description><![CDATA[Es posible que te encuentres en la situación (doy un par de ejemplos más abajo) en los que necesites que tu Android Emulator haga caso a tu /etc/hosts en vez de al DNS. Para este caso, lo que tienes que hacer es seguir estos dos sencillos pasos: Crear un fichero hosts en tu ordenador (o [...]]]></description>
			<content:encoded><![CDATA[<p>Es posible que te encuentres en la situación (doy un par de ejemplos más abajo) en los que necesites que tu Android Emulator haga caso a tu /etc/hosts en vez de al DNS. Para este caso, lo que tienes que hacer es seguir estos dos sencillos pasos:</p>
<ol>
<li>Crear un fichero hosts en tu ordenador (o usar el que ya tienes en /etc/hosts)</li>
<li>Remontar el emulador y copiar el fichero anterior</li>
</ol>
<p>La necesidad de remontar viene porque si no, el dispositivo está como sólo lectura y por lo tanto es imposible escribir nada en él.</p>
<p>Supongamos que tenemos partimos de nuestro /etc/hosts, iríamos al directorio donde tenemos las tools del SDK y teclearíamos:</p>
<pre><code>adb remount
adb push /etc/hosts /system/etc/</code></pre>
<p>También es posible coger el fichero hosts que tiene el emulador (por ejemplo, copiandolo a nuestro directorio /tmp):</p>
<pre><code>adb push /system/etc/hosts /tmp</code></pre>
<p>¿Y en qué casos nos puede hacer falta? Bueno, yo en concreto lo he necesitado cuando estaba desarrollando una aplicación que se alimentaba de un webservice. Realizaba el desarrollo del webservice en paralelo y por lo tanto no estaba (todavía) en la máquina de producción. De esta forma, gracias al fichero hosts obligaba al emulador a buscar en mi entorno de desarrollo en vez de ir al de producción, haciendo que la aplicación tuviese un comportamiento transparente, en código, sobre dónde atacar.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2010/11/17/configurar-el-fichero-hosts-de-android-emulator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Return no numérico en funciones bash</title>
		<link>http://www.tatai.es/2010/11/11/return-no-numerico-en-funciones-bash/</link>
		<comments>http://www.tatai.es/2010/11/11/return-no-numerico-en-funciones-bash/#comments</comments>
		<pubDate>Thu, 11 Nov 2010 10:39:55 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[trucos]]></category>
		<category><![CDATA[bash]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=860</guid>
		<description><![CDATA[Por defecto en bash sólo se pueden retornar enteros. ¿Qué hay que hacer entonces para que retorne un valor no entero? El truco está en hacer un echo del valor y asegurarnos en la llamada de la función que se asigna a una variable. Es decir, nuestra función sería: function retorna_texto { echo -n "este es [...]]]></description>
			<content:encoded><![CDATA[<p>Por defecto en bash sólo se pueden retornar enteros. ¿Qué hay que hacer entonces para que retorne un valor no entero?</p>
<p>El truco está en hacer un echo del valor y asegurarnos en la llamada de la función que se asigna a una variable. Es decir, nuestra función sería:</p>
<pre><code>function retorna_texto {
    echo -n "este es el valor a retornar"
}</code></pre>
<p>Y la llamada:</p>
<pre><code>VALOR=$( retorna_texto )</code></pre>
<p>Ahora en ${VALOR} tendremos el texto tal y como queríamos</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2010/11/11/return-no-numerico-en-funciones-bash/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bash completion for symfony (autocomplete)</title>
		<link>http://www.tatai.es/2010/02/26/bash-completion-for-symfony/</link>
		<comments>http://www.tatai.es/2010/02/26/bash-completion-for-symfony/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 20:53:14 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mundo web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[autocomplete]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[github]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=712</guid>
		<description><![CDATA[I have just pushed into GitHub a bash autocomplete script for symfony. This script allows to autocomplete your first level option when calling to symfony script. It is easy to install (just copy one and call it manually if you do not have access rights). All steps and working issues are in the wiki. It [...]]]></description>
			<content:encoded><![CDATA[<p>I have just pushed into <a href="http://github.com/biko2/symfony_complete">GitHub</a> a bash autocomplete script for symfony.</p>
<p>This script allows to autocomplete your first level option when calling to symfony script. It is easy to install (just copy one and call it manually if you do not have access rights). All steps and working issues are in the <a href="http://wiki.github.com/biko2/symfony_complete/">wiki</a>. It also accepts custom actions.</p>
<p>This is a working example once script is corretly installed and invoked:</p>
<p>Assuming symfony is in current folder and [tab] y tab key press action, this is an example of how symfony_complete works:</p>
<pre><code>$ ./symfony con[tab]figure:[tab][tab]
author    database
$ ./symfony doctrine:a[tab]uthor</code></pre>
<p>We are pleased to know what you think and any issue you have. You can find us on GitHub.</p>
<p>Related links:</p>
<ul>
<li><a href="http://wiki.github.com/biko2/symfony_complete/">symfony_complete  GitHub repository</a></li>
<li><a href="http://www.github.com/biko2">Biko2 GitHub repository</a></li>
<li>My <a href="http://www.github.com/tatai">personal</a> and <a href="http://www.github.com/frannaranjo">biko2 related</a> profile on GitHub</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2010/02/26/bash-completion-for-symfony/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>XHP: una extensión para escribir PHP de forma distinta</title>
		<link>http://www.tatai.es/2010/02/11/xhp-una-extension-para-escribir-php-de-forma-distinta/</link>
		<comments>http://www.tatai.es/2010/02/11/xhp-una-extension-para-escribir-php-de-forma-distinta/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 18:49:29 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Mundo web]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[xhp]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=687</guid>
		<description><![CDATA[Una de las noticias de esta semana en el mundo PHP es sin duda toda la información acerca de HipHop for PHP por parte del equipo de desarrollo de Facebook. Una de las extensiones que ha salido a la luz por parte del equipo de front-end es la que han llamado XHP y, como ellos [...]]]></description>
			<content:encoded><![CDATA[<p>Una de las noticias de esta semana en el mundo PHP es sin duda toda la información acerca de HipHop for PHP por parte del equipo de desarrollo de <a href="http://www.facebook.com">Facebook</a>. Una de las extensiones que ha salido a la luz por parte del equipo de front-end es la que han llamado XHP y, como ellos mismos rezan, &#8220;<a href="http://www.facebook.com/notes/facebook-engineering/xhp-a-new-way-to-write-php/294003943919">a new way to write PHP</a>&#8221; (una nueva forma de escribir PHP).</p>
<p>La explicación de cómo funciona es muy sencilla. Intentan evitar que al desarrollar la parte de frontal, cuando nos &#8220;pegamos&#8221; con el XHTML, tengamos que unir código XHTML y PHP. En el ejemplo que muestran se ve más claramente.</p>
<p>De un código como:</p>
<pre><code>&lt;?php
if ($_POST['name']) {
?&gt;
    &lt;span&gt;Hello, &lt;?=$_POST['name']?&gt;.&lt;/span&gt;
&lt;?php
} else {
?&gt;
    &lt;form method="post"&gt;
    What is your name?&lt;br&gt;
    &lt;input type="text" name="name"&gt;
    &lt;input type="submit"&gt;
    &lt;/form&gt;
&lt;?php
}</code></pre>
<p>Nos da como opción generar este otro:</p>
<pre><code>&lt;?php
// note: includes omitted
if ($_POST['name']) {
  echo &lt;span&gt;Hello, {$_POST['name']}&lt;/span&gt;;
} else {
  echo
    &lt;form method="post"&gt;
      What is your name?&lt;br /&gt;
      &lt;input type="text" name="name" /&gt;
      &lt;input type="submit" /&gt;
    &lt;/form&gt;;
}</code></pre>
<p>No voy a negar que, de primeras, XHP parece más sencillo de seguir y de generar. Eliminar los tags de apertura y cierra de PHP aligera el código en gran medida. Además, eliminamos problemas con el XSS así como detectar problemas por malformación de XHTML en tiempo de parsing.</p>
<p>A mi personalmente me sigue gustando bastante más usar un motor de plantillas. Un motor real como <a href="http://www.phpxtemplate.org">XTemplates</a> (sí, he dicho XTemplates, no smarty o similares). Separar el código PHP del HTML me parece bastante importante y necesito verlo con más claridad.</p>
<p>No obstante, hay que seguir el tema de cerca. Si es algo que la gente de Facebook ha visto que es necesario ya que aumenta el rendimiento, es evidente que en este tipo de entornos será uno de los puntos de referencia. Sin embargo, XHP como técnica para el resto de las webs donde no se reciban tantas peticiones como Facebook (si no recuerdo mal, sirven más doscientas mil millones de páginas al mes, sí, sí, 200.000.000.000), es posible que un objetivo que cumpla a primera vista es juntar el PHP con el HTML, algo que, repito, me parece bastante &#8220;sucio&#8221; si no hay una justificación clara. Pos supuesto, un motor de plantillas tiene sus desventajas, no vamos a negarlo <img src='http://www.tatai.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Lo dicho, XHP de momento me parece algo que puede provocar que el código sea más rápido pero a costa de hacerlo más guarro. Habrá que seguirle la pista para ver por dónde avanza, no lo descarto de primeras porque el objetivo de aumentar el rendimiento es muy importante, pero analizando el coste (ni monetario ni de recursos en este caso, jeje).</p>
<p>Enlaces:</p>
<ul>
<li><a href="http://www.facebook.com/notes/facebook-engineering/xhp-a-new-way-to-write-php/294003943919">Noticia original</a></li>
<li><a href="http://github.com/facebook/xhp">XHP on Github</a></li>
<li><a href="http://wiki.github.com/facebook/xhp/">XHP Wiki</a></li>
</ul>
<p>Update: Muy muy muy interesante <a href="http://toys.lerdorf.com/archives/54-A-quick-look-at-XHP.html">lo que comenta Rasmus en su web</a>. Importante verlo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2010/02/11/xhp-una-extension-para-escribir-php-de-forma-distinta/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Trabajando con eficiencia</title>
		<link>http://www.tatai.es/2009/10/21/trabajando-con-eficiencia/</link>
		<comments>http://www.tatai.es/2009/10/21/trabajando-con-eficiencia/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 20:41:32 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mundo web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[eficiencia]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[scp]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=502</guid>
		<description><![CDATA[Muchas veces considero que es una obsesión, pero de lo que estoy seguro es que muchas más veces gano tiempo pensando un poco y haciendo las cosas mejor y más rápidas. El caso que voy a presentar ahora es lo que yo considero &#8220;la forma más rápida de descargarnos un dump de una base de [...]]]></description>
			<content:encoded><![CDATA[<p>Muchas veces considero que es una obsesión, pero de lo que estoy seguro es que muchas más veces gano tiempo pensando un poco y haciendo las cosas mejor y más rápidas.</p>
<p>El caso que voy a presentar ahora es lo que yo considero <strong>&#8220;la forma más rápida de descargarnos un dump de una base de datos&#8221;</strong>. Añadamos como condición que tenemos que usar un protocolo cifrado, en este caso, <acronym title="Secure Socket Layer">SSL</acronym>. Para cualquier de los dos ejemplos que voy a presentar, contamos que tenemos autentificación en el servidor remoto (<a href="http://www.tatai.es/2009/10/20/usar-pares-de-claves-para-acceder-a-los-servidores-de-forma-sencilla-comoda-y-segura/">ahora que sabemos cómo hacerlo</a>).</p>
<p>Empecemos por el final. Cómo <strong>se nos ocurriría hacerlo directamente</strong>. Básicamente los pasos serían estos:</p>
<pre><code># Nos conectamos al servidor
ssh user@server.com
# Realizamos el dump de la base de datos
mysqldump -u mysqluser -p mysqldb &gt; dump.sql
# Comprimimos los datos para reducir el tamaño de los datos a trasferir
gzip dump.sql
# Volvemos a nuestro ordenador
exit
# Copiamos el fichero a nuestro ordenador
scp user@server.com:dump.sql.gz .</code></pre>
<p>He hecho una prueba con una base de datos pequeña. Si únicamente contabilizamos el tiempo en realizar cada uno de estos comandos y los sumamos (es decir, no tenemos en cuenta ni el ssh inicial ni los tiempos entre comandos, incluído si nos vamos a tomar un café mientras hace el volcado o lo comprime), salen los siguientes tiempos:</p>
<ul>
<li>mysqldump: 2.2 segundos</li>
<li>gzip: 0.5 segundos</li>
<li>scp: 12.2 segundos</li>
</ul>
<ul>
<li><strong>total método 1: 14.9 segundos</strong></li>
</ul>
<p>Veamos ahora otra forma. ¿Y cómo es? Pues bien sencilla&#8230; ¿y si te digo que <strong>puedes agrupar todos los comandos en únicamente uno</strong>?</p>
<p>¿Cómo? Pues aprovechando que se pueden ejecutar comandos de forma remota con el comando ssh y que lo que devuelva ese comando, se retorna mediante la consola estándar (stdin). Además, teniendo en cuenta que también podemos llamar a gzip en línea mediante una tubería (denominada en inglés <em>pipe</em>, representada por la barra vertical: |). Si unimos todo esto, nuestro comando queda (ejecutado directamente desde nuestra máquina):</p>
<pre><code>ssh user@server.com "mysqldump -u mysqluser -p mysqldb | gzip" &gt; dump.sql.gz</code></pre>
<p>Si medimos el tiempo que le cuesta a este comando obtenemos para el <strong>método 2: 12.0 segundos</strong></p>
<p>La diferencia puede parecer muy pequeña vista así, pero estamos hablando que es <strong>casi un 20% más rápido</strong>. Si este proceso (con el primer método) hubiese durado 4 horas (sí, os aseguro que se puede dar el caso), en algo más de 3 horas lo habríais terminado. Estos datos son muy variables, hay que tener en cuenta muchas cosas, pero que hagáis las pruebas que hagáis, en igualdad de condiciones, este nuevo método es mucho más rápido.</p>
<p>Y os aseguro que si hacéis la prueba con un proceso largo, en el que tendríais que esperar que terminase cada paso para iniciar el siguiente comando, ganaréis mucho tiempo sobre todo entre comando y comando.</p>
<p>La próxima vez que os toque algo como esto, usad este método y tomaros el café (o la comida) que os podréis tomar gracias a no tener que esperar, a mi salud.</p>
<p>Pensad un poco, esto es sólo un ejemplo, ¡hay muchas más opciones!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2009/10/21/trabajando-con-eficiencia/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cuenta atrás/Countdown para mootools</title>
		<link>http://www.tatai.es/2009/10/05/cuenta-atras-countdown-para-mootools/</link>
		<comments>http://www.tatai.es/2009/10/05/cuenta-atras-countdown-para-mootools/#comments</comments>
		<pubDate>Mon, 05 Oct 2009 20:56:39 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Mundo web]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[cuenta atrás]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=474</guid>
		<description><![CDATA[Es posible que en la pasada Navarparty 7 participases en el concurso Date El Bit y te encontraras con que este año la primera fase de las preguntas se realizaba pregunta por pregunta y había una cuenta atrás para cada una de ellas. Pues bien, para poder hacerla realicé una pequeña clase en javascript para [...]]]></description>
			<content:encoded><![CDATA[<p>Es posible que en la pasada <a href="http://www.navarparty.org">Navarparty 7</a> participases en el concurso Date El Bit y te encontraras con que este año la primera fase de las preguntas se realizaba pregunta por pregunta y había una cuenta atrás para cada una de ellas.</p>
<div id="attachment_475" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.tatai.es/wp-content/uploads/2009/10/Navarparty7.DateElBit.png"><img class="size-medium wp-image-475" title="Navarparty7.DateElBit" src="http://www.tatai.es/wp-content/uploads/2009/10/Navarparty7.DateElBit-300x237.png" alt="Pantalla de ejemplo de Date El Bit de la Navarparty 7" width="300" height="237" /></a><p class="wp-caption-text">Pantalla de ejemplo para Date El Bit de la Navarparty 7</p></div>
<p>Pues bien, para poder hacerla realicé una pequeña clase en javascript para <a href="http://www.mootools.net">Mootools</a> que me permitiera poder visualizar la cuenta atrás que se puede ver en la imagen. Como estuve buscando por internet y no encontré nada que me gustase, me lancé a hacerlo, no podían ser muchas líneas.</p>
<p>Y así ha sido. Con tan sólo 98 líneas (incluídos comentarios en inglés), tengo el gusto de presentar la clase Countdown.</p>
<p>Esta clase tiene como objetivo realizar la cuenta atrás visualmente actualizando un elemento DOM que se le indique.</p>
<p>El ejemplo de utilización más sencillo es este, que nos crea una cuenta atrás de 10 a 0 en pasos de hasta 100 milisegundos que actualiza en el elemento con id=&#8221;counter&#8221;:</p>
<pre><code>new Countdown($('counter')).start();</code></pre>
<p>Podemos completarlo un poco más con el siguiente ejemplo:</p>
<pre><code>new Countdown($('counter'), {
  'decimals' : '3', // para hacer que parezca un tiempo de la fórmula 1 :p
  'onComplete' : function() {alert('finalizado!');}, // muestra un alert cuando acaba la cuenta atrás
  'onStep' : function(target, show) {
    // Si el contador está por debajo de 5, poner en rojo, si no, en negro
    if(show &lt; 5) {
      target.setStyle('color', '#f00');
    }
    else {
      target.setStyle('color', '#000');
    }
  }
});</code></pre>
<ul class="botones">
<li class="descargar"><a href="/examples/js/Countdown.js">Descargar Countdown</a></li>
<li class="demo"><a href="/mis-desarrollos/countdown">Demo Countdown</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2009/10/05/cuenta-atras-countdown-para-mootools/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Una forma sencilla de hacer bien las cosas</title>
		<link>http://www.tatai.es/2009/10/02/una-forma-sencilla-de-hacer-bien-las-cosas/</link>
		<comments>http://www.tatai.es/2009/10/02/una-forma-sencilla-de-hacer-bien-las-cosas/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 21:21:09 +0000</pubDate>
		<dc:creator>tatai</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[rendimiento]]></category>

		<guid isPermaLink="false">http://www.tatai.es/?p=471</guid>
		<description><![CDATA[Para romper este &#8220;silencio&#8221; de casi un mes debido a la Navarparty y al trabajo, volvamos a la carga con un pequeño post. Quiero tratar el tema de &#8220;cómo hacer bien las cosas programando&#8221; con un sencillo ejemplo que pasó el otro día por mis manos. Y para ello contaremos con dos actores, un array [...]]]></description>
			<content:encoded><![CDATA[<p>Para romper este &#8220;silencio&#8221; de casi un mes debido a la Navarparty y al trabajo, volvamos a la carga con un pequeño post.</p>
<p>Quiero tratar el tema de &#8220;cómo hacer bien las cosas programando&#8221; con un sencillo ejemplo que pasó el otro día por mis manos. Y para ello contaremos con dos actores, un array y un if. Supongamos que tenemos los siguientes datos:</p>
<pre><code>$a = array
  array('from' =&gt; 0, 'to' =&gt; 100),
  array('from' =&gt; 101, 'to' =&gt; 250),
  array('from' =&gt; 250, 'to' =&gt; 1000),
  array('from' =&gt; 1001, 'to' =&gt; 2000)
);</code></pre>
<p>Nuestro sencillo código va a retornar el índice del array $a en el que se encuentra un número $b. Ahora bien, tenemos dos formas de hacerlo:</p>
<p>Opción a:</p>
<pre><code>function getRange($b) {
  foreach($a AS $index =&gt; $actual) {
    if($actual['from'] &lt;= $b &amp;&amp; $actual['to'] &gt;= $b) {
      return $index;
    }
  }
}</code></pre>
<p>Opción b:</p>
<pre><code>function getRange($b) {
  foreach($a AS $index =&gt; $actual) {
    if($actual['to'] &gt;= $b &amp;&amp; $actual['from'] &lt;= $b) {
      return $index;
    }
  }
}
</code></pre>
<p>El único cambio es el if que, como se puede ver, cambia el orden de las condiciones.</p>
<p>Entonces, hacemos la pregunta, ¿cuál de las dos opciones es más eficiente? Es posible que no lo veas claro, pero si lo miras un poco veras como <strong>en la mayoría de los casos es la opción b</strong>. Únicamente son igual de eficientes cuando $b se encuentra entre los valores de la primera posición.</p>
<p>¿Y por qué es más eficiente la opción b? La respuesta es porque dentro del if, al tener un Y lógico (los dos ampersands &amp;&amp;) <strong>si la primera condición es falsa, la otra condición ni siquiera se evalúa</strong>. Es decir, nos ahorramos que el microprocesador tenga que hacer esa comprobación lógica. Y este caso se da si pensamos que $b = 150. Para la opción a el if tiene que ejecutar ambas condiciones (0 &lt;= 150 &amp;&amp; 100 &gt;= 150) para descubrir que es false y pasar a la siguiente iteración, mientras que con la opción b bastaría con la primera comprobación (100 &gt;= 150) para saber que es false y pasar a la siguiente iteración.</p>
<p>Si se hace este if una única vez estamos hablando de una parte muy pequeña de un segundo, pero si esta tarea es muy repetitiva o el array tiene muchas posiciones, el efecto es claramente favorable e incluso se puede notar directamente.</p>
<p>Este sencillo ejemplo demuestra como <strong>pensar un poco las cosas y cambios muy pequeños en tu código pueden hacer que tengas un código mucho más optimizado y que te de mayor rendimiento</strong>.</p>
<p>Y por si quieres rizar el rizo, la opción a puede ser más eficiente que la b, pero sólo en el caso de que se recorra el array de forma descendente o este ordenado de forma inversa.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.tatai.es/2009/10/02/una-forma-sencilla-de-hacer-bien-las-cosas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

