<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>nuuve</title>
	<atom:link href="http://blog.nuuve.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.nuuve.com</link>
	<description>Nuestro punto de vista sobre creación de aplicaciones web y administración de sistemas</description>
	<lastBuildDate>Sun, 28 Aug 2011 21:00:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>Ya está disponible Let&#8217;s req!&#8230;</title>
		<link>http://blog.nuuve.com/2011/08/28/ya-esta-disponible-lets-req/</link>
		<comments>http://blog.nuuve.com/2011/08/28/ya-esta-disponible-lets-req/#comments</comments>
		<pubDate>Sun, 28 Aug 2011 21:00:20 +0000</pubDate>
		<dc:creator>twitter</dc:creator>
				<category><![CDATA[Status]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.nuuve.com/2011/08/28/ya-esta-disponible-lets-req/</guid>
		<description><![CDATA[Ya está disponible Let&#8217;s req! 1.2. Más información en http://t.co/T1QBekV]]></description>
			<content:encoded><![CDATA[<p>Ya está disponible Let&#8217;s req! 1.2. Más información en <a href="http://t.co/T1QBekV" rel="nofollow">http://t.co/T1QBekV</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nuuve.com/2011/08/28/ya-esta-disponible-lets-req/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>En nuestra repo de github está el código de Sparebrain&#8230;</title>
		<link>http://blog.nuuve.com/2011/02/19/en-nuestra-repo-de-github-esta/</link>
		<comments>http://blog.nuuve.com/2011/02/19/en-nuestra-repo-de-github-esta/#comments</comments>
		<pubDate>Sat, 19 Feb 2011 03:00:07 +0000</pubDate>
		<dc:creator>twitter</dc:creator>
				<category><![CDATA[Status]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.nuuve.com/2011/02/19/en-nuestra-repo-de-github-esta/</guid>
		<description><![CDATA[En nuestra repo de github está el código de Sparebrain, uno de nuestros proyectos workshop. http://t.co/oltpYvv]]></description>
			<content:encoded><![CDATA[<p>En nuestra repo de github está el código de Sparebrain, uno de nuestros proyectos workshop. <a rel="nofollow" href="http://t.co/oltpYvv">http://t.co/oltpYvv</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nuuve.com/2011/02/19/en-nuestra-repo-de-github-esta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Htaccess. Más mal que bien?</title>
		<link>http://blog.nuuve.com/2010/05/26/htaccess-mas-mal-que-bien/</link>
		<comments>http://blog.nuuve.com/2010/05/26/htaccess-mas-mal-que-bien/#comments</comments>
		<pubDate>Wed, 26 May 2010 18:35:28 +0000</pubDate>
		<dc:creator>Reven</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[configuración]]></category>
		<category><![CDATA[LAMP]]></category>

		<guid isPermaLink="false">http://blog.nuuve.com/?p=108</guid>
		<description><![CDATA[Los archivos .htaccess, llamados también &#8220;archivos de configuración distribuidos&#8220;, son una forma de controlar la configuración de Apache a nivel de cada directorio. Se han hecho terriblemente populares gracias a los servicios de alojamiento compartidos, en los que no es recomendable dar acceso a la configuración de Apache a los usuarios, y por tanto esta [...]]]></description>
			<content:encoded><![CDATA[<p>Los archivos <strong>.htaccess</strong>, llamados también &#8220;<em>archivos de configuración distribuidos</em>&#8220;, son una forma de controlar la configuración de Apache a nivel de cada directorio. Se han hecho terriblemente populares gracias a los servicios de alojamiento compartidos, en los que no es recomendable dar acceso a la configuración de Apache a los usuarios, y por tanto esta es la única forma de que estos la cambien.</p>
<p>El uso de archivos .htaccess se ha extendido hasta el punto de que muchos usuarios creen que deben ser usados para cosas como la autentificación de usuarios o las reglas de re-escritura (Rewrite) de la URL.</p>
<p>Muchos desarrolladores, entre los cuales me incluyo, que luego se pasan a un servidor privado (o VPS) siguen usando los archivos .htaccess indiscriminadamente, sin darse cuenta del golpe que esto supone al rendimiento de Apache, sobre todo teniendo en cuenta que los recursos de esos sistemas suelen ser limitados. La documentación de Apache sobre .htaccess lo deja bien claro:</p>
<blockquote><p>En general, nunca se deberían utilizar archivos .htaccess cuando se tiene acceso al archivo de configuración principal del servidor.</p></blockquote>
<p><a href="http://httpd.apache.org/docs/2.2/howto/htaccess.html">Apache .htaccess docs</a></p>
<p>La primera razón para esto, es que cada vez que se le pide un archivo a Apache, éste deberá buscar un archivo .htaccess en ese directorio y los superiores para ver si se aplican reglas adicionales a las que tiene en la configuración principal (la cual se carga una sola vez, al iniciar Apache). Además en el caso de que encuentre el archivo, deberá cargarlo e interpretarlo.</p>
<p>La segunda razón es la seguridad. El archivo de configuración principal suele estar fuera de la raíz del servidor y bien protegido con los permisos adecuados. Los archivos .htaccess son un poco más susceptibles a ataques si la configuración de Apache no es la adecuada y también son más susceptibles a errores que pueden comprometer la seguridad de otros archivos.</p>
<p>No hay ningún ajuste de configuración que no pueda ponerse en el archivo central. Así, los siguientes 2 bloques son equivalentes:</p>
<p>Archivo .htaccess en /www/htdocs/example</p>
<pre class="brush: plain; title: ;">RewriteEngine On
RewriteCond %{REQUEST_URI} !/paginavieja.html$
RewriteRule $ /paginanueva.html [R=302,L]</pre>
<p>Archivo de configuración principal de Apache:</p>
<pre class="brush: plain; title: ;">&lt;Directory /www/htdocs/example&gt;
RewriteEngine On
RewriteCond %{REQUEST_URI} !/paginavieja.html$
RewriteRule $ /paginanueva.html [R=302,L]
&lt;/Directory&gt;</pre>
<p>Para evitar que Apache siga buscando archivos .htaccess, tendremos que encontrar la directriz <strong>AllowOverride</strong> en la configuración y cambiarla a lo siguiente:</p>
<pre class="brush: plain; title: ;">AllowOverride None</pre>
<p>Conseguiremos un incremento de rendimiento notable.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nuuve.com/2010/05/26/htaccess-mas-mal-que-bien/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Éxito</title>
		<link>http://blog.nuuve.com/2010/05/25/exito/</link>
		<comments>http://blog.nuuve.com/2010/05/25/exito/#comments</comments>
		<pubDate>Tue, 25 May 2010 14:35:43 +0000</pubDate>
		<dc:creator>Reven</dc:creator>
				<category><![CDATA[Citas]]></category>
		<category><![CDATA[éxito]]></category>
		<category><![CDATA[filosofía]]></category>
		<category><![CDATA[trabajo]]></category>

		<guid isPermaLink="false">http://blog.nuuve.com/?p=103</guid>
		<description><![CDATA[El éxito es algo complicado de definir porque quiere decir cosas distintas para personas distintas. (&#8230;) Realmente me encanta lo que hago. Trabajo con gente interesante y divertida. Mi mujer y yo esperamos nuestro primer hijo pronto y puedo trabajar las horas que quiero. Para mí estas cosas son indicadores mucho mejores del éxito de [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>El éxito es algo complicado de definir porque quiere decir cosas distintas para personas distintas. (&#8230;) Realmente me encanta lo que hago. Trabajo con gente interesante y divertida. Mi mujer y yo esperamos nuestro primer hijo pronto y puedo trabajar las horas que quiero. Para mí estas cosas son indicadores mucho mejores del éxito de un negocio que cualquier cosa en una hoja de cálculo.</p></blockquote>
<p>David Greiner, de <a href="http://www.campaignmonitor.com/">Campaign Monitor</a>, en una entrevista en <a href="http://37signals.com/svn/posts/2342-profitable-and-proud-campaign-monitor">svn</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nuuve.com/2010/05/25/exito/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hemos puesto nuestra repo en G&#8230;</title>
		<link>http://blog.nuuve.com/2010/05/25/hemos-puesto-nuestra-repo-en-g/</link>
		<comments>http://blog.nuuve.com/2010/05/25/hemos-puesto-nuestra-repo-en-g/#comments</comments>
		<pubDate>Tue, 25 May 2010 14:13:10 +0000</pubDate>
		<dc:creator>twitter</dc:creator>
				<category><![CDATA[Status]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.nuuve.com/2010/05/25/hemos-puesto-nuestra-repo-en-g/</guid>
		<description><![CDATA[Hemos puesto nuestra repo en GitHub: http://github.com/nuuve En él publicaremos nuestros proyectos &#8220;workshop&#8221;.]]></description>
			<content:encoded><![CDATA[<p>Hemos puesto nuestra repo en GitHub: <a href="http://github.com/nuuve" rel="nofollow">http://github.com/nuuve</a> En él publicaremos nuestros proyectos &#8220;workshop&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nuuve.com/2010/05/25/hemos-puesto-nuestra-repo-en-g/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Los ocho secretos del éxito</title>
		<link>http://blog.nuuve.com/2010/03/31/los-ocho-secretos-del-exito/</link>
		<comments>http://blog.nuuve.com/2010/03/31/los-ocho-secretos-del-exito/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 19:40:46 +0000</pubDate>
		<dc:creator>Pau</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[éxito]]></category>
		<category><![CDATA[filosofía]]></category>

		<guid isPermaLink="false">http://blog.nuuve.com/?p=93</guid>
		<description><![CDATA[TED (del inglés Technology, Entertainment, Design) es una organización sin ánimo de lucro que lleva desde 1984 dedicada a difundir las ideas que merezca la pena difundir (como dice su eslogan, &#8220;ideas worth spreading&#8221;). Entre todo lo que hacen, algo que me tiene especialmente cautivado son las TED Talks: una serie de charlas con expertos [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.ted.com/" target="_blank">TED</a> (del inglés Technology, Entertainment, Design) es una organización sin ánimo de lucro que lleva desde 1984 dedicada a difundir las ideas que merezca la pena difundir (como dice su eslogan, &#8220;ideas worth spreading&#8221;). Entre todo lo que hacen, algo que me tiene especialmente cautivado son las <a href="http://www.ted.com/talks" target="_blank">TED Talks</a>: una serie de charlas con expertos en tecnología, sociedad, cultura, política y cosas así que son realmente interesantes.</p>
<p>Y de todas esas charlas, hay una que me parece útil para recordarnos qué es verdaderamente importante: qué marca la diferencia en nuestras vidas y en nuestras carreras profesionales. Los 8 secretos del éxito, por Richard St. John:</p>
<p><!--copy and paste--><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="334" height="326" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="wmode" value="transparent" /><param name="bgColor" value="#ffffff" /><param name="flashvars" value="vu=http://video.ted.com/talks/dynamic/RichardSt.John_2005-medium.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/RichardSt.John-2005.embed_thumbnail.jpg&amp;vw=320&amp;vh=240&amp;ap=0&amp;ti=70&amp;introDuration=16500&amp;adDuration=4000&amp;postAdDuration=2000&amp;adKeys=talk=richard_st_john_s_8_secrets_of_success;year=2005;theme=not_business_as_usual;theme=presentation_innovation;theme=how_we_learn;event=TED2005;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /><param name="src" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" /><param name="bgcolor" value="#ffffff" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="334" height="326" src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" flashvars="vu=http://video.ted.com/talks/dynamic/RichardSt.John_2005-medium.flv&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/RichardSt.John-2005.embed_thumbnail.jpg&amp;vw=320&amp;vh=240&amp;ap=0&amp;ti=70&amp;introDuration=16500&amp;adDuration=4000&amp;postAdDuration=2000&amp;adKeys=talk=richard_st_john_s_8_secrets_of_success;year=2005;theme=not_business_as_usual;theme=presentation_innovation;theme=how_we_learn;event=TED2005;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" bgcolor="#ffffff" wmode="transparent" allowfullscreen="true"></embed></object></p>
<p>Si el inglés no es lo tuyo, el vídeo dispone de subtítulos en castellano (se pueden activar haciendo clic en &#8220;View subtitles&#8221;). Interesante, ¿verdad?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nuuve.com/2010/03/31/los-ocho-secretos-del-exito/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Filosofía Unix</title>
		<link>http://blog.nuuve.com/2010/03/30/filosofia-unix/</link>
		<comments>http://blog.nuuve.com/2010/03/30/filosofia-unix/#comments</comments>
		<pubDate>Tue, 30 Mar 2010 17:37:23 +0000</pubDate>
		<dc:creator>Pau</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[filosofía]]></category>
		<category><![CDATA[unix]]></category>

		<guid isPermaLink="false">http://blog.nuuve.com/?p=89</guid>
		<description><![CDATA[No se cómo llegué el otro día a un capítulo del libro The Art of Unix Programming en donde se explican las bases de la filosofía de diseño que sigue Unix. En síntesis, se exponen 17 normas generales que me parecen muy interesantes e importantes. De hecho, no estaría mal que el primer día que [...]]]></description>
			<content:encoded><![CDATA[<p>No se cómo llegué el otro día a un capítulo del libro <a href="http://www.faqs.org/docs/artu/" target="_blank">The Art of Unix Programming</a> en donde se explican las <a href="http://www.faqs.org/docs/artu/ch01s06.html" target="_blank">bases de la filosofía de diseño</a> que sigue Unix. En síntesis, se exponen 17 normas generales que me parecen muy interesantes e importantes. De hecho, no estaría mal que el primer día que pisas una clase de informática te lo pusieran delante&#8230;</p>
<p>Las 17 reglas, en traducción libre, son las siguientes:</p>
<ol>
<li>Regla de la <strong>modularidad</strong>: escribe partes simples conectadas por interfaces limpias.</li>
<li>Regla de la <strong>claridad</strong>: la claridad es mejor que la astucia.</li>
<li>Regla de la <strong>composición</strong>: diseña programas para que puedan ser conectados a otros programas.</li>
<li>Regla de la <strong>separación</strong>: separa las reglas de los mecanismos: separa las interfaces del procesado.</li>
<li>Regla de la <strong>simplicidad</strong>: diseña para la simplicidad: añade complejidad sólo donde sea necesario.</li>
<li>Regla de la <strong>parsimonia</strong>: escribe un programa complejo sólo cuando esté demostrado que no hay otra solución.</li>
<li>Regla de la <strong>transparencia</strong>: diseña para la visibilidad, para hacer más fácil la inspección y la depuración.</li>
<li>Regla de la <strong>robustez</strong>: la robustez es hija de la transparencia y la simplicidad.</li>
<li>Regla de la <strong>representación</strong>: mantén el conocimiento en los datos, de manera que la lógica del programa pueda ser estúpida y robusta.</li>
<li>Regla de la <strong>mínima sorpresa</strong>: en el diseño de interfaces, busca siempre producir la mínima sorpresa posible.</li>
<li>Regla del <strong>silencio</strong>: si un programa no tiene nada sorprendente que decir, es mejor que no diga nada.</li>
<li>Regla de la <strong>reparación</strong>: si el programa tiene que fallar, que lo haga lo más rápida y ruidosamente posible.</li>
<li>Regla de la <strong>economía</strong>: el tiempo del programador es caro: consérvalo sobre el tiempo de la máquina.</li>
<li>Regla de la <strong>generación</strong>: evita hacer las cosas a mano: siempre que puedas, escribe programas que escriban programas.</li>
<li>Regla de la <strong>optimización</strong>: prototipa antes de perfeccionar: haz que funcione antes de optimizarlo.</li>
<li>Regla de la <strong>diversidad</strong>: desconfía de todo el que diga &#8220;es la única forma correcta&#8221;.</li>
<li>Regla de la <strong>extensibilidad</strong>: diseña para el futuro, porque estará aquí antes de lo que piensas.</li>
</ol>
<p>Es para pensar en ello&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nuuve.com/2010/03/30/filosofia-unix/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Convertir todas las tablas InnoDB a MyISAM</title>
		<link>http://blog.nuuve.com/2010/03/24/convertir-todas-las-tablas-innodb-a-myisam/</link>
		<comments>http://blog.nuuve.com/2010/03/24/convertir-todas-las-tablas-innodb-a-myisam/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 11:15:50 +0000</pubDate>
		<dc:creator>Pau</dc:creator>
				<category><![CDATA[Bases de datos]]></category>
		<category><![CDATA[almacenamiento]]></category>
		<category><![CDATA[consultas]]></category>
		<category><![CDATA[InnoDB]]></category>
		<category><![CDATA[MyISAM]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://blog.nuuve.com/?p=77</guid>
		<description><![CDATA[Hace ya unos días se me planteó la necesidad de cambiar el motor de almacenamiento de los datos de todas las tablas de una base de datos (bastante grande) de InnoDB a MyISAM. Como editar una a una cada tabla de la base de datos no era una opción, me puse a buscar un poco [...]]]></description>
			<content:encoded><![CDATA[<p>Hace ya unos días se me planteó la necesidad de <strong>cambiar el motor de almacenamiento</strong> de los datos de todas las tablas de una base de datos (bastante grande) de InnoDB a MyISAM.</p>
<p>Como editar una a una cada tabla de la base de datos no era una opción, me puse a buscar un poco y encontré una solución muy sencilla y flexible en <a href="http://codesnippets.joyent.com/posts/show/1451" target="_blank">CodeSnippets</a>, que simplemente genera el volcado de las consultas necesarias para convertir las tablas de todas las bases de datos del servidor:</p>
<pre class="brush: sql; title: ;">
SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' engine=MyISAM;') FROM information_schema.tables WHERE engine = 'InnoDB';
</pre>
<p>Si queremos convertir sólo las tablas de una base de datos en concreto, podemos modificar la consulta anterior y escribir algo así:</p>
<pre class="brush: sql; title: ;">
SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,'  engine=MyISAM;') FROM information_schema.tables WHERE engine = 'InnoDB'  and table_schema = 'NOMBRE_DB';
</pre>
<p>En donde sólo sería necesario sustituir NOMBRE_DB por el nombre de la base de datos cuyas tablas queremos convertir de InnoDB a MyISAM.</p>
<p>Ambas consultas generan únicamente un listado con las consultas necesarias para realizar la conversión, así que para hacer efectiva la misma tendremos, además, que copiar, pegar y ejecutar las consultas resultantes. Próximamente dedicaremos un artículo a valorar las distintas  tecnologías de almacenamiento que ofrece MySQL y sus ventajas e  inconvenientes.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nuuve.com/2010/03/24/convertir-todas-las-tablas-innodb-a-myisam/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Depuración en Ruby on Rails</title>
		<link>http://blog.nuuve.com/2010/02/05/depuracion-en-ruby-on-rails/</link>
		<comments>http://blog.nuuve.com/2010/02/05/depuracion-en-ruby-on-rails/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 14:42:00 +0000</pubDate>
		<dc:creator>Pau</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[depuración]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://blog.nuuve.com/?p=64</guid>
		<description><![CDATA[En Ruby on Rails sólo las vistas pueden enviar datos formateados a la salida estándar (el documento HTML en este caso), así que en los demás casos la depuración de la aplicación puede llegar a ser algo tediosa. En este artículo vamos a introducir algunos trucos útiles para depurar programas en Ruby on Rails, separándolos [...]]]></description>
			<content:encoded><![CDATA[<p>En Ruby on Rails sólo las vistas pueden enviar datos formateados a la salida estándar (el documento HTML en este caso), así que en los demás casos la depuración de la aplicación puede llegar a ser algo tediosa. En este artículo vamos a introducir algunos trucos útiles para <strong>depurar programas en Ruby on Rails</strong>, separándolos según sean aplicables en vistas o controladores.</p>
<h3>Vistas</h3>
<p>El caso de las vistas es el más sencillo: basta con utilizar la instrucción &#8220;debug&#8221;. Por ejemplo, en una vista de la clase &#8220;Project&#8221; podríamos escribir:</p>
<pre class="brush: ruby; title: ;">
&lt;%= debug @project %&gt;
</pre>
<p>Y obtendremos una descripción del objeto en cuestión en formato <a href="http://es.wikipedia.org/wiki/YAML">YAML</a> como la que sigue:</p>
<pre class="brush: ruby; title: ;">
--- !ruby/object:Project
attributes:
name: Test
created_at: 2010-02-04 16:00:37
updated_at: 2010-02-04 16:00:37
id: &quot;13&quot;
description: This is a project for testing
attributes_cache: {}
</pre>
<p>Esto mismo puede obtenerse también con una línea como la siguiente:</p>
<pre class="brush: ruby; title: ;">
&lt;%= simple_format @project.to_yaml %&gt;
</pre>
<h3>Controladores</h3>
<p>El caso de los controladores es algo más sutil. Podríamos añadir datos a una variable y mostrar el contenido de la misma a través de una vista, pero es mucho más sencillo utilizar el Log de Ruby on Rails. En desarrollo, el log se guarda en el archivo development.log.</p>
<p>Para enviar texto de depuración al log, podemos utilizar el siguiente método:</p>
<pre class="brush: ruby; title: ;">
logger.debug &quot;Texto de depuración&quot;
</pre>
<p>Para leer el contenido del archivo de logs podemos abrirlo sin más con un editor o con el entorno de desarrollo que estemos utilizando, aunque <a href="http://www.robertooliva.com/2007/06/11/ayuda-a-la-depuracion/">hay un truco</a>. Si utilizamos Linux o Mac OS, podemos escribir en el Terminal (desde la carpeta de la aplicación):</p>
<pre class="brush: bash; title: ;">
tail -f log/development.log
</pre>
<p>Esta instrucción nos mostrará en pantalla el final del archivo, y, lo que es más importante, irá añadiendo a la salida los nuevos mensajes conforme éstos se vayan añadiendo al log. De esta manera podemos hacer un seguimiento más preciso de la ejecución de nuestra aplicación.</p>
<h3>Para saber más</h3>
<p>La mejor referencia sobre depuración es, evidentemente, <a href="http://guides.rubyonrails.org/debugging_rails_applications.html">la guía oficial de Ruby on Rails</a>. En la guía hay también una explicación muy detallada del uso de <strong>ruby-debug</strong>, la herramienta de depuración propia de Ruby.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nuuve.com/2010/02/05/depuracion-en-ruby-on-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>¿Por qué Ruby on Rails?</title>
		<link>http://blog.nuuve.com/2010/02/04/%c2%bfpor-que-ruby-on-rails/</link>
		<comments>http://blog.nuuve.com/2010/02/04/%c2%bfpor-que-ruby-on-rails/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 11:00:14 +0000</pubDate>
		<dc:creator>Pau</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://blog.nuuve.com/?p=41</guid>
		<description><![CDATA[Uno de nuestros proyectos, sobre el que quizás escribamos próximamente, está siendo desarrollando sobre el framework Ruby on Rails. Pero ¿por qué? Podríamos dar muchos motivos: la legibilidad del código, la generación automática de código, el elevado grado de abstracción que propone, la sencillez de la arquitectura&#8230; pero al final, estaríamos hablando de lo mismo: [...]]]></description>
			<content:encoded><![CDATA[<p>Uno de nuestros proyectos, sobre el que quizás escribamos próximamente, está siendo desarrollando sobre el framework <a href="http://es.wikipedia.org/wiki/Ruby_on_Rails" target="_blank">Ruby on Rails</a>. Pero ¿por qué? Podríamos dar muchos motivos: la legibilidad del código, la generación automática de código, el elevado grado de abstracción que propone, la sencillez de la arquitectura&#8230; pero al final, estaríamos hablando de lo mismo: la <strong>productividad</strong>.</p>
<p>Antes de empezar a escribir este artículo andaba dándole vueltas a lo siguiente: ¿Cómo explicar las ventajas de trabajar con Ruby on Rails a alguien que nunca haya trabajado con Ruby on Rails?. Y creo que he encontrado la respuesta: mostrando el <strong>código</strong>.</p>
<p>Lo más adecuado, teniendo en cuenta que este framework está enfocado a trabajar bajo el patrón <a href="http://es.wikipedia.org/wiki/Modelo_Vista_Controlador" target="_blank">MVC</a>, sería poner un ejemplo relacionado con cada tipo de componente. Creo que, en conjunto, aportan una idea bastante buena de la filosofía del sistema.</p>
<h3>Modelos</h3>
<p>¿Cómo describir un modelo en Ruby on Rails? Pongamos que tenemos una clase Proyecto (<em>Project</em>), cuyos objetos están vinculados a un directivo (<em>Manager</em>) y a varios hitos (<em>Milestone</em>), y que además deseamos garantizar que el nombre está presente al guardar el objeto. Pues bien, bastaría con algo así:</p>
<pre class="brush: ruby; title: ;">
class Project &lt; ActiveRecord::Base
  has_one :manager
  has_many :milestones

  validates_presence_of :name
end
</pre>
<p>Por otro lado, necesitaríamos definir el modelo en la base de datos. Para ello, Ruby on Rails, nos proporciona las migraciones (<em>Migrations</em>), que son descripciones abstractas de los modelos de datos que se convierten automáticamente al lenguaje de consultas del sistema gestor que estemos utilizando. Así, uno simplemente especifica algo como:</p>
<pre class="brush: ruby; title: ;">
class CreateProjects &lt; ActiveRecord::Migration
  def self.up
    create_table :projects do |t|
      t.string :name
      t.string :description

      t.timestamps
    end
  end

  def self.down
    drop_table :projects
  end
end
</pre>
<p>Y es Ruby on Rails el encargado de hacer el &#8220;trabajo sucio&#8221;. Este enfoque nos permitiría, por ejemplo modificar el motor de la base de datos de nuestro proyecto en cuestión de minutos.</p>
<h3>Controladores</h3>
<p>Los controladores agrupan métodos que actúan sobre el modelo de datos, sirviendo de intermediarios entre las vistas y el modelo. Su organización es algo más compleja que la de los modelos y las vistas, así que sólo voy a mostrar algunas líneas significativas.</p>
<p>¿Cómo obtener todos los proyectos del sistema?</p>
<pre class="brush: ruby; title: ;">
  @projects = Project.all
</pre>
<p>¿Y cómo grabar los datos de un nuevo proyecto (&#8220;Project&#8221;) recibidos desde un formulario? Muy sencillo:</p>
<pre class="brush: ruby; title: ;">
  @project = Project.new(params[:project])
  @project.save
</pre>
<h3>Vistas</h3>
<p>Por último, hablemos de las vistas, que en este caso vienen a ser las páginas en HTML que presentan datos y formularios. Por ejemplo, ¿cómo sería el formulario que recogiera los datos del ejemplo anterior?</p>
<pre class="brush: ruby; title: ;">
&lt;% form_for @project do |f| %&gt;
  &lt;%= f.error_messages %&gt;
  &lt;p&gt;
    &lt;%= f.label :name %&gt;&lt;br /&gt;
    &lt;%= f.text_field :name %&gt;
  &lt;/p&gt;
  &lt;p&gt;
    &lt;%= f.label :description %&gt;&lt;br /&gt;
    &lt;%= f.text_area :description %&gt;
  &lt;/p&gt;
  &lt;p&gt;
    &lt;%= f.submit 'Create', :action =&gt; 'create' %&gt;
  &lt;/p&gt;
&lt;% end %&gt;
</pre>
<p>¿Te han convencido estos ejemplos? Entonces prueba a darle una oportunidad a Ruby on Rails. No te arrepentirás.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.nuuve.com/2010/02/04/%c2%bfpor-que-ruby-on-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

