<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4648270806411404400</id><updated>2011-07-25T14:09:01.490+02:00</updated><category term='ruby'/><category term='xml'/><category term='yield'/><category term='fichero'/><category term='atributos'/><category term='super'/><category term='IO'/><category term='iteradores'/><category term='metodos'/><category term='licencias'/><category term='programacion'/><category term='hpricot'/><category term='ensure'/><category term='clases'/><category term='excepcion'/><category term='orientacion objetos'/><category term='bloques'/><category term='builder'/><category term='portales 2.0'/><category term='foro ruby'/><category term='propiedades'/><category term='ruby on rails'/><category term='rails scaffolding'/><category term='raise'/><category term='comunidad'/><category term='web 2.0'/><category term='software'/><category term='rss'/><category term='rails'/><category term='structs'/><category term='clase'/><category term='open'/><category term='rescue'/><category term='framework'/><category term='expresiones'/><category term='herencia'/><category term='mashup'/><category term='file'/><category term='asignacion paralela'/><title type='text'>             Curso Web 2.0 y RoR</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://cursoruby.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://cursoruby.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Eduardo Fernández</name><uri>http://www.blogger.com/profile/12716448476266383515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>22</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4648270806411404400.post-8284645150305623239</id><published>2008-01-02T00:55:00.000+01:00</published><updated>2008-01-02T00:59:33.901+01:00</updated><title type='text'>Despedida del Curso</title><content type='html'>Hola a todos,&lt;br /&gt;&lt;br /&gt;espero que no os hayais olvidado de este blog y que al menos dejeis algun comentario para no perder el contacto, pues sinceramente hemos tenido un buen rollo entre nosotros y eso deberiamos de intentar mantenerlo.&lt;br /&gt;&lt;br /&gt;Yo propongo otra cena-pincheo para reunirnos y que vallamos todos, aun si ocurren adversidades con los autobuses ;) .&lt;br /&gt;&lt;br /&gt;Saludos a todos, feliz año nuevo !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4648270806411404400-8284645150305623239?l=cursoruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cursoruby.blogspot.com/feeds/8284645150305623239/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4648270806411404400&amp;postID=8284645150305623239' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/8284645150305623239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/8284645150305623239'/><link rel='alternate' type='text/html' href='http://cursoruby.blogspot.com/2008/01/despedida-del-curso.html' title='Despedida del Curso'/><author><name>kahuna</name><uri>http://www.blogger.com/profile/03247940468056353606</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4648270806411404400.post-1344670459629581785</id><published>2007-12-22T12:14:00.000+01:00</published><updated>2007-12-22T12:15:51.976+01:00</updated><title type='text'>FELIZ NAVIDAD</title><content type='html'>Feliz Navidad a todos desde el curso RoR&lt;br /&gt;******************************************************&lt;br /&gt;&lt;br /&gt;Nos vemos el miercoles. Que Papa Noel se porte bien con tod@s&lt;br /&gt;&lt;br /&gt;;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4648270806411404400-1344670459629581785?l=cursoruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cursoruby.blogspot.com/feeds/1344670459629581785/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4648270806411404400&amp;postID=1344670459629581785' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/1344670459629581785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/1344670459629581785'/><link rel='alternate' type='text/html' href='http://cursoruby.blogspot.com/2007/12/feliz-navidad.html' title='FELIZ NAVIDAD'/><author><name>lauritass</name><uri>http://www.blogger.com/profile/15786479047027878082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://www.connectedconcepts.net/photos/tgrsp535.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4648270806411404400.post-5039745644658156194</id><published>2007-12-12T12:48:00.000+01:00</published><updated>2007-12-12T13:13:22.341+01:00</updated><title type='text'>Active Record</title><content type='html'>&lt;p class="MsoNormal"&gt;&lt;span style="font-weight: bold;"&gt;Introducción :&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;Active Record es la capa que proporciona rails para implementar el patron ORM. La implementación de Active Record se caracteriza, como casi todo en rails, en la convención, &lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;Por ejemplo, si tenemos un modelo 'Ciudad', existe una tabla en base de datos cuyo nombre es la pluralización del nombre del modelo 'ciudades'.&lt;/p&gt;      &lt;p class="MsoNormal" style=""&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Definición del Patrón ORM :&lt;/span&gt;&lt;span style="" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=""&gt; &lt;/span&gt;“Un objeto que reprensenta una fila de una tabla o vista de base de datos, encapsula el acceso a la base y añade lógica del dominio sobre esos datos.”&lt;/p&gt;  &lt;!--[if !supportLists]--&gt;Para implementar el patrón se deben seguir ciertos pasos:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Las tablas se representan mediante clases&lt;/li&gt;&lt;li&gt;Un objeto representa una fila de la tabla&lt;/li&gt;&lt;li&gt;Un atributo del objeto representa una columna&lt;/li&gt;&lt;li&gt;La clase debe tener métodos para insertar, actualizar y borrar una fila desde un objeto o bien crear un objeto a partir de una fila.&lt;/li&gt;&lt;/ol&gt;&lt;!--[endif]--&gt;&lt;!--[if !supportLists]--&gt;&lt;!--[endif]--&gt;&lt;!--[if !supportLists]--&gt;&lt;!--[endif]--&gt;&lt;!--[if !supportLists]--&gt;&lt;!--[endif]--&gt;&lt;!--[if !supportLists]--&gt;&lt;!--[endif]--&gt;          &lt;p class="MsoNormal" style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="font-weight: bold;"&gt;Migraciones:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 36pt; text-indent: -18pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Las migraciones cambian el estado del esquema de la base de datos. &lt;/li&gt;&lt;li&gt;Con ellas podemos crear o borrar tablas, añadir columnas o eliminarlas, renombrar el tipo de una columna... La consulta sql necesaria para ejecutar la operación la genera ActiveRecord por nosotros. &lt;/li&gt;&lt;li&gt;Esto se consigue construyendo una clase que herede de ActiveRecord::Migration.  &lt;/li&gt;&lt;li&gt;Básicamente se necesita implementar 2 métodos de clase: up y down&lt;/li&gt;&lt;li&gt;El méto up se ejecuta cuando estamos migrando 'hacia adelante' y el down cuando migramos 'hacia atrás'&lt;/li&gt;&lt;/ol&gt;&lt;p class="MsoNormal" style="margin-left: 36pt; text-indent: -18pt;"&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;Tipos de migraciones de modificación de tablas y columnas:&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left: 72pt; text-indent: -54pt;"&gt;&lt;!--[if !supportLists]--&gt;&lt;span style=""&gt;&lt;span style=""&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Operaciones con tablas: create_table , remove_table , rename_table&lt;/li&gt;&lt;li&gt;Operaciones con columnas:  add_column, remove_column , rename_column, etc&lt;/li&gt;&lt;li&gt;Opciones : :null =&gt;true or false , :limit =&gt; tamaño , :default =&gt; value&lt;/li&gt;&lt;/ol&gt;&lt;p class="MsoNormal" style="margin-left: 72pt; text-indent: -54pt;"&gt;&lt;span style="" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;      &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-GB"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;Rails asume por defecto que todas las tablas tienen una clave primaria numérica llamada por convención id.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;br /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;span style="font-weight: bold;"&gt;Crear y buscar registros (ejemplo):&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;span style="font-family:courier new;"&gt;def crear_ciudad&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"  style="font-family:courier new;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;ciudad = Ciudad.new&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"  style="font-family:courier new;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;span style="font-family: courier new;"&gt;ciudad.nombre = 'Gijón'&lt;/span&gt;&lt;/p&gt;  &lt;p style="font-family: courier new;font-family:courier new;" class="MsoNormal" &gt;&lt;span style=""&gt;  &lt;/span&gt;ciudad.habitantes = 300000&lt;/p&gt;  &lt;p style="font-family: courier new;font-family:courier new;" class="MsoNormal" &gt;&lt;span style=""&gt;  &lt;/span&gt;ciudad.provincia = 'Asturias'&lt;/p&gt;  &lt;p style="font-family: courier new;font-family:courier new;" class="MsoNormal" &gt;&lt;span style=""&gt;  &lt;/span&gt;ciudad.save&lt;/p&gt;  &lt;p style="font-family: courier new;font-family:courier new;" class="MsoNormal" &gt;end&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;#Se creará el registro en la base de datos, con id = 1&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"  style="font-family:courier new;"&gt;def busca_ciudad_por_id&lt;/p&gt;  &lt;p class="MsoNormal"  style="font-family:courier new;"&gt;&lt;span style=""&gt;  &lt;/span&gt;gijon = Ciudad.find(1)‏&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-GB"&gt;&lt;span style="font-family:courier new;"&gt;end&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p style="font-weight: bold;" class="MsoNormal"&gt;&lt;br /&gt;&lt;br /&gt;Más opciones del find:&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;:order -&gt; Permite especificar el campo por el que se ordenarán los resultados&lt;/p&gt;  &lt;p class="MsoNormal"&gt;:limit -&gt; Indicar el máximo número de registros que devolverá la consulta&lt;/p&gt;  &lt;p class="MsoNormal"&gt;:joins -&gt; Para construir la consulta con inner joins&lt;/p&gt;  &lt;p class="MsoNormal"&gt;:select -&gt; Especifica los campos que se van a incluir en la consulta. &lt;span style="" lang="EN-GB"&gt;Por defecto *&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-GB"&gt;:from, :group, :having, :distinct, :lock ...&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="font-weight: bold;"&gt;Ejemplo :&lt;/span&gt; &lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;span style="font-family:courier new;"&gt;def busqueda_con_opciones&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"  style="font-family:courier new;"&gt;&lt;span style=""&gt;  &lt;/span&gt;ciudades = Ciudad.find :all, :select =&gt; 'nombre', :from =&gt; 'ciuadades',&lt;span style=""&gt;  &lt;/span&gt;:limit =&gt; 10, :order =&gt; 'habitantes desc', &lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-GB"&gt;&lt;span style="font-family:courier new;"&gt;end&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;      &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-GB"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Actualizar y guardar registros :&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-GB"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;Para actualizar una fila de la bbdd, podemos usar los métodos save, update, update_attribute, o update_attributes.&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;span style="font-family:courier new;"&gt;def ejemplo_save&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"  style="font-family:courier new;"&gt;&lt;span style=""&gt;  &lt;/span&gt;ciudad = Ciudad.find :first&lt;/p&gt;  &lt;p class="MsoNormal"  style="font-family:courier new;"&gt;&lt;span style=""&gt;  &lt;/span&gt;ciudad.habitantes += 1000&lt;/p&gt;  &lt;p class="MsoNormal"  style="font-family:courier new;"&gt;&lt;span style=""&gt;  &lt;/span&gt;ciudad.save&lt;/p&gt;  &lt;p style="font-family: courier new;" face="courier new" class="MsoNormal"&gt;end&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;def ejemplo_update_attributes&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"  style="font-family:courier new;"&gt;&lt;span style=""&gt;  &lt;/span&gt;ciudad = ciudad.find :first&lt;/p&gt;  &lt;p class="MsoNormal"  style="font-family:courier new;"&gt;&lt;span style=""&gt; &lt;/span&gt;ciudad.update_attributes :nombre =&gt; 'otro nombre', :habitantes =&gt; 500, :provincia =&gt; 'León'&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-GB"&gt;&lt;span style="font-family:courier new;"&gt;end&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-GB"&gt;&lt;span style="font-weight: bold;"&gt;Borrar registros:&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;Para actualizar una fila de la bbdd, se nos ofrecen los métodos delete, destroy. Se les pueden pasar condiones si terminan en _all&lt;/p&gt;    &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;span style="font-family:courier new;"&gt;def ejemplo_destroy&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"  style="font-family:courier new;"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;span style="font-family: courier new;"&gt;ciudad = Ciudad.find :first&lt;/span&gt;&lt;/p&gt;  &lt;p style="font-family: courier new;font-family:courier new;" class="MsoNormal" &gt;&lt;span style=""&gt;  &lt;/span&gt;ciudad.destroy&lt;/p&gt;  &lt;p style="font-family: courier new;font-family:courier new;" class="MsoNormal" &gt;&lt;span style="" lang="EN-GB"&gt;end&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="font-family: courier new;" class="MsoNormal" face="courier new"&gt;&lt;span style="" lang="EN-GB"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;br /&gt;def ejemplo_destroy_all&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" face="courier new"&gt;&lt;span style="" lang="EN-GB"&gt;&lt;span style="font-family: courier new;"&gt;  &lt;/span&gt;&lt;span style="font-family: courier new;"&gt;ciudad.find :first&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="font-family: courier new;"&gt;&lt;span style="" lang="EN-GB"&gt;&lt;span style=""&gt;  &lt;/span&gt;&lt;/span&gt;limite_habitantes = 100&lt;/p&gt;  &lt;p class="MsoNormal" style="font-family: courier new;"&gt;&lt;span style=""&gt;  &lt;/span&gt;ciudad.destroy_all([habitantes &lt; ?,limite_habitantes])‏&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="" lang="EN-GB"&gt;&lt;span style="font-family:courier new;"&gt;end&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="" lang="EN-GB"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Curiosidades: &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;    &lt;ul&gt;&lt;li&gt;&lt;span style="" lang="EN-GB"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;span style="font-style: italic;"&gt;Diferencia entre find y find_by_id:&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p class="MsoNormal"&gt;La diferencia básica es que el find lanza una excepción (que deberíamos capturar) si no encuentra el registro, mientras que find_by_id (o cualquier buscador dinámico) devuelve nil o [] si no encuentra nada.&lt;/p&gt;    &lt;ul&gt;&lt;li&gt;&lt;span style="" lang="EN-GB"&gt;&lt;span style="font-style: italic;"&gt;Diferencias entre Save, save!, create,create!, update_attributes y update_attributes! :&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;      &lt;p class="MsoNormal"&gt;Las que no terminan con ! devuelven true o false, segun se haya guardado correctamente en base de datos o no. Es tarea del programador ocuparse (o no) de lo que pasa con la base de datos.&lt;br /&gt;&lt;o:p&gt;&lt;/o:p&gt;Las que terminan en ! lanzan una excepción si no se guarda correctamente en la base de datos. &lt;span style="" lang="EN-GB"&gt;Esto es ideal para las traasacciones.&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4648270806411404400-5039745644658156194?l=cursoruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cursoruby.blogspot.com/feeds/5039745644658156194/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4648270806411404400&amp;postID=5039745644658156194' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/5039745644658156194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/5039745644658156194'/><link rel='alternate' type='text/html' href='http://cursoruby.blogspot.com/2007/12/active-record.html' title='Active Record'/><author><name>Iván Álvarez</name><uri>http://www.blogger.com/profile/04821904986925139513</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://scr.softonic.com/s2/45000/45690/0_homer.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4648270806411404400.post-731710533983677108</id><published>2007-12-12T12:32:00.001+01:00</published><updated>2007-12-12T12:48:17.245+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rails scaffolding'/><title type='text'>Scaffolding</title><content type='html'>El Scaffolding sirve para crear automáticamente el código necesario para tener una primera versión de la aplicación.&lt;br /&gt;Lo primero de todo se creará un nuevo rails project, generandose la estructura de directorios.&lt;br /&gt;Lo siguiente que tenemos que hacer es ir al generador (en la parte inferior) y seleccionar en el menú desplegable la opción 'model'.&lt;br /&gt;Esto creará en app/models el fichero "ejemplo.rb", el cual contendrá la deficinión de la clase y en db/migrate el archivo 001_create_ejemplos.rb.&lt;br /&gt;Luego debemos crear el esquema en la base de datos.El nombre del esquema debe coincidir con el nombre que le hayamos puesto a nuestro proyecto. Al trabajar en entorno de desarrollo, le añadiremos al final '_development'.&lt;br /&gt;Después de tener  el esquema,vamos al fichero 001_create_ejemplos.rb y escribimos la columnas que que queramos que tenga nuestra tabla:&lt;br /&gt;&lt;br /&gt;class CreateEjemplos &lt; ActiveRecord::Migration&lt;br /&gt;  def self.up&lt;br /&gt;    create_table :ejemplos do |t|&lt;br /&gt;   &lt;br /&gt;    t.column :title, :string&lt;br /&gt;    t.column :description, :text&lt;br /&gt;    t.column :image_url, :string&lt;br /&gt;   &lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  def self.down&lt;br /&gt;    drop_table :ejemplos&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;A continuación migramos la base de datos, vamos a la pestaña 'Rake tasks' que se encuentra en la parte inferior y seleccionamos en el desplegable la opción 'migrate'.&lt;br /&gt;Se nos creara las tablas en nuestra base de datos.&lt;br /&gt;Para generar el escaffold, solo nos queda pedirle al generador que lo haga por nosotros. Para ello vamos a la pestaña de 'generators' y escogemos la opción scaffold, pasándole como parámetro el nombre del modelo del que queremos generar la estructura.&lt;br /&gt;Si todo va bien, crea las vistas y operaciones de las operaciones básicas de cualquier objeto de negocio (crear, editar, listar y borrar), de forma automática.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4648270806411404400-731710533983677108?l=cursoruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cursoruby.blogspot.com/feeds/731710533983677108/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4648270806411404400&amp;postID=731710533983677108' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/731710533983677108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/731710533983677108'/><link rel='alternate' type='text/html' href='http://cursoruby.blogspot.com/2007/12/scaffolding.html' title='Scaffolding'/><author><name>Hugo</name><uri>http://www.blogger.com/profile/08555990276251115448</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://img143.imageshack.us/img143/7382/imageshg9.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4648270806411404400.post-3137031492933915238</id><published>2007-12-12T12:30:00.001+01:00</published><updated>2007-12-12T12:54:10.421+01:00</updated><title type='text'>Introducción a Rails</title><content type='html'>Rails es un framework de código abierto para Ruby que sirve para desarrollar aplicaciones web que acceden a bases de datos, basado en el paradigma Modelo-Vista-Controlador (MVC).&lt;br /&gt;El patrón MVC no está directamente relacionado con las aplicaciones web o Ruby on Rails. Tiene su origen en el lenguaje Smalltalk que no tiene nada que ver con la web.&lt;br /&gt;El patrón MVC tiene tres componentes clave:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Modelo: Responsable de la lógica de negocio y de mantener el estado de la aplicación.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Vista: Es la responsable de generar el interfaz de usuario, normalmente basado en datos del modelo.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Controlador: Responsable de controlar el flujo y estado de la entrada de datos por parte del usuario. Reciben eventos del usuario, interactúa con el modelo y muestra la vista correspondiente al usuario.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Ruby on Rails está basado en dos principios fundamentales:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;No te repitas: La idea es tener algún mecanismo para evitar tener que repetir código que es  necesario desde distintos puntos de la aplicación.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Convención sobre configuración: Lo que se pretende es evitar tener que usar ficheros de configuración.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Puntos fuertes de rails:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Metaprogramación: La metaprogramación consiste en escribir programas que escriben otros programas.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ActiveRecord: Consigue es mapear las tablas de la base de datos con nuestros objetos de negocio utilizando metaprogramación.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Scaffolding: Esta técnica permite crear automáticamente el código necesario para tener una primera versión de la aplicación, en concreto, crea las vistas y operaciones de las operaciones básicas de cualquier objeto de negocio (crear, editar, listar y borrar).&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Comprobación integrada: Rails integra todos los elementos necesarios para desarrollar test sobre la aplicación.&lt;br /&gt;&lt;br /&gt;Tres entornos: Rails ofrece tres entornos predeterminados: desarrollo, producción y test. Cada uno tiene un comportamiento ligeramente distinto, por ejemplo Rails crea una copia vacía de la base de datos de test para cada prueba realizada.&lt;br /&gt;&lt;br /&gt;AJAX: Rails ofrece integración con AJAX, con esto se consiguen unas interfaces de usuario más vistosas e interactivas para el usuario.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4648270806411404400-3137031492933915238?l=cursoruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cursoruby.blogspot.com/feeds/3137031492933915238/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4648270806411404400&amp;postID=3137031492933915238' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/3137031492933915238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/3137031492933915238'/><link rel='alternate' type='text/html' href='http://cursoruby.blogspot.com/2007/12/introduccin-e-instalacin_12.html' title='Introducción a Rails'/><author><name>Eduardo Fernández</name><uri>http://www.blogger.com/profile/12716448476266383515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4648270806411404400.post-7409011685177655776</id><published>2007-12-12T12:25:00.000+01:00</published><updated>2007-12-12T13:15:01.414+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hpricot'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><title type='text'>Tema 12. hpricot</title><content type='html'>-Es un parser de HTML sencillo de usar y a la vez muy&lt;br /&gt;potente.&lt;br /&gt;Nos permite extraer información de páginas HTML.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Básicamente es una libreria la cual permite pasar código HTML a un objeto.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En nuestra clase necesitamos implementar :&lt;br /&gt;&lt;br /&gt;       require 'open­uri'&lt;br /&gt;       require 'hpricot'&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;open­uri: Nos permite abrir una url, por ejemplo una pagina html.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;hpricot; Nos permite utilizar la librería Hpricot Hpricot Basics.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cargar una pagina HTML:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Se puede cargar de un String:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt; doc = Hpricot("&amp;lt;p&amp;gt;A simple &amp;lt;b&amp;gt;test&amp;lt;/b&amp;gt; string.&amp;lt;/p&amp;gt;")&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Se puede cargar de un Fichero:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;       doc = open("index.html") { |f| Hpricot(f) }&lt;/li&gt;&lt;/ul&gt;   Se puede cargar de una url:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;      require 'open­uri'&lt;/li&gt;&lt;li&gt;      doc = Hpricot(open("http://qwantz.com/"))&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Buscar Elementos:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Se pueden usar expresiones XPath o CSS.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Expresiones CSS  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Doc.search realiza una búsqueda recibiendo como&lt;br /&gt;parámetro la expresión, nos devolverá un array.&lt;br /&gt;   doc.search  (“p.posted”)&lt;br /&gt;   doc / “p.posted”      ­­&gt; “ / ” Alias del metodo search&lt;br /&gt;En ambos casos se devolverán todos los elementos&lt;br /&gt;p con la clase “posted”.&lt;br /&gt;   &lt; class =" “posted”"&gt;&lt;br /&gt;   &lt;p&gt;&lt;/p&gt;Selectores CSShttp://www.w3.org/TR/CSS21/selector.html (punto 5.1)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Encadenar Búsquedas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;require 'rubygems'&lt;br /&gt;require 'open­uri'&lt;br /&gt;require 'hpricot'&lt;br /&gt;men = open("http://www.marca.es")&lt;br /&gt;doc = Hpricot(men)&lt;br /&gt;noticia = doc / ".noticiaPrincipal"&lt;br /&gt;enlace = noticia / "a"&lt;br /&gt;puts "Elementos &amp;lt;a&amp;gt; dentro de la&lt;br /&gt;clase noticiaPrincipal"&lt;br /&gt;enlace.each{|e|&lt;br /&gt; puts e.inner_html&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Obtener Elementos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;inner_html: Este método nos devuelve el html          &lt;br /&gt;   interno del elemento.&lt;br /&gt;    get_attibute(“atributo”): Este método nos devuelve&lt;br /&gt;    un atributo de un elemento. (También se puede       &lt;br /&gt;    acceder con [] )&lt;br /&gt;              enlace.each{|t|&lt;br /&gt;                puts t['href']&lt;br /&gt;                puts t.get_attribute('href')&lt;br /&gt;              }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Nota: para añadir codigo HTML y que no sea interpretado:&lt;br /&gt;&lt;/span&gt;&lt;a href="http://blogcrowds.com/resources/parse_html.php"&gt;&lt;span style="font-style: italic;"&gt;http://blogcrowds.com/resources/parse_html.php&lt;/span&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4648270806411404400-7409011685177655776?l=cursoruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cursoruby.blogspot.com/feeds/7409011685177655776/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4648270806411404400&amp;postID=7409011685177655776' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/7409011685177655776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/7409011685177655776'/><link rel='alternate' type='text/html' href='http://cursoruby.blogspot.com/2007/12/tema-12-hpricot.html' title='Tema 12. hpricot'/><author><name>kahuna</name><uri>http://www.blogger.com/profile/03247940468056353606</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4648270806411404400.post-8883701703417122942</id><published>2007-11-28T12:13:00.000+01:00</published><updated>2007-11-30T12:31:39.285+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='foro ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><title type='text'>El foro de Ruby on Rails</title><content type='html'>Hola a todos,&lt;br /&gt;&lt;br /&gt;pues a partir de ahora ya tenemos un foro donde encontrarnos y discutir temas sobre Ruby y resolver dudas entre todos.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.foros.net/index2.php?mforum=fororuby"&gt;http://www.foros.net/index2.php?mforum=fororuby &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Saludos&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4648270806411404400-8883701703417122942?l=cursoruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cursoruby.blogspot.com/feeds/8883701703417122942/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4648270806411404400&amp;postID=8883701703417122942' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/8883701703417122942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/8883701703417122942'/><link rel='alternate' type='text/html' href='http://cursoruby.blogspot.com/2007/11/el-foro-de-ruby-on-rails.html' title='El foro de Ruby on Rails'/><author><name>kahuna</name><uri>http://www.blogger.com/profile/03247940468056353606</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4648270806411404400.post-607955859441478142</id><published>2007-11-21T14:03:00.000+01:00</published><updated>2007-11-22T09:07:11.922+01:00</updated><title type='text'>Tema 11: Send &amp; Method_Missing</title><content type='html'>Send&lt;br /&gt;&lt;br /&gt;Característica avanzada de Ruby que&lt;br /&gt;permite invocar un método a partir de su&lt;br /&gt; nombre.&lt;br /&gt;&lt;br /&gt;class Persona&lt;br /&gt; def saludar&lt;br /&gt;   puts "Hola soy una persona"&lt;br /&gt; end&lt;br /&gt;end&lt;br /&gt;p = Persona.new&lt;br /&gt;p.saludar&lt;br /&gt;p.send(:saludar)&lt;br /&gt;p.send("saludar")&lt;br /&gt;                   &lt;br /&gt; Permite escribir código que invoque a&lt;br /&gt;métodos que no existen todavía.&lt;br /&gt;El identificador del método puede&lt;br /&gt;obtenerse de diversos sitios, entrada de&lt;br /&gt;teclado, base de datos, fichero...&lt;br /&gt;&lt;br /&gt;                method_missing&lt;br /&gt;&lt;br /&gt;Cuando una clase en Ruby no implementa&lt;br /&gt;un método se llama al método&lt;br /&gt;method_missing.&lt;br /&gt;Por defecto lanza una excepción(NoMethodError), pero se&lt;br /&gt;puede sobreescribir este comportamiento(ver ejemplo).&lt;br /&gt;Recibe dos parámetros, el identificador del&lt;br /&gt;método invocado y la lista de argumentos.&lt;br /&gt;&lt;br /&gt;         Ejemplo:method_missing&lt;br /&gt;class Persona&lt;br /&gt; def saludar&lt;br /&gt;   puts "Hola soy una persona"&lt;br /&gt; end&lt;br /&gt;&lt;br /&gt; def method_missing(id, *args)&lt;br /&gt;   puts "Yo no puedo #{id}"&lt;br /&gt; end&lt;br /&gt;end&lt;br /&gt;               method_missing&lt;br /&gt;p = Persona.new&lt;br /&gt;p.saludar # Hola soy una persona&lt;br /&gt;p.caminar # Yo no puedo caminar&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4648270806411404400-607955859441478142?l=cursoruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cursoruby.blogspot.com/feeds/607955859441478142/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4648270806411404400&amp;postID=607955859441478142' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/607955859441478142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/607955859441478142'/><link rel='alternate' type='text/html' href='http://cursoruby.blogspot.com/2007/11/tema-11-send-methodmissing.html' title='Tema 11: Send &amp; Method_Missing'/><author><name>roberto</name><uri>http://www.blogger.com/profile/03748726756858728741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4648270806411404400.post-7763576688555648074</id><published>2007-11-21T13:54:00.000+01:00</published><updated>2007-11-22T09:42:39.649+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='builder'/><title type='text'>Tema 10: XMLBUILDER</title><content type='html'>¿Qué es xml?&lt;br /&gt;&lt;br /&gt;-Su nombre viene de eXtenseble Markup Language (lenguaje de&lt;br /&gt;marcas extensible)&lt;br /&gt;Un lenguaje de marcado o lenguaje de marcas es una forma de&lt;br /&gt;codificar un documento que, junto con el texto, incorpora etiquetas o marcas que contienen información adicional acerca de la estructura del texto o su presentación. El lenguaje de marcas más extendido es el&lt;br /&gt;HTML&lt;br /&gt;&lt;br /&gt;XML fue desarrollado por un Grupo de Trabajo SGML (originalmente&lt;br /&gt;conocido como "SGML Editorial Review Board") formado bajo los&lt;br /&gt;auspicios del Consorcio World Wide Web (W3C), en 1996.&lt;br /&gt;Los objetivos de diseño de XML son:&lt;br /&gt;• Debe ser directamente utilizable sobre Internet.&lt;br /&gt;• Soportar una amplia variedad de aplicaciones.&lt;br /&gt;• Debe ser fácil la escritura de programas que procesen&lt;br /&gt;documentos XML.&lt;br /&gt;• Los documentos XML deben ser legibles por humanos y&lt;br /&gt;razonablemente claros.&lt;br /&gt;• El diseño debe ser preparado rápidamente, además, de ser&lt;br /&gt;formal y conciso.&lt;br /&gt;• Los documentos XML deben ser fácilmente creables.&lt;br /&gt;&lt;br /&gt;Instalando rubygems y builder&lt;br /&gt;&lt;br /&gt;Se nos ofrece una librería que nos ayuda a construir esto de forma&lt;br /&gt;sencilla. La librería en cuestión es 'builder', y tenemos que instalarla, ya que no viene con el paquete básico de ruby.&lt;br /&gt;Para instalarla, debemos utilizar rubygems, que es un gestor de librerías que nos sirve para instalar, eliminar y actualizar las librerías que tengamos instaladas en el equipo.&lt;br /&gt;Para saber si tenemos instalado rubygems, abrir un terminal y escribir&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;gem –version&lt;span style="font-weight:bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style:italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Si da un error, debemos intalar rubygems en nuestro equipo.&lt;br /&gt;La instalación desde linux es bastante fácil.&lt;br /&gt;En un terminal escribir lo siguiente:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;&lt;br /&gt;sudo apt­get install rubygems&lt;span style="font-weight:bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Saldrán unas cuantas cosas en la consola y al final un mensaje que indica que se ha instalado correctamente.&lt;br /&gt;A continuación se debe escribir lo siguiente para instalar el paquete builder:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;span style="font-weight:bold;"&gt;gem install builder&lt;span style="font-style:italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Igual que antes, saldrán unas cuantas cosas en la pantalla. Salvo que se lea un mensaje de error, quedará bien instalado en nuestro ordenador.&lt;br /&gt;En el caso de que falle algún paquete escribir la siguiente linea:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;export RUBYOPT=rubygems&lt;span style="font-style:italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Crear un documento xml con builder:&lt;br /&gt;&lt;br /&gt;Lo primero de todo es crear una variable que represente al documento xml que vamos a escribir.Para ello utilizamos el método Builder::XmlMarkup.new Este método recibe como parámetro el destino, (identificado por la clave :target ) donde se escribirá lo que vayamos haciendo con el objeto que acabamos de crear (debe responder al método &lt;&lt;)    Se pueden especificar más parámetros, como el número de espacios que     se incluirán al anidar elementos o el margen inicial en el que se     empezará a escribir.&lt;br /&gt; &lt;span style="font-style:italic;"&gt;Ejemplo    x= Builder::XmlMarkup.new:target =&gt; $stdout&lt;/span&gt;&lt;br /&gt;Con esto, todo lo que se escriba en la variable x se escribirá por la salida estándar.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Escribiendo etiquetas:&lt;br /&gt;&lt;br /&gt;Con todo lo anterior, ya tenemos el documento preparado para empezar a escribir la información que queramos en ella.&lt;br /&gt;Para crear una etiqueta, simplemente llamamos al método:&lt;br /&gt;&lt;blockquote&gt;x.h1 "Encabezado h1&lt;br /&gt;&lt;/blockquote&gt;Generará lo siguiente:&lt;br /&gt;&lt;blockquote&gt;&lt;!--&lt;h1--&gt;Encabezado h1&lt;br /&gt;&lt;/blockquote&gt;Especificando atributos en una etiqueta&lt;br /&gt;Para especificar algun tipo de atributo, se hace mediante un hash, en el que la clave será el nombre del atributo y el valor de dicha clave, el valor que tomará el atributo.&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;span style="font-style: italic;"&gt;x.h1 "Encabezado h1", :id =&gt;&lt;/span&gt; 'encabezado' escribirá&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Encabezado h1&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Anidando etiquetas&lt;br /&gt;Podemos anidar etiquetas a base de abrir bloques:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;x.ul {&lt;br /&gt;x.li 'Manzana', :class =&gt; 'fruta'&lt;br /&gt;x.li 'Fresa', :class =&gt; 'fruta'&lt;br /&gt;x.li 'Albaricoque', :class =&gt; 'otra_clase'&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Daría como resultado&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Manzana&lt;/li&gt;&lt;li&gt;Fresa&lt;/li&gt;&lt;li&gt;Albaricoque&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Otra forma de hacerlo seria:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;x.tag!(:ul, :id =&gt; 'lista_frutas'){&lt;br /&gt;x.li 'Manzana', :class =&gt; 'fruta'&lt;br /&gt;x.li 'Fresa', :class =&gt; 'fruta'&lt;br /&gt;x.li 'Albaricoque', :class =&gt; 'otra_clase'&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Daría como resultado&lt;br /&gt;&lt;blockquote&gt;&lt;ul id="lista_frutas"&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;ul&gt;&lt;li&gt;Manzana&lt;/li&gt;&lt;li&gt;Fresa&lt;/li&gt;&lt;li&gt;Albaricoque&lt;/li&gt;&lt;/ul&gt;Ejemplo de uso librería XMLBUILDER y ficheros&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;require "persona"&lt;br /&gt;require "builder"#incluida en libraria&lt;br /&gt;p1=Persona.new("Pepito","Gonzalez","29")&lt;br /&gt;p2=Persona.new("Raquel","Blanco","31")&lt;br /&gt;p3=Persona.new("Rodrigo","Fernandez","32")&lt;br /&gt;personas=Array.new&lt;br /&gt;personas&lt;&lt;p1 personas=""&gt;&lt;&lt;p2 personas=""&gt;&lt;&lt;p3 elemento="" puts="" to_s="" open="" txt="" w="" do="" f="" x="Builder::XmlMarkup.new(:target"&gt; f, :indent =&gt; 2)&lt;br /&gt;      x.personas{&lt;br /&gt;      personas.each do |elemento|&lt;br /&gt;          x.tag!(:persona, :edad =&gt; elemento.edad){&lt;br /&gt;          x.nombre elemento.nombre&lt;br /&gt;     x.apellido elemento.apellidos&lt;br /&gt;          }&lt;br /&gt;           end&lt;br /&gt;          }&lt;br /&gt;end&lt;br /&gt;&lt;/p3&gt;&lt;/p2&gt;&lt;/p1&gt;&lt;/blockquote&gt;&lt;br /&gt;Este código generaría la siguiente salida en un fichero:&lt;br /&gt;&lt;blockquote&gt;&lt;personas&gt;&lt;persona edad="29"&gt;&lt;/persona&gt;&lt;/personas&gt;&lt;br /&gt;Pepito&lt;br /&gt;Gonzalez&lt;br /&gt;&lt;br /&gt;Raquel&lt;br /&gt;Blanco&lt;br /&gt;&lt;br /&gt;Rodrigo&lt;br /&gt;Fernandez&lt;personas&gt;&lt;br /&gt;&lt;/personas&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4648270806411404400-7763576688555648074?l=cursoruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cursoruby.blogspot.com/feeds/7763576688555648074/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4648270806411404400&amp;postID=7763576688555648074' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/7763576688555648074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/7763576688555648074'/><link rel='alternate' type='text/html' href='http://cursoruby.blogspot.com/2007/11/tema-10-xmlbuilder.html' title='Tema 10: XMLBUILDER'/><author><name>roberto</name><uri>http://www.blogger.com/profile/03748726756858728741</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4648270806411404400.post-310076810770104753</id><published>2007-11-21T13:09:00.000+01:00</published><updated>2007-11-21T14:08:51.290+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='file'/><category scheme='http://www.blogger.com/atom/ns#' term='open'/><category scheme='http://www.blogger.com/atom/ns#' term='fichero'/><category scheme='http://www.blogger.com/atom/ns#' term='IO'/><title type='text'>Tema 9: Ficheros</title><content type='html'>&lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }   H1 { margin-bottom: 0.21cm }   H1.western { font-family: "Nimbus Sans L", sans-serif; font-size: 16pt }   H1.cjk { font-family: "DejaVu Sans"; font-size: 16pt }   H1.ctl { font-family: "DejaVu Sans"; font-size: 16pt }   H2 { margin-bottom: 0.21cm }   H2.western { font-family: "Nimbus Sans L", sans-serif; font-size: 14pt; font-style: italic }   H2.cjk { font-size: 14pt; font-style: italic }   H2.ctl { font-size: 14pt; font-style: italic }   H3 { margin-bottom: 0.21cm }   H3.western { font-family: "Nimbus Sans L", sans-serif }  --&gt;  &lt;/style&gt;  &lt;h1 class="western"&gt;Introducción&lt;/h1&gt; &lt;p style="margin-bottom: 0cm;"&gt;Definición de fichero (o archivo): Es un conjunto de información que se almacena en algún medio de escritura que permita ser leído o accedido por un equipo informático.  &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Un fichero es identificado por un nombre y la descripción de la carpeta o directorio que lo contiene. Los ficheros informáticos se llaman así porque son los equivalentes digitales de los ficheros en tarjetas, papel o microfichas del entorno de oficina tradicional. Los ficheros informáticos facilitan una manera de organizar los recursos usados para almacenar permanentemente información dentro de un equipo informático.&lt;/p&gt; &lt;h1 class="western"&gt;Ficheros en Ruby&lt;/h1&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;Ruby define una sola clase base, IO, para gestionar toda la entrada y salida. De esta clase base heredan File y BasicSocket, para dar un comportamiento más especializado, pero los principios se mantienen iguales para todos.&lt;/p&gt; &lt;h1 class="western"&gt;La clase File&lt;/h1&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;Permite trabajar con los ficheros.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;Como era de esperar, se puede crear un nuevo objeto de fichero con  &lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;File.new&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;     unFichero=File.new("ficheroprueba","r")&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;     #...procesar el fichero&lt;/p&gt; &lt;p style="margin-bottom: 0cm;" align="left"&gt;     unFichero.close&lt;/p&gt; &lt;h2 class="western"&gt;&lt;b&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;Parámetros&lt;/span&gt;&lt;/b&gt;:&lt;/h2&gt; &lt;p style="margin-bottom: 0cm;"&gt;File.new(nombre_del_fichero,modo_de_acceso)&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Nimbus Roman No9 L, serif;"&gt;Debemos especificar qué es lo que queremos hacer con el fichero. Por defecto abren en modo lectura.&lt;/span&gt;&lt;/p&gt; &lt;h3 class="western"&gt;Los modos de acceso al fichero son los siguientes:&lt;/h3&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;span style="color:#0000ff;"&gt;r&lt;/span&gt;&lt;/span&gt;&lt;/i&gt; &lt;/b&gt; Sólo lectura, poniendo el puntero de lectura al principio (por defecto).&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;span style="color:#0000ff;"&gt;r+&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt; Lectura/escritura,empezando por el principio del fichero.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;span style="color:#0000ff;"&gt;w&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt; Sólo escritura. Borra el contenido del fichero si existe o crea uno nuevo en caso contrario&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;span style="color:#0000ff;"&gt;w+&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt; Lectura/escritura. Borra el contenido del fichero si existe o crea uno nuevo en caso contrario&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;span style="color:#0000ff;"&gt;a&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt; Sólo escritura. Sitúa el puntero al final del fichero si existe. Si no, lo crea.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;span style="color:#0000ff;"&gt;a+&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt; Lectura/escritura, poniendo el puntero al final del fichero si existe. Crea uno nuevo en el caso de que no exista&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;span style="color:#0000ff;"&gt;b&lt;/span&gt;&lt;/span&gt;&lt;/i&gt; &lt;/b&gt;(Sólo en DOS/Windows) Modo binario. Puede aparecer con cualquiera de los anteriores.&lt;/p&gt; &lt;h3 class="western"&gt;Otra forma de especificar los modos de acceso:&lt;/h3&gt; &lt;p style="margin-bottom: 0cm;"&gt; &lt;span style="font-family:Arial, sans-serif;"&gt;La clase file tiene declaradas las siguientes constantes para poder abrir el fichero de forma que se ajuste más a nuestras necesidades:&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;span style="color:#0000ff;"&gt;APPEND&lt;/span&gt;&lt;/span&gt;&lt;/b&gt; Abre el fichero en modo 'añadir'. Lo que se escriba, será al final del fichero.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;span style="color:#0000ff;"&gt;CREAT&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;  Crea el fichero al abrirlo si no existe.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;span style="color:#0000ff;"&gt;EXCL&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;     Al usarlo con CREAT, se lanzará una excepción si existe el fichero.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;span style="color:#0000ff;"&gt;NONBLOCK&lt;/span&gt;&lt;/span&gt;&lt;/b&gt; Abre el fichero, pero no lo bloquea.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;span style="color:#0000ff;"&gt;RDONLY&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;  Abre el fichero en modo sólo lectura&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;span style="color:#0000ff;"&gt;RDWR&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;   Abre el fichero en modo lectura/escritura&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;span style="color:#0000ff;"&gt;TRUNC&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;   Abre el fichero y borra su contenido si existe&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;&lt;span style="color:#0000ff;"&gt;WRONLY&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;  Abre el fichero en modo sólo lectura&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;Estos modos se pueden combinar mediante el operador '&lt;/span&gt;&lt;i&gt;&lt;span style="color:#0000ff;"&gt;|&lt;/span&gt;&lt;/i&gt;' que hace un or a nivel de bit&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;span style="font-family:Arial, sans-serif;"&gt;ejemplo:&lt;/span&gt;&lt;/b&gt; file.new(“nombre”, File::APPEND|File::WRONLY)&lt;/p&gt; &lt;h2 class="western"&gt;Métodos varios&lt;/h2&gt; &lt;p style="margin-bottom: 0cm;"&gt;Los mismos métodos que has estado usando para la E/S “simple'' están disponibles para todos los objetos de tipo fichero. Así, gets lee una línea de la entrada de la terminal, y unFich.gets lee una línea del objeto fichero unFich.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Sin embargo, los objetos de E/S tienen una serie de métodos de acceso adicionales, pensados para hacer nuestra vida más fácil:  &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Por ejemplo el método &lt;i&gt;&lt;span style="color:#0000ff;"&gt;File.open&lt;/span&gt;&lt;/i&gt; también abre un fichero. En su uso normal, hace lo mismo que File.new . Sin embargo, si hay un bloque asociado a la llamada, open se comporta de manera diferente: en vez de devolver un nuevo objeto File, invoca al bloque, pasándole el fichero acabado de abrir como parámetro. Cuando el bloque termina, el fichero se cierra automáticamente.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;Como responsables programadores, cerramos el fichero para asegurarnos de que todos los datos que hay en memoria se escriben y que todos los recursos relacionados se liberan.&lt;/p&gt; &lt;h3 class="western"&gt;Abrir/crear ficheros:&lt;/h3&gt; &lt;p style="margin-bottom: 0cm;"&gt;new&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;open&lt;/p&gt; &lt;h3 class="western"&gt;Tratamiento de cadenas:&lt;/h3&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;i&gt;&lt;span style="color:#0000ff;"&gt;&lt;b&gt;readline:&lt;/b&gt; &lt;/span&gt;&lt;/i&gt;lee una línea del fichero. Lanza una excepción si se llega al final.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;i&gt;&lt;span style="color:#0000ff;"&gt;&lt;b&gt;gets:&lt;/b&gt; &lt;/span&gt;&lt;/i&gt;lee una línea del fichero. Si se llega al final de fichero devuelve nil.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;span style="color:#0000ff;"&gt;puts: &lt;/span&gt;&lt;/b&gt;Escribe una línea en el fichero. Termina con un salto de línea.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;span style="color:#0000ff;"&gt;write: &lt;/span&gt;&lt;/b&gt;Escribe una línea, sin introducir el salto de línea.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;span style="color:#0000ff;"&gt;print:&lt;/span&gt;&lt;/b&gt; Igual que write.&lt;/p&gt; &lt;h3 class="western"&gt;Iteradores:&lt;/h3&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="color:#0000ff;"&gt;each_line( separador ){ bloque }:&lt;/span&gt; &lt;/i&gt;&lt;/b&gt;Ejecuta el bloque para cada una de las líneas. El separador se usa para identificar cada línea. Por defecto \n&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="color:#0000ff;"&gt;IO.foreach( ruta_fichero ){ bloque }: &lt;/span&gt;&lt;/i&gt;&lt;/b&gt;Abre el fichero en modo lectura y ejecuta el bloque para cada línea.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;i&gt;&lt;span style="color:#0000ff;"&gt;IO.readlines( ruta_fichero ): &lt;/span&gt;&lt;/i&gt;&lt;/b&gt;Devuelve el fichero en un array&lt;/p&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;#La clase Alumno implementa las caracteristicas de un alumno, junto con la &lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;posibilidad de almacenar dicho alumno en un fichero.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;class &lt;span style="font-weight: bold;"&gt;Alumno&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;def &lt;span style="font-weight: bold;"&gt;initialize&lt;/span&gt; n, a, dni&lt;br /&gt;  @nom = n&lt;br /&gt;  @ape = a&lt;br /&gt;  @dni = dni&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def &lt;span style="font-weight: bold;"&gt;almacena&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    #El fichero se abre en modo lectura y escritura, &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;    #poniendo el puntero al final del fichero&lt;/span&gt;&lt;br /&gt;  f = File.new("Alumnos.txt", "a+")&lt;br /&gt;  cadena = "#{@nom}, #{@ape}, #{@dni.to_s}"&lt;br /&gt;  f.puts(cadena)&lt;br /&gt;  f.close&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;#MAIN&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;#Creamos tres alumnos y los almacenamos en el fichero&lt;/span&gt;&lt;br /&gt;a = Alumno.new("Ivan", "Alvarez", 53534512)&lt;br /&gt;b = Alumno.new("Laura", "Nuevo", 53534512)&lt;br /&gt;c = Alumno.new("Diego", "Perez", 53534512)&lt;br /&gt;&lt;br /&gt;a.almacena&lt;br /&gt;b.almacena&lt;br /&gt;c.almacena&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;#Cargamos alumnos del fichero, y los mostramos por pantalla&lt;/span&gt;&lt;br /&gt;puts "\nCargamos los alumnos del fichero: "&lt;br /&gt;IO.foreach( "Alumnos.txt" ) do |a|&lt;br /&gt;array = a.split(", ")&lt;br /&gt;alumno = Alumno.new(array[0], array[1], array[2])&lt;br /&gt;print "#{alumno.nom}, #{alumno.ape}, #{alumno.dni}"&lt;br /&gt;end&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4648270806411404400-310076810770104753?l=cursoruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cursoruby.blogspot.com/feeds/310076810770104753/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4648270806411404400&amp;postID=310076810770104753' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/310076810770104753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/310076810770104753'/><link rel='alternate' type='text/html' href='http://cursoruby.blogspot.com/2007/11/tema-9-ficheros.html' title='Tema 9: Ficheros'/><author><name>Iván Álvarez</name><uri>http://www.blogger.com/profile/04821904986925139513</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://scr.softonic.com/s2/45000/45690/0_homer.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4648270806411404400.post-2401870125876764857</id><published>2007-11-21T12:57:00.000+01:00</published><updated>2007-11-23T12:37:42.977+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ensure'/><category scheme='http://www.blogger.com/atom/ns#' term='raise'/><category scheme='http://www.blogger.com/atom/ns#' term='rescue'/><category scheme='http://www.blogger.com/atom/ns#' term='excepcion'/><title type='text'>Tema 8:  Excepciones</title><content type='html'>&lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt;  &lt;p style="margin-bottom: 0cm;"&gt;En un programa en ejecución pueden suceder acciones inesperadas. Las excepciones tienen como función solucionar los problemas que dicahs acciones pueden ocasionar.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;En Ruby podemos decir que una excepción es un objeto, que se crea cuando se da una situación  &lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;anómala durante la ejecución de nuestro código.&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;   &lt;p style="margin-bottom: 0cm;"&gt;&lt;u style="color: rgb(51, 51, 51);"&gt;Sentencia rescue:&lt;/u&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt; &lt;span style="color: rgb(92, 133, 38);"&gt; &lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;# código susceptible de generar una excepción&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;i&gt;rescue&lt;/i&gt; [tipo de excepción]&lt;/b&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; color: rgb(0, 0, 0);"&gt;   &lt;span style="color: rgb(125, 166, 71);"&gt;# código que trata el error producido&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;i&gt;&lt;b&gt;else&lt;/b&gt;&lt;/i&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; color: rgb(0, 102, 0);"&gt;&lt;span style="color: rgb(125, 166, 71);"&gt;   # Se ejecuta si no se produce la excepción&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt; El bloque de código marcado con &lt;b&gt;begin&lt;/b&gt; se ejecutará hasta que haya una excepción, lo que provoca que el control se transﬁera a un bloque con el código de gestión de errores, aquel marcado con &lt;b&gt;rescue&lt;/b&gt;.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; color: rgb(51, 51, 51);"&gt;&lt;u&gt;Sentencia ensure:&lt;/u&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;begin&lt;/span&gt;&lt;/b&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; color: rgb(0, 102, 0);"&gt; &lt;span style="color: rgb(125, 166, 71);"&gt;&lt;b&gt;#&lt;/b&gt;&lt;span style=""&gt;código&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rescue&lt;/span&gt;&lt;/b&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; color: rgb(0, 102, 0);"&gt; &lt;span style="color: rgb(125, 166, 71);"&gt;#&lt;span style=""&gt;mas&lt;/span&gt; &lt;span style=""&gt;código&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;b&gt;&lt;i&gt;ensure&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; color: rgb(0, 102, 0);"&gt; &lt;span style="color: rgb(125, 166, 71);"&gt;#&lt;span style=""&gt;codigo&lt;/span&gt; &lt;span style=""&gt;que&lt;/span&gt; se ejecutará siempre&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;end&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt; El bloque de código de &lt;b&gt;ensure&lt;/b&gt; se ejecuta independientemente de si se produce o no la excepción. tiene como finalidad realizar ciertas acciones cuando el método termina su ejecución.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt; Ensure debe colocarse al final de los rescues.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p style="margin-bottom: 0cm;"&gt;                &lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt;  &lt;/p&gt;&lt;p style="margin-bottom: 0cm; page-break-before: always; color: rgb(51, 51, 51);"&gt;&lt;u&gt;Sentencia retry:&lt;/u&gt;&lt;/p&gt;       &lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt;  &lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; color: rgb(51, 204, 0);"&gt;&lt;span style="font-family:Nimbus Roman No9 L,sans-serif;"&gt; ...&lt;/span&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; color: rgb(0, 0, 0);"&gt;&lt;b&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rescue&lt;/span&gt;&lt;/b&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; color: rgb(0, 0, 0);"&gt; &lt;b&gt;&lt;i&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;retry&lt;/span&gt;&lt;/i&gt;&lt;/b&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; color: rgb(0, 0, 0);"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;Se puede utilizar la sentencia de control &lt;b&gt;retry&lt;/b&gt; para repetir la iteración del código del bloque begin.&lt;/p&gt; &lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0cm; color: rgb(51, 51, 51);"&gt;&lt;u&gt;Sentencia raise:&lt;/u&gt;&lt;/p&gt;           &lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;&lt;/style&gt;&lt;p style="margin-bottom: 0cm;"&gt;            &lt;style type="text/css"&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }  --&gt;  &lt;/style&gt;  &lt;/p&gt;&lt;p  style="margin-bottom: 0cm; font-style: normal; line-height: 97%; text-decoration: none;font-family:arial;" align="left"&gt; &lt;span style="color: rgb(0, 0, 0);font-size:130%;" &gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);font-family:arial;" &gt;begin    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);font-family:arial;" &gt;raise&lt;/span&gt;&lt;span style="font-family:arial;"&gt;(ArgumentError, "&lt;span style="color: rgb(0, 153, 0);"&gt;error en el argumento&lt;/span&gt;")  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:arial;" &gt;rescue   &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;puts &lt;/span&gt;&lt;span style="font-weight: bold;font-family:arial;" &gt;$! &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);font-family:arial;" &gt;end&lt;/span&gt;&lt;p style="margin-bottom: 0cm; font-family: arial;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;La sentencia &lt;b&gt;&lt;i&gt;raise&lt;/i&gt;&lt;/b&gt; es la encargada de lanzar las excepciones. La cadena que describe la excepción se le pasa como argumento. El argumento es opcional y en caso de no llevarlo crea una excepción RuntimeError o relanzaría la excepción capturada si nos encontraramos dentro de un rescue.&lt;/p&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;br /&gt;&lt;/p&gt;  &lt;span style="font-weight: bold;"&gt;$! &lt;/span&gt;es una variable global especial que contiene el mensaje de la excepción. Si no se pasa mensaje de excepción, $! contiene el nombre de la clase a la que está asocidada.&lt;p style="margin-bottom: 0cm;"&gt;&lt;span style="font-family:Nimbus Roman No9 L,serif;"&gt;&lt;span style=""&gt;&lt;span style="text-decoration: none;"&gt;&lt;span style="font-style: normal;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4648270806411404400-2401870125876764857?l=cursoruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cursoruby.blogspot.com/feeds/2401870125876764857/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4648270806411404400&amp;postID=2401870125876764857' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/2401870125876764857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/2401870125876764857'/><link rel='alternate' type='text/html' href='http://cursoruby.blogspot.com/2007/11/tema-10-excepciones.html' title='Tema 8:  Excepciones'/><author><name>lauritass</name><uri>http://www.blogger.com/profile/15786479047027878082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://www.connectedconcepts.net/photos/tgrsp535.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4648270806411404400.post-1650838861140448698</id><published>2007-11-21T12:49:00.000+01:00</published><updated>2007-11-21T13:31:20.768+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='clase'/><category scheme='http://www.blogger.com/atom/ns#' term='super'/><category scheme='http://www.blogger.com/atom/ns#' term='herencia'/><title type='text'>Tema 7: Herencia</title><content type='html'>La &lt;span style="font-weight: bold;"&gt;herencia&lt;/span&gt; es uno de los mecanismos de la programación orientada a objetos, por medio del cual una clase se deriva de otra de manera que extiende su funcionalidad.&lt;br /&gt;&lt;br /&gt;La herencia en Ruby se simboliza mediante el operador &lt;   &lt;span style="color: rgb(0, 102, 0);"&gt;.&lt;br /&gt;&lt;br /&gt;#La clase "Luchador" contiene los datos que debe tener todo luchador, por ejemplo vida, fuerza,... De igual forma define acciones comunes a todos los luchadores, es decir, los metodos golpear, recibir_golpe,...  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;class &lt;span style="font-weight: bold;"&gt;Luchador&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;def &lt;span style="font-weight: bold;"&gt;initialize&lt;/span&gt; v, f, d, p, n&lt;br /&gt;@vida = v&lt;br /&gt;@fuerza_ataque = f&lt;br /&gt;@defensa = d&lt;br /&gt;@prob_ataque = p&lt;br /&gt;@nombre = n&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def &lt;span style="font-weight: bold;"&gt;golpear&lt;/span&gt;&lt;br /&gt; (...)&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def &lt;span style="font-weight: bold;"&gt;recibir_golpe&lt;/span&gt; x&lt;br /&gt; (...)&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def &lt;span style="font-weight: bold;"&gt;vivo?&lt;/span&gt;&lt;br /&gt; (...)&lt;br /&gt;end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;#Todo boxeador es un luchador, por lo tanto tiene todas las características de un luchador, y a parte, características específicas de un boxeador. La herencia se denota con el operador "&lt;", de modo que la clase "Boxeador" hereda de "Luchador": class Boxeador &lt;&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;En este caso, un boxeador se comporta de un modo determinado al recibir un golpe, por ese motivo se redefine el método "recibir_golpe".&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;class &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;Boxeador&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;Luchado&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;r&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;       def &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;initialize&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; n&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;#&lt;span style="font-weight: bold;"&gt;super&lt;/span&gt; llama al constructor de la clase Luchador&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;             super 90, 15, 2, 0.3, n&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     def &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;recibir_golpe&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; x&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;             (...)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;     end&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;#Todo karateca es un luchador, igual que en el caso anterior, tiene todas las #características de un luchador, y a parte, características específicas de un karateka.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;En el caso del karateka, el modo de golpear es diferente, por eso se redefine el método "golpear".&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;class &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;Karateka&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; &lt; &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;Luchador&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;       def &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;initialize&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; n&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;        super 100, 10, 4, 0.5, n&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;       end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;       def &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 0);"&gt;golpear&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;            (...)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;    end&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4648270806411404400-1650838861140448698?l=cursoruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cursoruby.blogspot.com/feeds/1650838861140448698/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4648270806411404400&amp;postID=1650838861140448698' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/1650838861140448698'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/1650838861140448698'/><link rel='alternate' type='text/html' href='http://cursoruby.blogspot.com/2007/11/tema-7-herencia.html' title='Tema 7: Herencia'/><author><name>Iván Álvarez</name><uri>http://www.blogger.com/profile/04821904986925139513</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://scr.softonic.com/s2/45000/45690/0_homer.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4648270806411404400.post-8216111864099946577</id><published>2007-11-21T12:40:00.001+01:00</published><updated>2007-11-21T13:13:44.280+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='bloques'/><category scheme='http://www.blogger.com/atom/ns#' term='yield'/><category scheme='http://www.blogger.com/atom/ns#' term='iteradores'/><title type='text'>Tema 6: Bloques e iteradores</title><content type='html'>&lt;div style="text-align: justify;"&gt;En programacion, recorrer un array, es un proceso en el que hay que tener en cuenta varias cosas:&lt;br /&gt;-Un bucle para recorrer el array&lt;br /&gt;-Saber la longitud del array&lt;br /&gt;-Recuperar cada elemento para saber si es el que buscamos&lt;br /&gt;Ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-style: italic;"&gt;a = [1, 2, 3]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;for i in 0..a.length-1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; a[i] += 1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;En ruby existe una manera más facil de hacer esto, utilizando los iteradores.&lt;br /&gt;Un iterador es un método capaz de invocar a un bloque de código de forma repetida.&lt;br /&gt;El metodo "each" es un ejemplo de iterador:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-style: italic;"&gt;a = [1, 2, 3]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;a.each{|elemento| elemento += 1}&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Otros ejemplos de iteradores: find, collect,select...&lt;br /&gt;&lt;br /&gt;Esto nos libera de código y lo hace más sencillo, ya que el propio iterador implementa el blucle, y se le puede pasar cualquier operación que queramos hacer con el array.&lt;br /&gt;&lt;br /&gt;¿Que son los bloques?&lt;br /&gt;&lt;br /&gt;En Ruby es un modo de agrupar sentencias, dando una mayor flexibilidad pero con algunas particularidades:&lt;br /&gt;&lt;br /&gt;-  Un bloque puede aparecer solamente en el código adyacente a la&lt;br /&gt;invocación de un método&lt;br /&gt;&lt;br /&gt;-No se ejecuta cuando se encuentra&lt;br /&gt;&lt;br /&gt;-Dentro del método se le hace una llamada "yield" y se ejecuta.&lt;br /&gt;&lt;br /&gt;Vamos a verlo con un ejemplo sencillo:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-style: italic;"&gt;def Hola&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;   yield&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;   yield&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;   yield&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; end&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;"tenemos un metodo, que mediante el yield llama al bloque, invocando el contenido del bloque"&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-style: italic;"&gt;Hola{puts "Hello"}&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;"Bloque simple que muestra Hello"&lt;br /&gt;&lt;br /&gt;El resultado por pantalla sería:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-style: italic;"&gt;Hello&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Hello&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Hello&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;Los bloques pueden recibir parámetros, y la última expresion evaluada en el bloque se entrega al método como el valor del yield.&lt;br /&gt;&lt;br /&gt;Ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-style: italic;"&gt;class Array&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;   def find&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;     for i in 0...size&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;       value = self[i]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;       return value if yield(value)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;     end&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;     return nil&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;   end&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; end&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; [1, 3, 5, 7, 9].find {|v| v*v &gt; 30 } &gt;&gt;  7&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;                                  &lt;br /&gt;Los bloques pueden definirse mediante llaves:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-style: italic;"&gt;[1,2,3,4,5,6].impares{|e| e**2}&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;o mediante los elementos do .. end:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-style: italic;"&gt;[1, 3, 5, 7, 9].find do |v|&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; v*v &gt; 30&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Por último los bloques pueden usarse para definir una porción de código que&lt;br /&gt;debe ejecutarse bajo algún tipo de control transaccional, por ejemplo&lt;br /&gt;operaciones con ficheros.&lt;br /&gt;&lt;br /&gt;Ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;span style="font-style: italic;"&gt;class File&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; def File.openAndProcess(*args)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;   f = File.open(*args)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;   yield f&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;   f.close()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; end&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;File.openAndProcess("testfile","r") do |aFile|&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt; print while aFile.gets&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4648270806411404400-8216111864099946577?l=cursoruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cursoruby.blogspot.com/feeds/8216111864099946577/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4648270806411404400&amp;postID=8216111864099946577' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/8216111864099946577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/8216111864099946577'/><link rel='alternate' type='text/html' href='http://cursoruby.blogspot.com/2007/11/tema-6-bloques-e-iteradores.html' title='Tema 6: Bloques e iteradores'/><author><name>ivan</name><uri>http://www.blogger.com/profile/02862730214540232118</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://www.elpais.com/recorte/20070109elpepuage_3/LCO340/Ies/perro_Sbooby_Doo_disenos_populares.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4648270806411404400.post-6684828793618414149</id><published>2007-11-21T12:39:00.000+01:00</published><updated>2007-11-21T12:51:30.660+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='expresiones'/><category scheme='http://www.blogger.com/atom/ns#' term='metodos'/><category scheme='http://www.blogger.com/atom/ns#' term='asignacion paralela'/><title type='text'>Tema 5: Expresiones</title><content type='html'>Partimos de que casi todo en ruby es una expresion, es decir todo devuelve un valor. Lo que en otros lenguajes son declaraciones, en ruby son expresiones,por ejemplo:&lt;br /&gt;          &lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;"&gt; a = if true&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Caracteristicas:&lt;/span&gt;&lt;br /&gt;  - Posibilidad de encadenar expresiones.&lt;br /&gt;  - Contiene un paquete basico de operacion  (+, ­, *, /, etc), estas operaciones son en realidad llamadas a metodos.&lt;br /&gt;           &lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;"&gt;a.+(b)   &lt;/span&gt;     &lt;br /&gt;&lt;/div&gt;    - Como sabemos todo en ruby son objetos, luego se pueden redefinir operaciones, es decir, metodos&lt;br /&gt;  - Podemos encadenar igualdades, cosa que en otros lenguajes no es posible, por ejemplo:&lt;br /&gt;           &lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;"&gt;a = (b = 1 + 2) + 3&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;    - Las igualdades se pueden hacer en lugares donde seria imposible en otros lenguajes, como por ejemplo dentro de un &lt;span style="font-weight: bold;"&gt;if&lt;/span&gt;, un &lt;span style="font-weight: bold;"&gt;while&lt;/span&gt; o en una llamada a un metodo&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Asignacion paralela:&lt;/span&gt;&lt;br /&gt;  - La simplicidad de ruby hace posible el intercambio de valores de variables, sin necesidad del uso de auxiliares:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;"&gt;a,b = b,a&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;    - Cuando una asignación tiene mas de un valor izquierdo, la expresion de asignacion retorna un array de los valores derechos.&lt;br /&gt;  -  Si una asignación contiene mas valores izquierdos que derechos, los valores izquierdos excendentes contendran &lt;span style="font-weight: bold;"&gt;nil&lt;/span&gt;.&lt;br /&gt;  - Si una asignación mútiple contiene más valores derechos que izquierdos, los valores derechos sobrantes seran ignorados.&lt;br /&gt;  -  Si el último valor izquierdo esta precedido por un asterisco, todos los valores derechos sobrantes seran asignados como un array, por ejemplo:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;"&gt;a = [1, 2, 3, 4]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;b, *c = a  » b == 1, c == [2, 3, 4]&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Expresiones boleanas:&lt;/span&gt;&lt;br /&gt;  - Todo lo que no sea &lt;span style="font-weight: bold;"&gt;false&lt;/span&gt; o &lt;span style="font-weight: bold;"&gt;nil&lt;/span&gt;, es &lt;span style="font-weight: bold;"&gt;true&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4648270806411404400-6684828793618414149?l=cursoruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cursoruby.blogspot.com/feeds/6684828793618414149/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4648270806411404400&amp;postID=6684828793618414149' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/6684828793618414149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/6684828793618414149'/><link rel='alternate' type='text/html' href='http://cursoruby.blogspot.com/2007/11/tema-5-expresiones.html' title='Tema 5: Expresiones'/><author><name>Hugo</name><uri>http://www.blogger.com/profile/08555990276251115448</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://img143.imageshack.us/img143/7382/imageshg9.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4648270806411404400.post-5697434041585123138</id><published>2007-11-21T12:38:00.000+01:00</published><updated>2007-11-21T13:30:07.556+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='atributos'/><category scheme='http://www.blogger.com/atom/ns#' term='clases'/><category scheme='http://www.blogger.com/atom/ns#' term='metodos'/><category scheme='http://www.blogger.com/atom/ns#' term='orientacion objetos'/><category scheme='http://www.blogger.com/atom/ns#' term='propiedades'/><title type='text'>Tema 4: POO</title><content type='html'>Ruby reclama ser un lenguaje de guinoes orientado a objetos, pero ¿Qué signifca exactamente "oreintado a objetos"?&lt;br /&gt;&lt;br /&gt;Tradicionalmente, un problema informático se ataca produciendo algún tipo de representación de datos y procedimientos que operan sobre esos datos. Bajo este modelo, los datos son inertes, pasivos e incapacs. Completamente a merced de un gran cuerpo procedimenta, que es activo, lógico y todopodero.&lt;br /&gt;&lt;br /&gt;A medida que crece el proyecto, empiezan a surgir interacciones complejas e inintencionadas dentro del núcleo. Existen políticas de porgramación que ayudan a minimizar y localizar errores dentro de este paradgnma pero existe una solución mejor que pasa fundamentalmente opr cambiar la forma de trabjar.&lt;br /&gt;&lt;br /&gt;La programación orietada a objetos, es delegar la mayoría del trabajo mundano y repetitio a los propios datos; modifica el concepto de los datos que pasan de pasivos a activos. Es decir:&lt;br /&gt;&lt;br /&gt;            -&lt;span style="font-style: italic;"&gt;Dejamos de tratar cada pieza de dato como una caja en la que se puede                      abrir su tapa y arrojar cosas en ella.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;            -Empezamos a tratar cada piexa de dato como una máquina funcional                          cerrada con uno pocos interruptores y diales bien definidos.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El patrón es lo que se conoce como clase y lo obtenido por ese patrón se conoce como objeto. La mayoría de los lenguajes OO necesitan una clase para tener un nuevo tipo de objeto pero Ruby no.&lt;br /&gt;Conviene resaltar que la utilización de un lenguaje OO no obliga a un diseño OO válido. Lo que permite Ruby es que la práctica de la programación OO sea lo suficientemente natural para qeu, incluso, tabajando a pequeña escal no se sietna la necesidad de recurrir a un código mal estructurado por evitar.&lt;br /&gt;&lt;br /&gt;En esta programación no se piensa en operar sobre los datos directamente desde el exterior de un objeto. Podríamos decir que se pasa un mensaje al objeto y este mensaje obtiene algún tipo de acción o respuesta significativa. las tareas qeu podemos pedir que un objeto realice son los métodos. En Ruby, se llama a un método con la notación punto. Este puede variar dependiendo del objeto con el que nos comunicamos, las piezas de datos llevan consigo ese conocimiento por lo que las solicitudes que se les hace se pueden satisfacer en las diferentes formas adecuadas. Esta característica de los lenguajes OO, se conoce com polimorismo, cuando un objeto recibe un mensaje que no conoce, "salta" un error.&lt;br /&gt;&lt;br /&gt;En ruby existe una variable especial &lt;span style="font-weight: bold;"&gt;self&lt;/span&gt; que referencia al objeto que llama a un método.&lt;br /&gt;&lt;br /&gt;La definición de los metodos es la regíon de codigo que se encuntra entre def seguido del nombre del método y la clave end.Ruby no utiliza llaves para delimitar los cuerpos de sentencias y definiciones compuestas, se finaliza siempre con la palabra clave end.&lt;br /&gt;&lt;br /&gt;En terminología OO, una categoría de objetos se denomina clase y cualquier objeto determinado que pertenece a un aclase se conoce como instancia de esa clase.&lt;br /&gt;Generalmente, se define primero las características de una clase, luego se crean las instancias. Un ejemplo&lt;br /&gt;  &lt;br /&gt;     &lt;span style="font-weight: bold;"&gt;class Perro&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;                    def ladra&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;                            print "guau guau \n"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;                    end&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;        end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El método new de cualquier clase, crea una nueva instancia. La creación de una instancia de una clase se conoce, como instanciación.&lt;br /&gt;Las propiedades o atributos son las características  de los objetos. Hay tres formas de declarar un atributo:&lt;br /&gt;&lt;br /&gt;   &lt;span style="font-weight: bold;"&gt; escritura -&gt; attr_writter &lt;span style="color: rgb(204, 0, 0);"&gt;:nombre&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;       &lt;span style="color: rgb(0, 0, 0);"&gt; lectura   -&gt; attr_reader&lt;/span&gt; :nombre&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;        ambos     -&gt; &lt;/span&gt;&lt;span style="font-weight: bold;" class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;attr&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;_&lt;/span&gt;&lt;span style="font-weight: bold;" class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;accessor&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &lt;span style="color: rgb(204, 0, 0);"&gt;:nombre&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cuando declaro un atributo me genera su &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;getter&lt;/span&gt; y su &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;setter&lt;/span&gt; de forma automática. Si el atributo es declarado de modo de lectura solo genera &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;getter&lt;/span&gt;. Para sobreescribir el &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;método&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;getter&lt;/span&gt; o &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;setter&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;   &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;   &lt;span style="font-weight: bold;"&gt; def&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; nombre_atributo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;                            ...&lt;/span&gt;&lt;br /&gt;    &lt;span style="font-weight: bold;" class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;    end&lt;/span&gt;&lt;br /&gt;    &lt;span style="font-weight: bold;" class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;    def&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; nombre_atributo=(&lt;/span&gt;&lt;span style="font-weight: bold;" class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;parámetro&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;                            ...&lt;/span&gt;&lt;br /&gt;    &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;&lt;span style="font-weight: bold;"&gt;    end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;El método &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;initialize&lt;/span&gt; si esta definido se ejecutara al crear una &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;instanci&lt;/span&gt;a de la clase. Esto nos da la oportunidad de escribir &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;código&lt;/span&gt; que establezca el estado del objeto&lt;br /&gt;   &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;&lt;br /&gt;    &lt;span style="font-weight: bold;"&gt;def&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;span style="font-weight: bold;" class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;initialize&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;                            ...&lt;/span&gt;&lt;br /&gt;    &lt;span style="font-weight: bold;" class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;    end&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4648270806411404400-5697434041585123138?l=cursoruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cursoruby.blogspot.com/feeds/5697434041585123138/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4648270806411404400&amp;postID=5697434041585123138' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/5697434041585123138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/5697434041585123138'/><link rel='alternate' type='text/html' href='http://cursoruby.blogspot.com/2007/11/tema-4-poo.html' title='Tema 4: POO'/><author><name>Iago</name><uri>http://www.blogger.com/profile/09971998537242022703</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://farm3.static.flickr.com/2147/1900776395_f7b0971f61_m.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4648270806411404400.post-8662574704464577495</id><published>2007-11-21T12:37:00.001+01:00</published><updated>2007-11-21T12:37:30.235+01:00</updated><title type='text'>Tema 3: Métodos</title><content type='html'>Los métodos son una secuencia de órdenes que realizan una tarea específica.&lt;br /&gt;En OO no se piensa operar sobre los datos directamente desde el exterior de un objeto, si no que los objetos tienen algún conocimiento de cómo se debe operar sobre ellos. Por lo tanto, las tareas que podemos pedir que un objeto realice son los métodos.&lt;br /&gt;&lt;br /&gt;En el caso de Ruby deberemos saber que si se le pasan parámetros a un método estos pueden llevar o no paréntesis (si su ausencia no provoca ambigüedad). Además, cuando un método retorna un valor no es necesario la utilización de "return" ya que Ruby devuelve la última expresión evaluada; en caso de querer devolver más valores si se utilizará.&lt;br /&gt;&lt;br /&gt;Los métodos y llamadas a los mismos tiene la siguiente estructura:&lt;br /&gt;&lt;br /&gt;def nombre_del_metodo (parametros)&lt;br /&gt;     ...&lt;br /&gt;     ...&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;#Para invocarlo&lt;br /&gt;self.nombre_metodo ó nombre_metodo&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4648270806411404400-8662574704464577495?l=cursoruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cursoruby.blogspot.com/feeds/8662574704464577495/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4648270806411404400&amp;postID=8662574704464577495' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/8662574704464577495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/8662574704464577495'/><link rel='alternate' type='text/html' href='http://cursoruby.blogspot.com/2007/11/tema-3-mtodos.html' title='Tema 3: Métodos'/><author><name>Panchita</name><uri>http://www.blogger.com/profile/11610472188701419686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4648270806411404400.post-8604425737900763616</id><published>2007-11-21T12:34:00.000+01:00</published><updated>2007-11-21T13:16:32.018+01:00</updated><title type='text'>Tema 2: Ruby.new</title><content type='html'>Ruby es un lenguaje de scripts y orientado a objetos. Todo en ruby es un objeto.Su API puede ser consultada en: http://www.ruby­doc.org/core/&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Consideraciones generales&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ruby puede tratar números tan grandes como lo permita la memoria del ordenador.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;No es necesario el punto y coma al final de cada orden&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Los comentarios comienzan con '#' &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Podemos ahorrarnos los paréntesis a la hora de pasar parámentros si no incurrimos en ambigüedades.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Todo método acabado en '?' devuelve true o false.&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Todo método acabado en '!' modifica el invocador.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Clases Importantes&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Clase String&lt;/li&gt;&lt;/ul&gt;Pueden pasarse entre comillas simples o dobles y se concatenan con +.&lt;br /&gt;Algunos métodos importantes son:&lt;br /&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;  chop: elimina el último carácter del string&lt;/li&gt;&lt;li&gt;chomp: elimina el salto de línea al final del string. &lt;/li&gt;&lt;li&gt;  split(a): devuelve un array de strings considerando el parámetro pasado como separador.&lt;/li&gt;&lt;li&gt;  reverse: da la vuelta al string.&lt;/li&gt;&lt;li&gt;upcase | downcase: devuelve la cadena en minúsculas o mayúsculas.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Clase &lt;span style="font-weight: bold;"&gt;Symbol&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;  Son exclusivos de Ruby y comienzan siempre por ':'. Representan cadenas de textos, tal y como los strings. A diferencia de estos, permiten ahorrar memoria ya que cualquier otro Symbol con los mismos caracteres hacen referencia a la misma posición de memoria&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Clases &lt;span style="font-weight: bold;"&gt;Array&lt;/span&gt; y &lt;span style="font-weight: bold;"&gt;Hash&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;Representan colecciones ordenadas. En el caso de los arrays las claves son enteros, mientras que en los hashes pueden ser cualquier objeto.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;Estructuras de control&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: left;"&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;if / elsif / else&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;if a &gt; 3&lt;br /&gt;puts "Mayor"&lt;br /&gt;elsif a &gt; 3&lt;br /&gt;puts "Menor"&lt;br /&gt;else puts "Igual"&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;case:&lt;/span&gt;  Igualito al switch de Java pero más potente&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;                  case a&lt;br /&gt;                      when String&lt;br /&gt;                         puts "Es un string"&lt;br /&gt;                      when Integer&lt;br /&gt;                         puts "Es un entero"&lt;br /&gt;                  end&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;while:&lt;/span&gt; El bucle por excelencia, su negado es until.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt; a = 5&lt;br /&gt; while a &lt;10&lt;br /&gt;  puts a&lt;br /&gt;  a +1&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;ul style="font-weight: bold;"&gt;&lt;li&gt;for&lt;/li&gt;&lt;/ul&gt;for elem in colección&lt;br /&gt;   ...&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span&gt;&lt;br /&gt;Existe cuatro formas de interrumpir de un bucle desde su interior.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div style="text-align: left;"&gt;&lt;span&gt;break:   Sale completamente del bucle.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;next:    Salta al principio de la siguiente iteración del bucle.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;redo:    Reinicia la iteración en curso.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;return:  Produce la salida no solo del bucle si no también del&lt;/span&gt;&lt;br /&gt;&lt;span&gt;         método que lo contiene.&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4648270806411404400-8604425737900763616?l=cursoruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cursoruby.blogspot.com/feeds/8604425737900763616/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4648270806411404400&amp;postID=8604425737900763616' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/8604425737900763616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/8604425737900763616'/><link rel='alternate' type='text/html' href='http://cursoruby.blogspot.com/2007/11/tema-2-rubynew.html' title='Tema 2: Ruby.new'/><author><name>Eduardo Fernández</name><uri>http://www.blogger.com/profile/12716448476266383515</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4648270806411404400.post-5346664594832316231</id><published>2007-11-21T12:13:00.000+01:00</published><updated>2007-11-21T13:44:27.020+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><title type='text'>Temas 0 y 1: Intro e instalación</title><content type='html'>&lt;div  style="text-align: justify;font-family:arial;"&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);font-size:100%;" &gt;INTRODUCCIÓN&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;Ruby on Rails&lt;/span&gt; es un framework de desarrollo para aplicaciones web de código abierto escrito en el lenguaje de programación Ruby, siguiendo el patrón MVC (Modelo Vista Controlador).&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;Rails&lt;/span&gt; fue creado por en 2004 David Heinemeier Hansson. Los principios fundamentales de Ruby on Rails incluyen &lt;span style="font-style: italic;"&gt;No te repitas&lt;/span&gt; (del inglés &lt;span style="font-style: italic;"&gt;Don't repeat yourself&lt;/span&gt;, DRY) y&lt;span style="font-style: italic;"&gt; Convención sobre configuración&lt;/span&gt;; eso significa que las configuraciones deberían definirse una sola vez y que el programador sólo necesita definir aquella configuración que no es convencional.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;Ruby&lt;/span&gt; es un lenguaje de programación completamente orientado a objetos(lenguaje interpretado), creado por el programador japonés Yukihiro "Matz" Matsumoto en 1993. Combina una sintaxis (sencilla y consistente) inspirada en Python, Perl y Smalltalk. Comparte también funcionalidad con otros lenguajes de programación como Lisp, Lua, Dylan y CLU. Ruby es un lenguaje de programación interpretado en una sola pasada y su implementación oficial es distribuida bajo una licencia de software libre. La última versión estable es la 1.8.6, aunque la 1.9 se encuentra ya en desarrollo.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Funciona tanto en Linux, Windows y Mac.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;El lenguaje de programación Ruby permite la metaprogramación, de la cual Rails hace uso.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Algunas páginas que usan Ruby on Rails:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:100%;" &gt;&gt; http://lacomunidad.elpais.com/&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:100%;" &gt;&gt; http://www.lacoctelera.com/&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:100%;" &gt;&gt; http://www.blogs.telecinco.es/&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:100%;" &gt;&gt; http://www.vorago.es&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(255, 102, 0);font-family:arial;font-size:100%;"  &gt;INSTALACIÓN en Linux&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Ruby&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&gt; Abrir terminal&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;   Ejecutar comando: &lt;span style="color: rgb(51, 51, 255);"&gt;sudo apt­get install ruby&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Radrails&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&gt; Paso 1:&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;    Descargarse zip radrails: http://www.aptana.com/download_radrails.php&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;    &lt;span style="color: rgb(51, 51, 255);"&gt;cd &gt; instaladores &gt;radrails­0.7.2­linux­gtk.tar.gz ­­&gt; linux&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;    &lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&gt; Paso 2:&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;    Descomprimir en: &lt;span style="color: rgb(51, 51, 255);"&gt;desarrollo &gt; ruby &gt; install&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;    Dejar una copia del instalador en: &lt;span style="color: rgb(51, 51, 255);"&gt;desarrollo &gt; ruby &gt; instaladores&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;font-size:100%;" &gt;Configurar Radrails&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;Debemos indicar a radrails donde esta el interprete de ruby&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;   &lt;span style="color: rgb(51, 102, 255);"&gt; Opciones de menu run &gt; run...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4648270806411404400-5346664594832316231?l=cursoruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cursoruby.blogspot.com/feeds/5346664594832316231/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4648270806411404400&amp;postID=5346664594832316231' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/5346664594832316231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/5346664594832316231'/><link rel='alternate' type='text/html' href='http://cursoruby.blogspot.com/2007/11/temas-0-y-1-intro-e-instalacin.html' title='Temas 0 y 1: Intro e instalación'/><author><name>LMR</name><uri>http://www.blogger.com/profile/01967893120328402384</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://lh6.google.es/LauMR81/RzGaAjaSpII/AAAAAAAAAB0/7RvskpEjnhc/s144/ed.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4648270806411404400.post-812305304933998353</id><published>2007-11-09T12:59:00.000+01:00</published><updated>2007-11-09T13:05:12.032+01:00</updated><title type='text'>El blog de tod@s y entre tod@s</title><content type='html'>Ya tenemos un blog en el que todos podamos aportar nuestro granito de arena.&lt;br /&gt;&lt;br /&gt;La principal función de este blog es describir nuestros avances a lo largo de las semanas que dura el curso, incluyendo apuntes, direcciones de interés y por supuesto opiniones.&lt;br /&gt;&lt;br /&gt;Aceptamos cualquier sugerencia sobre la mejora del blog comunal y por supuesto, comentarios de cualquiera de los temas que tratamos.&lt;br /&gt;&lt;br /&gt;Un saludo de todo el grupo de Ruby on Rails 2007.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4648270806411404400-812305304933998353?l=cursoruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cursoruby.blogspot.com/feeds/812305304933998353/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4648270806411404400&amp;postID=812305304933998353' title='13 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/812305304933998353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/812305304933998353'/><link rel='alternate' type='text/html' href='http://cursoruby.blogspot.com/2007/11/el-blog-de-tods-y-entre-tods.html' title='El blog de tod@s y entre tod@s'/><author><name>lauritass</name><uri>http://www.blogger.com/profile/15786479047027878082</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://www.connectedconcepts.net/photos/tgrsp535.gif'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4648270806411404400.post-9088270393771023203</id><published>2007-11-09T10:30:00.000+01:00</published><updated>2007-11-09T13:17:33.532+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='comunidad'/><category scheme='http://www.blogger.com/atom/ns#' term='web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='portales 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='mashup'/><category scheme='http://www.blogger.com/atom/ns#' term='rss'/><title type='text'>WEB 2.0</title><content type='html'>&lt;span style="font-weight: bold;"&gt;¿Qué es la Web 2.0?&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.infinityteknoloji.com/upload/data/Image/web2.0.gif"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 121px; height: 139px;" src="http://www.infinityteknoloji.com/upload/data/Image/web2.0.gif" alt="" border="1" /&gt;&lt;/a&gt;Si hablamos de Web 2.0 debemos hacer referencia primero a lo que podría llamarse Web 1.0, que englobara todos los sitios web cuyas características predominantes son el contenido estático y la baja interacción entre el usuario y la web.&lt;br /&gt;&lt;br /&gt;En la Web 2.0 nos encontramos aplicaciones web con un  alto grado de personalización por parte del usuario y orientado principalmente a la interacción.&lt;br /&gt;&lt;br /&gt;Con la web 2.0, aparecen nuevos conceptos en el mundo de la red, comunidades, blogs, portales 2.0, mashup, etc en donde el dinamismo y la interacción cobra un papel importante.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;¿Que es RSS?&lt;/b&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.codigogeek.com/images/Noticias/rss-3d.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 140px; height: 147px;" src="http://www.codigogeek.com/images/Noticias/rss-3d.png" alt="" border="1" /&gt;&lt;/a&gt;&lt;br /&gt;Es un tipo de formato XML desarrollado para sitios web donde la actualización de datos, información, etc es constante.&lt;br /&gt;El RSS no es solo utilizado por el usuario para recibir la información que otros le ofrecen, sino que también le resulta útil para mostrar los contenidos novedosos de su web a otros internautas.&lt;br /&gt;&lt;br /&gt;Existen tres tipos de formato RSS cuyas siglas adquieren un significado diferente según la especificación usada:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Rich Site Summary (RSS 0.91)&lt;/li&gt;&lt;li&gt;RDF Site Summary (RSS 0.9 y 1.0)&lt;/li&gt;&lt;li&gt;Really Simple Syndication (RSS 2.0)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;El hecho de compartir y usar esta información en otras web se conoce como Sindicación Web.&lt;br /&gt;&lt;br /&gt;Como ejemplo de la utilización de RSS hemos incluido en nuestro blog un feed de noticias de Vorago.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;¿Que son los Portales 2.0?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Un portal es un sitio web que ofrece al usuario una serie de servicios y recursos. Un portal está destinado para ser el lugar de partida del usuario en su viaje por internet.&lt;br /&gt;&lt;br /&gt;La "evolución" de los portales tradicionales de Internet ha dado paso a los denominados portales 2.0 gracias al concepto de WEB 2.0 el cual se caracteriza por la participación activa de los usuarios.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://delirioweb.com/upload/web-20-iconos.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px;" src="http://delirioweb.com/upload/web-20-iconos.jpg" alt="" border="1" /&gt;&lt;/a&gt;&lt;br /&gt;La principal característica de los portales 2.0 es el alto grado de personalizacion por parte del usuario. Puede escoger qué tipo de información, cómo y dónde se muestra dicha información al acceder al portal. Otra caracteristica es el alto grado de accesibilidad y el uso de nuevas tecnologías, por ejemplo las mecionadas RSS.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Ejemplos de portales 2.0:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fotolog.com/" target="_new"&gt;Fotolog&lt;/a&gt; : Nacido como Fotolog.net, es el sitio web más grande del mundo dedicado a los blogs fotográficos, conocidos genéricamente como fotologs.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.wikipedia.com/" target="_new"&gt;Wikipedia&lt;/a&gt; : Enciclopedia libre plurilingüe basada en la tecnología wiki. Wikipedia se escribe de forma colaborativa por voluntarios, permitiendo que la gran mayoría de los artículos sean modificados por cualquier persona con acceso mediante un navegador web.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.youtube.com/" target="_new"&gt;Youtube&lt;/a&gt; : Sitio web que permite a los usuarios compartir vídeos digitales a traves de internet.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.infojobs.net/" target="_new"&gt;Infojobs&lt;/a&gt; : La bolsa de empleo online líder en España.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.meneame.net/%20" target="_new"&gt;Meneame&lt;/a&gt; : Clon de Digg, los usuarios crean la portada con noticias sindicadas de otras webs.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.tagzania.com/" target="_new"&gt;Tagzania&lt;/a&gt; : Es un geolocalizador social.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.fon.com/es" target="_new"&gt;&lt;/a&gt;&lt;a href="http://www.barrapunto.com/" target="_new"&gt;Barrapunto&lt;/a&gt; : Noticias de interés relacionadas con la informática y la tecnología.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.zoho.com/" target="_new"&gt;Zoho&lt;/a&gt; : Conjunto de aplicaciones web desarrolladas por la empresa norteamericana AdventNet.&lt;br /&gt;&lt;br /&gt;La suite de Zoho se compone de:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Zoho sheet:                Hoja de cálculo&lt;/li&gt;&lt;li&gt;Zoho meeting:      Mantener conferencias&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Zoho show:                Editor de diapositivas&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Zoho writter:          Procesador de texto&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Zoho notebook:  Similiar a Zoho wiki pero con alguna posibilidad más.&lt;/li&gt;&lt;li&gt;Zoho creator:        Creación de aplicaciones web pequeñas&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Zoho planner:       Agenda&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Zoho wiki:                   Creacion de wikis&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Zoho chat:                   Chat&lt;/li&gt;&lt;/ul&gt;Como principales características debemos mencionar que estas aplicaciones gratuitas se ejecutan en cualquier navegador y están dirigidas a cualquier tipo de usuario.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.wiki-site.com/index.php/Cursoruby" target="_new"&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Las wikis&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Una wiki es un sitio web en el que el contenido puede ser creado , modificado y eliminado por los propios usuarios. El principal ejemplo de wiki es la wikipedia.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;Como experiencia del grupo en el tema de las "wikis" se ha diseñado :&lt;br /&gt;&lt;a href="http://www.wiki-site.com/index.php/Cursoruby" target="_new"&gt;http://www.wiki-site.com/index.php/Cursoruby&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;¿Que es un mashup?&lt;/b&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://share.skype.com/sites/devzone/headshot_mashup.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px;" src="http://share.skype.com/sites/devzone/headshot_mashup.jpg" alt="" border="1" /&gt;&lt;/a&gt;&lt;br /&gt;Es un sitio o servicio web que usa código o contenido de otras fuentes. Este contenido  se suele obtener principalmente mediante RSS, usando una API o Screen scraping.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4648270806411404400-9088270393771023203?l=cursoruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cursoruby.blogspot.com/feeds/9088270393771023203/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4648270806411404400&amp;postID=9088270393771023203' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/9088270393771023203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/9088270393771023203'/><link rel='alternate' type='text/html' href='http://cursoruby.blogspot.com/2007/11/qu-es-la-web-2.html' title='WEB 2.0'/><author><name>Iván Álvarez</name><uri>http://www.blogger.com/profile/04821904986925139513</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://scr.softonic.com/s2/45000/45690/0_homer.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4648270806411404400.post-8291873149749281817</id><published>2007-11-09T10:03:00.000+01:00</published><updated>2007-11-09T12:51:38.261+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='licencias'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='programacion'/><title type='text'>Software Libre (definicion)</title><content type='html'>Hemos aprendido que el &lt;span style="font-weight: bold;"&gt;Software libre&lt;/span&gt; es beneficioso en cuanto que ofrece libertad al usuario para ejecutar, copiar, distribuir, estudiar, cambiar y mejorar dicho software, teniendo en cuenta que S.L. no tiene porque ser equivalente a "gratis".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Licencias de software libre&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li style="font-weight: bold;"&gt;Licencia GPL&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Ventajas:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;                Distribuye copias y modifica el software libre&lt;/li&gt;&lt;li&gt;Es posible recibir un beneficio económico por distribuir copias.&lt;/li&gt;&lt;li&gt;Puede mezclarse con software no libre&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;Desventajas:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;No puede transformarse en software privado.&lt;/li&gt;&lt;li&gt;No se pueden añadir más restricciones a la licencia.&lt;/li&gt;&lt;li&gt;No hay garantía sobre el correcto funcionamiento del software.&lt;/li&gt;&lt;li&gt;Las modificaciones realizadas deben publicarse en forma de código fuente.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li style="font-weight: bold;"&gt;Licencia estilo BSD&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Ventajas:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Puede trasformar el software en software privado.&lt;/li&gt;&lt;li&gt;No es necesario publicar las modificaciones en forma de código fuente.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;Desventajas:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;No hay garantía sobre el correcto funcionamiento del software.&lt;/li&gt;&lt;li&gt;Al permitir transformar el software en software privado no contribuye al desarrollo de software libre.&lt;/li&gt;&lt;li&gt;                No puede mezclarse con software no libre&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li style="font-weight: bold;"&gt;Licencia estilo MPL y derivadas&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Ventajas:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Mejora algunos puntos de las licencias GPL y BSD&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;Desventajas:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Las empresas que contribuyan al código deben renunciar a derechos sobre el código fuente.&lt;/li&gt;&lt;li&gt;No puede mezclarse con software no libre&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li style="font-weight: bold;"&gt;Licencia Copyleft&lt;/li&gt;&lt;ul&gt;&lt;li&gt;          Ventajas:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;                Permite la copia, distribución y en ciertos casos, modificación de los contenidos&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4648270806411404400-8291873149749281817?l=cursoruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cursoruby.blogspot.com/feeds/8291873149749281817/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4648270806411404400&amp;postID=8291873149749281817' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/8291873149749281817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/8291873149749281817'/><link rel='alternate' type='text/html' href='http://cursoruby.blogspot.com/2007/11/software-libre-definicion.html' title='Software Libre (definicion)'/><author><name>Panchita</name><uri>http://www.blogger.com/profile/11610472188701419686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4648270806411404400.post-8385549732076539116</id><published>2007-11-09T09:27:00.000+01:00</published><updated>2008-11-13T14:09:11.989+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby on rails'/><category scheme='http://www.blogger.com/atom/ns#' term='rails'/><category scheme='http://www.blogger.com/atom/ns#' term='framework'/><category scheme='http://www.blogger.com/atom/ns#' term='structs'/><title type='text'>Introducción a Ruby on Rails</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Ruby:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Se trata de un lenguaje de programación interpretado no compilado, creado en 1993 por el japonés Yukihiro “matz” Matsumoto. Surge a partir de otros lenguajes ya conocidos como Python y Perl.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/www.37signals.com"&gt;www.37signals.com&lt;/a&gt; es la empresa creadora del paquete Ruby on Rails.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Principales caracteristicas:&lt;/span&gt;&lt;ul&gt;&lt;li&gt;Es un lenguaje Interpretado.&lt;/li&gt;&lt;li&gt;Sintaxis sencilla y consistente.&lt;/li&gt;&lt;li&gt;Completamente orientado a objetos&lt;/li&gt;&lt;li&gt;Clases, herencia, metodos.&lt;/li&gt;&lt;li&gt;Dinamismo.&lt;/li&gt;&lt;li&gt;Recoleccion de basura.&lt;/li&gt;&lt;li&gt;Manejo de Excepciones.&lt;/li&gt;&lt;li&gt;Tratamiento de expresiones regulares.&lt;/li&gt;&lt;li&gt;Capacidades de introspeccion, reflexion y metaprogramación.&lt;/li&gt;&lt;li&gt;Portable (Windows, Linux y Mac).&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Rails:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Es un framework&lt;span style="font-size:78%;"&gt;(1)&lt;/span&gt; para el desarrollo de aplicaciones web. Nace en las manos del danés  David Heinemeier Hansson en 2004.&lt;br /&gt;&lt;br /&gt;Se basa en la arquitectura MVC (Modelo, Vista, Controlador).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_bg-ZSPg_NtE/RzRJiRWcNkI/AAAAAAAAACI/PUaEvHYPgTI/s1600-h/DiagramaMVC.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/_bg-ZSPg_NtE/RzRJiRWcNkI/AAAAAAAAACI/PUaEvHYPgTI/s400/DiagramaMVC.jpg" alt="" id="BLOGGER_PHOTO_ID_5130806728603743810" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sigue dos principios básicos:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Convention over configuration (CoC).&lt;/li&gt;&lt;li&gt;Don´t Repeat Yourself (DRY).&lt;/li&gt;&lt;/ul&gt;Integracion con AJAX:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Prototype : &lt;a href="http://www.blogger.com/www.protoypepejs.org"&gt;www.protoypepejs.org&lt;/a&gt;&lt;/li&gt;&lt;li&gt;scriptaculous: &lt;a href="http://script.aculo.us/"&gt;http://script.aculo.us/&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ventajas:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;La productividad aumenta debido a la rapidez de desarrollo&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Menor cantidada de código&lt;/li&gt;&lt;li&gt;No hay ficheros de configuración&lt;/li&gt;&lt;li&gt;Todo está en su sitio.&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Desventajas&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;¿Escalabilidad?&lt;/li&gt;&lt;li&gt;¿Rendimiento?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Alternativas a Ruby:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Python:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Django: &lt;a href="http://www.blogger.com/www.djangoproject.com"&gt;www.djangoproject.com&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Turbo Gears: &lt;a href="http://turbogears.com/"&gt;http://turbogears.com&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;PHP:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Cake PHP: &lt;a href="http://www.blogger.com/www.cakephp.org."&gt;www.cakephp.org.&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Zend: &lt;a href="http://framework.zend.com/"&gt;http://framework.zend.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Symfony: &lt;a href="http://www.blogger.com/www.symfony.com"&gt;www.symfony.com&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ejemplos del uso de Ruby on Rails:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;En España:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;The cocktail&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.blogger.com/www.lacoctelera.com"&gt;www.lacoctelera.com&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.blogger.com/www.mtv.com"&gt;www.mtv.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.blogger.com/www.lacomunidad.elpais.com"&gt;www.lacomunidad.elpais.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.blogger.com/www.blog.telecinco.es"&gt;www.blog.telecinco.es&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;ASPgems&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.blogger.com/www.aspgems.com"&gt;www.aspgems.com&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.blogger.com/www.facturegem.com"&gt;www.facturegem.com&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;Otros lugares:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;37signals&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.blogger.com/www.37signals.com"&gt;www.37signals.com&lt;/a&gt;   ---&gt;  Desarrollador del framework&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.blogger.com/www.basecamphq.com"&gt;www.basecamphq.com&lt;/a&gt;  ---&gt;  Gestión de proyectos&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.blogger.com/www.highrisehq.com"&gt;www.highrisehq.com&lt;/a&gt; ---&gt;  Gestión de contactos&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;twitter&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.blogger.com/www.twitter.com"&gt;www.twitter.com&lt;/a&gt;  ---&gt;  red social de mensajes cortos&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;jobster&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.blogger.com/www.jobster.com"&gt;www.jobster.com&lt;/a&gt;  ---&gt;  Página de trabajo&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="http://www.blogger.com/www.odeo.com"&gt;www.odeo.com&lt;/a&gt;  ---&gt;  Videos, música&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.blogger.com/www.yellowpages.com"&gt;www.yellowpages.com&lt;/a&gt;  ---&gt;  Paginas amarillas&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.blogger.com/www.magnolia.com"&gt;www.magnolia.com&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Información de Ruby on Rails:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://pickaxe.ruby.org.es/"&gt;http://pickaxe.ruby.org.es&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ruby-lang.org/es"&gt;http://ruby-lang.org/es&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://ruby-lang.org/es/documentacion"&gt;http://ruby-lang.org/es/documentacion&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.rubyonrails.org/"&gt;http://www.rubyonrails.org&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ruby-forum.com/"&gt;http://www.ruby-forum.com&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold;"&gt;(1)&lt;/span&gt;  Framework: &lt;span style="font-style: italic;"&gt;Es una base que contiene una serie de clases y elementos ya definidos necesarios para la creacion de un programa. Es como un esqueleto o una estructura base que sirve como ayuda para el desarrollo de un programa.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;     Rails es el framework de Ruby mientras que Structs es el framework de java.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4648270806411404400-8385549732076539116?l=cursoruby.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cursoruby.blogspot.com/feeds/8385549732076539116/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4648270806411404400&amp;postID=8385549732076539116' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/8385549732076539116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4648270806411404400/posts/default/8385549732076539116'/><link rel='alternate' type='text/html' href='http://cursoruby.blogspot.com/2007/11/apuntes-de-clase-ruby-on-riles-y-web-20.html' title='Introducción a Ruby on Rails'/><author><name>kahuna</name><uri>http://www.blogger.com/profile/03247940468056353606</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_bg-ZSPg_NtE/RzRJiRWcNkI/AAAAAAAAACI/PUaEvHYPgTI/s72-c/DiagramaMVC.jpg' height='72' width='72'/><thr:total>1</thr:total></entry></feed>
