<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Gabriel Ortuño]]></title>
  <link href="http://arctarus.com/atom.xml" rel="self"/>
  <link href="http://arctarus.com/"/>
  <updated>2016-06-21T10:55:00+00:00</updated>
  <id>http://arctarus.com/</id>
  <author>
    <name><![CDATA[Gabriel Ortuño]]></name>
    <email><![CDATA[arctarusnet@gmail.com]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Mi charla en Madrid.rb sobre Refactoring]]></title>
    <link href="http://arctarus.com/blog/2012/10/28/mi-charla-en-madridrb-sobre-refactoring/"/>
    <updated>2012-10-28T00:00:00+00:00</updated>
    <id>http://arctarus.com/blog/2012/10/28/mi-charla-en-madridrb-sobre-refactoring</id>
    <content type="html"><![CDATA[<p>El pasado jueves hice mi primera charla en Madrid.rb. El tema que traté fue la refactorización de código, punto importante si queremos que nuestras aplicaciones se mantengan sanas y fuertes con el paso del tiempo y las nuevas funcionalidades. Está basada en el libro de Martin Fowler titulado <a href="http://www.amazon.com/Refactoring-Improving-Design-Existing-Code/dp/0201485672">Refactoring: Improving the Design of Existing Code</a> y además de una introducción y unas pequeñas conclusiones, hay un ejemplo de refactorización que puede servir a aquellos que se inician en el tema para comprender la mecánica que se sigue durante el proceso de refactorización.</p>

<p>Para el que pueda interesarle dejo aquí las transparencias que hice:
<br/></p>

<script async class="speakerdeck-embed" data-id="508a5734a820520002026ed8" data-ratio="1.3333333333333333" src="//speakerdeck.com/assets/embed.js"></script>


<p><br/>
<br/></p>

<p>Y el vídeo de la charla grabado por <a href="https://madridrb.jottit.com/">Madrid.rb</a>:</p>

<iframe src="http://player.vimeo.com/video/52987852?badge=0" width="500" height="281" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>


<p> <p><a href="http://vimeo.com/52987852">Making code tastier through refactoring</a> from <a href="http://vimeo.com/madridrb">Madrid.rb</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<br/></p>

<p>Algunos libros que se pueden consultar sobre el tema son:</p>

<ul>
<li><a href="http://www.amazon.com/Refactoring-Patterns-Joshua-Kerievsky/dp/0321213351/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1351456510&amp;sr=1-1&amp;keywords=Refactoring+to+Patterns+-+Joshua+Kerievsky">Refactoring to Patterns - Joshua Kerievsky</a></li>
<li><a href="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1351456587&amp;sr=1-1&amp;keywords=Clean+Code+-+Robert+C.+Martin">Clean Code - Robert C. Martin</a></li>
<li><a href="http://www.amazon.com/Design-Patterns-Ruby-Russ-Olsen/dp/0321490452/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1351456646&amp;sr=1-1&amp;keywords=Design+Patterns+in+Ruby+-+Russ+Olsen">Design Patterns in Ruby - Russ Olsen</a></li>
<li><a href="http://sourcemaking.com/refactoring">Source Making</a></li>
</ul>


<p>Y algunas herramientas interesantes:</p>

<ul>
<li><a href="https://github.com/troessner/reek">Reek - Code Smell Detector for ruby</a></li>
<li><a href="http://rails-bestpractices.com">Rails Best Practices</a></li>
<li><a href="http://codeclimate.com">Code Climate</a></li>
<li><a href="https://github.com/ecomba/vim-ruby-refactoring">Ruby Refactoring Tool for Vim</a></li>
</ul>


<p>Si estuviste allí por favor <a href="http://speakerrate.com/talks/17991-making-tastier-code-through-refactoring">puntúa</a> esta charla:
<br/></p>

<script src="http://speakerrate.com/talks/17991/widget.js" id="speakerrate-widget-17991"></script>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Primera edición de Spain.js]]></title>
    <link href="http://arctarus.com/blog/2012/06/06/primera-edicion-de-spain-js/"/>
    <updated>2012-06-06T00:00:00+00:00</updated>
    <id>http://arctarus.com/blog/2012/06/06/primera-edicion-de-spain-js</id>
    <content type="html"><![CDATA[<p><a title="Spain.js - A summer javascript conference in Madrid" href="http://spainjs.org" style="margin-left:1em;" class="alignright" style="margin-left:1em">
  <img title="header_spain" src="http://arctarus.files.wordpress.com/2012/06/header_spain.jpg?w=286" alt="" width="286" height="300" />
</a></p>

<p>La primera edición de la Conferencia Internacional de JavaScript, <a title="Spain.js - A summer javascript conference in Madrid" href="http://spainjs.org" target="_blank">Spain.js</a>, tendrá lugar los días 5, 6 y 7 de Julio en Madrid.</p>




<p>En ella podremos disfrutar de desarrolladores tan destacados como <a href="http://ashkenas.com/" target="_blank">Jeremy Ashkenas</a> (creador de <a href="http://coffeescript.org/" target="_blank">CoffeeScript</a> y <a href="http://backbonejs.org/" target="_blank">Backbone.js</a>), <a href="http://alexmaccaw.com/" target="_blank">Alex MacCaw</a> (creador de <a href="http://spinejs.com/" target="_blank">Spine.js</a>), <a href="https://twitter.com/#!/tanoku" target="_blank">Vicent Martí</a> (Github) y <a href="http://dribbble.com/karolinaszczur" target="_blank">Karolina Szczur</a> (Nodejistsu) entre otros muchos.</p>




<p>El objetivo del evento es dar un empuje a un lenguaje que siempre ha tenido una consideración menor para los programadores, pero que cada vez está más presente en nuestro día a día.</p>




<p>¡Espero veros allí!</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Conferencia Rails 2011]]></title>
    <link href="http://arctarus.com/blog/2011/06/23/conferencia-rails-2011/"/>
    <updated>2011-06-23T00:00:00+00:00</updated>
    <id>http://arctarus.com/blog/2011/06/23/conferencia-rails-2011</id>
    <content type="html"><![CDATA[<p><a href="http://conferenciarails.org" class="alignright" style="margin-left:1em">
<img src="http://conferenciarails.org/images/badges/im_attending_aside.png" alt="I'm Attending Conferencia Rails 2011" width="200" height="180" /></a></p>

<p>Otro año más se vuelve a celebrar en Madrid la <a href="http://conferenciarails.org/">Conferencia Rails</a>, encuentro anual de desarrolladores y empresas alrededor de Ruby on Rails, y este año vuelve más internacional que nunca con speakers tan destacados como Sven Fuchs, Paolo Perrota, Simon Tokumine, Nicolás Sanguinetti,.. y viejos conocidos como Javier Ramírez o Sergio Gil.</p>




<p>Si estás interesados en temas como la programación web, la integración continua, programación para dispositivos móviles, Node.js, Backbone.js, CoffeeScript... Te esperamos del 13 al 15 de Julio en el Retiro.</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Build Less]]></title>
    <link href="http://arctarus.com/blog/2011/06/03/build-less/"/>
    <updated>2011-06-03T00:00:00+00:00</updated>
    <id>http://arctarus.com/blog/2011/06/03/build-less</id>
    <content type="html"><![CDATA[<p>So what to do then? The answer is less. Do less than your competitors to beat them. Solve the simple problems and leave the hairy, difficult, nasty problems to everyone else. Instead of oneupping, try one-downing. Instead of outdoing,
try underdoing.</p>




<ul>
  <li>Less features</li>
  <li>Less options/preferences</li>
  <li>Less people and corporate structure</li>
  <li>Less meetings and abstractions</li>
  <li>Less promises</li>
</ul>




<p><a title="Getting Real - Build Less" href="http://gettingreal.37signals.com/ch02_Build_Less.php">37 Signals - Getting Real: Build Less</a></p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Siendo más productivo con Scrum]]></title>
    <link href="http://arctarus.com/blog/2011/05/26/siendo-mas-productivo-con-scrum/"/>
    <updated>2011-05-26T00:00:00+00:00</updated>
    <id>http://arctarus.com/blog/2011/05/26/siendo-mas-productivo-con-scrum</id>
    <content type="html"><![CDATA[<p>Scrum es una metodología de desarrollo de software enmarcada dentro de las metodologías ágiles y que propone un ciclo iterativo e incremental. Pero, ¿Qué son las metodologías de desarrollo ágiles?</p>

<p>Las metodologías ágiles se basan en 4 principios fundamentales recogidos en el <a title="Manifiesto Ágil" href="http://agilemanifesto.org/iso/es/">manifiesto ágil</a>.</p>

<ul>
    <li><strong>Individuos e interacciones</strong> sobre procesos y herramientas.</li>
    <li><strong>Software funcionando</strong> sobre documentación extensiva.</li>
    <li><strong>Colaboración con el cliente</strong> sobre negociación contractual.</li>
    <li><strong>Respuesta ante el cambio</strong> sobre seguir un plan.</li>
</ul>


<p>Scrum toma esos principios y propone los siguiente:</p>

<ul>
    <li>Divide las tareas en pequeños incrementos con una planificación mínima.</li>
    <li>Estos incrementos son llamados Sprints y suelen durar entre 2 semanas y 1 mes.</li>
    <li>Pone énfasis en la comunicación cara a cara.</li>
    <li>Los equipos son multidisciplinares y auto-organizados de entre 5 y 9 personas.</li>
    <li>El software funcional es la primera medida de progreso.</li>
    <li>Se realizan periódicamente entregas del producto, lo que permite:
<ul>
    <li>Evaluar el trabajo realizado.</li>
    <li>Advertir sobre problemas que se detecten.</li>
    <li>Sugerir mejoras.</li>
</ul>
</li>
</ul>


<p>Existen 2 tipos de roles: cerdos y gallinas.</p>

<p><a href="http://arctarus.files.wordpress.com/2011/05/cerdos-gallinas.jpg"><img class="aligncenter size-full wp-image-466" title="cerdos-gallinas" src="http://arctarus.files.wordpress.com/2011/05/cerdos-gallinas.jpg" alt="" width="500" height="176" /></a></p>

<p>Los cerdos son aquellos roles que están comprometidos directamente en el desarrollo del producto:</p>

<ol>
    <li><strong>Product Manager</strong>: Representa a la voz de cliente. Escribe y prioriza las historias de usuario.</li>
    <li><strong>Scrum Master</strong>: Su trabajo es eliminar los problemas que impiden que el equipo alcance el objetivo del Sprint.</li>
    <li><strong>Scrum Team</strong>: Responsables de la entrega del producto. El equipo debe reunir todas las habilidades necesarias para el éxito del proyecto.</li>
</ol>


<p>Las gallinas son todos aquellos que aunque están involucrados en el desarrollo del proyecto, no está comprometidos, es decir, no forman parte directa del scrum. Este grupo está formado por usuarios, clientes y managers.</p>

<p>Por otro lado, scrum propone una serie de <em>artefactos</em> que nos permiten gestionar las tareas y tener más control sobre lo que está pasando en cada momento del Sprint.</p>

<p><strong>Product Backlog</strong>
Es una lista de requisitos priorizados, con estimaciones que son recogidos por el Product Manager en colaboración con el cliente. Normalmente estos requisitos son escritos en forma de historias de usuarios y deben ser lo más detalladas posibles para ayudar en la medida de lo posible ha realizar las estimaciones. Esta lista debe ser revisada con frecuencia con objeto de ajustar prioridades, estimaciones y re-priorizar las historias de usuarios.</p>

<p><strong>Sprint Backlog</strong>
El Sprint Backlog agrupa las tareas que se han seleccionado al inicio de la iteración del Product Backlog para ser desarrolladas durante la siguiente iteración. Las tareas deben ser más detalladas y las estimaciones más aproximadas. Ninguna tarea debe durar más de dos jornadas de trabajo, en ese caso debe dividirse en varias tareas más concretas.</p>

<p><strong>Burn Down</strong>
Es una gráfica que muestra el avance del equipo en el desarrollo de la iteración. En el eje Y se encuentras los puntos de historia a realizar durante la iteración, y el eje X los días disponibles. Cada día se va trazando una línea desde arriba a la izquierda hasta abajo a la derecha donde se podrá ver el trabajo restante. Un <a href="http://es.wikipedia.org/wiki/Archivo:EjemploDeDiagramaBurnDown.png">ejemplo de burn down</a> lo podemos ver en la wikipedia.</p>

<p><strong>Tablón de Scrum</strong>
Es un poster, normalmente dividido en 3 o 4 columnas que nos permite de un simple vistazo saber en qué estado se encuentra la iteración. En la primera columna (ToDo) se agrupan las tareas que quedan por hacer, En la segunda las que se están desarrollando en ese momento (WIP: Work In Progress) y en la tercera las tareas terminadas (Done). En la cuarta podemos poner nuestro Burn down y las tareas imprevistas o impedimentos.</p>

<p>Finalmente, para reforzar la comunicación cara a cara del equipo, scrum propone 4 tipos de reuniones o ceremonias.</p>

<p><strong>Planificación de Scrum</strong>
Esta reunión se realiza al comienzo de una iteración y en ella el equipo debe seleccionar del Product Backlog las tareas que se realizaran en el siguiente Sprint y añadirlas al Sprint Backlog. Las tareas deben seleccionarse en función de su prioridad y el valor que aporten al negocio y posteriomente estimarlas para intentar predecir cuanto trabajo será posible sacar adelante en la siguiente iteración.</p>

<p><strong>Daily Scrum</strong>
Se realiza todos los días a la misma hora en el mismo lugar y todos los miembros del equipo deben permanecer de pie durante el tiempo que dure la reunión que no debe sobre pasar los 15 min. Pueden asistir todas las personas involucradas pero sólo pueden hablar los <em>cerdos</em>. Durante la reunión el Scrum Master pregunta a cada miembro del equipo qué hizo durante el día anterior, qué va a hacer ese día y si ha tenido algún impedimento para alcanzar su objetivo.</p>

<p><strong>Revisión de Sprint</strong>
En las reuniones de revisión de Sprint se revisa el trabajo planificado y se presenta a los interesados en forma de demo.</p>

<p><strong>Retrospectiva</strong>
Al final de cada iteración el equipo de trabajo se reúnen para discutir sus impresiones sobre el Sprint anterior y para proponer mejoras que puedan aumentar el rendimiento del equipo.</p>

<p>Además de todo lo anterior existen otra serie de herramientas que un equipo de desarrollo ágil pueden incorporar para mejorar su productividad. Las habituales suelen ser:</p>

<ul>
    <li>Test Driven Development.</li>
    <li>Test de aceptación.</li>
    <li>Integración Continua.</li>
    <li>Refactoring.</li>
    <li>Pair Programming.</li>
</ul>


<p>Al final lo más importante es encontrar la metodología con la que el equipo se encuentre más cómodo y que les permita ser más productivos, realizar el máximo número de tareas posible y ser capaces de corregir errores e incorporar cambios durante el desarrollo del producto, para que finalmente el cliente obtenga el producto que mejor se ajuste a sus necesidades.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Extendiendo FormBuilder para añadir nuevos helpers personalizados]]></title>
    <link href="http://arctarus.com/blog/2011/03/01/extendiendo-formbuilder-para-anadir-nuevos-helpers-personalizados/"/>
    <updated>2011-03-01T00:00:00+00:00</updated>
    <id>http://arctarus.com/blog/2011/03/01/extendiendo-formbuilder-para-anadir-nuevos-helpers-personalizados</id>
    <content type="html"><![CDATA[<p>A la hora de hacer nuevos formularios en rails siempre había echado de menos algún helper que te ayudara a incluir los típicos mensajes de error junto al campo al que se refieren para contextualizar cada uno de los mensajes, en lugar de que aparezcan todos listados en la cabecera del formulario.</p>

<p>La idea fundamental de lo que pretendía conseguir es la siguiente:
<a href="http://arctarus.files.wordpress.com/2011/03/form_error1.png"><img class="aligncenter size-full wp-image-429" title="ejemplo de errores en campos de formulario" src="http://arctarus.files.wordpress.com/2011/03/form_error1.png" alt="ejemplo de errores en campos de formulario" width="560" height="251" /></a></p>

<p>Todo esto usando para ello un helper de FormBuilder para que el objeto concreto quede implícito y que el código resultante (en haml) nos quede como el siguiente:</p>

<pre style="overflow:auto;">= form_for @user do |form|
   .field
      = form.label :name
      = form.error :p, :name
      = form.text:field :name</pre>


<p>El primer parámetro indica el tag html que queremos usar como contenedor del error, y el segundo en atributo del modelo que debemos comprobar. Además, al tag contenedor le añadiremos la clase "error" de css para luego poder darle algunos estilos.</p>

<p>Tras dar algunas vueltas googleando me dí cuenta de que crear un nuevo helper no era tarea demasiado complicada, así que le eché un ojo a <a href="https://github.com/rails/rails/blob/master/actionpack/lib/action_view/helpers/form_helper.rb">FormHelper</a> y observé que está dividido en tres partes principales:</p>

<ol>
    <li>El modulo FormHelper, que encapsula a todos los helpers de formularios.</li>
    <li>La clase FormBuilder, que es el resultado de usar el helper form_for y que contiene una instancia del objeto al que se refiere el formulario. Tiene métodos internos con el mismo nombre que los helpers que hacen uso de estos.</li>
    <li>La clase InstanceTag, que  es la encargada de generar el código para cada uno de los tags html. Es llamada desde los helpers.</li>
</ol>


<p>Finalmente, adaptando un poco el código de otros helpers en el mismo fichero, el resultado fue:</p>

<pre style="overflow:auto;">module ActionView
  module Helpers
    module FormHelper
      def error(object_name, tag_name, method, options = {})
        InstanceTag.new(object_name, method, self, options.delete(:object)).to_error_tag(tag_name)
      end
    end

    class InstanceTag
      def to_error_tag(tag_name)
        unless @object.errors[@method_name].blank?
          content_tag tag_name, @object.errors[@method_name].first, :class =&gt; :error
        end
      end
    end

    class FormBuilder
      def error(tag_name, method, options = {})
        @template.error(@object_name, tag_name, method, objectify_options(options))
      end
    end
  end
end</pre>


<p>Que también se puede ver en <a title="extendiendo FormBuilder para añadir helpers personalizados" href="https://gist.github.com/849052">su gist correspondiente</a>.</p>

<p>&nbsp;</p>

<p><strong>Actualización 22 de Marzo de 2011:</strong></p>

<p>Otra forma de <a href="http://guides.rubyonrails.org/active_record_validations_callbacks.html#customizing-the-error-messages-html">personalizar los mensajes de error de los formularios en rails</a>, que acabo de ver en la guía de rails y que ya no recordaba, es usando ActionView::Base.field_error_proc. Simplemente se necesita asignarle un nuevo Proc que reciba el tag html y una instancia del modelo y listo. Podemos devolver lo que deseemos.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[HTML5 & CSS3]]></title>
    <link href="http://arctarus.com/blog/2011/02/18/html5-css3/"/>
    <updated>2011-02-18T00:00:00+00:00</updated>
    <id>http://arctarus.com/blog/2011/02/18/html5-css3</id>
    <content type="html"><![CDATA[<p>En estos momentos en los que <a href="http://people.mozilla.com/~prouget/ie9/">los fabricantes de navegadores compiten</a> para ver cuál <a href="http://blogs.msdn.com/b/tims/archive/2011/02/15/a-modern-browser.aspx">es el más "moderno"</a> y que cada vez parece que tenemos más cerca la publicación del <a title="An HTML5 Logo" href="http://www.w3.org/QA/2011/01/an_html5_logo.html">nuevo estándar de html</a> los desarrolladores web debemos ponernos al día y comenzar a implementar los nuevos estándares en nuestras webs. Para ello es importante tener a mano algunas <a href="http://diveintohtml5.org">buenas guías</a>, <a title="conoce html5 y css3" href="http://www.slideshare.net/Martulina/conoce-html5-y-css3-6893390">presentaciones</a> y algún libro que nos ayuden a mejorar nuestras webs mientras siguen funcionando en los navegadores más antiguos (lease IE6).</p>

<p><a href="http://arctarus.files.wordpress.com/2011/02/bhh5.jpg"><img class="alignright size-full wp-image-377" title="bhh5" src="http://arctarus.files.wordpress.com/2011/02/bhh5.jpg" alt="" width="190" height="228" /></a><a href="http://pragprog.com/titles/bhh5/html5-and-css3">HTML5 and CSS3</a> de <a href="http://www.bphogan.com/">Brian P. Hogan</a> hace un recorrido por el nuevo estándar dando para cada caso ejemplos de uso y soluciones alternativas (normalmente basadas en <a href="http://jquery.com/">jQuery</a>) que nos permitan usarlas en navegadores que actualmente no tienen suporte para ellas.</p>

<p>Haciendo un repaso rápido de los temas que se tocan en el libro y que forman parte de HTML5:</p>

<p><strong>Nuevos elementos estructurales</strong>: Para hacer nuestros documentos más semánticos se han incorporado muchas etiquetas nuevas y se han eliminado muchas otras que aún seguían haciendo referencia a presentación. Algunas de estas nuevas etiquetas son header, footer, nav, section, article.</p>

<p><strong>Web forms</strong>: Una de mis partes preferidas son los nuevos campos para formularios que nos van a ahorrar gran cantidad de javascript y nos va a permitir crear formularios muy complejos de una manera muy sencilla. Algunos de los nuevos elementos son: email, search, slider(type=range), date, color, number. Además se han añadido attributos muy interesantes como placeholder, autofocus y contenteditable.</p>

<p><strong>CSS3</strong>: Para permitirnos mejorar visualmente nuestras webs sin necesidad de añadir clases o ids a cada elemento se han añadido montones de selectores y pseudo-selectores, entre ellos destacaría :nth-child(n) que nos permite crear tablas cebreadas sin necesidad de añadir las típicas clases <em>odd</em> y <em>even</em>.</p>

<p><strong>Canvas</strong>: Nos permite crear imágenes complejas o gráficos programaticamente con javascript y sin necesidad de liberías externas como Flash.</p>

<p><strong>Audio y video</strong>: Una de las características más conocidas es la inclusión de las etiquetas para audio y video que nos darán soporte nativo en el navegador, después, por supuesto, de que se resuelva la<a title="Chrome abandona el formato H.264 para vídeos" href="http://www.elpais.com/articulo/tecnologia/Chrome/abandona/formato/H/264/videos/elpeputec/20110112elpeputec_4/Tes"> batalla sobre formatos</a> que hay abierta entre los distintos navegadores.</p>

<p><strong>Eye Candy</strong> (border-radius, shadows, gradients y transformations): Por supuesto, también se hablan de las nuevas propiedades de CSS que nos va a permitir crear bordes redondeados, sombras, gradientes y mucho más sin necesidad de añadir imágenes como fondos.</p>

<p>Por otro lado, se encuentran algunas API's javascript que aunque no pertenecen directamente al estándar, está asociadas al él y que habrá que tener en cuenta en el futuro. Las más destacadas son:</p>

<p><strong>Local Storage</strong>: Que nos permite guardar cosas como la configuración de la aplicación sin necesidad de usar para ello cookies.</p>

<p><strong>Session Storage</strong>: Que permite guardar datos en el navegador que se borran automáticamente al cerrar la sesión.</p>

<p><strong>Web SQL databases</strong>: Bases de datos relacionales asociadas a un dominio y persistente entre sesiones.</p>

<p><strong>Offline applications</strong>: Permite definir archivos que deben ser cacheados para que la aplicación pueda ejecutarse sin necesidad de conexión a internet.</p>

<p><strong>History</strong>: Permite manejar el historial del navegador.</p>

<p><strong>Cross-documents messages</strong>: Nos da la posibilidad de enviar mensajes entre ventanas con contenido cargado desde diferentes dominios.</p>

<p><strong>Websockets</strong>: Crean una conexión con estado entre un navegador y un servidor.</p>

<p><strong>Geolocation</strong>: Permite obtener la latitud y la longitud de un navegador web.</p>

<p>Por otro lado, existen otro montón de tecnologías que aún no se encuentran suficientemente maduras para usar en ningún navegador y por las cuales todavía tendremos que esperar un tiempo. Entre ellas se encuentran las siguientes:</p>

<p><strong>CSS3 Transitions</strong>: Animaciones sobre interacciones directamente en CSS.<strong>
</strong></p>

<p><a href="http://arctarus.wordpress.com/2009/07/12/web-workers/"><strong>WebWorkers</strong></a>: Ejecución de javascript en segundo plano.<strong>
</strong></p>

<p><strong>3D canvas con WebGL</strong>: Creación de imágenes 3D sobre el objeto canvas.</p>

<p><strong>IndexedDB</strong>: Bases de datos de tipo clave/valor en el navegador similares a las NoSQL.</p>

<p><strong>Drag &amp; Drop</strong>: Api para arrastrar y soltar elementos entre el sistema operativo y el navegador.</p>

<p><strong>Client-side form validations</strong>: Validaciones de formularios en el navegador sin usar javascript.</p>

<p>En resumen, nos esperan unos años muy prometedores en lo que ha desarrollo web se refiere con montones de tecnologías nuevas que vienen a facilitarnos el trabajo y a abrirnos un montón de posibilidades nuevas. Creo que es importante que comencemos a usar esas tecnologías desde ya para que los usuarios más avanzados puedan comenzar a beneficiarse de ellas, sin dejar de lado a los usuarios de navegadores sin soporte, y para que cuando llegue el resto de usuarios todas esas tecnologías se encuentren maduras y todos podamos disfrutar de una web mejor.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[¿Qué hace a un buen programador?]]></title>
    <link href="http://arctarus.com/blog/2011/02/11/que-hace-a-un-buen-programador/"/>
    <updated>2011-02-11T00:00:00+00:00</updated>
    <id>http://arctarus.com/blog/2011/02/11/que-hace-a-un-buen-programador</id>
    <content type="html"><![CDATA[<p>Pensando sobre las cualidades que debe tener un buen programador, y para que se me quede bien grabado, según <a title="Andy Hunt Blog" href="http://blog.toolshed.com/">Andrew Hunt</a> y <a title="Dave Thomas Blog" href="http://pragdave.pragprog.com/pragdave/">David Thomas</a> en su libro <a href="http://en.wikipedia.org/wiki/The_Pragmatic_Programmer">The pragmatic programer</a>, todos los programadores deben compartir las siguientes cualidades.</p>

<p><strong>adoptador precoz / adaptador veloz</strong>: Instinto para probar nuevas tecnologías y técnicas, y para adaptarlas rápidamente al resto de su conocimiento.</p>

<p><strong>inquisitivo</strong>: Tendencia a preguntarse cómo funcionan las cosas, lo que puede afectar a sus decisiones futuras.</p>

<p><strong>pensador crítico</strong>: Siempre se pregunta por qué las cosas se hacen cómo se hacen y rara vez se conforma con aceptarlas tal cual.</p>

<p><strong>realista</strong>: Intenta entender la naturaleza de cada problema al que se enfrenta, lo que le permite afrontar los problemas sabiendo cómo de dificiles y cuánto tiempo pueden tomar.</p>

<p><strong>hombre orquesta</strong>: Se interesa por un amplio espectro de tecnologías, y aunque su trabajo requiera ser un especialista, siempre será capaz de afrontar nuevos retos.</p>

<p>Todas estas características no serían nada sin la más importante.</p>

<p style="text-align:center;"><strong>Piensa en tu trabajo</strong></p>


<p>Para completar la lista dejo la guía para programadores pragmáticos que se encuentra al final del libro <a href="http://www.codinghorror.com/blog/files/Pragmatic%20Quick%20Reference.htm">Referencia rápida para desarrolladores pragmaticos</a>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The RSpec Book 2]]></title>
    <link href="http://arctarus.com/blog/2011/02/01/the-rspec-book-2/"/>
    <updated>2011-02-01T00:00:00+00:00</updated>
    <id>http://arctarus.com/blog/2011/02/01/the-rspec-book-2</id>
    <content type="html"><![CDATA[<p>Con motivo de la reciente publicación de <a href="https://github.com/rspec">RSpec 2</a> y la correspondiente reedición de <a href="http://www.pragprog.com/titles/achbd/the-rspec-book">The RSpec Book</a> de <a href="http://davidchelimsky.net/">David Chelimsky</a>, estos días he estado repansando un poco de <a href="http://en.wikipedia.org/wiki/Behavior_Driven_Development">Behaviour Driven Development</a> o BDD.</p>

<p><a title="The RSpec Book" href="http://www.pragprog.com/titles/achbd/the-rspec-book"><img class="alignright size-full wp-image-306" title="The RSpec Book" src="http://arctarus.files.wordpress.com/2011/02/the-rspec-book.jpg" alt="The RSpec Book: Behaviour-Driven Development with RSpec, Cucumber, and Friends" width="190" height="228" /></a></p>

<p>El libro está dividido en 5 partes fundamentales.</p>

<p>En primer lugar un ejemplo práctico de uso de RSpec y <a href="http://cukes.info">Cucumber</a> en el que se desarrolla un pequeño juego llamado Codebreaker, donde el usuario debe adivinar un número secreto, y que nos familiariza con el ciclo básico del BDD: red, green, refactor.</p>

<p>La segunda parte está dedicada exclusivamente al BDD, y se centra en explicar por qué los proyectos tradicionales fallan y qué aporta dicha metodología para evitar esos errores.</p>

<p>La tercera parte nos introduce en RSpec y da un repaso completo a la librería: cómo definer expects, el uso de mocks y stubs para aislar cada test y por último cómo extenderla a través de macros o custom matchers entre otros.</p>

<p>La cuarta parte se centra en Cucumber y en cómo escribir requisitos usando <a href="https://github.com/aslakhellesoy/cucumber/wiki/Gherkin">Gherkin</a>, cómo definir escenarios y cómo implementar cada uno de los pasos. Sin embargo, he de confesar que este apartado me lo leí un poco más por encima ya que en <a href="http://qoolife.com">Qoolife</a> hemos reemplazado Cucumber por <a href="https://github.com/cavalle/steak">Steak</a> para hacer los test de aceptación. La razón fundamental es que ya que el producto lo estamos desarrollando en casa, y que todos los que vamos a escribir / leer las historias de usuarios conocemos ruby, eliminamos la capa de definición de los requisitos en lenguaje natural y pasamos directamente a implementarlas usando RSpec y <a href="https://github.com/jnicklas/capybara">Capybara</a>.</p>

<p>En la quinta y última parte se hace un repaso a la integración con rails, desde la definición de features, pasando por distintas opciones que existe para simular el navegador usando Webrat y Selenium y acabando en cada una de las capas del MVC: vista, controlador y finalmente los modelos.</p>

<p>En resumen, un libro muy recomendable para todos aquellos interesados en ponerse al día en lo que a Behaviour Driven Development se refiere, y para los que deseen utilizar RSpec y/o Cucumber como herramienta de testing en particular.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Teambox publica su versión 3.0]]></title>
    <link href="http://arctarus.com/blog/2011/01/20/teambox-publica-su-version-3-0/"/>
    <updated>2011-01-20T00:00:00+00:00</updated>
    <id>http://arctarus.com/blog/2011/01/20/teambox-publica-su-version-3-0</id>
    <content type="html"><![CDATA[<p>Para quienes no lo conozcan, <a title="Teambox - Collaboration Software" href="https://teambox.com/">Teambox</a> es un proyecto de software libre español liderado por <a href="https://teambox.com/about">Pablo Villalba</a> basado en <a title="Web development that doesn't hurt" href="http://rubyonrails.org/">Ruby On Rails</a> que trata de desbancar como gestor de proyectos a otras aplicaciones tan conocidas internacionalmente como <a href="http://basecamphq.com/">Basecamp</a> o <a href="http://www.redmine.org/">Redmine</a>. Ya ha recibido <a href="http://lifehacker.com/5734265/top-10-clever-uses-for-the-cloud?skyline=true&amp;s=i">numerosos reconocimientos</a> por la crítica especializada y para mi representa un ejemplo de como en España también tenemos profesionales del más alto nivel capaces de competir internacionalmente.</p>

<p style="text-align:left;">Ayer <a href="http://blog.teambox.com/about-to-deploy-teambox3">publicaron su versión 3.0</a> y entre las novedades más destacadas se encuentran la actualización de la plataforma a la versión 3.0 de Ruby On Rails, lo que les permitirá usar los desarrollos más novedosos de la vibrante comunidad rails; y la renovación de la navegación de la aplicación que toma más protagonismo situándose a la derecha de la pantalla.</p>


<p style="text-align:center;"><a href="http://arctarus.files.wordpress.com/2011/01/pantallazo1.png"><a href="http://arctarus.files.wordpress.com/2011/01/pantallazo-1.png"><img class="aligncenter size-full wp-image-301" title="Teambox 3.0" src="http://arctarus.files.wordpress.com/2011/01/pantallazo-1.png" alt="" width="500" height="320" /></a>
</a></p>


<p style="text-align:left;">Muchas felicidades al equipo de Teambox y gracias por esta gran aplicación.</p>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[rezets.com ve la luz]]></title>
    <link href="http://arctarus.com/blog/2009/10/06/rezets-com-ve-la-luz/"/>
    <updated>2009-10-06T00:00:00+00:00</updated>
    <id>http://arctarus.com/blog/2009/10/06/rezets-com-ve-la-luz</id>
    <content type="html"><![CDATA[<p>Después de un mes de agosto intenso, por fin, hace un par de semanas <a href="http://www.rezets.com" title="comparte tus recetas">rezets.com</a> se puso en marcha, de momento con más ilusión que otra cosa.</p>

<p>Aquellos que me conocen sabrán de sobra que era una idea que me rondaba la cabeza desde hace bastante tiempo, y después de algún intento de llevarlo a cabo, por fin, a finales de junio decidí ver que era capaz de hacer en una semana de vacaciones y un mes de jornada intensiva aprovechando al máximo las calurosas tardes de agosto.</p>

<p>Y después de pelearme mucho con <a href="http://rubyonrails.org/">rails</a>, con <a href="http://apache.org/">apache</a>, con <a href="http://www.modrails.com/">passenger</a> y con un millón de historias más, hace unas semanas decidí subir todo al servidor de producción, y es que una vez acabada la jornada intensiva el tiempo que le puedo dedicar a este proyecto se ha reducido considerablemente. Aún así me parecía una tontería guardar ese código en el cajón e hice de tripas corazón.</p>

<p>Soy consciente de que aún tiene un montón de defectos y carencias (algunas más evidentes que otras), pero creo que ya he conseguido un par de cosas de las que sentirme orgulloso, como por ejemplo un <a href="http://www.rezets.com/users/arctarus/recipes/11-lomo-de-cerdo-en-salsa-de-cebolletas">lomo de cerdo con salsa de cebolletas</a>, y una <a href="http://www.rezets.com/users/arctarus/recipes/6-paella-sencilla">paella</a> espectaculares. :D</p>

<p>Por ahora la funcionalidad de la web es muy sencilla: crear recetas nuevas, y verlas clasificadas por categorías, pero creo que por ahora debo centrarme en esa funcionalidad hasta que haya conseguido algo que realmente mejore la forma más habitual en que la gente sube sus recetas a internet: los blogs. Por eso voy a mantener la web cerrada a las nuevas altas durante una temporada para poder ir mejorando la web poco a poco con unos pocos usuarios de confianza, pero atenderé cualquier solicitud de usuario nuevo con mucho gusto.</p>

<p>Finalmente me gustaría agradecer a toda la gente que se ha dado de alta, y que pacientemente ha ido subiendo recetas, y todos los consejos recibidos por todos ellos.</p>

<p>¡Muchas gracias a todos!</p>

<div style="text-align:center;">
<a href="http://www.dosisdiarias.com/2009/09/2009-09-09.html" title="ensalada pixelada de Alberto Montt"><img src="http://1.bp.blogspot.com/_iJayHHFD94E/SqdO2OZnGII/AAAAAAAACTI/uQm5nEf4Bx4/s400/ensaladapixelada.jpg" alt="ensalada pixelada" /></a>
Todo sea porque no nos vuelva a pasar cosas como ésta
</div>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Web Workers]]></title>
    <link href="http://arctarus.com/blog/2009/07/12/web-workers/"/>
    <updated>2009-07-12T00:00:00+00:00</updated>
    <id>http://arctarus.com/blog/2009/07/12/web-workers</id>
    <content type="html"><![CDATA[<p>Una de las características de HTML 5 introducidas en el reciente <a href="http://en-us.www.mozilla.com/en-US/firefox/3.5/releasenotes/" title="Firefox 3.5 Release Notes">Firefox 3.5</a> y que también se encuentra disponible en Safari 4 y Chrome 2 son los <a href="https://developer.mozilla.org/En/Using_web_workers" title="Using web workers">web workers</a>.</p>

<p>Los workers proveen un mecanismo para poder ejecutar tareas que requieran mucho tiempo de ejecución en hilos directamente en el sistema operativo sin que bloqueen la interfaz del usuario. Una de sus utilidades principales es la de ejecutar tareas de entrada/salida de datos a través del objeto <a href="http://www.w3.org/TR/XMLHttpRequest/" title="The XMLHttpRequest Object">XMLHttpRequest</a>.</p>

<p>Los web workers se comunican con el proceso principal a través del envío de mensajes a un manejador de eventos especificado por el desarrollador. Estos mensajes pueden contener desde una cadena de caracteres a un objeto complejo. Una característica importante es que no pueden manipular el <abbr title="Document Object Model">DOM</abbr> por lo que si se desea mostrar los datos resultantes de su ejecución es necesarios que estos sean pasados al manejador a través del paso de mensajes.</p>

<p><a href="http://www.flickr.com/photos/dinesh_valke/1081956162/" title="un laborioso trabajador de la red"><img src="http://farm2.static.flickr.com/1325/1081956162_e5f955ff5a.jpg?v=0" alt="Nephila maculata (Orb Web Spider) de dinesh_valke" /></a></p>

<p>Para crear un worker lo único que es necesario es llamar al contructor pasándole como único argumento la URI del script que deberá ejecutar, y definir el manejador del evento onmessage que será el encargado de escribir el resultado en la página.</p>

<p><code class="javascript"><pre>
var worker = new Worker('worker.js');<br/>
worker.onmessage = function(event) {<br/>
     print("¡llamada ejecutada al finalizar el worker!\n");
}
</pre></code></p>

<p>y para detener su ejecución:</p>

<p><code><pre>
worker.terminate();
</pre></code></p>

<p>Posteriormente deberemos implementar lo que hará el worker durante su ejecución en el archivo <em>worker.js</em> de la siguiente manera:</p>

<p><code><pre>
onmessage = function(event) {
     var n = calcular();
     postMessage(n);
}
</pre></code></p>

<p>Al finalizar la ejecución del método <em>calcular</em> el worker enviará un mensaje con el resultado que será recogido por el manejador del evento <em>onmessage</em> definido anteriormente.</p>

<p>El método <em>calcular</em> podría estar definido en otro archivo e importando mediante la función global <em>importScripts('calcular.js')</em> la cuál descagará y traerá dicha función al ámbito del worker.</p>

<p>Además cada worker puede lanzar tantos otros workers como se desee, lo único a tener en cuenta es que la ruta a el fichero que se le pasa en el constructor se calcula dinámicamente dependiendo de la localización del padre. Esto es muy aconsejable sobre todo en el caso de que el usuario posea un microprocesador con más de un núcleo, ya que el sistema operativo podría repartir los hilos entre estos.</p>

<h3>Referencias</h3>


<ul>
<li><a href="http://www.whatwg.org/specs/web-workers/current-work/">Web Workers</a></li>
<li><a href="https://developer.mozilla.org/En/Using_web_workers">Mozilla Developer Center: Using web workers</a></li>
<li><a href="http://inimino.org/~inimino/blog/3box_web_workers">Using Web Workers</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[cómo decidir qué control de formulario usar]]></title>
    <link href="http://arctarus.com/blog/2009/06/23/como-decidir-que-control-de-formulario-usar/"/>
    <updated>2009-06-23T00:00:00+00:00</updated>
    <id>http://arctarus.com/blog/2009/06/23/como-decidir-que-control-de-formulario-usar</id>
    <content type="html"><![CDATA[<p>Cuando preparas las preguntas que quieres incorporar a un formulario debes tener en cuenta una serie de reglas que harán que cada una de las piezas de las cuales está compuesto encajen perfectamente y mejoren la experiencia de uso drásticamente. Para ello debes seleccionar cuidadosamente cuál es el tipo de control que se ajusta perfectamente a cada pregunta.</p>

<p><a href="http://www.flickr.com/photos/solofotones/3489261570/"><img src="http://farm4.static.flickr.com/3346/3489261570_9292fda200.jpg" alt="Todos somos piezas de un rompecabezas"></a></p>

<h3>radiobuttons</h3>


<p>Sólo deben ser usados cuando existe una lista de opciones mutuamente excluyentes, es decir, cuándo sólo es posible seleccionar una opción y la opción más frecuente debe estar marcada por defecto. El número de opciones debe rondar las cinco, dependiendo de su longitud y complejidad. Es importante que en el enunciado de la pregunta quede claro que se trata de seleccionar una de las opciones.</p>

<h3>checkboxes</h3>


<p>En cambio, los <em>checkboxes</em> deben ser usados cuando pueda ser seleccionada más de una opción, una, o ninguna. El caso de un único <em>checkbox</em> es usado cuando se debe activar o no una opción del formulario.</p>

<h3>combo boxes</h3>


<p>Son usados cuando tenemos un gran número de opciones y sólo podemos seleccionar una, ya que evita que el tamaño del formulario crezca excesivamente. Sin embargo, las opciones que contenga deben ser más sencillas y claramente excluyentes que en el caso de los <em>radiobuttons</em>, para evitar que los usuarios no encuentren la opción que buscan.</p>

<p>Evita la utilización del multi-combos ya que los usuarios no suelen comprender inmediatamente que pueden seleccionar más de una opción.</p>

<h3>campos de texto</h3>


<p>Los campos de texto son usados cuando se desea que se pueda introducir texto libremente. Lo más importante que uno debe recordar es que el tamaño del campo debe ajustarse al tamaño de la respuesta esperada, ya que los usuarios tienden a pensar que si su respuesta no cabe probablemente no será correcta. Si el tamaño de la respuesta esperada es muy grande, por ejemplo mayor de una línea, deben usarse los <em>textarea</em> en su lugar.</p>

<p>Cuando se usen campos de texto para introducir datos que requieran algún tipo de formato, como una fecha o un teléfono, debe procurarse que el usuario pueda introducir la información en el mayor número de formatos posible, dejando el manejo de la información a la aplicación. En cualquier caso en conveniente poner algunos ejemplos de los formatos permitidos junto al campo para que el usuario pueda comprender cómo debe introducir la información.</p>

<h3>otros puntos a recordar</h3>


<ul>

<li>No olvides asociar los <em>labels</em> a su campo correspondiente para que el usuario pueda seleccionar el control al pulsar el <em>label</em>.</li>

<li>Los <em>radiobuttons</em> y los <em>checkboxes</em> deben estar agrupados en un <em>fieldset</em> con un título o <em>legend</em> adecuado. Esto permitirá a los usuarios dividir el formulario en bloques lógicos que pueden abordar por separado.</li>

<li>los <em>radiobuttons</em> y los <em>checkboxes</em> deben situarse antes de su <em>label</em>, y los <em>combo</em>, campos de texto y <em>textarea</em> después.</li>

<li>Marca claramente los campos obligatorios y procura que estén al principio del formulario.</li>

</ul>




<h3 style="margin-top:2em;">Referencias</h3>


<ul>
<li><a href="http://www.alistapart.com/articles/sensibleforms">Sensible Forms: A Form Usability Checklist</a></li>
<li><a href="http://www.alzado.org/articulo.php?id_art=57&amp;s=1">Controles de formularios en diseño web, radio buttons, check-boxes...</a></li>
<li><a href="http://www.useit.com/alertbox/20040927.html">Checkboxes vs. Radio Buttons</a></li>
<li><a href="http://olgacarreras.blogspot.com/2007/02/formularios-usables-60-directrices-de.html">Formularios usables: 60 directrices de usabilidad</a></li>
</ul>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[La mejora progresiva y la accesibilidad]]></title>
    <link href="http://arctarus.com/blog/2009/05/24/la-mejora-progresiva-y-la-accesibilidad/"/>
    <updated>2009-05-24T00:00:00+00:00</updated>
    <id>http://arctarus.com/blog/2009/05/24/la-mejora-progresiva-y-la-accesibilidad</id>
    <content type="html"><![CDATA[<p>La mejora progresiva (o <a href="http://en.wikipedia.org/wiki/Progressive_enhancement">progressive enhancement</a>) es una estrategia de desarrollo web en la que se destaca la accesibilidad, el marcado semántico, y el uso de hojas de estilo y scripts enlazados externamente.</p>

<p>Nace en contraposición a la estrategia clásica conocida como degradación agraciada (o <a href="http://en.wikipedia.org/wiki/Graceful_degradation">graceful degradation</a>) en la que los desarrolladores web crean sus páginas para los navegadores más recientes y posteriormente prueban y adaptan a los navegadores menos avanzados tecnológicamente.</p>

<p>La mejora progresiva se basa en los siguientes principios:</p>

<ul style="margin-bottom:1em;">
    <li>El contenido básico debe ser accesible a todos los navegadores.</li>
    <li>La funcionalidad básica debe ser accesible a todos los navegadores.</li>
    <li>Mínimo marcado (X)HTML semántico para todo el contenido.</li>
    <li>Las mejoras de diseño son proporcionadas por hojas de estilo externas.</li>
    <li>Las mejoras de comportamiento son proporcionadas por JavaScript no intrusivo enlazado externalmente.</li>
    <li>Las preferencias de los navegadores de los usuarios son respetadas.</li>
</ul>


<p>Para ello propone centrarse en el contenido y comenzar creando el marcado (X)HTML semántico al cuál se le irán añadiendo capas que lo enriquezcan.</p>

<p><a href="http://www.flickr.com/photos/sugarbloom_cupcakes/3002400314/" title="Blonde and Brown Cupcakes"><img src="http://farm4.static.flickr.com/3228/3002400314_f4c5d4ffbe.jpg" alt="Blonde and Brown Cupcakes" /></a></p>

<p>De esta manera conseguimos que aquellos usuarios que usen navegadores antiguos, dispositivos móviles o sintetizadores de voz obtendrán un mejor soporte. De hecho, como vimos, gracias a las <a href="http://arctarus.wordpress.com/2009/04/26/ventajas-de-escribir-html-semantico/" title="">ventajas del (X)HTML semántico</a> se mejorará la indexación de la página por parte de los buscadores lo que es básico en una estratégia <acronym title="Search Engine Optimization">SEO</acronym>.</p>

<p>La primera capa que se añade a nuestro marcado (X)HTML semántico es la de <acronym title="Cascading Style Sheets">CSS</acronym> la cual nos permitirá mejorar el aspecto de nuestra página y en la que deberemos poner cuidado en la forma en la que enlazamos cada una de las hojas de estilo y los tipos de medios para los cuales deben estar disponibles de forma que se aprovechen las características de los navegadores nuevos siempre teniendo en cuenta de que el contenido debe ser accesible para el resto de los navegadores.</p>

<p>Finalmente añadimos la capa de JavaScript, previamente ha debido ser programada la funcionalidad básica de la web en el lado del servidor de forma que se pueda ejecutar independientemente del soporte de JavaScript que tenga el usuario, para posteriormente ir añadiendo mejoras en la usabilidad por medio de la programación en en lado del cliente. Para ello es imprescindible la utilización de técnicas de JavaScript no intrusivo como enlazar los scripts desde archivos externos o la eliminación de los manejadores de eventos en linea.</p>

<p>Cómo se puede ver todo el flujo de trabajo está orientado a que el contenido de la página, la razón por la cual los usuarios te visitan, esté siempre accesible en cualquier circunstancia independientemente de los medios de los que dispongan, ya que en el peor de los casos tendrán acceso a la capa de (X)HTML de nuestra web, y por tanto, tendrán acceso a su contenido.</p>

<h3 style="margin-top:2em;">Referencias</h3>


<ul>
    <li><a href="http://en.wikipedia.org/wiki/Progressive_enhancement">Progressive enhancement</a></li>
    <li><a href="http://www.alistapart.com/articles/understandingprogressiveenhancement">Understanding Progressive Enhancement</a></li>
    <li><a href="http://www.alistapart.com/articles/progressiveenhancementwithcss">Progressive Enhancement with CSS</a></li>
    <li><a href="http://www.alistapart.com/articles/progressiveenhancementwithjavascript/">Progressive Enhancement with JavaScript</a></li>
    <li><a href="http://css-discuss.incutio.com/?page=ProgressiveEnhancement">Progressive enhancement using CSS</a></li>
    <li><a href="http://icant.co.uk/articles/pragmatic-progressive-enhancement/">Pragmatic progressive enhancement</a></li>

</ul>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Impresiones de la Euruko 2009 Barcelona]]></title>
    <link href="http://arctarus.com/blog/2009/05/11/impresiones-de-la-euruko-2009-barcelona/"/>
    <updated>2009-05-11T00:00:00+00:00</updated>
    <id>http://arctarus.com/blog/2009/05/11/impresiones-de-la-euruko-2009-barcelona</id>
    <content type="html"><![CDATA[<p style="text-align:center;"><a href="http://euruko2009.org"><img class="size-full wp-image-93 aligncenter" title="euruko2009" src="http://arctarus.files.wordpress.com/2009/05/euruko2009.png" alt="euruko 2009 barcelona" width="510" height="175" /></a></p>


<p>En general el ambiente que se ha podido ver ha sido divertidisimo, muy bien organizado y con muchas charlas de gran interés.</p>

<p>Del primer día entre destacaría, por supuesto, la <a href="http://app.euruko2009.org/talks/6-matz-keynote">keynote de Matz</a> en la que repasó la trayectoria que ha seguido ruby para convertirse en lo que es: hacer el desarrollo de aplicaciones más rápido, más complejo y más barato. También señalo el camino que se debe seguir para entrar por derecho propio en el mundo empresarial como el multi-threading o la computación en la nube. Divertidísima charla de <a href="http://formatinternet.wordpress.com/">Javier Ramírez</a> sobre <a href="http://app.euruko2009.org/talks/9-fun-with-ruby-and-without-r-s-program-your-own-games-with-gosu">programación de videojuegos con Gosu</a> en la que montó un verdadero espectáculo y se reveló como un autentico showman.</p>

<p>Del segundo día destacaría sobre todo la charla sobre <a href="http://app.euruko2009.org/talks/17-adhearsion">Adhearsion</a>, plataforma para el desarrollo de aplicaciones sobre <a href="http://www.asterisk.org/">Asterisk</a>. Y la de <a href="http://app.euruko2009.org/talks/18-building-crossplatform-mobile-apps-in-ruby-with-the-rhodes-framework">Rhodes framework</a> para el desarrollo de aplicaciones móviles, sin olvidarnos de la marcha que le dio a la euruko <a href="http://www.pabloformoso.com/">Pablo Formoso</a> con su charla sobre <a href="http://app.euruko2009.org/talks/19-ruby-archaeopteryx">archaeopteryx</a>. Y finalmente la charla sobre <a href="http://cukes.info/">Cucumber</a> en la que se hizo un repaso de sus virtudes.</p>

<p>Por otro lado las charlas relámpago (lightning talks) se mostraron como un método muy ágil de dar entrada a charlas que por su extensión o temática no hubieran tenido cabida en el programa original.</p>

<p>Para finalizar la edición del 2009 se seleccionó como organizador euruko 2010 a Cracovia (Polonia).</p>

<p>Al final un buen recuerdo y un gustazo haber pasado el fin de semana en Barcelona.</p>

<p><p style="text-align:center;"><a href="http://www.flickr.com/photos/arctarusnet/3521547843/"><img src="http://farm4.static.flickr.com/3360/3521547843_c1de8de379.jpg?v=0" alt="gong en la euruko 2009" /></a>
<a href="http://www.hashref.com/">Xavier Noria</a> golpeando el gong en las lightning talks</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Ventajas de escribir HTML semántico]]></title>
    <link href="http://arctarus.com/blog/2009/04/26/ventajas-de-escribir-html-semantico/"/>
    <updated>2009-04-26T00:00:00+00:00</updated>
    <id>http://arctarus.com/blog/2009/04/26/ventajas-de-escribir-html-semantico</id>
    <content type="html"><![CDATA[<p>Escribir HTML semánticamente correcto implica usar cada etiquetas con el propósito para el cual fue diseñada y no según el aspecto que estas tengan en los navegadores.</p>

<p>Pero, ¿para qué es necesario que el HTML sea semántico? ¿No es suficiente con que se vea correctamente en todos los navegadores?</p>

<p>Cuando usas las etiquetas HTML correctamente estás proporcionando al navegador, sea del tipo que sea, información sobre qué es el contenido que está leyendo, por lo tanto podrá identificarlo y usarlo más eficientemente. Esto tiene diferentes tipos de ventajas.</p>

<h3>Accesibilidad</h3>


<p>El HTML semántico es más fácil de interpretar para los agentes de usuario lo que permite que sea mostrado mejor en diferentes tipos de soportes como móviles, PDA's, navegadores por voz, etc lo que permite acceder a los contenidos incluso a personas que tengan algún tipo de discapacidad aumentando tu público objetivo.</p>

<h3><acronym title="search engine optimization">SEO</acronym></h3>


<p>Los motores de búsquedas necesitan entender el contenido de la página para ser capaces de evaluarlo y clasificarlo. Por medio del uso de HTML semántico, los motores de búsqueda, son capaces de entender mejor la estructura del documento y el significado de su contenido lo que mejora su posición en los resultados de búsqueda.</p>

<h3>Crossbrowser</h3>


<p>Ya que estamos usando las etiquetas HTML para el propósito para el cual fueron diseñadas, los navegadores tendrán más información sobre el contenido de esas etiquetas por lo que mejoraras la forma en la que se visualizan, e interactuan con el navegador, además de asegurar que la mayoría de los navegadores traten a ese contenido de la misma manera.</p>

<h3>Mantenimiento</h3>


<p>Ante todo, cuando escribimos HTML semántico estamos escribiendo HTML bien estructurado, lo cual facilita la lectura y edición del marcado. Por lo tanto, estaremos ahorrando tiempo y dinero cuando otras personas tengan que editar nuestro documento.</p>

<p>Ya que no contiene etiquetas que definen su aspecto, sólo aquellas que definen su significado, es más fácil de cambiar su aspecto intercambiando las hojas de estilo para cada tipo de agente de usuario.</p>

<p>Además, al usar únicamente las etiquetas que son semánticamente necesarias, nuestro documento HTML será más pequeño, más rápido de descargar, y más rápido de leer para los agentes de usuario.</p>

<h3>Cómo escribir HTML semántico</h3>


<p>No hay una manera automática de comprobar si el HTML de tu página es semántico,  ya que no es suficiente con que sea válido según el estándar. Para ello es necesario:</p>

<ol>
    <li>Eliminar cualquier etiqueta que haga referencia al aspecto que tendrá el contenido como las etiquetas font, center o align.</li>
    <li>Asegurarse de que las etiquetas que estamos usando describen su contenido y que hemos dejado la presentación en manos de las hojas de estilo, para ello puedes desactivar las hojas de estilo de tu navegador o usar uno sin soporte para hojas de estilo como lynx. Si puedes seguir leyendo el contenido probablemente tu HTML sea semánticamente correcto.</li>
</ol>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Si eres legal...]]></title>
    <link href="http://arctarus.com/blog/2008/12/16/si-eres-legal/"/>
    <updated>2008-12-16T00:00:00+00:00</updated>
    <id>http://arctarus.com/blog/2008/12/16/si-eres-legal</id>
    <content type="html"><![CDATA[<p><a title="¿a quién daña la pirateria?" href="http://siereslegalcomparte.com/">Si eres legal</a>, comparte!</p>

<p>Ese es el título de la acción promovida por los chicos de <a href="http://hacktivistas.net">hacktivistas</a> que pretende combatir la nueva campaña del ministerio de cultura en donde se llega a afirmar que el intercambio entre usuarios de material cultural sujeto a copyright es delito, aún no existiendo animo de lucro. También denuncian una <a class="external text" title="http://wiki.hacktivistas.net/index.php/P2P2010" rel="nofollow" href="http://wiki.hacktivistas.net/index.php/P2P2010">campaña de los lobbies de la industria cultural para especular con la era digital</a>, y citan a todo el que quiera asistir a interacambiar material protegido por la Ley de Propiedad Intelectual sin animo de lucro, frente a la sede del PSOE en Madrid, C/ Ferraz 70 el próximo sábado 20 de Diciembre a las 12h.</p>

<p style="text-align:center;"><a href="http://siereslegalcomparte.com/"><img class="size-full wp-image-47 aligncenter" title="siereslegal" src="http://arctarus.files.wordpress.com/2008/12/siereslegal.png" alt="compartir es bueno" width="176" height="175" /></a></p>


<p>Desde aquí todo mi apoyo a esta campaña.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[re[t]aguar[d]ia#1 ve la luz]]></title>
    <link href="http://arctarus.com/blog/2008/12/08/retaguardia-1-ve-la-luz/"/>
    <updated>2008-12-08T00:00:00+00:00</updated>
    <id>http://arctarus.com/blog/2008/12/08/retaguardia-1-ve-la-luz</id>
    <content type="html"><![CDATA[<p>Por fin, depués de demasiado tiempo, el proyecto <a href="http://www.retaguardia.net/">re[t]aguar[d]ia</a> saca a la calle <a href="http://www.retaguardia.net/fvirtual/">re[t]aguar[d]ia#1</a>. Este primer número nace de las manos Antonio Barcia García junto a José Joaquín González Gómez, Manuel María López Luque, Eduardo Martínez Nieto, con la colaboración de La Palabra Itinerante, y está dedicado al mundo de la poesía y la fotografía.</p>

<p><img class="aligncenter size-full wp-image-42" title="retaguardia" src="http://arctarus.files.wordpress.com/2008/12/retaguardia.png" alt="retaguardia" width="292" height="38" /></p>

<p>Se puede consultar el número en formato flash y pdf , y la licencia de distribución es copyleft de tipo Reconocimiento-No comercial-Compartir bajo la misma licencia.</p>

<p>Mucha suerte a todos los implicados en el proyecto.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Teorema de los monos infinitos]]></title>
    <link href="http://arctarus.com/blog/2008/03/19/teorema-de-los-monos-infinitos/"/>
    <updated>2008-03-19T00:00:00+00:00</updated>
    <id>http://arctarus.com/blog/2008/03/19/teorema-de-los-monos-infinitos</id>
    <content type="html"><![CDATA[<p><cite><a title="Teorema de los monos infinitos" href="http://es.wikipedia.org/wiki/Teorema_de_los_infinitos_monos">El teorema de los monos infinitos</a> afirma que un mono pulsando teclas al</cite><cite> azar sobre un teclado <a title="Casi seguramente" href="http://es.wikipedia.org/wiki/Casi_seguramente">casi seguramente</a> podrá escribir finalmente cualquier libro que se halle en la <a class="new" title="Biblioteca Nacional Francesa (aún no redactado)" href="http://es.wikipedia.org/w/index.php?title=Biblioteca_Nacional_Francesa&amp;action=edit&amp;redlink=1">Biblioteca Nacional Francesa</a>.
</cite></p>

<p><a href="http://es.wikipedia.org/">wikipedia.es</a></p>

<p align="center"><a title="mono asesino" href="http://arctarus.files.wordpress.com/2008/03/padre-de-familia-mono-asesino.jpg"><img src="http://arctarus.files.wordpress.com/2008/03/padre-de-familia-mono-asesino.jpg" alt="mono asesino" /></a></p>


<p>En otra versión del teorema, un mono infinito podría llegar a escribir, por ejemplo, el kernel de linux.</p>

<p>Sin entrar en inocuos debates matemáticos sobre la validez de dicho teorema, la idea de que un mono, por muy infinito que sea, pueda a llegar a escribir una pieza de software tan compleja como el kernel de linux me inquieta.</p>

<p>De echo, si tenemos en cuenta la media de líneas de código diarias que puede escribir un programador al final de un proyecto es difícil de afirmar cuál de los dos es el mono infinito y cuál el programador.</p>

<p>¿Quizás sería mejor reemplazar a los programadores por monos infinitos? de momento, y gracias a la madre naturaleza, los programadores tenemos tiempo para hacernos valer, pero es sólo cuestión de tiempo.</p>

<p>Mejor que no nos despistemos...</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[XFN™ (XHTML Friends Network)]]></title>
    <link href="http://arctarus.com/blog/2007/08/04/xfn-e2-84-a2-xhtml-friends-network/"/>
    <updated>2007-08-04T00:00:00+00:00</updated>
    <id>http://arctarus.com/blog/2007/08/04/xfn%e2%84%a2-xhtml-friends-network</id>
    <content type="html"><![CDATA[<p>Cada vez más usamos internet para relacionarnos con nuestros amigos, por lo que hace falta tener una manera sencilla de representar estas relaciones en la web.</p>

<p><a href="http://www.gmpg.org/xfn/" target="_blank">XFN</a> es un <a href="http://microformats.org/" target="_blank">microformato</a> que representa estas relaciones utilizando para ello el atributo <i>rel</i> de los enlaces, al que se le asignan unos valores que las representen.</p>

<p>Un ejemplo de ello sería los valores para las relaciones de amistad.</p>

<ul>
    <li>contact: Alguien con la quién sabes como llegar a él. Suele ser una relación simétrica.</li>
    <li>acquaintanc: Alguien con quién has intercambiado saludos y has mantenido una o dos conversaciones cortas. También simétrico.</li>
    <li>friend: Alguien de quien eres amigo. Un compatriota, un colega, que tu conoces. A menudo simétrico.</li>
</ul>


<p>Por lo que para construir un enlace a la ficha de un amigo podríamos hacer:<code>
&lt;a href="http://11870.com/manueltxo" rel="friend met co-worker"&gt;manu&lt;/a&gt;
</code></p>

<p>donde <i>met</i> nos indica que se conoce a esa persona fisicamente, y <i>co-worker</i> que es compañero de trabajo.</p>

<p>De esta manera podemos usar los estilos para diferenciar visualmente cada tipo de relación.
<code> a[rel~="friend"] {font-weight: bold;}
a[rel~="co-worker"] {text-decoration: underline;}
a[rel~="acquaintance"] {font-style: italic;}</code></p>

<p>Se pueden ver como funciona XFN 1.1 utilizando la herramienta visual <a href="http://www.gmpg.org/xfn/creator-es" title="Creador de XFN 1.1" target="_blank">creador de XFN 1.1</a> para practicar.</p>

<p>Pero más allá de unos simples estilos, nos permitiría tener un sitio centralizado en donde definir nuestras relaciones (como <a href="http://www.orkut.com" title="Orkut">orkut</a> o <a href="http://www.linkedin.com/" title="Linkedin" target="_blank">Linkedin)</a> a partir de la cual otras puedan obtener esos datos y nos eviten tener que reintroducirlos cada vez que nos demos de alta en un nuevo servicio.</p>
]]></content>
  </entry>
  
</feed>
