<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-1048881-6";
urchinTracker();
</script><?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE rss [<!ENTITY % HTMLlat1 PUBLIC "-//W3C//ENTITIES Latin 1 for XHTML//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent">]>
<rss version="2.0" xml:base="http://www.agile-spain.com/agilev2">
<channel>
 <title>jferrer&#039;s blog</title>
 <link>http://www.agile-spain.com/agilev2/blog/jferrer</link>
 <description></description>
 <language>es</language>
<item>
 <title>Pruebas unitarias y de persistencia en Ruby on Rails</title>
 <link>http://www.agile-spain.com/agilev2/pruebas_unitarias_y_de_persistencia_en_ruby_on_rails</link>
 <description>&lt;p&gt;Uno de los aspectos que me ha sorprendido más gratamente de Ruby on Rails es la facilidad para hacer pruebas de una aplicación web a todos los niveles.&lt;/p&gt;
&lt;p&gt;En el entorno J2EE no he acabado de encontrar herramientas de pruebas que cubrieran todas las necesidades del desarrollo de aplicaciones web. Para pruebas unitarias JUnit o sus competidores están muy bien, pero cuando te sales de ese terreno las cosas no están tan claras. En particular los entornos para llevar a cabo pruebas funcionales provocan que estas supongan un coste considerable. &lt;/p&gt;
&lt;p&gt;En Rails tenemos el equivalente a JUnit+dbUnit+HttpUnit+Cactus+Jameleon y todo ello perfectamente integrado. Así da gusto &lt;tt&gt;:)&lt;/tt&gt; El único pero que le pongo son los nombres que han dado a los distintos tipos de pruebas y que resultan bastante engañosos. &lt;/p&gt;
&lt;p&gt;En esta entrada del blog comienzo explicando las pruebas que Rails denomina unitarias y que incluyen tanto a las realmente unitarias como a las pruebas de las clases de modelo Active Record. Estas últimas no son puramente unitarias, dado que dependen de que esté disponible una base de datos con determinada información en ella.&lt;/p&gt;
&lt;h4&gt;Pruebas de presistencia con &lt;i&gt;Fixtures&lt;/i&gt;&lt;/h4&gt;
&lt;p&gt;Las primeras no tienen ningún misterio para las que hayan usado JUnit así que centrémonos en las segundas. Para ellas, Rails proporciona el sistema de &lt;i&gt;&lt;a href=&quot;http://ar.rubyonrails.org/classes/Fixtures.html&quot;&gt;Fixtures&lt;/a&gt;&lt;/i&gt; que permite definir los datos que deben estar presentes en la base de datos antes de la ejecución de la prueba. La forma de definir estos datos es mediante un fichero con formato &lt;a href=&quot;http://www.yaml.org/&quot;&gt;YAML&lt;/a&gt; por cada clase del modelo. Todos estos ficheros se almacenan en el directorio &lt;tt&gt;tests/fixtures&lt;/tt&gt;. Por ejemplo en SprintTracker los ficheros &lt;tt&gt;tests/fixtures/sprints.yml&lt;/tt&gt; contiene:&lt;/p&gt;
</description>
 <category domain="http://www.agile-spain.com/agilev2/tema/pruebas">Pruebas</category>
 <pubDate>Wed, 26 Apr 2006 20:05:52 +0000</pubDate>
</item>
<item>
 <title>La hora de la verdad con Ruby on Rails</title>
 <link>http://www.agile-spain.com/agilev2/la_hora_de_la_verdad_con_ruby_on_rails</link>
 <description>&lt;p&gt;La versión 0.1 de SprintTracker contenía únicamente funcionalidades típicas de los artículos de Rails. La hora de la verdad ha llegado al proponerme implementar las funcionalidades que había sugerido para la versión 0.2 y 0.3. Las más importantes son:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gráficas Burndown de los sprints&lt;/li&gt;
&lt;li&gt;Reordenación jerárquica de las páginas de administración de proyectos, sprints y tareas. Esto ha permitido mejorar mucho la usabilidad de SprintTracker&lt;/li&gt;
&lt;li&gt;Páginas de edición rápida para añadir todas las reestimaciones de un día concreto o para una tarea concreta. Esto es fundamental si, como estoy haciendo yo últimamente, usas una hoja excel para llevar el seguimiento del proyecto&lt;/li&gt;
&lt;li&gt;Otras mejoras menores: borrado en cascada de proyectos, sprints y tareas, validación a medida de reestimaciones (no puede haber dos para la misma tarea y día), etc.
&lt;/ul&gt;
&lt;p&gt;En la captura de pantalla se muestra la vista de un sprint en la que se aprecian varias de estas funcionalidades.&lt;br /&gt;
&lt;a href=&quot;http://www.agile-spain.com/agilev2/files/sprint-view.png&quot;&gt;&lt;br /&gt;
&lt;img src=&quot;http://www.agile-spain.com/agilev2/files/sprint-view.png&quot; width=&quot;400&quot; align=&quot;center&quot; hspace=&quot;20&quot; vspace=&quot;10&quot; border=&quot;0&quot;/&gt;&lt;/a&gt;&lt;br /&gt;
Tras implementar estas funconalidades he liberado &lt;a href=&quot;http://rubyforge.org/frs/?group_id=1472&quot;&gt;SprintTracker v0.3&lt;/a&gt; y creo que ya empieza a ser una aplicación lista para ser usada. Para ellas no había ningún artículo que me guiara y ello me ha obligado a aprender mucho más sobre Rails y sobre todo a manejarme con las referencias online imprescindibles para todo desarrollador de Rails:&lt;/p&gt;
</description>
 <category domain="http://www.agile-spain.com/agilev2/tema/experiencias_e_informes">Experiencias e informes</category>
 <pubDate>Mon, 10 Apr 2006 21:51:05 +0000</pubDate>
