<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
    <title>Tecnología Social</title>
    <link rel="alternate" type="text/html" href="http://blog.cotecso.com.ve/" />
    
    <id>tag:blog.cotecso.com.ve,2009-02-22://3</id>
    <updated>2009-07-06T00:29:19Z</updated>
    <subtitle>Tecnología Social, por COTECSO, es un weblog sobre tecnologías de información, la web, diseño, desarrollo, software libre y mucho más.</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.23-en</generator>

<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/tecnologiasocial" /><feedburner:info uri="tecnologiasocial" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
    <title>¿Por qué utilizar un iPhone en vez de un BlackBerry o lo que sea?</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tecnologiasocial/~3/HbRzLA4VYXg/por-que-utilizar-un-iphone-en-vez-de-un-blackberry-o-lo-que-sea.html" />
    <id>tag:blog.cotecso.com.ve,2009://3.13</id>

    <published>2009-07-05T22:30:53Z</published>
    <updated>2009-07-06T00:29:19Z</updated>

    <summary>Aquí en Venezuela, muchas cosas son modismos. La gente compra lo que los demás compran. La mayoría no se pregunta si es lo mejor (para el dinero que puede gastar), o si al menos es lo que en realidad necesita....</summary>
    <author>
        <name>Ricardo Rodríguez</name>
        
    </author>
    
        <category term="Gadgets" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="apple" label="Apple" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="blackberry" label="BlackBerry" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="diseño" label="diseño" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="iphone" label="iPhone" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="modismos" label="modismos" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="usabilidad" label="usabilidad" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="venezuela" label="venezuela" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="es" xml:base="http://blog.cotecso.com.ve/">
        &lt;p&gt;Aquí en Venezuela, muchas cosas son modismos. La gente compra lo que los demás compran. La mayoría no se pregunta si es lo mejor (para el dinero que puede gastar), o si al menos es lo que en realidad necesita.&lt;/p&gt;

&lt;p&gt;Aquí, la moda es cualquier cosa menos el &lt;a href="http://www.apple.com/iphone"&gt;iPhone&lt;/a&gt;, el otro día la hija de una amiga me preguntó si mi teléfono era un &lt;a href="http://www.apple.com/es/ipodtouch/"&gt;iPod (touch)&lt;/a&gt;  y sin muchos detalles yo le respondí: &lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;No, es un iPhone. Es como un iPod Touch pero con teléfono, GPS y cámara.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A lo que ella respondió: &lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Ahh, ese es chimbo, mejor es un &lt;a href="http://www.blackberry.com/"&gt;BlackBerry&lt;/a&gt;. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;De necio, le pregunté &lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;¿Por qué?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;y me respondió: &lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;El BlackBerry tiene &lt;em&gt;Live Messenger&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Por razones obvias la conversación llegó hasta ahí. No uso Windows Live Messenger ni en mi computadora, y si existiera para Linux tampoco lo usaría, prefiero una sola aplicación que me mantenga conectado a todos los sistemas de mensajerías y redes sociales (cuando me conecto).&lt;/p&gt;

&lt;p&gt;El punto es que muchos Venezolanos (jóvenes y adultos) son así. ¿El iPhone es chimbo porque no es el que está de moda aqui o porque no tiene &lt;em&gt;Windows Live Messenger&lt;/em&gt;?. El problema es que &lt;strong&gt;no&lt;/strong&gt; están acostumbrados a evaluar un producto por su &lt;a href="http://es.wikipedia.org/wiki/Usabilidad"&gt;usabilidad&lt;/a&gt;, sino por la cantidad de &lt;em&gt;"features"&lt;/em&gt; que tiene, cuando es bien sabido que muchas veces &lt;em&gt;menos es mas&lt;/em&gt;, sobre todo en software (que es lo que tienen "adentro" los teléfonos estos).&lt;/p&gt;

&lt;h3&gt;Algunas de mis razones para tener un iPhone en vez de un BlackBerry&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Usabilidad&lt;/strong&gt;: Después de varios días de uso, leí el manual en línea para ver si había cosas que aún no sabía como hacer en el iPhone. El manual impreso que trae no dice casi nada, porque el iPhone está diseñado "for dummies", se siente como si el teléfono se anticipa a lo que quieres hacer. Cada aplicación está cuidadosamente pensada en el usuario final, además, la pantalla táctil, con multitouch funciona a las mil maravillas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Menos es mas&lt;/strong&gt;: Si bien existen cosas que el iPhone no posee, es debido a que en realidad no son de uso tan común, o no dan un valor agregado real a la experiancia de uso. Además, la rápida evolución de su sistema operativo incorpora lo necesario en sus actualizaciones.
&lt;span class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;a href="http://blog.cotecso.com.ve/imagenes/bold_iphone_5.jpg"&gt;&lt;img alt="bold_iphone.jpg" src="http://blog.cotecso.com.ve/assets_c/2009/07/bold_iphone_5-thumb-240x178-31.jpg" width="240" height="178" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Diseño&lt;/strong&gt;: &lt;em&gt;"Designed in California. Assembled in China"&lt;/em&gt;... el BlackBerry Bold, por ejemplo, es horroroso, el teclado es mas de la mitad del teléfono!!!. El acabado del iPhone es impecable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Precio&lt;/strong&gt;: Yo compré mi iPhone 3G de 8GB por algo menos de 2000 BsF. Si se compara por ejemplo con el BlackBerry Storm... vale como 3.700 BsF.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Aplicaciones&lt;/strong&gt;: En la Apple Store hay de todo y para todos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Desarrollo&lt;/strong&gt;: Espero en un futuro cercano comenzar a probar el desarrollo de aplicaciones para el iPhone, es una oportunidad de negocio y creo que puede ser bastante fructífera.
&lt;span class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;a href="http://blog.cotecso.com.ve/imagenes/logo-apple-actual1.jpg"&gt;&lt;img alt="logo-apple.jpg" src="http://blog.cotecso.com.ve/assets_c/2009/07/logo-apple-actual1-thumb-240x280-33.jpg" width="240" height="280" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;El fabricante&lt;/strong&gt;: No necesito decir mas... cada producto de Apple está cuidadosamente diseñado, tienen algo que lo identifica como de Apple.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Existen muchas cosas más que no voy a detallar en este artículo, hay muchos reviews en internet. Tampoco quiero decir que nadie deba usar un BlackBerry u otro teléfono, simplemente creo que todos debemos sentarnos y pensar que es lo que nos sirve, lo que se ajusta a nosotros y lo que podemos gastar, pero no comprar por modismos. Por ejemplo, muchas personas se la pasan intercambiando sus pin del BlackBerry. En mi caso, no tengo casi conocidos con BlackBerry (o conocidos que me interese estar en constante contacto) y no me gusta estar pegado en el teléfono escribiendo mensajitos, simplemente prefiero llamar o enviar un SMS.&lt;/p&gt;

&lt;p&gt;Saludos!&lt;/p&gt;

        

    
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/grNjDZelSjcOYZBjSqbtJ3Pzh4M/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/grNjDZelSjcOYZBjSqbtJ3Pzh4M/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/grNjDZelSjcOYZBjSqbtJ3Pzh4M/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/grNjDZelSjcOYZBjSqbtJ3Pzh4M/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/tecnologiasocial/~4/HbRzLA4VYXg" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.cotecso.com.ve/2009/07/por-que-utilizar-un-iphone-en-vez-de-un-blackberry-o-lo-que-sea.html</feedburner:origLink></entry>

<entry>
    <title>The Passionate Programmer: Impresiones</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tecnologiasocial/~3/UzWjQjYb2Z8/the-passionate-programmer-impresiones.html" />
    <id>tag:blog.cotecso.com.ve,2009://3.12</id>

    <published>2009-07-05T15:24:27Z</published>
    <updated>2009-07-05T15:47:54Z</updated>

    <summary> Actualmente estoy leyendo el nuevo libro de Chad Fowler, The Passionate Programmer, me llegó hace poco desde Amazon. ¿Cómo dí con este libro? Bueno, en realidad soy un lector frecuente de las publicaciones de The Pragmatic Bookshelf y siempre...</summary>
    <author>
        <name>Ricardo Rodríguez</name>
        
    </author>
    
        <category term="Reviews" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="desarrollodesoftware" label="desarrollo de software" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="libros" label="libros" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="músico" label="músico" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="passionateprogrammer" label="passionate programmer" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="remarcable" label="remarcable" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="reviews" label="reviews" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="es" xml:base="http://blog.cotecso.com.ve/">
        &lt;p&gt;&lt;span class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;a href="http://blog.cotecso.com.ve/imagenes/passionate_programmer_cover.jpg"&gt;&lt;img alt="passionate_programmer_cover.jpg" src="http://blog.cotecso.com.ve/assets_c/2009/07/passionate_programmer_cover-thumb-240x360-29.jpg" width="240" height="360" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" /&gt;&lt;/a&gt;&lt;/span&gt;
Actualmente estoy leyendo el nuevo libro de &lt;a href="http://chadfowler.com/"&gt;Chad Fowler&lt;/a&gt;, &lt;a href="http://www.pragprog.com/titles/cfcar2/the-passionate-programmer"&gt;The Passionate Programmer&lt;/a&gt;, me llegó hace poco desde &lt;a href="http://www.amazon.com"&gt;Amazon&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;¿Cómo dí con este libro? Bueno, en realidad soy un lector frecuente de las publicaciones de &lt;a href="http://www.pragprog.com/"&gt;The Pragmatic Bookshelf&lt;/a&gt; y siempre estoy pendiente de sus libros nuevos. Decidí comprarlo cuando leí los extractos que ellos publican (para enamorar a uno... :p), en especial el del capítulo &lt;a href="http://media.pragprog.com/titles/cfcar2/worst.pdf"&gt;Be the Worst&lt;/a&gt;. El asunto es que Chad Fowler además de programador es músico (de hecho era saxofonista profesional antes de ser un programador), de ahí la portada del libro. &lt;/p&gt;

&lt;p&gt;Mis amigos saben que he sido violinista casi toda mi vida (ahorita es que lo tengo medio abandonado... pero no por mucho, me pican las manos para finalizar el Sibelius y la Sonata 3 -Ballade- de Ysaÿe). También saben que estuve trabajando para una contratista en PDVSA por mas de 3 años. Lo que no deben saber muchos es que, me fuí (o me botaron, como lo prefieran), al igual que varios compañeros, que actualmente estamos juntos aquí en &lt;a href="http://www.cotecso.com.ve"&gt;COTECSO&lt;/a&gt;, iniciando una Cooperativa de desarrollo de software, adiestramiento, etc.&lt;/p&gt;

&lt;p&gt;The Passionate Programmer trata de &lt;em&gt;Cómo crear o tener una carrera "remarcable" en el mundo del desarrollo de software&lt;/em&gt;, y no es que antes yo o alguno de nosotros en COTECSO fuera malo, pero como asalariado todo es mas fácil (al principio) y hay cierta sensación de seguridad, se está en el anonimato, tras las paredes de una gran compañía, nadie sabes que existes. Yo diría que es seguro mas no gratificante. Pero, como emprendedores, necesitamos dar a conocer nuestras habilidades, necesitamos proyectarnos en la comunidad de desarrollo de software, crear productos, invertir en conociemiento, ser mejores... ser exitosos. &lt;/p&gt;

&lt;p&gt;Compré The Passionate Programmer porque trata estos temas, con consejos para crear esa carrera "remarcable" como desarrollador de software y porque lo escribió un músico con una pasión sobre las computadoras. De hecho, a medida que voy avanzando en el libro, me he visto retratado en muchas de las anécdotas y experiencias que allí se relatan. Además, está lleno de ejemplos e historias motivadoras de gente exitosa en el mundo del software. Es obvio que está escrito por alguien a quién le apasiona lo que hace.&lt;/p&gt;

&lt;p&gt;Al final, los músicos siempre quieren ser mejores, quieren ser "geniales" (para no decir vergatarios!) y eso requiere trabajo, dedicación, constancia, paciencia e "invertir" en uno mismo. &lt;strong&gt;Parafraseando a Chad Fowler:&lt;/strong&gt; hay muchos buenos músicos que son también muy buenos desarrolladores de software, y &lt;strong&gt;no&lt;/strong&gt; es porque piensen igual, o que ambos sean paranóicos con el detalle (pregúntenle a un violinista) o sean creativos. La razón es que una persona que en realidad quiere ser genial y exitosa (como un músico) tiene mas probabilidad de serlo que alguien que sólo quiere hacer su trabajo.&lt;/p&gt;

&lt;p&gt;Saludos!&lt;/p&gt;

        

    
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EVxu3heHeEZ4oH2Zik0CFcFJEvE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EVxu3heHeEZ4oH2Zik0CFcFJEvE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/EVxu3heHeEZ4oH2Zik0CFcFJEvE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EVxu3heHeEZ4oH2Zik0CFcFJEvE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/tecnologiasocial/~4/UzWjQjYb2Z8" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.cotecso.com.ve/2009/07/the-passionate-programmer-impresiones.html</feedburner:origLink></entry>

<entry>
    <title>Ruby Enterprise y ruby-ldap en Ubuntu Jaunty</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tecnologiasocial/~3/gPaY2kr9fJs/ruby-enterprise-y-ruby-ldap-en-ubuntu-jaunty.html" />
    <id>tag:blog.cotecso.com.ve,2009://3.11</id>

    <published>2009-06-10T15:29:35Z</published>
    <updated>2009-06-10T15:41:44Z</updated>

    <summary>Actualmente estamos comenzando un proyecto que consta de unos ajustes a una aplicación en Rails que utiliza una versión vieja de este framework (1.2.3) y por razones de tiempo y costo, no es posible realizar una actualización a una versión...</summary>
    <author>
        <name>Ricardo Rodríguez</name>
        
    </author>
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Tutoriales" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="openldap" label="OpenLDAP" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails" label="Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ruby" label="Ruby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rubyenterprise" label="Ruby Enterprise" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rubyldap" label="ruby-ldap" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tutorial" label="Tutorial" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ubuntujaunty" label="Ubuntu Jaunty" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="es" xml:base="http://blog.cotecso.com.ve/">
        &lt;p&gt;Actualmente estamos comenzando un proyecto que consta de unos ajustes a una aplicación en &lt;a href="http://rubyonrails.org"&gt;Rails&lt;/a&gt; que utiliza una versión vieja de este framework (1.2.3) y por razones de tiempo y costo, no es posible realizar una actualización a una versión mas nueva (2.x).&lt;/p&gt;

&lt;p&gt;En mi caso, por ser un desarrollador con &lt;a href="http://ruby-lang.org"&gt;Ruby&lt;/a&gt; y con Rails, no puedo darme el lujo de hacer un downgrade total a versiones viejas, incluso, Rails 1.2.3 no es compatible con los últimos patchlevel (actualizaciones varias y de seguridad) de Ruby 1.8.6 ni con Ruby 1.8.7 (ni pensar Ruby 1.9). Mi laptop actualmente tiene Ubuntu Jaunty (9.04), por lo que Ruby es de la serie 1.8.7.&lt;/p&gt;

