<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Search results for 'app:weblogs' matching tag 'Ruby'</title><link>http://msmvps.com/search/SearchResults.aspx?q=app:weblogs&amp;tag=Ruby&amp;orTags=0&amp;o=DateDescending</link><description>Search results for 'app:weblogs' matching tag 'Ruby'</description><dc:language>en-US</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>Dos Meetups en Buenos Aires: AWS y Ruby</title><link>http://msmvps.com/blogs/lopez/archive/2012/07/31/dos-meetups-en-buenos-aires-aws-y-ruby.aspx</link><pubDate>Tue, 31 Jul 2012 05:00:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1814189</guid><dc:creator>lopez</dc:creator><description>&lt;p&gt;En estos días estuve bastante ocupado preparando y completando mi charla de física cuántica, así que no avisé con tiempo de estas dos reuniones en Buenos Aires. Hoy martes, tenemos la de Amazon Web Services User Group:&lt;/p&gt;  &lt;p&gt;Reunión 31 de Julio: Autoscaling y más&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.meetup.com/AWS-User-Group-Buenos-Aires/events/68988052/"&gt;http://www.meetup.com/AWS-User-Group-Buenos-Aires/events/68988052/&lt;/a&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Costa Rica 5546, oficinas 301 a 303, Buenos Aires (&lt;a href="http://maps.google.com/maps?q=Costa+Rica+5546%2C+oficinas+301+a+303%2C+Buenos+Aires"&gt;map&lt;/a&gt;)&lt;/p&gt;    &lt;p&gt;SELECTED BY: &lt;a href="http://www.meetup.com/AWS-User-Group-Buenos-Aires/members/12579648/"&gt;MATIAS BAGINI&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Reunión 31 de Julio: AutoScaling y más.&lt;/p&gt;    &lt;p&gt;En Costa Rica 5546, oficinas 301 a 303.&lt;/p&gt;    &lt;p&gt;19hs. Bienvenida.&lt;/p&gt;    &lt;p&gt;19:10hs. Presentación Elance para desarrolladores AWS&lt;/p&gt;    &lt;p&gt;19:15hs. Introducción a AutoScaling&lt;/p&gt;    &lt;p&gt;19:45hs. Caso AWS: &amp;quot;The Fan Machine Infrastructure and Architecture&amp;quot;&lt;/p&gt;    &lt;p&gt;20:30hs. Networking y cierre.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Esta vez cambiaron de lugar, pero no encontré de quienes son las oficinas. El tema es entonces Autoscaling, pero también habrá otros temas.&lt;/p&gt;  &lt;p&gt;Y ya comienza Agosto. La gente de Ruby Argentina se han comprometido a hacer un meetup el primer miércoles de cada mes. Así que mañana miércoles hay reunión. El bueno de &lt;a href="http://twitter.com/inkel"&gt;@inkel&lt;/a&gt; envío a la lista de Rubysur:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Quería recordarles e invitarlos al próximo meetup de Ruby Argentina, a     &lt;br /&gt;celebrarse el miércoles 1 de agosto a las 18.30h en Urban Station (El      &lt;br /&gt;Salvador 4588)      &lt;br /&gt;Pedimos por favor que se anoten todos aquellos que deseen participar      &lt;br /&gt;en el siguiente formulario, como así mismo proponer charlas o dejarnos      &lt;br /&gt;comentarios:      &lt;br /&gt;&lt;a href="http://goo.gl/RlWm3"&gt;http://goo.gl/RlWm3&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Hay como tema propuesto, lógica computacional y lenguaje S. Sería bueno también que se pudiera dar la charla de Ruby y TDD que quedó fuera de horario en la meetup pasada.&lt;/p&gt;  &lt;p&gt;Nos leemos!&lt;/p&gt;  &lt;p&gt;Angel “Java” Lopez   &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Pr&amp;#243;xima Meetup de Ruby en Buenos Aires</title><link>http://msmvps.com/blogs/lopez/archive/2012/06/27/pr-243-xima-meetup-de-ruby-en-buenos-aires.aspx</link><pubDate>Wed, 27 Jun 2012 05:00:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1811892</guid><dc:creator>lopez</dc:creator><description>&lt;p&gt;Han vuelto las reuniones de Ruby Argentina, los meetups. El grupo ha decidido que de ahora en más, las meetups se hagan el primer miércoles de Julio, el día 4 de Julio. Pueden ver el anuncion en la lista Rubysur vía el bueno de &lt;a href="http://twitter.com/_nesto"&gt;@_nesto&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a href="https://groups.google.com/group/rubysur/browse_thread/thread/1b84c59e1e7f04f5"&gt;https://groups.google.com/group/rubysur/browse_thread/thread/1b84c59e1e7f04f5&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Se hace a las 18:30hs (puntual) hasta las 20:30hs en Urban Station:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://argentina.enjoyurbanstation.com/es/"&gt;http://argentina.enjoyurbanstation.com/es/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;un lugar que hay que felicitar, porque siempre ha apoyado a estas reuniones de Ruby en Buenos Aires (ahí fue el Ruby Fun Day del año pasado). Un lugar donde pueden trabajar, si están de paso, con todo lo necesario para programar y seguir creando llevando una notebook.&lt;/p&gt;  &lt;p&gt;En esta próxima meetup (el miércoles de la semana que viene) se harán cuatro charlas (a votar). Yo ya me inscribí en el formulario:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://bit.ly/MvRtim" href="http://bit.ly/MvRtim"&gt;http://bit.ly/MvRtim&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;No vi cual es el enlace del formulario para ir viendo los anotados y las charlas propuestas. Se supone que el viernes se votan las 4 charlas, si hay más de cuatro propuestas.&lt;/p&gt;  &lt;p&gt;Yo propuse una de Node.js para programadores Ruby, así que vayan a inscribirse, y voten! ;-)&lt;/p&gt;  &lt;p&gt;Como escribía en:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2012/06/13/django-day-en-la-plata-buenos-aires-argentina.aspx"&gt;http://msmvps.com/blogs/lopez/archive/2012/06/13/django-day-en-la-plata-buenos-aires-argentina.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;hay cantidad de “meetups” acá en Buenos Aires. Es muy bueno entonces que la gente de Ruby haya “dado algoritmo”: ahora sé que es el primer miércoles de cada mes, y eso sirve para organizarse de antemano.&lt;/p&gt;  &lt;p&gt;Vean, esta semana hay dos “meetups”. Ayer mismo, la de Mule, organizada por el Java User Group, en especial por &lt;a href="http://twitter.com/ramirorinaudo"&gt;@ramirorinaudo&lt;/a&gt; de MuleSoft:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.jugargentina.org/events/58424062/"&gt;http://www.jugargentina.org/events/58424062/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;y mañana jueves una de Microsoft:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.meetup.com/Desarrolladores-Windows-de-Argentina-y-Uruguay/events/70201102/"&gt;http://www.meetup.com/Desarrolladores-Windows-de-Argentina-y-Uruguay/events/70201102/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ambas prometen cerveza (y la hubo en la de ayer, en MuleSoft, veamos como se porta Microsoft ;-) Lo mío es un apostolado ;-)&lt;/p&gt;  &lt;p&gt;Nos leemos!&lt;/p&gt;  &lt;p&gt;Angel “Java” Lopez    &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;</description></item><item><title>AjGenesis Generaci&amp;#243;n de C&amp;#243;digo en .NET, Javascript y Ruby, Las Puertas Est&amp;#225;n Abiertas</title><link>http://msmvps.com/blogs/lopez/archive/2012/05/31/ajgenesis_2D00_code_2D00_generation_2D00_in_2D00_net_2D00_javascript_2D00_and_2D00_ruby_2D00_all_2D00_the_2D00_gates_2D00_are_2D00_open.aspx</link><pubDate>Thu, 31 May 2012 05:00:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1810465</guid><dc:creator>lopez</dc:creator><description>&lt;p&gt;&lt;img style="margin:0px 20px 20px 0px;display:inline;" align="left" src="http://www.ajlopez.com/images/articles2/opengates.jpg" alt="" /&gt;&lt;/p&gt;  &lt;p&gt;Tengo la costumbre de levantar temprano en la mañana. El martes pasado, me levanté algo más temprano, todavía, porque tenía una idea rondando en la cabeza. La semana pasada trabajé bastante con Javascript y Node.js, en mis proyectos personales, y había conseguido algo que ahora veía que podía fácilmente implementar en Ruby. No lo había hecho por meses, porque no me parecía que hubiera un camino claro, pero luego de mi experiencia de la semana pasada, tomé la decisión de cómo implementarlo. Estoy hablando de tener un motor de plantillas (“template engine”) para mi generador de código AjGenesis, ahora en Ruby. Puse manos a la obra, y en tres horas tuve algo andando, armado usando TDD (con “commits” frecuentes que pueden ver en el log de GitHub).&lt;/p&gt;  &lt;p&gt;El resultado quedón en mi cuenta de GitHub:&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/AjGenesisRb"&gt;https://github.com/ajlopez/AjGenesisRb&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Inicialmente, había planeado (el año pasado) usar uno de los motores de plantillas ya disponibles en Ruby, como &lt;a href="http://haml.info/tutorial.html"&gt;Haml&lt;/a&gt;. Pero preferí escribir mi propia implementación, más alineada con el AjGenesis original. Esto lo tomé luego de la buena experiencia que tuve la semana pasada cuando escribí AjGenesis en Javascript/NodeJs, ver:&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/AjGenesisNode"&gt;https://github.com/ajlopez/AjGenesisNode&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;En ese proyecto, separé el motor de plantilla en otro paquete, ya publicado en NPM:&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/SimpleTpl"&gt;https://github.com/ajlopez/SimpleTpl&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;De esta manera pude reusar el formato de plantilla en otro proyecto Javascript sobre Express,:&lt;/p&gt;  &lt;p&gt;&lt;a href="https://github.com/ajlopez/SimpleMvc"&gt;https://github.com/ajlopez/SimpleMvc&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;una simple implementación de MVC (Model View Controller).&lt;/p&gt;  &lt;p&gt;Entonces, ahora tengo tres proyectos:&lt;/p&gt;  &lt;p&gt;- &lt;a href="http://ajgenesis.codeplex.com/"&gt;El clásico AjGenesis&lt;/a&gt;, implementado en .NET (ver el directorio de ejemplos)     &lt;br /&gt;- &lt;a href="https://github.com/ajlopez/AjGenesisNode"&gt;AjGenesis en Javascript/Node&lt;/a&gt;, usando la &lt;a href="https://github.com/ajlopez/SimpleTpl"&gt;SimpleTpl template engine&lt;/a&gt;, con interpolación de expresiones Javascript y con soporte de comandos Javascript embebidos en el medio de la plantilla (ver directorio samples)     &lt;br /&gt;- &lt;a href="https://github.com/ajlopez/AjGenesisRb"&gt;AjGenesis en Ruby&lt;/a&gt;, con un motor interno de plantillas similar al anterior, con soporte de expresiones y comandos Ruby embebidos (ver directorio samples)&lt;/p&gt;  &lt;p&gt;AjGenesis en Javascript fue publicado en npm (Node Package Manager) como beta.&lt;/p&gt;  &lt;p&gt;AjGenesis en Ruby no está todavía como gema.&lt;/p&gt;  &lt;p&gt;RECUERDEN: todos estos proyectos GENERAN los artefactos de texto QUE QUIERAN. No son sólo para un lenguaje. Por ejemplo, desde AjGenesis en Javascript generé una solución para .NET, ver los ejemplos.&lt;/p&gt;  &lt;p&gt;Es muy interesante ver cómo ideas simples pero poderosas pueden ser reimplementadas en lenguajes dinámicos (de ahí mi temprano interés en tener desde hace años a AjBasic y más recientemente, a AjSharp). Próximos pasos: más ejemplos, línea de comando, gema ruby, release de paquete node (ya no beta), y sitio web implementando “Code Generation as a Service” (&lt;a href="http://ajlopez.wordpress.com/2008/04/19/code-generation-as-a-service-with-ajgenesis/"&gt;ASP.NET implementation commented in my old post&lt;/a&gt;). (ver también &lt;a href="http://ajlopez.wordpress.com/2011/11/18/ajgenesis-basis-of-its-implementation/"&gt;AjGenesis: Basis of Its Implementation&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;Otros lenguajes de implementación pendiantes: Python, quizás Java.&lt;/p&gt;  &lt;p&gt;(La foto original desde: &lt;a href="http://commons.wikimedia.org/wiki/File:Table_Rock_Dam_during_April_2008_White_River_Flood.jpg"&gt;http://commons.wikimedia.org/wiki/File:Table_Rock_Dam_during_April_2008_White_River_Flood.jpg&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;Nos leemos!&lt;/p&gt;  &lt;p&gt;Angel “Java” Lopez    &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Pr&amp;#243;xima Meetup Ruby en Buenos Aires, Mayo 2012</title><link>http://msmvps.com/blogs/lopez/archive/2012/05/11/pr-243-xima-meetup-ruby-en-buenos-aires-mayo-2012.aspx</link><pubDate>Fri, 11 May 2012 05:00:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1809737</guid><dc:creator>lopez</dc:creator><description>&lt;p&gt;Se acerca una nueva reuni&amp;oacute;n &amp;ldquo;meetup&amp;rdquo; de la gente de Ruby Argentina, en Buenos Aires. &lt;a href="http://twitter.com/inkel"&gt;@inkel&lt;/a&gt; envi&amp;oacute; &lt;a href="http://groups.google.com/group/rubysur/browse_thread/thread/37c9713465dd6202"&gt;este anuncio&lt;/a&gt; en la lista &lt;a href="http://groups.google.com/group/rubysur"&gt;RubySur&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Tenemos el agrado de invitarlos a la pr&amp;oacute;xima meetup de Ruby Argentina en Buenos Aires, a realizarse en las oficinas de Wayra Argentina, sita en Costa Rica 5546, Oficina 604.&lt;/p&gt;
&lt;p&gt;     &lt;br /&gt;Para poder ingresar al edificio de Wayra Argentina necesitamos que ingresen su nombre y apellido en el siguiente formulario, y no olviden llevar su c&amp;eacute;dula o DNI. Tambi&amp;eacute;n pueden anotarse si quieren dar una charla o hacernos sugerencias.&lt;/p&gt;
&lt;p&gt;     &lt;br /&gt;Inscripci&amp;oacute;n: &lt;a href="http://goo.gl/68WQw"&gt;http://goo.gl/68WQw&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;     &lt;br /&gt;= Sobre Wayra Argentina &lt;a href="http://wayra.org/"&gt;http://wayra.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;     &lt;br /&gt;Wayra es una iniciativa sin precedentes en el entorno latinoamericano y europeo que pretende conseguir un impacto relevante en la econom&amp;iacute;a de los pa&amp;iacute;ses en que opera. Si sos emprendedor y ten&amp;eacute;s un proyecto en el &amp;aacute;mbito digital, en      &lt;br /&gt;entorno web o soporte m&amp;oacute;vil, subilo a Wayra que te ayudamos a hacerlo realidad.&lt;/p&gt;
&lt;p&gt;     &lt;br /&gt;Les recordamos que el 13 de mayo es el cierre de inscripci&amp;oacute;n de proyectos para Wayra Argentina 2012. Los interesados deber&amp;aacute;n completar el formulario de inscripci&amp;oacute;n de proyectos en:&lt;/p&gt;
&lt;p&gt;     &lt;br /&gt;&lt;a href="http://wayra.org/es/convocatoria-argentina-2012"&gt;http://wayra.org/es/convocatoria-argentina-2012&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;El horario es de 19 a 21hs. Atenci&amp;oacute;n: la calle es Costa Rica, en el anuncio inicial se hab&amp;iacute;a puesto Nicaragua.&lt;/p&gt;
&lt;p&gt;La idea del grupo es reunirse una vez por mes. Me gustar&amp;iacute;a ir a esta &amp;ldquo;meetup&amp;rdquo; y hasta preparar una charla, pero no estoy seguro todav&amp;iacute;a: estoy &amp;ldquo;en concentraci&amp;oacute;n&amp;rdquo; preparando mi charla para JsConf Argentina (ver &lt;a href="http://www.devthought.com/2012/03/17/jsconf-argentina/"&gt;anuncio&lt;/a&gt; de &lt;a href="http://twitter.com/rauchg"&gt;@rauchg&lt;/a&gt; y &lt;a href="http://jsconf.com.ar/"&gt;el sitio&lt;/a&gt;), y en el medio de dos proyectos (uno que me lleva a poner a atenci&amp;oacute;n a muchos detalles, y otro que me impulsa a pensar mucho ;-). Veo de decidirme este fin de semana.&lt;/p&gt;
&lt;p&gt;Aprovecho para comentar que mis charlas en &lt;a href="http://twitter.com/altnethispano"&gt;@AltNetHispano&lt;/a&gt; sobre lenguajes de programaci&amp;oacute;n (en la segunda inclu&amp;iacute; Ruby) est&amp;aacute;n publicadas en:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://altnethispano.org/wiki/van-2012-04-14-esos-raros-lenguajes-parte1.ashx"&gt;http://altnethispano.org/wiki/van-2012-04-14-esos-raros-lenguajes-parte1.ashx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://altnethispano.org/wiki/van-2012-04-14-esos-raros-lenguajes-parte2.ashx"&gt;http://altnethispano.org/wiki/van-2012-04-14-esos-raros-lenguajes-parte2.ashx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Mis enlaces sobre Ruby que estuve estudiando o me interesaron:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://delicious.com/ajlopez/ruby"&gt;http://delicious.com/ajlopez/ruby&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;La gente de la comunidad ya est&amp;aacute; preparando la segunda RubyConf, hacia finales de este a&amp;ntilde;o 2012.&lt;/p&gt;
&lt;p&gt;La menci&amp;oacute;n a Wayra, y sus proyectos, es porque ellos buscan propuestas (en varios pa&amp;iacute;ses), vean:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://wayra.org/es/tienes-un-proyecto"&gt;http://wayra.org/es/tienes-un-proyecto&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://wayra.org/en/do-you-have-project"&gt;http://wayra.org/en/do-you-have-project&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://wayra.org/br/tenho-um-projeto"&gt;http://wayra.org/br/tenho-um-projeto&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Vean proyectos que seleccionaron en Colombia, M&amp;eacute;xico, Espa&amp;ntilde;a, Argentina, Per&amp;uacute;, Brasil, Venezuela, Chile y Colombia:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://wayra.org/es/proyectos-acelerados"&gt;http://wayra.org/es/proyectos-acelerados&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://wayra.org/es/proyectos-seleccionados-argentina"&gt;http://wayra.org/es/proyectos-seleccionados-argentina&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;ldquo;Java&amp;rdquo; Lopez   &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://twitter.com/ahlopez"&gt;http://twitter.com/ahlopez&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Esos Raros Lenguajes Nuevos (1) VANs en ALT.NET Hispano</title><link>http://msmvps.com/blogs/lopez/archive/2012/04/09/esos-raros-lenguajes-nuevos-1-vans-en-alt-net-hispano.aspx</link><pubDate>Mon, 09 Apr 2012 05:00:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1808672</guid><dc:creator>lopez</dc:creator><description>&lt;p&gt;En Marzo dí una charla presencial en el Microsoft User Group de Argentina, en Buenos Aires, ver:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2012/03/03/esos-raros-lenguajes-nuevos-javascript-node-scala-erlang-clojure-ruby-python.aspx" target="_blank"&gt;Esos Raros Lenguajes Nuevos: Javascript/Node, Scala, Erlang, Clojure, Ruby, Python&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ahora, el sábado que viene (14 de Abril) y el siguiente sábado (21 de Abril) la gente de ALT.NET Hispano ha organizado dos VAN (reuniones virtuales) para que pueda comentar sobre esos lenguajes, que no son tan raros ni tan nuevos, pero que en general pueden parecerlo dentro de la comunidad .NET:&lt;/p&gt;  &lt;p&gt;- Javascript en NodeJs   &lt;br /&gt;- Scala    &lt;br /&gt;- Erlang    &lt;br /&gt;- Clojure    &lt;br /&gt;- Python    &lt;br /&gt;- Ruby&lt;/p&gt;  &lt;p&gt;Este es el anuncio de la primera reunión:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;La comunidad &lt;a href="http://www.google.com/url?q=http%3A%2F%2FALT.NET&amp;amp;usd=2&amp;amp;usg=AFQjCNHCjdfpizsVyIZTzgBVm4uK2byWhg"&gt;ALT.NET&lt;/a&gt; Hispano (&lt;a href="http://www.google.com/url?q=http%3A%2F%2Faltnethispano.org&amp;amp;usd=2&amp;amp;usg=AFQjCNH7X-EhZD5RMHGyIk-0o4VZaQM7Xg"&gt;http://altnethispano.org&lt;/a&gt;) realizará una VAN sobre Esos raros lenguajes nuevos NodeJs, Scala, Clojure, Erlang, Python, Ruby Parte 1, con Angel Java Lopez.&lt;/p&gt;    &lt;p&gt;Fecha: Sábado 14 de Abril del 2012 a las 18:00 hrs. Hora Internacional (GMT/UTC), con una duración aproximada de 2 horas.&lt;/p&gt;    &lt;p&gt;Pueden plantear sus comentarios e inquietudes sobre el tema de la reunión en: &lt;a href="https://groups.google.com/d/topic/altnet-hispano/mRQRHvoAvKc/discussion"&gt;https://groups.google.com/d/topic/altnet-hispano/mRQRHvoAvKc/discussion&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Para mayor información sobre cómo atender la reunión consulten: &lt;a href="http://tinyurl.com/van-hispano"&gt;http://tinyurl.com/van-hispano&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Mi idea es mostrar a qué problemas se orientan estos lenguajes. Por ejemplo, cómo tratan de resolver temas de escalabilidad y computación distribuida en los cuatro primeros (Javascript en NodeJs, Scala, Erlang, Clojure). Y cómo se ha ido formando comunidades, y ecosistemas de paquetes y desarrollo web, especialmente en los dos últimos (Python y Ruby). Mi plan es dar los tres primeros (Javascript/NodeJs, Scala, Erlang) este sábado que viene, y los otros (Clojure, Python, Ruby) en la siguiente sesión.&lt;/p&gt;  &lt;p&gt;Este es el primer post de la serie, donde voy a ir escribiendo, comentando sobre recursos y enlaces que fui descubriendo, además de los ya presentados en el post que mencioné al principio.&lt;/p&gt;  &lt;p&gt;Nos leemos!&lt;/p&gt;  &lt;p&gt;Angel &amp;quot;Java&amp;quot; Lopez   &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Ruby Buenos Aires Meetup Marzo 2012</title><link>http://msmvps.com/blogs/lopez/archive/2012/03/30/ruby-buenos-aires-meetup-marzo-2012.aspx</link><pubDate>Fri, 30 Mar 2012 05:00:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1808173</guid><dc:creator>lopez</dc:creator><description>&lt;p&gt;Ayer tuve el gusto de asistir a mi segunda meetup de Ruby acá en Buenos Aires. Fue en &lt;a href="http://argentina.enjoyurbanstation.com/es/"&gt;Urban Station&lt;/a&gt;, un buen lugar para trabajadores móviles: pueden ir con su notebook y trabajar en una mesita, con WiFi, enchufe, pagando por hora, o alquilar salones chicos de reuniones. La gente de Ruby Argentina consiguió una sala con proyector. Llegué a las 18:20 (empeza 18:30), y me encontré con Esteban, arquitecto, programador PHP, que estaba en Ruby. Mientras esperábamos, aproveché para preguntarle por qué se usa en Arquitectura, me enteré de Build Information Modeling, ver mis enlaces &lt;a href="http://delicious.com/ajlopez/bim"&gt;http://delicious.com/ajlopez/bim&lt;/a&gt;. Tenía algo con ver con la charla que iba a dar, sobre AjLisp en Ruby (ver mis posts &lt;a href="http://ajlopez.wordpress.com/category/ajlisp"&gt;http://ajlopez.wordpress.com/category/ajlisp&lt;/a&gt;), porque AutoCad tuvo desde siempre AutoLisp como lenguaje de base de programación.&lt;/p&gt;  &lt;p&gt;Poco a poco fue llegando más gente, como &lt;a href="http://twitter.com/soveran"&gt;@soveran&lt;/a&gt;, &lt;a href="http://twitter.com/maceto"&gt;@maceto&lt;/a&gt;, &lt;a href="http://twitter.com/inkel"&gt;@inkel&lt;/a&gt;, creo que llegó &lt;a href="http://twitter.com/etagwerker"&gt;@etagwerker&lt;/a&gt; pero no pude hablar con él. &lt;/p&gt;  &lt;p&gt;El primer disertante fue… moi ;-). Presenté AjLisp en Ruby, ver &lt;a href="https://github.com/ajlopez/AjLispRb"&gt;https://github.com/ajlopez/AjLispRb&lt;/a&gt;. Hace dos días, encontré esta presentación:&lt;/p&gt;  &lt;p&gt;How Emacs changed my life &lt;a href="http://www.slideshare.net/yukihiro_matz/how-emacs-changed-my-life"&gt;http://www.slideshare.net/yukihiro_matz/how-emacs-changed-my-life&lt;/a&gt; By Yukihiro &amp;quot;Matz&amp;quot;, Ruby creator&lt;/p&gt;  &lt;p&gt;Que me ayudó a poner la relación entre Lisp y Ruby. Conté algo de la historia de Lisp. Y destaqué que desarrollé AjLispRb usando TDD, desde el principio, para ir practicando y aprendiendo Ruby. Hice algunas demostraciones, mostrando rápidamente lambdas, define, closures y macros. Notablemente, cuando presenté que tiene una sintaxis tipo Java Dot Notation (ver &lt;a href="http://jscheme.sourceforge.net/jscheme/doc/javadot.html"&gt;http://jscheme.sourceforge.net/jscheme/doc/javadot.html&lt;/a&gt;) para acceder a objetos y clases Ruby, me preguntaron si esto anda en AjLisp:&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;(.require @Kernel &amp;quot;date”)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;(.today @Date)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;funcionó! ;-) Ni se me había ocurrido probarlo. En realidad, en vez de “@Kernel” puedo poner “pepe”, e igual termina invocando al método “global” require, tengo que investigar por qué. Jeje… AjLispRb tiene vida propia.&lt;/p&gt;  &lt;p&gt;Luego presentó Michel Martens, gran programador Ruby, &lt;a href="http://twitter.com/soveran"&gt;@soveran&lt;/a&gt;, y jugador de Go, ver &lt;a href="https://github.com/soveran"&gt;https://github.com/soveran&lt;/a&gt;, por ejemplo, vean su framework web Cuba &lt;a href="https://github.com/soveran/cuba"&gt;https://github.com/soveran/cuba&lt;/a&gt;. Presentó los elementos de uso de Rack, un tema que me interesa por su historia, relación con Python y otros. Ver mis enlaces &lt;a href="http://delicious.com/ajlopez/rack"&gt;http://delicious.com/ajlopez/rack&lt;/a&gt;. En un tiempo, quisiera preparar una charla corta sobre el tema, para algún Ruby Meetup u otro lugar.&lt;/p&gt;  &lt;p&gt;Y notablemente, presentó algo muy interesante, Bandicoot:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://bandilab.org/"&gt;http://bandilab.org/&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://www.readwriteweb.com/hack/2011/07/new-set-based-programming-language-bandicoot.php"&gt;http://www.readwriteweb.com/hack/2011/07/new-set-based-programming-language-bandicoot.php&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Su presentación en:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://files.soveran.com/bandicoot/"&gt;http://files.soveran.com/bandicoot/&lt;/a&gt; (hecha con &lt;a href="https://github.com/nakajima/slidedown"&gt;https://github.com/nakajima/slidedown&lt;/a&gt;, ver &lt;a href="https://github.com/soveran/slidedown-skeleton"&gt;https://github.com/soveran/slidedown-skeleton&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;Interesante. Maneja conjuntos con operadores de álgebra relacional. Hmmm… interesante Code Kata para Pascual: implementar algo en C#, usando LINQ por debajo. Mis enlaces sobre el tema &lt;a title="http://delicious.com/ajlopez/set+programminglanguages " href="http://delicious.com/ajlopez/set+programminglanguages%20"&gt;http://delicious.com/ajlopez/set+programminglanguages &lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Michel lo usó en un proyecto. Vean que Bandicoot levanta un servidor al que se accede por HTTP, y en su lenguaje se programa los “puntos de entrada” que se exponen por ese servidor HTTP. El escribió un cliente Ruby &lt;a href="https://github.com/soveran/rel"&gt;https://github.com/soveran/rel&lt;/a&gt;. También comentó sobre su parser de command line &lt;a href="https://github.com/soveran/clap"&gt;https://github.com/soveran/clap&lt;/a&gt; (vean el uso de lambdas de Ruby ahí).&lt;/p&gt;  &lt;p&gt;Hubo otros temas que se trataron: el anuncio de Rails Girls&amp;#160; en Buenos Aires:&lt;/p&gt;  &lt;p&gt;&lt;a title="http://railsgirls.com/buenosaires" href="http://railsgirls.com/buenosaires"&gt;http://railsgirls.com/buenosaires&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Se propuso hacer un Ruby Camp, reunirse para programar, ya sea en un lugar abierto, o en un bar, o en una casa. Se anunció que ya se comenzó a organizar la Ruby Conf de 2012.&lt;/p&gt;  &lt;p&gt;Se repartió “merchandising”, varios conseguimos una tarjeta de promoción de Code School &lt;a href="http://www.codeschool.com/"&gt;http://www.codeschool.com/&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;Un poco antes de las 21, se levantó la reunión que siguió con comida, bebida (supongo que agua mineral solamente ;-) en otros lugares de la zona de Palermo. Lo mío es la sopita de pollo, así que regresé a mi cubil principal.&lt;/p&gt;  &lt;p&gt;Felicitaciones a la gente de Ruby Argentina por tener una comunidad tan activa y abierta.&lt;/p&gt;  &lt;p&gt;Nos leemos!&lt;/p&gt;  &lt;p&gt;Angel “Java” Lopez   &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Esos Raros Lenguajes Nuevos: Javascript/Node, Scala, Erlang, Clojure, Ruby, Python</title><link>http://msmvps.com/blogs/lopez/archive/2012/03/03/esos-raros-lenguajes-nuevos-javascript-node-scala-erlang-clojure-ruby-python.aspx</link><pubDate>Sat, 03 Mar 2012 06:00:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1806851</guid><dc:creator>lopez</dc:creator><description>&lt;p&gt;El jueves pasado tuve el gusto de dar una charla sobre lenguajes, en el &lt;a href="http://www.mug.org.ar"&gt;Microsoft User Group de Argentina&lt;/a&gt;, en su sede de Buenos Aires. Mi idea era presentar lenguajes de programación, alguno nuevo, otros ya con más de 15 años de existencia, que la comunidad de programadores .NET o de tecnologías Microsoft no ve frecuentemente.&lt;/p&gt;  &lt;p&gt;Para mí, es un tema interesante: ver que a lo largo del tiempo, en la historia de la computación, hay lenguajes de programación que aparecen, tiene éxito u olvido. Pasan los años, y seguimos teniendo nuevos lenguajes. Vean que en el ambiente de las computadoras personales, no ha pasado lo mismo con los sistemas operativos: prácticamente se estabilizó en dos opciones con variantes: Windows y Linux (y otros Unix no derivados de Linux directamente). Podría poner Mac OS como aparte también. En cambio, en el ámbito de los lenguajes de programación, sigue habiendo actividad de creación, y viejos lenguajes aún sobreviven (desde Fortran hasta COBOL, y Smalltalk, por poner ejemplos diversos). Y aparecen lenguajes nuevos cada año, como en el 2011 que vió nacer a Dart, de la mano de Google (que también se animó antes a crear el lenguaje Go).&lt;/p&gt;  &lt;p&gt;Los lenguajes que presenté fueron:   &lt;br /&gt;- Javascript (en NodeJs)    &lt;br /&gt;- Scala    &lt;br /&gt;- Erlang    &lt;br /&gt;- Clojure    &lt;br /&gt;- Ruby    &lt;br /&gt;- Python (no alcanzó el tiempo, pero lo incluyo en este post) &lt;/p&gt;  &lt;p&gt;Un punto que destaqué es que los primeros cuatro (Javascript/NodeJs, Scala, Clojure, Erlang) tratan, entre otros objetivos, de encarar el problema de paralelismo, y multithreading. Ante la desaceleración de la ley de Moore, se trata de aprovechar el hardware de computadoras multicore. Eso lleva a que los lenguajes tengan que soportar múltiples threads (tema que casi todos hoy soportan, de una u otra forma, aunque algunos sólo recientemente: Smalltak, Ruby tuvieron mucho tiempo implementados “green threads”, hilos simulados por el lenguaje, sin aprovechar los threads del sistema operativo, que explotan los múltiples recursos del hardware). Pero también lleva a la complicación: tenemos que escribir programas contenplando múltitples hilos de ejecución, concurrencia, condiciones de carrera, lockeos, etc. Veremos que Erlang (y Scala con Akka) lleva a un paso más: ejecutar en varias máquinas. Ese camino es muy interesante para mí, porque libera la restricción de tener que explotar solamente una máquina: para procesos pesados (desde web crawling, big data, etc...) podemos repartir el trabajo en varias máquinas “normales”. De hecho, vean cómo el mercado de las supercomputadoras ha ido decayendo, porque desde fines del siglo pasado se han encontrado soluciones basadas en clusters, grillas, etc... con varias computadoras atacando un problema. &lt;/p&gt;  &lt;p&gt;También quería mostrar que estos lenguajes se pueden probar en Windows, sin grandes problemas de instalación. Muchos de estos lenguajes “nuevos y raros” nacen en ambientes Unix/Linux y no siempre su instalación en Windows fue fácil. Pero en estos tiempos, ya tenemos un buen soporte de Windows para los lenguajes que presenté. &lt;/p&gt;  &lt;p&gt;De cada lenguaje mostré algún ejemplo simple, y otro ejemplo más complejo (aunque corto) que mostrara alguna característica destacada.&amp;#160; Espero poder volcar todos los enlaces y comentarios hechos en este post. Comencemos. &lt;/p&gt;  &lt;h3&gt;Javascript/NodeJs &lt;/h3&gt;  &lt;p&gt;Sitio: &lt;a href="http://nodejs.org/"&gt;http://nodejs.org/&lt;/a&gt;    &lt;br /&gt;Descripción, Historia: &lt;a href="http://en.wikipedia.org/wiki/Nodejs"&gt;http://en.wikipedia.org/wiki/Nodejs&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/JavaScript"&gt;http://en.wikipedia.org/wiki/JavaScript&lt;/a&gt;    &lt;br /&gt;Download que usé: el de Windows v0.6.7 pero pueden usar cualquiera de Windows 6.x. La actual es &lt;a href="http://nodejs.org/dist/v0.6.12/node-v0.6.12.msi"&gt;http://nodejs.org/dist/v0.6.12/node-v0.6.12.msi&lt;/a&gt;    &lt;br /&gt;Listas de Correo: &lt;a href="http://groups.google.com/group/nodejs"&gt;http://groups.google.com/group/nodejs&lt;/a&gt; &lt;a href="http://groups.google.com/group/nodejs-dev"&gt;http://groups.google.com/group/nodejs-dev&lt;/a&gt;    &lt;br /&gt;Ejemplos que usé: &lt;a href="https://github.com/ajlopez/NodeSamples"&gt;https://github.com/ajlopez/NodeSamples&lt;/a&gt;    &lt;br /&gt;Mostré un servidor HTTP simplícimo, hello world asincrónico, y dibujar en canvas multiusuario, usando el módulo socket.io    &lt;br /&gt;Mis enlaces: &lt;a href="http://delicious.com/ajlopez/nodejs"&gt;http://delicious.com/ajlopez/nodejs&lt;/a&gt;    &lt;br /&gt;Mis posts: &lt;a href="http://ajlopez.wordpress.com/category/nodejs/"&gt;http://ajlopez.wordpress.com/category/nodejs/&lt;/a&gt; &lt;a href="http://msmvps.com/blogs/lopez/archive/tags/NodeJs/default.aspx"&gt;http://msmvps.com/blogs/lopez/archive/tags/NodeJs/default.aspx&lt;/a&gt;    &lt;br /&gt;En especial:    &lt;br /&gt;Programando Juegos Sociales en Línea (Parte 8) Agregando Node.js    &lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2012/01/12/social_2D00_games_2D00_programming_2D00_part_2D00_8_2D00_adding_2D00_node_2D00_js.aspx"&gt;http://msmvps.com/blogs/lopez/archive/2012/01/12/social_2D00_games_2D00_programming_2D00_part_2D00_8_2D00_adding_2D00_node_2D00_js.aspx&lt;/a&gt;    &lt;br /&gt;AjFabriq en NodeJs (Parte 3) Una aplicación Distribuida Simple    &lt;br /&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2011/09/15/ajfabriq_2D00_on_2D00_nodejs_2D00_part_2D00_3_2D00_a_2D00_distributed_2D00_simple_2D00_application.aspx"&gt;http://msmvps.com/blogs/lopez/archive/2011/09/15/ajfabriq_2D00_on_2D00_nodejs_2D00_part_2D00_3_2D00_a_2D00_distributed_2D00_simple_2D00_application.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Javascript aparece como lenguaje en el lanzamiento del Netscape Navigator de 1995 (éramos tan pobres :-). Fue desarrollado por Brendan Eich &lt;a href="http://en.wikipedia.org/wiki/Brendan_Eich"&gt;http://en.wikipedia.org/wiki/Brendan_Eich&lt;/a&gt; de Netscape, con el nombre Mocha (un gusto de café como también lo es la palabra “java”) y luego LiveScript.    &lt;br /&gt;Node.js es creado por Ryah Dahl de Joyent &lt;a href="http://joyent.com/"&gt;http://joyent.com/&lt;/a&gt; Pueden ver un video de introducción en &lt;a href="http://ajlopez.wordpress.com/2011/10/15/code-snippets-are-for-sissies/"&gt;http://ajlopez.wordpress.com/2011/10/15/code-snippets-are-for-sissies/&lt;/a&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Comentarios:   &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Node.js tiene un REPL (Read Eval Print Loop)    &lt;br /&gt;Corre sobre el motor de Javascript Google V8. Un motor muy rápido, pero orientado a tener un solo thread a nivel de Javascript (en las librerías internas de C usa threads). Node.js entonces implementa servidores (y código general, si uno quiere) que ejecutan un solo thread de Javascript. Con eso evita el problema de programar en múltiples threads. Pero entonces ¿qué ganamos? Todo Node.js (sus funciones de base, los módulos adicionales) se orienta a ejecución asincrónica. Por ejemplo, el thread principal puede pedir una consulta a una base de datos (usando un driver/módulo de Node.Js adecuado) SIN QUEDARSE esperando la respuesta. El thread principal sigue ejecutando. Cuando la consulta de base de datos tiene algún resultado, lo anuncia (en un sistema interno de eventos). El thread principal de Javascript está atendiendo esos eventos. La escalabilidad se logra aprovechando que la entrada/salida (a disco, red, etc.) se puede derivar asincrónicamente, sin ocupar el thread principal. Internamente, usa características de los sistemas operativos (como el soporte de select() en Linux, o los Completion I/O ports de Windows).    &lt;br /&gt;En el ejemplo de dibujo sobre canvas usando socket.io, usamos npm para instalar el módulo:&lt;/p&gt;  &lt;p&gt;&lt;font size="4" face="Consolas"&gt;npm install socket.io&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;desde el directorio Server &lt;/p&gt;  &lt;h3&gt;Scala &lt;/h3&gt;  &lt;p&gt;Sitio: &lt;a href="http://www.scala-lang.org/"&gt;http://www.scala-lang.org/&lt;/a&gt;    &lt;br /&gt;Descripción e Historia: &lt;a href="http://en.wikipedia.org/wiki/Scala_(programming_language)"&gt;http://en.wikipedia.org/wiki/Scala_(programming_language)&lt;/a&gt;    &lt;br /&gt;Download: &lt;a href="http://www.scala-lang.org/downloads"&gt;http://www.scala-lang.org/downloads&lt;/a&gt; yo usé &lt;a href="http://www.scala-lang.org/downloads/distrib/files/scala-2.9.1.final.zip"&gt;http://www.scala-lang.org/downloads/distrib/files/scala-2.9.1.final.zip&lt;/a&gt; lo expandi y agregué el directorio bin al PATH    &lt;br /&gt;Ejemplos: &lt;a href="https://github.com/ajlopez/ProgrammingLanguagesSamples/tree/master/Scala"&gt;https://github.com/ajlopez/ProgrammingLanguagesSamples/tree/master/Scala&lt;/a&gt; Ver los ejemplos de &lt;a href="http://www.scala-lang.org/node/219"&gt;http://www.scala-lang.org/node/219&lt;/a&gt;    &lt;br /&gt;Hola mundo en: &lt;a href="http://www.scala-lang.org/node/166"&gt;http://www.scala-lang.org/node/166&lt;/a&gt;    &lt;br /&gt;Ejemplos avanzados: &lt;a href="http://www.scala-lang.org/node/44"&gt;http://www.scala-lang.org/node/44&lt;/a&gt;    &lt;br /&gt;Actores: &lt;a href="http://www.scala-lang.org/node/242"&gt;http://www.scala-lang.org/node/242&lt;/a&gt;    &lt;br /&gt;El ejemplo ping pong: &lt;a href="http://www.scala-lang.org/node/54"&gt;http://www.scala-lang.org/node/54&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Lo ejecutamos con&lt;/p&gt;  &lt;p&gt;&lt;font size="4" face="Consolas"&gt;scalac pingpong.scala     &lt;br /&gt;scala -cp . examples.actors.pingpong&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Ejemplo de mensajes entre actores: &lt;a href="http://www.scala-lang.org/node/50"&gt;http://www.scala-lang.org/node/50&lt;/a&gt;    &lt;br /&gt;Mis enlaces: &lt;a href="http://www.delicious.com/ajlopez/scala"&gt;http://www.delicious.com/ajlopez/scala&lt;/a&gt;    &lt;br /&gt;Mis posts: &lt;a href="http://ajlopez.wordpress.com/category/scala/"&gt;http://ajlopez.wordpress.com/category/scala/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Comentarios:&lt;/p&gt;  &lt;p&gt;Es multiparadigma (soporta objetos/clases y programación funcional). Lenguaje de autor, creado principalmente por Martin Odersky &lt;a href="http://en.wikipedia.org/wiki/Martin_Odersky"&gt;http://en.wikipedia.org/wiki/Martin_Odersky&lt;/a&gt; Compila a Java y permite reducir la ceremonia (por ejemplo, soporte de declarar directamente un objeto único, sin necesidad de declarar clase). Soporta actores, ejemplo que mostré en la charla. Con actores, Scala evita que el programador tenga que encargarse de los lockeos y manejo de múltiples threads.    &lt;br /&gt;Sobre actores ver: &lt;a href="http://delicious.com/ajlopez/actormodel"&gt;http://delicious.com/ajlopez/actormodel&lt;/a&gt; &lt;a href="http://en.wikipedia.org/wiki/Actor_model"&gt;http://en.wikipedia.org/wiki/Actor_model&lt;/a&gt;    &lt;br /&gt;y también message passing: &lt;a href="http://en.wikipedia.org/wiki/Message_passing"&gt;http://en.wikipedia.org/wiki/Message_passing&lt;/a&gt;    &lt;br /&gt;Ver el proyecto Akka, que extiende Scala a actores distribuidos: &lt;a href="http://akka.io/"&gt;http://akka.io/&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Clojure&lt;/h3&gt;  &lt;p&gt;   &lt;br /&gt;Sitio: &lt;a href="http://clojure.org/"&gt;http://clojure.org/&lt;/a&gt;    &lt;br /&gt;Descripción e Historia: &lt;a href="http://en.wikipedia.org/wiki/Clojure"&gt;http://en.wikipedia.org/wiki/Clojure&lt;/a&gt;    &lt;br /&gt;Download: Ver &lt;a href="http://clojure.org/downloads"&gt;http://clojure.org/downloads&lt;/a&gt; Yo usé &lt;a href="http://repo1.maven.org/maven2/org/clojure/clojure/1.3.0/clojure-1.3.0.zip"&gt;http://repo1.maven.org/maven2/org/clojure/clojure/1.3.0/clojure-1.3.0.zip&lt;/a&gt; y también la versión 1.2.0    &lt;br /&gt;Listas de Correo: &lt;a href="http://groups.google.com/group/clojure"&gt;http://groups.google.com/group/clojure&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Comentarios:&lt;/p&gt;  &lt;p&gt;Vimos cómo Clojure es un dialecto de Lisp, y tiene homoniconicity &lt;a href="http://en.wikipedia.org/wiki/Homoiconicity"&gt;http://en.wikipedia.org/wiki/Homoiconicity&lt;/a&gt; . Compila internamente a Java, y hay una versión para CLR (Common Language Runtime de .NET). Mostré en el ejemplo de Game of Life &lt;a href="http://www.youtube.com/watch?v=CFCYVfApPUc"&gt;http://www.youtube.com/watch?v=CFCYVfApPUc&lt;/a&gt; &lt;a href="http://github.com/sfraser/MultithreadedGameOfLife"&gt;http://github.com/sfraser/MultithreadedGameOfLife&lt;/a&gt; el uso de Software Transactional Memory, ver &lt;a href="http://en.wikipedia.org/wiki/Software_transactional_memory"&gt;http://en.wikipedia.org/wiki/Software_transactional_memory&lt;/a&gt; que es una de las formas que tiene Clojure de “atacar” el problema de la concurrencia.    &lt;br /&gt;Para probar Clojure en línea ver &lt;a href="http://tryclj.com/"&gt;http://tryclj.com/&lt;/a&gt;    &lt;br /&gt;Ver &lt;a href="http://java.ociweb.com/mark/stm/article.html"&gt;http://java.ociweb.com/mark/stm/article.html&lt;/a&gt; sobre STM &lt;/p&gt;  &lt;h3&gt;Erlang &lt;/h3&gt;  &lt;p&gt;Sitio: &lt;a href="http://www.erlang.org/"&gt;http://www.erlang.org/&lt;/a&gt;    &lt;br /&gt;Descripción e Historia: &lt;a href="http://en.wikipedia.org/wiki/Erlang_(programming_language)"&gt;http://en.wikipedia.org/wiki/Erlang_(programming_language)&lt;/a&gt;    &lt;br /&gt;Download: &lt;a href="http://www.erlang.org/download.html"&gt;http://www.erlang.org/download.html&lt;/a&gt; Yo usé &lt;a href="http://www.erlang.org/download/otp_win32_R15B.exe"&gt;http://www.erlang.org/download/otp_win32_R15B.exe&lt;/a&gt;    &lt;br /&gt;Ejemplos: &lt;a href="http://pragprog.com/titles/jaerlang/source_code"&gt;http://pragprog.com/titles/jaerlang/source_code&lt;/a&gt; del libro de Joe Armstrong Programming Erlang &lt;a href="http://pragprog.com/book/jaerlang/programming-erlang"&gt;http://pragprog.com/book/jaerlang/programming-erlang&lt;/a&gt; Ejemplos más sencillos: &lt;a href="https://github.com/ajlopez/ProgrammingLanguagesSamples/tree/master/Erlang"&gt;https://github.com/ajlopez/ProgrammingLanguagesSamples/tree/master/Erlang&lt;/a&gt; a ir actualizando.    &lt;br /&gt;Primeros pasos: &lt;a href="http://www.erlang.org/static/getting_started_quickly.html"&gt;http://www.erlang.org/static/getting_started_quickly.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Comunidad en Argentina: &lt;a href="http://erlang.org.ar/"&gt;http://erlang.org.ar/&lt;/a&gt;    &lt;br /&gt;Lista de Correo de Argentina: &lt;a href="http://erlang.org.ar/ListaDeCorreo"&gt;http://erlang.org.ar/ListaDeCorreo&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Comentarios:&lt;/p&gt;  &lt;p&gt;Vimos que Erlang es un lenguaje funcional: no hay variables, una vez ligada una “variable” a un valor, no se puede modificar. Todas son funciones. Tenemos varios procesos. Vimos el ejemplo key value store (kvs.erl) del libro de Joe Armsgrong. &lt;/p&gt;  &lt;p&gt;Ejecutamos en el REPL erl: &lt;/p&gt;  &lt;p&gt;&lt;font size="3" face="Consolas"&gt;c(kvs).     &lt;br /&gt;kvs:start().      &lt;br /&gt;kvs:store(apple, 10).      &lt;br /&gt;kvs:lookup(apple). &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Luego vimos de lanzar DOS cajas de DOS. En una:&lt;/p&gt;  &lt;p&gt;&lt;font size="3" face="Consolas"&gt;erl -sname galdalf     &lt;br /&gt;c(kvs).      &lt;br /&gt;kvs:start(). &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;en la otra ejecutamos:&lt;/p&gt;  &lt;p&gt;&lt;font size="3" face="Consolas"&gt;erl -sname bilbo     &lt;br /&gt;rpc:call(gandalf@localhost, kvs, store, [apple, 10]).      &lt;br /&gt;rpc:call(gandalf@localhost, kvs, lookup, [apple]). &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Caso de éxito &lt;a href="http://couchdb.apache.org/"&gt;http://couchdb.apache.org/&lt;/a&gt;&amp;#160; NoSQL reescrito en Erlang. &lt;/p&gt;  &lt;p&gt;Post &lt;a href="http://ajlopez.wordpress.com/2011/08/24/erlang-links-news-and-resources-1/"&gt;http://ajlopez.wordpress.com/2011/08/24/erlang-links-news-and-resources-1/&lt;/a&gt;    &lt;br /&gt;Mis enlaces: &lt;a href="http://delicious.com/ajlopez/erlang"&gt;http://delicious.com/ajlopez/erlang&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lambda-the-ultimate.org/node/4453"&gt;http://lambda-the-ultimate.org/node/4453&lt;/a&gt; Long rant on Erlang-style Actors: Lost Dimension &lt;/p&gt;  &lt;p&gt;Vean el lenguaje E:   &lt;br /&gt;&lt;a href="http://erights.org/index.html"&gt;http://erights.org/index.html&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://wiki.erights.org/wiki/Walnut"&gt;http://wiki.erights.org/wiki/Walnut&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://erights.org/talks/thesis/index.html"&gt;http://erights.org/talks/thesis/index.html&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Ruby &lt;/h3&gt;  &lt;p&gt;Sitio: &lt;a href="http://www.ruby-lang.org/en/"&gt;http://www.ruby-lang.org/en/&lt;/a&gt;    &lt;br /&gt;Descripción e Historia: &lt;a href="http://en.wikipedia.org/wiki/Ruby_(programming_language)"&gt;http://en.wikipedia.org/wiki/Ruby_(programming_language)&lt;/a&gt;    &lt;br /&gt;Download: &lt;a href="http://www.ruby-lang.org/en/downloads/"&gt;http://www.ruby-lang.org/en/downloads/&lt;/a&gt; Yo usé &lt;a href="http://rubyinstaller.org/downloads/"&gt;http://rubyinstaller.org/downloads/&lt;/a&gt; Revisar mis posts sobre detalles de instalación importantes, como el DevKit. Y tambien &lt;a href="http://delicious.com/ajlopez/ruby+install"&gt;http://delicious.com/ajlopez/ruby+install&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Mis posts: &lt;a href="http://ajlopez.wordpress.com/category/ruby"&gt;http://ajlopez.wordpress.com/category/ruby&lt;/a&gt; &lt;a href="http://msmvps.com/blogs/lopez/archive/tags/ruby/default.aspx"&gt;http://msmvps.com/blogs/lopez/archive/tags/ruby/default.aspx&lt;/a&gt; donde explico paso a paso instalación de Ruby, Rails, y un primer sitio Rails. Y también mi experiencia en el último Ruby Meetup de Buenos Aires.    &lt;br /&gt;Mis enlaces: &lt;a href="http://delicious.com/ajlopez/ruby"&gt;http://delicious.com/ajlopez/ruby&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Comunidad en Argentina: &lt;a href="http://ruby.com.ar/"&gt;http://ruby.com.ar/&lt;/a&gt;    &lt;br /&gt;Conferencia 2011: &lt;a href="http://rubyconfargentina.org/en"&gt;http://rubyconfargentina.org/en&lt;/a&gt;    &lt;br /&gt;Lista de Correo Argentina, Latinoamérica: &lt;a href="http://groups.google.com/group/rubysur"&gt;http://groups.google.com/group/rubysur&lt;/a&gt;    &lt;br /&gt;Sitio: &lt;a href="http://rubysur.org/"&gt;http://rubysur.org/&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Python &lt;/h3&gt;  &lt;p&gt;Sitio: &lt;a href="http://python.org/"&gt;http://python.org/&lt;/a&gt;    &lt;br /&gt;Descripción e Historia: &lt;a href="http://en.wikipedia.org/wiki/Python_(programming_language)"&gt;http://en.wikipedia.org/wiki/Python_(programming_language)&lt;/a&gt;    &lt;br /&gt;Download: Hay dos versiones, usé &lt;a href="http://python.org/ftp/python/2.7.2/python-2.7.2.msi"&gt;http://python.org/ftp/python/2.7.2/python-2.7.2.msi&lt;/a&gt; y también tenía instalado &lt;a href="http://python.org/ftp/python/3.2.2/python-3.2.2.msi"&gt;http://python.org/ftp/python/3.2.2/python-3.2.2.msi&lt;/a&gt; Pero sólo la última instalación está ligada a ejecutar automáticamente los archivos .py, ver &lt;a href="http://stackoverflow.com/questions/3809314/how-to-install-both-python-2-x-and-python-3-x-in-windows-7"&gt;http://stackoverflow.com/questions/3809314/how-to-install-both-python-2-x-and-python-3-x-in-windows-7&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ejemplos simples: &lt;a href="https://github.com/ajlopez/ProgrammingLanguagesSamples/tree/master/Python"&gt;https://github.com/ajlopez/ProgrammingLanguagesSamples/tree/master/Python&lt;/a&gt;    &lt;br /&gt;Comunidad en Argentina: &lt;a href="http://python.org.ar/pyar/"&gt;http://python.org.ar/pyar/&lt;/a&gt;    &lt;br /&gt;Lista de Correo en Argentina: &lt;a href="http://listas.python.org.ar/listinfo/pyar"&gt;http://listas.python.org.ar/listinfo/pyar&lt;/a&gt;    &lt;br /&gt;Vean el video anunciando la próxima PyCon &lt;a href="http://animoto.com/play/zVp1IGeGaLVKco0FDlwcmA"&gt;http://animoto.com/play/zVp1IGeGaLVKco0FDlwcmA&lt;/a&gt;    &lt;br /&gt;Mostré Django     &lt;br /&gt;&lt;a href="https://www.djangoproject.com/"&gt;https://www.djangoproject.com/&lt;/a&gt;    &lt;br /&gt;&lt;a href="https://docs.djangoproject.com/en/1.3/topics/install/#installing-official-release"&gt;https://docs.djangoproject.com/en/1.3/topics/install/#installing-official-release&lt;/a&gt;    &lt;br /&gt;C:\Software\Django-1.3.1    &lt;br /&gt;&lt;a href="https://docs.djangoproject.com/en/1.3/intro/tutorial01/"&gt;https://docs.djangoproject.com/en/1.3/intro/tutorial01/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ver también   &lt;br /&gt;&lt;a href="http://ironpython.codeplex.com/"&gt;IronPython&lt;/a&gt; (Python running on .NET)    &lt;br /&gt;&lt;a href="http://www.jython.org/%20"&gt;Jython&lt;/a&gt; (Python running on the Java Virtual Machine)    &lt;br /&gt;&lt;a href="http://pypy.org/"&gt;PyPy&lt;/a&gt; (A fast python implementation with a JIT compiler)    &lt;br /&gt;&lt;a href="http://www.stackless.com/%20"&gt;Stackless Python&lt;/a&gt; (Branch of CPython supporting microthreads) &lt;/p&gt;  &lt;p&gt;Ver la implementación web: &lt;a href="http://webpython.codepoint.net/wsgi_tutorial"&gt;http://webpython.codepoint.net/wsgi_tutorial&lt;/a&gt; madre de otras implementaciones como Rack en Ruby, y OWIN en .NET &lt;/p&gt;  &lt;p&gt;Mis enlaces: &lt;a href="http://delicious.com/ajlopez/python"&gt;http://delicious.com/ajlopez/python&lt;/a&gt;    &lt;br /&gt;Mis posts: &lt;a href="http://ajlopez.wordpress.com/category/python/"&gt;http://ajlopez.wordpress.com/category/python/&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Patrones encontrados &lt;/h3&gt;  &lt;p&gt;Existencia de REPL: todos   &lt;br /&gt;Compilación a otro lenguaje: Scala, Clojure, usando la máquina virtual y librerías de clases existentes    &lt;br /&gt;Pasaje de Mensajes: Erlang    &lt;br /&gt;Módulos: todos    &lt;br /&gt;Actores: Scala, algo también en Clojure y Erlang    &lt;br /&gt;Software Transactional Memory: Clojure &lt;/p&gt;  &lt;p&gt;Bueno, espero que les haya dado un panorama de que hay vida más allá de C# y Java ;-)&lt;/p&gt;  &lt;p&gt;Nos leemos! &lt;/p&gt;  &lt;p&gt;Angel “Java” Lopez   &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;    &lt;br /&gt;http://twitter.com/ajlopez&lt;/p&gt;</description></item><item><title>Ruby Meetup Buenos Aires Febrero 2012</title><link>http://msmvps.com/blogs/lopez/archive/2012/02/10/ruby-meetup-buenos-aires-febrero-2012.aspx</link><pubDate>Fri, 10 Feb 2012 06:00:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1805877</guid><dc:creator>lopez</dc:creator><description>&lt;p&gt;Ayer, jueves 9 de Febrero, asist&amp;iacute; a mi primer meetup Ruby de Buenos Aires. Cumpliendo con el &amp;ldquo;mindset&amp;rdquo; toda actividad tiene que tener un &amp;ldquo;outcome&amp;rdquo; consumible, hoy escribo post sobre mi experiencia en la reuni&amp;oacute;n. La comunidad Ruby de Argentina (&lt;a target="_blank" href="http://twitter.com/rubyargentina"&gt;@rubyargentina&lt;/a&gt;) ya hizo varios meetups, me cuentan que desde fines de 2010, y que habr&amp;aacute;n sido como una decena. Tratan de hacerlo mensualmente, excepto en algunos meses de poca actividad (o de mucha, como fue el caso del a&amp;ntilde;o pasado con la Ruby Conf Argentina, primera conferencia de ese tipo en mi pa&amp;iacute;s).&lt;/p&gt;
&lt;p&gt;Esta vez fue anfitri&amp;oacute;n de la meetup Vurbia &lt;a target="_blank" href="http://twitter.com/vurbia"&gt;@Vurbia&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.vurbia.com/lang-en/"&gt;http://www.vurbia.com/lang-en/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ellos proveen soluciones de Infrastructure as a Service, vean&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.vurbia.com/services/xephstratus-managed/solutions"&gt;http://www.vurbia.com/services/xephstratus-managed/solutions&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Por lo que me comentaron, tienen su plataforma propia de virtualizaci&amp;oacute;n, adem&amp;aacute;s de todo un stack de servicios. Me encontr&amp;eacute;, creo que por primera vez, con &lt;a target="_blank" href="http://twitter.com/pemendez"&gt;@pemendez&lt;/a&gt;, no me hab&amp;igrave;a dado cuenta que era vurbiano. Hoy comenc&amp;eacute; a seguir tambi&amp;eacute;n a otra vurbian &lt;a target="_blank" href="http://twitter.com/cbecketts"&gt;@cbecketts&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;El lugar de reuni&amp;oacute;n fueron las oficinas de Vurbia en Guatemala 5000 (esquina Uriarte), en el barrio de Palermo, Buenos Aires. Una esquina excelente, con &amp;aacute;rboles. Nos ubicamos en la terraza, donde ya hab&amp;iacute;a cerveza tirada y cantidades de papas fritas. Yo llegu&amp;eacute; a las 19hs, y ya hab&amp;iacute;a cerca de 10 personas. Se fue llenando, habr&amp;aacute; llegado a hacer 40 o m&amp;aacute;s. Buen atardecer de verano, brisa fresca, &amp;aacute;rboles palermitanos desde la terraza, y cerveza, que mas?&lt;/p&gt;
&lt;p&gt;Al contrario de lo que hab&amp;iacute;a comentado @etagwerker en la &lt;a target="_blank" href="http://groups.google.com/group/rubysur?pli=1"&gt;lista RubySur&lt;/a&gt; no comenz&amp;oacute; puntualmente a las 19hs. Y estuvo bien, con cerveza y papa fritas, hubo intercambio social, conversaciones en grupo, sobre desarrollo, o sobre cualquier otra cosa, desde &amp;ldquo;no me gusta Tandil&amp;rdquo; hasta &amp;ldquo;un compa&amp;ntilde;ero de trabajo subi&amp;oacute; ayer las escaleras del Empire State&amp;quot; :-). Fue tanta gente que no hab&amp;iacute;a sal&amp;oacute;n, oficina para dar una charla, ni tampoco se pudo contar con un proyector. Pero no import&amp;oacute;: lo interesante es que, seg&amp;uacute;n los miembros de la comunidad, esta vez fue la reuni&amp;oacute;n con m&amp;aacute;s gente que tuvieron.&lt;/p&gt;
&lt;p&gt;Yo me hab&amp;iacute;a comprometido a dar una charla t&amp;eacute;cnica sobre AjLisp en Ruby, mi experimento de Ruby, TDD para ir aprendiendo algunas cosas. Como fui el primero de los oradores en llegar, me tocaba primero a m&amp;iacute;. Pero como hab&amp;iacute;a basado mucho de la charla en escribir en el REPL (Read Eval Print Loop) del proyecto, y en ver c&amp;oacute;digo en el editor, decid&amp;iacute; no mencionar mucho del tema. Habr&amp;aacute; sido como a las 20hs que se decidi&amp;oacute; que hab&amp;iacute;a comenzar con las charlas, y se trajo una gran pizarra. Me presentaron, y comenc&amp;eacute; mi charla. Pregunt&amp;eacute; si hab&amp;iacute;a otro orador presente, para saber si ten&amp;iacute;a tiempo para un experimento, y no contest&amp;oacute; nadie. Entonces decid&amp;iacute; que lo mejor era aprovechar la oportunidad, y en vez de hablar de AjLisp con solo la pizarra, ser&amp;iacute;a mejor para todos emplear el tiempo en otra cosa. Me decid&amp;iacute; por preguntar a cada uno de los presentes: nombre, experiencia, y por qu&amp;eacute; su inter&amp;eacute;s en Ruby. Creo que el experimento sali&amp;oacute;bien, y permiti&amp;oacute; que todos nos conoci&amp;eacute;ramos un poco m&amp;aacute;s.&lt;/p&gt;
&lt;p&gt;Resultado: de todo un poco. Hab&amp;iacute;a gente que programaba en Ruby desde hace 8 o m&amp;aacute;s a&amp;ntilde;os, muchos que comenzaron hace 2 o 3 a&amp;ntilde;os, otros que comenzaban reci&amp;eacute;n. Hab&amp;iacute;a empresas unipersonales, y tambi&amp;eacute;n empresas ya con varios desarrolladores. Gente que trabajaba para Argentina, y otros que trabajaban para afuero (creo que mitad y mitad). Dos personas amantes de Ruby. Alguno que pas&amp;oacute; por ASP (no s&amp;eacute; si por ASP o ASP.NET), varios desertores de Java, algunos que trabajon en .NET. Descubr&amp;iacute; las posiciones de algunos miembros de la comunidad respecto a Rails: hay algunos que prefieren otras formas y frameworks para programar web en Ruby. Los m&amp;aacute;s activos miembros de la comunidad son escritores de gemas. Hab&amp;iacute;a dos personas de Mercado Libre, que comentaron su experiencia &amp;ldquo;evangelizando&amp;quot; Ruby internamente, habiendo comenzado con 5 &amp;ldquo;conversos&amp;rdquo; y actualmente llegando a algunas decenas en la gente de QA. Hab&amp;iacute;a dos extranjeros (creo que americanos, uno biling&amp;uuml;e, otro de Nuevo M&amp;eacute;jico s&amp;oacute;lo hablando ingl&amp;eacute;s, ambos muy entusiasmados con la comunidad que encontraron). Hab&amp;iacute;a gente que se lleg&amp;oacute; desde las ciudades de Santa F&amp;eacute; y Rosario. Estaba el CIO de la startup restorando, pueden ver &lt;a href="http://buenos-aires.restorando.com.ar/"&gt;http://buenos-aires.restorando.com.ar/&lt;/a&gt; pero con proyecci&amp;oacute;n a Latinoam&amp;eacute;rica (ah&amp;iacute; est&amp;aacute; el bueno de &lt;a target="_blank" href="http://twitter.com/bilinkis"&gt;@bilinkis&lt;/a&gt;). Es una implementaci&amp;oacute;n, que por lo que comentaron, tiene como referente al americano Open table &lt;a href="http://www.opentable.com/"&gt;http://www.opentable.com/&lt;/a&gt;. Cuando ya est&amp;aacute;bamos en este ejercicio, llego &lt;a target="_blank" href="http://twitter.com/etagwerker"&gt;@etagwerker&lt;/a&gt; que est&amp;aacute; trabajando en Ruby en su lean startup &lt;a href="http://www.ombushop.com/"&gt;http://www.ombushop.com/&lt;/a&gt;. Es interesante ver que hab&amp;iacute;a muchos que estaban trabajando en su propia empresa: no sabr&amp;iacute;a poner un porcentaje, pero me pareci&amp;oacute; mayor que el que encuentro en otras comunidades, como Smalltalk o ALT.NET Hispano.&lt;/p&gt;
&lt;p&gt;Al fin, me lleg&amp;oacute; el turno de presentarme, coment&amp;eacute; &lt;a target="_blank" href="http://msmvps.com/blogs/lopez/archive/2008/07/04/el-origen-de-mi-nickname.aspx"&gt;el origen de mi nickname&lt;/a&gt;, y de la cantidad de tecnolog&amp;iacute;as que tuve que ver. Describ&amp;iacute; que mi inter&amp;eacute;s en Ruby es una extensi&amp;oacute;n de mi inter&amp;eacute;s en los lenguajes de programaci&amp;oacute;n. Me hicieron preguntas sobre AjLisp, que derivaron tambi&amp;eacute;n en explicar c&amp;oacute;mo Ruby me interesa por ser extensi&amp;oacute;n (o al menos, basado en) lenguajes como Smalltalk y Lisp. Pero mi respuesta, algo larga, dar&amp;iacute;a para otro post, prometo escribirlo :-)&lt;/p&gt;
&lt;p&gt;Como saben los que me siguen por twitter, cuando uno est&amp;aacute; m&amp;aacute;s cerca del arpa que de la guitarra, trata de organizar su tiempo. As&amp;iacute; que me hab&amp;iacute;a reservado hasta las 21hs estar en la meetup. A las 21:05 comenz&amp;oacute; una divertida charla, a cargo de Leandro Marcucci, ver &lt;a href="https://github.com/leanucci"&gt;https://github.com/leanucci&lt;/a&gt;, sobre su gema &lt;a href="https://github.com/vurbia/Bravo"&gt;https://github.com/vurbia/Bravo&lt;/a&gt; as&amp;iacute; que me qued&amp;eacute; hasta las 21:30. Vean el repositorio de la gema, no quiero escribir ac&amp;aacute;, me da cosita, porque trata de temas impositivos de Argentina :-) Pero hab&amp;iacute;a por lo menos dos grupos m&amp;aacute;s que tambi&amp;eacute;n hab&amp;iacute;an desarrollado ese tipo de acceso a servicios del gobierno en Ruby, y por lo menos uno m&amp;aacute;s que lo hab&amp;iacute;a hecho en .NET. Leandro fue el encargado de atendernos, y estuvo toda la reuni&amp;oacute;n subiendo y bajando las escaleras para poder abrir la puerta a la gente que llegaba a la meetup.&lt;/p&gt;
&lt;p&gt;La gente sigui&amp;oacute; con la reuni&amp;oacute;n (creo que hab&amp;iacute;a una charla de Amazon Web Services desde Ruby), pero ya no estuve, as&amp;iacute; que no tengo m&amp;aacute;s info sobre la reuni&amp;oacute;n. Si me acuerdo de algo m&amp;aacute;s (ah, s&amp;iacute;, rifaron una remera de GitHub, creo), escribo por ac&amp;aacute;.&lt;/p&gt;
&lt;p&gt;Agradezco a la gente de Vurbia y de la comunidad de Ruby por haberla organizado, muy buena onda, cerveza con papa fritas, y good show! &lt;/p&gt;
&lt;p&gt;Nos leemos!&lt;/p&gt;
&lt;p&gt;Angel &amp;ldquo;Java&amp;rdquo; Lopez   &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;    &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Ruby on Rails, Aplicaci&amp;#243;n de Demo (1) Creando la Aplicaci&amp;#243;n</title><link>http://msmvps.com/blogs/lopez/archive/2012/02/09/ruby_2D00_on_2D00_rails_2D00_demo_2D00_application_2D00_1_2D00_creating_2D00_the_2D00_application.aspx</link><pubDate>Thu, 09 Feb 2012 06:00:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1805837</guid><dc:creator>lopez</dc:creator><description>&lt;p&gt;Ya estuve escribiendo una serie de posts sobre mi experiencia en el pasado Ruby Fun Day en Buenos Aires:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2011/11/08/mi-d-237-a-en-el-ruby-fun-day-1-la-history-de-stephen-anderson.aspx"&gt;Mi Día en el Ruby Fun Day&lt;/a&gt; con &lt;a href="http://twitter.com/bendycode"&gt;@bendycode&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Ahora quiero comenzar a pasar en limpio mis pasos de aprendizaje estudiando el capítuylo 2 del libro de&amp;#160; &lt;a href="http://www.michaelhartl.com/"&gt;Michael Hartl&lt;/a&gt; : &lt;a href="http://ruby.railstutorial.org/ruby-on-rails-tutorial-book"&gt;Ruby on Rails Tutorial: Learn from Example&lt;/a&gt;. Yo estoy siguiéndolo con la versión 3 de Ruby on Rails.&lt;/p&gt;  &lt;p&gt;Ya había instalado Ruby en mi máquina Windows, usando &lt;a href="http://rubyinstaller.org/"&gt;http://rubyinstaller.org/&lt;/a&gt; (otras opciones en &lt;a href="http://www.ruby-lang.org/en/downloads/"&gt;http://www.ruby-lang.org/en/downloads/&lt;/a&gt;). En Windows, debemos instalar también DevKit (un “minimalist GNU for windows” (mingw)). Vean la página de Ruby Installer para el enlace de bajada. Las instrucciones para instalarlo están en &lt;a title="http://github.com/oneclick/rubyinstaller/wiki/Development-Kit" href="http://github.com/oneclick/rubyinstaller/wiki/Development-Kit"&gt;http://github.com/oneclick/rubyinstaller/wiki/Development-Kit&lt;/a&gt;. (&lt;a href="http://msmvps.com/blogs/lopez/archive/2011/11/14/mi-d-237-a-en-el-ruby-fun-day-3-creando-una-aplicaci-243-n-rails-3.aspx"&gt;otros detalles&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;Luego de todo eso, ejecuté el comando para instalar rails, en cualquier command prompt:&lt;/p&gt;  &lt;p&gt;&lt;font size="3" face="Consolas"&gt;gem install rails&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;lo que instala Ruby on Rails, el framework de desarrollo de sitios web escrito en Ruby. Vean que es una gema (gem) que se instala como cualquier otra estando en línea. Ahora vamos a un directorio de trabajo (en mi caso c:\Git), donde ejecutamos&lt;/p&gt;  &lt;p&gt;&lt;font size="3" face="Consolas"&gt;rails&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Salida:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/rubyfunday11.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;Luego ejecuté&lt;/p&gt;  &lt;p&gt;&lt;font size="3" face="Consolas"&gt;rails new RailsDemoApp&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;con salida:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/rails01.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;Eso crea un nuevo directorio, me cambio a ese:&lt;/p&gt;  &lt;p&gt;&lt;font size="3" face="Consolas"&gt;cd RailsDemoApp&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Este es el árbol de directorios que tengo:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/rubyfunday20.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;Ruby maneja gemas (paquetes a instalar). Como vimos, Rails mismo es una gema. Y una aplicación Rails, como la recién creada, tiene un archivo GemFile donde se especifican las gemas que esta nueva aplicación necesita. Es usual entonces apelar a un programa que revisa ese archivo e instala cualquier gema que se necesite y no esté instalada. Ejecuto:&lt;/p&gt;  &lt;p&gt;&lt;font size="3" face="Consolas"&gt;bundle install&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Bundle es el nuevo instalador de paquetes que usa Ruby on Rails 3. Lee el archivo GemFile e instala (en el directorio de Ruby, en nuestra máquina, no en el directorio de la aplicació) las gemas que necesite. Ahora podemos ejecutar:&lt;/p&gt;  &lt;p&gt;&lt;font size="3" face="Consolas"&gt;bundle show&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/rails02.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;Configuré el directorio actual (Git\RailsDemoApp) para que sea un repositorio Git:&lt;/p&gt;  &lt;p&gt;&lt;font size="3" face="Consolas"&gt;git init      &lt;br /&gt;git add .       &lt;br /&gt;git commit –m “Initial Commit”&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Agregué un nuevo repositorio en mi cuenta de GitHub usando &lt;a title="https://github.com/repositories/new" href="https://github.com/repositories/new"&gt;https://github.com/repositories/new&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/rails03.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;El nuevo repo: &lt;a href="https://github.com/ajlopez/RailsDemoApp"&gt;https://github.com/ajlopez/RailsDemoApp&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Lo agregué como repositorio remoto a mi repo local, y envié lo que tengo a GitHub:&lt;/p&gt;  &lt;p&gt;&lt;font size="3" face="Consolas"&gt;git remote add origin &lt;/font&gt;&lt;a href="mailto:git@github.com:ajlopez/RailsDemoApp.git"&gt;&lt;font size="3" face="Consolas"&gt;git@github.com:ajlopez/RailsDemoApp.git&lt;/font&gt;&lt;/a&gt;     &lt;br /&gt;&lt;font size="3" face="Consolas"&gt;git push origin master&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Ya desde la instalación de bundle, podemos lanzar el servidor con&lt;/p&gt;  &lt;p&gt;&lt;font size="3" face="Consolas"&gt;rails server&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;o en su forma corta&lt;/p&gt;  &lt;p&gt;&lt;font size="3" face="Consolas"&gt;rails s&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Veo el resultado en &lt;a href="http://localhost:3000"&gt;http://localhost:3000&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/rubyfunday28.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;Próximos pasos, para siguientes posts: agregar un modelo simple (usuarios, y microposts, con relación uno a varios), base de datos, vistas, controladores, “scaffolding”, y despliegue en Heroku. El Scaffolding (generació de código para CRUD) será la aproximación a usar en los próximos posts, como en el libro de Hartl, pero despues me gustaría escribir sobre cómo construir un sitio Rails paso a paso, como hace el mismo Hartl a partir del capítulo 3 de su libro.&lt;/p&gt;  &lt;p&gt;Nos leemos!&lt;/p&gt;  &lt;p&gt;Angel “Java” Lopez    &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Mi D&amp;#237;a en el Ruby Fun Day (7) Primer Modelo</title><link>http://msmvps.com/blogs/lopez/archive/2012/02/04/mi-d-237-a-en-el-ruby-fun-day-7-primer-modelo.aspx</link><pubDate>Sat, 04 Feb 2012 06:00:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1805632</guid><dc:creator>lopez</dc:creator><description>&lt;p&gt;&lt;a href="http://msmvps.com/blogs/lopez/archive/2011/11/25/mi-d-237-a-en-el-ruby-fun-day-6-rake-y-bundler.aspx"&gt;Anterior Post&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Una de las grandes “features” de Rails es poder generar código, definiendo un modelo simple. En el curso decidimos implementar una lista de charlas, con oradores. Para Orador, definimos modelo Speaker y se generó código con:&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/rubyfunday34.png" alt="" /&gt; &lt;/p&gt;  &lt;p&gt;La clave es la opción &lt;strong&gt;generate&lt;/strong&gt; del comando &lt;strong&gt;rails&lt;/strong&gt;. Con esa opción se pueden generar distintos archivos de texto, con &lt;strong&gt;scaffold&lt;/strong&gt; genera los controladores, vistas, y modelos, con acceso a datos, de un modelo simple. El modelo se describe con &lt;strong&gt;Speaker name:string&lt;/strong&gt; (se pueden poner más campos de distintos tipos).&lt;/p&gt;  &lt;p&gt;Generó varios archivos, como &lt;strong&gt;app/models/speaker.rb&lt;/strong&gt;:&lt;/p&gt;  &lt;pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Speaker &amp;lt; ActiveRecord::Base&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;O el controlador app/controllers/speakers_controller.rb:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; SpeakersController &amp;lt; ApplicationController
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#008000;"&gt;# GET /speakers&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#008000;"&gt;# GET /speakers.json&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#0000ff;"&gt;def&lt;/span&gt; index
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    @speakers = Speaker.all
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    respond_to &lt;span style="color:#0000ff;"&gt;do&lt;/span&gt; |&lt;span style="color:#00008b;"&gt;format&lt;/span&gt;|
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;      &lt;span style="color:#00008b;"&gt;format&lt;/span&gt;.html &lt;span style="color:#008000;"&gt;# index.html.erb&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;      &lt;span style="color:#00008b;"&gt;format&lt;/span&gt;.json { render json: @speakers }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#008000;"&gt;# GET /speakers/1&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#008000;"&gt;# GET /speakers/1.json&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#0000ff;"&gt;def&lt;/span&gt; show
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    @speaker = Speaker.find(params[:id])
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    respond_to &lt;span style="color:#0000ff;"&gt;do&lt;/span&gt; |&lt;span style="color:#00008b;"&gt;format&lt;/span&gt;|
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;      &lt;span style="color:#00008b;"&gt;format&lt;/span&gt;.html &lt;span style="color:#008000;"&gt;# show.html.erb&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;      &lt;span style="color:#00008b;"&gt;format&lt;/span&gt;.json { render json: @speaker }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#008000;"&gt;# GET /speakers/new&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#008000;"&gt;# GET /speakers/new.json&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#0000ff;"&gt;def&lt;/span&gt; new
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    @speaker = Speaker.new
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    respond_to &lt;span style="color:#0000ff;"&gt;do&lt;/span&gt; |&lt;span style="color:#00008b;"&gt;format&lt;/span&gt;|
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;      &lt;span style="color:#00008b;"&gt;format&lt;/span&gt;.html &lt;span style="color:#008000;"&gt;# new.html.erb&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;      &lt;span style="color:#00008b;"&gt;format&lt;/span&gt;.json { render json: @speaker }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#008000;"&gt;# GET /speakers/1/edit&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#0000ff;"&gt;def&lt;/span&gt; edit
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    @speaker = Speaker.find(params[:id])
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#008000;"&gt;# POST /speakers&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#008000;"&gt;# POST /speakers.json&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#0000ff;"&gt;def&lt;/span&gt; create
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    @speaker = Speaker.new(params[:speaker])
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    respond_to &lt;span style="color:#0000ff;"&gt;do&lt;/span&gt; |&lt;span style="color:#00008b;"&gt;format&lt;/span&gt;|
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;      &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; @speaker.save
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#00008b;"&gt;format&lt;/span&gt;.html { redirect_to @speaker, notice: &amp;#39;Speaker was successfully created.&amp;#39; }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#00008b;"&gt;format&lt;/span&gt;.json { render json: @speaker, status: :created, location: @speaker }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;      &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#00008b;"&gt;format&lt;/span&gt;.html { render action: &amp;quot;&lt;span style="color:#8b0000;"&gt;new&lt;/span&gt;&amp;quot; }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#00008b;"&gt;format&lt;/span&gt;.json { render json: @speaker.errors, status: :unprocessable_entity }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;      &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#008000;"&gt;# PUT /speakers/1&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#008000;"&gt;# PUT /speakers/1.json&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#0000ff;"&gt;def&lt;/span&gt; update
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    @speaker = Speaker.find(params[:id])
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    respond_to &lt;span style="color:#0000ff;"&gt;do&lt;/span&gt; |&lt;span style="color:#00008b;"&gt;format&lt;/span&gt;|
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;      &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; @speaker.update_attributes(params[:speaker])
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#00008b;"&gt;format&lt;/span&gt;.html { redirect_to @speaker, notice: &amp;#39;Speaker was successfully updated.&amp;#39; }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#00008b;"&gt;format&lt;/span&gt;.json { head :ok }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;      &lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#00008b;"&gt;format&lt;/span&gt;.html { render action: &amp;quot;&lt;span style="color:#8b0000;"&gt;edit&lt;/span&gt;&amp;quot; }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;        &lt;span style="color:#00008b;"&gt;format&lt;/span&gt;.json { render json: @speaker.errors, status: :unprocessable_entity }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;      &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#008000;"&gt;# DELETE /speakers/1&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#008000;"&gt;# DELETE /speakers/1.json&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#0000ff;"&gt;def&lt;/span&gt; destroy
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    @speaker = Speaker.find(params[:id])
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    @speaker.destroy
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    respond_to &lt;span style="color:#0000ff;"&gt;do&lt;/span&gt; |&lt;span style="color:#00008b;"&gt;format&lt;/span&gt;|
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;      &lt;span style="color:#00008b;"&gt;format&lt;/span&gt;.html { redirect_to speakers_url }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;      &lt;span style="color:#00008b;"&gt;format&lt;/span&gt;.json { head :ok }
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Y distintas vistas en app/views/speakers como index.html.erb:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;h1&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Listing speakers&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;h1&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;table&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;tr&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;th&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;Name&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;th&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;th&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;th&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;th&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;th&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;th&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;th&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;tr&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;% @speakers.each do |speaker| %&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;tr&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;td&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;%= speaker.name %&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;td&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;td&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;%= link_to &amp;#39;Show&amp;#39;, speaker %&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;td&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;td&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;%= link_to &amp;#39;Edit&amp;#39;, edit_speaker_path(speaker) %&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;td&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;td&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;%= link_to &amp;#39;Destroy&amp;#39;, speaker, confirm: &amp;#39;Are you sure?&amp;#39;, method: :delete %&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;td&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;tr&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;% end %&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;table&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;br&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;%= link_to &amp;#39;New Speaker&amp;#39;, new_speaker_path %&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Luego, levantamos el servidor de nuevo con:&lt;/p&gt;