</item>
<item>
 <title>Peculiaridades de Ruby para desarrolladores Java (parte 2)</title>
 <link>http://www.agile-spain.com/agilev2/peculiaridades_de_ruby_para_desarrolladores_java_parte_2</link>
 <description>&lt;p&gt;Continuando con &lt;a href=&quot;http://www.agile-spain.com/agilev2/peculiaridades_de_Ruby_para_desarrolladores_java&quot;&gt;la entrada anterior&lt;/a&gt; sigo explorando los aspectos de Ruby mas peculiares para un programador que viene del mundo Java.&lt;/p&gt;
&lt;h4&gt;Closures&lt;/h4&gt;
&lt;p&gt;En los artículos de autores relacionados con el mundo de los métodos ágiles es habitual oir hablar de lenguajes que soportan closures. Pues bien, tengo que reconocer que aunque creía haber entendido bien el concepto lo cierto es que al menos no lo había asimilado. Usandolo con Rails por fin lo he conseguido, así que ahí va mi intento de explicar lo que son:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
Un closure puede verse como un bloque de código que se sitúa en paralelo al del método y al que éste puede pasarle el control cuando crea conveniente usando el método &lt;tt&gt;yield()&lt;/tt&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Un ejemplo típico de uso podría ser un método que itera por un árbol y realiza una acción con cada nodo. En Ruby es posible pasar al método (al que llamaremos &lt;tt&gt;iterateTree&lt;/tt&gt;) un fragmento de código que será el que realice la operación sobre el nodo. Por ejemplo, la invocación del método para imprimir cada nodo podría ser:&lt;/p&gt;
&lt;pre&gt;
  tree.iterateTree do |node|
     puts &quot;Iterating node: &quot; + node
  end
&lt;/pre&gt;&lt;p&gt;
El fragmento de código entre &lt;tt&gt;do&lt;/tt&gt; y &lt;tt&gt;end&lt;/tt&gt; recibe el nombre de closure. El método &lt;tt&gt;iterateTree&lt;/tt&gt; invocará el closure usando el método especial &lt;tt&gt;yield&lt;/tt&gt;:&lt;/p&gt;
</description>
 <category domain="http://www.agile-spain.com/agilev2/tema/experiencias_e_informes">Experiencias e informes</category>
 <pubDate>Tue, 04 Apr 2006 12:09:27 +0000</pubDate>
</item>
<item>
 <title>Peculiaridades de Ruby para desarrolladores Java</title>
 <link>http://www.agile-spain.com/agilev2/peculiaridades_de_ruby_para_desarrolladores_java</link>
 <description>&lt;p&gt;Durante estos días en que he estado aprendiendo Ruby y Rails para desarrollar SprintTracker 0.1 me he ido encontrando diferentes elementos de sintaxis que me han sorprendido, confundido o incluso disgustado (al menos inicialmente). He pensado que podía ser buen idea revisarlos porque creo que conociéndolos resulta mucho más fácil entender los fragmentos de código presentados en la mayoría de artículos sobre el tema. Como son bastantes cosas lo voy a dividir en dos entradas del blog. &lt;/p&gt;
&lt;h4&gt;Llaves y paréntesis opcionales&lt;/h4&gt;
&lt;p&gt;En Ruby los paréntesis y las llaves (&lt;tt&gt;()&lt;/tt&gt; y &lt;tt&gt;{}&lt;/tt&gt;) pueden omitirse cuando son obvios. Por ello en Rails es habitual encontrar invocaciones a métodos de la forma:&lt;/p&gt;
&lt;pre&gt;
  nombre_método parametro
&lt;/pre&gt;&lt;p&gt;Que es equivalente a :&lt;/p&gt;
&lt;pre&gt;
  nombre_metodo(parametro)
&lt;/pre&gt;&lt;p&gt;Cuando un mapa (hash) es el último parámetro de un método las llaves pueden ignorarse, así que uniendo esto a lo anterior es habitual encontrarse llamadas a métodos de la forma:&lt;/p&gt;
&lt;pre&gt;
  nombre_metodo primer_parametro, :clave1 =&gt; &quot;valor1&quot;, :clave2 =&gt; &quot;valor2&quot;
