<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>abel muiño</title>
    <link rel="alternate" type="text/html" href="http://blog.abelmuino.com/" />
    <link rel="self" type="application/atom+xml" href="http://blog.abelmuino.com/atom.xml" />
    <id>tag:blog.abelmuino.com,2009-08-21://1</id>
    <updated>2013-01-24T20:53:00Z</updated>
    <subtitle>... porque nunca hay suficientes blogs técnicos</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.3-es</generator>

<entry>
    <title>Rant of the day: El camino peor (o Notarios vs Anglosajones)</title>
    <link rel="alternate" type="text/html" href="http://blog.abelmuino.com/2013/01/rant-of-the-day-microsoft-y-los-notarios.html" />
    <id>tag:blog.abelmuino.com,2013://1.52</id>

    <published>2013-01-24T16:07:41Z</published>
    <updated>2013-01-24T20:53:00Z</updated>

    <summary>tl;dr Si quieres publicar aplicaciones de Windows Phone en su marketplace como empresa, asegúrate de tener todos los datos perfectamente. O llama a http://www.informa.es/ para que tu teléfono conste en su base de datos. El rant Hace algún tiempo que...</summary>
    <author>
        <name>Abel Muiño</name>
        <uri>http://blog.abelmuino.com</uri>
    </author>
    
        <category term="opinión" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="ley" label="ley" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="microsoft" label="microsoft" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="notarios" label="notarios" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rant" label="rant" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="symantec" label="symantec" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tramites" label="tramites" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="windowsphone" label="windows phone" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="es" xml:base="http://blog.abelmuino.com/">
        <![CDATA[<h2>tl;dr</h2>

<p>Si quieres publicar aplicaciones de Windows Phone en su marketplace como empresa, asegúrate de tener todos los datos perfectamente.</p>

<p>O llama a http://www.informa.es/ para que tu teléfono conste en su base de datos.</p>

<h2>El rant</h2>

<p>Hace algún tiempo que estoy intentando habilitar a <a href="http://1uptalent.com">1uptalent</a> para acceder al <em>Microsoft Windows Marketplace for Mobile</em>.</p>

<p>Después de haberlo hecho con Google Play y iTunes Store, pensaba que no podría ser complicado. En realidad, no lo es.</p>

<p>Te das de alta, teniendo cuidado de que el nombre del Publisher coincida con el nombre oficial de la empresa y teniendo a mano una factura de teléfono de los últimos 3 meses a nombre de la empresa (que se vea el nombre oficial). Te llaman para confirmar y ya...</p>

<p>Eso es el <strong>camino bueno</strong>.</p>

<p>El <strong>camino malo</strong> consiste en equivocarse en el nombre del Publisher (o acortarlo, como hice yo) y tener enviar un documento oficial para pedir que Symantec, en quien delega Microsoft, cambie el nombre de la empresa y vuelve a validar. Por ejemplo, las escrituras de la empresa.</p>

<p>El <strong>camino peor</strong> consiste en no tener número de teléfono a nombre de la empresa. La alternativa es firmar un documento ante notario y que el notario se niegue porque el formato del documento es anglosajón y (cito) </p>

<blockquote>
  <p>los anglosajones piensan que todo debe hacerse a su manera</p>
</blockquote>

<p><strong>WTF!!</strong> es un documento anglosajón para una empresa anglosajona ¿qué esperabas que pidiesen?</p>

<p>Y ojo, que lo único que tiene que hacer es firmar abajo (en el hueco) para confirmar que me ha visto a mi (y no a un malvado malechor que quiere colocar apps para Windows Phone a mi nombre para arruinar mi fama de maquero... <em>Microsoft</em>: ¿en qué pensabas cuando creaste este proceso paranoide?) firmar la parte de arriba. Ni siquiera me importa que sea legal en España o no.</p>

<p>Total, que me voy del notario cabreado con el mundo. Symantec y su formulario (no permiten cambiarlo) por un lado. Los Notarios y las leyes por el otro. Yo fastidiado sin poder hacer que ninguno cambie de idea.</p>

<p>Afortunamente, el <a href="http://go.symantec.com/microsoft-chat-support">soporte por chat</a> es muy útil. De lo mejor del proceso, sin duda.</p>

<p>Por lo que me contaron, buscan la información tu la empresa en la base de datos de Dun &amp; Bradstreet. Si tienen los datos allí, no necesitas más pruebas.</p>

<p>En España, Dun &amp; Bradstreet se llama <a href="http://www.informa.es/">informa</a> y son mucho menos estrictos que Symantec o los Notarios. Una llamada, un email... y un número de teléfono añadido a la base de datos.</p>

<p>Mañana vuelvo al chat de soporte a pedir que lo verifiquen. Espero que sea la última valla.</p>

<p><strong><em>/rant_mode: off</em></strong></p>
]]>
        

    </content>
</entry>

<entry>
    <title>¿Y si las metodologías ágiles no sirven para gestionar proyectos?</title>
    <link rel="alternate" type="text/html" href="http://blog.abelmuino.com/2011/08/y-si-las-metodologias-agiles-no-sirven-para-gestionar-proyectos.html" />
    <id>tag:blog.abelmuino.com,2011://1.51</id>

    <published>2011-08-10T14:05:32Z</published>
    <updated>2011-08-10T14:13:20Z</updated>

    <summary>A veces me vienen chispas de inspiración no meditadas. Igual que vienen, se van... pero esta la voy a escribir. De repente he pensado en Scrum, Kanban y sus hijos bastardos (o híbridos) y me ha dado la sensación de...</summary>
    <author>
        <name>Abel Muiño</name>
        <uri>http://blog.abelmuino.com</uri>
    </author>
    
        <category term="opinión" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="dudasexistenciales" label="dudas existenciales" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="lean" label="lean" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="metodologías" label="metodologías" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="scrum" label="scrum" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="es" xml:base="http://blog.abelmuino.com/">
        <![CDATA[<p>A veces me vienen chispas de inspiración no meditadas. Igual que vienen, se van... pero esta la voy a escribir.</p>

<p>De repente he pensado en Scrum, Kanban y sus hijos bastardos (o híbridos) y me ha dado la sensación de que no tienen nada que ver con la gestión de los proyectos (requisitos, plazos, entregas, niveles de calidad, predictibilidad...).</p>

<p>Las reglas, o al menos las reglas <strong>principales</strong> tratan sobre la gestión de las personas. Cómo dejarlas trabajar. Cómo hacerlas reflexionar...</p>

<p>Pero en cuanto a metodología de gestión de proyectos... bueno, no es muy diferente de "a salto de mata". Cada cual hace lo que puede y luego (con suerte) reflexiona sobre ello.</p>

<p>El resultado es conocido... cada cual dice hacer scrum (o lean, o lo que sea) a su manera. Pero... ¿cuál es la diferencia entre usar una metodología (cualquiera) "a mi manera" e improvisar?</p>]]>
        
    </content>
</entry>

