<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Jordi Romero</title>
	
	<link>http://jrom.net</link>
	<description>Just another WordPress weblog</description>
	<pubDate>Fri, 09 May 2008 16:58:13 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/JROM" type="application/rss+xml" /><item>
		<title>Qué es REST</title>
		<link>http://feeds.feedburner.com/~r/JROM/~3/286958709/13-que-es-rest</link>
		<comments>http://jrom.net/13-que-es-rest#comments</comments>
		<pubDate>Fri, 09 May 2008 16:58:13 +0000</pubDate>
		<dc:creator>Jordi Romero</dc:creator>
		
		<category><![CDATA[Ruby on Rails]]></category>

		<category><![CDATA[aplicaciones web]]></category>

		<category><![CDATA[http]]></category>

		<category><![CDATA[rest]]></category>

		<category><![CDATA[webservice]]></category>

		<guid isPermaLink="false">http://jrom.net/?p=13</guid>
		<description><![CDATA[REST (REpresentational State Transfer) es una arquitectura para aplicaciones que se comunican a través del protocolo HTTP.
Verbos HTTP
Típicamente, se conocen del protocolo HTTP dos verbos: GET y POST. GET es el que se utiliza para pedir un contenido a un servidor web. Por ejemplo: GET http://jrom.net/ nos mandará el contenido de la URL pedida. También [...]]]></description>
			<content:encoded><![CDATA[<p><strong>REST</strong> (REpresentational State Transfer) es una arquitectura para aplicaciones que se comunican a través del protocolo HTTP.</p>
<h2>Verbos HTTP</h2>
<p>Típicamente, se conocen del protocolo HTTP dos verbos: GET y POST. GET es el que se utiliza para pedir un contenido a un servidor web. Por ejemplo: <code>GET http://jrom.net/</code> nos mandará el contenido de la URL pedida. También podemos añadir parámetros usando el verbo GET: <code>GET http://jrom.net/?s=rails</code>, en este caso, el servidor recibe que queremos la URL http://jrom.net/ pero con la variable s=rails.</p>
<p>El otro verbo conocido es POST. Normalmente se utiliza en los formularios mandan datos al servidor.</p>
<p>Sin embargo, hay más verbos HTTP que normalmente no se usan. Para poder usar una arquitectura REST, necesitaremos usar (además de GET y POST) los verbos PUT y DELETE. Estos ni siquiera son soportados por los navegadores corrientes, por lo que hay que simular que usamos esos verbos al hacer un enlace para un navegador, aunque sí que puede usar cuándo se nos use como webservice.</p>
<h2>REST - CRUD</h2>
<p>REST se puede ver cómo un sistema CRUD (Crear, leer, actualizar y eliminar) proyectado al protocolo HTTP. Podemos usar un verbo HTTP por cada acción CRUD:</p>
<ul>
<li><strong>GET</strong>: Read, mostrar un objeto</li>
<li><strong>DELETE</strong>: Delete, eliminar un objeto</li>
<li><strong>PUT</strong>: Update, actualizar un objeto</li>
<li><strong>POST</strong>: Create, crear un objeto</li>
</ul>
<div>De esta forma, si queremos hacer una de las acciones CRUD sobre el objeto &#8220;proyecto&#8221; que lo identificamos por un ID=428, podríamos entender las siguientes ordenes HTTP:</div>
<div>
<ul>
<li><code>GET http://localhost/proyectos/428</code> → Obtiene el proyecto 428</li>
<li><code>DELETE http://localhost/proyectos/428</code> → Elimina el proyecto 428</li>
<li><code>PUT http://localhost/proyectos/428</code> → Modifica el proyecto 428</li>
<li><code>POST http://localhost/proyectos</code> → Crea un proyecto con ID 428 (no podemos pasar el ID porque esto nos lo devolverá el servidor después de crear el proyecto)</li>
</ul>
<h2>El dilema</h2>
<div>Hasta aquí, parece que REST es una solución muy limpia para manejar recursos en aplicaciones web: obtenemos unas URL limpias y orientadas a CRUD, nos van muy bien para programar nuestra aplicación web como webservice y es muy sencillo de comprender y intuir cómo funciona una aplicación web.</div>
<div>El problema que tiene REST es que los navegadores corrientes no soportan los verbos DELETE y PUT. Por este motivo, mucha gente descarta plantearse usar diseños REST para aplicaciones web, ya que sólo sirven al ofrecerse como webservice, y no como aplicación de cara al usuario a través de un navegador web.</div>
<h2>La conclusión</h2>
<div>Se puede usar un diseño REST sólo para webservices, dónde puedes manejar sin problemas los cuatro verbos HTTP. Otra opción, la que por ejemplo eligieron los diseñadores de Ruby on Rails al implementar REST en el manejo de recursos, es simular la funcionalidad REST a través de sólo GET y POST, pudiendo aceptar llamadas PUT y DELETE cuándo el cliente lo soporte. En el caso de RAILS, añaden una variable POST llamada <code>_method</code>, a la que le dan valor put o delete para simular llamadas PUT y DELETE del cliente.</div>
</div>
<img src="http://feeds.feedburner.com/~r/JROM/~4/286958709" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jrom.net/13-que-es-rest/feed</wfw:commentRss>
		<feedburner:origLink>http://jrom.net/13-que-es-rest</feedburner:origLink></item>
		<item>
		<title>Instalando Ruby on Rails</title>
		<link>http://feeds.feedburner.com/~r/JROM/~3/281727649/12-instalando-ruby-on-rails</link>
		<comments>http://jrom.net/12-instalando-ruby-on-rails#comments</comments>
		<pubDate>Thu, 01 May 2008 23:04:17 +0000</pubDate>
		<dc:creator>Jordi Romero</dc:creator>
		
		<category><![CDATA[Ruby on Rails]]></category>

		<category><![CDATA[programación]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://jrom.net/?p=12</guid>
		<description><![CDATA[Antes que nada, necesitas tener Ruby en el sistema: En Linux y Windows, sigue los pasos que cuentan en la página oficial de Ruby. En Mac OS X Tiger, sigue las instrucciones que da Dan Benjamin en Hivelogic. En Mac OS X Leopard, no hace falta hacer nada, viene con una instalación de serie de [...]]]></description>
			<content:encoded><![CDATA[<p>Antes que nada, necesitas tener Ruby en el sistema: En Linux y Windows, sigue los pasos que cuentan en la <a title="Instalando Ruby" href="http://www.ruby-lang.org/es/downloads/" target="_blank">página oficial de Ruby</a>. En Mac OS X Tiger, sigue las instrucciones que da Dan Benjamin en <a title="Instalar Ruby en Tiger" href="http://hivelogic.com/articles/2007/02/ruby-rails-mongrel-mysql-osx" target="_blank">Hivelogic</a>. En Mac OS X Leopard, no hace falta hacer nada, viene con una instalación de serie de Ruby y Ruby on Rails.  También necesitarás las RubyGems, que puedes encontrar <a title="Instalando RubyGems" href="http://rubyforge.org/frs/?group_id=126" target="_blank">aquí</a>.  Para comprobar que realmente tienes Ruby y RubyGems funcionando, escribe esto en la línea de comandos:</p>
<pre>$ ruby -v     

ruby 1.8.6 (2007-09-24 patchlevel 111) [universal-darwin9.0]

$ gem -v

1.1.1

$</pre>
<p>Ahora, sólo hace falta escribir</p>
<pre>$ gem install rails --include-dependencies</pre>
<p>Y tendremos Rails instalado. Vamos a crear nuestra primera aplicación Rails:</p>
<pre>$ rails hello_world_rails
      create
      create  app/controllers
      create  app/helpers
      create  app/models
      create  app/views/layouts
      create  config/environments
      [...]
      create  log/server.log
      create  log/production.log
      create  log/development.log
      create  log/test.log
$ cd hello_world_rails/</pre>
<p>El comando <code>rails &lt;nombreaplicacion&gt;</code> en realidad lo único que hace es crear un directorio de nombre &#8220;nombreaplicacion&#8221; y llenarlo con el esqueleto de una aplicación Rails:</p>
<ul>
<li><strong>app</strong>: El directorio donde mas lineas escribiremos, ahí es dónde va el código de nuestra aplicación.</li>
<li><strong>config</strong>: Se configura la base de datos, las rutas y parámetros para cada entorno de ejecución (development, test y production)</li>
<li><strong>db</strong>: Es donde tendremos los ficheros de migraciones de la base de datos, y si usas sqlite, también tendrás la base de datos ahí.</li>
<li><strong>doc</strong>: Por defecto está vacío, pero puedes generar ahí la API de Rails, o la API de tu propia aplicación con el comando rake.</li>
<li><strong>lib</strong>: Código Ruby que queramos tener accesible desde cualquier código de nuestra aplicación</li>
<li><strong>log</strong>: &#8230;</li>
<li><strong>public</strong>: Directorio que el servidor web servirá, es dónde se encuentra el dispatcher, y el contenido estático (css, imágenes, js, &#8230;)</li>
<li><strong>script</strong>: Código de Rails con los scripts que usaremos constantemente para generar más código</li>
<li><strong>test</strong>: Directorio dónde colocaremos el código de nuestros tests para probar la aplicación</li>
<li><strong>tmp</strong>: &#8230;</li>
<li><strong>vendor</strong>: Inicialmente vacío, pero ahí es dónde irán a parar los plugins que instalemos, y si queremos, podemos incrustar todo el código de rails para no tener que depender de la versión de rails que haya en nuestra máquina, e incluso, hacerle modificaciones</li>
</ul>
<div>Ahora vamos a poner en marcha unos instantes esta nueva aplicación dónde aún no hemos escrito ni una línea de código:</div>
<pre><span style="font-family: 'Lucida Grande'; line-height: 19px; white-space: normal;">$</span> script/server
=&gt; Booting Mongrel (use &#8217;script/server webrick&#8217; to force WEBrick)
=&gt; Rails application starting on http://0.0.0.0:3000
=&gt; Call with -d to detach
=&gt; Ctrl-C to shutdown server
** Starting Mongrel listening at 0.0.0.0:3000
** Starting Rails with development environment&#8230;
** Rails loaded.
** Loading any Rails specific GemPlugins
** Signals ready.  TERM =&gt; stop.  USR2 =&gt; restart.  INT =&gt; stop (no restart).
** Rails signals registered.  HUP =&gt; reload (without restart).  It might not work well.
** Mongrel 1.1.4 available at 0.0.0.0:3000
** Use CTRL-C to stop.</pre>
<div>En nuestro navegador favorito, ponemos <a href="http://0.0.0.0:3000" target="_blank">http://0.0.0.0:3000</a> y veremos una página de bienvenida que nos da pistas sobre nuestros siguientes pasos. Ya podemos cerrar el servidor (Control-C), y ponernos manos a la obra.</div>
<div>Por defecto, Rails supone que vamos a usar una base de datos sqlite, si queremos forzarlo a usar otra opción (por ejemplo: mysql), tenemos que ejecutar el comando <code>rails &lt;aplicación&gt; -d mysql</code>.</div>
<div>En este articulo sólo pretendo mostrar cómo se pone en marcha una aplicación rails, pero sólo como aperitivo, podemos probar lo siguiente:</div>
<pre>$ script/generate scaffold Producto nombre:string descripcion:text precio:integer 

[...]

$ rake db:migrate

(in /Users/jordi/rails/hello_world_rails)
== 1 CreateProductos: migrating ===============================================
&#8211; create_table(:productos)
   -&gt; 0.0038s
== 1 CreateProductos: migrated (0.0040s) ======================================

$ script/server

[...]</pre>
<div>Y vamos a <a href="http://0.0.0.0:3000/productos" target="_blank">http://0.0.0.0:3000/productos</a>. Con sólo escribir un comando, hemos generado un <strong>controlador</strong> (Productos), un <strong>modelo</strong> (Producto) y unas <strong>vistas</strong> (páginas html) para manipular productos. Podemos crear, mostrar, editar, borrar y listar productos sin tener que escribir ni una sola línea de Ruby. Con el segundo comando hemos generado la tabla en la base de datos (sqlite, configurada en config/databse.yml) productos, con los campos nombre, descripción y precio.</div>
<div>Hasta aquí la instalación de Rails, a partir de aquí hace falta saber un poco de Ruby y empezar a programar aplicaciones realmente útiles.</div>
<img src="http://feeds.feedburner.com/~r/JROM/~4/281727649" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jrom.net/12-instalando-ruby-on-rails/feed</wfw:commentRss>
		<feedburner:origLink>http://jrom.net/12-instalando-ruby-on-rails</feedburner:origLink></item>
		<item>
		<title>Introducción al control de versiones</title>
		<link>http://feeds.feedburner.com/~r/JROM/~3/272238651/11-introduccion-control-de-versiones</link>
		<comments>http://jrom.net/11-introduccion-control-de-versiones#comments</comments>
		<pubDate>Thu, 17 Apr 2008 15:38:35 +0000</pubDate>
		<dc:creator>Jordi Romero</dc:creator>
		
		<category><![CDATA[Subversion]]></category>

		<category><![CDATA[cvs]]></category>

		<category><![CDATA[git]]></category>

		<guid isPermaLink="false">http://jrom.net/?p=11</guid>
		<description><![CDATA[El problema
Casi cualquier proyecto de software, por pequeño que sea, requiere la intervención de más de un desarrollador. Todos los que hayamos participado en un proyecto dónde más de una persona colabora en un mismo código, nos hemos encontrado con los mismos problemas: ¿Quién tiene la versión buena? ¿Sobre qué código debo aplicar este cambio? [...]]]></description>
			<content:encoded><![CDATA[<h2>El problema</h2>
<p>Casi cualquier proyecto de software, por pequeño que sea, requiere la intervención de más de un desarrollador. Todos los que hayamos participado en un proyecto dónde más de una persona colabora en un mismo código, nos hemos encontrado con los mismos problemas: ¿Quién tiene la versión buena? ¿Sobre qué código debo aplicar este cambio? ¿Has hecho cambios esta semana en el fichero tal?</p>
<h2>La solución: Control de versiones</h2>
<p>Se trata de tener una herramienta que gestione todos los cambios que sufre un determinado archivo por un determinado usuario. A eso lo llamamos <strong>Control de versiones</strong>. Hay una copia en un servidor que es dónde todos los desarrolladores deben acudir para empezar a trabajar (el <strong>repositorio</strong>). Entonces, el desarrollador parte de esa versión, hace los cambios que tiene que hacer, y sube sus cambios al servidor. Ha creado una nueva versión de los documentos que ha modificado (una <strong>revisión</strong>). Si otro desarrollador quiere trabajar en ese mismo fichero, observará que alguien ha efectuado cambios antes que él, y si ya tenia una revisión del código, se bajará los cambios hechos por su compañero para actualizar su versión local (la <strong>copia de trabajo</strong>).</p>
<h2>Ventajas de usar un sistema de control de versiones</h2>
<p>Usar un sistema de control de versiones nos proporciona muchas ventajas:</p>
<ul>
<li>Poder en todo momento ver cuál es la versión más actual del proyecto, quien y cuándo la ha subido.</li>
<li> Comparar cualquier par de versiones, dónde vemos todas las partes añadidas, modificadas o eliminadas de los ficheros entre las dos versiones. </li>
<li>Volver atrás en el tiempo a una versión que funcionaba, si los cambios que hemos hecho no nos han llevado por el buen camino. </li>
<li>Crear distintas ramas del proyecto, para que sigan caminos separados a partir de un punto. </li>
<li>Etiquetar distintas revisiones que representan una versión oficial del proyecto (para indicar que la revisión 4283 coincide con la versión del proyecto 2.4.0, la etiquetaremos por ejemplo: 2_4_0).</li>
</ul>
<h2>Sistemas de control de versiones populares</h2>
<div>
<ul>
<li>CVS: Concurrent Versions System es el que ha sido mas popular hasta que ha sido rápidamente sustituido por el siguiente</li>
<li>SVN: Subversion, diseñado para reemplazar el CVS, mejorando casi todas las características de CVS y añadiendo funcionalidades que el antiguo no tenia.</li>
<li>Git: Un proyecto de Linus Torvalds, que no tiene el impacto que los otros dos anteriores, pero que sigue usándose en ciertos ámbitos.</li>
</ul>
<div>En posteriores artículos hablaré de las características de Subversion, cómo se crea un repositorio, cómo se trabaja en un proyecto con Subversion, etc&#8230;</div>
</div>
<img src="http://feeds.feedburner.com/~r/JROM/~4/272238651" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jrom.net/11-introduccion-control-de-versiones/feed</wfw:commentRss>
		<feedburner:origLink>http://jrom.net/11-introduccion-control-de-versiones</feedburner:origLink></item>
		<item>
		<title>Introducción a Ruby on Rails</title>
		<link>http://feeds.feedburner.com/~r/JROM/~3/270982077/10-introduccion-ruby-on-rails</link>
		<comments>http://jrom.net/10-introduccion-ruby-on-rails#comments</comments>
		<pubDate>Tue, 15 Apr 2008 20:07:25 +0000</pubDate>
		<dc:creator>Jordi Romero</dc:creator>
		
		<category><![CDATA[Ruby on Rails]]></category>

		<category><![CDATA[programación]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://jrom.net/?p=10</guid>
		<description><![CDATA[¿Qué es Ruby on Rails?
Ruby on Rails es un framework para desarrollar aplicaciones web que usan bases de datos. Esa seria la definición estricta que aparece en la web oficial de Ruby on Rails.
Yo definiría RoR cómo la solución a los problemas de casi cualquier desarrollador de aplicaciones web. RoR permite construir tu aplicación web [...]]]></description>
			<content:encoded><![CDATA[<h2>¿Qué es Ruby on Rails?</h2>
<p>Ruby on Rails es un framework para desarrollar aplicaciones web que usan bases de datos. Esa seria la definición estricta que aparece en la <a title="Web oficial de Ruby on Rails" href="http://www.rubyonrails.org/" target="_blank">web oficial</a> de Ruby on Rails.</p>
<p>Yo definiría RoR cómo la solución a los problemas de <em>casi</em> cualquier desarrollador de aplicaciones web. RoR permite construir tu aplicación web consumiendo el 98% de tu esfuerzo en la propia aplicación, dejando que el resto simplemente funcione.</p>
<p>Ruby on rails es una herramienta creada <strong>por</strong> desarrolladores de aplicaciones web <strong>para</strong> desarrolladores de aplicaciones web. Y además es Open Source!</p>
<h2>Rails vs el resto</h2>
<p>Rails ofrece una arquitectura MVC (Modelo-Vista-Controlador), que nos separa el código de la interfície (Vista), la lógica de control (Controlador) y los datos (Modelo).</p>
<p>También destaca una potente herramienta de generación de código &#8220;por defecto&#8221;: el scaffolding. Gracias al scaffolding podemos crear un código básico para un recurso (por ejemplo: posts, personas, facturas, paginas, &#8230;) que nos permite crear, editar, mostrar y borrar instancias de ese recurso sin tener que escribir ni una sola línea de ruby. Partiendo de ese código crearemos el resto de nuestra aplicación.</p>
<p>En definitiva, la gran distinción de Ruby on Rails es que nos permite crear aplicaciones web en muy poco tiempo, con un código muy limpio, modular, reutilizable y con facilidades para escalar.</p>
<img src="http://feeds.feedburner.com/~r/JROM/~4/270982077" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jrom.net/10-introduccion-ruby-on-rails/feed</wfw:commentRss>
		<feedburner:origLink>http://jrom.net/10-introduccion-ruby-on-rails</feedburner:origLink></item>
		<item>
		<title>Hello world!</title>
		<link>http://feeds.feedburner.com/~r/JROM/~3/270982078/1-hello-world</link>
		<comments>http://jrom.net/1-hello-world#comments</comments>
		<pubDate>Mon, 14 Apr 2008 21:00:37 +0000</pubDate>
		<dc:creator>Jordi Romero</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[blog]]></category>

		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://jrom.net/?p=1</guid>
		<description><![CDATA[Hello world! creado automáticamente por Wordpress. Cuándo esté el blog listo ya pondré un post de bienvenida un poco más serio.
]]></description>
			<content:encoded><![CDATA[<p>Hello world! creado automáticamente por Wordpress. Cuándo esté el blog listo ya pondré un post de bienvenida un poco más serio.</p>
<img src="http://feeds.feedburner.com/~r/JROM/~4/270982078" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jrom.net/1-hello-world/feed</wfw:commentRss>
		<feedburner:origLink>http://jrom.net/1-hello-world</feedburner:origLink></item>
	</channel>
</rss>