&lt;/pre&gt;&lt;p&gt;Que es equivalente a:&lt;/p&gt;
&lt;pre&gt;
  nombre_metodo(primer_parametro, {:clave1 =&gt; &quot;valor1&quot;, :clave2 =&gt; &quot;valor2&quot;})
&lt;/pre&gt;&lt;p&gt;Y que un programador Java escribiría como:&lt;/p&gt;
&lt;pre&gt;
  Map segundoParametro = new HashMap();
  segundoParametro(&quot;clave1&quot;, &quot;valor1&quot;);
  segundoParametro(&quot;clave2&quot;, &quot;valor2&quot;);
  nombreMetodo(primerMarametro, segundoParametro);
</description>
 <category domain="http://www.agile-spain.com/agilev2/tema/experiencias_e_informes">Experiencias e informes</category>
 <pubDate>Sun, 02 Apr 2006 16:22:31 +0000</pubDate>
</item>
<item>
 <title>Publicado SprintTracker v0.1</title>
 <link>http://www.agile-spain.com/agilev2/publicado_sprinttracker_v0_1</link>
 <description>&lt;p&gt;Efectivamente SprintTracker ya está aquí empaquetada y descargable. No esperes que te resulte muy útil aún, claro, es más bien una prueba de concepto. Tras completar la funcionalidad tal y como expliqué en mi &lt;a href=&quot;http://www.agile-spain.com/agilev2/relaciones_entre_entidades_y_validacion_en_rails&quot;&gt;post anterior&lt;/a&gt; sólo queda un lavado de cara visual a la aplicación y empaquetarla para que sea fácil de probar. En la siguiente captura de pantalla puede verse el resultado final, en concreto la pantalla con el listado de proyectos dados de alta:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.agile-spain.com/agilev2/files/sprinttracker-v0.1.png&quot;&gt;&lt;img src=&quot;http://www.agile-spain.com/agilev2/files/sprinttracker-v0.1.png&quot; width=&quot;500&quot;/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Os explico cuales han sido los últimos pasos para crear la versión 0.1:&lt;/p&gt;
