tag:blogger.com,1999:blog-209877792024-03-05T05:00:52.034-03:00Rubí Sobre RielesRuby On Rails es un framework basado en el lenguaje Ruby para desarrollo rápido de aplicaciones webEnrique Placehttp://www.blogger.com/profile/15452998349449419148noreply@blogger.comBlogger40125tag:blogger.com,1999:blog-20987779.post-56237881195958374992008-05-25T12:25:00.003-03:002008-05-25T14:05:13.320-03:00Screencast: Crear un Blog usando NetBeans IDE 6.0<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw4vm01s41Lqv99wLoCZ3Xr-rnSLvHA-oVeUhMa47NqeCyHIM8b9PfeMFhuAvtzlT1RmUzBT-VzoqPOMeDetOKVqIDDHn79JBeqayL7I_WC6dlgXWjpRWcMlNGR2ZpBgpDsHXl/s1600-h/netbeans.gif"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw4vm01s41Lqv99wLoCZ3Xr-rnSLvHA-oVeUhMa47NqeCyHIM8b9PfeMFhuAvtzlT1RmUzBT-VzoqPOMeDetOKVqIDDHn79JBeqayL7I_WC6dlgXWjpRWcMlNGR2ZpBgpDsHXl/s400/netbeans.gif" alt="" id="BLOGGER_PHOTO_ID_5204362107158689986" border="0" /></a><br />Hace mucho tiempo que no uso <span style="font-weight: bold;">Netbeans</span>, principalmente cuando aprendía Java en la universidad (con el tiempo me pasé enteramente a <a href="http://www.easyeclipse.org/site/distributions/index.html">Eclipse para la mayoría de los lenguajes</a>). Hoy, revisando el sitio de <a href="http://www.netbeans.com">netbeans.com</a> me encuentro que está disponible una nueva versión de este IDE, y que la misma además de soportar PHP, ahora soporta Ruby y RubyOnRails ;-)<br /><br />Aquí les dejo <a href="http://www.netbeans.org/kb/60/ruby/weblog-rails-screencast.html">un enlace hacia una lista de screencasts</a> que explican cómo usarlo.Enrique Placehttp://www.blogger.com/profile/15452998349449419148noreply@blogger.com5tag:blogger.com,1999:blog-20987779.post-87751552689257600032008-02-23T01:00:00.000-02:002008-02-23T01:02:12.557-02:00Presentación: "Ruby on Rails"<object type="application/x-shockwave-flash" data="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=9912&doc=ruby-on-rails-8784" width="425" height="348"><param name="movie" value="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=9912&doc=ruby-on-rails-8784" /></object>Enrique Placehttp://www.blogger.com/profile/15452998349449419148noreply@blogger.com2tag:blogger.com,1999:blog-20987779.post-14408854938711937302007-08-08T12:15:00.000-03:002007-08-09T00:12:14.174-03:00Presentación: "Discovering a world of Resources on Rails"<object type="application/x-shockwave-flash" data="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=11261&doc=discovering-a-world-of-resources-on-rails-19896" height="348" width="425"><param name="movie" value="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=11261&doc=discovering-a-world-of-resources-on-rails-19896"></object>Enrique Placehttp://www.blogger.com/profile/15452998349449419148noreply@blogger.com0tag:blogger.com,1999:blog-20987779.post-87626567657468312312007-04-14T10:00:00.000-03:002007-04-14T10:13:48.431-03:00Presentación: "Extracting Rails from Basecamp"<div style="text-align:center;"><object type="application/x-shockwave-flash" data="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=11264&doc=extracting-rails-from-basecamp-12621" width="425" height="348"><param name="movie" value="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=11264&doc=extracting-rails-from-basecamp-12621" /></object></div>Enrique Placehttp://www.blogger.com/profile/15452998349449419148noreply@blogger.com0tag:blogger.com,1999:blog-20987779.post-60386464677716579302007-04-09T09:00:00.001-03:002007-04-09T09:38:20.778-03:00Presentación: "Snakes and Rubies: Pursuing beauty with Ruby on Rails"<object type="application/x-shockwave-flash" data="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=11265&doc=snakes-and-rubies-pursuing-beauty-with-ruby-on-rails-27654" width="425" height="348"><param name="movie" value="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=11265&doc=snakes-and-rubies-pursuing-beauty-with-ruby-on-rails-27654" /></object><br /><br />Otra gran presentación realizada por el mismo creador de RoR.Enrique Placehttp://www.blogger.com/profile/15452998349449419148noreply@blogger.com0tag:blogger.com,1999:blog-20987779.post-5188331891650125962007-04-09T09:00:00.000-03:002007-04-09T09:36:31.360-03:00Presentación: "Workin' on the Rails Road"<object type="application/x-shockwave-flash" data="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=11268&doc=workin-on-the-rails-road-973" width="425" height="348"><param name="movie" value="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=11268&doc=workin-on-the-rails-road-973" /></object>Enrique Placehttp://www.blogger.com/profile/15452998349449419148noreply@blogger.com0tag:blogger.com,1999:blog-20987779.post-24026110328803537652007-03-16T12:10:00.000-03:002007-03-16T12:16:55.938-03:00"¿Quienes trabajan con RoR?" (ordenado por países)<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT7MIpXDtCyxnvr-eJ76um2jDOhX0OBFVgA6MkhC54AIkKSAHBc0fgyOUQFRKD6KxOARpZSplkk3Vh8pP1QT7cxsG8eKLnZCo_fXexXvy6_26raUOxOcpynJR70pW93Oa-dj5H/s1600-h/wwr.gif"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiT7MIpXDtCyxnvr-eJ76um2jDOhX0OBFVgA6MkhC54AIkKSAHBc0fgyOUQFRKD6KxOARpZSplkk3Vh8pP1QT7cxsG8eKLnZCo_fXexXvy6_26raUOxOcpynJR70pW93Oa-dj5H/s400/wwr.gif" alt="" id="BLOGGER_PHOTO_ID_5042540467710584882" border="0" /></a>Interesante <a href="http://www.workingwithrails.com/">proyecto</a> para registrar información de <a href="http://www.workingwithrails.com/browse/country">quienes trabajan en el mundo</a> con RoR y posiblemente, poder contactarnos con ellos. Buena forma de publicitar esta herramienta emergente.<br /><br />Ah!, y también <a href="http://www.workingwithrails.com/browse/country/Uruguay">hay personas de Uruguay</a> ;-)Enrique Placehttp://www.blogger.com/profile/15452998349449419148noreply@blogger.com0tag:blogger.com,1999:blog-20987779.post-2902491998658791202007-01-30T17:00:00.001-02:002007-01-30T17:22:27.475-02:00Presentación: "Ruby Mola (y por qué)" por The CocktailSiguiendo con <a href="http://rubisobrerieles.blogspot.com/2007/01/introduccin-rails-por-thecocktail.html">la misma opinión sobre la presentaciones</a> creadas por la empresa <a href="http://the-cocktail.com">TheCocktail</a>, aquí una nueva que cuenta porqué es tan bueno el lenguaje de programación <a href="http://es.wikipedia.org/wiki/Ruby">Ruby</a>.<br /><br /><center><object type="application/x-shockwave-flash" data="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=17963&doc=ruby-mola-y-por-que-por-the-cocktail-19366" width="425" height="348"><param name="movie" value="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=17963&doc=ruby-mola-y-por-que-por-the-cocktail-19366" /></object></center>Enrique Placehttp://www.blogger.com/profile/15452998349449419148noreply@blogger.com0tag:blogger.com,1999:blog-20987779.post-16509635815729160782007-01-24T11:00:00.000-02:002007-01-24T11:23:14.174-02:00Presentación: "The Top 10 Reasons The Ruby Programming Language Sucks"<center><object type="application/x-shockwave-flash" data="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=11281&doc=the-top-10-reasons-the-ruby-programming-language-sucks-9132" width="425" height="348"><param name="movie" value="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=11281&doc=the-top-10-reasons-the-ruby-programming-language-sucks-9132" /></object><br /><strong>Muy buena presentación sobre el lenguaje Ruby, explicando sus fortalezas y argumentando las diferencias con otros lenguajes</strong></center>Enrique Placehttp://www.blogger.com/profile/15452998349449419148noreply@blogger.com3tag:blogger.com,1999:blog-20987779.post-85343298311143559082007-01-16T23:10:00.000-02:002007-01-16T23:14:51.520-02:00Presentación: "Ruby on Rails" por el propio autorOtra de las famosas presentaciones realizadas por el propio creador de Ruby On Rails:<br /><center><object type="application/x-shockwave-flash" data="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=11263&doc=ruby-on-rails-11263-22601" width="425" height="348"><param name="movie" value="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=11263&doc=ruby-on-rails-11263-22601" /></object></center>Enrique Placehttp://www.blogger.com/profile/15452998349449419148noreply@blogger.com0tag:blogger.com,1999:blog-20987779.post-11395187378758101702007-01-10T14:00:00.000-02:002007-01-10T14:00:52.291-02:00"Introducción a Rails" por TheCocktailLa verdad que por lejos la mejor presentación introductoria sobre Ruby On Rails, como así también nos dan lecciones de cómo diseñar un buen material, sumamente conciso y agradable a la vista. Me saco el sombrero ante la empresa <a href="http://the-cocktail.com">TheCocktail</a>, así se hacen <a href="http://www.the-cocktail.com/ingredientes/category/ponencias/">las presentaciones</a> ;-)<br /><center><object type="application/x-shockwave-flash" data="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=17958&doc=introduccin-a-rails-por-thecocktail-21204" width="425" height="348"><param name="movie" value="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=17958&doc=introduccin-a-rails-por-thecocktail-21204" /></object></center><br />Para seguir el mismo mecanismo que estoy usando para acercarles material de presentaciones que hablan del tema Ruby y Rails es que me tomé el atrevimiento de subir <a href="http://www.the-cocktail.com/docs/2006%20Intro%20RubyOnRails.pdf">esta presentación</a> a <a href="http://www.slideshare.net">Slideshare</a>.Enrique Placehttp://www.blogger.com/profile/15452998349449419148noreply@blogger.com0tag:blogger.com,1999:blog-20987779.post-62026200842977310382007-01-10T13:50:00.000-02:002007-01-10T13:54:13.683-02:00Presentación: "LaCoctelera.com y The Shaker - Conferencia Rails Hispana 2006"<center><br /><object type="application/x-shockwave-flash" data="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=11995&doc=lacocteleracom-y-the-shaker-conferencia-rails-hispana-2006-21660" width="425" height="348"><param name="movie" value="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=11995&doc=lacocteleracom-y-the-shaker-conferencia-rails-hispana-2006-21660" /></object><br /></center>Enrique Placehttp://www.blogger.com/profile/15452998349449419148noreply@blogger.com0tag:blogger.com,1999:blog-20987779.post-42549333241362564972007-01-08T21:05:00.000-02:002007-01-08T21:03:28.301-02:00Presentación: "Secrets behind Ruby on Rails"<center><object type="application/x-shockwave-flash" data="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=11262&doc=secrets-behind-ruby-on-rails-10920" width="425" height="348"><param name="movie" value="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=11262&doc=secrets-behind-ruby-on-rails-10920" /></object></center>Enrique Placehttp://www.blogger.com/profile/15452998349449419148noreply@blogger.com0tag:blogger.com,1999:blog-20987779.post-22001776855535675702007-01-08T21:03:00.000-02:002007-01-08T20:59:10.872-02:00Presentación: "Ruby y las arquitecturas orientadas a servicios (SOA)"<center><object type="application/x-shockwave-flash" data="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=12007&doc=ruby-y-las-arquitecturas-orientadas-a-servicios-1338" width="425" height="348"><param name="movie" value="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=12007&doc=ruby-y-las-arquitecturas-orientadas-a-servicios-1338" /></object></center>Enrique Placehttp://www.blogger.com/profile/15452998349449419148noreply@blogger.com0tag:blogger.com,1999:blog-20987779.post-89895434076175501272007-01-08T21:00:00.000-02:002007-01-08T21:01:11.271-02:00Presentación: "The Ruby Programming Language"<center><object type="application/x-shockwave-flash" data="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=11279&doc=the-ruby-programming-language-or-why-are-you-wasting-brain-power-1545" width="425" height="348"><param name="movie" value="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=11279&doc=the-ruby-programming-language-or-why-are-you-wasting-brain-power-1545" /></object></center>Enrique Placehttp://www.blogger.com/profile/15452998349449419148noreply@blogger.com0tag:blogger.com,1999:blog-20987779.post-78998996564627103672007-01-05T23:42:00.000-02:002007-01-05T23:42:39.760-02:00Presentación: "State of Rails"<center><object type="application/x-shockwave-flash" data="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=11266&doc=state-of-rails-23231" width="425" height="348"><param name="movie" value="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=11266&doc=state-of-rails-23231" /></object></center>Enrique Placehttp://www.blogger.com/profile/15452998349449419148noreply@blogger.com0tag:blogger.com,1999:blog-20987779.post-67439061711628535552007-01-05T23:41:00.000-02:002007-01-05T23:41:34.156-02:00Presentación: "Testing en Ruby on Rails"<center><object type="application/x-shockwave-flash" data="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=12664&doc=testing-ruby-on-rails-spanish-1709" width="425" height="348"><param name="movie" value="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=12664&doc=testing-ruby-on-rails-spanish-1709" /></object></center>Enrique Placehttp://www.blogger.com/profile/15452998349449419148noreply@blogger.com0tag:blogger.com,1999:blog-20987779.post-65919232681572078892007-01-05T23:40:00.000-02:002007-01-05T23:40:49.256-02:00Presentación: "Construyendo tu aplicación (I) - Modelando los datos" (inglés)<center><br /><object type="application/x-shockwave-flash" data="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=12478&doc=datamodel-in-ruby-4063" height="348" width="425"><param name="movie" value="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=12478&doc=datamodel-in-ruby-4063"></object><br /></center>Enrique Placehttp://www.blogger.com/profile/15452998349449419148noreply@blogger.com0tag:blogger.com,1999:blog-20987779.post-52408216801041832532007-01-05T16:40:00.000-02:002007-01-05T16:42:22.749-02:00Presentación: "XML y Rails como herramienta de integración"<center><object type="application/x-shockwave-flash" data="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=13124&doc=xml-on-rails-21635" width="425" height="348"><param name="movie" value="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=13124&doc=xml-on-rails-21635" /></object></center>Enrique Placehttp://www.blogger.com/profile/15452998349449419148noreply@blogger.com0tag:blogger.com,1999:blog-20987779.post-1579470947842695812007-01-05T16:24:00.000-02:002007-01-05T16:31:22.032-02:00Presentación: "Cómo introducir Ruby on Rails en tu empresa" (inglés)<center><object type="application/x-shockwave-flash" data="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=3813&doc=ruby-on-rails-presentation-13823" width="425" height="348"><param name="movie" value="https://s3.amazonaws.com:443/slideshare/ssplayer.swf?id=3813&doc=ruby-on-rails-presentation-13823" /></object></center>Enrique Placehttp://www.blogger.com/profile/15452998349449419148noreply@blogger.com0tag:blogger.com,1999:blog-20987779.post-53690760424979219172007-01-01T11:21:00.001-02:002007-01-01T11:21:30.575-02:00¡Feliz Año 2007!<object width="425" height="350"><param name="movie" value="http://www.youtube.com/v/AebL65GLz44"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/AebL65GLz44" type="application/x-shockwave-flash" wmode="transparent" width="425" height="350"></embed></object><br /><center><span style="font-weight:bold;">Visto desde la ventana de nuestro apartamento (Parque Posadas, Montevideo, Uruguay)</span></center>Enrique Placehttp://www.blogger.com/profile/15452998349449419148noreply@blogger.com0tag:blogger.com,1999:blog-20987779.post-683214512954488522006-12-28T23:11:00.000-02:002006-12-28T23:11:13.711-02:00Blog suspendido hasta nuevo aviso (actualizado)<div style="text-align: center;"><a href="http://www.elfyourself.com/?userid=9bb31322d32849d77fb6b79G06122706"><span style="font-size:180%;"><span style="font-weight: bold;">[¡Feliz Día de los Inocentes!]</span></span></a><br /></div><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ5xiZTChxPbUA4aM_AblO2FUQuiPuMpJu1DBaGcByEhc_X8YdMmHE4CnitMxoiezsOM-DSKN3mh8tTgq2wioNBYX_ycS0JA6DXtBMfIWnlYbyFEFfiEYm7ABQuDNY87_0bQ8b/s1600-h/censura.jpg"><img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 117px; height: 121px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ5xiZTChxPbUA4aM_AblO2FUQuiPuMpJu1DBaGcByEhc_X8YdMmHE4CnitMxoiezsOM-DSKN3mh8tTgq2wioNBYX_ycS0JA6DXtBMfIWnlYbyFEFfiEYm7ABQuDNY87_0bQ8b/s200/censura.jpg" alt="" id="BLOGGER_PHOTO_ID_5013549633143327714" border="0" /></a>Los observadores deben haber detectado que últimamente no estoy respondiendo tan seguido los correos ni los comentarios en este blog. <span style="font-weight: bold;">He recibido en los últimos tiempos amenazas y difamaciones de todo tipo, desde el ámbito laboral como en el personal, tanto físicas como legales, por medios digitales y analógicos.</span><br /><br />Es imposible mantener un blog con opiniones personales sin estar recibiendo constantemente presiones de censura por parte de mentes mediocres pero que tienen poder. En países desarrollados la "comunicación" es viable, y está en nuestros derechos poder opinar y criticar libremente, sean personas, empresas u organizaciones.<br /><br /><span style="font-weight: bold;">Pero Uruguay es el centro del "tercer mundo" y aquí las cosas son distintas. Es un país chico pero un infierno grande. La democracia ni la libertad de expresión existen.</span><br /><br />Es difícil ser transgresor en esas condiciones, pero por seguridad de mi familia he decidido suspender mis blogs hasta nuevo aviso.<br /><br />No me doy por vencido, pero tengo otras prioridades antes.<br /><br />Abrazos.Enrique Placehttp://www.blogger.com/profile/15452998349449419148noreply@blogger.com0tag:blogger.com,1999:blog-20987779.post-1151379089989828112006-06-27T01:23:00.000-03:002006-08-11T21:21:58.576-03:00Artículo publicado: "La Era de los Frameworks: Ruby On Rails"El año pasado me puse en contacto con la editorial <a href="http://www.mpediciones.com">MP Ediciones</a> de <a href="http://es.wikipedia.org/wiki/Argentina">Argentina</a> para estudiar la posibilidad de escribir <a href="http://usershop.mpediciones.com/libros.asp?keywords=desarrollo">un libro con ellos</a>. Entre medio de varias conversaciones sobre el tema, me invitaron a escribir un artículo para su <a href="http://usershop.mpediciones.com/marca.asp?marca=code">Revista .Code</a>. El contenido, por ser la primera vez que se tocaba el tema en la revista, explica como iniciarse en <a href="http://www.rubyonrails.org">Ruby On Rails</a>, partiendo desde la instalación en cualquiera de las dos plataformas más populares: <span style="font-weight: bold;">Windows y GNU/Linux</span>.<br /><br />Este artículo se publicó recientemente en el número <a href="http://usershop.mpediciones.com/ficha.asp?marca=users&numero=code026&codigo=1862"><span style="font-weight: bold;">26 de este mes</span></a>, que calculo estará llegando a <a href="http://es.wikipedia.org/wiki/Uruguay">Uruguay</a> el mes que viene.<br /><br />Como "gaje del oficio", es siempre de esperar que el editor de turno modifique el contenido del artículo del autor, tal vez intentando mejorar la redacción, suprimiendo partes redundantes, o tal vez, disminuyendo el tamaño por una cuestión de espacio en la revista.<br /><br />Generalmente, y este caso no es la excepción, una vez que el trabajo es entregado por el autor al editor, el resto es responsabilidad del último, no comunicando sus acciones al primero (hecho que no comparto mucho).<br /><br />Para que el mismo no se pierda en el tiempo ni la intención original del mismo (entre otras cosas, dejaron solo la parte que habla de Windows), y por que finalmente yo soy el autor ;-), voy a publicar a continuación la <span style="font-style: italic; font-weight: bold;">"versión original y completa"</span> de mi artículo.<br /><br />Parafraseando a la película animada <span style="font-style: italic;">"</span><a style="font-style: italic;" href="http://www.iceagemovie.com/">La Era del Hielo</a><span style="font-style: italic;">"</span>, lo titulé de la siguiente manera ;-)<br /><br />------------------------------------------------<br /><p style="font-weight: bold;" class="Volanta">DESARROLLO WEB AGIL</p> <h1><st1:personname productid="La Era" st="on">La Era</st1:personname> de los Frameworks: Ruby On Rails</h1> <p style="font-weight: bold;" class="Copete">Ruby on Rails es un framework de desarrollo web diseñado para aumentar extremadamente la productividad y que está empezando a causar furor entre los desarrolladores expertos.</p> <p class="MsoNormal"><o:p> </o:p></p> <h2>Introducción</h2> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal">Aproximadamente desde el año ‘97 que me desempeño como consultor en proyectos relacionados con <a href="http://es.wikipedia.org/wiki/Software_Libre"><i style="">Software Libre</i></a>, y con el correr de los años, la temática de los mismos se ha orientado progresivamente al ambiente web. Desde mis inicios me he decantado por <a href="http://es.wikipedia.org/wiki/PHP"><i style="">PHP</i></a>, pues era (en mi experiencia) la mejor alternativa disponible entre los lenguajes de desarrollo web.</p><p class="MsoNormal"> Descarté opciones propietarias como <a href="http://es.wikipedia.org/wiki/Active_Server_Pages"><i style="">ASP</i></a>, y otras <a href="http://es.wikipedia.org/wiki/Open_source"><i style="">Open Source</i></a> como <a href="http://es.wikipedia.org/wiki/Perl"><i style="">Perl</i></a>, principalmente porque <i style="">PHP</i> me ofrecía <b style="">la mayor libertad al más bajo costo</b>.</p> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal">Hasta el día de hoy sigo pensando lo mismo; pero algo ha cambiado. Cada vez disponemos de menos tiempo para concretar nuestros proyectos, necesitamos dar más valor agregado a nuestros desarrollos y debemos adaptarnos más rápido a los cambios: <b style="">lo que sucede es que nos están obligando a ser cada vez más productivos.<o:p></o:p></b></p> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal">Si hace algunos años que trabajas en ambientes web y no tienes la filosofía de reaprovechar los avances de tu desarrollo de software <span style=""> </span>en beneficio de los proyectos futuros, estarás siendo parte de la famosa “fábrica de ruedas”, es decir, estarás <b style="">reinventando la rueda de forma constante</b> sin aprovechar la experiencia adquirida con el pasar de los años.</p> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal">De esta forma, será imposible ser “extremadamente productivo”.</p> <p class="MsoNormal"><o:p> </o:p></p> <h2><span style="" lang="EN-GB">¿Qué es Ruby On Rails?<o:p></o:p></span></h2> <p class="MsoNormal"><span style="" lang="EN-GB"><o:p> </o:p></span></p> <p class="MsoNormal">Como no debemos tener miedo a lo nuevo, a los cambios, y debemos estar informados y lograr hacer juicios de valor apoyados en experiencias reales y no en meras suposiciones, es que me animé experimentar con otras alternativas.</p> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal"><i style="">“Ruby On Rails”</i>, muchas veces abreviado como <i style="">RoR</i>, significa en castellano <i style="">“Rubí Sobre Rieles”</i><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/717/822/1600/imagen1.png"><img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://photos1.blogger.com/blogger/717/822/320/imagen1.png" alt="" border="0" /></a> y por definición es un <b style="">Framework Open Source para Desarrollo Rápido de Aplicaciones Web</b>. Si somos estrictos con la definición, el nombre está compuesto por dos palabras clave: <b style=""><i style="">Ruby</i></b> por un lado y <b style=""><i style="">Rails</i></b> por otro. En realidad el framework se llama simplemente <i style="">Rails</i> y fue desarrollado enteramente con el lenguaje de programación <i style="">Ruby</i>. A pesar de que usas <i style="">Rails</i>, en algún momento necesitarás escribir código en el lenguaje <i style="">Ruby</i>. Por todas estas razones es que el nombre combina ambas cosas: <b style="">Ruby On Rails</b></p><p class="MsoNormal"> </p><p class="MsoNormal">Está basado fuertemente en una estructura con persistencia de datos, pero lo que no nos debe preocupar es que las grandes bases de datos del <i style="">Software Libre</i> se encuentran disponibles: por ejemplo MySQL y PostgreSQL.</p> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal">El creador, <b style="">David Heinemeier Hansson (DHH)</b>, desarrolló este framework para cubrir las<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/717/822/1600/imagen2.jpg"><img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://photos1.blogger.com/blogger/717/822/320/imagen2.jpg" alt="" border="0" /></a> necesidades de desarrollo de un proyecto web. Este programador danés ha sido galardonado por haber desarrollado este framework con el título <b style="">”Best Hacker <st1:metricconverter productid="2005”" st="on">2005”</st1:metricconverter> en el evento O´Reilly Open Source Awards, organizado por Google</b>.</p><p class="MsoNormal"><strong><span style="font-weight: normal;">Según ha expresado en entrevistas, el origen se debe a que</span> </strong>tenía dos ámbitos de experiencia cuando comenzó con <i style="">RoR</i>: <b style=""><i style="">PHP</i> (rápido y sucio)</b> y <b style=""><i style="">Java/J2EE</i> (lento y limpio)</b>. El objetivo de ROR era conseguir unir lo mejor de ambos (rápido y limpio).</p> <p class="MsoNormal"><o:p> </o:p></p> <h2><span style="" lang="EN-GB">El lenguaje de programación Ruby</span><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/717/822/1600/imagen3.jpg"><img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://photos1.blogger.com/blogger/717/822/320/imagen3.jpg" alt="" border="0" /></a></h2> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal">Vale decir que llegamos indirectamente al lenguaje. A pesar que la mayoría de las distribuciones <i style="">GNU/Linux</i> incluyen (entre muchos lenguajes) a <i style="">Ruby</i>, este es un lenguaje que hasta hace poco tiempo no era extremadamente popular si no fuera por el éxito del framework. El autor del lenguaje <i style="">Ruby</i> se llama <b style=""><a href="http://fer-martin.blogspot.com/2005/11/entrevista-matz.html">Yukihiro Matsumoto</a>, </b>de origen Japonés, y es más conocido por el seudónimo de <b style="">Matz</b>. </p>Entre sus cualidades se encuentra que es totalmente <i style="">Orientado a Objetos</i> (más que otros lenguajes muy populares), de alto nivel, y sobre todo, <i style="">“divertido de programar”</i> (según las palabras de su autor). <p class="MsoNormal"><o:p> </o:p></p> <h2>Concepto base I: el patrón MVC</h2> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal">Los <i style="">Patrones de Diseño</i> evitan que reinventemos la rueda para resolver problemas ampliamente conocidos y resueltos innumerables veces, y a su vez, hasta nos sirven de modelo para hacer soluciones "reutilizables" y "extensibles" porque aplican las mejores prácticas del <i style="">Diseño Orientado a Objetos</i>.</p> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal">Este framework se basa en un patrón de diseño muy conocido, el <b style=""><i style="">“Modelo, Vista, Controlador” (MVC)</i></b>. <span style=""> </span>La idea del patrón es separar el problema en tres capas: <b style="">el modelo</b>, que representa la lógica del sistema, <b style="">la vista</b>, que se encarga de mostrar la información del modelo, y <b style="">el controlador</b>, encargado de tomar las acciones del usuario del sistema e interactuar con el modelo y con la vista.<br /><br /></p><p class="MsoNormal"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/717/822/1600/imagen4.0.png"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/717/822/320/imagen4.0.png" alt="" border="0" /></a></p><p class="MsoNormal"> </p><p class="Volanta" style="text-align: center;" align="center"><span style="font-size:100%;"><b style="">Diagrama que describe el funcionamiento de RoR</b></span><b style=""><span lang="ES-AR" style="font-size:12;"><o:p></o:p></span></b></p> <p class="MsoNormal">Nuestro sistema quedará estructurado en <b style="">tres capas independientes que tienen responsabilidades distintas y bien diferenciadas</b>, logrando que nuestro sistema sea más fácil de desarrollar y mantener.</p> <p class="MsoNormal"><o:p> </o:p></p> <h2>Concepto base II: el patrón <i style="">ActiveRecord</i></h2> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal">En <i style="">Ruby On Rails</i> el Modelo del patrón <i style="">MVC</i> se implementa a través del mapeo del “objeto” con su correspondiente “tabla” en la base de datos.<br /></p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/717/822/1600/imagen5.0.gif"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/717/822/320/imagen5.0.gif" alt="" border="0" /></a><br /><p class="Volanta" style="text-align: center;" align="center"><span style="font-size:100%;"><b style="">Representación UML del patrón de diseño ActiveRecord</b></span><b style=""><span lang="ES-AR" style="font-size:12;"><o:p></o:p></span></b></p> <p class="MsoNormal"><span style="" lang="ES-AR"><o:p> </o:p></span></p> <p class="MsoNormal">Este patrón resuelve el eterno problema de la comunicación entre modelos de datos distintos, entre el <i style="">Relacional</i> y el <i style="">Orientado a Objetos</i>.<br /></p><p class="MsoNormal"> </p><h2>¿Cómo se instala?</h2> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal">Existe mucha información en Internet, pero a veces peca de inexacta o se comete pequeños errores. Si no tenemos experiencia en <i style="">RoR</i>, es frustrante iniciarse con tanta dificultad extra.</p> <p class="MsoNormal"><o:p> </o:p></p> <h3>Instalación en Windows (3 pasos)</h3> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal">El primer y mejor tutorial que existe hasta el momento para hacer una instalación es de O'Reilly: <a href="http://www.onlamp.com/pub/a/onlamp/2005/01/20/rails.html">Rolling with Ruby on Rails</a> ("Rodando con Rubí sobre Rieles"), pero solo contempla al sistema operativo <i style="">Windows. </i>Por esa razón vamos a hacer una explicación que abarque a ambas instalaciones, que a pesar de que son muy parecidas, tienen pequeños detalles a tener en cuenta.</p> <p class="MsoNormal"><o:p> </o:p></p> <h3>Paso 1: <span style=""> </span>Instalar Ruby</h3> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal">Primer paso, bajar el <a href="http://rubyinstaller.rubyforge.org/">instalador de Ruby desde RubyForge.org</a>.<b style=""><o:p></o:p></b></p> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal">El instalador ya incluye el <i style=""><a href="http://rubygems.rubyforge.org/">Gems</a></i>, la aplicación que permite instalar el framework <i style="">Rails</i>, y que usaremos en el paso siguiente.</p><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/717/822/1600/imagen6.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/717/822/320/imagen6.jpg" alt="" border="0" /></a><br /><p class="Volanta" style="text-align: center;" align="center"><span style="font-size:100%;"><b style="">Pantalla de instalación de Rubyinstaller con las aplicaciones que incluye por defecto</b></span><b style=""><span lang="ES-AR" style="font-size:12;"><o:p></o:p></span></b></p> <h3>Paso 2: Instalar Rails</h3> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal">Si ya tienes instalado <i style="">Gems</i>, solo debes abrir una ventana que permita escribir comandos desde la línea. Presiona desde la barra de tareas: </p> <p class="MsoNormal"><o:p> </o:p></p> <p class="Codigo"><code><span style="" lang="EN-US">Botón de Inicio-> Ejecutar -> y escribe “cmd”<o:p></o:p></span></code></p> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal">Al presionar <i style="">ENTER</i> deberá ejecutar una consola DOS que nos permitirá digitar los comandos del instalador del framework. Deberemos posicionarnos primero en el directorio donde instalamos Ruby (realizado en el <b style="">Paso 1</b>):</p> <p class="MsoNormal"><o:p> </o:p></p> <p class="Codigo"><span style="" lang="EN-GB">cd c:\ruby\bin<o:p></o:p></span></p> <p class="Codigo"><span style="" lang="EN-GB"><o:p> </o:p></span></p> <p class="Codigo"><code><span style="" lang="EN-US">C:\ruby\bin>gem install rails --remote --include-dependencies<o:p></o:p></span></code></p> <p class="Codigo"><code><span style="" lang="EN-US"><o:p> </o:p></span></code></p> <p class="Codigo"><code><span style="" lang="EN-US">Attempting remote installation of 'rails'<o:p></o:p></span></code></p> <p class="Codigo"><code><span style="" lang="EN-US">Updating Gem source index for: http://gems.rubyforge.org<o:p></o:p></span></code></p> <p class="Codigo"><code><span style="" lang="EN-US">Successfully installed rails-1.0.0<o:p></o:p></span></code></p> <p class="Codigo"><code><span style="" lang="EN-US">Successfully installed activesupport-1.2.5<o:p></o:p></span></code></p> <p class="Codigo"><code><span style="" lang="EN-US">Successfully installed activerecord-1.13.2<o:p></o:p></span></code></p> <p class="Codigo"><code><span style="" lang="EN-US">Successfully installed actionpack-1.11.2<o:p></o:p></span></code></p> <p class="Codigo"><code><span style="" lang="EN-US">Successfully installed actionmailer-1.1.5<o:p></o:p></span></code></p> <p class="Codigo"><code><span style="" lang="EN-US">Successfully installed actionwebservice-1.0.0<o:p></o:p></span></code></p> <p class="Codigo"><code><span style="" lang="EN-US">Installing RDoc documentation for activesupport-1.2.5...<o:p></o:p></span></code></p> <p class="Codigo"><code><span style="" lang="EN-US">Installing RDoc documentation for activerecord-1.13.2...<o:p></o:p></span></code></p> <p class="Codigo"><code>[Mensaje resumido]</code></p> <p class="MsoNormal"><code><span style="font-size:10;"><o:p> </o:p></span></code></p> <p class="MsoNormal">Si no se agrega el último parámetro ("incluir dependencias") por cada software que falte<span style=""> </span>va a preguntar si quieres instalarlo, lo que sucede casi en seis oportunidades.<code><span style="font-size:10;"><o:p></o:p></span></code></p> <p class="MsoNormal"><code><span style="font-size:10;"><o:p> </o:p></span></code></p> <h3><span style="" lang="EN-GB">Paso 3: Instalar MySQL<o:p></o:p></span></h3> <p class="MsoNormal"><code><span style="font-size:10;"><o:p> </o:p></span></code></p> <p class="MsoNormal">Al principio, no debemos complicarnos. Si lo que queremos es probar el entorno de desarrollo, cuando el instalador de MySQL nos pregunte por el usuario administrador digitaremos <i style="">“root”</i> y su clave <i style="">“root”</i>. Más adelante podremos asegurar todas estas configuraciones.</p> <p class="MsoNormal"><code><span style="font-size:10;"><o:p> </o:p></span></code></p> <p class="MsoNormal">Windows Essentials (x86) 4.1</p> <p class="MsoNormal"><a href="http://dev.mysql.com/downloads/mysql/4.1.html">http://dev.mysql.com/downloads/mysql/4.1.html</a></p> <p class="MsoNormal"><o:p> </o:p></p> <h2>Instalación en GNU/Linux (3 pasos)</h2> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal">En mi caso particular uso <i style="">GNU/Linux</i> y no <i style="">Windows</i> para desarrollar. La distribución que estoy usando actualmente es <i style="">Fedora Core 4</i>. Las distribuciones no son todas iguales, y siempre tienen sus peculiaridades. De todas formas, no debiera existir mayores problemas con las indicaciones que detallaremos a continuación. Si no cuentas con algunas de las herramientas que menciono y que simplifican la instalación, siempre está la alternativa de bajar los fuentes e instalarlos a mano.<br /><br /><span class="Ttulo3Car"><span style="font-weight: bold;">Paso 1: Instalar Ruby</span><br /></span><br />Si la instalación de la distribución no incluyó por defecto a <i style="">Ruby</i>, lo puedes hacer desde los CD's. También puedes usar un instalador en línea, para bajar las últimas versiones de los paquetes desde Internet.<br /><!--[if !supportLineBreakNewLine]--><br /><!--[endif]--></p> <p class="MsoNormal">El más famoso es el apt-get de Debian. En el caso de <i style="">Fedora GNU/Linux</i> disponemos de <i style=""><a href="http://linux.duke.edu/projects/yum/">Yum</a>.<o:p></o:p></i></p> <p class="MsoNormal"><br />Con <i style="">Yum</i>, todo es más sencillo:</p> <p class="MsoNormal"><o:p> </o:p></p> <p class="Codigo"><code>yum install ruby</code></p> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal">Si la instalación concluye sin errores, ya estás casi pronto para empezar a trabajar. </p> <p class="MsoNormal"><br /><span class="Ttulo3Car"><span style="font-weight: bold;">Paso 2: Instalar “Gem”, el “Instalador de Rails”</span><br /></span><br />Rails cuenta con un propio instalador en línea que se llama <i style="">Gem</i> (vendría a ser el <i style="">Yum</i> de <i style="">Fedora</i> <i style="">GNU/Linux</i>, pero solo sirve para instalar <i style="">Rails</i>). Para poder instalar el framework hay que bajar primero el <i style="">Gem</i> y luego correrlo para que inicie la instalación. La dirección oficial es: <b style=""><a href="http://docs.rubygems.org/shelf">http://docs.rubygems.org/shelf</a> </b>y en la sección de <i style="">download</i> deberás bajar la última versión.<br /><br />Cuando dispongamos del archivo comprimido de extensión <i style="">tgz</i>, lo descomprimes en tu directorio preferido, o en el directorio estándar para estas tareas: <b>/opt</b>.</p> <p class="MsoNormal"><o:p> </o:p></p> <p class="Codigo"><code>tar zxvf rubygems-0.8.11.tgz</code></p> <p class="MsoNormal"><br />Y para instalarlo, luego de entrar en el directorio generado, hay que ejecutar:</p> <p class="MsoNormal"><o:p> </o:p></p> <p class="Codigo"><code>cd rubygems-0.8.11</code><br /><code>ruby setup.rb</code></p> <p class="MsoNormal"><br />En todas la pruebas realizadas, la instalación no dio errores.<br /><br /><span class="Ttulo3Car"><span style="font-weight: bold;">Paso 3: Instalar Rails</span><br /></span><br />Ya estamos prontos para instalar <i style="">Rails</i> usando nuestro instalador <i style="">Gem</i>.<br />La sintaxis deberá ser:</p> <p class="MsoNormal"><code><span style="font-size:10;"><o:p> </o:p></span></code></p> <p class="Codigo"><code><span style="" lang="EN-US">gem install rails --remote --include-dependencies</span></code><span style="" lang="EN-US"><o:p></o:p></span></p> <p class="MsoNormal" style="margin-bottom: 12pt;"><br />Si no agregas el último parámetro ("incluir dependencias") por cada software que falte te va a preguntar si quieres instalarlo, lo que sucede casi en seis oportunidades.<br /><br /><span style="" lang="EN-GB">En este caso, sí surgieron problemas.<o:p></o:p></span></p> <p class="Codigo"><code><span style="" lang="EN-US">gem install rails --remote --include-dependencies</span></code><span style="" lang="EN-US"><br /><br /><code>Attempting remote installation of 'rails'</code><br /><code>Successfully installed rails-1.0.0</code><br /><code>Successfully installed activesupport-1.2.5</code><br /><code>Successfully installed activerecord-1.13.2</code><br /><code><b>/usr/lib/site_ruby/1.8/rubygems/custom_require.rb:21:in `require__': no such file to load -- rdoc/rdoc (LoadError)</b></code><o:p></o:p></span></p> <p class="MsoNormal" style="margin-bottom: 12pt;"><span style="" lang="EN-GB"><br /></span>Esto significa que el software <i style="">rdoc</i> no se encuentra instalado en el sistema. Para solucionarlo simplemente ejecuté el <i style="">Yum</i>:</p> <p class="Codigo"><code><span style="" lang="EN-US">yum install rdoc</span></code><span style="" lang="EN-US"><br /><br /><code>Installing:</code><br /><code>rdoc i386 1.8.4-1.fc4 updates-released 119 k</code><br /><code>Installing for dependencies:</code><br /><code>irb i386 1.8.4-1.fc4 updates-released 62 k</code><br /><br /><code>[Mensaje resumido]</code><o:p></o:p></span></p> <p class="MsoNormal" style="margin-bottom: 12pt;"><o:p> </o:p></p> <p class="MsoNormal" style="margin-bottom: 12pt;">Y de paso, me avisa que hay una "dependencia a cumplir" que es instalar el <i style="">irb</i>, lo cual acepté.<br /><br />Volví a correr la instalación del <i style="">Rails</i> y esta continuó con éxito:</p> <p class="Codigo"><code><span style="" lang="EN-US">gem install rails --remote --include-dependencies</span></code><span style="" lang="EN-US"><br /><br /><code>Attempting remote installation of 'rails'</code><br /><code>Successfully installed rails-1.0.0</code><o:p></o:p></span></p> <p class="MsoNormal" style="margin-bottom: 12pt;"><br /><span class="Ttulo2Car"><span style="font-size:16;"><span style="font-weight: bold;font-size:100%;" >Probar la instalación de RoR (Windows/Linux)</span><br /></span></span><br />En primera instancia, debemos tener disponible el comando "rails" desde nuestra consola. Para probarlo, nos posicionamos en un directorio que alojaremos nuestros proyectos web basados en RoR. En el caso de <i style="">GNU/Linux</i>, lo estándar es usar subdirectorios a partir del “directorio base” llamado <b style="">/var/www. </b>Si usamos Windows, podremos crear la misma estructura a partir del “directorio base” llamado <b style="">c:\rails</b>.</p> <h3>Nuestro primer proyecto</h3> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal" style="margin-bottom: 12pt;">Deberemos posicionarlos en el “directorio base” correspondiente a nuestro sistema, ejecutar el comando "rails" y el nombre del proyecto que deseamos crear. La idea es que el framework cree un subdirectorio con el nombre que le ingresamos, y luego él armará toda una serie de subdirectorios y archivos que corresponderán a la estructura inicial para poder comenzar a trabajar en nuestro proyecto <i style="">RoR</i>:</p> <p class="Codigo"><code>rails miproyecto</code></p> <p class="MsoNormal"><br />Esto producirá la siguiente salida por pantalla:</p> <p class="MsoNormal"><o:p> </o:p></p> <p class="Codigo"><code><span style="" lang="EN-US">create</span></code><span style="" lang="EN-US"><br /><code>create app/controllers</code><br /><code>create app/helpers</code><br /><code>create app/models</code><br /><code>create app/views/layouts</code><br /><code>create config/environments</code><br /><code>create components</code><br /><code>create db</code><br /><code>create doc</code><br /><code>create lib</code><br /><code>create lib/tasks</code><br /><code>create log</code><br /><code>create public/images</code><br /><code>[Mensaje resumido]</code><o:p></o:p></span></p> <p class="MsoNormal" style="margin-bottom: 12pt;">Entramos en el directorio de nuestra aplicación y ejecutamos un mini servidor web para probar que nuestro entorno <i style="">RoR</i> esté respondiendo:</p> <p class="Codigo"><code>cd miproyecto</code><br />ruby <code>script/server</code></p> <p class="MsoNormal" style="margin-bottom: 12pt;"><br />El último comando ejecuta el servidor, y la salida en consola es la siguiente:</p> <p class="MsoNormal"><code><span style="" lang="EN-US">=> Booting WEBrick...</span></code><span style="" lang="EN-US"><br /><code><b>=> Rails application started on http://0.0.0.0:3000</b></code><br /><code>=> Ctrl-C to shutdown server; call with --help for options</code><br /><code>[2006-01-23 16:45:54] INFO WEBrick 1.3.1</code><br /><code>[2006-01-23 16:45:54] INFO ruby 1.8.4 (2005-12-24) [i386-linux]</code><br /><code><b style="">[2006-01-23 16:45:54] INFO WEBrick::HTTPServer#start: pid=7627 port=3000</b></code><o:p></o:p></span><br /><br />Nuestro servidor atenderá el <b>puerto 3000</b>. Si usamos nuestro navegador y apuntamos a la dirección <b>http://localhost:3000</b> (<i style="">localhost</i> representa nuestro "servidor local"), nos deberá responder un mensaje de bienvenida:<br /><!--[if !supportLineBreakNewLine]--></p><p class="MsoNormal"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/717/822/1600/imagen7.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/717/822/320/imagen7.jpg" alt="" border="0" /></a></p><br /><p class="MsoNormal"> </p><p class="Volanta" style="text-align: center;" align="center"><span style="font-size:100%;"><b style="">Pantalla de bienvenida que nos devuelve el servidor WEBrick, confirmando que todo fue instalado y configurado correctamente.</b></span><b style=""><span lang="ES-AR" style="font-size:12;"><o:p></o:p></span></b></p> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal">¡Felicitaciones! ¡El primer paso está dado!</p> <p class="MsoNormal"><o:p> </o:p></p> <h3>Nuestra primer aplicación útil</h3> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal">Para poder hacer una prueba del nuestro entorno “veloz” de desarrollo, que mejor que hacer “esa” actividad que se repite una y otra vez en nuestros sistemas, y que el framework ya tiene sumamente resuelta: <b style="">nuestro primer ABM (Altas, Bajas y Modificaciones)</b>.</p> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal">Debemos crear nuestra primera base de datos y nuestra primera tabla. Ejecutaremos nuestro cliente de turno para trabajar con MySQL (existen muchos, pero puedes bajar los oficiales desde <span style="" lang="EN-GB"><a href="http://www.mysql.com/products/tools/"><span style="" lang="ES">http://www.mysql.com/products/tools/</span></a></span>), y crearemos la base de datos “miproyecto” y la tabla “cliente” con la siguiente estructura:</p> <p class="MsoNormal"><o:p> </o:p></p> <p class="Codigo"><span style="" lang="EN-GB">CREATE TABLE<span style=""> </span>`miproyecto`.`clientes` (<o:p></o:p></span></p> <p class="Codigo"><span style="" lang="EN-GB"><span style=""> </span>`id` int(3) NOT NULL auto_increment,<o:p></o:p></span></p> <p class="Codigo"><span style="" lang="EN-GB"><span style=""> </span></span>`nombre` varchar(45) default NULL,</p> <p class="Codigo"><span style=""> </span>`telefono` varchar(45) default NULL,</p> <p class="Codigo"><span style=""> </span><span style="" lang="EN-GB">PRIMARY KEY<span style=""> </span>(`id`)<o:p></o:p></span></p> <p class="Codigo"><span style="" lang="EN-GB">) ENGINE=InnoDB DEFAULT CHARSET=latin1;<o:p></o:p></span></p> <p class="MsoNormal"><span style="" lang="EN-GB"><o:p> </o:p></span></p> <p class="MsoNormal">Y deberemos definir cual es nuestra configuración de nuestra base de datos editando el siguiente archivo: </p> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal"><b style=""><span style="" lang="EN-GB">En Windows:</span></b><span style="" lang="EN-GB"> <span style=""> </span>C:\rails\miproyecto\config\database.yml<o:p></o:p></span></p> <p class="MsoNormal"><b style="">En GNU/Linux:</b> <span style=""> </span>/var/www/miproyecto/config/database.yml<span style=""> </span></p> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal"><b style="">Nota:</b> en GNU/Linux la única diferencia con los directorios de Windows es el sentido de la barra (“\” por “/”) y la ausencia de la representación de unidades a través de letras.</p> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal">A continuación, deberemos modificar el nombre de la base, agregar la clave del usuario y comentar la línea “socket”:</p> <p class="MsoNormal"><o:p> </o:p></p> <p class="Codigo"><span style="" lang="EN-GB">development:<o:p></o:p></span></p> <p class="Codigo"><span style="" lang="EN-GB"><span style=""> </span>adapter: mysql<o:p></o:p></span></p> <p class="Codigo"><span style="" lang="EN-GB"><span style=""> </span>database: miproyecto<o:p></o:p></span></p> <p class="Codigo"><span style="" lang="EN-GB"><span style=""> </span>username: root<o:p></o:p></span></p> <p class="Codigo"><span style="" lang="EN-GB"><span style=""> </span><span style=""> </span>password: root<o:p></o:p></span></p> <p class="Codigo"><span style="" lang="EN-GB">#socket: /path/to/your/mysql.sock<o:p></o:p></span></p> <p class="MsoNormal"><span style="" lang="EN-GB"><o:p> </o:p></span></p> <h3>Si queremos ir rápido y seguro, podemos usar los “andamios” (scaffolding)</h3> <p class="MsoNormal"><b style=""><o:p> </o:p></b></p> <p class="MsoNormal"><i style="">Scaffold</i> es un veloz generador de <b style="">CRUD: Create, Retrive, Update y Delete</b>, lo que significaría en castellano: un <b style="">ABM</b>.</p> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal">Posicionados en el directorio base de nuestro proyecto ejecutaremos el comando para generar el modelo:</p> <p class="MsoNormal"><o:p> </o:p></p> <p class="Codigo"><span style="" lang="EN-GB">C:\rails>cd miproyecto<o:p></o:p></span></p> <p class="Codigo"><span style="" lang="EN-GB"><o:p> </o:p></span></p> <p class="Codigo"><span style="" lang="EN-GB">C:\rails\miproyecto>ruby script\generate scaffold Cliente<o:p></o:p></span></p> <p class="Codigo"><span style="" lang="EN-GB"><span style=""> </span>exists<span style=""> </span>app/controllers/<o:p></o:p></span></p> <p class="Codigo"><span style="" lang="EN-GB"><span style=""> </span>exists<span style=""> </span>app/helpers/<o:p></o:p></span></p> <p class="Codigo"><span style="" lang="EN-GB"><span style=""> </span>exists<span style=""> </span>app/views/clientes<o:p></o:p></span></p> <p class="Codigo"><span style="" lang="EN-GB"><span style=""> </span>exists<span style=""> </span>test/functional/<o:p></o:p></span></p> <p class="Codigo"><span style="" lang="EN-GB"><span style=""> </span>dependency<span style=""> </span>model<o:p></o:p></span></p> <p class="Codigo"><span style="" lang="EN-GB"><span style=""> </span>exists<span style=""> </span>app/models/<o:p></o:p></span></p> <p class="Codigo"><span style="" lang="EN-GB"><span style=""> </span>exists<span style=""> </span>test/unit/<o:p></o:p></span></p> <p class="Codigo"><span style="" lang="EN-GB"><span style=""> </span>exists<span style=""> </span>test/fixtures/<o:p></o:p></span></p> <p class="Codigo"><span style="" lang="EN-GB"><span style=""> </span><span style=""> </span>create <span style=""> </span>app/models/cliente.rb<o:p></o:p></span></p> <p class="Codigo"><span style="" lang="EN-GB"><span style=""> </span><span style=""> </span>create<span style=""> </span>test/unit/cliente_test.rb<o:p></o:p></span></p> <p class="Codigo"><span style="" lang="EN-GB"><span style=""> </span><span style=""> </span>create<span style=""> </span>test/fixtures/clientes.yml<o:p></o:p></span></p> <p class="Codigo"><span style="" lang="EN-GB"><span style=""> </span><span style=""> </span>create<span style=""> </span>app/views/clientes/_form.rhtml<o:p></o:p></span></p> <p class="Codigo"><code><span style="" lang="EN-US">[Mensaje resumido]</span></code><span style="" lang="EN-US"><o:p></o:p></span></p> <p class="MsoNormal"><span style="" lang="EN-GB"><o:p> </o:p></span></p> <p class="MsoNormal"><b style="">Nota:</b> si al efectuar los cambios en el código estos no se ven reflejados en el servidor web <i style="">WEBrick </i>(a pesar de restaurar el navegador), deberás reiniciar el servidor web para ver los cambios.</p> <p class="MsoNormal"><o:p> </o:p></p> <p class="Codigo"><span style="" lang="EN-GB"><a href="http://127.0.0.1:3000/clientes"><b style="">http://127.0.0.1:3000/clientes</b></a><o:p></o:p></span></p> <p class="MsoNormal"><b style=""><span style="" lang="EN-GB"><o:p> </o:p></span></b></p> <p class="MsoNormal"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/717/822/1600/imagen9.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/717/822/320/imagen9.jpg" alt="" border="0" /></a></p><p class="MsoNormal"> </p><p class="Volanta" style="text-align: center;" align="center"><b style=""><span style="font-size:12;"><span style="font-size:100%;">Pantalla principal de nuestro CRUD desarrollada a través de scaffolding</span> <o:p></o:p></span></b></p> <p class="MsoNormal"><b style=""><span style="" lang="ES-AR"><o:p> </o:p></span></b></p> <p class="MsoNormal">Si presionamos sobre “New Cliente” nos habilitará a crear nuevos clientes.</p> <p class="MsoNormal">Luego de ingresar el primero, nos mostrará la lista de los ingresados en el sistema y 3 nuevas operaciones que se aplican sobre nuestro ítem: <b style="">Show, Edit, Destroy (Mostrar, Editar, Destruir)</b>. </p> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal">Está demás decir que absolutamente toda la información que vemos, y su comportamiento, es alterable a nuestras necesidades.</p> <a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/717/822/1600/imagen10.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/717/822/320/imagen10.jpg" alt="" border="0" /></a><br /><p class="Volanta" style="text-align: center;" align="center"><b style=""><span style="font-size:12;"><span style="font-size:100%;">Opción “New Cliente” nos permite dar nuestra primer Alta</span><o:p></o:p></span></b></p><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/717/822/1600/imagen11.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/717/822/320/imagen11.jpg" alt="" border="0" /></a><span style="font-size:100%;"><b style="">Luego de ingresar nuestro primer cliente, tener acceso a las opciones de modificar o dar de baja</b></span><p class="Volanta" style="text-align: center;" align="center"><br /></p><p class="Volanta" style="text-align: center;" align="center"><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/717/822/1600/imagen12.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/717/822/320/imagen12.jpg" alt="" border="0" /></a><br /><b style=""><span style="font-size:12;"><o:p></o:p></span></b></p><p class="MsoNormal"><!--[endif]--></p> <p class="Volanta" style="text-align: center;" align="center"><span style="font-size:100%;"><b style="">Finalmente, como se vería la página principal de nuestro ABM de Clientes luego de ingresar varios registros<o:p></o:p></b></span></p><br /><h2><span style="font-size:100%;">La “cereza de la torta”: puliendo la castellanización</span></h2> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal">Como forma de entrar rápidamente en otro tema, para traducir a nuestro idioma los textos de nuestra aplicación (que originalmente son generados en inglés) deberemos editar por primera vez nuestras “plantillas” (templates) de código html. Como estamos dentro del patrón <i style="">MVC</i> estas plantillas se encontrarán ubicadas en la capa que representa <b style="">la vista </b>(explicado en la introducción al patrón) dentro del directorio de nuestro proyecto y con la extensión <i style="">.rhtml</i>:</p> <p class="MsoNormal"><o:p> </o:p></p> <p class="Codigo"><span style="" lang="EN-GB">C:\rails\miproyecto\app\views\clientes\edit.rhtml<o:p></o:p></span></p> <p class="MsoNormal"><span style="" lang="EN-GB"><o:p> </o:p></span></p> <p class="MsoNormal">Aquí podremos modificar todos los textos que están a la derecha de<span style="" lang="EN-GB"> link_to</span>, como por ejemplo:</p> <p class="MsoNormal"><o:p> </o:p></p> <p class="Codigo"><span style="" lang="EN-GB"><%= link_to 'Back', :action => 'list' %><o:p></o:p></span></p> <p class="MsoNormal"><span style="" lang="EN-GB"><o:p> </o:p></span></p> <p class="MsoNormal"><span style="" lang="EN-GB">Cambiando por:<o:p></o:p></span></p> <p class="MsoNormal"><span style="" lang="EN-GB"><o:p> </o:p></span></p> <p class="Codigo"><span style="" lang="EN-GB"><%= link_to '<b style="">Volver</b>', :action => 'list' %><o:p></o:p></span></p> <p class="MsoNormal"><span style="" lang="EN-GB"><o:p> </o:p></span></p> <p class="MsoNormal">Si este comportamiento lo queremos hacer permanente, es decir, cada vez que nuestro sistema genere el código del <i style="">“andamio”, </i>deberemos modificar las plantillas del framework, ubicadas en:</p> <p class="MsoNormal"><o:p> </o:p></p> <p class="Codigo"><span style="" lang="EN-GB">cd [directorio_instalación_ruby]</span></p><p class="Codigo"><span style="" lang="EN-GB">cd \lib\ruby\gems\1.8\gems\actionpack-1.11.2\lib\action_controller\templates\scaffolds<o:p></o:p></span></p> <p class="MsoNormal"><span style="" lang="EN-GB"><o:p> </o:p></span></p> <h2><span style="" lang="EN-GB">Conclusión<o:p></o:p></span></h2> <p class="MsoNormal"><span style="" lang="EN-GB"><o:p> </o:p></span></p> <p class="MsoNormal">Los expertos dicen que desarrollar con este framework <b style="">permite crear una aplicación web en al menos diez veces más rápido que con una herramienta similar en Java</b>. Parte del secreto está en el lenguaje de programación <i style="">Ruby</i>, en los <i style="">Patrones de Diseño</i> utilizados y en la filosofía de trabajo que sigue principios de <i style="">Desarrollo Ágil</i>.</p><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/717/822/1600/imagen8.0.jpg"><img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/717/822/320/imagen8.0.jpg" alt="" border="0" /></a><br /><p class="Volanta" style="text-align: center;" align="center"><span style="font-size:100%;"><b style="">Imagen “publicitaria”, muy provocativa, que compara la sencillez y el poder de RoR vs. J2EE de Java</b></span></p><p class="Volanta" style="text-align: center;" align="center"><br /><b style=""><span lang="ES-AR" style="font-size:12;"><o:p></o:p></span></b></p><span style="font-weight: bold;">¿Será el “Santo Grial” que estábamos buscando?</span> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal">Aún no tengo la respuesta, <span style="font-weight: bold;">pero el </span><i style="font-weight: bold;">“lado bueno de la fuerza”</i><span style="font-weight: bold;"> está fluctuando hacia </span><i style="font-weight: bold;">Ruby On Rails</i>, y gracias a su popularidad, muchos otros proyectos de frameworks para desarrollo web están tomando fuerza; se puede decir que estamos entrando en <i style="font-weight: bold;">“<st1:personname productid="La Era" st="on">la Era</st1:personname>”</i> (¿o la moda?) <span style="font-weight: bold;">de este tipo de estrategias de desarrollo</span>.</p> <p class="MsoNormal"><o:p> </o:p></p> <p class="MsoNormal">Por lo pronto recomiendo empezar a conocerlo y a probarlo en ambientes “cerrados”, como una aplicación para una Intranet, implementar todas las operaciones clásicas de ABM y progresivamente implementar el resto de nuestros requerimientos para ir sumando experiencia en el framework y en este peculiar lenguaje de programación.</p> <p class="MsoNormal"><o:p> </o:p></p> <p style="font-weight: bold;" class="MsoNormal">Y el tiempo dirá si esto es una moda pasajera o llegó para destronar a PHP, o tal vez, al mismo lenguaje Java con toda su parafernalia.</p> <p class="MsoNormal"><o:p> </o:p></p> <p style="text-align: center;" class="MsoNormal"><span style=""> </span><span style="font-weight: bold;">“EL REY HA MUERTO, ¡VIVA EL REY!”</span></p>Enrique Placehttp://www.blogger.com/profile/15452998349449419148noreply@blogger.com17tag:blogger.com,1999:blog-20987779.post-1148661196743433272006-05-26T13:22:00.000-03:002006-05-26T13:33:16.776-03:00"Evaluando Ruby"<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/717/822/1600/martinfowler.jpg"><img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/717/822/200/martinfowler.jpg" border="0" alt="" /></a>"<span style="font-style:italic;">Si estás leyendo esto, asumo que estás enterado de que ha habido una gran agitación entorno al lenguaje de programación Ruby y en particular de Rails, el framework para el desarrollo de aplicaciones Web. Algunos lo ven como el futuro de la programación, otros como una diversión peligrosa. <br /><br />Empecé con Ruby hace algunos años. Los <a href="http://www.pragmaticprogrammer.com/">Programadores Pragmáticos</a> lograron captar mi atención y pronto se convirtió en mi lenguaje de script preferido. Con el tiempo he llegado a usarlo en gran parte de la producción de este sitio Web, en particular de este bliki. Me encanta este lenguaje. <br /><br />Hay que distinguir entre mi gusto personal y si es algo que deban utilizar nuestros clientes. Podemos determinar su conveniencia en función de las características de los proyectos de estos clientes – y esto nos lleva a muchos argumentos sobre los pros y contras de la definición dinámica de tipos, convención sobre configuración, procesos versus threads (hilos) y otros. Tales discusiones son útiles, pero sigo siendo cauteloso con ellas. Hay demasiados asuntos que son difíciles de juzgar de esta forma y al final acabamos desperdiciando el tiempo en proyectos que son ralentizados por usar una tecnología que sonaba bien durante un partido de golf. Yo prefiero realizar estos juicios basándome en la experiencia – encontrar gente con experiencia exitosa en proyectos y que hayan usado Ruby.</span>"<br /><br />Escrito por Martin Fowler<br />Traducido por Rafael Vacas<br />Revisado por Jorge Ferrer<br /><br />Artículo completo en: <a href="http://www.agile-spain.com/agilev2/evaluandoruby">Agile Spain</A><br /><br />Si no sabes quién es Martín Fowler: <a href="http://en.wikipedia.org/wiki/Martin_Fowler">Wikipedia (inglés)</A>Enrique Placehttp://www.blogger.com/profile/15452998349449419148noreply@blogger.com0tag:blogger.com,1999:blog-20987779.post-1148487787569147392006-05-24T13:23:00.000-03:002006-05-24T14:58:07.853-03:00"Patrones de Diseño en Ruby :: Singleton"<p style="font-style: italic;">"Una critica que algunos hacen al libro "<a href="http://en.wikipedia.org/wiki/Design_Patterns">Design Patterns: Elements of Reusable Object-Oriented Software</a>" es que las implementaciones de los patrones ahi expuestos están pensados para lenguajes estáticamente tipados (Java, C++, ...) y no cubren los lenguajes dinámicos (Ruby, Lisp, ...)</p> <p style="font-style: italic;">Las implementaciones de patrones de diseño en lenguajes dinámicos son por lo general mucho más sencillas que las implementaciones de los mismos patrones en lenguajes estáticamente tipados, de hecho muchas de estas implementaciones son verdaderamente triviales en los lenguajes dinámicos (en algunos casos inclusive ya son parte del lenguaje)."</p>Artículo completo en: <a href="http://www.lacaraoscura.com/2006/05/23/patrones-de-diseno-en-ruby-singleton/">La Cara Oscura</a>Enrique Placehttp://www.blogger.com/profile/15452998349449419148noreply@blogger.com2