<entry>
    <title>Jugando con RabbitMQ en Mac OSX</title>
    <link rel="alternate" type="text/html" href="http://blog.abelmuino.com/2011/06/jugando-con-rabbitmq-en-mac-osx.html" />
    <id>tag:blog.abelmuino.com,2011://1.50</id>

    <published>2011-06-28T20:46:44Z</published>
    <updated>2011-06-29T08:49:47Z</updated>

    <summary>NOTA: Actualizado para usar la nueva versión del API de AMQP (evitando usar la clase @MQ@). Gracias a @michaelklishin por el feedback Tengo el «capricho» de crear una estructura escalable para procesar tweets. Básicamente hay dos cajas: el cliente de...</summary>
    <author>
        <name>Abel Muiño</name>
        <uri>http://blog.abelmuino.com</uri>
    </author>
    
        <category term="trucos y pistas" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="amqp" label="amqp" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="bundler" label="bundler" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="colas" label="colas" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="desacoplamiento" label="desacoplamiento" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="publish" label="publish" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="pubsub" label="pubsub" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rabbitmq" label="rabbitmq" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ruby" label="ruby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="separación" label="separación" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="streaming" label="streaming" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="subscribe" label="subscribe" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="twitter" label="twitter" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="es" xml:base="http://blog.abelmuino.com/">
        <![CDATA[<blockquote><p><strong><span class="caps">NOTA</span>:</strong> Actualizado para usar la <a href="http://rdoc.info/github/ruby-amqp/amqp/master/file/docs/GettingStarted.textile">nueva versión</a> del <span class="caps">API </span>de <span class="caps">AMQP </span>(evitando usar la clase @MQ@). Gracias a <a href="http://twitter.com/michaelklishin">@michaelklishin</a> por el <a href="http://twitter.com/michaelklishin/status/85817801037713409">feedback</a></p></blockquote>


<p>Tengo el «capricho» de crear una estructura escalable para procesar tweets.</p>

<p>Básicamente hay dos cajas:</p>


<ul>
<li>el cliente de twitter: se conecta a la streaming <span class="caps">API </span>y su trabajo es leer tweets tan rápido como pueda.</li>
<li>el procesador de tweets: hace la lógica <em>pesada</em>, quizá ayudado por una base de datos.</li>
</ul>



<p>Para que el cliente de tweets pueda leer rápido, tengo que desacoplar los dos sistemas. Pero me gustaría que el procesador de tweets recibiese trabajo tan rápido como sea posible (en cuanto haya un tweet, nada de tareas periódicas). Vamos, lo que viene siendo un <a href="http://en.wikipedia.org/wiki/Publish/subscribe">pub/sub</a> de toda la vida.</p>

<p><center><img src="http://www.rabbitmq.com/img/rabbitmq_logo_strap.png" /></center></p>

<p>Y aquí es dónde <a href="http://www.rabbitmq.com/">RabbitMQ</a> (o, más concretamente, el protocolo <a href="http://www.amqp.org/confluence/display/AMQP/AMQP+Specification"><span class="caps">AMQP</span></a>) entra en juego, ya que es capaz de pasar los mensajes del publicador al consumidor al momento y el soporte para clientes Ruby es, según todas las referencias que he visto, <a href="http://www.dogstiltingtheirheads.com/content/franz-0">eggscelente</a>.</p>

<p>A mancharse las manos...</p>

<h2>El servidor</h2>

<p>Instalamos RabbitMQ usando <code>port</code></p>

<pre><code>sudo port install rabbitmq-server</code></pre>

<p>Dejamos que se cocine un rato y cuando nos devuelva el control:</p>

<pre><code>sudo rabbitmq-server

Activating RabbitMQ plugins ...
0 plugins activated:


+---+   +---+
|   |   |   |
|   |   |   |
|   |   |   |
|   +---+   +-------+
|                   |
| RabbitMQ  +---+   |
|           |   |   |
|   v2.5.1  +---+   |
|                   |
+-------------------+
AMQP 0-9-1 / 0-9 / 0-8
...
broker running</code></pre>

<p><strong>¡Sí! <a href="http://www.youtube.com/watch?v=J88-RdWnNT0&amp;feature=related">Great Success!!</a> :-)</strong></p>

<h2>El consumidor</h2>

<p>Vamos a dejarlo muy muy simple.</p>

<p>Creamos una gema:</p>

<pre><code>bundle gem countwer</code></pre>

<p>Añadimos la dependencia en <span class="caps">AMQP </span>a <code>countwer.gemspec</code> para poder comunicarnos con RabbitMQ</p>

<pre><code>s.add_runtime_dependency('amqp', &quot;&gt;= 0.7.1&quot;)</code></pre>

<p>Y creamos nuestro cliente en <code>lib/countwer.rb</code>. Dejémoslo simple...</p>

<pre><code>require &quot;countwer/version&quot;
require &quot;amqp&quot;

AMQP.start(:host =&gt; 'localhost') do |connection|
  AMQP::Channel.new(connection).queue('tweets').subscribe do |h,m|
    puts &quot;tweet: #{m}&quot;
  end
end</code></pre>

<p>El código está conectando con el servidor en <code>localhost</code> y nos suscribimos a la cola <code>tweets</code>. Cada vez que se envíe un mensaje a la cola se ejecutará el bloque e imprimiremos el mensaje.</p>

<p>Antes de seguir, no olvidar el <code>bundle install</code></p>

<h2>El productor</h2>

<p>El productor es nuestro lector de tweets. Es una gema creada con <code>bundle gem</code> que depende de <a href="https://github.com/voloko/twitter-stream">twitter-stream</a> para leer los tweets.</p>

<blockquote><p><strong>Ojo!:</strong> No me meto en los detalles de <em>twitter-stream</em>, pero el <a href="https://github.com/voloko/twitter-stream">ejemplo</a> es más que suficiente.</p></blockquote>

<p>La gema se prepara igual que el cliente, pero con este código:</p>

<pre><code>EventMachine::run {
  connection = AMQP.connect(:host =&gt; &quot;localhost&quot;)
  queue = AMQP::Channel.new(connection).queue(&quot;tweets&quot;)
  ...
  stream.each_item do |item|
    queue.publish(item)
  end
  ...
}</code></pre>

<p>El código es distinto porque <em>twitter-stream</em> ya se ejecuta dentro de <a href="http://rubyeventmachine.com/">EventMachine</a> (algo que <em>amqp</em> necesita), así que no hay que crear el bloque externo como en el cliente.</p>

<p>Sin embargo, el código hace casi lo mismo... conecta con el servidor local, obtiene la referencia a la cola <code>tweets</code> y publica en ella cada uno de los tweets que recibe.</p>

<p>Antes de seguir, no olvidar el <code>bundle install</code></p>

<h2>Probando, probando</h2>

<p>Tenemos el servidor ya levantado, levantamos un productor.</p>

<pre><code>bundle exec ruby lib/producer.rb</code></pre>

<p>De momento no hay nadie leyendo los mensajes. Puedes ver como se acumulan con:</p>

<pre><code>sudo rabbitmqctl list_queues
Listing queues ...
tweets	65
...done.</code></pre>

<p>Ahora lanzamos un cliente:</p>

<pre><code>bundle exec ruby lib/countwer.rb</code></pre>

<p>Y empezará a <em>escupir</em> los tweets en formato <a href="http://json.org/"><span class="caps">JSON</span></a></p>

<h2>Conclusión</h2>

<p>Me ha encantado. No sólo resuelve el problema si no que lo hace de forma muy sencilla (tanto en instalación como en <span class="caps">API</span>).</p>

<p><strong>Bola Extra:</strong> Para no perder el norte... el objetivo era separar el lector de tweets de su procesador porque este hacía lógica pesada y si estuviesen acoplados el ritmo de lectura bajaría.</p>

<p>Es decir... <strong>lo único que hemos conseguido es acumular tweets en la cola de RabbitMQ</strong> porque el consumidor es más lento que el productor.</p>

<p>¿O no?</p>

<p>¡Pues no! <em>(¡¡ta-chán!!)</em> Sin cambiar una línea de código podemos lanzar varios procesadores que recibirán los mensajes de la cola. La única pega es que parece que RabbitMQ reparte la carga mediante <a href="http://es.wikipedia.org/wiki/Planificaci%C3%B3n_Round-robin">round-robin</a> así que si el tiempo de procesado no es más o menos homogéneo, me temo que seguiremos teniendo problemas. </p>]]>
        
    </content>
</entry>

<entry>
    <title>Comentario sobre #AOS2011</title>
    <link rel="alternate" type="text/html" href="http://blog.abelmuino.com/2011/06/comentario-sobre-aos2011.html" />
    <id>tag:blog.abelmuino.com,2011://1.49</id>

    <published>2011-06-25T11:43:17Z</published>
    <updated>2011-06-25T11:50:25Z</updated>

    <summary>Esto no es un post. Es una copia de mi respuesta a la opinión de Jesús sobre el AOS2011 (muy valiosa, leedla) Mi comentario es tan largo, tan &quot;off-topic&quot; y tan personal que he decidido publicarlo aquí. Comparto en cierta...</summary>
    <author>
        <name>Abel Muiño</name>
        <uri>http://blog.abelmuino.com</uri>
    </author>
    
        <category term="opinión" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="2011" label="2011" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ambiente" label="ambiente" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="aos" label="AOS" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="aos2011" label="AOS2011" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="gente" label="gente" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="es" xml:base="http://blog.abelmuino.com/">
        <![CDATA[<p>Esto no es un post. Es una copia de mi respuesta a la <a href="http://blog.jjballano.com/2011/06/24/vision-del-aos2011-optimistas-%c2%bfabstenerse/#comment-217">opinión de Jesús sobre el <span class="caps">AOS2011</span></a> (muy valiosa, leedla) Mi comentario es tan largo, tan "off-topic" y tan personal que he decidido publicarlo aquí.</p>

<p><hr  /></p>

<p>Comparto en cierta medida la sensación de "podría haber sido mejor" (es curioso cómo con sólo cambiar las palabras la misma idea se vuelve positiva... nos viene bien la crítica, pero enfocada a hacer algo).</p>

<p>Por dos motivos:</p>

<p>En primer lugar, <b>mi percepción de "endogamia"</b>. Aunque cerca del 50% de la gente era nueva en un <span class="caps">AOS, </span>yo no supe mezclarme con ellos o ellos no supieron hacerse visibles y participativos (¿es posible que a la gente nueva le interese lo mismo que a los que hemos visto ya un par de <span class="caps">AOS</span>?). Los comentarios en las sesiones los hacíamos "los de siempre" y lo mismo pasó con las propuestas (como en todo, salvo honrosas excepciones). Es curioso cómo las personas de las comunidades locales sí se hicieron notar (Galicia, Canarias, CyL, Zona Norte...).</p>

<p><a href="http://www.flickr.com/photos/amuino/5850076175/" title="Apertura Agile Open Spain 2011 - 30 by a_muinho, on Flickr"><img src="http://farm6.static.flickr.com/5224/5850076175_744363097e_z.jpg" width="427" height="640" alt="Apertura Agile Open Spain 2011 - 30" /></a></p>

<p>En segundo, <b>el enfoque "infinito"</b> del evento. Mis dos charlas eran puramente técnicas y absolutamente no-ágiles (dudé mucho, pero bastante gente me animó) y sin embargo se hicieron un hueco.</p>

<p>Pero aun así, lo disfruté mucho. Quizá porque mis expectativas eran otras. Lo que me atrae de la comunidad ágil es la "densidad" de gente preocupada por su oficio comparado con otros entornos. Gente con ideas. Gente con propuestas. Es la gente con la que me gusta estar (incluso si sus ideas no son las mías) y si esa gente hiciese cualquier cosa no ágil para mi no habría diferencia.</p>

<p>Para rematar... Yo creo que el cambio se hace creando empresas (o departamentos) que "hagan las cosas bien". Y quizá, después, se consiga cambiar a las empresas que ya existen. Es más fácil hacer una casa nueva dónde se necesita que mover una que ya existe.</p>

<p>Vaya ladrillazo de comentario... </p>]]>
        
    </content>