&lt;p&gt;Mi solución fue instalar &lt;a href="http://blog.phusion.nl/2008/06/23/ruby-186-p230187-broke-your-app-ruby-enterprise-edition-to-the-rescue/"&gt;Ruby Enterprise de Phusion&lt;/a&gt;, y mantener una instalación paralela en &lt;em&gt;/opt&lt;/em&gt;. Pero una de las extensiones que necesitaba instalar era &lt;a href="http://ruby-ldap.sourceforge.net/"&gt;ruby-ldap&lt;/a&gt;, que para hacer las cosas más interesantes, la compilación &lt;a href="http://osdir.com/ml/ruby-talk/2009-06/msg00216.html"&gt;fallaba&lt;/a&gt;, las razones se explican &lt;a href="http://osdir.com/ml/ruby-talk/2009-06/msg00238.html"&gt;aquí&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Para resumir, la versión de &lt;strong&gt;libldap2&lt;/strong&gt; incluida en Ubuntu Jaunty no es compatible con &lt;strong&gt;ruby-ldap 0.9.7&lt;/strong&gt; ni con el último &lt;strong&gt;ruby-ldap 0.9.8&lt;/strong&gt;, por lo que la solución era descargar una versión anterior de las &lt;a href="http://www.openldap.org/software/download/OpenLDAP/openldap-stable/openldap-stable-20080813.tgz"&gt;librerías de OpenLDAP&lt;/a&gt; (la estable del 2008) y compilar ruby-ldap contra estas librerías.&lt;/p&gt;

&lt;p&gt;Para agregarle mas interés a todo el embrollo, resulta que la compilación de openldap-2.4.11 (la estable del 2008), también generaba &lt;a href="http://lists.kde.org/?l=kroupware&amp;amp;m=122856119310978&amp;amp;w=2"&gt;error&lt;/a&gt;, ¿la razón?, básicamente, esa versión de OpenLDAP no compila con GCC 4.3. Gracias a la gente de mi antigua y aún muy querida favorita distribución &lt;a href="http://gentoo.org"&gt;Gentoo&lt;/a&gt;, pude compilar las librerías de OpenLDAP gracias a un patch suministrado por ellos, descargable &lt;a href="http://bugs.gentoo.org/attachment.cgi?id=156475&amp;amp;action=diff&amp;amp;context=patch&amp;amp;collapsed=&amp;amp;headers=1&amp;amp;format=raw"&gt;aquí&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Instalación&lt;/h3&gt;

&lt;p&gt;A continuación los pasos de esta &lt;strong&gt;mini-odisea&lt;/strong&gt; para dejar documentada la solución, tanto para mí como para la comunidad.&lt;/p&gt;

&lt;p&gt;El primer paso es instalar Ruby Enterprise (pero primero unas dependencias, que el mismo instalador de Ruby Enterprise solicitará si no se encuentran instaladas)&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo aptitude install libssl-dev libreadline5-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Luego, descomprimir el tarball de Ruby Enterprise e instalar (seguir instrucciones del instalador de línea de comando):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;tar xzvf ruby-enterprise-1.8.6-20090520.tar.gz
cd ruby-enterprise-1.8.6-20090520/
sudo ./installer
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ruby Enterprise es instalado por defecto en &lt;em&gt;/opt&lt;/em&gt;, para facilitar el acceso a los ejecutables, realizaremos enlaces simbólicos a &lt;em&gt;/usr/bin&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo ln -s /opt/ruby-enterprise-1.8.6-20090520/bin/ruby  /usr/bin/rubye
sudo ln -s /opt/ruby-enterprise-1.8.6-20090520/bin/gem  /usr/bin/geme
sudo ln -s /opt/ruby-enterprise-1.8.6-20090520/bin/irb  /usr/bin/irbe
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nótese que los symlinks se llaman igual, pero finalizan con "e" de Enterprise. Por lo tanto para utilizar Ruby Enterprise, desde la línea de comando sólo debemos utilizar &lt;code&gt;rubye&lt;/code&gt;, y para instalar gemas utilizamos &lt;code&gt;geme&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Antes de compilar la extensión ruby-ldap, instalar las librerías de OpenLDAP, en este caso utilizaremos como destino &lt;em&gt;/opt/openldap&lt;/em&gt;, para evitar conflictos con las librerías existentes en el sistema (Nota: &lt;em&gt;reemplazar openldap_patch.diff por el nombre asignado al momento de descargar el Patch OpenLDAP para GCC 4.3 o superior&lt;/em&gt;):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;tar xzvf openldap-stable-20080813.tgz 
cp openldap_patch.diff openldap-2.4.11/
cd openldap-2.4.11/
patch -p1 &lt; openldap_patch.diff 
./configure --prefix=/opt/openldap --enable-slapd=no
make depend
make 
sudo make install
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ahora se procede a instalar ruby-ldap 0.9.7, descomprimir el tarball e instalar, indicando las librerías de ldap en /opt/openldap:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;tar xzvf libldap-ruby_0.9.7.orig.tar.gz
cd ruby-ldap-0.9.7/
rubye extconf.rb --with-ldap-dir=/opt/openldap
make
sudo make install
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nótese el uso de &lt;code&gt;rubye&lt;/code&gt; para la configuración de la extensión.&lt;/p&gt;

&lt;p&gt;Instalar las gemas necesarias (nótese el uso de &lt;code&gt;geme&lt;/code&gt; y no &lt;code&gt;gem&lt;/code&gt;):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo geme install rails -v x.x.x
# ...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Adicionalmente, para facilitar el acceso al rake de la instalación de Ruby Enterprise, creé un enlace simbólico a /usr/bin (igual que con &lt;code&gt;rubye&lt;/code&gt;, &lt;code&gt;irbe&lt;/code&gt; y &lt;code&gt;geme&lt;/code&gt;):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo ln -s /opt/ruby-enterprise-1.8.6-20090520/bin/rake  /usr/bin/rakee
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Como observación, los scripts de línea de comando de Rails (por ejemplo, script/server), deben invocarse con &lt;code&gt;rubye -S&lt;/code&gt;. Ejemplo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;## Iniciar el servidor local de desarrollo
rubye -S script/server

## Iniciar la cónsola de la aplicación
rubye -S script/console --irb=irbe

## Las Tareas rake debe utilizar rakee
rakee db:migrate 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Saludos!&lt;/p&gt;

        

    
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-_SxdPsrXN2kuqxVVGJODSafhsA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-_SxdPsrXN2kuqxVVGJODSafhsA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-_SxdPsrXN2kuqxVVGJODSafhsA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-_SxdPsrXN2kuqxVVGJODSafhsA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/tecnologiasocial/~4/gPaY2kr9fJs" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.cotecso.com.ve/2009/06/ruby-enterprise-y-ruby-ldap-en-ubuntu-jaunty.html</feedburner:origLink></entry>

<entry>
    <title>Rails + iPhone (FLISOL Paraguaná 2009) - Parte 2</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tecnologiasocial/~3/pBDuu9pxJOs/rails-iphone-flisol-paraguana-2009---parte-2.html" />
    <id>tag:blog.cotecso.com.ve,2009://3.10</id>

    <published>2009-06-02T03:15:49Z</published>
    <updated>2009-06-02T04:05:59Z</updated>

    <summary>Segunda parte sobre la presentación en el FLISOL Paraguaná 2009 sobre Rails + iphone. Se ajustan los estilos y el flujo de navegación para que se parezca al diseño de la parte 1.</summary>
    <author>
        <name>Ricardo Rodríguez</name>
        
    </author>
    
        <category term="FLISOL 2009" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Tutoriales" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="flisol" label="FLISOL" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="named_scope" label="named_scope" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="partials" label="partials" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails" label="Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ruby" label="Ruby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="todolist" label="to-do list" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tutorial" label="Tutorial" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="es" xml:base="http://blog.cotecso.com.ve/">
        &lt;p&gt;Esta es la segunda parte de una serie de 3 artículos sobre la presentación que realicé en el &lt;a href="http://blog.cotecso.com.ve/2009/05/finalizado-flisol-paraguana-2009-con-exito.html"&gt;FLISOL Paraguaná 2009&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;span class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;img alt="Imagen Thumbnail para flisol_todo_borrador_interfaz.png" src="http://blog.cotecso.com.ve/assets_c/2009/05/tareas_fondo_blanco-thumb-240x367-18.png" width="240" height="367" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" /&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;En la &lt;a href="http://blog.cotecso.com.ve/2009/05/rails-iphone-flisol-paraguana-2009---parte-1.html"&gt;primera parte&lt;/a&gt;, explicamos brevemente en qué consistiría la aplicación, generamos el proyecto con &lt;a href="http://rubyonrails.org"&gt;Rails&lt;/a&gt;, generamos el scaffold para el modelo &lt;code&gt;Tarea&lt;/code&gt; y agregamos una que otra validación en el modelo. En esta segunda parte, lo que haremos es darle un poquito de forma, para que parezca al borrador que dibujamos durante la primera parte.&lt;/p&gt;