&lt;p&gt;&lt;font size="3"&gt;rails server&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;Levanta el servidor como antes, pero si navegamos a &lt;a href="http://localhost:3000/speakers"&gt;http://localhost:3000/speakers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/rubyfunday35.png" alt="" /&gt; &lt;/p&gt;

&lt;p&gt;Resulta que se generó código para soportar una lista de oradores, y una tabla de oradores en la base de datos, pero esta última todavía está vacía, sin la tabla correspondiente. El generador de código de Rails se encargó de dejar también los comandos de actualización de la base. Ejecutamos:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/rubyfunday36.png" alt="" /&gt; &lt;/p&gt;

&lt;p&gt;Vean que crea la tabla de Speakers (ver el directorio db/migrate donde quedó un archivo que define el paso 20111218214020_create_speakers.rb:&lt;/p&gt;

&lt;pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; CreateSpeakers &amp;lt; ActiveRecord::Migration
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#0000ff;"&gt;def&lt;/span&gt; change
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    create_table :speakers &lt;span style="color:#0000ff;"&gt;do&lt;/span&gt; |t|
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;      t.string :name&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;      
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;      t.timestamps
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;    &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;  &lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;
&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;span style="color:#0000ff;"&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;pre style="background-color:#ffffff;margin:0em;width:100%;font-family:consolas,&amp;#39;Courier New&amp;#39;,courier,monospace;font-size:12px;"&gt;&lt;/pre&gt;&lt;/pre&gt;

&lt;p&gt;Noten que el nombre del archivo tiene la fecha/hora de creación, para luego reproducir en orden los comandos contra la base de datos para que ésta quede actualizada. Ahora, navegamos de nuevo a &lt;a href="http://localhost:3000/speakers"&gt;http://localhost:3000/speakers&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/rubyfunday38.png" alt="" /&gt; &lt;/p&gt;

&lt;p&gt;Puedo dar de alta un orador:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/rubyfunday40.png" alt="" /&gt; &lt;/p&gt;

&lt;p&gt;Y el resultado es:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.ajlopez.com/images/articles2/rubyfunday39.png" alt="" /&gt; &lt;/p&gt;

&lt;p&gt;Bien! Ya tenemos nuestro primer modelo simple, y las páginas (noten las URLs que se formaron) para manejarlo.&lt;/p&gt;

&lt;p&gt;Próximos temas: extendiendo el modelo, relaciones uno a varios, desplegando en Heroku.&lt;/p&gt;

&lt;p&gt;Nos leemos!&lt;/p&gt;

&lt;p&gt;Angel “Java” Lopez
  &lt;br /&gt;&lt;a href="http://www.ajlopez.com"&gt;http://www.ajlopez.com&lt;/a&gt;

  &lt;br /&gt;&lt;a href="http://twitter.com/ajlopez"&gt;http://twitter.com/ajlopez&lt;/a&gt;&lt;/p&gt;</description></item></channel></rss>