</entry>

<entry>
    <title>¿Cómo uso twitter?</title>
    <link rel="alternate" type="text/html" href="http://blog.abelmuino.com/2011/04/como-uso-twitter.html" />
    <id>tag:blog.abelmuino.com,2011://1.48</id>

    <published>2011-04-19T09:25:18Z</published>
    <updated>2011-04-19T09:24:41Z</updated>

    <summary> Este fin de semana le comentaba a @jmbeas en un descanso de la #xgn mi forma de utilizar twitter. Al final le convencí para probarlo. Él lo comento en twitter y su comentario ha generado bastantes respuestas (interesantes todas...</summary>
    <author>
        <name>Abel Muiño</name>
        <uri>http://blog.abelmuino.com</uri>
    </author>
    
        <category term="opinión" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="consejos" label="consejos" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="personal" label="personal" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="socialmedia" label="social media" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="twitter" label="twitter" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="uso" label="uso" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="yo" label="yo" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="es" xml:base="http://blog.abelmuino.com/">
        <![CDATA[<p> Este fin de semana le comentaba a <a href="http://twitter.com/jmbeas">@jmbeas</a> en un descanso de la #xgn mi forma de utilizar twitter. Al final le convencí para probarlo. Él <a href="http://twitter.com/jmbeas/status/59904327422185472">lo comento en twitter</a> y su comentario ha generado bastantes respuestas (interesantes todas ellas).</p>

<p>Básicamente, mi forma de utilizar twitter es muy promiscua. Intento seguir a casi todo el mundo que conozco en persona. También a sus empresas. Y también a cualquiera que me siga y que parezca tener algo interesante que decir (esto lo decido en unos 2 segundos mirando los 5-10 últimos tweets que aparecen en su timeline).</p>

<p>La consecuencia es que leer todos los tweets de toda la gente que sigo sea imposible. </p>

<p>Así que me comporto como si estuviese en una gran fiesta:</p>


<ul>
<li>tengo a mis amigos, a los que siempre presto atención... así cómo a otros conocidos</li>
<li>me muevo por la fiesta y, si en algún momento escucho algo interesante, participo en la conversación</li>
<li>si alguien habla conmigo, le hago caso</li>
</ul>



<p>Lo que, traducido a cristiano significa:</p>


<ul>
<li>tengo una lista con la gente que está realmente próxima a mi o cuya opinión me interesa especialmente y otras listas segmentando temas</li>
<li>miro el timeline de forma ocasional y sin preocuparme de leerlo todo... muchas veces lo ojeo cuando viajo en metro, mientras espero en una cafetería, mientras pasan los tests de integración...</li>
<li>intento contestar todas las @menciones y los mensajes directos</li>
</ul>



<p>Para mi, seguir a un número inmanejable de personas tiene dos puntos positivos muy interesantes:</p>


<ul>
<li>amplia mi mente: es más que probable que acabe leyendo artículos enlazados por personas con un perfil muy distinto al mio... me obliga a salir de mi "zona de confort" en cuanto a la información que consumo</li>
<li>permite que un montón de gente me contacte de forma privada... cuando sigues y te siguen, los DMs se convierten en una herramienta poderosa</li>
</ul>



<p><a href="http://twitter.com/david_bonilla/status/59906840892411904">¿Devalúa mi marca personal?</a> Puede. No lo sé. No estoy construyendo una marca de forma activa. Posiblemente no haya demasiada diferencia entre mi yo online y mi yo offline... </p>

<p>¿Es mejor <a href="http://twitter.com/jjballano/status/60003770507075584">seguir a pocos, leer el timeline completo y enterarse de lo importante a través de los RTs</a> de otra gente? <br />
Es una opción, pero para mi gusto te pierdes la posibilidad de leer opiniones diversas. Sólo te llegan las noticias más mediáticas y la información que quieres oir (la del grupo selecto al que sigues)</p>

<p>¿Hay <a href="http://twitter.com/sharpbites/status/60020513522724864">riesgo de procrastinación</a>? Garantizo que sí, mucho :-).</p>

<p>¿No es más lógico <a href="http://twitter.com/sharpbites/status/60021047906410496">seguir a los habituales y meter al grueso en una lista</a>? Si no sigo a alguien no puede enviarme DMs, así que pierdo un canal de comunicación. Además, seguir a alguien es muy simple (un click) pero ponerlo en una lista es menos cómodo.</p>

<p>No es la única manera de usar twitter. Es la mia y estoy cómodo con ella. ¿Cómo lo usas tú?</p>]]>
        
    </content>
</entry>

<entry>
    <title>ActiveRecord, RSpec y mocks de relaciones</title>
    <link rel="alternate" type="text/html" href="http://blog.abelmuino.com/2011/03/activerecord-rspec-y-mocks-de-relaciones.html" />
    <id>tag:blog.abelmuino.com,2011://1.47</id>

    <published>2011-03-24T10:33:17Z</published>
    <updated>2011-03-24T10:35:07Z</updated>

    <summary><![CDATA[Esta es una de esas entradas para recordarme la solución a cosas que me han dado problemas. En este caso es relativo al comportamiento que tiene ActiveRecord al asignar valores a las relaciones. post = Post.new(:comments =&gt; [ Comment.new, Comment.new])...]]></summary>
    <author>
        <name>Abel Muiño</name>
        <uri>http://blog.abelmuino.com</uri>
    </author>
    
        <category term="trucos y pistas" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="activerecord" label="activerecord" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mock" label="mock" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rspec" label="rspec" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ruby" label="ruby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="stub" label="stub" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="test" label="test" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="es" xml:base="http://blog.abelmuino.com/">
        <![CDATA[<p>Esta es una de esas entradas para recordarme la solución a cosas que me han dado problemas.</p>

<p>En este caso es relativo al comportamiento que tiene ActiveRecord al asignar valores a las relaciones.</p>

<pre><code>post = Post.new(:comments =&gt; [ Comment.new, Comment.new])
post.count # =&gt; 0
post.size # =&gt; 2</code></pre>

<p>Parece razonable. Como todavía no se ha guardado el <code>post</code> ni sus <code>comments</code> el <code>count</code> devuelve cero (lo que devolvería la base de datos). Sin embargo @size@devuelve la longitud correcta del array.</p>

<p>Sin embargo, esto es muy molesto durante las pruebas, dónde intentamos evitar los accesos a la base de datos.</p>

<pre><code>let(:post) { mock_model(Post) }
before(:each) do
  post.comments = [mock_model(Comment), mock_model(Comment)]
end</code></pre>

<p>Si el código que probamos usa <code>size</code>, el test es el que queremos. Si usa <code>count</code>, entonces no. Y sería muy malo hacer que el test dependiese de la implementación elegida.</p>

<p>La <strong>solución</strong> (o una de ellas) es <em>mockear</em> la asociación para evitar la lógica de <code>active record</code>:</p>

<pre><code>let(:post) { mock_model(Post) }
before(:each) do
  post.stub(:comments).
       and_return [mock_model(Comment), mock_model(Comment)]
end</code></pre>

<p>Porque, sí... los arrays devuelven el mismo valor para <code>count</code> que para <code>size</code> (y, ya puestos, para <code>length</code>).</p>

<p>¿Qué te parece? ¿Hay una solución mejor?</p>]]>
        
    </content>
</entry>