&lt;p&gt;Vemos en el borrador que tenemos claramente separadas las tareas &lt;em&gt;finalizadas&lt;/em&gt; de las &lt;em&gt;pendientes&lt;/em&gt;, por tanto debemos definir una manera de buscar dichas tareas. &lt;a href="http://"&gt;ActiveRecord&lt;/a&gt; nos brinda muchas opciones para realizar esta labor, en este caso usaremos los &lt;a href="http://"&gt;named_scopes&lt;/a&gt;, aunque esto podría considerarse un &lt;a href="http://www.mensa.org.mx/blog/recuento-historico-y-critico-del-concepto-overkill/"&gt;overkill&lt;/a&gt; es un buen ejemplo de la fantástica semántica que Rails pone a nuestra dispocición. Editamos el modelo &lt;code&gt;Tarea&lt;/code&gt; &lt;em&gt;(app/models/tarea.rb)&lt;/em&gt;, y agregamos al final lo siguiente:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  &lt;span class=ident&gt;named_scope&lt;/span&gt; &lt;span class=symbol&gt;:pendientes&lt;/span&gt;&lt;span class=punct&gt;,&lt;/span&gt; &lt;span class=symbol&gt;:conditions&lt;/span&gt; &lt;span class=punct&gt;=&amp;gt;&lt;/span&gt; &lt;span class=punct&gt;{&lt;/span&gt;&lt;span class=symbol&gt;:finalizada&lt;/span&gt; &lt;span class=punct&gt;=&amp;gt;&lt;/span&gt; &lt;span class=constant&gt;false&lt;/span&gt;&lt;span class=punct&gt;}&lt;/span&gt;
  &lt;span class=ident&gt;named_scope&lt;/span&gt; &lt;span class=symbol&gt;:finalizadas&lt;/span&gt;&lt;span class=punct&gt;,&lt;/span&gt; &lt;span class=symbol&gt;:conditions&lt;/span&gt; &lt;span class=punct&gt;=&amp;gt;&lt;/span&gt; &lt;span class=punct&gt;{&lt;/span&gt;&lt;span class=symbol&gt;:finalizada&lt;/span&gt; &lt;span class=punct&gt;=&amp;gt;&lt;/span&gt; &lt;span class=constant&gt;true&lt;/span&gt;&lt;span class=punct&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Esto nos va a permitir buscar las tareas &lt;em&gt;pendientes&lt;/em&gt; y &lt;em&gt;finalizadas&lt;/em&gt; de la siguiente manera:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span class=constant&gt;Tarea&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;pendientes&lt;/span&gt;    &lt;span class=comment&gt;# =&amp;gt; devuelve las tareas pendientes&lt;/span&gt;
&lt;span class=constant&gt;Tarea&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;finalizadas&lt;/span&gt;   &lt;span class=comment&gt;# =&amp;gt; devuelve las tareas finalizadas&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Sabiendo como buscar las tareas &lt;em&gt;finalizadas&lt;/em&gt; y las &lt;em&gt;pendientes&lt;/em&gt;, ahora podemos asignarlas tranquilamente a variables de instancia en &lt;code&gt;TareasController#index&lt;/code&gt;. Editamos la acción index del controlador &lt;code&gt;TareasController&lt;/code&gt; &lt;em&gt;(app/controllers/tareas_controller.rb)&lt;/em&gt; para que quede de la siguiente manera:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span class=comment&gt;# GET /tareas&lt;/span&gt;
  &lt;span class=comment&gt;# GET /tareas.xml&lt;/span&gt;
  &lt;span class=keyword&gt;def &lt;/span&gt;&lt;span class=method&gt;index&lt;/span&gt;
    &lt;span class=attribute&gt;@pendientes&lt;/span&gt; &lt;span class=punct&gt;=&lt;/span&gt; &lt;span class=constant&gt;Tarea&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;pendientes&lt;/span&gt;
    &lt;span class=attribute&gt;@finalizadas&lt;/span&gt; &lt;span class=punct&gt;=&lt;/span&gt; &lt;span class=constant&gt;Tarea&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;finalizadas&lt;/span&gt;
    &lt;span class=attribute&gt;@tarea&lt;/span&gt; &lt;span class=punct&gt;=&lt;/span&gt; &lt;span class=constant&gt;Tarea&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;new&lt;/span&gt;

    &lt;span class=ident&gt;respond_to&lt;/span&gt; &lt;span class=keyword&gt;do&lt;/span&gt; &lt;span class=punct&gt;|&lt;/span&gt;&lt;span class=ident&gt;format&lt;/span&gt;&lt;span class=punct&gt;|&lt;/span&gt;
      &lt;span class=ident&gt;format&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;html&lt;/span&gt; &lt;span class=comment&gt;# index.html.erb&lt;/span&gt;
      &lt;span class=ident&gt;format&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;xml&lt;/span&gt;  &lt;span class=punct&gt;{&lt;/span&gt; &lt;span class=ident&gt;render&lt;/span&gt; &lt;span class=symbol&gt;:xml&lt;/span&gt; &lt;span class=punct&gt;=&amp;gt;&lt;/span&gt; &lt;span class=attribute&gt;@tareas&lt;/span&gt; &lt;span class=punct&gt;}&lt;/span&gt;
    &lt;span class=keyword&gt;end&lt;/span&gt;
  &lt;span class=keyword&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Lo que hicimos fue eliminar la búsqueda original que retornaba todas las tareas, &lt;em&gt;pendientes&lt;/em&gt; y &lt;em&gt;finalizadas&lt;/em&gt;, y agregamos 2 búsquedas nuevas: &lt;code&gt;Tarea.pendientes&lt;/code&gt; y &lt;code&gt;Tarea.finalizadas&lt;/code&gt;. Adicionalmente agregamos la variable de instancia &lt;code&gt;@tarea&lt;/code&gt;, que contiene una Tarea nueva (vacía), esto se debe a que en nuestra página index (según el borrador), vamos a incluir un formulario en la parte inferior para agregar nuevas tareas.&lt;/p&gt;

&lt;p&gt;El siguiente paso es hacerle algunos ajustes a nuestra interfaz para que se parezca mas a nuestro diseño de lápiz y papel. Lo primero, cambiar el markup de la vista, editamos &lt;em&gt;app/views/index.html.erb&lt;/em&gt; para que se vea así:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span class=punct&gt;&amp;lt;&lt;/span&gt;&lt;span class=tag&gt;h1&lt;/span&gt;&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;Mis tareas&lt;span class=punct&gt;&amp;lt;/&lt;/span&gt;&lt;span class=tag&gt;h1&lt;/span&gt;&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;

&lt;span class=punct&gt;&amp;lt;&lt;/span&gt;&lt;span class=tag&gt;h2&lt;/span&gt;&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;Pendientes&lt;span class=punct&gt;&amp;lt;/&lt;/span&gt;&lt;span class=tag&gt;h2&lt;/span&gt;&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;

&lt;span class=punct&gt;&amp;lt;%&lt;/span&gt; &lt;span class=attribute&gt;if&lt;/span&gt; @&lt;span class=attribute&gt;pendientes.any?&lt;/span&gt; %&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=punct&gt;&amp;lt;&lt;/span&gt;&lt;span class=tag&gt;ul&lt;/span&gt; &lt;span class=attribute&gt;class&lt;/span&gt;&lt;span class=punct&gt;=&amp;quot;&lt;/span&gt;&lt;span class=string&gt;tareas pendientes&lt;/span&gt;&lt;span class=punct&gt;&amp;quot;&amp;gt;&lt;/span&gt;
    &lt;span class=punct&gt;&amp;lt;%=&lt;/span&gt; &lt;span class=attribute&gt;render&lt;/span&gt; :&lt;span class=attribute&gt;partial&lt;/span&gt; &lt;span class=punct&gt;=&amp;gt;&lt;/span&gt; @pendientes %&amp;gt;
  &lt;span class=punct&gt;&amp;lt;/&lt;/span&gt;&lt;span class=tag&gt;ul&lt;/span&gt;&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;
&lt;span class=punct&gt;&amp;lt;%&lt;/span&gt; &lt;span class=attribute&gt;else&lt;/span&gt; %&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=punct&gt;&amp;lt;&lt;/span&gt;&lt;span class=tag&gt;p&lt;/span&gt; &lt;span class=attribute&gt;class&lt;/span&gt;&lt;span class=punct&gt;='&lt;/span&gt;&lt;span class=string&gt;sin-tareas&lt;/span&gt;&lt;span class=punct&gt;'&amp;gt;&lt;/span&gt;No hay tareas pendientes&lt;span class=punct&gt;&amp;lt;/&lt;/span&gt;&lt;span class=tag&gt;p&lt;/span&gt;&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;
&lt;span class=punct&gt;&amp;lt;%&lt;/span&gt; &lt;span class=attribute&gt;end&lt;/span&gt; %&lt;span class=punct&gt;&amp;gt;&lt;/span&gt; 

&lt;span class=punct&gt;&amp;lt;%&lt;/span&gt; &lt;span class=attribute&gt;if&lt;/span&gt; @&lt;span class=attribute&gt;finalizadas.any?&lt;/span&gt; %&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=punct&gt;&amp;lt;&lt;/span&gt;&lt;span class=tag&gt;h2&lt;/span&gt;&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;Finalizadas&lt;span class=punct&gt;&amp;lt;/&lt;/span&gt;&lt;span class=tag&gt;h2&lt;/span&gt;&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;

  &lt;span class=punct&gt;&amp;lt;&lt;/span&gt;&lt;span class=tag&gt;ul&lt;/span&gt; &lt;span class=attribute&gt;class&lt;/span&gt;&lt;span class=punct&gt;=&amp;quot;&lt;/span&gt;&lt;span class=string&gt;tareas finalizadas&lt;/span&gt;&lt;span class=punct&gt;&amp;quot;&amp;gt;&lt;/span&gt;
    &lt;span class=punct&gt;&amp;lt;%=&lt;/span&gt; &lt;span class=attribute&gt;render&lt;/span&gt; :&lt;span class=attribute&gt;partial&lt;/span&gt; &lt;span class=punct&gt;=&amp;gt;&lt;/span&gt; @finalizadas %&amp;gt;
  &lt;span class=punct&gt;&amp;lt;/&lt;/span&gt;&lt;span class=tag&gt;ul&lt;/span&gt;&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;
&lt;span class=punct&gt;&amp;lt;%&lt;/span&gt; &lt;span class=attribute&gt;end&lt;/span&gt; %&lt;span class=punct&gt;&amp;gt;&lt;/span&gt; 

&lt;span class=punct&gt;&amp;lt;&lt;/span&gt;&lt;span class=tag&gt;hr&lt;/span&gt; &lt;span class=punct&gt;/&amp;gt;&lt;/span&gt;

&lt;span class=punct&gt;&amp;lt;%=&lt;/span&gt; &lt;span class=attribute&gt;render&lt;/span&gt; :&lt;span class=attribute&gt;partial&lt;/span&gt; &lt;span class=punct&gt;=&amp;gt;&lt;/span&gt; &amp;quot;form&amp;quot; %&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;¿Qué hicimos? Ya deben haberse dado cuenta que eliminamos la tabla (tag &lt;em&gt;table&lt;/em&gt;) para mostrar el listado de tareas, ahora, cada conjunto de tareas se muestran con una "unordered list" &lt;em&gt;(ul)&lt;/em&gt;. Se agregaron 2 títulos de segundo nivel &lt;em&gt;(h2)&lt;/em&gt; para dividir las tareas finalizadas de las pendientes. Adicionalmente, las &lt;em&gt;pendientes&lt;/em&gt; y las &lt;em&gt;finalizadas&lt;/em&gt; se muestran siempre y cuando existan registros asociados a la misma (&lt;code&gt;if @pendientes.any?&lt;/code&gt;, &lt;code&gt;if @finalizadas.any?&lt;/code&gt;). Como podrán haberse dado cuenta, en el template aparencen unos fulanos &lt;code&gt;render :partial =&amp;gt; algo&lt;/code&gt;. El método &lt;code&gt;render&lt;/code&gt;, para resumirlo, es uno de los mecanismos con los cuales se envía contenido al usuario (detalles en la &lt;a href="http://api.rubyonrails.org/classes/ActionView/Partials.html"&gt;api de Rails - Partials&lt;/a&gt;). &lt;/p&gt;

&lt;p&gt;Rails es lo suficientemente inteligente para determinar que &lt;code&gt;@pendientes&lt;/code&gt; y &lt;code&gt;@finalizadas&lt;/code&gt; contienen un conjunto de objetos &lt;code&gt;Tarea&lt;/code&gt; (ver &lt;a href="http://api.rubyonrails.org/classes/ActionController/RecordIdentifier.html"&gt;RecordIdentifier&lt;/a&gt;, por tal razón, tanto &lt;code&gt;render :partial =&amp;gt; @pendientes&lt;/code&gt; como &lt;code&gt;render :partial =&amp;gt; @finalizadas&lt;/code&gt; lo que hacen es mostar el partial (fragmento de vista) &lt;em&gt;tarea/_tarea.html.erb&lt;/em&gt; para cada uno de los elementos dentro de las variables &lt;code&gt;@pendientes&lt;/code&gt; y &lt;code&gt;@finalizadas&lt;/code&gt;. &lt;em&gt;Nota: los parials en Rails siempre comienzan con "_". Ej: _tarea.html.erb. Rails determina este nombre gracias a &lt;a href="http://api.rubyonrails.org/classes/ActionController/RecordIdentifier.html#M000461"&gt;RecordIdentifier#partial_path&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;render :partial =&amp;gt; "form"&lt;/code&gt; lo que hace es mostrar el partial &lt;em&gt;_form.html.erb&lt;/em&gt; (Nótese que no es necesario especificar el "_").&lt;/p&gt;

&lt;p&gt;Hablamos de varios partials (&lt;em&gt;_tarea.html.erb&lt;/em&gt; y &lt;em&gt;_form.html.erb&lt;/em&gt;), pero no los hemos creado. Eso es lo que vamos hacer ahora mismo. Primero, creamos el archivo &lt;em&gt;_tarea.html.erb&lt;/em&gt; en &lt;em&gt;app/views/tareas&lt;/em&gt; y agregamos el siguiente contenido:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span class=punct&gt;&amp;lt;&lt;/span&gt;&lt;span class=tag&gt;li&lt;/span&gt;&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=punct&gt;&amp;lt;%&lt;/span&gt; &lt;span class=attribute&gt;form_for(tarea)&lt;/span&gt; &lt;span class=attribute&gt;do&lt;/span&gt; |&lt;span class=attribute&gt;f|&lt;/span&gt; %&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=punct&gt;&amp;lt;%=&lt;/span&gt; &lt;span class=attribute&gt;f.check_box&lt;/span&gt; :&lt;span class=attribute&gt;finalizada,&lt;/span&gt; :&lt;span class=attribute&gt;onchange&lt;/span&gt; &lt;span class=punct&gt;=&amp;gt;&lt;/span&gt; 'form.submit();' %&amp;gt;
    &lt;span class=punct&gt;&amp;lt;%=&lt;/span&gt; &lt;span class=attribute&gt;h&lt;/span&gt; &lt;span class=attribute&gt;tarea.titulo&lt;/span&gt; %&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=punct&gt;&amp;lt;&lt;/span&gt;&lt;span class=tag&gt;span&lt;/span&gt;&lt;span class=punct&gt;&amp;gt;&amp;lt;%=&lt;/span&gt; &lt;span class=attribute&gt;tarea.notas&lt;/span&gt; %&lt;span class=punct&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=tag&gt;span&lt;/span&gt;&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=punct&gt;&amp;lt;%=&lt;/span&gt; &lt;span class=attribute&gt;link_to&lt;/span&gt; &lt;span class=punct&gt;'&lt;/span&gt;&lt;span class=string&gt;Editar&lt;/span&gt;&lt;span class=punct&gt;',&lt;/span&gt; &lt;span class=attribute&gt;edit_tarea_path(tarea)&lt;/span&gt; %&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=punct&gt;&amp;lt;%=&lt;/span&gt; &lt;span class=attribute&gt;link_to&lt;/span&gt; &lt;span class=punct&gt;'&lt;/span&gt;&lt;span class=string&gt;Eliminar&lt;/span&gt;&lt;span class=punct&gt;',&lt;/span&gt; &lt;span class=attribute&gt;tarea,&lt;/span&gt; :&lt;span class=attribute&gt;confirm&lt;/span&gt; &lt;span class=punct&gt;=&amp;gt;&lt;/span&gt; 'Seguro que desea eliminar la tarea?', :method =&amp;gt; :delete %&amp;gt;
  &lt;span class=punct&gt;&amp;lt;%&lt;/span&gt; &lt;span class=attribute&gt;end&lt;/span&gt; %&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;
&lt;span class=punct&gt;&amp;lt;/&lt;/span&gt;&lt;span class=tag&gt;li&lt;/span&gt;&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Este partial se encargará de mostrar cada elemento (o list item &lt;em&gt;li&lt;/em&gt;) de la lista &lt;em&gt;ul&lt;/em&gt;. La representación de cada tarea en el navegador es un formulario, que incluye un &lt;em&gt;check_box&lt;/em&gt;, el cual al hacerle clic realiza el submit de dicho formulario. El resto es el título y las notas de la tarea, con los links de edición y eliminación.&lt;/p&gt;

&lt;p&gt;Ahora, creamos el partial del formulario para agregar nuevas tareas &lt;em&gt;(app/views/tareas/_form.html.erb)&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span class=punct&gt;&amp;lt;&lt;/span&gt;&lt;span class=tag&gt;h2&lt;/span&gt;&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;Agregar nueva tarea&lt;span class=punct&gt;&amp;lt;/&lt;/span&gt;&lt;span class=tag&gt;h2&lt;/span&gt;&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;

&lt;span class=punct&gt;&amp;lt;%&lt;/span&gt; &lt;span class=attribute&gt;form_for(@tarea)&lt;/span&gt; &lt;span class=attribute&gt;do&lt;/span&gt; |&lt;span class=attribute&gt;f|&lt;/span&gt; %&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=punct&gt;&amp;lt;%=&lt;/span&gt; &lt;span class=attribute&gt;f.error_messages&lt;/span&gt; %&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;

  &lt;span class=punct&gt;&amp;lt;&lt;/span&gt;&lt;span class=tag&gt;p&lt;/span&gt;&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=punct&gt;&amp;lt;%=&lt;/span&gt; &lt;span class=attribute&gt;f.label&lt;/span&gt; :&lt;span class=attribute&gt;titulo&lt;/span&gt; %&lt;span class=punct&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class=tag&gt;br&lt;/span&gt; &lt;span class=punct&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=punct&gt;&amp;lt;%=&lt;/span&gt; &lt;span class=attribute&gt;f.text_field&lt;/span&gt; :&lt;span class=attribute&gt;titulo&lt;/span&gt; %&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=punct&gt;&amp;lt;/&lt;/span&gt;&lt;span class=tag&gt;p&lt;/span&gt;&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=punct&gt;&amp;lt;&lt;/span&gt;&lt;span class=tag&gt;p&lt;/span&gt;&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=punct&gt;&amp;lt;%=&lt;/span&gt; &lt;span class=attribute&gt;f.label&lt;/span&gt; :&lt;span class=attribute&gt;notas&lt;/span&gt; %&lt;span class=punct&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span class=tag&gt;br&lt;/span&gt; &lt;span class=punct&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=punct&gt;&amp;lt;%=&lt;/span&gt; &lt;span class=attribute&gt;f.text_area&lt;/span&gt; :&lt;span class=attribute&gt;notas&lt;/span&gt; %&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=punct&gt;&amp;lt;/&lt;/span&gt;&lt;span class=tag&gt;p&lt;/span&gt;&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=punct&gt;&amp;lt;&lt;/span&gt;&lt;span class=tag&gt;p&lt;/span&gt;&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=punct&gt;&amp;lt;%=&lt;/span&gt; &lt;span class=attribute&gt;f.submit&lt;/span&gt; &lt;span class=punct&gt;'&lt;/span&gt;&lt;span class=string&gt;Agregar&lt;/span&gt;&lt;span class=punct&gt;'&lt;/span&gt; %&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;
  &lt;span class=punct&gt;&amp;lt;/&lt;/span&gt;&lt;span class=tag&gt;p&lt;/span&gt;&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;
&lt;span class=punct&gt;&amp;lt;%&lt;/span&gt; &lt;span class=attribute&gt;end&lt;/span&gt; %&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Este partial es una versión simplificada del template &lt;em&gt;new.html.erb&lt;/em&gt; generado por el scaffold en la &lt;a href="http://blog.cotecso.com.ve/2009/05/rails-iphone-flisol-paraguana-2009---parte-1.html"&gt;parte 1&lt;/a&gt;. De hecho, ese template original no va a ser utilizado, así que lo podemos eliminar.&lt;/p&gt;

&lt;p&gt;Podríamos probar la aplicación en este momento, pero nos daríamos cuenta de que no se parece a nuestro borrador de lapiz y papel. ¿La razón?, debemos agregar una hoja de estilo simple para darle el "look" que deseamos. Creamos el archivo &lt;em&gt;public/stylesheets/todo.css&lt;/em&gt; con el siguiente contenido:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/*Hoja de estilos principal de FLISOL todo*/

h1 {
  background-color: #333;
  padding: 10px;
  color: #FFF;
}

h2 {
  padding-top: 20px;
}

hr { margin-top: 20px; margin-bottom: 20px;}

ul.tareas li {
  padding-left: 0;
  padding-top: 15px;
  list-style: none;
  font-weight: bold;
}

ul.tareas li span {
  display: block;
  font-style: italic;
  font-weight: normal;
  padding-bottom: 5px;
}

ul.tareas li a {
  font-size: 10px;
}

ul.pendientes li {
  font-size: 16px;
  margin-top: 8px;
}

ul.pendientes li span {
  color: #333;
  font-size: 14px;
}

ul.finalizadas li {
  color: #999;
  font-size: 12px;
}

ul.finalizadas li span {
  color: #666;
  font-size: 11px;
}

p.sin-tareas {
  color: #338;
  font-style: italic;
  margin-left: 45px;
}

textarea { height: 50px; }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Sólo nos falta hacer referencia a esta hoja de estilo en nuestro layout. Buscamos la línea:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span class=punct&gt;&amp;lt;%=&lt;/span&gt; &lt;span class=attribute&gt;stylesheet_link_tag&lt;/span&gt; &lt;span class=punct&gt;'&lt;/span&gt;&lt;span class=string&gt;scaffold&lt;/span&gt;&lt;span class=punct&gt;' %&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;y la reempalzamos por:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span class=punct&gt;&amp;lt;%=&lt;/span&gt; &lt;span class=attribute&gt;stylesheet_link_tag&lt;/span&gt; &lt;span class=punct&gt;'&lt;/span&gt;&lt;span class=string&gt;scaffold&lt;/span&gt;&lt;span class=punct&gt;',&lt;/span&gt; &lt;span class=punct&gt;'&lt;/span&gt;&lt;span class=string&gt;todo&lt;/span&gt;&lt;span class=punct&gt;'&lt;/span&gt; %&lt;span class=punct&gt;&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ahora podemos probar la aplicación en &lt;a href="http://localhost:3000/tareas"&gt;http://localhost:3000/tareas&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Después de navegar, nos daremos cuenta de que hay un comportamiento extraño al momento de editar, eliminar o crear una tarea, esto se debe a que en &lt;code&gt;TareasController&lt;/code&gt;, estas acciones deben redirigir a &lt;em&gt;index&lt;/em&gt; luego de realizar su trabajo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span class=keyword&gt;class &lt;/span&gt;&lt;span class=class&gt;TareasController&lt;/span&gt; &lt;span class=punct&gt;&amp;lt;&lt;/span&gt; &lt;span class=constant&gt;ApplicationController&lt;/span&gt;

  &lt;span class=comment&gt;# GET /tareas&lt;/span&gt;
  &lt;span class=comment&gt;# GET /tareas.xml&lt;/span&gt;
  &lt;span class=keyword&gt;def &lt;/span&gt;&lt;span class=method&gt;index&lt;/span&gt;
    &lt;span class=attribute&gt;@pendientes&lt;/span&gt; &lt;span class=punct&gt;=&lt;/span&gt; &lt;span class=constant&gt;Tarea&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;pendientes&lt;/span&gt;
    &lt;span class=attribute&gt;@finalizadas&lt;/span&gt; &lt;span class=punct&gt;=&lt;/span&gt; &lt;span class=constant&gt;Tarea&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;finalizadas&lt;/span&gt;
    &lt;span class=attribute&gt;@tarea&lt;/span&gt; &lt;span class=punct&gt;=&lt;/span&gt; &lt;span class=constant&gt;Tarea&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;new&lt;/span&gt;

    &lt;span class=ident&gt;respond_to&lt;/span&gt; &lt;span class=keyword&gt;do&lt;/span&gt; &lt;span class=punct&gt;|&lt;/span&gt;&lt;span class=ident&gt;format&lt;/span&gt;&lt;span class=punct&gt;|&lt;/span&gt;
      &lt;span class=ident&gt;format&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;html&lt;/span&gt; &lt;span class=comment&gt;# index.html.erb&lt;/span&gt;
      &lt;span class=ident&gt;format&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;xml&lt;/span&gt;  &lt;span class=punct&gt;{&lt;/span&gt; &lt;span class=ident&gt;render&lt;/span&gt; &lt;span class=symbol&gt;:xml&lt;/span&gt; &lt;span class=punct&gt;=&amp;gt;&lt;/span&gt; &lt;span class=punct&gt;(&lt;/span&gt;&lt;span class=attribute&gt;@pendientes&lt;/span&gt; &lt;span class=punct&gt;+&lt;/span&gt; &lt;span class=attribute&gt;@finalizadas&lt;/span&gt;&lt;span class=punct&gt;)&lt;/span&gt; &lt;span class=punct&gt;}&lt;/span&gt;
    &lt;span class=keyword&gt;end&lt;/span&gt;
  &lt;span class=keyword&gt;end&lt;/span&gt;

  &lt;span class=comment&gt;# GET /tareas/1&lt;/span&gt;
  &lt;span class=comment&gt;# GET /tareas/1.xml&lt;/span&gt;
  &lt;span class=keyword&gt;def &lt;/span&gt;&lt;span class=method&gt;show&lt;/span&gt;
    &lt;span class=attribute&gt;@tarea&lt;/span&gt; &lt;span class=punct&gt;=&lt;/span&gt; &lt;span class=constant&gt;Tarea&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;find&lt;/span&gt;&lt;span class=punct&gt;(&lt;/span&gt;&lt;span class=ident&gt;params&lt;/span&gt;&lt;span class=punct&gt;[&lt;/span&gt;&lt;span class=symbol&gt;:id&lt;/span&gt;&lt;span class=punct&gt;])&lt;/span&gt;

    &lt;span class=ident&gt;respond_to&lt;/span&gt; &lt;span class=keyword&gt;do&lt;/span&gt; &lt;span class=punct&gt;|&lt;/span&gt;&lt;span class=ident&gt;format&lt;/span&gt;&lt;span class=punct&gt;|&lt;/span&gt;
      &lt;span class=ident&gt;format&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;html&lt;/span&gt; &lt;span class=comment&gt;# show.html.erb&lt;/span&gt;
      &lt;span class=ident&gt;format&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;xml&lt;/span&gt;  &lt;span class=punct&gt;{&lt;/span&gt; &lt;span class=ident&gt;render&lt;/span&gt; &lt;span class=symbol&gt;:xml&lt;/span&gt; &lt;span class=punct&gt;=&amp;gt;&lt;/span&gt; &lt;span class=attribute&gt;@tarea&lt;/span&gt; &lt;span class=punct&gt;}&lt;/span&gt;
    &lt;span class=keyword&gt;end&lt;/span&gt;
  &lt;span class=keyword&gt;end&lt;/span&gt;

  &lt;span class=comment&gt;# GET /tareas/new&lt;/span&gt;
  &lt;span class=comment&gt;# GET /tareas/new.xml&lt;/span&gt;
  &lt;span class=keyword&gt;def &lt;/span&gt;&lt;span class=method&gt;new&lt;/span&gt;
    &lt;span class=attribute&gt;@tarea&lt;/span&gt; &lt;span class=punct&gt;=&lt;/span&gt; &lt;span class=constant&gt;Tarea&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;new&lt;/span&gt;

    &lt;span class=ident&gt;respond_to&lt;/span&gt; &lt;span class=keyword&gt;do&lt;/span&gt; &lt;span class=punct&gt;|&lt;/span&gt;&lt;span class=ident&gt;format&lt;/span&gt;&lt;span class=punct&gt;|&lt;/span&gt;
      &lt;span class=ident&gt;format&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;html&lt;/span&gt; &lt;span class=comment&gt;# new.html.erb&lt;/span&gt;
      &lt;span class=ident&gt;format&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;xml&lt;/span&gt;  &lt;span class=punct&gt;{&lt;/span&gt; &lt;span class=ident&gt;render&lt;/span&gt; &lt;span class=symbol&gt;:xml&lt;/span&gt; &lt;span class=punct&gt;=&amp;gt;&lt;/span&gt; &lt;span class=attribute&gt;@tarea&lt;/span&gt; &lt;span class=punct&gt;}&lt;/span&gt;
    &lt;span class=keyword&gt;end&lt;/span&gt;
  &lt;span class=keyword&gt;end&lt;/span&gt;

  &lt;span class=comment&gt;# GET /tareas/1/edit&lt;/span&gt;
  &lt;span class=keyword&gt;def &lt;/span&gt;&lt;span class=method&gt;edit&lt;/span&gt;
    &lt;span class=attribute&gt;@tarea&lt;/span&gt; &lt;span class=punct&gt;=&lt;/span&gt; &lt;span class=constant&gt;Tarea&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;find&lt;/span&gt;&lt;span class=punct&gt;(&lt;/span&gt;&lt;span class=ident&gt;params&lt;/span&gt;&lt;span class=punct&gt;[&lt;/span&gt;&lt;span class=symbol&gt;:id&lt;/span&gt;&lt;span class=punct&gt;])&lt;/span&gt;
  &lt;span class=keyword&gt;end&lt;/span&gt;

  &lt;span class=comment&gt;# POST /tareas&lt;/span&gt;
  &lt;span class=comment&gt;# POST /tareas.xml&lt;/span&gt;
  &lt;span class=keyword&gt;def &lt;/span&gt;&lt;span class=method&gt;create&lt;/span&gt;
    &lt;span class=attribute&gt;@tarea&lt;/span&gt; &lt;span class=punct&gt;=&lt;/span&gt; &lt;span class=constant&gt;Tarea&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;new&lt;/span&gt;&lt;span class=punct&gt;(&lt;/span&gt;&lt;span class=ident&gt;params&lt;/span&gt;&lt;span class=punct&gt;[&lt;/span&gt;&lt;span class=symbol&gt;:tarea&lt;/span&gt;&lt;span class=punct&gt;])&lt;/span&gt;

    &lt;span class=ident&gt;respond_to&lt;/span&gt; &lt;span class=keyword&gt;do&lt;/span&gt; &lt;span class=punct&gt;|&lt;/span&gt;&lt;span class=ident&gt;format&lt;/span&gt;&lt;span class=punct&gt;|&lt;/span&gt;
      &lt;span class=keyword&gt;if&lt;/span&gt; &lt;span class=attribute&gt;@tarea&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;save&lt;/span&gt;
        &lt;span class=ident&gt;flash&lt;/span&gt;&lt;span class=punct&gt;[&lt;/span&gt;&lt;span class=symbol&gt;:notice&lt;/span&gt;&lt;span class=punct&gt;]&lt;/span&gt; &lt;span class=punct&gt;=&lt;/span&gt; &lt;span class=punct&gt;'&lt;/span&gt;&lt;span class=string&gt;La tarea se creó satisfactoriamente.&lt;/span&gt;&lt;span class=punct&gt;'&lt;/span&gt;
        &lt;span class=ident&gt;format&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;html&lt;/span&gt; &lt;span class=punct&gt;{&lt;/span&gt; &lt;span class=ident&gt;redirect_to&lt;/span&gt; &lt;span class=ident&gt;tareas_path&lt;/span&gt; &lt;span class=punct&gt;}&lt;/span&gt;
        &lt;span class=ident&gt;format&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;xml&lt;/span&gt;  &lt;span class=punct&gt;{&lt;/span&gt; &lt;span class=ident&gt;render&lt;/span&gt; &lt;span class=symbol&gt;:xml&lt;/span&gt; &lt;span class=punct&gt;=&amp;gt;&lt;/span&gt; &lt;span class=attribute&gt;@tarea&lt;/span&gt;&lt;span class=punct&gt;,&lt;/span&gt; &lt;span class=symbol&gt;:status&lt;/span&gt; &lt;span class=punct&gt;=&amp;gt;&lt;/span&gt; &lt;span class=symbol&gt;:created&lt;/span&gt;&lt;span class=punct&gt;,&lt;/span&gt; &lt;span class=symbol&gt;:location&lt;/span&gt; &lt;span class=punct&gt;=&amp;gt;&lt;/span&gt; &lt;span class=attribute&gt;@tarea&lt;/span&gt; &lt;span class=punct&gt;}&lt;/span&gt;
      &lt;span class=keyword&gt;else&lt;/span&gt;
        &lt;span class=attribute&gt;@pendientes&lt;/span&gt; &lt;span class=punct&gt;=&lt;/span&gt; &lt;span class=constant&gt;Tarea&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;pendientes&lt;/span&gt;
        &lt;span class=attribute&gt;@finalizadas&lt;/span&gt; &lt;span class=punct&gt;=&lt;/span&gt; &lt;span class=constant&gt;Tarea&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;finalizadas&lt;/span&gt;
        &lt;span class=ident&gt;format&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;html&lt;/span&gt; &lt;span class=punct&gt;{&lt;/span&gt; &lt;span class=ident&gt;render&lt;/span&gt; &lt;span class=symbol&gt;:action&lt;/span&gt; &lt;span class=punct&gt;=&amp;gt;&lt;/span&gt; &lt;span class=punct&gt;&amp;quot;&lt;/span&gt;&lt;span class=string&gt;index&lt;/span&gt;&lt;span class=punct&gt;&amp;quot;&lt;/span&gt; &lt;span class=punct&gt;}&lt;/span&gt;
        &lt;span class=ident&gt;format&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;xml&lt;/span&gt;  &lt;span class=punct&gt;{&lt;/span&gt; &lt;span class=ident&gt;render&lt;/span&gt; &lt;span class=symbol&gt;:xml&lt;/span&gt; &lt;span class=punct&gt;=&amp;gt;&lt;/span&gt; &lt;span class=attribute&gt;@tarea&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;errors&lt;/span&gt;&lt;span class=punct&gt;,&lt;/span&gt; &lt;span class=symbol&gt;:status&lt;/span&gt; &lt;span class=punct&gt;=&amp;gt;&lt;/span&gt; &lt;span class=symbol&gt;:unprocessable_entity&lt;/span&gt; &lt;span class=punct&gt;}&lt;/span&gt;
      &lt;span class=keyword&gt;end&lt;/span&gt;
    &lt;span class=keyword&gt;end&lt;/span&gt;
  &lt;span class=keyword&gt;end&lt;/span&gt;

  &lt;span class=comment&gt;# PUT /tareas/1&lt;/span&gt;
  &lt;span class=comment&gt;# PUT /tareas/1.xml&lt;/span&gt;
  &lt;span class=keyword&gt;def &lt;/span&gt;&lt;span class=method&gt;update&lt;/span&gt;
    &lt;span class=attribute&gt;@tarea&lt;/span&gt; &lt;span class=punct&gt;=&lt;/span&gt; &lt;span class=constant&gt;Tarea&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;find&lt;/span&gt;&lt;span class=punct&gt;(&lt;/span&gt;&lt;span class=ident&gt;params&lt;/span&gt;&lt;span class=punct&gt;[&lt;/span&gt;&lt;span class=symbol&gt;:id&lt;/span&gt;&lt;span class=punct&gt;])&lt;/span&gt;

    &lt;span class=ident&gt;respond_to&lt;/span&gt; &lt;span class=keyword&gt;do&lt;/span&gt; &lt;span class=punct&gt;|&lt;/span&gt;&lt;span class=ident&gt;format&lt;/span&gt;&lt;span class=punct&gt;|&lt;/span&gt;
      &lt;span class=keyword&gt;if&lt;/span&gt; &lt;span class=attribute&gt;@tarea&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;update_attributes&lt;/span&gt;&lt;span class=punct&gt;(&lt;/span&gt;&lt;span class=ident&gt;params&lt;/span&gt;&lt;span class=punct&gt;[&lt;/span&gt;&lt;span class=symbol&gt;:tarea&lt;/span&gt;&lt;span class=punct&gt;])&lt;/span&gt;
        &lt;span class=ident&gt;flash&lt;/span&gt;&lt;span class=punct&gt;[&lt;/span&gt;&lt;span class=symbol&gt;:notice&lt;/span&gt;&lt;span class=punct&gt;]&lt;/span&gt; &lt;span class=punct&gt;=&lt;/span&gt; &lt;span class=punct&gt;'&lt;/span&gt;&lt;span class=string&gt;La tarea fue actualizada.&lt;/span&gt;&lt;span class=punct&gt;'&lt;/span&gt;
        &lt;span class=ident&gt;format&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;html&lt;/span&gt; &lt;span class=punct&gt;{&lt;/span&gt; &lt;span class=ident&gt;redirect_to&lt;/span&gt; &lt;span class=ident&gt;tareas_path&lt;/span&gt; &lt;span class=punct&gt;}&lt;/span&gt;
        &lt;span class=ident&gt;format&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;xml&lt;/span&gt;  &lt;span class=punct&gt;{&lt;/span&gt; &lt;span class=ident&gt;head&lt;/span&gt; &lt;span class=symbol&gt;:ok&lt;/span&gt; &lt;span class=punct&gt;}&lt;/span&gt;
      &lt;span class=keyword&gt;else&lt;/span&gt;
        &lt;span class=ident&gt;format&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;html&lt;/span&gt; &lt;span class=punct&gt;{&lt;/span&gt; &lt;span class=ident&gt;render&lt;/span&gt; &lt;span class=symbol&gt;:action&lt;/span&gt; &lt;span class=punct&gt;=&amp;gt;&lt;/span&gt; &lt;span class=punct&gt;&amp;quot;&lt;/span&gt;&lt;span class=string&gt;edit&lt;/span&gt;&lt;span class=punct&gt;&amp;quot;&lt;/span&gt; &lt;span class=punct&gt;}&lt;/span&gt;
        &lt;span class=ident&gt;format&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;xml&lt;/span&gt;  &lt;span class=punct&gt;{&lt;/span&gt; &lt;span class=ident&gt;render&lt;/span&gt; &lt;span class=symbol&gt;:xml&lt;/span&gt; &lt;span class=punct&gt;=&amp;gt;&lt;/span&gt; &lt;span class=attribute&gt;@tarea&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;errors&lt;/span&gt;&lt;span class=punct&gt;,&lt;/span&gt; &lt;span class=symbol&gt;:status&lt;/span&gt; &lt;span class=punct&gt;=&amp;gt;&lt;/span&gt; &lt;span class=symbol&gt;:unprocessable_entity&lt;/span&gt; &lt;span class=punct&gt;}&lt;/span&gt;
      &lt;span class=keyword&gt;end&lt;/span&gt;
    &lt;span class=keyword&gt;end&lt;/span&gt;
  &lt;span class=keyword&gt;end&lt;/span&gt;

  &lt;span class=comment&gt;# DELETE /tareas/1&lt;/span&gt;
  &lt;span class=comment&gt;# DELETE /tareas/1.xml&lt;/span&gt;
  &lt;span class=keyword&gt;def &lt;/span&gt;&lt;span class=method&gt;destroy&lt;/span&gt;
    &lt;span class=attribute&gt;@tarea&lt;/span&gt; &lt;span class=punct&gt;=&lt;/span&gt; &lt;span class=constant&gt;Tarea&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;find&lt;/span&gt;&lt;span class=punct&gt;(&lt;/span&gt;&lt;span class=ident&gt;params&lt;/span&gt;&lt;span class=punct&gt;[&lt;/span&gt;&lt;span class=symbol&gt;:id&lt;/span&gt;&lt;span class=punct&gt;])&lt;/span&gt;
    &lt;span class=attribute&gt;@tarea&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;destroy&lt;/span&gt;

    &lt;span class=ident&gt;respond_to&lt;/span&gt; &lt;span class=keyword&gt;do&lt;/span&gt; &lt;span class=punct&gt;|&lt;/span&gt;&lt;span class=ident&gt;format&lt;/span&gt;&lt;span class=punct&gt;|&lt;/span&gt;
      &lt;span class=ident&gt;format&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;html&lt;/span&gt; &lt;span class=punct&gt;{&lt;/span&gt; &lt;span class=ident&gt;redirect_to&lt;/span&gt;&lt;span class=punct&gt;(&lt;/span&gt;&lt;span class=ident&gt;tareas_url&lt;/span&gt;&lt;span class=punct&gt;)&lt;/span&gt; &lt;span class=punct&gt;}&lt;/span&gt;
      &lt;span class=ident&gt;format&lt;/span&gt;&lt;span class=punct&gt;.&lt;/span&gt;&lt;span class=ident&gt;xml&lt;/span&gt;  &lt;span class=punct&gt;{&lt;/span&gt; &lt;span class=ident&gt;head&lt;/span&gt; &lt;span class=symbol&gt;:ok&lt;/span&gt; &lt;span class=punct&gt;}&lt;/span&gt;
    &lt;span class=keyword&gt;end&lt;/span&gt;
  &lt;span class=keyword&gt;end&lt;/span&gt;
&lt;span class=keyword&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;span class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;a href="http://blog.cotecso.com.ve/assets_c/2009/06/flisol_todo_con_estilos_aplicados-26.html" onclick="window.open('http://blog.cotecso.com.ve/assets_c/2009/06/flisol_todo_con_estilos_aplicados-26.html','popup','width=315,height=616,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false"&gt;&lt;img src="http://blog.cotecso.com.ve/assets_c/2009/06/flisol_todo_con_estilos_aplicados-thumb-240x469-26.png" width="240" height="469" alt="flisol_todo_con_estilos_aplicados.png" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Nótese que las acciones &lt;em&gt;create&lt;/em&gt; y &lt;em&gt;update&lt;/em&gt; redirigen a &lt;em&gt;index&lt;/em&gt; si la operación fue satisfactoria, esto se logra mediante &lt;code&gt;redirect_to tareas_path&lt;/code&gt;. Otro pequeño ajuste se realizó para el caso de que la operación de creación de una nueva tarea falla: se debe mostrar el template &lt;em&gt;index.html.erb&lt;/em&gt;, pero para evitar un error de que no se encuentran definidas las variables &lt;code&gt;@pendientes&lt;/code&gt; y &lt;code&gt;@finalizadas&lt;/code&gt;, debemos asignarles los registros tal cual se realizó en la acción index.&lt;/p&gt;

&lt;p&gt;Si todo salió bien, debemos ver algo parecido a lo que se muestra en la imagen.&lt;/p&gt;

&lt;p&gt;Bueno, eso es todo en esta parte 2, en la siguiente entrega mostraremos las tareas pendientes y finalizadas en el iphone, utilizando mi plugin &lt;em&gt;rails_jqtouch&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Saludos!&lt;/p&gt;

        

    
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/dZ_3IjubeBhnyhJkYXPfXmHkE2c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dZ_3IjubeBhnyhJkYXPfXmHkE2c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/dZ_3IjubeBhnyhJkYXPfXmHkE2c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/dZ_3IjubeBhnyhJkYXPfXmHkE2c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/tecnologiasocial/~4/pBDuu9pxJOs" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.cotecso.com.ve/2009/06/rails-iphone-flisol-paraguana-2009---parte-2.html</feedburner:origLink></entry>

<entry>
    <title>Plugin rails_jqtouch: Integrando jQTouch y Rails</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tecnologiasocial/~3/GCLFbU6AxtA/plugin-rails-jqtouch-integrando-jqtouch-y-rails.html" />
    <id>tag:blog.cotecso.com.ve,2009://3.9</id>

    <published>2009-05-25T15:43:37Z</published>
    <updated>2009-05-25T20:29:58Z</updated>

    <summary>Nuevo plugin de Ruby on Rails para facilitar la creación de aplicaciones web para dispositivos móviles, basado en jQTouch.</summary>
    <author>
        <name>Ricardo Rodríguez</name>
        
    </author>
    
        <category term="Rails" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="github" label="github" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="iphone" label="iPhone" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="jqtouch" label="jQTouch" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails" label="Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails_jqtouch" label="rails_jqtouch" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ruby" label="Ruby" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="es" xml:base="http://blog.cotecso.com.ve/">
        &lt;p&gt;&lt;span class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;a href="http://blog.cotecso.com.ve/imagenes/IMG_0003.PNG"&gt;&lt;img alt="rails_jqtouch_screenshot.png" src="http://blog.cotecso.com.ve/assets_c/2009/05/IMG_0003-thumb-240x360-24.png" width="240" height="360" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" /&gt;&lt;/a&gt;&lt;/span&gt;
Hace un par de semanas, publiqué en &lt;a href="http://github.com/rrodrigu3z"&gt;mi github&lt;/a&gt;, un plugin de &lt;a href="http://www.rubyonrails.org"&gt;Rails&lt;/a&gt; llamado &lt;a href="http://github.com/rrodrigu3z/rails_jqtouch/tree/master"&gt;rails_jqtouch&lt;/a&gt; para facilitar el uso de &lt;a href="http://www.jqtouch.com"&gt;jQTouch&lt;/a&gt; con Rails. jQTouch es un plugin de &lt;a href="http://jquery.com/"&gt;jQuery&lt;/a&gt; que facilita el desarrollo de aplicaciones web para dispositivos móviles con navegador Mobile Webkit, como por ejemplo un &lt;a href="http://www.apple.com/iphone/"&gt;iPhone de Apple&lt;/a&gt;, &lt;a href="http://www.htc.com/www/product/g1/overview.html"&gt;HTC G1&lt;/a&gt; o &lt;a href="http://www.palm.com/us/products/phones/pre/"&gt;Palm Pre&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Hace como un mes, estaba viendo que demostración hacía para el &lt;a href="http://blog.cotecso.com.ve/2009/05/finalizado-flisol-paraguana-2009-con-exito.html"&gt;FLISOL Paraguaná 2009&lt;/a&gt;, obviamente, por ser desarrollador en &lt;a href="http://www.ruby-lang.org"&gt;Ruby&lt;/a&gt;, el tema era algo de Rails (además de poder hacer publicidad para los cursos de Rails!!), pero no es fácil mostrarle a jóvenes (no es que yo me sienta viejo!!, tengo 26 años!!) que están comenzando en este mundo de desarrollo de software las bondades de Rails, así que decidí colocarle un aderezo interesante a la demostración... incluir la participación de mi flamante iPhone 3G :p &lt;/p&gt;

&lt;p&gt;El asunto era &lt;em&gt;¿cómo?&lt;/em&gt;, comencé a adentrarme en el desarrollo de aplicaciones web para estos dispositivos, probé varias alternativas que incluían: &lt;a href="http://code.google.com/p/iui/"&gt;iUI&lt;/a&gt;, &lt;a href="http://github.com/noelrappin/rails-iui/tree/master"&gt;rails_iui&lt;/a&gt; y &lt;a href="http://github.com/noelrappin/tank-engine/tree/master"&gt;tank_engine&lt;/a&gt; (los dos últimos cortesía de &lt;a href="http://10printhello.blogspot.com/"&gt;Noel Rappin&lt;/a&gt; (Por cierto me acabo de enterar que ha escrito como 3 libros!!!). Para resumir, ninguno me complació del todo, de repente, me encontré con &lt;a href="http://ajaxian.com/archives/jqtouch-a-mobile-webkit-javascript-framework"&gt;jQTouch en Ajaxian&lt;/a&gt;, el asunto era que no era fácil hacer la demostración de Rails y jQTouch sin un plugin, así que me animé a crearlo y tenerlo listo para el FLISOL. Además era algo importante para mí, ya que nunca había liberado un código fuente y era algo que simplemente debía hacer (antes tenía una camisa de fuerza cuando trabajaba en PDVSA).&lt;/p&gt;

&lt;p&gt;Ok... basta de reseñas históricas, vamos a mostrar algunas funcionalidades de jQTouch.&lt;/p&gt;

&lt;h3&gt;Instalación&lt;/h3&gt;

&lt;p&gt;Para instalar rails_jqtouch, lo único que hay que hacer es descargarlo desde mi github, o más fácilmente, instalarlo directamente con &lt;code&gt;script/plugin install&lt;/code&gt; desde un proyecto de Rails:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;script/plugin install git://github.com/rrodrigu3z/rails_jqtouch.git
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;em&gt;rails_jqtouch&lt;/em&gt; incluye varias tareas &lt;code&gt;rake&lt;/code&gt; que facilitan, por ejemplo, la copia de los archivos de jQTouch (&lt;em&gt;javascripts&lt;/em&gt;, &lt;em&gt;imágenes&lt;/em&gt;, &lt;em&gt;stylesheets&lt;/em&gt;, etc) dentro de los directorios correctos del proyecto. En este sentido, el siguiente paso es ejecutar:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rake rails_jqtouch:install
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Algunas de las otras tareas disponibles son (ejecutar &lt;code&gt;rake -T&lt;/code&gt; para ver todas):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rake rails_jqtouch:jqtouch_version  # Show jQTouch version included
rake rails_jqtouch:clean            # Delete all installed files
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Uso: Controladores&lt;/h3&gt;

&lt;p&gt;Al igual que &lt;em&gt;rails_iui&lt;/em&gt;, &lt;em&gt;rails_jqtouch&lt;/em&gt; puede reconocer los requests provenientes de navegadores &lt;strong&gt;Mobile Safari&lt;/strong&gt;, para ello se debe incluir en el controlador deseado o en el ApplicationController lo siguiente:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;acts_as_iphone_controller
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Con esto, habilitamos al controlador para que pueda incluirse la opción &lt;code&gt;:iphone&lt;/code&gt; dentro de bloques &lt;code&gt;respond_to&lt;/code&gt;, por lo que podemos crear templates con nombres tipo &lt;em&gt;xxxx.iphone.erb&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Ejemplo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;TareasController&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ApplicationController&lt;/span&gt;
  &lt;span class="ident"&gt;acts_as_iphone_controller&lt;/span&gt;

  &lt;span class="comment"&gt;# GET /tareas&lt;/span&gt;
  &lt;span class="comment"&gt;# GET /tareas.iphone&lt;/span&gt;
  &lt;span class="comment"&gt;# GET /tareas.xml&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;index&lt;/span&gt;
    &lt;span class="attribute"&gt;@tareas&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Tarea&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;all&lt;/span&gt;

    &lt;span class="ident"&gt;respond_to&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;format&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
      &lt;span class="ident"&gt;format&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;html&lt;/span&gt;     &lt;span class="comment"&gt;# index.html.erb&lt;/span&gt;
      &lt;span class="ident"&gt;format&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;iphone&lt;/span&gt;   &lt;span class="comment"&gt;# index.iphone.erb&lt;/span&gt;
      &lt;span class="ident"&gt;format&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;xml&lt;/span&gt;  &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="ident"&gt;render&lt;/span&gt; &lt;span class="symbol"&gt;:xml&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="attribute"&gt;@tareas&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="comment"&gt;# Otras acciones ...&lt;/span&gt;

&lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Uso: Helpers y Vistas&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;rake rails_jqtouch:install&lt;/code&gt; también copia un layout de ejemplo en &lt;em&gt;app/views/layouts/application.iphone.erb&lt;/em&gt;, el cual puede ser ser personalizado según las necesidades:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span class="punct"&gt;&amp;lt;!&lt;/span&gt;&lt;span class="tag"&gt;DOCTYPE&lt;/span&gt; &lt;span class="attribute"&gt;html&lt;/span&gt; &lt;span class="attribute"&gt;PUBLIC&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;-//W3C//DTD XHTML 1.0 Strict//EN&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
         &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&amp;gt;&lt;/span&gt;
&lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;html&lt;/span&gt; &lt;span class="attribute"&gt;xmlns&lt;/span&gt;&lt;span class="punct"&gt;=&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;http://www.w3.org/1999/xhtml&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&amp;gt;&lt;/span&gt;
&lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;head&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;title&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;Rails JQTouch&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;title&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="punct"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="attribute"&gt;stylesheet_link_tag&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;jqt/jqtouch&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; %&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="punct"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="attribute"&gt;javascript_include_tag&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;jquery-1.3.2.min&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;jqtouch.min&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; %&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt; 
    &lt;span class="punct"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="attribute"&gt;jqtouch_init&lt;/span&gt; :&lt;span class="attribute"&gt;status_bar&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &amp;quot;&lt;span class="string"&gt;black-translucent&lt;/span&gt;&amp;quot; %&amp;gt;
&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;head&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="tag"&gt;body&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="punct"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="attribute"&gt;yield&lt;/span&gt; %&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;body&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="punct"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="tag"&gt;html&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Con &lt;code&gt;jqtouch_init&lt;/code&gt; se puede configurar el comportamiento de jQTouch, para detalles de las opciones soportadas, ver la documentación de jQTouch (aunque no hay mucha que se diga aún). &lt;/p&gt;

&lt;p&gt;&lt;code&gt;Jqtouch::MobileHelper&lt;/code&gt; define helpers que son incluidos de manera automática, y que facilitan la escritura de los templates, los detalles están en la documentación del código. Algunos ejemplos de uso también se pueden ver en los tests. De todas formas colocaré algunos ejemplos y formas de uso aquí en el blog.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;% mobile_page 'home', :selected =&amp;gt; true do  %&amp;gt;
  &amp;lt;% mobile_toolbar 'jQTouch' do %&amp;gt;
    &amp;lt;%= mobile_button_to "About", '#about', :effect =&amp;gt; 'slideup' %&amp;gt;
  &amp;lt;% end %&amp;gt;

  &amp;lt;%= mobile_list [
      {:name =&amp;gt; "Features", :url =&amp;gt; "#features"},
      {:name =&amp;gt; "Demos", :url =&amp;gt; "#demos"},
      {:name =&amp;gt; "Docs", :url =&amp;gt; "docs.html"},
      {:name =&amp;gt; "License", :url =&amp;gt; "#license"},
      {:name =&amp;gt; "Download &amp;amp;raquo;", :url =&amp;gt; "http://www.jqtouch.com/", :target =&amp;gt; "_self"} ]  %&amp;gt;

&amp;lt;% end %&amp;gt;


&amp;lt;% mobile_panel 'about' do %&amp;gt;
  &amp;lt;% mobile_pad :style =&amp;gt; 'padding-top: 80px' do %&amp;gt;
    &amp;lt;p&amp;gt;jQTouch was created by David Kaneda as a means of easily creating iPhone-styled websites. 
    It is released open source, under the MIT license. It is still in its early stages of development 
    and is currently lacking in documentation. 
    For more information about jQTouch, please contact 
    &amp;lt;a href="http://twitter.com/davidkaneda/"&amp;gt;David on Twitter, @davidkaneda.&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;

    &amp;lt;%= mobile_back_button 'Close', :class =&amp;gt; "grayButton"  %&amp;gt;
  &amp;lt;% end %&amp;gt; 
&amp;lt;% end %&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;El listado anterior es un fragmento adaptado con &lt;em&gt;rails_jqtouch&lt;/em&gt; del &lt;strong&gt;index.html&lt;/strong&gt; incluido como ejemplo con jQTouch. Algunos de los helpers incluidos en &lt;em&gt;rails_jqtouch&lt;/em&gt; son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;mobile_page&lt;/strong&gt;: Genera el wrapper para una página, referenciada por un id.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mobile_pad&lt;/strong&gt;: Genera un &lt;em&gt;div&lt;/em&gt; con la clase &lt;em&gt;pad&lt;/em&gt;, que sirve de contenedor de elementos de formulario, texto, entre otros.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mobile_panel&lt;/strong&gt;: Es como &lt;em&gt;mobile_page&lt;/em&gt;, pero le agrega al div resultante la clase &lt;em&gt;panel&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mobile_fieldset&lt;/strong&gt;: Genera un &lt;em&gt;fieldset&lt;/em&gt;, que sirve de contenedor de mobile_rows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mobile_row&lt;/strong&gt;: Genera un &lt;em&gt;div&lt;/em&gt; con la clase &lt;em&gt;row&lt;/em&gt; que se utiliza como contenedor de elementos de formulario.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mobile_toolbar&lt;/strong&gt;: Genera la barra de herramientas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mobile_button_to&lt;/strong&gt;: Genera un botón con los estilos deseados.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mobile_back_button_to&lt;/strong&gt;: Genera un botón para devolverse, útil para ser usado en el toolbar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mobile_list&lt;/strong&gt;: Genera una lista, típica de aplicaciones para móviles, se puede especificar el nombre y url de cada item.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como mencioné antes, la documentación está mucho mejor en el código, por lo que pueden generarla con &lt;code&gt;rdoc&lt;/code&gt;. Si tengo tiempo, la subo en estos días a algún subdominio para que esté en línea.&lt;/p&gt;

&lt;p&gt;Bueno, espero que este plugin sea de utilidad, no soy un experto en desarrollo para dispositivos móviles, pero espero sus comentarios, sugerencias, mejoras, etc. Además, es mi primer código que libero, así que sean gentiles!!! (por si ven algún mamarracho...).&lt;/p&gt;

&lt;p&gt;Saludos! y estén pendientes para la siguiente parte de &lt;em&gt;Rails + iPhone&lt;/em&gt;.&lt;/p&gt;

        

    
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/G525s8WNHqj6t4BmEQDBhTI4UUI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/G525s8WNHqj6t4BmEQDBhTI4UUI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/G525s8WNHqj6t4BmEQDBhTI4UUI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/G525s8WNHqj6t4BmEQDBhTI4UUI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/tecnologiasocial/~4/GCLFbU6AxtA" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.cotecso.com.ve/2009/05/plugin-rails-jqtouch-integrando-jqtouch-y-rails.html</feedburner:origLink></entry>

<entry>
    <title>Rails + iPhone (FLISOL Paraguaná 2009) - Parte 1</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tecnologiasocial/~3/9FJ9MBGS4as/rails-iphone-flisol-paraguana-2009---parte-1.html" />
    <id>tag:blog.cotecso.com.ve,2009://3.7</id>

    <published>2009-05-18T15:56:07Z</published>
    <updated>2009-05-19T16:04:14Z</updated>

    <summary> En esta serie de 3 artículos, estaré haciendo un resumen de la demostración que realicé en el FLISOL Paraguaná 2009. Después de muchas vueltas, nunca logré ponerle un nombre bueno a la presentación, lo cual es algo que me...</summary>
    <author>
        <name>Ricardo Rodríguez</name>
        
    </author>
    
        <category term="FLISOL 2009" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Tutoriales" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="flisol" label="FLISOL" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails" label="Rails" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ruby" label="Ruby" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="todolist" label="to-do list" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tutorial" label="Tutorial" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="es" xml:base="http://blog.cotecso.com.ve/">
        &lt;p&gt;&lt;span class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;img alt="Imagen Thumbnail para rails_flisol_paraguana_2009.png" src="http://blog.cotecso.com.ve/assets_c/2009/05/rails_flisol_paraguana_2009-thumb-240x179-15.png" width="240" height="179" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" /&gt;&lt;/span&gt;
En esta serie de 3 artículos, estaré haciendo un resumen de la demostración que realicé en el FLISOL Paraguaná 2009. Después de muchas vueltas, nunca logré ponerle un nombre bueno a la  presentación, lo cual es algo que me decepciona. Mis amigos saben que me gusta ponerle nombres o  títulos espaciales (si, con &lt;strong&gt;a&lt;/strong&gt; no con &lt;strong&gt;e&lt;/strong&gt;) a las cosas, por ejemplo, mi presentación del FLISOL  pasado &lt;em&gt;Entropía en el software&lt;/em&gt;, los cursos de Rails (&lt;strong&gt;Rails Sensei:&lt;/strong&gt; &lt;em&gt;Técnicas avanzadas y soluciones elegantes para la web&lt;/em&gt;). Pero en fin, aunque no fué el nombre que utilicé, vamos a conformarnos por ahora con &lt;strong&gt;Rails + iPhone&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;No es usual en mí utilizar mucho texto en las presentaciones, pero si creen que les sirve de algo, o la quieren de recuerdo, pueden descargar la versión en pdf &lt;a href="/presentaciones/flisol_todo.pdf"&gt;aquí&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Este primer artículo explicará lo que se desea hacer, se creará el proyecto y rápidamente generaremos un scaffold. La &lt;strong&gt;segunda parte&lt;/strong&gt; consistirá en modificar un poco los estilos y ajustar el flujo de navegación, y la &lt;strong&gt;tercera parte&lt;/strong&gt; consistirá en agregarle una interfaz para navegadores Mobile Safari (iPhone o iPod Touch).&lt;/p&gt;

&lt;p&gt;Sé que muchos de los presentes ese día eran estudiantes, quizás no muy familiarizados con lo que es un &lt;a href="http://es.wikipedia.org/wiki/Framework" title="Framework"&gt;Framework&lt;/a&gt;, con el patrón &lt;a href="http://c2.com/cgi/wiki?ModelViewController" title="MVC"&gt;MVC&lt;/a&gt;, o con &lt;a href="" title="http://ruby-lang.org/ &amp;quot;Ruby"&gt;Ruby&lt;/a&gt; o &lt;a href="http://www.rubyonrails.org" title="Rails"&gt;Rails&lt;/a&gt;. La idea era demostrar lo rápido que era desarrollar una aplicación web con Rails y agregarle una interfaz específica para dispositivos móviles, en este caso un &lt;a href="http://www.apple.com/iphone/" title="iPhone de Apple"&gt;iPhone de Apple&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Después de una breve introducción, pudimos entrar en materia, crear la aplicación &lt;strong&gt;FLISOL To - do&lt;/strong&gt;, una aplicación simple tipo &lt;a href="http://en.wikipedia.org/wiki/Time_management#Task_list" title="to-do list"&gt;to-do list&lt;/a&gt;. Así que entremos en materia nosotros también.&lt;/p&gt;

&lt;p&gt;Una manera de definir lo que queremos hacer es diseñar la &lt;a href="http://gettingreal.37signals.com/ch09_Interface_First.php" title="Interfaz Primero"&gt;Interfaz Primero&lt;/a&gt;, preferiblemente con papel y lápiz (si, así de simple y barato) e ir planteando un flujo de la aplicación, por ejemplo: &lt;em&gt;"hago clic aquí y se muestra tal cosa..."&lt;/em&gt;, &lt;em&gt;"clic en Aceptar para enviar los datos, luego se muestra el listado..."&lt;/em&gt;. La idea es ir reflejando el flujo de trabajo del usuario con la aplicación. Este es el borrador de la interfaz para nuestro pequeño ejemplo.&lt;/p&gt;

&lt;p&gt;&lt;span class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;img alt="Imagen Thumbnail para flisol_todo_borrador_interfaz.png" src="http://blog.cotecso.com.ve/assets_c/2009/05/tareas_fondo_blanco-thumb-240x367-18.png" width="240" height="367" class="mt-image-right" style="float: right; margin: 0 0 20px 20px;" /&gt;&lt;/span&gt;
Tenemos un título (&lt;strong&gt;Mis Tareas&lt;/strong&gt;), que identifica toda nuestra interfaz, y claramente separamos las tareas &lt;strong&gt;Pendientes&lt;/strong&gt; de las &lt;strong&gt;Finalizadas&lt;/strong&gt;. Al hacer clic sobre un &lt;em&gt;checkbox&lt;/em&gt;, indicamos si la tarea se terminó o la devolvemos al listado de pendientes. Adicionalmente incorporamos links para &lt;strong&gt;editar&lt;/strong&gt; o &lt;strong&gt;eliminar&lt;/strong&gt; cada una.&lt;/p&gt;

&lt;p&gt;En la parte inferior se puede incorporar un formulario para agregar nuevas tareas. Se puede observar que la información asociada a una tarea incluye un &lt;strong&gt;Título&lt;/strong&gt; y unas &lt;strong&gt;Notas&lt;/strong&gt;. Por ejemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Título:&lt;/strong&gt; &lt;em&gt;Escribir segunda parte del artículo de Rails + iPhone.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Notas:&lt;/strong&gt; &lt;em&gt;La segunda parte consta de aplicar los estilos y aplicar el flujo navegación detallado en la Parte 1.&lt;/em&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esto nos lleva al siguiente paso, definir un modelo inicial de datos para almacenar la información que deseamos mostrar. Al igual que antes, podemos usar lápiz y papel.&lt;/p&gt;

&lt;p&gt;&lt;span class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;img alt="Imagen Thumbnail para flisol_todo_borrador_modelo.png" src="http://blog.cotecso.com.ve/assets_c/2009/05/modelo_fondo_blanco-thumb-240x138-21.png" width="240" height="138" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" /&gt;&lt;/span&gt;
Sin mucho análisis, un buen nombre para  nuestro modelo sería &lt;strong&gt;Tarea&lt;/strong&gt; (luego veremos que por convenciones de Rails, la tabla asociada a un modelo, por defecto es plural, por eso la imagen muestra &lt;em&gt;tareas&lt;/em&gt;). Tanto &lt;strong&gt;título&lt;/strong&gt; como &lt;strong&gt;notas&lt;/strong&gt; son atributos que deben aparecer en este modelo, pero también debemos agregar un mecanismo para determinar si cada tarea ya fue finalizada. Un nombre ideal para este atributo sería &lt;strong&gt;finalizada&lt;/strong&gt; de tipo &lt;strong&gt;boolean&lt;/strong&gt;, que permita indicar con &lt;em&gt;true&lt;/em&gt; o &lt;em&gt;false&lt;/em&gt; si la tarea en cuestión ya se culminó. Un detalle adicional aquí es que el atributo &lt;strong&gt;finalizada&lt;/strong&gt; debe ser por defecto &lt;em&gt;false&lt;/em&gt; (En un to-do list, no tiene sentido crear una tarea ya finalizada).&lt;/p&gt;

&lt;p&gt;Con las ideas claras y un bosquejo de lo que queremos hacer, lo siguiente es crear el proyecto en Rails y comenzar a darle forma para que se parezca a nuestros borradores.&lt;/p&gt;

&lt;p&gt;Para crear el proyecto, escribimos en la línea de comando:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rails flisol_todolist
cd flisol_todolist
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;La primera línea utiliza la instrucción de línea de comando &lt;code&gt;rails&lt;/code&gt;, la cual nos permite inicializar un proyecto, con todos los directorios básicos y archivos de configuración necesarios para desarrollar la aplicación. &lt;code&gt;rails&lt;/code&gt; crea el directorio &lt;em&gt;flisol_todolist&lt;/em&gt;, que contiene todo el proyecto. Con la segunda línea, simplemente ingresamos a este directorio.&lt;/p&gt;

&lt;p&gt;Ahora, podemos dar un paso rápido y crear un &lt;a href="http://en.wikipedia.org/wiki/Scaffold_(programming)"&gt;scaffold&lt;/a&gt; o bien crear &lt;strong&gt;"a mano"&lt;/strong&gt; un &lt;em&gt;Controlador&lt;/em&gt; para procesar los requests, un &lt;em&gt;Modelo&lt;/em&gt; para gestionar el acceso a datos y darle persitencia a la información y luego agregar cada una de las &lt;em&gt;vistas&lt;/em&gt; que nos permitirán mostrar la información en el navegador. Nos iremos por el camino rápido y crearemos un scaffold, que hará por nosotros todo lo antes mencionado. Antes, vamos a recordar que dijimos que el nombre de nuestro modelo sería &lt;strong&gt;Tarea&lt;/strong&gt; y que tenía los atributos &lt;em&gt;titulo&lt;/em&gt;, &lt;em&gt;notas&lt;/em&gt; y &lt;em&gt;finalizada&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Nos vamos a una terminal (la misma que teníamos abierta) y dentro del directorio del proyecto (&lt;em&gt;flisol_todo&lt;/em&gt;) ejecutamos:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;script/generate scaffold Tarea \
  titulo:string \
  notas:text \
  finalizada:boolean
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Lo que en realidad hicimos fue decirle al framework que generara un &lt;em&gt;scaffold&lt;/em&gt;, es decir, una estructura base (de código fuente) de la cual podemos apoyarnos, para luego darle forma hasta convertirla en lo que realmente se ajusta a nuestras necesidades. Podemos notar que los argumentos son el nombre del modelo (&lt;strong&gt;Tarea&lt;/strong&gt; en este caso) y sus atributos (los atributos son opcionales, pero en este ejemplo los incorporamos para yo no tener que escribir tanto en este artículo!!).&lt;/p&gt;

&lt;p&gt;El Scaffold, aparte de crearnos el modelo &lt;code&gt;Tarea&lt;/code&gt; &lt;em&gt;(app/models/tarea.rb)&lt;/em&gt;, el controlador &lt;code&gt;TareasController&lt;/code&gt; &lt;em&gt;(app/controllers/tareas_controller.rb)&lt;/em&gt; y las vistas principales &lt;em&gt;(app/views/tareas)&lt;/em&gt;, nos genera un &lt;a href="http://api.rubyonrails.org/classes/ActiveRecord/Migration.html"&gt;migration&lt;/a&gt;, disponible en el directorio &lt;em&gt;db/migrate/nnnn_create_tareas.rb&lt;/em&gt; (nnnn representa un &lt;em&gt;timespamp&lt;/em&gt;). Por ahora vamos a conformarnos con saber que dicho migration nos permitirá especificar el esquema de la tabla asociada al modelo &lt;code&gt;Tarea&lt;/code&gt;, es decir, el nombre de la tabla y sus columnas. Los migrations en Rails son extremadamente útiles, para mas información, pueden dirigirse a &lt;a href="http://guides.rubyonrails.org/migrations.html"&gt;Rails Guides - Migrations&lt;/a&gt;. Vamos a darle una mirada a nuestro migration:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;CreateTareas&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Migration&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;self.up&lt;/span&gt;
    &lt;span class="ident"&gt;create_table&lt;/span&gt; &lt;span class="symbol"&gt;:tareas&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;t&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
      &lt;span class="ident"&gt;t&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;string&lt;/span&gt; &lt;span class="symbol"&gt;:titulo&lt;/span&gt;
      &lt;span class="ident"&gt;t&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;text&lt;/span&gt; &lt;span class="symbol"&gt;:notas&lt;/span&gt;
      &lt;span class="ident"&gt;t&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;boolean&lt;/span&gt; &lt;span class="symbol"&gt;:finalizada&lt;/span&gt;

      &lt;span class="ident"&gt;t&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;timestamps&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;self.down&lt;/span&gt;
    &lt;span class="ident"&gt;drop_table&lt;/span&gt; &lt;span class="symbol"&gt;:tareas&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nos enfocaremos solamente en la sección &lt;code&gt;create_table :tareas ... end&lt;/code&gt;. En criollo, dice lo siguiente (omitiendo &lt;code&gt;t.timestamps&lt;/code&gt;): &lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Crea la &lt;em&gt;tabla&lt;/em&gt; tareas, con el campo &lt;strong&gt;titulo&lt;/strong&gt; de tipo &lt;code&gt;string&lt;/code&gt;, el campo &lt;strong&gt;notas&lt;/strong&gt; de tipo &lt;code&gt;text&lt;/code&gt; y el campo &lt;strong&gt;finalizada&lt;/strong&gt; como &lt;code&gt;boolean&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Si comparamos eso, con la imagen de nuestro modelo, que discutimos anteriormente, vemos que falta sólo algo, el valor por defecto (&lt;em&gt;default&lt;/em&gt;), que debe ser &lt;em&gt;false&lt;/em&gt;, para lo cual sólo debemos agregar &lt;code&gt;:default =&amp;gt; false&lt;/code&gt; al campo &lt;em&gt;finalizada&lt;/em&gt;. El migration luego de editarlo queda de la siguiente manera:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;CreateTareas&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Migration&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;self.up&lt;/span&gt;
    &lt;span class="ident"&gt;create_table&lt;/span&gt; &lt;span class="symbol"&gt;:tareas&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;t&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
      &lt;span class="ident"&gt;t&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;string&lt;/span&gt; &lt;span class="symbol"&gt;:titulo&lt;/span&gt;
      &lt;span class="ident"&gt;t&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;text&lt;/span&gt; &lt;span class="symbol"&gt;:notas&lt;/span&gt;
      &lt;span class="ident"&gt;t&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;boolean&lt;/span&gt; &lt;span class="symbol"&gt;:finalizada&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:default&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;false&lt;/span&gt;

      &lt;span class="ident"&gt;t&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;timestamps&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;

  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;self.down&lt;/span&gt;
    &lt;span class="ident"&gt;drop_table&lt;/span&gt; &lt;span class="symbol"&gt;:tareas&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Antes de probar la aplicación, sólo nos queda crear la base de datos, la pregunta es ¿Si no hemos hablado si va a ser MySql, PostgreSql, SQLite, etc. Una ganancia de usar un framework (o mejor dicho un &lt;a href="http://c2.com/cgi/wiki?ObjectRelationalMapping"&gt;ORM&lt;/a&gt;) es tener la facilidad de hacer que nuestra aplicación sea en muchos casos &lt;strong&gt;database-agnostic&lt;/strong&gt;, y Rails, o mejor dicho, &lt;a href="http://api.rubyonrails.org/classes/ActiveRecord/Base.html"&gt;ActiveRecord de Rails&lt;/a&gt;, es una de las cosas que nos permite hacer. Rails incluye una configuración de base de datos por defecto, la cual está basada en &lt;a href="http://www.sqlite.org/"&gt;SQLite&lt;/a&gt;. Un extracto del archivo de configuración &lt;em&gt;(config/database.yml)&lt;/em&gt; se muestra a continuación:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;...
development:
  adapter: sqlite3
  database: db/development.sqlite3
  pool: 5
  timeout: 5000
...
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Brevemente, &lt;code&gt;adapter: sqlite3&lt;/code&gt; indica que usaremos una base de datos SQLite 3.x y &lt;code&gt;database: db/development.sqlite3&lt;/code&gt;  que está ubicada en el directorio &lt;em&gt;db&lt;/em&gt;, con el nombre &lt;em&gt;development.sqlite3&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Rails incluye un conjunto de tareas que nos permiten facilitar el trabajo con el (ejecutar &lt;code&gt;rake -T&lt;/code&gt; para un listado), entre ellas la posibilidad de crear la base de datos y ejecutar los migrations de manera inteligente. Para crear la base de datos, con el esquema definido, ejecutamos en la terminal (si, en el directorio del proyecto) lo siguiente:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rake db:migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Listo! nuestra base de datos se creó en el directorio &lt;em&gt;db&lt;/em&gt;, con el nombre &lt;em&gt;development.sqlite3&lt;/em&gt; (si no cambiaron el nombre y la ruta!!!). Si se genera algún tipo de error, revisar con tranquilidad los pasos anteriores, y todo el código escrito (&lt;code&gt;:default =&amp;gt; false&lt;/code&gt; jaja).&lt;/p&gt;

&lt;p&gt;Para probar la aplicación, es necesario iniciar el servidor local, yo acostumbro abrir otra terminal (o pestaña) y utilizarla exclusivamente para el servidor de desarrollo, sólo recuerda verificar que estas en el directorio del proyecto. Para iniciar el servidor, ejecutar:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;script/server
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;La salida indicará que el servidor inició y está escuchando en el puerto 3000, sólo nos queda disfrutar de la magia de Rails ingresando la url &lt;a href="http://localhost:3000/tareas"&gt;http://localhost:3000/tareas&lt;/a&gt; y jugar un poco agregando, modificando y eliminando tareas.&lt;/p&gt;

&lt;p&gt;Si no probaron agregar una tarea con todos los campos en blanco, háganlo ahora, se darán cuenta de que no hay ninguna validación asociada. Como podrán imaginarse, el &lt;strong&gt;título&lt;/strong&gt; debería ser requerido para cualquier tarea. Para lograr esto, editamos el archivo &lt;em&gt;app/models/tarea.rb&lt;/em&gt; para que quede de la siguiente forma:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Tarea&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
  &lt;span class="ident"&gt;validates_presence_of&lt;/span&gt; &lt;span class="symbol"&gt;:titulo&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Si volvemos a intentar ingresar una tarea sin especificar un título, obtendremos un mensaje de error, indicándonos que el &lt;em&gt;título&lt;/em&gt; no puede estar en blanco. Para mas información sobre las validaciones, pueden ingresar en &lt;a href="http://guides.rubyonrails.org/activerecord_validations_callbacks.html"&gt;Rails Guides - ActiveRecord Validations and Callbacks&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Con esto, finalizamos la primera parte de esta serie de 3 artículos, en la siguiente entrega, ajustaremos el flujo de navegación y los estilos para que parezca mas un &lt;em&gt;to-do list&lt;/em&gt; y en la tercera, mostraremos las tareas en un iPhone, utilizando &lt;a href="http://github.com/rrodrigu3z/rails_jqtouch/tree/master"&gt;rails_jqtouch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Saludos!&lt;/p&gt;

        

    
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/pm-1niET-zaShYNvN6yuu-Lp-MM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pm-1niET-zaShYNvN6yuu-Lp-MM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/pm-1niET-zaShYNvN6yuu-Lp-MM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/pm-1niET-zaShYNvN6yuu-Lp-MM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/tecnologiasocial/~4/9FJ9MBGS4as" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.cotecso.com.ve/2009/05/rails-iphone-flisol-paraguana-2009---parte-1.html</feedburner:origLink></entry>

<entry>
    <title>Finalizado FLISOL Paraguaná 2009 con éxito</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tecnologiasocial/~3/0izGrhDmbg4/finalizado-flisol-paraguana-2009-con-exito.html" />
    <id>tag:blog.cotecso.com.ve,2009://3.5</id>

    <published>2009-05-11T13:45:27Z</published>
    <updated>2009-05-11T21:22:06Z</updated>

    <summary> El FLISOL Paraguaná 2009 finalizó con éxito, felicitaciones a todos los organizadores y participantes, incluyendo: GULIP, GULPF, VOSUG, Ubuntu-VE, y por supuesto nosotros como COTECSO. En su post, José Jimenez comenta varias de las actividades entorno a las instalaciones...</summary>
    <author>
        <name>Ricardo Rodríguez</name>
        
    </author>
    
        <category term="Eventos" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="cotecso" label="COTECSO" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="flisol" label="FLISOL" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="presentaciones" label="Presentaciones" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="es" xml:base="http://blog.cotecso.com.ve/">
        &lt;span class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;a href="http://blog.cotecso.com.ve/imagenes/P1020692.JPG"&gt;&lt;img alt="cartel_mugshots.jpg" src="http://blog.cotecso.com.ve/assets_c/2009/05/P1020692-thumb-240x180-9.jpg" class="mt-image-left" style="margin: 0pt 20px 20px 0pt; float: left;" width="240" height="180" /&gt;&lt;/a&gt;&lt;/span&gt; &lt;div&gt;El FLISOL Paraguaná 2009 finalizó con éxito, felicitaciones a todos los organizadores y participantes, incluyendo: &lt;a href="http://www.gulip.org/"&gt;GULIP&lt;/a&gt;, &lt;a href="http://gulpf.org.ve/"&gt;GULPF&lt;/a&gt;, &lt;a href="http://www.opensolaris.org/os/project/vosug/"&gt;VOSUG&lt;/a&gt;, &lt;a href="http://www.ubuntu-ve.org/"&gt;Ubuntu-VE&lt;/a&gt;, y por supuesto nosotros como &lt;a href="http://www.cotecso.com.ve/"&gt;COTECSO&lt;/a&gt;. En su &lt;a href="http://josegjimenez.wordpress.com/2009/05/10/flisol-2009-paraguana-culminado-satisfactoriamente/"&gt;post&lt;/a&gt;, José Jimenez comenta varias de las actividades entorno a las instalaciones de GNU/Linux. Yo concuerdo con él respecto a que no fué tanta gente como el año pasado, pero los que fueron mostraron su entusiasmo e interés en las diversas actividades.&lt;br /&gt;&lt;br /&gt;A la final, nosotros como COTECSO la pasamos muy bien, muchos de nuestros amigos y ex-compañeros de trabajo (antes de ser COTECSO) nos acompañaron, asistieron al evento y estuvieron un rato por nuestro stand apoyándonos. Tuvimos la oportunidad de ofrecer nuestros servicios de adiestramiento a los asistentes, entregamos folletos sobre &lt;a href="http://www.cotecso.com.ve/"&gt;nuestros cursos&lt;/a&gt; y dictamos varias charlas y/o demostraciones.&lt;br /&gt;&lt;br /&gt;El evento comenzó como media hora después de lo planificado, las presentaciones tardaron un poco mas de lo esperado, por lo que vinimos terminando cerca de las 7pm (después de convencer a Alfonso que diera la charla de ilustración con &lt;a href="http://www.inkscape.org/"&gt;Inkscape&lt;/a&gt; a pesar de la hora). Las charlas fueron las siguientes:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;La realidad del software libre&lt;/b&gt; &lt;i&gt;(Asdrúbal Colina - GULIP)&lt;/i&gt;: Una charla introductoria a la filosofía del software libre, linux, etc. Esa siempre es una obligatoria en todos estos eventos.&lt;/li&gt;&lt;li&gt;&lt;b&gt;CANAIMA GNU/Linux&lt;/b&gt; &lt;i&gt;(Rodrigo Rodríguez - GULIP)&lt;/i&gt;: Una muy buena reseña del trabajo que está realizando el equipo de desarrollo de la distribución nacional &lt;a href="http://canaima.softwarelibre.gob.ve/cms"&gt;Canaima GNU/Linux&lt;/a&gt;, en la cual creo que él es tester. Mencionó la necesidad que tiene el proyecto de desarrolladores, e invitó a los asistentes a participar y hacer seguimiento de las actividades de Canaima GNU/Linux. ¿Quién sabe? de repente &lt;b&gt;COTECSO&lt;/b&gt; se anima a participar en el proyecto...&lt;/li&gt;&lt;li&gt;&lt;b&gt;Rails - Desarrollo de aplicaciones web con interfaces para dispositivos móviles&lt;/b&gt; &lt;i&gt;(Ricardo Rodríguez --yo-- COTECSO)&lt;/i&gt;: Más que una ponencia fué una demostración de &lt;a href="http://www.rubyonrails.org/"&gt;Rails&lt;/a&gt; y como utilizarlo para desarrollar aplicaciones web con interfaces para diversos dispositivos, como por ejemplo un &lt;i&gt;iPhone&lt;/i&gt;. Hablaré mas de ella en otro post.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Symfony - La evolución del programador en PHP&lt;/b&gt; &lt;i&gt;(Sonalí Gutierrez - COTECSO)&lt;/i&gt;: Una demostración en vivo, donde Sona contruyó una aplicación web con &lt;a href="http://www.symfony-project.org/"&gt;Symfony&lt;/a&gt;, para llevar el registro de los asistentes al FLISOL Paraguaná 2009.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Administrando contenido web con Joomla&lt;/b&gt; &lt;i&gt;(Natasha Montero - COTECSO)&lt;/i&gt;: Una demostración donde se le dió a conocer a los asistentas las bondades de &lt;a href="http://www.joomla.org/"&gt;Joomla&lt;/a&gt; para crear websites y portales, incluyendo el uso de plugins y módulos como el de encuestas (polls).&lt;/li&gt;&lt;li&gt;&lt;b&gt;Linux en tiempo de crisis&lt;/b&gt; &lt;i&gt;(Jorge Cobis - COTECSO)&lt;/i&gt;: Cobis, con su amplia experiencia (incluyendo la docente), ofreció una interesante y graciosa presentación/demostración de como ahorrar con GNU/Linux y &lt;i&gt;Multiterminales con Xorg&lt;/i&gt;. Como anécdota, Cobis quería llamarla &lt;b&gt;Linux en tiempo de pelazón&lt;/b&gt; pero no lo dejaron!.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Exprésate con Wordpress&lt;/b&gt; &lt;i&gt;(Angel Ferrer - COTECSO)&lt;/i&gt;: Una demostración de como crear un blog con &lt;a href="http://wordpress.org/"&gt;Wordpress&lt;/a&gt; y una invitación a los participantes a que creen su blog, así sea en cualquiera de los servicios de &lt;i&gt;blogging&lt;/i&gt; gratuitos existentes en la internet.&lt;/li&gt;&lt;li&gt;&lt;b&gt;Ilustración profesional con Inkscape&lt;/b&gt; &lt;i&gt;(Alfonso Rodríguez)&lt;/i&gt;: Aunque no fué representando ninguna Organización/Empresa/Grupo, fué invitado por &lt;b&gt;COTECSO&lt;/b&gt; para que compartiera sus conocimientos sobre diseño gráfico e ilustración. Realizó una demostración muy amena sobre &lt;a href="http://www.inkscape.org/"&gt;Inkscape&lt;/a&gt; y sus bondades, todos disfrutamos de sus impresionantes conocimientos en la materia.&lt;/li&gt;&lt;/ul&gt;En conclusión, todos salimos contentos del evento, y en general la pasamos muy bien, compartimos con viejos amigos y nos pusimos al día. Adicionalmente, hablamos con Alfonso para que formara parte de los autores de artículos de nuestro blog y comparta sus conocimientos a través de &lt;a href="http://blog.cotecso.com.ve/"&gt;Tecnología Social&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Saludos!&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
        
    
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/oGR8kPyUtqQ9bh1m4j_A5P90Y04/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oGR8kPyUtqQ9bh1m4j_A5P90Y04/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/oGR8kPyUtqQ9bh1m4j_A5P90Y04/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/oGR8kPyUtqQ9bh1m4j_A5P90Y04/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/tecnologiasocial/~4/0izGrhDmbg4" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.cotecso.com.ve/2009/05/finalizado-flisol-paraguana-2009-con-exito.html</feedburner:origLink></entry>

<entry>
    <title>FLISOL Paraguaná 2009</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tecnologiasocial/~3/biQc3-1zj44/flisol-paraguana-2009.html" />
    <id>tag:blog.cotecso.com.ve,2009://3.4</id>

    <published>2009-05-09T02:49:13Z</published>
    <updated>2009-05-09T03:29:27Z</updated>

    <summary>Mañana 9 de Mayo, FLISOL en Paraguaná, será en el Club Manaure, desde las 9 am hasta las 5 pm. Todos están invitados a asistir.

 Como COTECSO, estaremos participando como patrocinantes/organizadores del evento. Los esperamos!</summary>
    <author>
        <name>Ricardo Rodríguez</name>
        
    </author>
    
        <category term="Eventos" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="clubmanaure" label="Club Manaure" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="cotecso" label="COTECSO" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="flisol" label="FLISOL" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="linux" label="Linux" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="paraguaná" label="Paraguaná" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="rails_jqtouch" label="rails_jqtouch" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="es" xml:base="http://blog.cotecso.com.ve/">
        &lt;span class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;img alt="Imagen Thumbnail para flisol_logo.png" src="http://blog.cotecso.com.ve/assets_c/2009/05/flisol_logo-thumb-240x129-7.png" class="mt-image-left" style="margin: 0pt 20px 20px 0pt; float: left;" width="240" height="129" /&gt;&lt;/span&gt; &lt;div&gt;Mañana &lt;b&gt;9 de Mayo&lt;/b&gt; es el &lt;a href="http://flisol.info/FLISOL2009/Venezuela/PuntoFijo"&gt;FLISOL en Paraguaná&lt;/a&gt;, será en el &lt;b&gt;Club Manaure&lt;/b&gt;, desde las &lt;b&gt;9 am hasta las 5 pm&lt;/b&gt;. Todos están invitados a asistir.&lt;br /&gt;&lt;br /&gt;Nosotros como &lt;a href="http://www.cotecso.com.ve/"&gt;COTECSO&lt;/a&gt; estaremos participando como patrocinantes/organizadores, ayudaremos en las instalaciones de &lt;a href="http://es.wikipedia.org/wiki/Linux"&gt;GNU/Linux&lt;/a&gt;, tendremos algunas demostraciones, incluyendo Linux, desarrollo de aplicaciones web con &lt;a href="http://www.rubyonrails.org/"&gt;Rails&lt;/a&gt;, &lt;a href="http://www.symfony-project.org/"&gt;Symfony&lt;/a&gt;, websites y blogs con &lt;a href="http://www.joomla.org/"&gt;Joomla&lt;/a&gt; y &lt;a href="http://wordpress.org/"&gt;Wordpress&lt;/a&gt; respectivamente (esperemos que de tiempo para todo eso...).&lt;br /&gt;&lt;br /&gt;Hoy estuvimos al final de la tarde ayudando en la organización del salón, junto con GULIP. Algo de notar del salón es que tiene mucho eco (bueno, quizás con todas las personas dentro no se sienta) y hay muy pocos tomacorrientes, así que hay que llevarse todas las extensiones posibles para el día de mañana.&lt;br /&gt;&lt;br /&gt;Yo por mi parte, dictaré una demostración de dearrollo web con Rails y cómo agregar interfaces para dispositivos móviles, en este caso, para un iPhone. Mostraré, con el poco tiempo que tenemos disponible para la presentación, un poco de mi plugin de Rails &lt;a href="http://github.com/rrodrigu3z/rails_jqtouch/tree/master"&gt;rails_jqtouch&lt;/a&gt;, del cual escribiré pronto para hacerlo conocer y agregar algunos ejemplo de uso.&lt;br /&gt;&lt;br /&gt;Bueno, en fin, nos vemos mañana!!!&lt;br /&gt;&lt;/div&gt;
        
    
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/XpTyjAqIyg3cqBDJzLy-eM8a6Uw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XpTyjAqIyg3cqBDJzLy-eM8a6Uw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/XpTyjAqIyg3cqBDJzLy-eM8a6Uw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XpTyjAqIyg3cqBDJzLy-eM8a6Uw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/tecnologiasocial/~4/biQc3-1zj44" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.cotecso.com.ve/2009/05/flisol-paraguana-2009.html</feedburner:origLink></entry>

<entry>
    <title>Bienvenidos a Tecnología Social</title>
    <link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/tecnologiasocial/~3/Orklb0vQH_Y/bienvenidos-a-tecnologia-social.html" />
    <id>tag:blog.cotecso.com.ve,2009://3.3</id>

    <published>2009-05-05T03:17:44Z</published>
    <updated>2009-05-05T14:47:07Z</updated>

    <summary>Bienvenidos al blog Tecnología Social. Este blog es mantenido por el personal de la Asociación Cooperativa Tecnología Social, mejor conocidos como COTECSO. Después de un tiempo bastante largo de conformación de nuestra cooperativa, después de muchos papeleos, inconvenientes y burocracia,...</summary>
    <author>
        <name>Ricardo Rodríguez</name>
        
    </author>
    
        <category term="COTECSO" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="bienvenidos" label="Bienvenidos" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="cotecso" label="COTECSO" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="flisol" label="FLISOL" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="es" xml:base="http://blog.cotecso.com.ve/">
        &lt;div&gt;&lt;span class="mt-enclosure mt-enclosure-image" style="display: inline;"&gt;&lt;a href="http://blog.cotecso.com.ve/imagenes/bienvenidos.jpg"&gt;&lt;img alt="bienvenidos.jpg" src="http://blog.cotecso.com.ve/assets_c/2009/05/bienvenidos-thumb-240x180-2.jpg" class="mt-image-left" style="margin: 0pt 20px 20px 0pt; float: left;" width="240" height="180" /&gt;&lt;/a&gt;&lt;/span&gt;Bienvenidos al blog &lt;b&gt;Tecnología Social&lt;/b&gt;. Este blog es mantenido por el personal de la &lt;i&gt;Asociación Cooperativa Tecnología Social&lt;/i&gt;, mejor conocidos como &lt;a href="http://www.cotecso.com.ve/"&gt;COTECSO&lt;/a&gt;. Después de un tiempo bastante largo de conformación de nuestra cooperativa, después de muchos papeleos, inconvenientes y burocracia, pero siempre con muchas ganas de salir adelante, estamos aquí, organizados, trabajando y comenzando a compartir conocimiento con la comunidad.&lt;br /&gt;&lt;br /&gt;En &lt;b&gt;Tecnología Social&lt;/b&gt;, estaremos escribiendo constantemente (espero), sobre lo que hacemos. Encontrarás referencias a noticias, así como tutoriales, artículos e información valiosa sobre &lt;a href="http://es.wikipedia.org/wiki/Linux"&gt;GNU/Linux&lt;/a&gt;, &lt;a href="http://www.ruby-lang.org/"&gt;Ruby&lt;/a&gt;, &lt;a href="http://rubyonrails.org/"&gt;Rails&lt;/a&gt;, &lt;a href="http://www.php.net/"&gt;PHP&lt;/a&gt;, &lt;a href="http://www.symfony-project.org/"&gt;Symfony&lt;/a&gt;, desarrollo web en general, &lt;a href="http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29"&gt;Patrones de Diseño&lt;/a&gt;, &lt;a href="http://es.wikipedia.org/wiki/AJAX"&gt;AJAX&lt;/a&gt;, Javascript, CSS y pare de contar. &lt;br /&gt;&lt;br /&gt;Esperamos que &lt;b&gt;Tecnología Social&lt;/b&gt; les sea de su mas completo agrado, manténganse en sintonía, que estaremos publicando varios artículos pronto. Ésta es una semana importante para nosotros, es el &lt;a href="http://www.flisol.info/FLISOL2009/Venezuela/PuntoFijo"&gt;FLISOL en Punto Fijo&lt;/a&gt;, donde somos patrocinantes, organizadores, ponentes, etc.&lt;br /&gt;&lt;br /&gt;De más está decirles que, cualquier comentario para mejorar nuestro blog será apreciado.&lt;br /&gt;&lt;br /&gt;Así que, ¡BIENVENIDOS!&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;
        
    
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/b-9uvEZh71A-eKon55i1z_Q3TO4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/b-9uvEZh71A-eKon55i1z_Q3TO4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/b-9uvEZh71A-eKon55i1z_Q3TO4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/b-9uvEZh71A-eKon55i1z_Q3TO4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/tecnologiasocial/~4/Orklb0vQH_Y" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://blog.cotecso.com.ve/2009/05/bienvenidos-a-tecnologia-social.html</feedburner:origLink></entry>

</feed>