&lt;h4&gt;Mejorando el aspecto visual y la navegación&lt;/h4&gt;
&lt;p&gt;Según iba avanzando con el desarrollo de la aplicación me había preocupado bastante poco del aspecto visual de la misma y la navegación entre sus apartados. Simplemente había dejado la apariencia que se crea por defecto al ejecutar el script &lt;tt&gt;scaffold&lt;/tt&gt;. El principal inconveniente de esta es que no hay ningún mecanismo para acceder de unas herramientas a otras (y SprintTracker tiene ya 5). &lt;/p&gt;
&lt;p&gt;Así que lo primero que pensé fue en crear un primer menú. La cuestión es ¿dónde lo pongo? Leyendo uno de los artículos que tenía a mano vi que en Rails las páginas se construyen a partir de tres componentes visuales:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Layout: es el fichero que contiene la estructura de un conjunto de páginas. Se encuentran en la carpeta &lt;tt&gt;views/layouts&lt;/tt&gt;
&lt;li&gt;View: es el fichero que contiene el contenido principal de cada página concreta. Se encuentran en subcarpetas de &lt;tt&gt;views&lt;/tt&gt; con el nombre del controlador asociado a la vista.
&lt;li&gt;Parts: son ficheros incluidos, generalmente desde views usando el método &lt;tt&gt;&amp;lt;% render :partial =&gt; &#039;nombre_del_part&#039; %&gt;&lt;/tt&gt;. Por convenio el primer caracter del nombre del fichero es un subrayado y la extensión es (por ejemplo &lt;tt&gt;_nombre_del_part.rhtml&lt;/tt&gt;). Las parts se encuentran junto a las Views que las incluyen.
&lt;/ol&gt;
&lt;p&gt;Aquí me encontré con el primer problema, para cada una de las herramientas se había generado en la carpeta &lt;tt&gt;view/layouts&lt;/tt&gt; un layout diferente. Eso es un problema, porque si el menú es igual a todos ¿tengo que copiarlo a cada uno de los layouts? Eso viola el principio DRY (Don&#039;t Repeat Yourself) y por tanto no me hacía mucha gracia. Pero rápidamente leí la solución: basta con borrar todos esos layouts y crear una nuevo (copiando el contenido de cualquiera de los otros) llamado &lt;tt&gt;application.rhtml&lt;/tt&gt;. Rails primero mira si hay un layout con el nombre del controlador que se ha invocado y si no lo encuentra busca siempre uno llamado &lt;tt&gt;application.rhtml&lt;/tt&gt;. De esta forma creando este fichero es muy sencillo hacer que todas las páginas del portal tengan la misma apariencia, pero si hay alguna excepción se puede crear un layout para un controlador concreto.&lt;/p&gt;
&lt;p&gt;Una vez determinado el fichero ya podía escribir el código HTML de la cabecera, el menú etc. Lo que quería era:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Crear una apariencia más o menos decente (no soy diseñador, no le puedo pedir peras al olmo) pero muy poco sobrecargada&lt;/li&gt;
&lt;li&gt;Tener el código HTML lo más sencillo posible&lt;/li&gt;
&lt;li&gt;Poder cambiar la apariencia lo más posible usando CSS (para permitir a futuros usuarios de la herramienta adaptarla)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Con estos requisitos en mente me encajaba a la perfección usar el &lt;a href=&quot;http://www.contentwithstyle.co.uk/Articles/17/a-css-framework&quot;&gt;framework CSS&lt;/a&gt; de Mike Stenhouse que ha sido propuesto recientemente. La idea de este framework es proponer una estructura HTML concreta con unos nombres de identificadores y estilos CSS definidos que permitan representar cualquier página web normal. Gracias a las técnicas CSS soportadas a la gran mayoría de los navegadores es posible aplicar toda la apariencia a la página desde fuera del HTML. Este framework ha tenido repercusión en el mundo Java gracias al &lt;a href=&quot;http://raibledesigns.com/page/rd?anchor=css_framework_design_contest&quot;&gt;concurso&lt;/a&gt; propuesto por Matt Raible para crear apariencias para él.&lt;/p&gt;
&lt;p&gt;En resumen, decidí seguir las guías de dicho framework CSS para SprintTracker y viendo los resultados me alegro de ello. Por un lado he perdido mucho menos tiempo de lo habitual maquetando el código HTML y por otro futuros cambios en la apariencia afectarán en la mayoría de los casos sólo al código CSS. En concreto siguiendo las guías de &lt;a href=&quot;http://www.contentwithstyle.co.uk/Articles/12/modular-css/&quot;&gt;CSS modular&lt;/a&gt; del propio Stenhouse he dividido los CSS en componentes. En particular uno de ellos, &lt;tt&gt;_color.css&lt;/tt&gt; contiene todas las definiciones de colores con lo que modificando sólo ese es posible cambiar todos los colores usados por SprintTracker.&lt;/p&gt;
&lt;h4&gt;Empaquetamiento&lt;/h4&gt;
&lt;p&gt;Uno de los aspectos que más me preocupaba cuando pensaba en implementar SprintTracker en Ruby on Rails era la dificultad de distribuirlo para que la gente lo probara. Yo pensaba &quot;&lt;i&gt;Si lo hiciera en Java, cualquiera puede instalar un tomcat y desplegar en él un WAR, o incluso puedo distribuir un tomcat con el WAR desplegado&lt;/i&gt;&quot;. Sin embargo mis temores se han convertido en nuevo reconocimiento hacia la comunidad de Ruby dado que me ha sido posible incluso crear un ejecutable autocontenido con toda la aplicación. ¡Más facilidad imposible!&lt;/p&gt;
&lt;p&gt;Las herramientas que llevan a cabo la magia necesaria son tar2rubyscript y rubyscript2exe. Para instalarlas basta con ejecutar:&lt;/p&gt;
&lt;pre&gt;
$ gem install tar2rubyscript
$ gem install rubyscript2exe
&lt;/pre&gt;&lt;p&gt;Una vez instalados aprendo a usarlas tal y como se explica en el artículo &lt;a href=&quot;http://www.erikveen.dds.nl/distributingrubyapplications/rails.html&quot;&gt;Distributing Rails Applications&lt;/a&gt;. El artículo es bastante nuevo (de hace 10 días) pero tiene bastantes imprecisiones, quizá porque habla de una versión antigua de Rails. En definitiva los que he tenido que hacer es ir al en el que hay un subdirectorio denominado &lt;tt&gt;SprintTracker&lt;/tt&gt; que contiene toda la aplicación y ejecutar:&lt;/p&gt;
&lt;pre&gt;
$ tar2rubyscript SprintTracker
&lt;/pre&gt;&lt;p&gt;Con este comando genero un fichero &lt;tt&gt;SprintTracker.rb&lt;/tt&gt; que contiene toda la aplicación. Basta con tener Ruby instalado para poder ejecutarlo como &lt;tt&gt;ruby SprintTracker.rb&lt;/tt&gt;. Me ha recordado a empaquetar una aplicación java en un jar y ejecutarla como &lt;tt&gt;java -jar app.jar&lt;/tt&gt; sin embargo con aplicaciones J2EE no es tan fácil.&lt;/p&gt;
&lt;p&gt;Pero ruby permite ir un paso más: puede incluirse el propio ruby en el paquete y crear un ejecutable. Basta con ejecutar:&lt;/p&gt;
&lt;pre&gt;
$ rubyscript2exe SprintTracker.rb
&lt;/pre&gt;&lt;p&gt;Como inconveniente valga decir que esta herramienta genera un ejecutable que sólo funciona en la plataforma en la que se empleó. En mi caso para Linux (&lt;tt&gt;SprintTracker_linux&lt;/tt&gt;).&lt;/p&gt;
&lt;p&gt;En la generación de estos ficheros me he encontrado con dos problemas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No se incluía la dependencia con &lt;i&gt;sqlite3&lt;/i&gt; y por tanto fallaba al ejecutarlo en un ordenador que no lo tuviera instalado aparte. Creo que esto ya lo he corregido, pero agradecería al que pudiera probarlo que me lo confirmara.&lt;/li&gt;
&lt;li&gt;No me ha funcionado el sistema para sacar la base de datos fuera del ejecutable. Por ello esta versión 0.1 pierde los datos una vez se cierra. No me preocupa para esta primera versión, pero tenlo en cuenta: ¡no introduzcas datos reales que se van a perder&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Debido a estos problemas de empaquetamiento he decidido marcar a los ficheros que he subido a RubyForge con la versión 0.1beta1. Os invito a todos los que estais siguiendo esta serie a descargarlos y probarlos:&lt;br /&gt;
&lt;p align=&quot;center&quot;&gt;
&lt;a href=&quot;http://rubyforge.org/frs/?group_id=1472&quot;&gt;SprintTracker v0.1&lt;/a&gt;
&lt;/p&gt;
</description>
 <category domain="http://www.agile-spain.com/agilev2/tema/experiencias_e_informes">Experiencias e informes</category>
 <pubDate>Thu, 23 Mar 2006 22:52:54 +0000</pubDate>
</item>
<item>
 <title>Relaciones entre entidades y validación en Rails</title>
 <link>http://www.agile-spain.com/agilev2/relaciones_entre_entidades_y_validacion_en_rails</link>
 <description>&lt;p&gt;Lo prometido es deuda y tal y como comenté en el &lt;a href=&quot;http://www.agile-spain.com/agilev2/gestion_de_usuarios_en_rails_hacia_sprinttracker_v0_1&quot;&gt;post anterior&lt;/a&gt; hoy toca explicar el resto de pasos que me han llevado a implementar la funcionalidad de la primera versión de SprintTracker funcional.&lt;/p&gt;
&lt;p&gt;Estos han consistido en la creación de las herramientas de gestión de Proyectos, Sprints, Tareas y (re)Estimaciones con las oportunas relaciones entre estas entidades. Después he añadido un poco de validación (muy fácil, ya lo verás).&lt;/p&gt;
&lt;h4&gt;Proyectos, Sprints, Tareas y estimaciones&lt;/h4&gt;
&lt;p&gt;En el último post concluía que parece preferible usar la generación de código por script cuando vas a tener que modificar el resultado así que en esta ocasión lo uso directamente. Eso sí, lo primero es crear el modelo de datos. Lo hice en dos pasos en los ficheros &lt;tt&gt;003_add_projects_and_sprints.rb&lt;/tt&gt; y &lt;tt&gt;004_add_tasks_and_estimates.rb&lt;/tt&gt;, creados ejecutando:&lt;/p&gt;
&lt;pre&gt;
$ ruby script/generate migration add_projects_and_sprints
$ ruby script/generate migration add_tasks_and_estimates
&lt;/pre&gt;&lt;p&gt;Muestro la parte más interesante de su contenido (el código de &lt;tt&gt;self.up&lt;/tt&gt;)en ese orden:&lt;/p&gt;
&lt;pre&gt;
    create_table &quot;projects&quot; do |table|
      table.column &quot;name&quot;,:string,:limit=&gt;128
      table.column &quot;description&quot;,:string
    end
    create_table &quot;sprints&quot; do |table|
      table.column &quot;target&quot;,:string
      table.column &quot;start_date&quot;,:date
      table.column &quot;duration&quot;, :int
      table.column &quot;project_id&quot;, :int
    end
&lt;/pre&gt;&lt;br /&gt;
&lt;pre&gt;
    create_table &quot;tasks&quot; do |table|
      table.column &quot;name&quot;,:string,:limit=&gt;256
      table.column &quot;description&quot;,:string
      table.column &quot;user_id&quot;,:int
      table.column &quot;sprint_id&quot;,:int
      table.column &quot;initial_estimate&quot;, :int
      table.column &quot;real_effort&quot;, :int
    end
    create_table &quot;estimates&quot; do |table|
      table.column &quot;reestimation_date&quot;,:date
      table.column &quot;reestimation&quot;, :int
      table.column &quot;task_id&quot;, :int
      table.column &quot;is_going_well&quot;, :int
      table.column &quot;explanation&quot;,:string
    end
&lt;/pre&gt;&lt;p&gt;Es importante fijarse que las claves extranjeras deben seguir un convenio de nombres. Por ejemplo en &lt;tt&gt;estimates&lt;/tt&gt; la columna &lt;tt&gt;task_id&lt;/tt&gt; apunta a &lt;tt&gt;tasks&lt;/tt&gt; y por ello debe llamarse como la tabla a la que apunta en singular seguido de &lt;tt&gt;_id&lt;/tt&gt;.&lt;br /&gt;
Para cada uno de ellos apliqué los cambios a la base de datos con:&lt;/p&gt;
&lt;pre&gt;
$ rake migrate
&lt;/pre&gt;&lt;p&gt;Y ya estamos listos para generar el código:&lt;/p&gt;
&lt;pre&gt;
$ ruby script/generate scaffold Project
$ ruby script/generate scaffold Sprint
$ ruby script/generate scaffold Task
$ ruby script/generate scaffold Estimate
&lt;/pre&gt;&lt;p&gt;Tras ejecutar estos comandos ya tengo el 80% de las herramientas de gestión. Lo primero que queda es establecer las relaciones. &lt;/p&gt;
&lt;h4&gt;Relaciones entre entidades persistidas&lt;/h4&gt;
&lt;p&gt;Tomemos como ejemplo la relación entre Proyectos y Sprints (un proyecto contiene varios sprints, un sprint pertenece a un proyecto). Para declarar esto en Rails basta con escribir lo siguiente:&lt;/p&gt;
&lt;pre&gt;
[project.rb]
class Project &amp;lt; ActiveRecord::Base
  &lt;b&gt;has_many :sprints&lt;/b&gt;
end
&lt;/pre&gt;&lt;br /&gt;
&lt;pre&gt;
[sprint.rb]
class Sprint &amp;lt; ActiveRecord::Base
  &lt;b&gt;belongs_to :project&lt;/b&gt;
end
&lt;/pre&gt;&lt;p&gt;Esto permite navegar de uno a otro usando la notación habitual: &lt;tt&gt;project.sprints&lt;/tt&gt; o &lt;tt&gt;sprint.project&lt;/tt&gt; y Rails se encarga del acceso a base de datos. También proporciona facilidades adicionales opcionales como la obtención de datos a priori (eager). &lt;/p&gt;
&lt;p&gt;En el formulario de los sprints debemos poder elegir uno de los proyectos existentes. Para eso uso el siguiente código:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;p&gt;&amp;lt;label for=&quot;sprint_project_id&quot;&gt;Project&amp;lt;/label&gt;&amp;lt;br&gt;
  &amp;lt;%= select(&quot;sprint&quot;, &quot;project_id&quot;, Project.find_all.collect {|p| [ p.name, p.id ] }) %&gt;
&lt;/p&gt;</description>
 <category domain="http://www.agile-spain.com/agilev2/tema/experiencias_e_informes">Experiencias e informes</category>
 <pubDate>Thu, 23 Mar 2006 11:46:26 +0000</pubDate>
</item>
<item>
 <title>Gestión de usuarios en Rails: hacia SprintTracker v0.1</title>
 <link>http://www.agile-spain.com/agilev2/gestion_de_usuarios_en_rails_hacia_sprinttracker_v0_1</link>
 <description>&lt;p&gt;Ya me hago a la idea de lo que es una aplicación con Rails con suficiente claridad como para embarcarme en la tarea de crear la primera versión de SprintTracker. El objetivo de esta versión es que permita gestionar usuarios y proyectos, crear sprints asociados a proyectos, crear tareas dentro de un sprint y asignárselas a un desarrollador y por último ir añadiendo (re)estimaciones de la tarea durante los días que dura un sprint. La interfaz de usuario no me preocupa por ahora y dejaré la que genere Rails.&lt;/p&gt;
&lt;h4&gt;Primeros pasos&lt;/h4&gt;
&lt;p&gt;En primer lugar me decido probar un IDE específico de Ruby y encuentro RadRails así que digo adios a kate. También me pongo a buscar más artículos de Rails y me encuentro con una recopilación de los &lt;a href=&quot;http://www.digitalmediaminute.com/article/1816/top-ruby-on-rails-tutorials&quot;&gt;12 mejores artículos de Ruby on Rails&lt;/a&gt;. A leer se ha dicho. &lt;/p&gt;
&lt;p&gt;Una de las primeras cosas que se aprende de Rails es obliga a desarrollar de abajo a arriba: es decir empezando por el modelo de datos y llegando hasta la interfaz. Por ello es interesante comenzar la aplicación pensando bien el modelo de datos. El de SprintTracker es este:&lt;br /&gt;
&lt;img align=&quot;center&quot; src=&quot;http://www.agile-spain.com/agilev2/files/erd-1.png&quot;/&gt;&lt;/p&gt;
&lt;h4&gt;Generación de código de persistencia en Rails&lt;/h4&gt;
&lt;p&gt;Rails ofrece dos modelos de generación de código (scaffolding) que podríamos denominar &lt;i&gt;generación dinámica&lt;/i&gt; y &lt;i&gt;generación por script&lt;/i&gt;&lt;/p&gt;
</description>
 <category domain="http://www.agile-spain.com/agilev2/tema/experiencias_e_informes">Experiencias e informes</category>
 <pubDate>Tue, 21 Mar 2006 23:29:40 +0000</pubDate>
</item>
<item>
 <title>Aprendiendo más sobre Rails y Ruby</title>
 <link>http://www.agile-spain.com/agilev2/aprendiendo_mas_sobre_rails_y_ruby</link>
 <description>&lt;p&gt;Tras conseguir &lt;a href=&quot;http://www.agile-spain.com/agilev2/instalando_ruby_y_ruby_on_rails_en_ubuntu&quot;&gt;instalar Ruby on Rails&lt;/a&gt; en la última sesión ha llegado la hora de entrar en materia. Como ya comenté mi idea era partir de los artículos del último número de la revista on-line &lt;a href=&quot;http://ratio.co.uk/objectiveview.html&quot;&gt;ObjectiveView&lt;/a&gt;. Gracias a ellos he conseguido crear mi primera aplicación Ruby on Rails y por el camino también he aprendido mucho más tanto sobre este framework como sobre Ruby. Os cuento como ha sido la experiencia.&lt;/p&gt;
&lt;p&gt;El primer artículo de la revista es sobre Ruby. Lo he leído rápidamente por encima y no me ha entusiasmado aunque si me he quedado con algunas de las peculiaridades de Ruby. En realidad tenía ganas de llegar al artículo &quot;Ruby on Rails&quot; de Obie Fernandez. Todo lo que escribo a continuación te resultará mucho más útil si has seguido, estás siguiendo o piensas seguir próximamente dicho artículo.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Siguiendo el artículo sobre Ruby on Rails&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Siguiendo las instrucciones de los primeros párrafos he creado la aplicación ejecutando:&lt;/p&gt;
&lt;pre&gt;
$ rails sprinttracker 
&lt;/pre&gt;&lt;p&gt;Me ha gustado mucho la idea de que tras ejecutar el comando ya tengo una aplicación ejecutable y a la que puede accederse desde el navegador. Es más fácil y gratificante ir construyendo poco a poco sobre algo que funciona que escribir líneas y líneas que probablemente no funcionarán a la primera ni a la segunda.&lt;/p&gt;
</description>
 <category domain="http://www.agile-spain.com/agilev2/tema/experiencias_e_informes">Experiencias e informes</category>
 <pubDate>Tue, 21 Mar 2006 22:44:05 +0000</pubDate>
</item>
<item>
 <title>Instalando Ruby y Ruby on Rails en Ubuntu</title>
 <link>http://www.agile-spain.com/agilev2/instalando_ruby_y_ruby_on_rails_en_ubuntu</link>
 <description>&lt;p&gt;Ya no me he podido aguantar más. Después de meses escuchando las bondades de &lt;a href=&quot;http://www.rubyonrails.org/&quot;&gt;Ruby on Rails&lt;/a&gt; y en particular para conseguir un ritmo de desarrollo muy ágil me he decidido a probarlo. Llevaba varios días coméntandolo con amigos y compañeros, pero lo que me ha decidido ha sido el encontrar una idea para una aplicación: he pensado en desarrollar un entorno via web para llevar el seguimiento de una iteración con gráfica Burndown incluida. Últimamente estoy usando una hoja de cálculo, con la que estoy muy contento, pero echo de menos varias funcionalidades y el que varias personas puedan acceder a ella simultáneamente. &lt;/p&gt;
&lt;p&gt;En definitiva que esta mañana me he puesto manos a la obra comenzando por instalar Ruby on Rails en mi Ubuntu 5.10. Lamentablemente la cosa no ha sido tan fácil como yo esperaba. Al final lo he instalado de la forma manual. Si no te interesan los problemas que me llevaron a esa decisión sáltate la sección que sigue ya pasa a la siguiente para una explicación rápida de cómo recomiendo proceder después de mi experiencia.&lt;/p&gt;
&lt;h4&gt;Primeros intentos con apt-get&lt;/h4&gt;
&lt;p&gt;Naturalmente lo primero que he hecho es mirar a ver si había paquetes disponibles para instalar con apt-get. Una de cal y una de arena. Ruby está y rails también (aunque una versión algo vieja) pero rubygems no. Primero instalé ruby:&lt;br /&gt;
&lt;code&gt;&lt;/p&gt;
</description>
 <category domain="http://www.agile-spain.com/agilev2/tema/experiencias_e_informes">Experiencias e informes</category>
 <pubDate>Mon, 27 Mar 2006 12:08:57 +0000</pubDate>
</item>
<item>
 <title>Dónde aprender más sobre SCRUM</title>
 <link>http://www.agile-spain.com/agilev2/donde_aprender_mas_sobre_scrum</link>
 <description>&lt;p&gt;Últimamente estamos hablando mucho sobre SCRUM en Agile Spain, pero la verdad es que es bastante más difícil encontrar información sobre esta metodología que sobre otras más conocidas como Extreme Programming. Por ello voy a intentar dar algunas referencias a artículos, páginas web y libros que a mi me ayudaron a aprender sobre SCRUM. En general toda la información está en ingl&amp;eacute;s. Pero primero mi propio resumen: &lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote&gt; SCRUM es una metodología ágil de gestión de proyectos cuyo objetivo primordial es elevar al máximo la productividad de un equipo. Reduce al máximo la burocracia y actividades no orientadas a producir software que funcione y produce resultados en periodos muy breves de tiempo (cada 30 días). Sólo abarca prácticas de gestión sin entrar en las prácticas de desarrollo como puede hacer XP. Más bien delega completamente en el equipo la responsabilidad de decidir la mejor manera de trabajar para ser lo más productivos posibles. Sus raices teóricas están en las teorías de la auto-organización.&lt;br /&gt;   &lt;/blockquote&gt;
 Entrando en las referencias externas, en primer lugar, para los que tengan un buen nivel de entendimiento oral de ingl&amp;eacute;s Ken Shwaber, uno de los padres de la metodología, ofrece unos &lt;a href=&quot;http://www.scrum-master.com/&quot;&gt;vídeos introductorios de SCRUM&lt;/a&gt;. &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Recientemente fue publicado el artículo &lt;a title=&quot;Conventional Software Testing on a Scrum Team&quot; target=&quot;_self&quot; href=&quot;http://www.informit.com/articles/article.asp?p=415981&amp;#038;seqNum=1&quot;&gt;Conventional Software Testing on a Scrum Team&lt;/a&gt; que hace una buena y didáctica introducción a SCRUM y profundiza en la forma de hacer pruebas en este tipo de proyectos.   &lt;/p&gt;
</description>
 <category domain="http://www.agile-spain.com/agilev2/tema/metodologias">Metodologías</category>
 <pubDate>Tue, 15 Nov 2005 20:35:40 +0000</pubDate>
</item>
<item>
 <title>Como transmitir la sensación de avance del equipo</title>
 <link>http://www.agile-spain.com/agilev2/como_transmitir_la_sensacion_de_avance_del_equipo</link>
 <description>&lt;p&gt;Era la primera vez que visitaba el blog de James Shore y me he encontrado con una entrada que me ha llamado mucho la atención.  &lt;/p&gt;&lt;p&gt;Los antecedentes son esos: todos los m&amp;eacute;todos ágiles coinciden combatir las jornadas de trabajo excesivamente largas, reuniones interminables y el exceso de presión en el trabajo. El resultado es que cuando se compara un equipo de trabajo que emplea XP o SCRUM con otros equipos que sufran los efectos anteriores puede parecer que hay una menor implicación de los integrantes del primero. Como consecuencia de esto comentaba Ron Jeffries en la lista de correo de XP que algunos clientes le pedían percibir una mayor &lt;em&gt;sensación de urgencia&lt;/em&gt; en los equipos de desarrollo. Al leer esto he recordado diversas charlas con esc&amp;eacute;pticos de los m&amp;eacute;todos ágiles que hablando sobre sus resultados me hacían comentarios como &lt;em&gt;la gente está demasiado relajada&lt;/em&gt; o &lt;em&gt;a las ocho ya no queda nadie en la oficina&lt;/em&gt;. &lt;/p&gt;&lt;p&gt;A pesar de mi absoluto convencimiento sobre lo negativo de la presión externa y las ventajas de la motivación y la auto-organización siempre me ha quedado una espina clavada: ciertos clientes que no están lo suficientemente cerca del equipo para conocer su avance de primera mano siguen quedándose en ocasiones con una impresión peor que si la gente trabajara muchas horas extra. Algo parecido puede ocurrir con ciertos directivos o gerentes de alto nivel. Y claro está, aunque tu sepas que se está avanzando muy rápido puede ser un problema que la percepción externa sea distinta &amp;iquest;puede evitarse esto? &lt;/p&gt;
</description>
 <category domain="http://www.agile-spain.com/agilev2/tema/comunicacion">Comunicación</category>
 <pubDate>Wed, 14 Dec 2005 18:51:17 +0000</pubDate>
</item>
<item>
 <title>Presentación del Blog de Jorge Ferrer</title>
 <link>http://www.agile-spain.com/agilev2/presentacion_del_blog_de_jorge_ferrer</link>
 <description>&lt;p&gt;Como primera entrada del Blog, que menos que presentarme. Mi nombre es Jorge y actualmente trabajo en Germinus XXI, en concreto en el departamento de desarrollo de software.&lt;/p&gt;
&lt;p&gt;Los últimos 4 años he tenido la oportunidad de aplicar un gran número de prácticas ágiles en diferentes proyectos. En general con bastante éxito, pero también con algún traspies. En esta bitácora pretendo compartir estas experiencias pasadas y las que seguro vendrán en el futuro. &lt;/p&gt;
&lt;p&gt;Entre los temas que podreis encontrar estarán la gestión de requisitos ágil, la planificación colaborativa y constante, la relación entre métodos ágiles y los métodos de desarrollo de software libre y la aplicación de Desarrollo Dirigido por Pruebas (TDD). Estaré encantado de que me leais y aporteis vuestros comentarios.&lt;/p&gt;
</description>
 <pubDate>Mon, 24 Oct 2005 12:27:57 +0000</pubDate>
</item>
</channel>
</rss>