<entry>
    <title>¿Pueden los negocios tradicionales competir online?</title>
    <link rel="alternate" type="text/html" href="http://blog.abelmuino.com/2011/02/pueden-los-negocios-tradicionales-competir-online.html" />
    <id>tag:blog.abelmuino.com,2011://1.46</id>

    <published>2011-02-28T08:32:38Z</published>
    <updated>2011-02-28T08:32:48Z</updated>

    <summary>Hace ya algunos meses que estoy ayudando a mi familia con su tienda. Como buen informático, hago de chico para todo... lo mismo instalo un wordpress que hago spam en twitter. Pero lo que me ha dado mucho qué pensar...</summary>
    <author>
        <name>Abel Muiño</name>
        <uri>http://blog.abelmuino.com</uri>
    </author>
    
        <category term="opinión" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="comercio" label="comercio" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ecommerce" label="ecommerce" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="física" label="física" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="online" label="online" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="pyme" label="pyme" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tienda" label="tienda" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="es" xml:base="http://blog.abelmuino.com/">
        <![CDATA[<p>Hace ya algunos meses que estoy ayudando a mi familia con <a href="http://lasbellotas.es">su tienda</a>. Como buen informático, hago de chico para todo... lo mismo instalo un wordpress que hago spam en twitter.</p>

<p><center><a href="http://www.flickr.com/photos/amuino/5326759852/" title="Las Bellotas by a_muinho, on Flickr"><img src="http://farm6.static.flickr.com/5168/5326759852_93dccd6abd.jpg" width="500" height="375" alt="Las Bellotas" /></a></center></p>

<p>Pero lo que me ha dado mucho qué pensar es... ¿Por qué soy yo el que gestiona los productos en <a href="http://www.mumumio.com/tienda/las-bellotas">la tienda online</a>? ¿Por qué no la gestionan los dueños de la tienda?</p>

<p>En realidad creo que tengo una respuesta. <strong>Las herramientas de e-commerce no están a la altura de los negocios tradicionales</strong>. Funcionan muy bien para <em>tiendas 2.0</em> dónde toda la gestión es digital e, incluso, es posible que no exista una tienda física. Pero para las tiendas que trabajan <em>cara al público</em>, internet les queda muy lejos.</p>

<p>Podemos decir que «hay que ponerse al día», «renovarse o morir» o muchas otras frases que no ayudan en nada a estos negocios. A esas tiendas tiendas en las que confías para tus compras del día a día. Lo que necesitan es un camino que les permita iniciar la transición a un modelo híbrido, vendiendo en la tienda física y añadiendo valor extra en su tienda online.</p>

<p>Entonces... ¿qué pasará con estas tiendas? ¿Están condenadas a desaparecer frente a <a href="http://conservaseleccion.com/">los nuevos comercios virtuales</a>? ¿Debemos renovar todos nuestro parque de pequeños comercios? ¿Deben los comercios invertir un dinero que no tienen en externalizar <small>a una empresa o a un pariente que sepa <em>de eso de interné</em></small> su presencia online? ¿Existe alguna solución especialmente diseñada para estos negocios?</p>

<p>Lamentablemente, ahora mismo sólo tengo preguntas. Si tenéis alguna respuesta... aquí tenéis los comentarios.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Fuentes de Vista en OSX</title>
    <link rel="alternate" type="text/html" href="http://blog.abelmuino.com/2011/02/fuentes-de-vista-en-osx.html" />
    <id>tag:blog.abelmuino.com,2011://1.45</id>

    <published>2011-02-23T15:33:41Z</published>
    <updated>2011-02-23T15:33:34Z</updated>

    <summary>La parte mala de estar en OSX viene cuando el resto del mundo decide compartir documentos contigo que usan fuentes «raras». A decir verdad, esto puede ocurrir siempre que alguien tenga (y use) una de esas fuentes raras en sus...</summary>
    <author>
        <name>Abel Muiño</name>
        <uri>http://blog.abelmuino.com</uri>
    </author>
    
        <category term="trucos y pistas" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="calibri" label="calibri" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="fonts" label="fonts" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="fuentes" label="fuentes" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="microsoft" label="microsoft" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="office" label="office" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="osx" label="osx" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="windows" label="windows" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="es" xml:base="http://blog.abelmuino.com/">
        <![CDATA[<p>La parte mala de estar en <span class="caps">OSX </span>viene cuando el resto del mundo decide compartir documentos contigo que usan fuentes «raras». A decir verdad, esto puede ocurrir siempre que alguien tenga (y use) una de esas <a href="http://www.dafont.com/quid-pro-quo.font">fuentes raras</a> en sus documentos.</p>

<p><center><img width="500" height="203" src="http://upload.wikimedia.org/wikipedia/commons/thumb/3/3b/Calibri_sample.svg/500px-Calibri_sample.svg.png" /></center> </p>

<p>La fuente «rara» en cuestión es Calibri... una de las fuentes de Windows Vista y Office 2007. Hasta dónde sé, <strong>Calibri es la nueva Arial</strong> y es la fuente por defecto. Así que si trabajáis con gente que use windows, lo más probable es que sus documentos estén escritos en Calibri (o cualquier otra de las fuentes nuevas).</p>

<p>Por suerte, estas fuentes se distribuyen en los productos de Microsoft para <span class="caps">OSX. </span><strong>Incluso</strong> (y esto es lo bueno) <strong>en los gratuitos</strong>.</p>

<p>Así que, lo fácil es descargarse el <a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyId=6B9238E1-CF69-48C4-BF2D-C4A8ACEEE520&amp;displaylang=en">Open <span class="caps">XML</span> Converter</a> (que, por otra parte sirve para convertir los docx en doc de toda la vida).</p>

<p>Al abrir el <span class="caps">DMG, </span>no es necesario instalar nada... simplemente usad el botón derecho y la opción <em>Mostrar contenido del paquete</em>.</p>

<p>En la carpeta <em>Contents/Packages</em> tenéis el instalador para las fuentes: <em>OpenXML_all_fonts.pkg</em>.</p>

<p>¡Doble click y ya! Las fuentes instaladas vivirán a partir de ahora en <code>/Library/Fonts/Microsoft</code></p>]]>
        
    </content>
</entry>

<entry>
    <title>La calidad está en el ojo del que mira</title>
    <link rel="alternate" type="text/html" href="http://blog.abelmuino.com/2011/02/la-calidad-esta-en-el-ojo-del-que-mira.html" />
    <id>tag:blog.abelmuino.com,2011://1.44</id>

    <published>2011-02-17T08:23:49Z</published>
    <updated>2011-02-17T08:25:45Z</updated>

    <summary>Muchas veces se usa la frase de la calidad no es negociable como argumento para hacer cualquier cosa que los técnicos queramos hacer. Mi duda siempre ha sido... «¿pero qué es la calidad?». Hay muchas definiciones. En su momento, la...</summary>
    <author>
        <name>Abel Muiño</name>
        <uri>http://blog.abelmuino.com</uri>
    </author>
    
        <category term="opinión" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="calidad" label="calidad" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="clientes" label="clientes" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="efecto" label="efecto" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ingenieríainformática" label="ingeniería informática" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mapa" label="mapa" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="proceso" label="proceso" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="técnicos" label="técnicos" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="valor" label="valor" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="es" xml:base="http://blog.abelmuino.com/">
        <![CDATA[<p>Muchas veces se usa la frase de <em>la calidad no es negociable</em> como argumento para hacer cualquier cosa que <em>los técnicos</em> queramos hacer.</p>

<p>Mi duda siempre ha sido... «¿pero qué es la calidad?». Hay muchas definiciones. En su momento, la famosa <span class="caps">ISO9000 </span>caracterizaba la calidad como poder repetir el mismo proceso para llegar al mismo producto dentro de una <em>holgura</em> determinada (más o menos...). Es decir, podías hacer un producto totalmente decepcionante usando las peores formas de trabajo pero tener un sello de calidad en él. Porque siempre lo haces igual de mal.</p>

<p><a href="http://www.flickr.com/photos/pierrelaphoto/2314190563/" title="quality control 2 by Pierre LaScott, on Flickr"><img src="http://farm4.static.flickr.com/3241/2314190563_ec8514205d.jpg" width="442" height="500" alt="quality control 2" /></a></p>

<p>En realidad, <strong>la calidad es subjetiva</strong>. El consumidor tiene una visión y la <span class="caps">ISO </span>tiene otra. Obviamente, el equipo de desarrollo tendrá la suya y el cliente que les encarga el trabajo otra más.</p>

<p>Me ha llamado la atención el último artículo de <a href="http://gojko.net/about/">Gojko Adzic</a> sobre <a href="http://gojko.net/2011/02/16/effect-mapping-a-game-changing-technique-for-agile-product-management/">Mapas de efectos</a>. Y no por la idea de los mapas (que es interesante) si no porque le dedica una sección al tema de la subjetividad en la calidad.</p>

<p>Es más, ataca esta subjetividad y sugiere que <strong>la calidad se defina explícitamente</strong> en función de quién es el beneficiario del valor que se está generando. De esta forma todos los implicados están alineados en sus objetivos. Además la definición no se realiza (sólo) a bajo nivel (esa definición podría ser el <a href="http://www.scrumalliance.org/articles/105-what-is-definition-of-done-dod">Definition of Done</a> de cada tarea) si no que intenta que la definición sea de alto nivel para que pueda guiar el proyecto.</p>

<p>Lo curioso de definir así la calidad en un proyecto que incluye software es que <strong>el beneficiario del trabajo entiende qué es la calidad</strong>. No se basa en conceptos técnicos no relacionados con el negocio... no es opaca. Por otra parte, es muy posible que la definición de la calidad tal como la entienden muchos técnicos no sea importante a la hora de generar valor.</p>

<p>Demasiadas veces he oído cómo se usa la calidad (técnica) para justificar el retraso en las fechas de entrega o en la aproximación para resolver un problema del usuario. Crear una definición de calidad compartida desde el primer momento puede ayudar a evitar esto.</p>

<p>Y todo lo demás (pocos bugs, muchas pruebas, automatización del proceso de desarrollo) no es calidad. Es el sello de una buena ingeniería y lo que permite entregar la calidad que busca el cliente/consumidor/usuario.</p>]]>
        
    </content>
</entry>

<entry>
    <title>La plaga de las Startups</title>
    <link rel="alternate" type="text/html" href="http://blog.abelmuino.com/2011/02/la-plaga-de-las-startups.html" />
    <id>tag:blog.abelmuino.com,2011://1.43</id>

    <published>2011-02-08T08:11:31Z</published>
    <updated>2011-02-08T20:10:52Z</updated>

    <summary>¿No habéis notado que cada vez hay más startups? Sí, seguro que sí. Seguro que estáis hartos de que hasta el hijo de la portera está montando su startup. Sí... va a vender las madalenas de su madre por internet....</summary>
    <author>
        <name>Abel Muiño</name>
        <uri>http://blog.abelmuino.com</uri>
    </author>
    
        <category term="opinión" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="definición" label="definición" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="emprender" label="emprender" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="empresa" label="empresa" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="plaga" label="plaga" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="pyme" label="pyme" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="saturación" label="saturación" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="startup" label="startup" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="es" xml:base="http://blog.abelmuino.com/">
        <![CDATA[<p>¿No habéis notado que cada vez hay más <em>startups</em>? Sí, seguro que sí. Seguro que estáis hartos de que hasta el hijo de la portera está montando su <em>startup</em>. Sí... va a vender las madalenas de su madre por internet.</p>

<p><a href="http://www.flickr.com/photos/mr_t_in_dc/3396791200/" title="Cupcake Fail by Mr. T in DC, on Flickr"><img src="http://farm4.static.flickr.com/3421/3396791200_86242b50f6.jpg" width="500" height="333" alt="Cupcake Fail" /></a></p>

<p>Hoy me he levantado con ganas de ganarme enemigos. Así que, vamos a poner las cartas sobre la mesa.</p>

<h2>No estás montando una startup</h2>

<p>Asúmelo. Tu idea no es una startup... </p>

<p>No, no, espera... vamos un paso más atrás</p>

<h2>¿qué diablos NO es una startup?</h2>

<p>Casi toda la gente que habla de <em>su startup</em> está hablando de poner en marcha un <em>proyecto</em> de internet. </p>

<p><strong>Mal</strong>.</p>

<p>Borra la palabra proyecto y empieza a pensar en <em>negocio</em>. Las palabras importan... «negocio» lleva asociados conceptos como ingresos, gastos, costes... que en «proyecto» quedan ocultos.</p>

<p>Bien, entonces digamos que estás  montando un <em>negocio</em> en internet. Eso es algo difícil y muy loable, no dejes que nadie te quite la idea de la cabeza.</p>

<p>Pero todavía no es una <em>startup</em>. De la misma forma que la cafetería de mi barrio no es un Starbucks, tu negocio puede no tener la escala suficiente. Insisto, puede ser un negocio perfectamente rentable... pero no tiene la capacidad de crecer órdenes de magnitud en muy poco tiempo. Es una <strong>pyme</strong>.</p>

<p>Alguno estará pensando «¿Starbucks es una Startup?». No, por supuesto que no. Ya no, al menos. Es una empresa establecida, con dinámicas de negocio muy diferentes a una startup. Digamos que ser una startup es, también, un <em>estado mental</em>. O una <em>fase del negocio</em>. Igual que <a href="http://angelmaria.com/2006/12/24/emprendores-vs-empresarios/">un emprendedor es algo diferente a un empresario</a> (o un creador es distinto a un gestor), una empresa establecida es algo diferente a una startup.</p>

<p>Ok, ok... ya oigo a mis colegas técnicos desde detrás de sus pantallas... «nosotros somos pequeños e innovadores, estamos desarrollando un algoritmo revolucionaria que va a cambiar el estado del arte».</p>

<p>Aquí puede que te hayas «pasado de frenada» (puede que no, piénsalo friamente). Si lo que tienes va a revolucionar el <em>status quo</em> tanto como crees, es muy posible que ni siquiera tengas un mercado. Así que, aunque en teoría podrías multiplicar el valor de tu empresa, en la práctica seguramente sea difícil encontrar los clientes necesarios.</p>

<p>En este caso, es probable que tu empresa funcione mejor con subvenciones de I+D+i, o como una rama dentro de otra empresa. Quizá <strong>sí</strong> seas una startup, pero tu inversión en <em>marketting</em> será tan grande, o mayor, que la tecnológica. Espero que lo hayas incluido en tus cálculos. Y cuidado con no estar cultivando un mercado para que lo coseche algún otro...</p>

<h2>Entonces, una startup, ¿qué es?</h2>

<p>Me voy a lanzar con mi definición... ajustándola un poco a internet y a España.</p>


<ul>
<li><strong>Es un negocio:</strong> te lo tomas en serio, piensas no sólo en la parte técnica (la más fácil... a veces hasta irrelevante).</li>
<li><strong>No es un hobby:</strong> Repito... <strong>te lo tomas en serio</strong>. Aunque quizá tengas que hacer otras cosas para poder pagar el desarrollo de la empresa (sobre todo si decides no buscar inversión), esas otras cosas son <strong>un mal necesario</strong>.</li>
<li><strong>Es «el siguiente paso lógico»:</strong> Lo que plantea la startup debe ser comprensible (o mejor: <em>obvio</em>) una vez que te lo cuentan. No puede ser un salto demasiado grande que se anticipe a las necesidades reales, ni algo que repita lo que ya es mainstream.</li>
<li><strong>Puede fallar:</strong> Una Startup está <em>empujando los límites</em> de los modelos de negocio y/o soluciones existentes. Quizá vaya en la dirección correcta, quizá no. Se mueve en un entorno incierto y todo puede pasar. Por eso <strong>te lo tomas en serio</strong>. Hay riesgo real de perder dinero y quedarte en el paro... no esperes que el estado te proteja.</li>
<li><strong>Es invertible:</strong> independientemente de que aceptes o no inversión, las oportunidades reales de crecimiento deben ser jugosas. </li>
</ul>



<p>En otros paises/entornos seguramente mi lista de características sería distinta. Por ejemplo, la inversión en <em>revoluciones</em> no es destacable en España. Y lo de «el siguiente paso lógico» seguramente no sea tan evidente para industrias como la ingeniería biomédica.</p>

<h2>¿Y tengo que ser una startup?</h2>

<p><strong>No, por supuesto que no</strong>.</p>

<p>La mayoría de los negocios que hay sobre el planeta no son startups. Generan ingresos y beneficios. Dan empleo estable a millones de personas. Hacen que el mundo siga en marcha.</p>

<p>Si tienes la intención de montar una tienda online, ¡estupendo! (dicen que el ecommerce por fin despegará este año). Pero lo tienes muy difícil para convertirte en un <a href="http://amazon.com">Amazon</a> o un <a href="http://etsy.com">Etsy</a>.</p>

<p>Si vas a montar una consultora en informática, te puede ir genial. Pero estarás siempre limitado por las personas cualificadas que puedas encontrar (aunque algunas consultoras sí que son capaces de conseguir inversión).</p>]]>
        
    </content>
</entry>

<entry>
    <title>#katabreakers: Peer review de 12meses12katas</title>
    <link rel="alternate" type="text/html" href="http://blog.abelmuino.com/2011/01/katabreakers-peer-review-de-12meses12katas.html" />
    <id>tag:blog.abelmuino.com,2011://1.42</id>

    <published>2011-01-30T16:30:15Z</published>
    <updated>2011-01-30T16:30:32Z</updated>

    <summary> 12meses12katas es una idea muy interesante para poner a disposición de todo el mundo (para escarnio o inspiración) soluciones a problemas muy acotados. Partiendo de que repetir una y otra vez este tipo de problemas no tiene el mismo...</summary>
    <author>
        <name>Abel Muiño</name>
        <uri>http://blog.abelmuino.com</uri>
    </author>
    
        <category term="proyectos" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="12meses12katas" label="12meses12katas" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="aprender" label="aprender" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="git" label="git" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="github" label="github" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="kata" label="kata" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="katabreakers" label="katabreakers" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="peerreview" label="peer review" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="review" label="review" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="es" xml:base="http://blog.abelmuino.com/">
        <![CDATA[<p> <a href="http://www.12meses12katas.com/">12meses12katas</a> es una idea muy interesante para poner a disposición de todo el mundo (para escarnio o inspiración) soluciones a problemas muy acotados.</p>

<p>Partiendo de que repetir una y otra vez este tipo de problemas no tiene el mismo valor que <a href="http://blog.abelmuino.com/2010/09/aprende-a-costa-del-cliente.html">resolver problemas reales</a> (no acotados), sí que tiene sus usos.</p>

<p><center>&lt;<a href="http://www.flickr.com/photos/st3f4n/4193370268/" title="I will find thedroids I'm looking for I will find the droids I'm looking for I will find the droids I'm looking for by Stéfan, on Flickr"><img src="http://farm3.static.flickr.com/2757/4193370268_3539ffb398.jpg" width="500" height="333" alt="I will find the droids I'm looking for I will find the droids I'm looking for I will find the droids I'm looking for" /></a></center></p>

<p>Uno de esos usos es <strong>colaborar en mejorar las katas</strong> (mediante <em>peer review</em>).</p>

<h2>¿Qué?</h2>

<p><strong>La idea es simple:</strong> Estudiar la kata de otra persona.</p>

<p>Si encuentras defectos, crea y comparte con el autor los casos de prueba necesarios para demostrarlo (quizá con algún refactoring para hacer el código más <em>testable</em>). De esta forma el autor puede corregirlos y tú volver a revisarlos, iniciando una especie de <em>diálogo</em>.</p>

<h2>Elegir de quién vamos a aprender</h2>

<p>Lo primero es <strong>elegir una implementación</strong> de las que han sido publicadas en el <a href="https://github.com/12meses12katas/">github de 12meses12katas</a></p>

<p>Después tendremos que localizar el fork del autor. Con un poco de suerte, su usuario en github será el mismo del directorio y el proyecto se llamará igual que en 12meses12katas.</p>

<p>En mi caso, mi carpeta es <a href="https://github.com/12meses12katas/Enero-String-Calculator/tree/master/amuino">amuino</a>, por lo que mi url será:</p>

<pre><code>https://github.com/amuino/Enero-String-Calculator.git</code></pre>

<p>Si esto no funciona para localizar el fork, habrá que mirar <a href="https://github.com/12meses12katas/Enero-String-Calculator/network">la red del proyecto</a>.</p>

<h2> Preparar nuestra copia</h2>

<p>Queremos enviar nuestros casos de prueba al autor de la kata, así que tendremos que configurar nuestro clon del repositorio para apuntar al clon del autor de la kata (de forma que trabajemos todos con el mismo código).</p>

<p>Mi opción para ello es crear una rama que siga al repositorio del autor:</p>

<pre><code>git remote add -f -m master amuino https://github.com/amuino/Enero-String-Calculator.git
git checkout -b amuino amuino/master</code></pre>

<p>Ya está, nuestro repositorio local tienes una rama <code>amuino</code> que sigue a mi repositorio. Además, estás usando esa rama.</p>

<p>(cambia <code>amuino</code> por el nombre del usuario que corresponda)</p>

<pre><code>Enero-String-Calculator $ git branch
* amuino
  master</code></pre>

<p>Cuando necesitemos volver a seguir nuestro repositorio, simplemente cambiamos a la rama master: <code>git checkout master</code></p>

<h2>Escribir los casos de prueba</h2>

<p>Nada especial aquí... excepto, tal vez, que deberemos aprender lo básico del lenguaje en el que se haya hecho la kata para poder escribirlo y ejecutarlo (si es uno en el que no tengamos soltura).</p>

<h2>Commit &amp; Push</h2>

<p>Tampoco hay nada especial en el commit.</p>

<pre><code>git add .
git commit -m &quot;Test para XYZ&quot;</code></pre>

<p>En el push, hay que recordar indicarle a git que debe crear una rama remota:</p>

<pre><code>git push origin amuino</code></pre>

<p>Desde este momento podremos ver la rama en nuestro proyecto de github.</p>

<h2>Pull request</h2>

<p>Todos los pasos se hacen en la web <strong>tu fork</strong> en github</p>

<p>Primero, cambia a la nueva rama (en mi caso, yo he usado la kata de Jorge Uriarte).</p>

<p><img alt="Cambio de rama en github" src="http://blog.abelmuino.com/github-switch-branches.png" width="197" height="130" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></p>

<p>A continuación, iniciamos una <em>pull-request</em>. Por defecto, estará preparada para enviarla al repositorio de <code>12meses12katas:master</code>. Haciendo click podemos cambiarlo seleccionando cualquiera de los forks. Hay que localizar el que nos interesa (si es el mío: <code>amuino/Enero-String-Calculator</code>).</p>

<p>Para confirmar el cambio, pulsamos el botón <strong>Update Commit Range</strong>.</p>

<p>Y ahora continuamos con el proceso normal de escribir un título y una descripción para la <em>pull-request</em>.</p>

<h2>¡Listo!</h2>

<p>El autor recibirá su notificación y podrá ponerse en contacto con vosotros si lo necesita para discutir el problema o aceptar el pull y mejorar su kata (o pasar de todo, que siempre es una opción).</p>

<h2>¿Te mola la idea?</h2>

<p>¡Pues no necesitas pedir permiso!</p>

<p>Puedes usar twitter para solicitar <em>reviews</em> o discutir la idea usando el tag <a href="http://twitter.com/#!/search/%23katabreakers">#katabreakers</a></p>

<h2>Otras opciones</h2>

<p>Hay más formas de hacer lo mismo. Puedes usar parches y adjuntarlos a una <em>issue</em> en github, puedes hacer <em>code reviews</em> sobre los commits...</p>

<p>Si te gustan más, úsalas. Lo interesante es que aprendas del trabajo de otro y le ayudes a eso otro a aprender del tuyo.</p>

<p><strong>Happy breaking!</strong><br />
 </p>]]>
        
    </content>
</entry>

<entry>
    <title>Apache Buildr con Alex Boisvert</title>
    <link rel="alternate" type="text/html" href="http://blog.abelmuino.com/2011/01/apache-buildr-con-alex-boisvert.html" />
    <id>tag:blog.abelmuino.com,2011://1.41</id>

    <published>2011-01-26T08:42:00Z</published>
    <updated>2011-01-26T08:44:25Z</updated>

    <summary>La última sesión del San Francisco Java User Group, a la que pude acudir gracias a que Nilistics me plantó en USA para un poco de face to face development, trató sobre esta herramienta de build. Alex es un tipo...</summary>
    <author>
        <name>Abel Muiño</name>
        <uri>http://blog.abelmuino.com</uri>
    </author>
    
        <category term="opinión" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="build" label="build" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="buildr" label="buildr" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="dsl" label="dsl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="maven" label="maven" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rake" label="rake" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ruby" label="ruby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="script" label="script" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="es" xml:base="http://blog.abelmuino.com/">
        <![CDATA[<p>La <a href="http://www.sfjava.org/calendar/14894440/">última sesión del San Francisco Java User Group</a>, a la que pude acudir gracias a que <a href="http://nilistics.net">Nilistics</a> me plantó en <span class="caps">USA </span>para un poco de <em>face to face development</em>, trató sobre esta herramienta de build.</p>

<p><center><img src="http://photos4.meetupstatic.com/photos/event/e/e/c/600_21063820.jpeg" /></center></p>

<p>Alex es un tipo majo. Dejó claro de entrada que no tiene ningún puesto chulo en Buildr... sólo se encarga del papeleo (ocupa la <em>project management chair</em>). Aun así, está entre «la gente importante». Además se esforzó por entender mis preguntas en balbuceante inglés :-)</p>

<h2>La presentación</h2>

<p>Alex reutilizó <a href="http://www.slideshare.net/marakana/learn-to-build-like-you-code-with-apache-buildr">su presentación</a> (creo que de la java one) pero como yo no voy a muchos saraos, para mi era nueva.</p>

<p>Buildr surge como una alternativa a Maven2 para builds que necesitan operaciones complejas o no standard. Los impulsores estaban contentos con Maven1 por su capacidad para incluir scripting (mediante el uso de <a href="http://commons.apache.org/jelly/faq.html">jelly</a>), algo que no es tan simple en Maven2.</p>

<p>El <em>tag line</em> de <a href="http://buildr.apache.org/">Buildr</a> en la presentación es <em>«build like you code»</em> y se adapta muy bien a lo que vimos. Buildr está construído sobre <a href="http://rake.rubyforge.org/">rake</a> que utiliza <a href="http://ruby-lang.org">ruby</a>... lo que lo debería hacer muy familiar para todos los que somos <em>promiscuos</em> con los lenguajes de programación.</p>

<p>Sobre esta estructura se crea un <span class="caps">DSL </span>específico para proyectos java (si amigos, una herramienta en ruby para compilar java). El resultado es muy interesante... se puede utilizar <code>require</code> para utilizar módulos específicos (por ejemplo, para proyectos <a href="http://www.scala-lang.org/">scala</a>) y de forma automática se definen las <a href="http://buildr.apache.org/languages.html#scala">convenciones adecuadas</a>.</p>

<pre><code>require 'buildr/scala'</code></pre>


<p>Como es habitual en ruby, el <span class="caps">DSL </span>no es más que código ruby... por lo que Buildr nos permite hacer trucos que no son sencillos con herramientas como <a href="http://ant.apache.org/">ant</a> o <a href="http://maven.apache.org/">maven</a>, dónde tendremos que implementar una nueva <a href="http://ant.apache.org/manual/develop.html#writingowntask">Task</a> o <a href="http://maven.apache.org/plugin-developers/index.html">Plugin</a>... normalmente en un proyecto separado (y publicarlo en algún sitio para que esté disponible durante la build). Buildr lo mantiene todo junto, lo que es mucho más simple (pero no tan reusable).</p>

<p>Uno de los puntos más fuertes que he visto en buildr es su habilidad para saber qué necesita hacerse. Es muy hábil comparando timestamps y saltándose pasos del <em>build</em> cuando es posible. Cosas que <em>se supone</em> que el resto de herramientas tambien hacen... pero en Buildr me ha parecido mucho más rápido.</p>

<p>Sobre la velocidad... en la demo, buildr era fascinantemente rápido. No sé si el portátil era <em>la leche</em> o realmente es así de veloz. Una de las cosas que podría estar ayudando es que Buildr puede ejecutarse sobre el intérprete nativo de ruby y sólo crea una máquina virtual java cuando es necesaria usando el <a href="http://rjb.rubyforge.org/">ruby-java bridge</a>. La otra opción es usar <a href="http://www.jruby.org/">jruby</a>... en este caso estaremos «pagando» el coste de arranque de la <code>jvm</code> en cada ejecución.</p>

<p>Obvia decirlo, pero Buildr es capaz de consumir artefactos en repositorios maven sin problemas.</p>

<div style="width:425px;border: 1px solid #ccc" id="__ss_5800868"><strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/marakana/learn-to-build-like-you-code-with-apache-buildr" title="Learn to Build like you Code with Apache Buildr">Learn to Build like you Code with Apache Buildr</a></strong><object id="__sse5800868" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=antoinetolumeapachebuildrslides-101116160021-phpapp02&amp;stripped_title=learn-to-build-like-you-code-with-apache-buildr&amp;userName=marakana" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse5800868" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=antoinetolumeapachebuildrslides-101116160021-phpapp02&amp;stripped_title=learn-to-build-like-you-code-with-apache-buildr&amp;userName=marakana" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><div style="padding:5px 0 12px">View more <a href="http://www.slideshare.net/">presentations</a> from <a href="http://www.slideshare.net/marakana">Aleksandar Gargenta</a>.</div></div>


<h2>Mi visión de buildr</h2>

<p>Yo soy un usuario feliz de Maven. Comulgo con la mayor parte de sus ideas, su convención sobre configuración y su modelo de plugins... así que Buildr me aporta poco. No deja de ser otra herramienta «tipo make», basada en tareas con dependencias entre si... no muy diferente de Ant, excepto en que vuelve a usar un lenguaje de scripting en lugar de xml (lo que es una ventaja, francamente). </p>

<p>¡Aunque eso de poder ejecutar código de forma simple durante la build suena apetecible! No es que con maven <a href="http://mojo.codehaus.org/rubyscript-maven-plugin/run-mojo.html">no se pueda</a>, es que es <em>feo</em>, ya que hay que declarar un plugin, asociar su ejecución a una fase... Veremos si el <a href="https://github.com/sonatype/polyglot-maven">polyglot-maven</a> nos ayuda en el futuro.</p>

<p>Por otra parte, Buildr proporciona mediante su <span class="caps">DSL </span>una extensibilidad muy similar a la que proporciona Maven con sus plugins.</p>

<p>Como con casi todas las herramientas basadas en scripting, «un gran poder conlleva una gran responsabilidad». La flexibilidad de Buildr le permite consumir repositorios maven, pero publicar artefactos en ellos es harina de otro costal. A día de hoy no está bien resuelto (entre otras cosas porque Buildr no maneja el concepto de <em>scopes</em> de maven, así que es incapaz de generar la lista de dependencias automáticamente). Pero tampoco es muy complicado de conseguir (sólo es repetitivo... algo que hay que configurar en cada script).</p>

<p>En resumen... <strong>si maven no es para ti</strong>, quizá buildr encaje mejor con tu forma de pensar. <strong>Si eres usuario de ant</strong>, estúdialo atentamente. O quizá buildr cambie tu forma de ver las builds... merece la pena echarle un vistazo.</p>]]>
        
    </content>
</entry>

<entry>
    <title>Querido 2011</title>
    <link rel="alternate" type="text/html" href="http://blog.abelmuino.com/2011/01/querido-2011.html" />
    <id>tag:blog.abelmuino.com,2011://1.40</id>

    <published>2011-01-05T09:15:00Z</published>
    <updated>2011-01-05T10:39:29Z</updated>

    <summary>Aunque llegue tarde, no puedo evitar hacer mi pequeña lista de objetivos para los 359 días que quedan del año que acabamos de empezar. Mi primer objetivo va a ser buscar otras pasiones. Dedico mucho, muchísimo tiempo al mundo del...</summary>
    <author>
        <name>Abel Muiño</name>
        <uri>http://blog.abelmuino.com</uri>
    </author>
    
        <category term="personal" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="2011" label="2011" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="desarrollo" label="desarrollo" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="emprendimiento" label="emprendimiento" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="fotografía" label="fotografía" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="lecura" label="lecura" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="propósitos" label="propósitos" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ruina" label="ruina" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="startup" label="startup" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="es" xml:base="http://blog.abelmuino.com/">
        <![CDATA[<p>Aunque llegue tarde, no puedo evitar hacer mi pequeña lista de objetivos para los 359 días que quedan del año que acabamos de empezar.</p>

<p><img alt="Luces de navidad" src="http://blog.abelmuino.com/luces-navidad/Luces%20de%20navidad%20-%201.jpg" width="525" height="291" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></p>

<p>Mi primer objetivo va a ser <strong>buscar otras pasiones</strong>. Dedico mucho, muchísimo tiempo al mundo del desarrollo y, aunque me encanta y disfruto con ello, estoy convencido de que buscar algo que hacer separado de un ordenador me vendrá bien. Y aunque sé que me pego <a href="http://www.flickr.com/photos/amuino/sets/72157622334406837/">unos viajes</a> <a href="http://www.flickr.com/photos/amuino/sets/72157624118933618/">de la leche</a>, eso no cuenta porque no es una cosa <em>del día a día</em>... es como meterse un cocido y pedir sacarina con el café... no cuenta como dieta.</p>

<p>De momento la fotografía va muy en cabeza. Supongo que no conseguiré separarme totalmente del ordenador, ¡pero al menos tendré que salir a hacer fotos!</p>

<p>Tampoco estaría mal <strong>recuperar la afición a la lectura</strong>... de algo que no sean blogs sobre software o creación de empresas. He empezado con <a href="http://www.casadellibro.com/libro-dune-/1803821/2900001404192">Dune</a> y <a href="http://www.casadellibro.com/libro-apocalipsis-z-los-dias-oscuros/1611192/2900001346549">Los días oscuros</a> </p>

<p>Una vez más, <strong>me propongo arruinarme</strong> si no queda más remedio. Pero ya va siendo hora de centrarme en <a href="http://thecloudmarket.com">alguno de los proyectos</a> que vengo barajando <a href="http://blog.tetuanvalley.com/2009/10/startup-school-fall-2009-project.html">durante tanto tiempo</a>. Esto implicará gastar dinero y ganarlo en algún momento (aunque sea <a href="http://www.donaciondesemen.com/compensacion_economica_donacion_semen.html">donando esperma</a>)</p>

<p>Y como conseguir <em>solamente</em> eso sería muy fácil, la condición es que tiene que ser sin perjudicar a mi vida familiar y social.</p>

<p><a href="http://showblogs.syfy.com/caprican/news/graystone-industries-out-of-the-holoband-business.php">Hold me to it, Caprica</a></p>]]>
        
    </content>
</entry>

<entry>
    <title>Chapuza o parálisis</title>
    <link rel="alternate" type="text/html" href="http://blog.abelmuino.com/2010/12/chapuza-o-paralisis.html" />
    <id>tag:blog.abelmuino.com,2010://1.39</id>

    <published>2010-12-14T15:52:50Z</published>
    <updated>2010-12-14T15:52:38Z</updated>

    <summary>Ese es mi dilema estos últimos días. Hace ya un mes que he grabado un screencast con un pequeño paso a paso del uso de Devise para solucionar el registro y autenticación de usuarios en Rails 3. Pero no grabé...</summary>
    <author>
        <name>Abel Muiño</name>
        <uri>http://blog.abelmuino.com</uri>
    </author>
    
        <category term="opinión" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="limites" label="limites" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="motivación" label="motivación" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="paralisis" label="paralisis" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="procrastinación" label="procrastinación" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="restricciones" label="restricciones" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="es" xml:base="http://blog.abelmuino.com/">
        <![CDATA[<p>Ese es mi dilema estos últimos días.</p>

<p>Hace ya un mes que he grabado un <em>screencast</em> con un pequeño paso a paso del uso de <a href="https://github.com/plataformatec/devise">Devise</a> para solucionar el registro y autenticación de usuarios en <a href="http://edgeguides.rubyonrails.org/3_0_release_notes.html">Rails 3</a>. Pero no grabé el audio en ese momento para permitirme recortar la grabación (y evitar que sea un tostón de 30 minutos).</p>

<p><strong>Problema:</strong> no saco tiempo/ganas para grabar el audio.</p>

<p>Lo que me deja en una disyuntiva... ¿publico una chapuza? ¿o lo dejo "madurando"? ¿o directamente lo vuelvo a grabar todo? ¿o me olvido de hacer <em>screencasts</em> porque no valgo para eso?</p>

<p>El problema, creo... es que <strong>tengo demasiado tiempo libre</strong>. No tengo presión, así que me entretengo buscando la perfección. Eso, creo, se llama <a href="http://es.wikipedia.org/wiki/Procrastinaci%C3%B3n">procrastinar</a>.</p>

<p>Ya lo han dicho muchos antes que yo, pero no está mal recordarse que las <strong>restricciones no son inconvenientes</strong>, si no la motivación para hacer las cosas. Pensad en ello la próxima vez que os den un plazo de entrega imposible. </p>

<p>Quizá ayude (¡o no!)</p>]]>
        
    </content>
</entry>

<entry>
    <title>Autotest, feedback más rápido</title>
    <link rel="alternate" type="text/html" href="http://blog.abelmuino.com/2010/11/autotest-feedback-mas-rapido.html" />
    <id>tag:blog.abelmuino.com,2010://1.38</id>

    <published>2010-11-12T22:30:25Z</published>
    <updated>2010-11-12T22:31:52Z</updated>

    <summary> Todos sabemos (o deberíamos saber) las ventajas de tener un servidor de integración continua. Entre ellas está la ejecución de los tests. Si hemos hecho las cosas bien, también podríamos lanzar las pruebas en nuestra máquina de desarrollo. Pero...</summary>
    <author>
        <name>Abel Muiño</name>
        <uri>http://blog.abelmuino.com</uri>
    </author>
    
        <category term="trucos y pistas" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="autotest" label="autotest" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ci" label="ci" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="feedback" label="feedback" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="growl" label="growl" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="osx" label="osx" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ruby" label="ruby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="test" label="test" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="es" xml:base="http://blog.abelmuino.com/">
        <![CDATA[<p> Todos sabemos (o deberíamos saber) las ventajas de tener un servidor de <a href="http://blog.abelmuino.com/2010/08/ruby-on-rails-y-hudson-test-report.html">integración continua</a>. Entre ellas está la ejecución de los tests.</p>

<p>Si hemos hecho las cosas bien, también podríamos lanzar las pruebas en nuestra máquina de desarrollo. Pero no sería la primera vez que nos falla la constancia y hacemos un commit sin probar ¿Verdad?</p>

<p><img alt="testing-please-do-not-disturb.jpg" src="http://blog.abelmuino.com/testing-please-do-not-disturb.jpg" width="525" height="360" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></p>

<h2>Bienvenidos a Autotest</h2>

<p>Autotest es un proceso que monitoriza los ficheros del proyecto y (a ver si lo adivináis) ejecuta los tests de forma automática cada vez que realizamos un cambio.</p>

<p>Para que el feedback sea más rápido, autotest usa heurísticas para saber qué test está relacionado con qué código y ejecutar sólo lo mínimo necesario.</p>

<p>Otra cosa con la que <code>autotest</code> gana tiempo es saltándose las tareas de preparación de la base de datos. Ojo, porque esto significa que después de una migración habrá que aplicarla en la BD de test también (<code>rake db:test:clone</code>).</p>

<h2>Instalando autotest con las heurísticas para rails</h2>

<pre><code>gem install autotest autotest-rails-pure</code></pre>

<p>Fácil e indoloro. Ahora arrancamos autotest en la carpeta del proyecto rails. Lo primero que hará será ejecutar todos los tests. Con un poco de suerte, todos los tests pasan.</p>

<pre><code>amuino$ autotest
loading autotest/rails
style: Rails
/Users/amuino/.rvm/rubies/ruby-1.8.7-p302/bin/ruby -I.:lib:test -rubygems -e &quot;['test/unit', 'test/unit/helpers/users_helper_test.rb', 'test/unit/user_test.rb', 'test/functional/users_controller_test.rb'].each { |f| require f }&quot; | /Users/amuino/.rvm/gems/ruby-1.8.7-p302@global/gems/autotest-4.4.2/bin/unit_diff -u
Loaded suite -e
Started
........
Finished in 0.138437 seconds.

8 tests, 11 assertions, 0 failures, 0 errors
</code></pre>

<p>Vamos a romper un test...</p>

<pre><code>/Users/amuino/.rvm/rubies/ruby-1.8.7-p302/bin/ruby -I.:lib:test -rubygems -e &quot;['test/unit', 'test/unit/user_test.rb'].each { |f| require f }&quot; | /Users/amuino/.rvm/gems/ruby-1.8.7-p302@global/gems/autotest-4.4.2/bin/unit_diff -u
Loaded suite -e
Started
F
Finished in 0.024852 seconds.

1) Failure:
test_the_truth(UserTest) [/test/unit/user_test.rb:6]:
&lt;false&gt; is not true.

1 tests, 1 assertions, 1 failures, 0 errors
</code></pre>

<p>¿Os habéis fijado que sólo sale una F (y ningún punto)? Al modificar un único caso de prueba, sólo ese se ejecuta.</p>

<p>En cuanto lo arreglemos veremos que se pasan los test 2 veces. La primera para el fichero que hemos tocado y la segunda para todo el proyecto, para asegurar que no hemos causado más daños al solucionar el error detectado.</p>

<h2>Ejecutando todos los tests</h2>

<p>En cualquier momento podemos pulsar <code>ctrl-c</code> para forzar a autotest a ejecutar todos los tests de nuevo.</p>

<p>Para salir de autotest, habrá que usar <code>ctrl-c</code> dos veces.</p>

<h2>Añadiendo extras</h2>

<p>Hay varios problemas con la configuración estándar de autotest:</p>


<ul>
<li>Es fea con ganas</li>
<li>Es incómodo tener que consultar la consola continuamente</li>
<li>En lo técnico, el polling de los ficheros es costoso</li>
</ul>



<p>Hay un <em>set</em> de extras que yo uso con autotest en osx para solucionar estas pegas:</p>


<ul>
<li><a href="https://github.com/mynyml/redgreen">redgreen</a>: para añadir color a los resultados de la consola</li>
<li><a href="https://github.com/svoop/autotest-growl">autotest-growl</a>: para que los resultados sean visibles sin esfuerzo. Antes necesitaréis instalar <a href="http://growl.info/">growl</a> (si no lo tenéis)</li>
<li><a href="https://github.com/svoop/autotest-fsevent">autotest-fsevent</a>: utiliza las notificaciones del sistema en lugar de comprobar cada fichero de forma continua</li>
</ul>



<pre><code>gem install redgreen autotest-growl autotest-fsevent</code></pre>

<p>Para activar las extensiones, creamos el fichero de configuración <code>~/.autotest</code>:</p>

<pre><code>require 'redgreen/autotest'
require 'autotest/growl'
require 'autotest/fsevent'</code></pre>

<p>Y, tras reiniciar autotest, este es el resultado<br />
<img alt="" src="http://blog.abelmuino.com/autotest-colours.png" width="618" height="332" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" /></p>

<h2>Más trucos</h2>

<p>Todo esto, y más, está en <a href="http://ph7spot.com/musings/getting-started-with-autotest#troubleshooting_autotest_test_detection">esta referencia de autotest</a>.</p>]]>
        
    </content>
</entry>

</feed>
