<?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-9291335</id><updated>2012-01-27T09:19:46.995+01:00</updated><category term='Libros'/><category term='Articulo'/><category term='Fedora'/><category term='Pivot'/><category term='SQL'/><category term='Robótica'/><category term='C'/><category term='ADSL'/><category term='Videoconsolas'/><category term='SQLite'/><category term='Windows'/><category term='Metodologías'/><category term='Apple'/><category term='RIA'/><category term='Richard Stallman'/><category term='Web'/><category term='Escritorio'/><category term='MongoDB'/><category term='Varios'/><category term='Frases'/><category term='Software libre'/><category term='Opensource'/><category term='Compiz'/><category term='Eventos'/><category term='Flex'/><category term='Humor'/><category term='Apache'/><category term='Ideas'/><category term='Retoque Fotográfico'/><category term='Denuncia'/><category term='Windows Vista'/><category term='Servicios Web'/><category term='MySQL'/><category term='Propiedad Intelectual'/><category term='AIR'/><category term='Christmas'/><category term='Dennis Ritchie'/><category term='Tecnillusions'/><category term='Gmail'/><category term='Coaching'/><category term='XML'/><category term='NetBeans'/><category term='Política'/><category term='CouchDB'/><category term='PYMES'/><category term='OpenSolaris'/><category term='Música'/><category term='Tomcat'/><category term='Navegador'/><category term='iPhone'/><category term='PostgreSQL'/><category term='Juegos'/><category term='Cultura'/><category term='Agile'/><category term='Redes Sociales'/><category term='Scrum'/><category term='Seguridad'/><category term='Programas interesantes'/><category term='Diseño'/><category term='Tecnología'/><category term='J2EE'/><category term='.NET'/><category term='Desarrollo'/><category term='UNIX'/><category term='Python'/><category term='Ingeniería'/><category term='Enlightment'/><category term='Vista'/><category term='Consolas'/><category term='Twitter'/><category term='Debate'/><category term='Microsoft'/><category term='OpenLaszlo'/><category term='Películas'/><category term='Bases de Datos'/><category term='SIMO'/><category term='OLED'/><category term='Programación'/><category term='Tutorial'/><category term='SPI'/><category term='Codigo abierto'/><category term='GNU'/><category term='BSD'/><category term='Ajax'/><category term='Programas'/><category term='Parte 2'/><category term='Steve Jobs'/><category term='Fuentes'/><category term='Matemáticas'/><category term='Spectrum'/><category term='Autoayuda'/><category term='Noticias'/><category term='tecnodependencia'/><category term='Virtual'/><category term='Software'/><category term='eAdministración'/><category term='Ensayo'/><category term='Desarrollo personal'/><category term='Freeware'/><category term='JSON'/><category term='Yahoo'/><category term='Facebook'/><category term='Crisis'/><category term='Informática'/><category term='Internet'/><category term='Messenger'/><category term='Neutralidad'/><category term='Reflexión'/><category term='Java'/><category term='Ley Sinde'/><category term='Web 2.0'/><category term='NoSQL'/><category term='Google'/><category term='JavaFX'/><category term='Mandriva'/><category term='PHP'/><category term='obituario'/><category term='ODBMS'/><category term='Ruby'/><category term='Linux'/><category term='Hardware'/><category term='Chiste'/><category term='Teléfono móvil'/><category term='TI Facturas'/><category term='Silverlight'/><title type='text'>Raticos tecnológicos</title><subtitle type='html'>Reflexiones, artículos, opiniones, recomendaciones, noticias... sobre la tecnología.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default?start-index=101&amp;max-results=100'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>624</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9291335.post-6807438244409264481</id><published>2012-01-11T23:25:00.001+01:00</published><updated>2012-01-11T23:25:33.702+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Conceptos básicos de Ruby</title><content type='html'>En el presente post vamos a tomar un barniz del lenguaje de programación Ruby. Para ello, se presupone que el lector ya tiene instalado Ruby en su equipo (&lt;a href="http://www.ruby-lang.org/es/downloads/"&gt;Descarga de Ruby&lt;/a&gt;). Recomiendo leer mi post anterior (&lt;a href="http://rafinguer.blogspot.com/2011/09/primera-toma-de-contacto-con-ruby.html"&gt;Primera toma de contacto con Ruby&lt;/a&gt;), el cual da unas nociones preliminares, y que seguro será útil para el lector.&lt;br /&gt;&lt;br /&gt;Para entender los conceptos claramente, lo mejor es ilustrarlo con un ejemplo muy sencillo:&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-P_SSgF3lrMg/Tw3Iq0SU-hI/AAAAAAAACGI/RvBQ5S75qvc/s1600/prueba1Ruby.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="152" src="http://2.bp.blogspot.com/-P_SSgF3lrMg/Tw3Iq0SU-hI/AAAAAAAACGI/RvBQ5S75qvc/s400/prueba1Ruby.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;La línea 1 es un comentario. No ejecuta nada. Es un texto que sirve para aclarar qué se va a hacer. El comentario abarca desde que aparece el símbolo pragma (#), hasta el final de la línea.&lt;br /&gt;&lt;br /&gt;La línea 2 (&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;print('Escribe tu nombre: '&lt;/span&gt;), visualiza en pantalla el texto encerrado entre las comillas, sin realizar un retorno de carro (línea siguiente). Da igual utilizar comillas simples o dobles.&lt;br /&gt;&lt;br /&gt;La línea 3 declara una variable (&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;nombre&lt;/span&gt;), a la cual se le asigna (mediante el símbolo de "igual") la expresión que hay a la derecha, en este caso, la función &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;gets&lt;/span&gt;, la cual captura mediante teclado una cadena texto, hasta que el usuario pulsa &lt;i&gt;Enter&lt;/i&gt;. El nombre de la función se debe a &lt;i&gt;"get"&lt;/i&gt; (obtener) y &lt;i&gt;"s"&lt;/i&gt; (&lt;i&gt;"string"&lt;/i&gt; o cadena de texto).&lt;br /&gt;&lt;br /&gt;La línea 4 realiza lo mismo que la línea 2, pero con otro texto. La línea 5 define otra variable (&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;edad&lt;/span&gt;), a la cual le asigna la cadena capturada por &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;gets&lt;/span&gt;, pero cuyo resultado (la cadena), es convertida a un número entero mediante la función &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;to_i&amp;nbsp;&lt;/span&gt;(&lt;i&gt;"to integer"&lt;/i&gt; o &lt;i&gt;"a entero"&lt;/i&gt;). Esta línea es interesante porque se pueden explicar varias cosas interesantes. En primer lugar, las funciones suelen escribirse con paréntesis, aunque no tengan argumentos. En la línea 3 se omitieron los paréntesis, ya que Ruby lo interpreta de la misma manera. Otro punto interesante es que, en Ruby, todo es un objeto. Los objetos tienen propiedades (valores) y acciones (métodos o funciones), a los cuales se accede escribiendo un punto después del objeto, y escribiendo el nombre de la propiedad o de la acción. En este caso, &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;gets&lt;/span&gt; retorna una cadena de texto, que en sí es un objeto, por lo que tienen acciones asociadas, en este caso, la acción &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;to_i&lt;/span&gt;, la cual retorna un valor numérico entero correspondiente de la conversión de la cadena a número. Si no es posible la conversión, retornará un cero. Resumiendo, la variable &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;edad&lt;/span&gt; capturará en un número entero que el usuario introduce por teclado.&lt;br /&gt;&lt;br /&gt;La línea 7 muestra un texto, al igual que &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;print&lt;/span&gt;, pero &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;puts&lt;/span&gt; añade un retorno de carro al final, cambiando de línea para la siguiente impresión. Dentro del texto a imprimir (entre comillas), aparece la expresión &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;#{expr}&lt;/span&gt;, la cual sustituye todo por el valor contenido dentro como &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;expr&lt;/span&gt;, la cual puede ser una variable, un cálculo o cualquier expresión que retorne un valor. En este caso, sería el valor de la variable &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;nombre&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;La línea 8, realiza una operación similar, pero demostrando que la variable &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;nombre&lt;/span&gt; es un objeto de tipo &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;string&lt;/span&gt;, y accediendo al método &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;length&lt;/span&gt;, el cual retorna el número de caracteres de la cadena de texto. En este caso, se observará que retorna la longitud más uno, debido a que también atrapó el carácter de retorno de línea (al pulsar &lt;i&gt;Enter&lt;/i&gt;). Para corregir este defecto se podría utilizar la expresión "&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;#{nombre.length-1}&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;La línea 13 realiza una evaluación condicional, preguntando si el valor (&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;if (condición) then&lt;/span&gt; / &lt;i&gt;si (condición) entonces&lt;/i&gt;) de la variable &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;edad&lt;/span&gt; es menor de 18, en cuyo caso imprimirá en pantalla el literal &lt;i&gt;"menor"&lt;/i&gt;, si no (&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;else&lt;/span&gt;) imprimirá el literal &lt;i&gt;"mayor"&lt;/i&gt;. El bloque de condiciones termina en la línea 17, con &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;end&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Este código se guarda en un archivo (por ejemplo: &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;pruebaruby1.rb&lt;/span&gt;). Para ejecutarlo, desde la consola de comandos se lanza la siguiente sentencia:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;$ ruby pruebaruby1.rb&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Escribe tu nombre: Rafael&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Escribe tu edad: 40&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Hola, Rafael&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Tu nombre tiene 7 caracteres&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Eres mayor de edad, y te quedan 27 anos para jubilarte&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;Encantado de conocerte. ADIOS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-6807438244409264481?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/6807438244409264481/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=6807438244409264481&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6807438244409264481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6807438244409264481'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2012/01/conceptos-basicos-de-ruby.html' title='Conceptos básicos de Ruby'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-P_SSgF3lrMg/Tw3Iq0SU-hI/AAAAAAAACGI/RvBQ5S75qvc/s72-c/prueba1Ruby.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-5472643667404704129</id><published>2011-12-20T21:58:00.003+01:00</published><updated>2011-12-20T21:58:24.835+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Frases'/><title type='text'>Reflexiones para el 2012 (HD)</title><content type='html'>&lt;iframe allowfullscreen="" frameborder="0" height="344" src="http://www.youtube.com/embed/nyF5GGH-Sfw?fs=1" width="459"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-5472643667404704129?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/5472643667404704129/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=5472643667404704129&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/5472643667404704129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/5472643667404704129'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2011/12/reflexiones-para-el-2012-hd.html' title='Reflexiones para el 2012 (HD)'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/nyF5GGH-Sfw/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-1880539806684607477</id><published>2011-10-31T14:50:00.004+01:00</published><updated>2011-10-31T14:50:56.718+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Liberado Puppy Linux 5.3 'Slacko'</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-PbVBg7LNLzQ/Tq6nno0_B5I/AAAAAAAABzc/soUbO2_jvrA/s1600/6208351392_5fde83ba6e.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-PbVBg7LNLzQ/Tq6nno0_B5I/AAAAAAAABzc/soUbO2_jvrA/s320/6208351392_5fde83ba6e.jpg" width="268" /&gt;&lt;/a&gt;&lt;/div&gt;Ya está disponible versión 5.3 de &lt;b&gt;Puppy Linux&lt;/b&gt;, una distribución ligera que ocupa menos de 125 MB, y que comparte compatibilidad binaria con Slackware (de hecho, comparte también el repositorio de paquetes). Esta distribución es idónea para equipos antiguos y/o con pocos recursos. &lt;br /&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;b&gt;Las características más novedosas de esta versión son:&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;- Compatibilidad con Slackware 13.37&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;- Linux Kernel 2.6.37.6&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;- PMusic y Pequalizer para organizar y reproducir colecciones de música&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;- Frisbee Network Manager, para gestionar conexiones a redes inalámbricas&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;- Seamonkey como suite de navegador web y cliente de correo&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;- Gestión de paquetes de Slackware, Salix y Slacky, además de los paquetes PET de Puppy&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;- Ofimática con Abiword (procesador de textos) y GNumeric (hoja de cálculo)&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;- Soporte multimedia para muchos formatos&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Referencias&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;Puppy Linux | &lt;a href="http://www.puppylinux.com/"&gt;Sitio oficial&lt;/a&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;Noticias Puppy | &lt;a href="http://puppylinuxnews.org/"&gt;Noticias&lt;/a&gt; &lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;Notas de la release | &lt;a href="http://distro.ibiblio.org/pub/linux/distributions/puppylinux/puppy-5.3/release-Slacko-5.3.htm"&gt;Liberación de Slacko&lt;/a&gt;&lt;/div&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;Recursos de Slacko | &lt;/span&gt;&lt;a href="http://bkhome.org/blog/?viewDetailed=02556" style="font-family: Arial,Helvetica,sans-serif;"&gt;Blog de Barry Kauler&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-1880539806684607477?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/1880539806684607477/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=1880539806684607477&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/1880539806684607477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/1880539806684607477'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2011/10/liberado-puppy-linux-53-slacko.html' title='Liberado Puppy Linux 5.3 &apos;Slacko&apos;'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-PbVBg7LNLzQ/Tq6nno0_B5I/AAAAAAAABzc/soUbO2_jvrA/s72-c/6208351392_5fde83ba6e.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-8662897900671607854</id><published>2011-10-18T23:06:00.001+02:00</published><updated>2011-10-24T08:19:47.630+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tecnodependencia'/><title type='text'>Una semana de desintoxicación tecnológica</title><content type='html'>A continuación se documento un experimento vivido en primera persona, para evaluar hasta qué punto nos afecta la dependencia a la tecnología, acuñada como tecnodependencia. Los datos aquí ilustrados son meramente personales, aunque pueden coincidir con un porcentaje importante de la sociedad.&lt;br /&gt;&lt;br /&gt;El reto era vivir durante una semana sin conexión a redes sociales y sin usar el teléfono móvil.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Introducción&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;En primer lugar, he de describirme como un tecnoadicto desde que a principios de los años 80 me acerqué por vez primera a un ordenador personal de 1KB de memoria RAM (el mítico Spectrum Z80). Mi vida se vió arrastrada a un maravilloso mundo de información interpretada para según que fines, principalmente para el software. He hecho carrera en el mundo del software y la consultoría, siendo activista del software libre desde hace más de una década. No quiero aburrir con mi Currículum ni mis conocimientos. Tan sólo dar una pincelada de un recién estrenado cuarentañero que se crió en el albor de la informática personal y profesional.&lt;br /&gt;&lt;br /&gt;Poseo un teléfono móvil de última generación: un Samsung Galaxy ACE. Cuando lo adquirí hace ya seis meses, exigí no tener una tarifa de datos. El motivo de esta decisión es que me paso más de 12 horas al día frente a un ordenador, y la pantalla y el teclado de éste me dan las prestaciones que no me da el teléfono. Asimismo, si he de usar una conexión de datos, prefiero usar la Wifi de casa o las Wifis públicas que encontramos en edificios de la Administración Pública o de los centros comerciales. Tampoco hago uso del correo o de las redes sociales en mi teléfono (por las razones esgrimidas antes), por lo que no tengo instalados programas del tipo What's Up, Twitter, Facebook, etc. Lo que sí utilizo y aprecio de forma adicional es la cámara de fotos y el GPS. Mi uso principal del teléfono es su concepto básico: realizar y recibir llamadas telefónicas, y algún que otro SMS.&lt;br /&gt;&lt;br /&gt;En la actualidad, y desde hace mucho tiempo, utilizo las siguientes redes sociales: Facebook, Twitter, LinkedIn, Xing, Tumblr, Picotea y Google+ (hace tiempo abandoné MySpace, Tuenti y hi5).&amp;nbsp;En el trabajo, suelo utilizar Picotea, Tumblr y Google+, ya que el proxy no lo tiene capado, y además, en Picotea y Tumblr me replica los posts a Facebook y Twitter automáticamente y por detrás, sin pasar por el proxy. El uso que le doy es de unos 10-15 minutos cada varias horas de trabajo (unas dos o tres veces al día), devorando rápidamente todos los post que me comparten (principalmente noticias tecnológicas y de actualidad), que después filtro y replico de forma implacable. En casa, puedo tirarme dos o tres horas diarias por la noche actulizando y compartiendo noticias y reflexiones, además de comunicarme por mensajes, eventos o compartiendo álbumes, debido a mi papel de político (voy a omitir publicidad de mi partido en época de precampaña, aunque much@s ya lo conocéis)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Día 1: Lunes 17 de Octubre de 2011&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;El teléfono móvil está guardado en el cajón del despacho de mi casa, completamente apagado. Tanto en el ordenador de casa como en el del trabajo he cerrado todas las pestañas por defecto asignadas a redes sociales.&lt;br /&gt;&lt;br /&gt;A lo largo del día tengo tentaciones de llamadas de teléfono que podría haber recibido, todas ellas importantes, de asuntos pendientes o en el aire, tanto personales como de actividades políticas. He llevado el coche al taller para una revisión y el cambio de pastillas de freno. Doy el teléfono de mi esposa, para contactar cuando acaben. Empiezo a percatarme de la necesidad y utilidad del teléfono, más allá de la dependencia en sí. No es plan dar teléfonos de otros para que me localicen, ya que es molesto para los que han de atender mis llamadas.&lt;br /&gt;&lt;br /&gt;En cuanto a redes sociales, sufro de ansiedad. Me muero de ganas por saber qué está pasando en el mundo. Echo de menos las noticias que me vienen en forma de flashes (mensajes cortos de microblogging, con el correspondiente enlace a la noticia). Me molesta tener que buscar en el buscador las noticias o acceder a medios de prensa online. Me cansa mucho y rápidamente, y además me despista.&lt;br /&gt;&lt;br /&gt;Sufro también ansiedad por saber quiénes me siguen, me contestan, me dejan comentarios, me replican... Sufro por no seguir a mis contactos principales, saber qué han publicado, dejar comentarios, replicarles, compartir sus enlaces, ver sus fotos...&lt;br /&gt;&lt;br /&gt;Estas ansiedades duran todo el día. En casa, por la noche, mi mente se embota por no saber qué hacer fuera de las redes sociales. ¿Qué visito si no puedo compartirlo con mis amigos, ni decir "Me gusta", "+1", Twittear, etc...? Me he vuelto muy cómodo obteniendo en forma de flashes los titulares de todas las noticias que me gustan, en lugar de buscarlas. Empiezo a darme cuenta de la dependencia que tengo a las redes sociales. En realidad no me concentro en tareas realmente importantes para mi. No puedo concentrarme en tareas concretas, y me disperso tanto que termino no haciendo nada.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Día 2: Martes 18 de Octubre de 2011&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Gracias a la ausencia de redes sociales, mi concentración en el trabajo ha crecido espectacularmente y mi día laboral ha sido de los más productivo. He podido finiquitar los más de 200 correos electrónicos que tenía pendientes, chequear todas mis tareas pendientes y llevar al día mi trabajo diario. He conseguido quitarme la bola que me agobiaba.&lt;br /&gt;&lt;br /&gt;Algunas veces me ha entrado "el mono" de redes sociales, especialmente en los ratos que menos carga de trabajo tenía. La ansiedad persiste, pero lo he controlado y he seguido concentrándome en el trabajo. Sigo teniendo algo de dispersión, pero mi nivel de concentración ha crecido espectacularmente.&lt;br /&gt;&lt;br /&gt;Por la tarde, a las 7, he tenido que encender de nuevo el teléfono móvil. Me han bombardeado el correo electrónico con amenazas si no me localizaban. Hay cosas muy urgentes e importantes que me reclaman para el partido de cara a lo que queda de precampaña y para empezar la campaña. Siendo coordinador territorial de 30 localidades es necesario tener conmigo contacto directo y en tiempo real.&lt;br /&gt;&lt;br /&gt;La lección de este segundo día es que el teléfono móvil es una herramienta imprescindible para la comunicación, quizá la más importante de todas. Quizá también sea la que mejor uso le damos, pues nos cuesta dinero, y cuando duele en el bolsillo se procura darle sentido y utilidad a su uso. Yo, al menos, no estaba todo el día enganchado al What's Up o al Twitter o al Facebook. Puede llegar incluso a molestar estar reunido o tomando algo o compartiendo algún momento, que uno no haga caso, se aísle por atender al teléfono.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Día 3: Miércoles 19 de Octubre de 2011&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Resulta curioso el ruido que deja tanta información y la adición que podemos llegar a tener. Nunca antes hemos podido acceder a tanta, y sin embargo, estamos expuestos al caos de información. Creo que habría que enseñar cómo gestionar la información, clasificar, catalogar, priorizar y, sobre todo, identificar información de calidad, para no ahogarnos en las mareas de datos.&lt;br /&gt;&lt;br /&gt;El día de trabajo ha sido muy productivo, y he podido realizar más cosas de las que podía imaginar. Mi concentración ha mejorado, aunque a veces echo de menos poder mirar quién está y qué ha compartido. El impulso es controlable. No tengo un síndrome de abstinencia tan potente.&lt;br /&gt;&lt;br /&gt;He reflexionado largo y tendido sobre la verdadera utilidad de las redes sociales y uso eficiente de las mismas. Aún me queda mucho por discernir, por lo que esperaré al último día para escribir mis conclusiones. Sirva como adelanto que deberían existir cursos sobre este asunto, y enfocarlo especialmente en aprovechar las cualidades de las redes sociales y sobre uso. Por poner algún ejemplo: tengo casi 1200 amigos en Facebook, pero, sin embargo, no tengo más contacto que con apenas 30. Deberíamos aprender a poner un límite a nuestra agenda, hacer limpieza de amistades, enfocarnos en foros que vayamos a seguir realmente de forma cotidiana, en lugar de acumular cientos de páginas y temas por curiosidad o por recomendaciones. Otro ejemplo es saber elegir y limitar el número de redes sociales. ¿Para qué tantas? ¿Por qué replicar lo mismo en todas? Lo más importante de nuestras vidas es el tiempo, y hemos de administrarlo muy bien. Dedicar parte del mismo a cultivar amistades o redes de contactos (networking) es un tiempo bien invertido, hasta cierto punto. Hay que saber dónde está ese límite y cómo exprimir la utilidad y la productividad de estas maravillosas herramientas.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Día 4: Jueves 20 de Octubre de 2011&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Hoy he tenido el día libre por asuntos propios, por lo que no me he acercado a un ordenador hasta ahora, las 19:44 horas. No he tenido mono de redes sociales, aunque por el chat de Gmail, un amigo me ha comentado la noticia del día: la presunta muerte de Gadafi. En ese momento, el mono se me ha disparado y he corrido a ver la noticia. La adición estaba escondida y ha saltado como un resorte a la mínima oportunidad. Pero lo he hecho sin acceder a ninguna red social, si no por el buscador. He estado tentado de ver esta y otras noticias del día, así como compartir todo. Pero no me ha costado reprimirlo.&lt;br /&gt;&lt;br /&gt;En cuanto al teléfono móvil, me he dado cuenta de que hago un uso responsable y productivo del mismo. Hoy he realizado algunas llamadas realmente importantes. El coste de las mismas está bien invertido.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Día 8: Lunes 24 de Octubre de 2011&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;He estado tres días sin actualizar el blog, ya que he estado completamente desconectado de Internet. El viernes 21 tuve un día muy complicado en el trabajo, lo exigió de mi el 200% de mi concentración. También fue mi cumpleaños, el cual fue celebrado durante del fin de semana y, como podéis imaginar, estuve ocupado en otros quehaceres más cotidianos y físicos. Por tanto, tres días sin tecnología alguna, a excepción, como bien podéis imaginar, del tan útil teléfono móvil.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;CONCLUSIONES&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;Tras esta semana de experimentación, he podido experimentar por mí mismo que generamos nuestra propia dependencia hacia la tecnología, pero no sabemos utilizarla de forma responsable, lo que hace evidente que se generen cursos acerca de entrenar a las personas sobre el uso de de la tecnología.&lt;br /&gt; &lt;br /&gt;Vivimos en la era de la información, y nos maravillamos de poder tener acceso inmediato a cuanta información queramos, con tan sólo un clic. Podemos conseguirla desde nuestro teléfono móvil o desde el ordenador de nuestra casa. Pero, ¿realmente esto es bueno? ¿No tenemos demasiada información? ¿No sufrimos gula informativa? ¿No estamos también consumiendo información contaminada? La información es, posiblemente, el mayor poder que tenemos en nuestra sociedad actual, pero también es el poder más manipulado y tóxico que existe. Entre tanta y tanta información hay también desinformación, información falsa, información manipulada, información extraída de contexto y utilizada para inculcar creencias intoxicadas. Tendemos a recopilar información de una forma descontrolada y sin analizarla. Al final tendemos al caos y a la acumulación de basura informativa.&lt;br /&gt;&lt;br /&gt;Teniendo en mente este concepto, ¿qué puede estar pasando en las redes sociales? Tenemos cantidades ingentes de amigos a quienes jamás hemos visto, y les confiamos nuestros secretos. Tenemos amigos que publican noticias, blogs e información que puede venir ya intoxicada. ¿Y qué decimos de la seguridad? ¿Sabemos acaso qué hacen con los datos de nuestra actividad en las redes sociales? Formamos parte de estadísticas y de análisis de cuando hacemos y publicamos en las redes sociales. Pueden saber cuántas veces nos conectamos, cuánto tiempo, a qué horas, con qué frecuencia, sobre qué temas leemos o estamos interesados, quiénes son nuestros amigos, qué relaciones tenemos en distintas jerarquías, qué publicamos, qué decimos en los chat... Si nos detenemos a pensarlo, la sangre se nos helaría.&lt;br /&gt;&lt;br /&gt;No trato de ser conspiranoico, pero los hechos son evidentes, y Facebook, por ejemplo, ha sido acusada muchas veces de actividades similares, o de políticas de seguridad muy sospechosas.&lt;br /&gt;&lt;br /&gt;Las redes sociales son herramientas que son útiles para la sociedad, que incrementan la relación entre individuos y grupos con intereses afines, y además desde la comodidad de casa, sin las limitaciones del espacio o del tiempo.&lt;br /&gt;&lt;br /&gt;Sobre este tema se pueden escribir montañas y montañas de libros, pero a la conclusión que quiero llegar es: ¿realmente necesitamos las redes sociales? Pensémoslo detenidamente. Intentemos repetir este experimento y tomar conciencia desde otra perspectiva sobre si las redes sociales son realmente útiles o son un entretenimiento más, una forma de alienar o distraer a las masas de los problemas reales, ya sean los cotidianos o los problemas de calado social, político, económico, mundial...&lt;br /&gt;&lt;br /&gt;Creo que las redes sociales pueden ser útiles cuando realmente seamos responsables de su uso, de conocer qué hacen realmente y los peligros que entrañan, así como también qué podemos aprovechar y cómo. Creo que una red social es útil cuando une a grupos e individuos por temáticas concretas y no dispersas, cuando los involucrados en esa red sí se conocen personalmente o se tiene una relación más intensa que la de un simple amigo agregado, cuando esas relaciones funcionan entre sí, fluyendo de uno a otro lado, coordinando ideas y proyectos, tomando acciones para avanzar en objetivos comunes...&lt;br /&gt;&lt;br /&gt;¿Cuántos amigos de verdad tienes realmente en tus redes sociales? ¿Con cuántos de ellos sueles comunicarte y con qué frecuencia? ¿Qué haces con esos amigos realmente útil, y o perder el tiempo en vanalidades? Estas tres preguntas son clave para empezar a tomar conciencia de qué uso damos a las redes sociales. A partir de ahí podemos ir planteando más cuestiones y despejando más bulto hasta obtener una red social práctica.&lt;br /&gt;&lt;br /&gt;Por mi parte, voy a reducir mis redes sociales a la mínima esencia. Voy a revisar mis amistades y empezar a eliminar lo superfluo para quedarme únicamente con lo que necesito y me interesa. Dejaré de perseguir noticias y replicarlas, para centrarme únicamente a mis pensamientos y reflexiones. Después de esta semana sin redes sociales tengo una conciencia más limpia y menos contaminada.&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-8662897900671607854?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/8662897900671607854/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=8662897900671607854&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/8662897900671607854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/8662897900671607854'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2011/10/una-semana-de-desintoxicacion.html' title='Una semana de desintoxicación tecnológica'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-330042468767884103</id><published>2011-10-13T11:26:00.002+02:00</published><updated>2011-10-13T11:26:23.323+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UNIX'/><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='obituario'/><category scheme='http://www.blogger.com/atom/ns#' term='Dennis Ritchie'/><title type='text'>Ha fallecido Dennis Ritchie, el padre de UNIX y C</title><content type='html'>Otra despedida se cierne sobre este mundo tecnológico. Dennis Ritchie, creador de UNIX y el lenguaje C (junto a Ken Thompson) nos ha dejado a la edad de 70 años. Mientras el mundo alimenta la leyenda de Steve Jobs, olvida y mira hacia otro lado para un personaje que ha sido más influyente y determinante en la informática.&lt;br /&gt;&lt;br /&gt;UNIX es el sistema operativo sobre el cual está basado Linux y BSD, este último forkeado por Apple para sus ordenadores. El lenguaje C es utilizado en la inmensa mayoría de aplicaciones que se ejecutan en casi cualquier ordenador del mundo, o del cual se han extraído los conceptos para otros lenguajes (como Java o PHP, por poner sólo un ejemplo. La dimensión de su legado es inmensamente influyente y determinante, sin los cuales la tecnología y la informática hoy en día no existirían como lo conocemos ahora.&lt;br /&gt;&lt;br /&gt;Descansa en paz, Dennis. Muchas gracias por hacer de este mundo un lugar mejor.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-PwaNABj3EsY/TpauMnydclI/AAAAAAAABwo/wxMCCAf9XwY/s1600/DennisRitchie.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-PwaNABj3EsY/TpauMnydclI/AAAAAAAABwo/wxMCCAf9XwY/s1600/DennisRitchie.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Funhgc9BIoc/TpauT79j4uI/AAAAAAAABww/NiLAc_VltwI/s1600/RIPDennisRitchie.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="164" src="http://2.bp.blogspot.com/-Funhgc9BIoc/TpauT79j4uI/AAAAAAAABww/NiLAc_VltwI/s320/RIPDennisRitchie.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-330042468767884103?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/330042468767884103/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=330042468767884103&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/330042468767884103'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/330042468767884103'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2011/10/ha-fallecido-dennis-ritchie-el-padre-de.html' title='Ha fallecido Dennis Ritchie, el padre de UNIX y C'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-PwaNABj3EsY/TpauMnydclI/AAAAAAAABwo/wxMCCAf9XwY/s72-c/DennisRitchie.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-6408449283459358204</id><published>2011-10-11T08:13:00.002+02:00</published><updated>2011-10-11T08:13:55.204+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Frases'/><title type='text'>Frases</title><content type='html'>&lt;div style="color: blue;"&gt;"Las cosas que más faltaban en mi vida no se vendían. ¿Por qué buscar más dinero? Estoy muy contento, los lujos no podrían haberme hecho tan feliz como haber logrado algo"&lt;/div&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;Richard Stallman (Padre del Software Libre)&lt;/span&gt; &lt;/b&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-6408449283459358204?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/6408449283459358204/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=6408449283459358204&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6408449283459358204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6408449283459358204'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2011/10/frases.html' title='Frases'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-1785184132207193452</id><published>2011-10-06T07:59:00.002+02:00</published><updated>2011-10-06T14:41:10.487+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Steve Jobs'/><category scheme='http://www.blogger.com/atom/ns#' term='Apple'/><title type='text'>El espíritu de la manzana se fue</title><content type='html'>&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;Dice el cancionero popular que "algo se muere en el alma, cuando un amigo se va". Hay hombres que pasan por el mundo dejando una huella imborrable y duradera, hombres que son grandes por el espacio que ocupan en el mundo, pero sobre todo, por el vacío que dejan cuando ya no están.&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;Ha fallecido Steve Jobs, un visionario, un genio, un talento portentoso de los negocios, de la tecnología, de hacer todo humano y sencillo. Revolucionó la tecnología, sembrando muchas veces la polémica por su forma de hacer las cosas. Se atrevió a llegar donde nadie imaginó o se atrevió. Por ello, se ganó muchos enemigos envidiosos de su genialidad. &lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;Yo he sido siempre crítico a los productos y a las prácticas de Apple, pero también he sido un admirador de la belleza, de la sencillez y de la innovación que Apple ha plasmado en sus productos. Detrás de todo eso ha estado Steve Jobs, el espíritu de la manzana (Apple). Su mente, su genio, su talento, su visión, su magia... se han desvanecido hace unas pocas horas, tras una larga, agónica y titánica lucha contra el cáncer de páncreas. Pero su recuerdo permanece, señalándonos la senda que podemos seguir hacia un mundo más humano y mejor.&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;Gracias, Steve, por todo lo que has hecho, por todo lo nos has dejado, por las lecciones que nos has dado, por el calor de ese corazón que ha dejado de latir para siempre. Gracias por decirnos que podemos lograr todo aquello que imaginemos. Te recordaremos siempre. Adiós. Descansa en Paz.&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-izVxpA9r5U0/To1BRxB0NOI/AAAAAAAABvE/dCPfLUQ9njM/s1600/steve_jobs_foto1.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-izVxpA9r5U0/To1BRxB0NOI/AAAAAAAABvE/dCPfLUQ9njM/s320/steve_jobs_foto1.jpg" width="286" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-It8VGjk6nmg/To1BU4LfVII/AAAAAAAABvg/iPNc-u_3SPk/s1600/steve-jobs-1975.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="238" src="http://2.bp.blogspot.com/-It8VGjk6nmg/To1BU4LfVII/AAAAAAAABvg/iPNc-u_3SPk/s320/steve-jobs-1975.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-QZaMplJitAc/To1BSheEo4I/AAAAAAAABvM/KujyfZ0l1Aw/s1600/10-momentos-de-steve-jobs.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://1.bp.blogspot.com/-QZaMplJitAc/To1BSheEo4I/AAAAAAAABvM/KujyfZ0l1Aw/s320/10-momentos-de-steve-jobs.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-xxxJtvoQXQM/To1BQxlTZNI/AAAAAAAABu4/t84BDa_u8r0/s1600/stevejobs-apple-Quadra.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-xxxJtvoQXQM/To1BQxlTZNI/AAAAAAAABu4/t84BDa_u8r0/s1600/stevejobs-apple-Quadra.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-f_CNNOV4UXA/To1BV9yhFJI/AAAAAAAABvo/Qh7Epy4QxZI/s1600/SteveJobs-Apple.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-f_CNNOV4UXA/To1BV9yhFJI/AAAAAAAABvo/Qh7Epy4QxZI/s1600/SteveJobs-Apple.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-OOv62NP7g50/To1BTml7dBI/AAAAAAAABvU/1CXS0T9BcgU/s1600/isteve-book-of-jobs.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-OOv62NP7g50/To1BTml7dBI/AAAAAAAABvU/1CXS0T9BcgU/s1600/isteve-book-of-jobs.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-MaYlInStr5E/To1BRrNZPXI/AAAAAAAABvA/e0X954ZHhhc/s1600/bill_gates_steve_jobs.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/-MaYlInStr5E/To1BRrNZPXI/AAAAAAAABvA/e0X954ZHhhc/s320/bill_gates_steve_jobs.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-SI2wTMnATtU/To1BQrqUvpI/AAAAAAAABu0/VV9qmyLBLrQ/s1600/steve-jobs-1.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://2.bp.blogspot.com/-SI2wTMnATtU/To1BQrqUvpI/AAAAAAAABu0/VV9qmyLBLrQ/s320/steve-jobs-1.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-7iXW6h41sVQ/To1BSNE57kI/AAAAAAAABvI/FApHTGmhJ2w/s1600/stevejobs2.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://1.bp.blogspot.com/-7iXW6h41sVQ/To1BSNE57kI/AAAAAAAABvI/FApHTGmhJ2w/s320/stevejobs2.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-SI2wTMnATtU/To1BQrqUvpI/AAAAAAAABu0/VV9qmyLBLrQ/s1600/steve-jobs-1.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-UN3p43-x9O4/To1BRYGQ7FI/AAAAAAAABu8/IE05eMyEQP4/s1600/steve-jobs.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-UN3p43-x9O4/To1BRYGQ7FI/AAAAAAAABu8/IE05eMyEQP4/s1600/steve-jobs.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-jlSVIuMCUJ8/To1BUlYmeJI/AAAAAAAABvc/a8WTZPr-yQo/s1600/iPad-Steve-Jobs.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://3.bp.blogspot.com/-jlSVIuMCUJ8/To1BUlYmeJI/AAAAAAAABvc/a8WTZPr-yQo/s320/iPad-Steve-Jobs.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-NhyxH5o1Hxo/To1BPmMZ-TI/AAAAAAAABus/WSzVVNRrE14/s1600/ap_steve_jobs_article-1357743-0CCDB23E000005DC-79_468x474.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-NhyxH5o1Hxo/To1BPmMZ-TI/AAAAAAAABus/WSzVVNRrE14/s320/ap_steve_jobs_article-1357743-0CCDB23E000005DC-79_468x474.jpg" width="315" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-dqTtSPP2MtY/To1BUKsHo5I/AAAAAAAABvY/6r4pq_Hv6l8/s1600/stevejobs-muere5.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="196" src="http://1.bp.blogspot.com/-dqTtSPP2MtY/To1BUKsHo5I/AAAAAAAABvY/6r4pq_Hv6l8/s320/stevejobs-muere5.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-pnrunhPkQ4o/To1BQDElKvI/AAAAAAAABuw/VlTQ_y0hxUM/s1600/steve-jobs-by-jamz.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="221" src="http://3.bp.blogspot.com/-pnrunhPkQ4o/To1BQDElKvI/AAAAAAAABuw/VlTQ_y0hxUM/s320/steve-jobs-by-jamz.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-7LNd_-mDcIw/To1BWAXthyI/AAAAAAAABvs/JkFqajsQu10/s1600/SteveJobs.jpg" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-7LNd_-mDcIw/To1BWAXthyI/AAAAAAAABvs/JkFqajsQu10/s320/SteveJobs.jpg" width="217" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-VWanNlXNIIA/To2hkUHwtfI/AAAAAAAABv0/dNRGbqSCm4c/s1600/steve_apple.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-VWanNlXNIIA/To2hkUHwtfI/AAAAAAAABv0/dNRGbqSCm4c/s320/steve_apple.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-1785184132207193452?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/1785184132207193452/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=1785184132207193452&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/1785184132207193452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/1785184132207193452'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2011/10/el-espiritu-de-la-manzana-se-fue.html' title='El espíritu de la manzana se fue'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-izVxpA9r5U0/To1BRxB0NOI/AAAAAAAABvE/dCPfLUQ9njM/s72-c/steve_jobs_foto1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-2363214968601237671</id><published>2011-09-30T08:11:00.000+02:00</published><updated>2011-09-30T08:11:22.788+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Linux, el resucitador de viejos ordenadores</title><content type='html'>Linux, el resucitador viejos ordenadores&lt;br /&gt;Autor: Rafael Hernampérez Martín&lt;br /&gt;Fecha: 18/08/2011&lt;br /&gt;&lt;br /&gt;Los ordenadores no envejecen ante los ojos del tiempo, si no ante los ojos de la evolución del hardware y del software. ¿Alguien tiene un viejo PC en lo más recóndito de un cuarto trastero o acumulando polvo en algún oscuro rincón? ¿Por qué se ha jubilado una magnífica máquina que sigue funcionando estupendamente? Aquel flamante PC que con ilusión compramos para adentrarnos en el apasionante mundo de la informática tiene aún mucha vida por delante, y puede darnos un gran servicio y muchas horas de satisfacción. Aún podemos resucitarlo con software actual que aproveche sus humildes limitaciones.&lt;br /&gt;&lt;br /&gt;Mientras la evolución natural de la tecnología tiende a ir vertiginosamente“in crescendo” en recursos y capacidades, existen entusiastas que exprimen las posibilidades de aquellas máquinas que unos pocos años han defenestrado ante la imparable tendencia de la industria, de la moda y de las exigencias de un público ávido de funcionalidades que exigen cada vez más velocidad y capacidad de procesamiento, de presentación visual, de memoria y de sistemas de almacenamiento. Y es que, pensándolo fríamente, no se deja tiempo para explotar y aprovechar eficientemente un ordenador. ¿Alguno recuerda la larga vida que tuvo el extinto Spectrum, con apenas unas pocas KBytes de memoria RAM y una vetusta cinta de cassette como medio de almacenamiento? Fue toda una década gloriosa que resistió heróicamente a los inicios del PC, y en donde muchos aprendimos el noble arte de programar en Basic y ensamblador. Ordenadores como el Amstrad, el Commodore y el MSX tuvieron días largos y gloriosos, y fueron idolatrados por legiones de fans que, con ilusión y afán, consiguieron reventar contínuamente sus aparentes limitaciones.&lt;br /&gt;&lt;br /&gt;Linux es un sistema operativo muy potente y versátil, cuyo código, al estar abierto y ser libre, permite a millones de desarrolladores de todo el mundo adaptarlo tanto a necesidades genéricas como específicas, y compartir dichas adaptaciones con todo el mundo. Entre estas posibilidades está la de trabajar de forma excelente en viejas máquinas bajas de recursos hasta tales límites de devolverle la vida a primigenios PC ocupando apenas un diskette.&lt;br /&gt;&lt;br /&gt;Sin llegar a ese extremo minimalista, la mayoría de los usuarios desearían darle una segunda oportunidad a su viejo PC, que le haga sentir una experiencia de usuario – dentro de lo posible - similar a la que tienen ahora, y para ello es imprescindible una interfaz gráfica de usuario, con un escritorio funcional, facilidad de uso, con aplicaciones actuales y capacidades de conexión a internet. Existen bastantes distribuciones Linux que contemplan estas características, por lo que hablar sobre todas ellas requeriría de varios artículos. Sin embargo, como introducción para conocer estas maravillas del software hemos elaborado una breve lista de cinco de las más populares.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Damn Small Linux&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CPU mínima: 486DX&lt;br /&gt;RAM mínima: 16 MB&lt;br /&gt;Tamaño ISO: 50 MB&lt;br /&gt;Arranque: Disco Duro, CD, memoria USB, Compact Flash&lt;br /&gt;Escritorio: Fluxbox (http://fluxbox.org/)&lt;br /&gt;Modo Live: Sí&lt;br /&gt;Enlace: http://www.damnsmalllinux.org/index_es.html&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Puppy Linux&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CPU mínima: Pentium 166Mhz&lt;br /&gt;RAM mínima: 128 MB &lt;br /&gt;Tamaño ISO: 128 MB&lt;br /&gt;Arranque: Disco Duro, CD, memoria USB, Compact Flash&lt;br /&gt;Escritorio: Fluxbox (http://fluxbox.org/) y XFCE (http://www.xfce.org/)&lt;br /&gt;Modo Live: Sí&lt;br /&gt;Enlace: http://puppylinux.org&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Slax&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CPU mínima: 486DX&lt;br /&gt;RAM mínima: 96MB&lt;br /&gt;Tamaño ISO: 200 MB&lt;br /&gt;Arranque: Disco Duro, CD, memoria USB&lt;br /&gt;Escritorio: KDE (http://www.kde.org) y Fluxbox (http://fluxbox.org/)&lt;br /&gt;Modo Live: Sí&lt;br /&gt;Módulos software adicional: Sí&lt;br /&gt;Enlace: http://www.slax.org &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Vector Linux (Light Edition)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CPU mínima: Pentium 166Mhz&lt;br /&gt;RAM mínima: 64MB&lt;br /&gt;Tamaño ISO: 700MB&lt;br /&gt;Espacio Disco Duro: 1,8 GB&lt;br /&gt;Arranque: Disco Duro, CD&lt;br /&gt;Escritorio: Fluxbox (http://fluxbox.org/) y JWM (http://joewing.net/programs/jwm/)&lt;br /&gt;Modo Live: Sí&lt;br /&gt;Enlace: http://vectorlinux.com/ &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Zenwalk&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CPU mínima: Pentium III&lt;br /&gt;RAM mínima: 256MB&lt;br /&gt;Tamaño ISO: 700MB&lt;br /&gt;Espacio Disco Duro: 1,5 GB&lt;br /&gt;Arranque: Disco Duro, CD&lt;br /&gt;Escritorio: XFCE (http://www.xfce.org/), Openbox (http://openbox.org/) o Gnome (http://www.gnome.org/)&lt;br /&gt;Modo Live: Sí&lt;br /&gt;Enlace: http://www.zenwalk.org&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Enlaces de interés:&lt;br /&gt;Distribuciones Linux para equipos modestos: http://rafinguer.blogspot.com/2007/04/distribuciones-linux-para-equipos.html&lt;br /&gt;¿Cómo aprovechar ese viejo ordenador?: http://rafinguer.blogspot.com/2006/11/cmo-aprovechar-ese-viejo-ordenador.html&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;	&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Linux, el resucitador de viejos ordenadores por Rafael Hernampérez Martín se encuentra bajo una Licencia Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported.&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-2363214968601237671?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/2363214968601237671/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=2363214968601237671&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/2363214968601237671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/2363214968601237671'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2011/09/linux-el-resucitador-de-viejos.html' title='Linux, el resucitador de viejos ordenadores'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-3308134214269059847</id><published>2011-09-30T08:03:00.002+02:00</published><updated>2011-09-30T08:17:43.442+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Redes Sociales'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><title type='text'>Estadísticas de Google+</title><content type='html'>Con la aparición de &lt;b&gt;Google+&lt;/b&gt;, el gigante de las búsquedas ha vuelto a imponerse como líder indiscutible de internet y del negocio que genera, ocupando uno de los sectores más importantes y acercándose a &lt;b&gt;Facebook&lt;/b&gt;. En muy poco tiempo ha conseguido captar millones de usuarios, en mucho menos tiempo que el resto de redes sociales, marcando un record muy difícil de batir.&lt;br /&gt;&lt;br /&gt;Si eres bloguero o tienes una página web, quizá te interese promocionar tu perfil, mostrando tus estadísticas. &lt;b&gt;Google &lt;/b&gt;ha habilitado un sitio especial llamado &lt;b&gt;Social Statistics&lt;/b&gt; para ver las estadísticas de todos sus usuarios:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://socialstatistics.com/"&gt;http://socialstatistics.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Como dato anecdótico y curioso, en el primer lugar del ranking mundial aparece &lt;i&gt;Mark Zukerberg&lt;/i&gt;, el "creador" de &lt;i&gt;Facebook&lt;/i&gt;, por delante de &lt;i&gt;Larry Page&lt;/i&gt;, fundador de &lt;i&gt;Google&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Pero si realmente quieres promocionar tu perfil de &lt;b&gt;Google+&lt;/b&gt;, mostrando tus estadísticas, en cualquier sitio Web, simplemente debes introducir el siguiente código HTML/JavaScript:&lt;br /&gt;&lt;br /&gt;&amp;lt;div class="socialstatistics-widget" data-id="111989909116190075662"&amp;gt;&amp;lt/div&amp;gt;&lt;br/&gt;&amp;lt;script&amp;gt;(function(d,t){var b=d.createElement(t),c=d.getElementsByTagName(t)[0];b.async=b.src="http://socialstatistics.com/widget/widget.min.js";c.parentNode.insertBefore(b,c);})(document,'script');&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El parámetro &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;data-id&lt;/span&gt; recoge tu &lt;b&gt;ID &lt;/b&gt;en &lt;b&gt;Google+ &lt;/b&gt;para que el &lt;i&gt;Script &lt;/i&gt;consulte tus estadísticas. Para obtener ese ID, accede a &lt;b&gt;Google+&lt;/b&gt;, haz click sobre tu perfil (en tu nombre). Se mostrará la página de tu perfil, y en la barra de dirección de tu navegador aparecerá una URL como ésta:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;a href="https://plus.google.com/111989909116190075662/posts%20"&gt;https://plus.google.com/111989909116190075662/posts&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Copia el código (los números) y pégalos al código anterior. El resultado debería ser el siguiente:&lt;br /&gt;&lt;div class="socialstatistics-widget" data-id="111989909116190075662"&gt;&lt;/div&gt;&lt;script&gt;(function(d,t){var b=d.createElement(t),c=d.getElementsByTagName(t)[0];b.async=b.src="http://socialstatistics.com/widget/widget.min.js";c.parentNode.insertBefore(b,c);})(document,'script');&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-3308134214269059847?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/3308134214269059847/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=3308134214269059847&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/3308134214269059847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/3308134214269059847'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2011/09/como-ver-tus-estadisticas-de-google.html' title='Estadísticas de Google+'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-1032371369027564258</id><published>2011-09-19T10:27:00.000+02:00</published><updated>2011-09-19T11:48:14.798+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Programación'/><title type='text'>Primera toma de contacto con Ruby</title><content type='html'>Hace mucho tiempo que quería tomar contacto con un lenguaje de programación que ha tenido mucho auge en Japón y en EEUU, y que en España está tímidamente haciéndose conocer. En los últimos años, &lt;b&gt;Ruby &lt;/b&gt;se está haciendo un hueco importante entre los lenguajes de programación, especialmente para la Web, gracias a su framework&lt;b&gt; Ruby On Rails (RoR)&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Ruby &lt;/b&gt;es un lenguaje de programación orientado a objetos, reflexivo e interpretado, con una sintaxis inspirada en &lt;i&gt;Python &lt;/i&gt;y en &lt;i&gt;Perl&lt;/i&gt;, y con una implementación de software libre. El intérprete de este lenguaje está disponible para varias plataformas, tales como &lt;i&gt;Windows&lt;/i&gt;, &lt;i&gt;Linux &lt;/i&gt;o &lt;i&gt;MacOS&lt;/i&gt;. Fue creado en 1995 por Yukihiro "Matz" Matsumoto. La principal característica de este lenguaje es que está pensado para la productividad.&lt;br /&gt;&lt;br /&gt;Para empezar a realizar cosas con este lenguaje tenemos una &lt;i&gt;"shell"&lt;/i&gt; o consola (como en &lt;i&gt;Python&lt;/i&gt;), donde podemos probar antes de generar el código final del programa. En el caso de &lt;b&gt;Ruby&lt;/b&gt;, la consola se llama &lt;b&gt;irb &lt;/b&gt;(&lt;i&gt;Interface Ruby shell&lt;/i&gt;).&lt;br /&gt;&lt;br /&gt;Lo más sencillo a probar es una simple operación matemática:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):001:0&amp;gt; 2+2&lt;br /&gt;=&amp;gt;4&lt;/div&gt;&lt;br /&gt;O un literal o cadena de caracteres, escrito entre comillas dobles o simples:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):002:0&amp;gt; "Soy Rafael"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;=&amp;gt;"Soy Rafael&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;La diferencia con otros lenguajes de programación es que en &lt;b&gt;Ruby &lt;/b&gt;todo es un objeto y, por tanto, se puede acceder directamente a sus métodos y propiedades. Por ejemplo, en el último ejemplo, hemos usado un literal, que es un objeto de tipo &lt;i&gt;String&lt;/i&gt;. Por tanto, se puede acceder a los métodos de dicho objeto:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):003:0&amp;gt; "Soy Rafael".length&lt;br /&gt;=&amp;gt;10 &lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):004:0&amp;gt; "Soy Rafael".reverse&lt;br /&gt;=&amp;gt;"leafaR yoS" &lt;/div&gt;&lt;br /&gt;El método &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;length&lt;/span&gt; retorna la longitud del literal, mientras que el método &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;reverse&lt;/span&gt; retorna el literal invertido.&lt;br /&gt;&lt;br /&gt;El operador "+" permite sumar dos números, pero en el caso de los literales, permite concatenar dos literales en 1:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):005:0&amp;gt; "Soy " + "Rafael"&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;=&amp;gt;"Soy Rafael" &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;El operador "*" permite multiplicar dos números, pero en el caso de los literales permite repetir dicho literal &lt;i&gt;n&lt;/i&gt; veces:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):006:0&amp;gt; "Rafael"*3&lt;br /&gt;=&amp;gt;"RafaelRafaelRafael"&lt;/div&gt;&lt;br /&gt;Sin embargo, si se intenta realizar cualquier otro tipo de operación matemática, ésta dará un error, ya que un literal tiene distinta naturaleza de los números. Lo mismo ocurriría si se desea ejecutar un método de literal para un número. Por ejemplo, lo siguiente daría un error:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="irb_18" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):007:0&amp;gt; "El&amp;nbsp;resultado&amp;nbsp;es:&amp;nbsp;"&amp;nbsp;+&amp;nbsp;2+2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;span class="fore_lt_cyan" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;=&amp;gt; TypeError:&amp;nbsp;can't&amp;nbsp;convert&amp;nbsp;Fixnum&amp;nbsp;into&amp;nbsp;String&lt;/span&gt;&lt;br /&gt;Para poder llevar a cabo ésto será necesario que los valores sean del mismo tipo, y para ello, disponemos de métodos de conversión o &lt;i&gt;"casting"&lt;/i&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="irb_20" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):008:0&amp;gt; "El&amp;nbsp;resultado&amp;nbsp;es:&amp;nbsp;"&amp;nbsp;+&amp;nbsp;(2+2).to_s&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;span class="fore_lt_red" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="fore_dark_gray" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;"El&amp;nbsp;resultado&amp;nbsp;es:&amp;nbsp;4"&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El método &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;to_s&lt;/span&gt; (&lt;i&gt;to string&lt;/i&gt;), permite convertir un valor numérico a un literal. En el ejemplo se ha utilizado el paréntesis para englobar el resultado del número.&lt;br /&gt;&lt;br /&gt;El siguiente ejemplo realiza la operación inversa, es decir, convierte un literal a un número para poder realizar la operación matemática:&lt;br /&gt;&lt;br /&gt;&lt;div id="irb_24" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):009:0&amp;gt; 20&amp;nbsp;+&amp;nbsp;"4".to_i&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;span class="fore_lt_red" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;span class="fore_dark_gray" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;"24&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El método &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;to_i&lt;/span&gt; (&lt;i&gt;to integer&lt;/i&gt;), convierte el valor a un número de tipo entero.&lt;br /&gt;&lt;br /&gt;Los siguientes ejemplos convierten un número en literal, y después ejecutan un método específico para literales:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):010:0&amp;gt; 365.to_s.reverse&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="fore_lt_red"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="fore_dark_gray"&gt;"563"&lt;/span&gt; &lt;/div&gt;&lt;div id="irb_28" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):011:0&amp;gt; 65535.to_s.length&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;span class="fore_lt_red" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="fore_dark_gray" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;5&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Ruby&lt;/b&gt; también trata &lt;i&gt;arrays&lt;/i&gt;, que son colecciones de valores. Dichas colecciones se especifican encerrando entre corchetes ([ ]) los valores que lo conforman. El siguiente ejemplo crea un &lt;i&gt;array &lt;/i&gt;con una serie de valores numéricos:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="irb_34" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):012:0&amp;gt;&amp;nbsp; [20,&amp;nbsp;15,&amp;nbsp;45,&amp;nbsp;78,&amp;nbsp;27]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;span class="fore_lt_red" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="fore_dark_gray" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;[20,&amp;nbsp;15,&amp;nbsp;45,&amp;nbsp;78,&amp;nbsp;27]&lt;/span&gt;&lt;br /&gt;Los &lt;i&gt;arrays &lt;/i&gt;también son objetos, y como tales, también tienen métodos que realizan acciones:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="irb_36" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):013:0&amp;gt; [20,&amp;nbsp;15,&amp;nbsp;45,&amp;nbsp;27].max&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div id="irb_37" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="fore_lt_red"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="fore_dark_gray"&gt;45&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div id="irb_38" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):014:0&amp;gt; [20,&amp;nbsp;15,&amp;nbsp;45,&amp;nbsp;27].min&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div id="irb_39" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="fore_lt_red"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="fore_dark_gray"&gt;15&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div id="irb_40" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):015:0&amp;gt; [20,&amp;nbsp;15,&amp;nbsp;45,&amp;nbsp;27].length&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div id="irb_41" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="fore_lt_red"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="fore_dark_gray"&gt;4&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div id="irb_42" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):016:0&amp;gt; [20,&amp;nbsp;15,&amp;nbsp;45,&amp;nbsp;27].reverse&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;span class="fore_lt_red" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="fore_dark_gray" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;[27,&amp;nbsp;45,&amp;nbsp;15,&amp;nbsp;20]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El método &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;max &lt;/span&gt;(&lt;i&gt;maximum&lt;/i&gt;) retorna el valor más alto del &lt;i&gt;array&lt;/i&gt;. El método &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;min &lt;/span&gt;(&lt;i&gt;minimum&lt;/i&gt;) retorna el valor más bajo del &lt;i&gt;array&lt;/i&gt;. El método &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;length &lt;/span&gt;retorna la longitud del &lt;i&gt;array&lt;/i&gt;, es decir, el número de valores que contiene. El método &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;reverse &lt;/span&gt;retorna los valores del &lt;i&gt;array &lt;/i&gt;en orden inverso.&lt;br /&gt;&lt;br /&gt;Para facilitar el uso de los valores, &lt;b&gt;Ruby&lt;/b&gt; permite almacenar los valores se pueden almacenar variables, las cuales, serán automáticamente del tipo de los valores que contienen. Las variables almacenan los valores bajo un nombre fácil de recordar, y mediante el cual se refiere a dichos valores. Por ejemplo, si la lista anterior se trata de una lista de préstamos, la cual se va a utilizar para varias operaciones, lo mejor es almacenarlo en una variable que repetir la lista constantemente:&lt;br /&gt;&lt;br /&gt;&lt;div id="irb_46" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):017:0&amp;gt; prestamos =&amp;nbsp;[20,&amp;nbsp;15,&amp;nbsp;45,&amp;nbsp;27]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div id="irb_47" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="fore_lt_red"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="fore_dark_gray"&gt;[20,&amp;nbsp;15,&amp;nbsp;45,&amp;nbsp;27]&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&lt;div id="irb_47" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;div id="irb_63" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):018:0&amp;gt; print&amp;nbsp;ticket[1]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;20=&amp;gt;&amp;nbsp;&lt;/span&gt;&lt;span class="fore_dark_gray" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;nil&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/div&gt;&lt;div id="irb_48" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):019:0&amp;gt; prestamos.sort!&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div id="irb_49" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="fore_lt_red"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="fore_dark_gray"&gt;[15,&amp;nbsp;20,&amp;nbsp;27,&amp;nbsp;45]&lt;/span&gt;&lt;/div&gt;&lt;span class="fore_lt_blue" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div id="irb_50" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):020:0&amp;gt; prestamos.sort!.reverse&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="fore_lt_red"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="fore_dark_gray"&gt;[45,&amp;nbsp;27,&amp;nbsp;20,&amp;nbsp;15]&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="fore_dark_gray"&gt;En este ejemplo, se almacena la lista en la variable &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;prestamos&lt;/span&gt;. Las siguientes operaciones se realizan sobre la variable. En primer lugar, se visualiza el valor que se encuentra en el &lt;i&gt;array&lt;/i&gt;, en la posición 1 (las posiciones dentro del &lt;i&gt;array &lt;/i&gt;comienzan en &lt;i&gt;0&lt;/i&gt; y terminan en &lt;i&gt;longitud-1&lt;/i&gt;, y se accede a la misma indicándolo entre corchetes). A continuación, el método&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; sort!&lt;/span&gt; ordena la lista de menor a mayor. Por último, ordena la lista y, a continuación, se invierte el orden de la lista (ordenación de mayor a menor).&lt;/span&gt;&lt;br /&gt;&lt;span class="fore_dark_gray"&gt; &lt;/span&gt;&lt;br /&gt;Un literal es un array de caracteres. Probemos lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;div id="irb_90"&gt;irb(main):021:0&amp;gt; texto&amp;nbsp;=&amp;nbsp;"en&amp;nbsp;un&amp;nbsp;lugar&amp;nbsp;de&amp;nbsp;la&amp;nbsp;Mancha,&amp;nbsp;de&amp;nbsp;cuyo&amp;nbsp;nombre&amp;nbsp;no&amp;nbsp;quiero&amp;nbsp;acordarme"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div id="irb_91"&gt;&lt;span class="fore_lt_red"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="fore_dark_gray"&gt;"en&amp;nbsp;un&amp;nbsp;lugar&amp;nbsp;de&amp;nbsp;la&amp;nbsp;Mancha,&amp;nbsp;de&amp;nbsp;cuyo&amp;nbsp;nombre&amp;nbsp;no&amp;nbsp;quiero&amp;nbsp;acordarme"&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div id="irb_92"&gt;irb(main):022:0&amp;gt; texto['lugar']='sitio'&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div id="irb_93"&gt;&lt;span class="fore_lt_red"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="fore_dark_gray"&gt;"sitio"&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div id="irb_94"&gt;irb(main):023:0&amp;gt; print&amp;nbsp;texto&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;en&amp;nbsp;un&amp;nbsp;sitio&amp;nbsp;de&amp;nbsp;la&amp;nbsp;Mancha,&amp;nbsp;de&amp;nbsp;cuyo&amp;nbsp;nombre&amp;nbsp;no&amp;nbsp;quiero&amp;nbsp;acordarme=&amp;gt;&amp;nbsp;&lt;span class="fore_dark_gray"&gt;nil&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La variable &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;texto &lt;/span&gt;contendrá un literal, que en sí mismo en su &lt;i&gt;array &lt;/i&gt;de caracteres. La segunda sentencia, busca la subcadena &lt;i&gt;'lugar'&lt;/i&gt; dentro del array, y reemplaza su valor por &lt;i&gt;'sitio'&lt;/i&gt;. La última sentencia muestra el valor del literal con el resultado, en donde &lt;i&gt;'lugar'&lt;/i&gt; ha sido sustituido por &lt;i&gt;'sitio'&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;El método &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;include?&lt;/span&gt; nos permite consultar si una subcadena se encuentra dentro del texto, retornando &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;true &lt;/span&gt;(&lt;i&gt;verdadero&lt;/i&gt;) o &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;false &lt;/span&gt;(&lt;i&gt;falso&lt;/i&gt;) en caso afirmativo o negativo.&lt;br /&gt;&lt;br /&gt;&lt;div id="irb_124" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;div id="irb_126" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):024:0&amp;gt; texto.include?&amp;nbsp;"lugar"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;span class="fore_lt_red" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="fore_dark_gray" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;false&lt;/span&gt; &lt;/div&gt;&lt;div id="irb_124" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):025:0&amp;gt; texto.include?&amp;nbsp;"Mancha"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div id="irb_125" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="fore_lt_red"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="fore_dark_gray"&gt;true&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;Recordemos que, aunque sea un literal, seguimos tratando un &lt;i&gt;array&lt;/i&gt;, y que algunos de los métodos que estamos probando pueden servirnos para otro tipo de &lt;i&gt;arrays&lt;/i&gt;. Así, el método include? también puede aplicarse a nuestro &lt;i&gt;array &lt;/i&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;prestamos&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="irb_132" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):026:0&amp;gt; ticket.include?&amp;nbsp;20&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div id="irb_133" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="fore_lt_red"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="fore_dark_gray"&gt;true&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div id="irb_134" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):027:0&amp;gt; ticket.include?&amp;nbsp;80&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;span class="fore_lt_red" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="fore_dark_gray" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;false&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;En el caso de los literales, hay métodos específicos, como, por ejemplo, el poder convertir todos los caracteres del &lt;i&gt;array &lt;/i&gt;a minúsculas (con el método &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;downcase&lt;/span&gt;) o a mayúsculas (con el método &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;upcase&lt;/span&gt;):&lt;br /&gt;&lt;br /&gt;&lt;div id="irb_128" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):028:0&amp;gt; texto.downcase&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div id="irb_129" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="fore_lt_red"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="fore_dark_gray"&gt;"en&amp;nbsp;un&amp;nbsp;sitio&amp;nbsp;de&amp;nbsp;la&amp;nbsp;mancha,&amp;nbsp;de&amp;nbsp;cuyo&amp;nbsp;nombre&amp;nbsp;no&amp;nbsp;quiero&amp;nbsp;acordarme"&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div id="irb_130" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):029:0&amp;gt; texto.upcase&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;span class="fore_lt_red" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="fore_dark_gray" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;"EN&amp;nbsp;UN&amp;nbsp;SITIO&amp;nbsp;DE&amp;nbsp;LA&amp;nbsp;MANCHA,&amp;nbsp;DE&amp;nbsp;CUYO&amp;nbsp;NOMBRE&amp;nbsp;NO&amp;nbsp;QUIERO&amp;nbsp;ACORDARME"&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Los &lt;i&gt;arrays &lt;/i&gt;son un recurso valioso en la programación con &lt;b&gt;Ruby&lt;/b&gt;, pero la complejidad de las necesidades reales con los datos nos van a exigir algo más funcional y avanzado para un tratamiento secuencial y lineal de colecciones de datos. &lt;b&gt;Ruby &lt;/b&gt;provee un tipo de dato cuya estructura es un &lt;i&gt;diccionario &lt;/i&gt;y funciona como una tabla &lt;i&gt;hash&lt;/i&gt;. Esto es, se define una clave o valor único, y un valor, lo que facilita las búsquedas. Las siguientes líneas definen y añaden valores a un diccionario, el cual es una colección de libros, los cuales están catalogados por una valoración. En este caso, el título del libro es la clave (valor único), y la catalogación es el valor (que puede repetirse):&lt;br /&gt;&lt;br /&gt;&lt;div id="irb_136" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):030:0&amp;gt; libros =&amp;nbsp;{}&lt;/div&gt;&lt;div id="irb_137" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="fore_lt_red"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="fore_dark_gray"&gt;{}&lt;/span&gt;&lt;/div&gt;&lt;div id="irb_138" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):031:0&amp;gt; libros["Don&amp;nbsp;Quijote&amp;nbsp;de&amp;nbsp;la&amp;nbsp;Mancha"]&amp;nbsp;=&amp;nbsp;:esplendido&lt;/div&gt;&lt;div id="irb_139" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="fore_lt_red"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="fore_dark_gray"&gt;:esplendido&lt;/span&gt;&lt;/div&gt;&lt;div id="irb_140" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):032:0&amp;gt; libros["El&amp;nbsp;Alquimista"]&amp;nbsp;=&amp;nbsp;:esplendido&lt;/div&gt;&lt;div id="irb_141" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="fore_lt_red"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="fore_dark_gray"&gt;:esplendido&lt;/span&gt;&lt;/div&gt;&lt;div id="irb_142" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):033:0&amp;gt; libros["Millenium"]&amp;nbsp;=&amp;nbsp;:muy_bueno&lt;/div&gt;&lt;div id="irb_143" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="fore_lt_red"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="fore_dark_gray"&gt;:muy_bueno&lt;/span&gt;&lt;/div&gt;&lt;div id="irb_144" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):034:0&amp;gt; libros["El&amp;nbsp;angel&amp;nbsp;caido"]&amp;nbsp;=&amp;nbsp;:mediocre&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="fore_lt_red"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="fore_dark_gray"&gt;:mediocre&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;/div&gt;&lt;div id="irb_148" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):035:0&amp;gt; libros&lt;/div&gt;&lt;div id="irb_149" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="fore_lt_red"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="fore_dark_gray"&gt;{"Don&amp;nbsp;Quijote&amp;nbsp;de&amp;nbsp;la&amp;nbsp;Mancha"=&amp;gt;:esplendido,&amp;nbsp;"El&amp;nbsp;Alquimista"=&amp;gt;:esplendid&lt;/span&gt;&lt;span class="fore_dark_gray" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;o,&amp;nbsp;"Millenium"=&amp;gt;:muy_bueno,&amp;nbsp;"El&amp;nbsp;angel&amp;nbsp;caido"=&amp;gt;:mediocre}&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;br /&gt;A continuación, se consulta el tamaño del diccionario y se consulta la valoración de un determinado libro:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div id="irb_151" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):036:0&amp;gt; libros.length&lt;/div&gt;&lt;div id="irb_152" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="fore_lt_red"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="fore_dark_gray"&gt;4&lt;/span&gt;&lt;/div&gt;&lt;div id="irb_153" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):037:0&amp;gt; libros["Millenium"]&lt;/div&gt;&lt;span class="fore_lt_red" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="fore_dark_gray" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;:muy_bueno&lt;/span&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para consultar las claves del diccionario, se utiliza el método &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;key&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div id="irb_157" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):037:0&amp;gt; libros.keys&lt;/div&gt;&lt;div id="irb_158" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="fore_lt_red"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="fore_dark_gray"&gt;["Don&amp;nbsp;Quijote&amp;nbsp;de&amp;nbsp;la&amp;nbsp;Mancha",&amp;nbsp;"El&amp;nbsp;Alquimista",&amp;nbsp;"Millenium",&amp;nbsp;"El&amp;nbsp;angel &lt;/span&gt;&lt;span class="fore_dark_gray"&gt;caido"]&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="fore_dark_gray"&gt;Para consultar los valores del diccionario se utiliza el método &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;values&lt;/span&gt;:&lt;/span&gt;&lt;br /&gt;&lt;span class="fore_dark_gray"&gt; &lt;/span&gt;&lt;br /&gt;&lt;div id="irb_162" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):038:0&amp;gt; libros.values&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span class="fore_lt_red"&gt;=&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span class="fore_dark_gray"&gt;[:esplendido,&amp;nbsp;:esplendido,&amp;nbsp;:muy_bueno,&amp;nbsp;:mediocre]&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="fore_dark_gray"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="fore_dark_gray"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Conclusiones&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;Esta pequeña toma de contacto al lenguaje Ruby nos permite echar un vistazo a los tipos de datos básicos que conforman el lenguaje, así como vislumbrar la potencia que tiene al ser tratado todo como objetos, con sus correspondientes métodos. Para conocer los métodos de cualquier objeto, basta con ejecutar el método &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;methods&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div id="irb_5" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;irb(main):038:0&amp;gt; 5.methods&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt; &lt;w:WordDocument&gt;  &lt;w:View&gt;Normal&lt;/w:View&gt;  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;  &lt;w:TrackMoves/&gt;  &lt;w:TrackFormatting/&gt;  &lt;w:HyphenationZone&gt;21&lt;/w:HyphenationZone&gt;  &lt;w:PunctuationKerning/&gt;  &lt;w:ValidateAgainstSchemas/&gt;  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;  &lt;w:DoNotPromoteQF/&gt;  &lt;w:LidThemeOther&gt;ES&lt;/w:LidThemeOther&gt;  &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;  &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;  &lt;w:Compatibility&gt;   &lt;w:BreakWrappedTables/&gt;   &lt;w:SnapToGridInCell/&gt;   &lt;w:WrapTextWithPunct/&gt;   &lt;w:UseAsianBreakRules/&gt;   &lt;w:DontGrowAutofit/&gt;   &lt;w:SplitPgBreakAndParaMark/&gt;   &lt;w:DontVertAlignCellWithSp/&gt;   &lt;w:DontBreakConstrainedForcedTables/&gt;   &lt;w:DontVertAlignInTxbx/&gt;   &lt;w:Word11KerningPairs/&gt;   &lt;w:CachedColBalance/&gt;  &lt;/w:Compatibility&gt;  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;m:mathPr&gt;   &lt;m:mathFont m:val="Cambria Math"/&gt;   &lt;m:brkBin m:val="before"/&gt;   &lt;m:brkBinSub m:val="&amp;#45;-"/&gt;   &lt;m:smallFrac m:val="off"/&gt;   &lt;m:dispDef/&gt;   &lt;m:lMargin m:val="0"/&gt;   &lt;m:rMargin m:val="0"/&gt;   &lt;m:defJc m:val="centerGroup"/&gt;   &lt;m:wrapIndent m:val="1440"/&gt;   &lt;m:intLim m:val="subSup"/&gt;   &lt;m:naryLim m:val="undOvr"/&gt;  &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt;&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt; &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"  DefSemiHidden="true" DefQFormat="false" DefPriority="99"  LatentStyleCount="267"&gt;  &lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Normal"/&gt;  &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 1"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 2"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 3"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 4"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 5"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 6"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 7"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 8"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 9"/&gt;  &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/&gt;  &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Title"/&gt;  &lt;w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/&gt;  &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/&gt;  &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Strong"/&gt;  &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/&gt;  &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"   UnhideWhenUsed="false" Name="Table Grid"/&gt;  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/&gt;  &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/&gt;  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/&gt;  &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/&gt;  &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Quote"/&gt;  &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/&gt;  &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/&gt;  &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/&gt;  &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/&gt;  &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/&gt;  &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography"/&gt;  &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/&gt; &lt;/w:LatentStyles&gt;&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;&lt;style&gt; /* Style Definitions */ table.MsoNormalTable	{mso-style-name:"Tabla normal";	mso-tstyle-rowband-size:0;	mso-tstyle-colband-size:0;	mso-style-noshow:yes;	mso-style-priority:99;	mso-style-qformat:yes;	mso-style-parent:"";	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;	mso-para-margin-top:0cm;	mso-para-margin-right:0cm;	mso-para-margin-bottom:10.0pt;	mso-para-margin-left:0cm;	line-height:115%;	mso-pagination:widow-orphan;	font-size:11.0pt;	font-family:"Calibri","sans-serif";	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:"Times New Roman";	mso-fareast-theme-font:minor-fareast;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;}&lt;/style&gt;&lt;![endif]--&gt;&lt;span lang="EN-US" style="font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: EN-US;"&gt;=&amp;gt;&amp;nbsp;[:to_s,&amp;nbsp;:-@,&amp;nbsp;:+,&amp;nbsp;:-,&amp;nbsp;:*,&amp;nbsp;:/,&amp;nbsp;:div,&amp;nbsp;:%,&amp;nbsp;:modulo,&amp;nbsp;:divmod,&amp;nbsp;:fdiv,&amp;nbsp;:**,:abs,&amp;nbsp;:magnitude,&amp;nbsp;:==,&amp;nbsp;:===,&amp;nbsp;:&amp;lt;=&amp;gt;,&amp;nbsp;:&amp;gt;,&amp;nbsp;:&amp;gt;=,&amp;nbsp;:&amp;lt;,&amp;nbsp;:&amp;lt;=,&amp;nbsp;:~,&amp;nbsp;:&amp;amp;,&amp;nbsp;:|,&amp;nbsp;:^,&amp;nbsp;:[],&amp;nbsp;:&amp;lt;&amp;lt;,&amp;nbsp;:&amp;gt;&amp;gt;,&amp;nbsp;:to_f,&amp;nbsp;:size,&amp;nbsp;:zero?,&amp;nbsp;:odd?,&amp;nbsp;:even?,&amp;nbsp;:succ,&amp;nbsp;:integer?,&amp;nbsp;:upto,&amp;nbsp;:downto,&amp;nbsp;:times,&amp;nbsp;:next,&amp;nbsp;:pred,&amp;nbsp;:chr,&amp;nbsp;:ord,&amp;nbsp;:to_i,&amp;nbsp;:to_int,&amp;nbsp;:floor,&amp;nbsp;:ceil,&amp;nbsp;:truncate,&amp;nbsp;:round,&amp;nbsp;:gcd,&amp;nbsp;:lcm,&amp;nbsp;:gcdlcm,&amp;nbsp;:numerator,&amp;nbsp;:denominator,&amp;nbsp;:to_r,&amp;nbsp;:rationalize,&amp;nbsp;:singleton_method_added,&amp;nbsp;:coerce,&amp;nbsp;:i,&amp;nbsp;:+@,&amp;nbsp;:eql?,&amp;nbsp;:quo,&amp;nbsp;:remainder,&amp;nbsp;:real?,&amp;nbsp;:nonzero?,&amp;nbsp;:step,&amp;nbsp;:to_c,&amp;nbsp;:real,&amp;nbsp;:imaginary,&amp;nbsp;:imag,&amp;nbsp;:abs2,&amp;nbsp;:arg,&amp;nbsp;:angle,&amp;nbsp;:phase,&amp;nbsp;:rectangular,&amp;nbsp;:rect,&amp;nbsp;:polar,&amp;nbsp;:conjugate,&amp;nbsp;:conj,&amp;nbsp;:between?,&amp;nbsp;:nil?,&amp;nbsp;:=~,&amp;nbsp;:!~,&amp;nbsp;:hash,&amp;nbsp;:class,&amp;nbsp;:singleton_class,&amp;nbsp;:clone,&amp;nbsp;:dup,&amp;nbsp;:initialize_dup,&amp;nbsp;:initialize_clone,&amp;nbsp;:taint,&amp;nbsp;:tainted?,&amp;nbsp;:untaint,&amp;nbsp;:untrust,&amp;nbsp;:untrusted?,&amp;nbsp;:trust,&amp;nbsp;:freeze,&amp;nbsp;:frozen?,&amp;nbsp;:inspect,&amp;nbsp;:methods,:singleton_methods,&amp;nbsp;:protected_methods,&amp;nbsp;:private_methods,&amp;nbsp;:public_methods,&amp;nbsp;:instance_variables,&amp;nbsp;:instance_variable_get,&amp;nbsp;:instance_variable_set,&amp;nbsp;:instance_variable_defined?,&amp;nbsp;:instance_of?,&amp;nbsp;:kind_of?,&amp;nbsp;:is_a?,&amp;nbsp;:tap,&amp;nbsp;:send,&amp;nbsp;:public_send,&amp;nbsp;:respond_to?,&amp;nbsp;:respond_to_missing?,&amp;nbsp;:extend,&amp;nbsp;:display,&amp;nbsp;:method,&amp;nbsp;:public_method,&amp;nbsp;:define_singleton_method,&amp;nbsp;:__id__,&amp;nbsp;:object_id,&amp;nbsp;:to_enum,&amp;nbsp;:enum_for,&amp;nbsp;:require,&amp;nbsp;:equal?,&amp;nbsp;:!,&amp;nbsp;:!=,&amp;nbsp;:instance_eval,&amp;nbsp;:instance_exec,&amp;nbsp;:__send__]&lt;/span&gt;&lt;br /&gt;&lt;div id="irb_24" style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;irb(main):039:0&amp;gt; "Soy&amp;nbsp;Rafael".methods&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt; &lt;w:WordDocument&gt;  &lt;w:View&gt;Normal&lt;/w:View&gt;  &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;  &lt;w:TrackMoves/&gt;  &lt;w:TrackFormatting/&gt;  &lt;w:HyphenationZone&gt;21&lt;/w:HyphenationZone&gt;  &lt;w:PunctuationKerning/&gt;  &lt;w:ValidateAgainstSchemas/&gt;  &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;  &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;  &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;  &lt;w:DoNotPromoteQF/&gt;  &lt;w:LidThemeOther&gt;ES&lt;/w:LidThemeOther&gt;  &lt;w:LidThemeAsian&gt;X-NONE&lt;/w:LidThemeAsian&gt;  &lt;w:LidThemeComplexScript&gt;X-NONE&lt;/w:LidThemeComplexScript&gt;  &lt;w:Compatibility&gt;   &lt;w:BreakWrappedTables/&gt;   &lt;w:SnapToGridInCell/&gt;   &lt;w:WrapTextWithPunct/&gt;   &lt;w:UseAsianBreakRules/&gt;   &lt;w:DontGrowAutofit/&gt;   &lt;w:SplitPgBreakAndParaMark/&gt;   &lt;w:DontVertAlignCellWithSp/&gt;   &lt;w:DontBreakConstrainedForcedTables/&gt;   &lt;w:DontVertAlignInTxbx/&gt;   &lt;w:Word11KerningPairs/&gt;   &lt;w:CachedColBalance/&gt;  &lt;/w:Compatibility&gt;  &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;m:mathPr&gt;   &lt;m:mathFont m:val="Cambria Math"/&gt;   &lt;m:brkBin m:val="before"/&gt;   &lt;m:brkBinSub m:val="&amp;#45;-"/&gt;   &lt;m:smallFrac m:val="off"/&gt;   &lt;m:dispDef/&gt;   &lt;m:lMargin m:val="0"/&gt;   &lt;m:rMargin m:val="0"/&gt;   &lt;m:defJc m:val="centerGroup"/&gt;   &lt;m:wrapIndent m:val="1440"/&gt;   &lt;m:intLim m:val="subSup"/&gt;   &lt;m:naryLim m:val="undOvr"/&gt;  &lt;/m:mathPr&gt;&lt;/w:WordDocument&gt;&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt; &lt;w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"  DefSemiHidden="true" DefQFormat="false" DefPriority="99"  LatentStyleCount="267"&gt;  &lt;w:LsdException Locked="false" Priority="0" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Normal"/&gt;  &lt;w:LsdException Locked="false" Priority="9" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="heading 1"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/&gt;  &lt;w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 1"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 2"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 3"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 4"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 5"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 6"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 7"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 8"/&gt;  &lt;w:LsdException Locked="false" Priority="39" Name="toc 9"/&gt;  &lt;w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/&gt;  &lt;w:LsdException Locked="false" Priority="10" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Title"/&gt;  &lt;w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/&gt;  &lt;w:LsdException Locked="false" Priority="11" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/&gt;  &lt;w:LsdException Locked="false" Priority="22" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Strong"/&gt;  &lt;w:LsdException Locked="false" Priority="20" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/&gt;  &lt;w:LsdException Locked="false" Priority="59" SemiHidden="false"   UnhideWhenUsed="false" Name="Table Grid"/&gt;  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/&gt;  &lt;w:LsdException Locked="false" Priority="1" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/&gt;  &lt;w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/&gt;  &lt;w:LsdException Locked="false" Priority="34" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/&gt;  &lt;w:LsdException Locked="false" Priority="29" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Quote"/&gt;  &lt;w:LsdException Locked="false" Priority="30" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/&gt;  &lt;w:LsdException Locked="false" Priority="60" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Shading Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="61" SemiHidden="false"   UnhideWhenUsed="false" Name="Light List Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="62" SemiHidden="false"   UnhideWhenUsed="false" Name="Light Grid Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="63" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="64" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="65" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="66" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="67" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="68" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="69" SemiHidden="false"   UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="70" SemiHidden="false"   UnhideWhenUsed="false" Name="Dark List Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="71" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="72" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful List Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="73" SemiHidden="false"   UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/&gt;  &lt;w:LsdException Locked="false" Priority="19" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/&gt;  &lt;w:LsdException Locked="false" Priority="21" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/&gt;  &lt;w:LsdException Locked="false" Priority="31" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/&gt;  &lt;w:LsdException Locked="false" Priority="32" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/&gt;  &lt;w:LsdException Locked="false" Priority="33" SemiHidden="false"   UnhideWhenUsed="false" QFormat="true" Name="Book Title"/&gt;  &lt;w:LsdException Locked="false" Priority="37" Name="Bibliography"/&gt;  &lt;w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/&gt; &lt;/w:LatentStyles&gt;&lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 10]&gt;&lt;style&gt; /* Style Definitions */ table.MsoNormalTable	{mso-style-name:"Tabla normal";	mso-tstyle-rowband-size:0;	mso-tstyle-colband-size:0;	mso-style-noshow:yes;	mso-style-priority:99;	mso-style-qformat:yes;	mso-style-parent:"";	mso-padding-alt:0cm 5.4pt 0cm 5.4pt;	mso-para-margin-top:0cm;	mso-para-margin-right:0cm;	mso-para-margin-bottom:10.0pt;	mso-para-margin-left:0cm;	line-height:115%;	mso-pagination:widow-orphan;	font-size:11.0pt;	font-family:"Calibri","sans-serif";	mso-ascii-font-family:Calibri;	mso-ascii-theme-font:minor-latin;	mso-fareast-font-family:"Times New Roman";	mso-fareast-theme-font:minor-fareast;	mso-hansi-font-family:Calibri;	mso-hansi-theme-font:minor-latin;	mso-bidi-font-family:"Times New Roman";	mso-bidi-theme-font:minor-bidi;}&lt;/style&gt;&lt;![endif]--&gt;&lt;span lang="EN-US" style="font-family: &amp;quot;Courier New&amp;quot;; mso-ansi-language: EN-US;"&gt;=&amp;gt;&amp;nbsp;[:&amp;lt;=&amp;gt;,&amp;nbsp;:==,&amp;nbsp;:===,&amp;nbsp;:eql?,&amp;nbsp;:hash,&amp;nbsp;:casecmp,&amp;nbsp;:+,&amp;nbsp;:*,&amp;nbsp;:%,&amp;nbsp;:[],&amp;nbsp;:[]=,&amp;nbsp;:insert,&amp;nbsp;:length,&amp;nbsp;:size,&amp;nbsp;:bytesize,&amp;nbsp;:empty?,&amp;nbsp;:=~,&amp;nbsp;:match,&amp;nbsp;:succ,&amp;nbsp;:succ!,&amp;nbsp;:next,&amp;nbsp;:next!,&amp;nbsp;:upto,&amp;nbsp;:index,&amp;nbsp;:rindex,&amp;nbsp;:replace,&amp;nbsp;:clear,&amp;nbsp;:chr,&amp;nbsp;:getbyte,&amp;nbsp;:setbyte,&amp;nbsp;:to_i,&amp;nbsp;:to_f,&amp;nbsp;:to_s,&amp;nbsp;:to_str,&amp;nbsp;:inspect,&amp;nbsp;:dump,&amp;nbsp;:upcase,&amp;nbsp;:downcase,&amp;nbsp;:capitalize,&amp;nbsp;:swapcase,&amp;nbsp;:upcase!,&amp;nbsp;:downcase!,&amp;nbsp;:capitalize!,&amp;nbsp;:swapcase!,&amp;nbsp;:hex,&amp;nbsp;:oct,&amp;nbsp;:split,&amp;nbsp;:lines,&amp;nbsp;:bytes,&amp;nbsp;:chars,&amp;nbsp;:codepoints,&amp;nbsp;:reverse,&amp;nbsp;:reverse!,&amp;nbsp;:concat,&amp;nbsp;:&amp;lt;&amp;lt;,&amp;nbsp;:crypt,&amp;nbsp;:intern,&amp;nbsp;:to_sym,&amp;nbsp;:ord,&amp;nbsp;:include?,&amp;nbsp;:start_with?,&amp;nbsp;:end_with?,&amp;nbsp;:scan,&amp;nbsp;:ljust,&amp;nbsp;:rjust,&amp;nbsp;:center,&amp;nbsp;:sub,&amp;nbsp;:gsub,&amp;nbsp;:chop,:chomp,&amp;nbsp;:strip,&amp;nbsp;:lstrip,&amp;nbsp;:rstrip,&amp;nbsp;:sub!,&amp;nbsp;:gsub!,&amp;nbsp;:chop!,&amp;nbsp;:chomp!,&amp;nbsp;:strip!,&amp;nbsp;:lstrip!,&amp;nbsp;:rstrip!,&amp;nbsp;:tr,&amp;nbsp;:tr_s,&amp;nbsp;:delete,&amp;nbsp;:squeeze,&amp;nbsp;:count,&amp;nbsp;:tr!,&amp;nbsp;:tr_s!,&amp;nbsp;:delete!,&amp;nbsp;:squeeze!,&amp;nbsp;:each_line,&amp;nbsp;:each_byte,&amp;nbsp;:each_char,&amp;nbsp;:each_codepoint,&amp;nbsp;:sum,&amp;nbsp;:slice,&amp;nbsp;:slice!,&amp;nbsp;:partition,&amp;nbsp;:rpartition,&amp;nbsp;:encoding,&amp;nbsp;:force_encoding,&amp;nbsp;:valid_encoding?,&amp;nbsp;:ascii_only?,&amp;nbsp;:unpack,&amp;nbsp;:encode,&amp;nbsp;:encode!,&amp;nbsp;:to_r,&amp;nbsp;:to_c,&amp;nbsp;:&amp;gt;,&amp;nbsp;:&amp;gt;=,&amp;nbsp;:&amp;lt;,&amp;nbsp;:&amp;lt;=,&amp;nbsp;:between?,&amp;nbsp;:nil?,&amp;nbsp;:!~,&amp;nbsp;:class,&amp;nbsp;:singleton_class,&amp;nbsp;:clone,&amp;nbsp;:dup,&amp;nbsp;:initialize_dup,&amp;nbsp;:initialize_clone,&amp;nbsp;:taint,&amp;nbsp;:tainted?,&amp;nbsp;:untaint,&amp;nbsp;:untrust,&amp;nbsp;:untrusted?,&amp;nbsp;:trust,&amp;nbsp;:freeze,&amp;nbsp;:frozen?,&amp;nbsp;:methods,&amp;nbsp;:singleton_methods,&amp;nbsp;:protected_methods,&amp;nbsp;:private_methods,&amp;nbsp;:public_methods,&amp;nbsp;:instance_variables,&amp;nbsp;:instance_variable_get,&amp;nbsp;:instance_variable_set,&amp;nbsp;:instance_variable_defined?,&amp;nbsp;:instance_of?,&amp;nbsp;:kind_of?,&amp;nbsp;:is_a?,&amp;nbsp;:tap,&amp;nbsp;:send,&amp;nbsp;:public_send,&amp;nbsp;:respond_to?,&amp;nbsp;:respond_to_missing?,&amp;nbsp;:extend,&amp;nbsp;:display,&amp;nbsp;:method,&amp;nbsp;:public_method,&amp;nbsp;:define_singleton_method,&amp;nbsp;:__id__,&amp;nbsp;:object_id,&amp;nbsp;:to_enum,&amp;nbsp;:enum_for,&amp;nbsp;:require,&amp;nbsp;:equal?,&amp;nbsp;:!,&amp;nbsp;:!=,&amp;nbsp;:instance_eval,&amp;nbsp;:instance_exec,&amp;nbsp;:__send__]&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Enlaces&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;Página oficial de Ruby: &lt;a href="http://www.ruby-lang.org/"&gt;http://www.ruby-lang.org&lt;/a&gt;&lt;br /&gt;Prueba Ruby desde el navegador: &lt;a href="http://tryruby.org/"&gt;http://tryruby.org&lt;/a&gt;&lt;br /&gt;Documentación de Ruby: &lt;a href="http://www.ruby-lang.org/es/documentation"&gt;http://www.ruby-lang.org/es/documentation&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-1032371369027564258?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/1032371369027564258/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=1032371369027564258&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/1032371369027564258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/1032371369027564258'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2011/09/primera-toma-de-contacto-con-ruby.html' title='Primera toma de contacto con Ruby'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-6006645505093187149</id><published>2011-07-06T18:46:00.002+02:00</published><updated>2011-07-06T18:46:13.239+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Desarrollo personal'/><title type='text'>Los ocho principios de la motivación</title><content type='html'>&lt;div style="width:425px" id="__ss_8514185"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/OcataAdvising/los-8-principios-de-la-motivacin" title="Los 8 principios de la motivación " target="_blank"&gt;Los 8 principios de la motivación &lt;/a&gt;&lt;/strong&gt; &lt;iframe src="http://www.slideshare.net/slideshow/embed_code/8514185" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"&gt;&lt;/iframe&gt; &lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/" target="_blank"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/OcataAdvising" target="_blank"&gt;Albert Garcia&lt;/a&gt; &lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-6006645505093187149?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/6006645505093187149/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=6006645505093187149&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6006645505093187149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6006645505093187149'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2011/07/los-ocho-principios-de-la-motivacion.html' title='Los ocho principios de la motivación'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-1400320269963921196</id><published>2011-03-14T07:55:00.001+01:00</published><updated>2011-03-14T07:55:54.696+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Neutralidad'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><title type='text'>Por la neutralidad en la red</title><content type='html'>&lt;!-- WIDGET ACTUABLE - T1.1 --&gt;&lt;br /&gt;&lt;style&gt;.act_wid_1 { font: 16px Arial; margin: 0 0 2em 0;}.act_wid_1 * { border: none; margin: 0; padding: 0;}.act_wid_1 .act_wid_img { margin: 0; padding: 0; height: 150px; overflow: hidden; }.act_wid_1 img { border: none; margin: 0;}.act_wid_1 .act_wid_title h1 { text-transform: none; margin: 0; padding: .4em .5em; font: normal 1.5em Helvetica; border: none; border-bottom: 1px solid;}.act_wid_1 .act_wid_title h1 a { text-decoration: none; background: none; text-indent: 0; width: auto; height: auto; display:block;}.act_wid_1 .act_wid_title h1 a:hover { text-decoration: underline;}/* widget sign *//*.act_wid_1 .widget_sign { min-height: 420px; overflow: hidden; margin: 0 0 2em 0;}.act_wid_1 .progress_bar { border-top: 1px solid; border-bottom: 1px solid; }.act_wid_1 .progress_bar .pb_cont { position: relative; height: 18px; }.act_wid_1 .progress_bar .pb_bkg { width: 100%; position: absolute; height: 18px; background: #FFF; opacity: .5; }.act_wid_1 .progress_bar .pb_prog { position: absolute; height: 18px; background: #FFF; opacity:; .9; }.act_wid_1 .progress_bar table { margin: 0 0 .75em 0; font-size: .85em;}.act_wid_1 .progress_bar td { padding: 0; width: 22%; text-align: center;}.act_wid_1 .progress_bar td.f { width: 17%; text-align: left;}.act_wid_1 .progress_bar td.l { width: 17%; text-align: right;}*/.act_wid_1 .widget_sign { min-height: 0; }.act_wid_1 .widget_sign .wc { padding: .5em 0.8em; }.act_wid_1 .widget_sign .wc p { margin: 0 0 .2em 0; }.act_wid_1 .widget_sign .wc .box { padding: 0; background: none; padding: 1em 0 8em 0;}.act_wid_1 .widget_sign .signs_info { position: relative;  }.act_wid_1 .people_count { position: relative; width: 50%; }.act_wid_1 .people_count, .act_wid_1 .signs_left { font: bold 1em Helvetica; }.act_wid_1 .signs_info  small { font: bold .65em Arial; display: block;}.act_wid_1 .signs_left { width: 50%; position: absolute; left: 50%; top: .5em;}.act_wid_1 .act_now { font-size: .75em;}.act_wid_1 .act_now h3 { text-transform: uppercase; font: bold 1.7em Helvetica; margin: .25em 0;}.act_wid_1 .act_now table { width: 100%;}.act_wid_1 .act_now th, .act_now td { padding: 1px 5px 1px 5px; background: none;}.act_wid_1 .act_now th { text-align: right; font-weight: normal; width: 5.5em;}.act_wid_1 .act_now td input { width: 95%; }.act_wid_1 .act_now tr.accept_conds td input { width: auto; font: .75em Arial;}.act_wid_1 .act_now tr.accept_conds td { font: .75em Arial;}.act_wid_1 .act_now .submit { padding: 1em 0 1.5em 0; margin: 0; border: none; text-align: center; }.act_wid_1 .act_now .submit input { font: bold 1.4em Helvetica; vertical-align: top; height: 38px; padding: 8px 20px 6px 20px; text-transform: uppercase; border: none; -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; -moz-box-shadow: 2px 2px 2px #666; -webkit-box-shadow: 2px 2px 2px #666; box-shadow: 2px 2px 2px #666;}.act_wid_1 .act_now .submit input:hover { opacity: .9; cursor: pointer;}.act_wid_1 .act_now .submit a { text-decoration: none; display: inline-block; font: bold 1.4em Helvetica; vertical-align: top; padding: 16px 18px 9px; text-transform: uppercase; border: none; -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; -moz-box-shadow: 2px 2px 2px #666; -webkit-box-shadow: 2px 2px 2px #666; box-shadow: 2px 2px 2px #666;}.act_wid_1 .act_now .submit a:hover { opacity: .9; }/* widget sign theme */.act_wid_1 .act_wid_img { background: #8CDEEF url("/images/widget_bkgd_blue.png");}.act_wid_1 .wtheme_green .act_wid_title { border-color: #FFF;}.act_wid_1 .wtheme_green .act_wid_title h1 { border-color: #FFF;}.act_wid_1 .wtheme_green .act_wid_title h1 a { color: #FFF; }.act_wid_1 .wtheme_green .widget_sign { background: #99D52D; color: #FFF;}.act_wid_1 .wtheme_green .progress_bar { border-color: #FFF; }.act_wid_1 .wtheme_green .people_count { color: #335D00;}.act_wid_1 .wtheme_green .signs_info small { opacity: .6;}.act_wid_1 .wtheme_green .act_now { background: #CCEA96; color: #558E00;}.act_wid_1 .wtheme_green .act_now h3 { color: #558E00;}.act_wid_1 .wtheme_green .act_now .submit input {  background: #53A11F;  background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#53A11F), to(#6DB314));  background: -moz-linear-gradient(100% 0% 270deg,#53A11F, #6DB314);  color: #FFF;}.act_wid_1 .wtheme_green .act_now .submit a {  background: #53A11F;  background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#53A11F), to(#6DB314));  background: -moz-linear-gradient(100% 0% 270deg,#53A11F, #6DB314);  color: #FFF;}&lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="act_wid_1"&gt;  &lt;div class="wtheme_green" id="widget_box"&gt;    &lt;div class="widget_sign" id="widget_cont"&gt;      &lt;div class="act_wid_img"&gt;&lt;a href="http://actuable.es/retos/red-neutral" target="_blank"&gt;&lt;img alt="Neutralidad en la red" height="195" src="http://actuable.es/system/images/10/medium/neutralidad en la red.png" width="300" /&gt;&lt;/a&gt;&lt;/div&gt;      &lt;div class="act_wid_title"&gt;        &lt;h1&gt;&lt;a href="http://actuable.es/retos/red-neutral" target="_blank"&gt;Red Neutral&lt;/a&gt;&lt;/h1&gt;      &lt;/div&gt;      &lt;div class="wc signs_info"&gt;        &lt;div class="people_count"&gt;          &lt;small&gt;Han actuado&lt;/small&gt;&lt;br /&gt;          &lt;span id="actuable_signs_count_10"&gt;0 personas&lt;/span&gt;&lt;br /&gt;        &lt;/div&gt;        &lt;div class="signs_left"&gt;          &lt;small&gt;Nos faltan&lt;/small&gt;&lt;br /&gt;          &lt;span id="actuable_signs_left_10"&gt;0 apoyos&lt;/span&gt;&lt;br /&gt;        &lt;/div&gt;      &lt;/div&gt;&lt;!-- .wc --&gt;&lt;br /&gt;&lt;br /&gt;      &lt;div class="act_now"&gt;        &lt;div class="wc" id="act_now_not_acted"&gt;          &lt;div class="widget_form"&gt;            &lt;h3&gt;Apúntate ahora&lt;/h3&gt;            &lt;form accept-charset="UTF-8" action="http://actuable.es/challenges/10/supports" method="post"&gt;            &lt;div style="margin:0;padding:0;display:inline"&gt;&lt;input name="utf8" type="hidden" value="✓" /&gt;&lt;br /&gt;              &lt;input name="authenticity_token" id="actuable_authenticity_token" type="hidden" value="" /&gt;&lt;/div&gt;            &lt;table&gt;              &lt;tr&gt;                &lt;th&gt;Tu nombre&lt;/th&gt;                &lt;td&gt;&lt;input class="text" id="user_name" name="user[name]" size="30" type="text" /&gt;&lt;/td&gt;              &lt;/tr&gt;              &lt;tr&gt;                &lt;th&gt;Tu apellido&lt;/th&gt;                &lt;td&gt;&lt;input class="text" id="user_surname" name="user[surname]" size="30" type="text" /&gt;&lt;/td&gt;              &lt;/tr&gt;              &lt;tr&gt;                &lt;th&gt;Tu correo-e&lt;/th&gt;                &lt;td&gt;&lt;input class="text" id="user_email" name="user[email]" size="30" type="text" /&gt;&lt;/td&gt;              &lt;/tr&gt;              &lt;tr&gt;                &lt;th&gt;Cód. Postal&lt;/th&gt;                &lt;td&gt;&lt;input class="text" id="user_postal_code" name="user[postal_code]" size="30" type="text" /&gt;&lt;/td&gt;              &lt;/tr&gt;              &lt;tr class="accept_conds"&gt;                &lt;th&gt;&lt;/th&gt;                &lt;td&gt;&lt;br /&gt;                  &lt;label for="user_terms_of_service"&gt;&lt;br /&gt;                  &lt;input name="user[terms_of_service]" type="hidden" value="0" /&gt;&lt;input id="user_terms_of_service" name="user[terms_of_service]" type="checkbox" value="1" /&gt;&lt;br /&gt;                  Acepto las &lt;a href="http://actuable.es/s/condiciones-de-uso" target="_blank"&gt;Norm. de Uso&lt;/a&gt; y &lt;a href="http://actuable.es/s/privacidad" target="_blank"&gt;Pol. de Priv.&lt;/a&gt;&lt;/label&gt;&lt;br /&gt;                &lt;/td&gt;              &lt;/tr&gt;              &lt;tr class="accept_conds" id="lead" style="display:none"&gt;                &lt;th&gt;&lt;/th&gt;                &lt;td&gt;&lt;br /&gt;                  &lt;label for="user_interested_in_organization"&gt;&lt;br /&gt;                  &lt;input name="user[interested_in_organization]" type="hidden" value="0" /&gt;&lt;input checked="checked" id="user_interested_in_organization" name="user[interested_in_organization]" type="checkbox" value="1" /&gt;&lt;br /&gt;                  Quiero recibir más información de &lt;/label&gt;&lt;br /&gt;                &lt;/td&gt;              &lt;/tr&gt;            &lt;/table&gt;            &lt;div class="submit"&gt;              &lt;input type="submit" value="Apúntate al reto" /&gt;&lt;br /&gt;            &lt;/div&gt;            &lt;/form&gt;          &lt;/div&gt;          &lt;div class="submit submit_link" style="display:none"&gt;            &lt;a href="http://actuable.es/retos/red-neutral" target="_blank"&gt;Apúntate al reto&lt;/a&gt;&lt;br /&gt;          &lt;/div&gt;        &lt;/div&gt;&lt;!-- .act_now --&gt;&lt;br /&gt;      &lt;/div&gt;&lt;!-- .wc --&gt;&lt;br /&gt;    &lt;/div&gt;&lt;!-- .widget_sign --&gt;&lt;br /&gt;  &lt;/div&gt;&lt;!-- .wtheme --&gt;&lt;br /&gt;&lt;/div&gt;&lt;!-- #act_wid_1 --&gt;&lt;br /&gt;&lt;script type="text/javascript" src="http://actuable.es/c/red-neutral/js"&gt;&lt;/script&gt;&lt;br /&gt;&lt;script&gt;document.getElementById("actuable_signs_count_10").innerHTML = supporters_count + " persona" + (supporters_count == 1 ? '' : 's');document.getElementById("actuable_signs_left_10").innerHTML = suppors_pending + " apoyo" + (suppors_pending == 1 ? '' : 's');document.getElementById("actuable_authenticity_token").value = auth_token;if(lead == true) {  document.getElementById("lead").style.display = '';} else {  document.getElementById("lead").style.display = 'none';}&lt;/script&gt;&lt;br /&gt;&lt;!-- /WIDGET ACTUABLE - T1.1 --&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-1400320269963921196?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/1400320269963921196/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=1400320269963921196&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/1400320269963921196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/1400320269963921196'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2011/03/por-la-neutralidad-en-la-red.html' title='Por la neutralidad en la red'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-2310260976363507294</id><published>2011-02-13T16:08:00.001+01:00</published><updated>2011-02-13T16:08:45.291+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Propiedad Intelectual'/><category scheme='http://www.blogger.com/atom/ns#' term='Ley Sinde'/><title type='text'>10 ideas antiSinde</title><content type='html'>La democracia y la cultura han sido vilmente profanadas, tomadas por la fuerza a través de una ley paradójicamente ilegal. Suplantar al juez de sus competencias (es lo que hace el comité administrativo que va a instaurar para el cierre de páginas web) viola el artículo 20.5 de la Constitución (es anticonstitucional), viola la neutralidad en la red, el derecho a la intimidad, el derecho a la protección de datos, el derecho a la presunción de inocencia y algunas directivas de la UE, tales como el derecho a la libre prestación de servicios y las relacionadas con el Comercio Electrónico.&lt;br /&gt;&lt;br /&gt;La Ley Sinde pasará a engrosar las páginas negras de la historia de España por ser la Inquisición del Siglo XXI, fruto del sometimiento de la soberanía de nuestro país a otro país (EEUU), y a los intereses de un grupo exclusivo de lobbies que dicen defender la cultura, pero que la han pervertido, la han arruinado y la han expoliado para costear sus propios lujos a costa del bolsillo y la vergüenza de todos los ciudadanos de un país. Han doblegado a nuestros débiles y corruptibles gobiernos, han impuesto sus intereses millonarios, han pisoteado las normas fundamentales de la Democracia, han saltado por encima de la Ley, han impuesto su propio impuesto recaudatorio (no sancionador), gestionado por ellos mismos y para ellos mismos, con el que luego han cometido un fraude a los autores que defienden y a la Hacienda Pública. PP y CIU han apoyado la Ley Sinde para imponer sus intereses para reformar este canon declarado ilegal por el Tribunal de Justicia de la Unión Europea, que, presumiblemente, grabará ahora a más dispositivos, e incluso a las comunicaciones.&lt;br /&gt;&lt;br /&gt;La Ley Sinde va a ser aprobada, tras la traición de nuestros gobernantes y de nuestra oposición a la confianza de los millones de ciudadanos que les dieron el voto. No han escuchado la voz de aquellos quienes les pusieron donde están. Han creado una generación maldita en la cultura y en la economía de este país, en el momento que más necesitábamos de la cultura y de la innovación tecnológica. Nos han hipotecado y nos han bajado a la cola del desarrollo.&lt;br /&gt;&lt;br /&gt;Hoy, más que nunca, hace falta la unión de los españoles y no olvidar esta afrenta. En tres meses tendremos elecciones autonómicas y locales, y dentro de un año las estatales. Ahí es donde los ciudadanos podremos responder e imponer nuestra opinión ante este y otros errores que han cometido tanto PSOE como PP.&lt;br /&gt;&lt;br /&gt;He creado diez ideas antiSinde, a modo de protesta ante esta violación de nuestros derechos fundamentales:&lt;br /&gt;&lt;br /&gt;1) Dejar comentarios con enlaces en medios de PSOE, PP y CIU. Aplicando su propia ley, deben cerrarlos.&lt;br /&gt;2) Dejar enlaces en emails, tweets y SMS, de candidatos de PSOE, PP y CIU. Aplicando su propia ley, han de cerrarlos.&lt;br /&gt;3) No votar a PSOE, PP y CIU. Votar a partidos que se negaron a esta ley y escucharon a los ciudadanos, como UPyD&lt;br /&gt;4) Darse de baja en las operadoras que apoyen la Ley Sinde.&lt;br /&gt;5) No comprar obras de creadores proSinde. Consumir obras Copyleft, Creative Commons…&lt;br /&gt;6) Usar software libre y redes encriptadas, ubicadas fuera de nuestro país.&lt;br /&gt;7) Aplicar ideas 1 y 2 a medios de gestoras de Derechos de Autor, como SGAE.&lt;br /&gt;8) Crear y usar plataformas culturales atractivas y económicas, como Netflix o Spotify.&lt;br /&gt;9) Abogar por la cultura libre, abierta y sin propietarios. Crear la plataforma eCultura.&lt;br /&gt;10) Convocar 1 huelga general, con desconexión de ordenadores, teléfonos móviles y wifis.&lt;br /&gt;&lt;br /&gt;La cultura es de la humanidad, y nadie puede poseerla y aún menos expoliarla. Por la cultura, por la neutralidad en la red, por el derecho a la privacidad, por la libertad, por la tecnología, por internet y por el desarrollo económico, haz valer tus derechos.&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-2310260976363507294?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/2310260976363507294/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=2310260976363507294&amp;isPopup=true' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/2310260976363507294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/2310260976363507294'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2011/02/10-ideas-antisinde.html' title='10 ideas antiSinde'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-3431084957560093321</id><published>2011-02-02T20:37:00.001+01:00</published><updated>2011-02-02T20:37:41.098+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Propiedad Intelectual'/><category scheme='http://www.blogger.com/atom/ns#' term='Política'/><title type='text'>El fracaso anunciado de la Ley Sinde</title><content type='html'>El título hará reír a más de uno, puesto que la Ley Sinde será aprobada por una mayoría aplastante de parlamentarios, pertenecientes a PSOE, PP y CIU. Pero su aprobación no será un triunfo, si no un rotundo fracaso.&lt;br /&gt;&lt;br /&gt;No puede ser un triunfo aprobar una Ley que perjudique a 45 millones de españoles, al desarrollo y a la competitividad de empresas innovadoras, o que la inversión no entre en nuestro país para irse a aguas más tranquilas, cuando la crisis y el paro demandan quitar frenos y lastres.&lt;br /&gt;&lt;br /&gt;No puede ser un triunfo que esos parlamentarios den la espalda a los millones de personas que les votaron, pensando únicamente en sus propios intereses o callar ante las directivas de sus partidos.&lt;br /&gt;&lt;br /&gt;No puede ser un triunfo que esta Ley se apruebe por un pacto entre adversarios, y que el resultado de dicho pacto sea la reforma del canon digital, declarado ilegal por el Tribunal de Justicia de la Unión Europea, tratando de aplicarlo a más dispositivos o medios, e incluso a las comunicaciones (como la ADSL).&lt;br /&gt;&lt;br /&gt;No puede ser un triunfo que esta Ley la proponga el Partido Socialista, cuando en 2002 se opuso a los mismos propósitos de la misma, dentro de la LSSI que pretendía aprobar el PP, entonces en el Gobierno.&lt;br /&gt;&lt;br /&gt;No puede ser un triunfo apartar a los jueces de sus competencias para cerrar páginas web que contengan enlaces, o que un comité administrativo afín a los intereses de un gobierno manipulado por los lobbies de la cultura, pueda cerrar cualquier servicio de la red por interpretar (de forma preventiva y ambigua, por simple presunción) pueda causar dolo patrimonial. El motivo de esta aberración es como quitar al árbitro de un partido que siempre ha pitado con juicio e imparcialidad según las leyes de la democracia, la libertad y la justicia, para relegarlo a la banda, y poner un árbitro que pite a favor de sus oscuros intereses.&lt;br /&gt;&lt;br /&gt;No puede ser un triunfo aprobar una ley paradójicamente ilegal, pues viola el artículo 20 de la Constitución, al suplantar las funciones de un juez. Asimismo contraviene las directivas europeas del Comercio Electrónico y de la protección de datos.&lt;br /&gt;&lt;br /&gt;No puede ser un triunfo una ley que, de aplicarse estrictamente, podría criminalizar a buscadores (como Google), o a servicios Web 2.0, como redes sociales (Facebook, Tuenti…), blogs (Blogger, WordPress…) o microblogging (Twitter). Cualquier usuario que deje un comentario, opinión, respuesta, etc., a otros usuarios, puede dejar un enlace a una obra. ¿Hay que controlar y censurar la participación viral?. La Ley Sinde atenta contra la neutralidad en la red y los derechos fundamentales de la libertad de expresión y de la participación, imponiendo la censura.&lt;br /&gt;&lt;br /&gt;No puede ser un triunfo una ley estéril que no puede aplicarse a lo que pretende defender. No tiene jurisdicción sobre servidores ni páginas alojadas fuera del país (más del 90%), ni sobre aplicaciones P2P, las cuales no usan páginas de enlace, si no buscadores. Además, las páginas de enlace no contienen obras, ni reproducen ninguna parte de las obras, ni las difunden públicamente, por lo que no hay delito contra la propiedad intelectual ni contra los derechos de autor, como así han interpretado y fallado todos los jueces hasta el momento, a los que ahora van a despachar por estorbar.&lt;br /&gt;&lt;br /&gt;No puede ser un triunfo una ley que va a aprobar un gobierno títere y manipulable, que cede a los caprichos de otro país (EE.UU), menoscabando y poniendo en duda nuestra propia soberanía. Así como tampoco, que ceda ante los chantajes de los lobbies culturales, un grupo exclusivo y privilegiado, anteponiendo los intereses de este sector minoritario a los derechos fundamentales de todo un país.&lt;br /&gt;&lt;br /&gt;No puede ser un triunfo una ley que blinda aún más derechos y leyes feudalistas sobre la propiedad intelectual, en lugar de reformarlas, mejorarlas y adecuarlas al Siglo XXI, condenándolas a prolongar su extinción por la vía más agónica y dolorosa, que es la disconformidad y el rechazo de toda la sociedad española, quien tiene el derecho a una cultura libre y abierta.&lt;br /&gt;&lt;br /&gt;No puede ser un triunfo una ley que, en lugar de ayudar a la industria cultural a ser más innovadora, competente, solvente y rentable la entierra en un prehistórico y desgastado modelo de más de un siglo. El Siglo XXI está aquí, la sociedad de la información es nuestra sociedad, la tecnología es el trampolín de la cultura y de la empresa. Empresas como iTunes, Netflix, Spotify o Kindle, han demostrado que las nuevas tecnologías abren un mercado mucho más rápido, más directo, más accesible, más económico, más rentable y más lucrativo, siendo, además, más justos en la explotación de las obras y en la remuneración a los autores. Esta ley supone situar a España en la cola cultural y empresarial, algo así como obligar a los taxistas seguir usando una calesa tirada por un caballo, cuando el resto del mundo se mueve con el automóvil.&lt;br /&gt;&lt;br /&gt;No puede ser un triunfo una ley que sigue discriminando y sometiendo a los autores y artistas a las normas dictadas por el lobby cultural, que imponen la exclusividad y una pesada hipoteca sobre las obras y los propios autores, en lugar de impulsar y promocionar alternativas más abiertas, libres y respetuosas de derechos de autor, como el Copyleft o la Creative Commons.&lt;br /&gt;&lt;br /&gt;A tenor de todo lo anterior, la Ley Sinde, a pesar de que sea aprobada en el Congreso, realmente habrá sentado un precedente de repudia y rechazo en los ya más que hartos ciudadanos, autores y empresarios de la industria cultural, atónitos e impasibles ante las tropelías constantes de los lobbies. Creará más rechazo hacia los partidos políticos que darán el SI a esta ley, al sentirse defraudados y traicionados. Y eso pasará factura en las urnas.&lt;br /&gt;&lt;br /&gt;Al final, la Ley Sinde será derogada ante su inutilidad y por el daño ocasionado, para vergüenza de todos. Será un rotundo fracaso.&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-3431084957560093321?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/3431084957560093321/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=3431084957560093321&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/3431084957560093321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/3431084957560093321'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2011/02/el-fracaso-anunciado-de-la-ley-sinde.html' title='El fracaso anunciado de la Ley Sinde'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-6553792722301967005</id><published>2010-12-23T08:27:00.003+01:00</published><updated>2010-12-23T08:28:06.620+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Christmas'/><title type='text'>Feliz Navidad y próspero año 2011</title><content type='html'>Os deseo, con todo cariño y agradecimiento, una Feliz Navidad y un  próspero, único, entrañable y especial año 2011, en el que deseo que  vuestros deseos y vuestros sueños se hagan realidad.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_T-uXeKcGTnM/TRL544o_MYI/AAAAAAAABjw/T7wUEotjen4/s1600/xmas+cat.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="232" src="http://1.bp.blogspot.com/_T-uXeKcGTnM/TRL544o_MYI/AAAAAAAABjw/T7wUEotjen4/s320/xmas+cat.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-6553792722301967005?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/6553792722301967005/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=6553792722301967005&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6553792722301967005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6553792722301967005'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/12/feliz-navidad-y-prospero-ano-2011.html' title='Feliz Navidad y próspero año 2011'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_T-uXeKcGTnM/TRL544o_MYI/AAAAAAAABjw/T7wUEotjen4/s72-c/xmas+cat.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-4129963726366243909</id><published>2010-12-22T12:49:00.000+01:00</published><updated>2010-12-22T12:49:20.842+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Humor'/><title type='text'>Humor tecnológico</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_T-uXeKcGTnM/TRHleNPzvoI/AAAAAAAABjo/175gFTX7-XA/s1600/geek2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="293" src="http://3.bp.blogspot.com/_T-uXeKcGTnM/TRHleNPzvoI/AAAAAAAABjo/175gFTX7-XA/s320/geek2.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Fuente: &lt;a href="http://www.linux-party.com/modules.php?name=News&amp;amp;file=article&amp;amp;sid=6540/un-poquito-de-humor,-antes-de-las-fiestas-de-navidad-"&gt;LinuxParty&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-4129963726366243909?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/4129963726366243909/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=4129963726366243909&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/4129963726366243909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/4129963726366243909'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/12/humor-tecnologico.html' title='Humor tecnológico'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_T-uXeKcGTnM/TRHleNPzvoI/AAAAAAAABjo/175gFTX7-XA/s72-c/geek2.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-5133984059189209106</id><published>2010-12-22T10:25:00.003+01:00</published><updated>2010-12-22T10:26:16.724+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tecnología'/><category scheme='http://www.blogger.com/atom/ns#' term='Propiedad Intelectual'/><category scheme='http://www.blogger.com/atom/ns#' term='Articulo'/><title type='text'>Gracias, Sinde</title><content type='html'>Ayer se extinguió el intento golpista de la ley más polémica y antidemocrática de la última década, en un órdago que el gobierno creyó ganar e imponer con sus cartas marcadas. Poco le sirvió intentar camuflarla dentro de un paquete de leyes diferente. Poco le sirvió intentar presionar y negociar con el resto de partidos políticos. Poco le sirvió los argumentos dóciles intentando convencer de que no hay segundas intenciones y de trasfondo. Al final, PSOE se quedó sólo, con el sabor amargo de una derrota sin precedentes, indicador clave de una crisis de gobierno, condimentado con una tendencia de otras crisis que le han venido grandes y de las que no ha sabido estar a la altura.&lt;br /&gt;&lt;br /&gt;La ley Sinde lleva dando bandazos desde su nacimiento (hace ya mucho tiempo), encontrando barreras allá donde va, pues es antipopular. Gracias a Wikileaks nos enteramos de que esta ley viene escrita desde EEUU, cuyo gobierno, simpatizante (o calzonazos) de la industria cinematográfica de Hollywood, ha estado presionando a nuestro gobierno, a pesar de los informes de casos infructuosos de cierres de páginas web en nuestro país. Y es que en nuestras salas de cine, más del 85% de las películas proyectadas son "made in USA", y eso no es suficiente para la infinita codicia de unos magnates anticuados. Hay que acusarnos de ser el país más pirata del mundo, cuando de siempre se ha sabido que nuestros galeones eran asaltados y hundidos por piratas de otros países. La acepción de la palabra pirata, según el diccionario de la Real Academia de la lengua Española, es la siguiente:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;"Persona que, junto con otras de igual condición, se dedica al abordaje de barcos en el mar para robar.&lt;br /&gt;Persona cruel y despiadada.&lt;br /&gt;Persona que, bajo amenazas, obliga a la tripulación de un avión a modificar su rumbo."&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Sería irónico pensar que una ama de casa, un estudiante adolescente, un señor jubilado, un autónomo, un "currito", o cualquiera de los millones de personas a los que se les acusa de piratas, vayan por la calle sembrando el pánico cruelmente, amenazando despiadadamente al resto de ciudadanos. Es calumnioso, cuanto menos. Se está faltando el respeto de millones de personas y de un país.&lt;br /&gt;&lt;br /&gt;Nuestro gobierno ha cedido a las presiones de una industria decadente condenada a la extinción. No digo ésto sin una buena razón. Internet y la sociedad de la información están aquí desde hace casi dos décadas. Es una revolución sin precedentes en la historia, incluso mayor que la revolución industrial. Esta revolución ha calado en la sociedad, en las economías, en los negocios, en las políticas... en todo, salvo la industria de la cultura. Ha revolucionado en la forma de comunicarnos, de expresarnos, de comprar, de consultar información, de planificar nuestras vacaciones, de compartir intereses... Todo se está adaptando y evolucionando en torno a la sociedad de la información, porque es beneficioso y porque cubre las necesidades de los compromisos sociales y económicos. Cualquier empresa hoy en día tiene su página en internet, y ha adaptado su modelo de negocio a la web. Desde hace ya tiempo, los ciudadanos, antes de comprar, consultan productos y precios en internet, se informan bien sobre sus características y ventajas, y, por último compran aquello que mejor se adapta a sus necesidades personales. Sin embargo, la industria cinematográfica y de la música, no quieren evolucionar, y se aferran agónicamente al obsoleto modelo de negocio que tanto beneficio les ha dado durante tantos años antes de la revolución de la información. Es cierto que podemos comprar películas y música a través de internet, pero no aportan ningún valor añadido con respecto al formato tradicional. ¿Por qué pagar el mismo precio por una canción en formato electrónico que en formato físico (precio/canción), si la discográfica se ahorra costes de producción, logística y tienda? Si esta industria no innova, no escucha ni satisface las necesidades de los consumidores de esta época, está condenada a su extinción.&lt;br /&gt;&lt;br /&gt;No entraré en más detalles sobre asuntos de los que ya se han discutido y sobre los que se han escrito ríos de tinta. Me concentraré en la polémica ley Sinde y lo que dicha ley ha supuesto estos días. Pero no voy a dar más datos de los que ya se conocen y que se pueden consultar en otros medios, principalmente en &lt;a&gt;http://sindegate.net&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Me gustaría dar las gracias a Sinde y a su ley. No, no me estoy volviendo loco. Lo digo seriamente y con sinceridad. GRACIAS, SINDE. Pero, ¿Por qué? Por que la ley Sinde hay tenido éxito. Pero no el éxito que se esperaba. Si no el éxito de movilización de miles de ciudadanos para  expresar libremente su opinión. Las barricadas ya no están en la calle, si no en la red, donde hay un movimiento más multitudinario, más social,  más rápido, más interactivo, y más efectivo. Las redes sociales estaban a rebosar de proclamas y activistas. Las redes sociales se convirtieron en cacerolas hirvientes de opiniones ciudadanas. &lt;br /&gt;&lt;br /&gt;Donde más ciudadanos se encontraron, donde más ciudadanos expresaron libremente su rechazo a esta ley, donde más ciudadanos coincidieron y lucharon, fue, sin duda alguna, Twitter. &lt;br /&gt;&lt;br /&gt;Este medio, nacido de la idea de los SMS, se convirtió en el medio por el cual el interés sobre esta ley se multiplicó viralmente hasta límites incuantificables. Durante el lunes y el martes (anteayer y ayer), seguimos con gran interés los tweets que a cada segundo se recibían en distintos canales, tales como #leysinde o #sindegate. Hubo más canales, sin duda alguna, pero estos fueron los reyes de la batalla de los medios.&lt;br /&gt;&lt;br /&gt;Por ello, Ángeles González-Sinde, le quiero dar las gracias por su ley, pues ha despertado el interés de ciudadanos que creíamos dormidos, y que, a pesar de la lluvia y el frío, se han manifestado a través de internet para expresar su repulsa a una ley que no es más que espasmo delirante de una agonizante industria que se muere por no evolucionar. Le quiero dar las gracias por descubrir, sin que lo previese ni quisiese, un movimiento de expresión más popular y efectivo que una manifestación o un referendum. Le quiero dar las gracias por poner de acuerdo y reafirmar las convicciones de la mayor parte de los ciudadanos de este país, de levantarles de su adormecimiento y hacerles dar un puñetazo en la mesa ante un ataque a sus derechos. Le quiero dar las gracias por hacer que millones de españoles tengan interés por informarse, por despertar del letargo de desinformación y engaño. Le quiero dar las gracias por hacer que los ciudadanos españoles sepan algo más sobre internet y sobre la propiedad intelectual, pero, sobre todo, por estimular el interés por la información y por la política (aunque sea en unas circunstancias un poco humillantes). En resumen, GRACIAS, SINDE.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Fuente: &lt;a href="http://rhernamperez.wordpress.com/2010/12/22/gracias-sinde"&gt;http://rhernamperez.wordpress.com/2010/12/22/gracias-sinde&lt;/a&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-5133984059189209106?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/5133984059189209106/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=5133984059189209106&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/5133984059189209106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/5133984059189209106'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/12/gracias-sinde.html' title='Gracias, Sinde'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-4675922720471257822</id><published>2010-12-20T13:54:00.000+01:00</published><updated>2010-12-20T13:54:50.490+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Software libre'/><title type='text'>Mapa conceptual del Software Libre</title><content type='html'>&lt;a href="http://www.es.gnu.org/~reneme/fsmap/es/map-es-3000.png"&gt;&lt;img src="http://www.es.gnu.org/~reneme/fsmap/es/map-es-3000.png" width="400"&gt;&lt;/a&gt;&lt;br /&gt;Fuente: &lt;a href="http://www.es.gnu.org/~reneme/fsmap/es"&gt;http://www.es.gnu.org/~reneme/fsmap/es&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-4675922720471257822?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/4675922720471257822/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=4675922720471257822&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/4675922720471257822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/4675922720471257822'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/12/mapa-conceptual-del-software-libre.html' title='Mapa conceptual del Software Libre'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-4766907880348917621</id><published>2010-12-20T10:48:00.001+01:00</published><updated>2010-12-20T10:48:06.928+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Política'/><category scheme='http://www.blogger.com/atom/ns#' term='Articulo'/><category scheme='http://www.blogger.com/atom/ns#' term='Redes Sociales'/><title type='text'>La política y las redes sociales</title><content type='html'>&lt;h2&gt;Introducción&lt;/h2&gt;En apenas cinco meses habrá elecciones municipales y autonómicas en España. Los medios de comunicación y la forma de llegar al electorado ha cambiado mucho en la última década. La era de la información ya está presente en todos los hogares, y la sociedad ha abrazado el ciberespacio como el medio por el cual relacionarse, expresar sus opiniones, hacer negocios, buscar trabajo, divertirse, comprar, reservar las vacaciones, etc. La forma de hacer política también ha cambiado, especialmente en la forma de comunicarse con los posibles votantes.&lt;br /&gt;&lt;h2&gt;Medios tradicionales&lt;/h2&gt;La televisión, la radio, los diarios y los folletos buzoneados, son medios masivos que llegan fácilmente a muchos ciudadanos, y que se utilizan exclusivamente para informar. Es una comunicación débil, pues únicamente hay un emisor que fuerza el envío de información a un receptor. Es un medio frío, en el que hay que ser creativo para captar la atención del receptor para que se interese por el contenido. El porcentaje de interés suele ser bajo.&lt;br /&gt;&lt;br /&gt;Las mesas informativas y los mítines son medios que no llegan a tantos ciudadanos, pero tienen la ventaja de que los ciudadanos contactados ponen cara a sus políticos, pueden (o al menos deberían) poder hablar con ellos, dar opiniones, criticar, recibir el calor de un apretón de manos, de una mirada, captar la intensidad y la pasión del mensaje hablado... es un medio directo, muy humano, y las relaciones son mucho más efectivas. El porcentaje de interés es muy superior al de los medios citados en el párrafo anterior.&lt;br /&gt;&lt;br /&gt;Internet no ha cambiado los medios de comunicación tradicionales, si no que ha hecho de pegamento entre la frialdad informativa y la calidez del contacto humano. Es un medio mucho más masivo que el de la prensa, pues no todo el mundo compra un diario, o escucha la radio, a menos que esté realmente interesado en ello. El ciudadano puede acceder a la información sin necesidad de un medio concreto, pues en Internet, la información es replicada en multitud de medios, estén o no asociados a un partido político, o estén o no asociados a un medio de comunicación concreto. La replicación de las noticias es algo sorprendente, y que funciona a modo de marketing viral. Lo más sorprendente, no es cómo una información se extiende exponencialmente, si no la facilidad de cómo los buscadores pueden llevarnos a dicha información.&lt;br /&gt;&lt;br /&gt;Por un lado tenemos la facilidad de accesibilidad a la información, y por otro, y quizá el aspecto más importante de Internet, es que la comunicación puede establecerse en ambos sentidos, creando una relación entre el ciudadano y el político mucho más accesible que de forma presencial. En este aspecto, las redes sociales juegan un factor determinante en dicha relación, y un político debería tenerlo muy en cuenta.&lt;br /&gt;&lt;h2&gt;¿Qué son las redes sociales?&lt;/h2&gt;Una red social es una herramienta o medio, a través del cual se facilita la posibilidad de que personas con intereses similares o comunes se conozcan y se relacionen. Existen redes sociales especializadas en alguna temática, como por ejemplo Xing o LinkeIn, que unen a personas con intereses empresariales o profesionales. Hay también redes científicas, médicas, educativas, informáticas, etc.&lt;br /&gt;&lt;br /&gt;Sin embargo, la red más famosa y popular de todos los tiempos es Facebook, con más de 500 millones de usuarios en todo el mundo. La principal característica de esta red es que permite comunicar a personas en cualquier parte del mundo, sobre cualquier interés, o sobre cualquier temática, además de incluir funcionalidades muy útiles y que veremos a continuación.&lt;br /&gt;&lt;br /&gt;Antes de proseguir, debo decir que existen más redes sociales de propósito general, como Tuenti o MySpace, e incluso una nueva red social llamada Diaspora, que está basada 100% en software libre y en estándares abiertos. Pueden gustar más o menos, pero en política hay que ser prácticos, y llegar a la mayor cantidad posible de ciudadanos. Y Facebook es el medio más popular y extendido con gran diferencia. También se podría pensar en utilizar varias redes sociales. Es buena idea, pero, como veremos a continuación, las redes sociales, para un político, son un ladrón de tiempo muy importante, que requieren de dedicación y de esfuerzo. Hay que saber dosificar el tiempo útil y productivo en hacer política, y pensar en las redes sociales únicamente como un medio por el cual informar y capturar información.&lt;br /&gt;&lt;h2&gt;Perfil&lt;/h2&gt;Al iniciar la andadura en una red social, hemos de pensar primero qué perfil crear. Un perfil será lo que el resto de usuarios de la red social verán de nosotros. Recomiendo, como prioridad principal, que el perfil sea del grupo político (comité local, amigos de...), y dar la oportunidad, a través de este medio, que otros compañeros participen y utilicen la red social para el bien común. Habrá quienes tengan un perfil personal, como persona, que quieran también usar la red social para medios políticos. En este sentido, mi recomendación es dar prioridad al perfil del grupo político, y usar el personal de forma independiente. Una opinión personal, por ejemplo, debería darse (normalmente) en el perfil personal, y no en el del grupo. Por otra parte, recomiendo que si se utiliza un perfil personal, utilizarlo única y exclusivamente para fines políticos. Aunque tengamos amigos del colegio, de la Universidad, del club de mus, o en cualquier otra afición, deberíamos dejar nuestros asuntos personales y nuestras aficiones al margen. Un político es una figura pública, y como tal, tendrá fans y detractores, y las cosas personales que se publiquen pueden determinar la simpatía o la antipatía de los electores, y podrían utilizarse para cualquier actividad de desprestigio y, cómo no, para arrancarnos votos.&lt;br /&gt;&lt;br /&gt;Una vez creado el perfil, es importante configurar la información inicial, tales como los intereses, quién puede dejarnos comentarios o las notificaciones que deseamos recibir. Si usamos Facebook, hay que tomar en cuenta este último punto, pues por defecto, recibiremos notificaciones para cualquier cosa, lo que puede llevar a desesperarnos de forma improductiva e innecesaria.&lt;br /&gt;&lt;br /&gt;Una vez creado el perfil, podemos escribir algo en nuestro muro o en nuestro estado, un mensaje corto para presentarnos y dar la bienvenida a cualquier usuario que nos visite.&lt;br /&gt;&lt;h2&gt;Crear relaciones&lt;/h2&gt;El siguiente paso obligado es encontrar amigos o personas, con el fin de crear lazos y compartir información. Lo más lógico sería pensar en buscar otros grupos o personas relacionados con nuestro partido político, y, a continuación, solicitar su amistad. Este paso no es obligatorio, ni tampoco ha de hacerse una vez y en este orden. En cualquier momento podemos buscar amigos y solicitar su amistad. Esta es la forma de crear la red.&lt;br /&gt;&lt;h2&gt;Generar y consumir información en la red social&lt;/h2&gt;¿Y cuál va a ser nuestro uso de la red social, además de encontrar y hacer amigos? Lo más importante es informar y recibir información. Pero, vayamos por partes.&lt;br /&gt;&lt;br /&gt;El muro o el estado nos permitirá escribir mensajes cortos, los cuales son visualizados en las sesiones de nuestros amigos, e indexados por los buscadores. Estos mensajes pueden ser noticias u opiniones propias. Una práctica muy habitual, es replicar noticias de otros medios, compartiendo enlaces. Lo normal es dar el título de la noticia, y a continuación pegar la URL (dirección Web) de la noticia. Esto tiene la ventaja de suscitar interés con el titular, de no saturar de texto, y que aquel que esté realmente interesado, hará clic en el enlace para leer el resto de la noticia.&lt;br /&gt;&lt;br /&gt;Aquello que se escriba en el muro podrá ser igualmente replicado por otros amigos, creando la comunicación viral, pues los amigos de estos amigos, a su vez podrían nuevamente replicarlo, y así, sucesivamente.&lt;br /&gt;&lt;h3&gt;La participación&lt;/h3&gt;Los mensajes en el muro también permiten comentarios, por lo que entramos en la parte más interesante y útil, ya que nos permite conocer otros puntos de vista, la aceptación del contenido publicado,  la crítica, etc. Esto es retroalimentación de información, y es el poder más grande que tiene la Web 2.0: LA PARTICIPACION.&lt;br /&gt;&lt;br /&gt;Imaginemos que publicamos una idea, por ejemplo, un polideportivo de tales características en tal zona. Un ciudadano podría ver la idea, y opinar al respecto. Puede dar nuevas ideas con las que no contábamos y que pueden ser interesantes, o bien puede dar información que no teníamos (por ejemplo que donde se quiere construir el deportivo era antiguamente un acuífero con pozos), o bien criticar por razones que no dimos importancia o cualaquier otra opinión.&lt;br /&gt;&lt;br /&gt;Las redes sociales, no nos equivoquemos, no son medios para lanzar únicamente nuestros mensajes, ideas o propuestas. Las redes son medios colaborativos, y nuestra colaboración también determina el grado de que los demás participen. Podemos recibir las opiniones de nuestros amigos, recibir recomendaciones de éstos o buscar información sobre algo específico. Nosotros también somos colaboradores. Podemos interesarnos, por ejemplo, sobre algún problema común con otro municipio, o una iniciativa de otro municipio en otra provincia y en otra comunidad autónoma. Hemos de dejar comentarios, dar nuestra opinión, recomendar, replicar, votar noticias o decir, simplemente, que nos gustan. Estas acciones son actividades que también dicen de nosotros, y el resto de colaboradores de la red lo apreciarán, y responderán hacia nosotros de la misma manera.  Hay que cuidar mucho este detalle y no ser egoístas, interesados únicamente en dar publicidad de nosotros sin nada a cambio. ante todo PARTICIPACION Y COLABORACION.&lt;br /&gt;&lt;br /&gt;En el caso de que nuestro partido político sea un partido nacional, es muy importante estar presente y dedicar esfuerzos en promocionar y publicitar las ideas del partido a nivel nacional o autonómico, no solamente de nuestro municipio. Estas referencias nos favorecerán mucho, pues damos una imagen de un grupo político que se preocupa y se implica por la ciudadanía en general y a todos los niveles, no únicamente en su municipio.&lt;br /&gt;&lt;h2&gt;Contenidos multimedia&lt;/h2&gt;Un aspecto bastante importante es la posibilidad de publicar contenidos multimedia. Podemos crear galerías de fotos o de vídeos, de la temática que queramos. Por ejemplo, se pueden crear secciones de fotodenuncia, de monumentos del pueblo, de nuestras actividades (mesas informativas, mítines, visitas a colegios, etc). Al igual que comenté al principio, si usamos nuestro perfil personal, recomiendo no usar fotos personales, y, aún menos, en que aparezcan menores de edad (por razones legales y de falta de privacidad). No quedaría nada bien que publiquemos una foto o un vídeo en la que salgamos con ojos chisposos, descamisado y con una copa en la mano, en mitad de una boda o de una fiesta.&lt;br /&gt;&lt;h2&gt;Aplicaciones o utilidades&lt;/h2&gt;Otra de las características de las redes sociales son las aplicaciones. En el caso de Facebook, podemos encontrar algunas muy interesantes, como Twitter, donde podemos actualizar los contenidos de este medio en Facebook. Hay otras, como suscripciones a noticias RSS, o incluso juegos. Como recomendación personal, hay que dar una imagen política seria, práctica e íntegra. No hay que pecar de ser infantiles, y aún menos molestar al resto de amigos con aplicaciones del tipo "galleta de la suerte", "bolazos de nieve" y similares.&lt;br /&gt;&lt;h2&gt;Grupos&lt;/h2&gt;Otra posibilidad que ofrecen las redes sociales, es la suscripción a grupos de usuarios con algún interés común. Sería muy interesante, por imagen y seriedad, suscribirse a grupos que puedan suponer un peso político y social. Recomendaría, por ejemplo, suscribirse a un grupo o asociación de enfermos de tal o cual enfermedad que está en nuestra localidad, alguna ONG, etc. No recomiendo grupos lúdicos, de ocio o impopulares, y, aún menos, que sean de actualidad pero que no estén en comunión con las ideas generales del partido.&lt;br /&gt;&lt;h2&gt;Mensajes&lt;/h2&gt;Otra funcionalidad importante a tener en cuenta es la posibilidad de dejar mensajes, a modo de correo electrónico. Este medio, aunque primitivo, es el que más se utiliza para comentar cosas directamente a alguien sin que se haga público, como el muro o el estado. Además de privacidad, brinda la posibilidad de establecer una comunicación más estrecha entre ambos.&lt;br /&gt;&lt;h2&gt;Chat&lt;/h2&gt;Por último, comentaré una funcionalidad que poseen las redes sociales que no hemos de escatimar. Se trata la función de chat, que permite una comunicación directa y privada entre el político y el amigo (o ciudadano, o compañero, etc.), de forma instantánea. Gracias a esta herramienta podemos responder o aclarar cuestiones en el momento, con lo que la cercanía y la presencia se hacen más palpables. El problema que tiene esta funcionalidad es (al menos en mi caso) que suele entrar en acción cuando menos lo necesitas, es decir, por ejemplo, cuando estás trabajando o cuando necesitas tu concentración en otras cuestiones más importantes. No obstante, es un medio de comunicación bastante valioso.&lt;br /&gt;&lt;h2&gt;Reflexiones finales&lt;/h2&gt;Hay muchos ciudadanos que no tienen tiempo para ver la televisión, para escuchar la radio, o para leer el periódico; o bien tienen un horario que les impide acudir a un mítin o a una mesa informativa. La ventaja que tiene internet es que es descentralizado, es decir, que no se necesita estar presente ni tampoco estar en un momento dado. La comunicación entre ciudadano y político se produce sin barreras geográficas ni de tiempo.&lt;br /&gt;&lt;br /&gt;Hemos de ver las redes sociales como un medio de comunicación, pero  también como una herramienta de trabajo excelente, que nos da la  información (gracias a los ciudadanos) que necesitamos para saber qué, cómo, cuándo y por qué hemos de hacer las cosas. Si importante es informar, más importante es escuchar y, aún más importante, interactuar.&lt;br /&gt;&lt;br /&gt;Las redes sociales serán muy importantes en la precampaña y, sobre todo, en la campaña electoral. Serán el medio por el cual nos comunicaremos, colaboraremos y conseguiremos relaciones con ciudadanos, compañeros de partido y amigos. El uso de las redes sociales nos harán ganar o perder votos, dependiendo del uso que les demos. Es muy importante estar presentes, existir e interactuar con nuestros ciudadanos a través de estos medios, informarles, aclararles dudas, recibir críticas y agradecer su colaboración.&lt;br /&gt;&lt;br /&gt;Pero no hemos de estar presentes únicamente en momentos de elecciones. Hemos de ser accesibles en cualquier momento, en cualquier lugar y por cualquier razón. No hemos de desconectar con la realidad política y social, porque la realidad no desconecta nunca. Por tanto, tampoco nosotros.&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-4766907880348917621?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/4766907880348917621/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=4766907880348917621&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/4766907880348917621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/4766907880348917621'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/12/la-politica-y-las-redes-sociales.html' title='La política y las redes sociales'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-3190780683115467632</id><published>2010-12-16T17:01:00.003+01:00</published><updated>2010-12-16T22:29:51.299+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='eAdministración'/><category scheme='http://www.blogger.com/atom/ns#' term='Software libre'/><category scheme='http://www.blogger.com/atom/ns#' term='Articulo'/><title type='text'>La necesidad de la Administración Electrónica y la transparencia administrativa</title><content type='html'>&lt;strong&gt;Nota:&lt;/strong&gt; &lt;em&gt;Este artículo es un poco extenso, pero interesante y ameno, pues capta los factores clave para el éxito de la implementación de la eAdministración&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;INTRODUCCION&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;A lo largo de la historia, la vida de los ciudadanos ha estado vinculada a la Administración Pública, donde la comunicación es la clave para que el ciudadano pudiera ejercer sus derechos y que los empleados públicos pudieran ejecutar los trámites con la mayor diligencia posible. Con el tiempo, las comunicaciones y las herramientas de comunicación y de trabajo han ido evolucionando. Se ha pasado de la obligada comunicación presencial, a la correspondencia postal, al teléfono, o, como hemos vivido en las últimas décadas, la telemática.&lt;br /&gt;&lt;br /&gt;Conscientes de esta realidad y de los beneficios que la era informática y las comunicaciones por internet ofrecen, en el año 2007, concretamente el 22 de Junio, se aprobó la Ley 11/2007, de acceso electrónico de los ciudadanos a los Servicios Públicos (&lt;a href="http://www.boe.es/aeboe/consultas/bases_datos/doc.php?id=BOE-A-2007-12352"&gt;http://www.boe.es/aeboe/consultas/bases_datos/doc.php?id=BOE-A-2007-12352&lt;/a&gt;), con la finalidad de que todo ciudadano pudiera comunicarse con la Administración Pública “de acuerdo a los principios de eficacia, jerarquía, descentralización, desconcentración y coordinación”, según reza en los derechos de nuestra Constitución, concretamente en el Artículo 103 (&lt;a href="http://noticias.juridicas.com/base_datos/Admin/constitucion.t4.html"&gt;http://noticias.juridicas.com/base_datos/Admin/constitucion.t4.html&lt;/a&gt;). Esta Ley supuso adecuar la realidad de las tecnologías de la información a la Administración Pública y al ciudadano.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;VENTAJAS PARA EL CIUDADANO&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Para entender un poco mejor ésto, sin sofisticadas fórmulas ni leyes. el ciudadano podrá ejercer su derecho de comunicación con la Administración Pública de forma no presencial a través de las tecnologías. Hoy en día, muchos ciudadanos se deplazan lejos para trabajar y/o los horarios no son compatibles con los horarios de la Administración. Realizar cualquier trámite administrativo de forma presencial puede suponerle la pérdida de uno o varios días a cuenta de días por asuntos personales o a cuenta de sus vacaciones. Otro ejemplo lo encontramos en ciudadanos que tienen una vivienda en otro municipio en otra provincia, y necesita pagar sus impuestos, o pagar multas, etc. También están los casos de ciudadanos impedidos físicamente, ya sea por una enfermedad o una invalidez. También están los casos de ciudadanos que están fuera del país por cualquier asunto (trabajo, viaje, compromisos personales, etc). Todos ellos pueden comunicarse con su Administración desde cualquier lugar (desde casa, desde el trabajo, desde un locutorio, etc.), y a cualquier hora, a través de las tecnologías, sin colas ni esperas. Es, pues, un sistema que funciona las 24 horas del día, todos los días del año, y desde cualquier lugar y medio (hay que tener en cuenta que el trabajo de los empleados públicos está regido por un calendario laboral y un horario, por lo que la gestión de los expedientes no cuenta. Cuenta la operativa de solicitudes y consultas).&lt;br /&gt;&lt;br /&gt;Las tecnologías aportan canales de comunicación. El canal más extendido es el ordenador personal con conexión a internet. Otro canal podría ser un teléfono móvil, la TDT o cualquier otro que facilite esta comunicación. A efectos prácticos, el mejor canal para la introducción y aportación de datos es el ordenador, pues tiene un teclado cómodo, así como la posibilidad de conectar diversos periféricos (escáneres, cámaras, etc), para capturar documentos e imágenes que se pueden adjuntar a los expedientes administrativos. El resto de canales, debido a sus características (tamaño de pantalla, periféricos de entrada de datos, etc.), son menos utilizados, pero interesantes para comunicación de información (avisos, estados, ayuda...)&lt;br /&gt;&lt;br /&gt;El ciudadano podrá recibir notificaciones a través de su correo electrónico o en su teléfono móvil, cada vez que el expediente cambie de estado. También puede consultarlo accediendo a la ventanilla virtual (o electrónica) de su Administración. Los documentos generados y adjuntados también son accesibles de forma electrónica. Todo ello da una trazabilidad detallada y transparente sobre la gestión de sus expedientes.&lt;br /&gt;&lt;br /&gt;El ciudadano también puede pagar tasas, multas, impuestos, etc., mediante una pasarela de pago conectada a la entidad bancaria de la Administración. Este sistema de pago es el utilizado de forma universal en tiendas online, y el banco asociado es garante de su seguridad y de cualquier tipo de incidencia o delito que pudiera ocurrir.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;VENTAJAS PARA LA ADMINISTRACION&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Para la Administración, la eAdministración supone numerosas ventajas (sólo por citar algunas):&lt;br /&gt;&lt;br /&gt;- Ofrecer un servicio desatendido. No es necesario atender a cada ciudadano presencialmente, explicando paso a paso los detalles del expediente. Esto supone un ahorro considerable de tiempo que se transforma en productividad.&lt;br /&gt;&lt;br /&gt;- Mejora la eficiencia en la gestión del expediente y aporta transparencia sobre la misma. Los expedientes van pasando directa y automáticamente a los empleados que se encargarán de gestionarlos. La bandeja de tareas, además, aporta visión de los expedientes y de su estado, evitando olvidos accidentales. Cada proceso conlleva un estado visible y trazable para la Administración y para el ciudadano.&lt;br /&gt;&lt;br /&gt;- La documentación, al ser electrónica y centralizada en un sistema informático, es más manejable y se evitan pérdidas de documentación.&lt;br /&gt;&lt;br /&gt;- El sistema es flexible, pudiendo asignar y delegar tareas a otros empleados públicos, o incluso añadiendo anotaciones en los procesos.&lt;br /&gt;&lt;br /&gt;- Si un ciudadano solicita el estado de un expediente, o una copia de un expediente ya antiguo, la búsqueda es instantánea, evitando la tediosa tarea de búsqueda en un archivo físico. La información está disponible en cualquier momento, y no es necesario buscarla en lugares físicos.&lt;br /&gt;&lt;br /&gt;- Los expedientes y sus documentos, al estar en formato electrónico y al no ocupar espacio físico, se ahorra costes en infraestructuras y en logística, o se puede aprovechar para instalaciones de otro tipo.&lt;br /&gt;&lt;br /&gt;- La documentación en formato electrónico se puede copiar muy fácil y rápidamente.&lt;br /&gt;&lt;br /&gt;- La documentacion en formato electrónico supone un ahorro considerable en costes de papel. El papel es susceptible de destrucción en caso de incendio o de cualquier otra catástrofe. El ahorro en papel favorece el desarollo sostenible y la ecología.&lt;br /&gt;&lt;br /&gt;- La documentación en formato electrónico, si se utiliza algún sistema de persistencia, de alta disponibilidad o de backups, en caso de que desastre en un servidor o en un cluster, estará a salvo y seguirá funcionando.&lt;br /&gt;&lt;br /&gt;- Las gestión administrativa, a través de plataformas de Administración Electrónica, agilizan enormemente el tiempo y el trabajo de los empleados públicos, favoreciendo la eficacia y ahorrando tiempo y costes.&lt;br /&gt;&lt;br /&gt;- La integración con otros sistemas internos agilizan y automatizan el trabajo. Por ejemplo, el pago de un impuesto puede conectar y actualizar automáticamente el sistema contable.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;UN EJEMPLO PRACTICO&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;La Administración Electrónica no es un mero canal de comunicación, si no también un medio de trabajo para el empleado público, y un medio de trazabilidad de expedientes para el ciudadano. Para entender mejor ésto, voy a exponer un caso práctico, paso a paso. Aunque el escenario se refiere a la Administración Local (Ayuntamiento), se puede aplicar a cualquier tipo de Administración (Hacienda, Seguridad Social, etc).&lt;br /&gt;&lt;br /&gt;Un ciudadano solicita un trámite administrativo, por ejemplo, un certificado de empadronamiento. Accede, mediante su ordenador e internet, a la página de su Ayuntamiento, y se dirige a la ventanilla (virtual). Esto lo puede hacer cualquier día, sea festivo o no, y a cualquier hora del día, incluso de noche. Desde la ventanilla podrá acceder a la lista de trámites administrativos disponibles por la Administración (certificado de empadronamiento, solicitud de placa de vado, pago de multas, pago del IBI, pago del impuesto de vehículos, licencia de obra menor, etc). Una vez selecciona su expediente, deberá identificarse para acreditar quién es. Lo más seguro es hacerlo mediante un certificado digital (puede hacerlo en nombre propio como persona jurídica, a través de su DNI electrónico, o bien, mediante un fichero encriptado y protegido, solicitado a la Casa de Moneda y Timbre u otra Administración, previa identificación acreditada y fehaciente). El expediente solicitará una serie de datos afines al mismo (medio de comunicación, motivo de la solicitud, etc). El expediente podrá presentar una ayuda sobre cómo completar la información, así como la documentación necesaria para ser adjuntada. Si es necesario, podrá adjuntar documentos que sean necesarios para el expediente (documento escaneado, una imagen, un documento en formato PDF o DOC, etc). Una vez que el ciudadano introduce la información, la valida y envía el expediente. Si el expediente tiene una tasa, le solicitará el medio de pago del mismo (PayPal o tarjeta de crédito). Recibirá una notificación del expediente con el registro de entrada y su firma digital (una firma digital es un código único, validado con un sellado de tiempo, asociado a un certificado digital y a un documento oficial, el cual genera automáticamente el sistema con el certificado digital del ciudadano (al enviar el expediente es como si firmara el mismo al entregarlo)). El pago de la tasa se realizará mediante una pasarela de pago segura, garantizada por una entidad bancaria. El ciudadano puede proseguir con su vida normal, mientras el expediente ya está en su Administración.&lt;br /&gt;&lt;br /&gt;En el lado de la Administración (en este caso un Ayuntamiento), cuando el empleado municipal correspondiente a dicho expediente (en este caso de Estadística) accede a su puesto de trabajo, verá una lista de tareas pendientes, entre ellas el expediente solicitado por el ciudadano, con su correspondiente registro de entrada y su firma digital. Podrá abrir el expediente, revisarlo y validar la información y documentación aportados. Si los datos no son correctos o falta algún documento, podrá solicitar al ciudadano la rectificación o la documentación pendiente. Si los datos son correctos, puede añadir nueva documentación al expediente. En el proceso de tramitación, se puede generar un documento específico del expediente, el cual será el documento que finalmente se entregará al ciudadano una vez se procese. Finalizado su trabajo, si el expediente requiere la intervención de más empleados públicos para su gestión, firmará digitalmente su proceso, pasando el expediente al siguiente proceso que se asignará a la persona correspondiente. Cuando los procesos de tramitación del expediente terminan, pasará a los procesos de firma, asociados a los responsables correspondientes (Secretario, Concejal, Alcalde...). Estos responsables tendrán un portafolio de los expedientes terminados y pendientes de firma. Tras la revisión, el responsable correspondiente puede firmar los expedientes uno a uno o por lotes. Una vez firmado por todos los responsables, el expediente finaliza, obteniendo un registro de salida, y se mandará al ciudadano mediante los medios de comunicación que ha seleccionado. Cabe decir que, en cualquier proceso, el empleado público puede denegar el expediente, indicando las razones (en nuestro ejemplo, por ejemplo, que el solicitante no está censado en el municipio). También puede solicitar en un determinado proceso el pago de alguna tasa, cuya petición se notificará al ciudadano para que se haga efectiva.&lt;br /&gt;&lt;br /&gt;El ciudadano, por su parte, puede recibir notificaciones en su correo electrónico o en su teléfono móvil vía SMS cada vez que el expediente cambia de estado o de proceso. También puede acceder a la ventanilla virtual para consultar el estado de su expediente. Puede ver las notificaciones de cada proceso, conociendo cuándo ha pasado por dicho proceso (fecha y hora), y qué empleado público o responsable lo ha validado. También puede conocer las peticiones, por parte de la Administración, para que aporte documentación pendiente, cosa que podrá realizar y enviar de la misma forma que vimos cuando solicitaba el expediente. También puede recibir requerimientos de pago de tasas, que realizará como se explicó anteriormente. Si el expediente fue rechazado, conocerá quién lo rechazó, cuando y por qué. Si el expediente se completó, obtendrá el documento del expediente final, junto a la documentación generada y adjunta, así como las firmas digitales de los responsables y el registro de salida de dicho expediente.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;ADMINISTRACION TRADICIONAL&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;La Administración tradicional no desaparece, si no que se complementa con la Administración Electrónica. Es lógico pensar – por ejemplo - que en estos inicios, las personas mayores, y especialmente en pueblos pequeños con poco calado tecnológico, prefieran que se lo hagan desde el Ayuntamiento. El ciudadano acudirá presencialmente, como siempre lo ha hecho, y solicitará el expediente. El empleado público accederá, desde su ordenador, a la página del Ayuntamiento y a la ventanilla, exactamente igual a como lo haría el propio ciudadano en modo online. El ordenador de la Administración tendrá conectado un lector de DNI electrónico, por lo que al solicitar la identificación, se le pedirá al ciudadano que introduzca su DNI en el lector, y, a continuación introduzca su PIN. Puede ocurrir que el ciudadano no tenga aún un DNI electrónico, o no recuerde su PIN. Esto se puede salvar adjuntando al expediente una imagen escaneada del DNI o del pasaporte del ciudadano. A partir de ahí, el empleado público solicitará los datos al ciudadano, y los irá completando en el expediente vía ordenador. El proceso sería el mismo que el que tendría el ciudadano en modo online. Una vez finalizado, se le mostrará al ciudadano el expediente antes de ser enviado, para que valide los datos que ha dado. Si es correcto, se enviará, generando la firma digital y el correspondiente registro de entrada. El documento de entrada será impreso y entregado al ciudadano, mientras que aparecerá este nuevo expediente en la bandeja de tareas del empleado correspondiente de atender el expediente.&lt;br /&gt;&lt;br /&gt;Mediante este método no hay incongruencias en los registros de entrada de los expedientes solicitados vía online y los solicitados vía presencial.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;DIFICULTADES Y PROBLEMAS PARA HACER REALIDAD LA eADMINISTRACION&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Todo lo dicho anteriormente parece idílico, y así debería ser. Pero la realidad es muy diferente y no tan halagüeña. Os contaré mi experiencia.&lt;br /&gt;&lt;br /&gt;Trabajé durante más de año y medio en el proyecto Municip@, de la Comunidad de Madrid, como Director de Provisión, como coordinador entre los equipos técnicos, soporte y comercial, poniendo en marcha el servicio para casi 130 ayuntamientos. También fui interlocutor entre los Ayuntamientos, la Comunidad de Madrid y la empresa adjudicataria del proyecto. Debo reconocer que la Comunidad de Madrid hizo aquí un esfuerzo muy grande, tanto en lo económico, como en medios, como en recursos y personas, para subvencionar a los ayuntamientos de menos de 20 mil habitantes (con alguna excepción), creando un servicio modélico y referente de Administración Electrónica.&lt;br /&gt;&lt;br /&gt;Los problemas que encontré fueron muchos, y no tenían que ver directamente con problemas técnicos, si no más bien del día a día. Estos problemas se encontrarán en cualquier sistema de eAdministración,  muchos de ellos inevitables, algunos asumibles y solventables. Por ejemplo, en ayuntamiento pequeños, además de la poca preparación informática de los empleados públicos, aún en el mejor de los casos de que puedan aprender (con mucho esfuerzo para su capacitación, aún siendo unos sistemas informáticos muy sencillos), estaba el tiempo material que necesitaban, pues eran muy pocos y tenían una gran carga de trabajo. La capacitación para adoptarlo era/es un coste muy importante. Otro, era que nuestra eAdministración estaba diseñada para integrarse con sistemas propios de la Comunidad de Madrid, y algunos ayuntamientos tenían otros sistemas, de otros proveedores, por lo que no podían integrarse, por ejemplo, para generar registros en entrada y salida, o para actualizar datos de otros sistemas de forma automática. Otro problema era la infraestructura de ordenadores que tenían (no entraban dentro de la subvención), que era antigua y había que actualizar el parque informático, cosa para la que muchos ayuntamientos no tenían presupuesto. Otro problema era que había que tener encendidos los ordenadores de algunos sistemas (como el del registro de entrada y salida, o el de estadística) las 24 horas del día, cosa que repercutía en el incremento de consumo de energía (con el consiguiente incumplimiento de la Agenda 21 y el desarrollo sostenible). Otro problema importante era la escasa infraestructura y la escasa calidad de las comunicaciones ADSL en pueblos muy retirados y pequeños, en las sierras de la Comunidad. Además de lentitud, había cortes. Además en días de mal tiempo, con tormentas (cosa frecuente), tanto la electricidad como las comunicaciones, se veían interrumpidas y en ocasiones con efecto racimo, dependiendo de si ese pueblo era nodo de distribución. La interrupción de estos servicios afectaba directamente a la disponibilidad del sistema para que pudiera ser usado por los ciudadanos.&lt;br /&gt;&lt;br /&gt;Por último, para cerrar esta sección, diré que la ventanilla única es aún una utopía, pues ya partimos de que hay diversos sistemas de eAdministración no estandarizados, y que no comparten muchas (a veces ninguna) funcionalidades, incluso entre Administraciones del mismo nivel. No digo nada entre Administraciones distintas.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="text-decoration: underline;"&gt;¿COMO ABORDAR LA eADMINISTRACION?&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;El principal problema que veo es el ocultismo comercial de los productos. Cada fabricante de software mira por su exclusividad, vendiendo productos muy buenos, pero cerrados herméticamente, tanto a nivel de licencias, de código, a nivel de formación, de soporte, de mantenimiento o de mejora. No se abren a otros productos. No se estandarizan. No se integran. Quieren tener la exclusividad de todo.&lt;br /&gt;&lt;br /&gt;Por ello, el primer punto para llegar a una eAdministración real, coherente, de sentido común y para todos los ciudadanos y empresas que quieran colaborar, es que sea software libre, cuyo código y especificaciones estén a disposición de todos, que puedan estudiarse, y que todos puedan participar para mejorar y evolucionar el producto. No hablo de quimeras. Hablo de una realidad necesaria.&lt;br /&gt;&lt;br /&gt;Un producto bajo software libre, creado por una empresa, tendrá el conocimiento más especializado sobre el mismo, por lo que la mayor parte de los contratos de soporte y mantenimiento los tiene casi asegurados. Creando una comunidad en torno a dicho producto, permite que otros entusiastas, sin ánimo de lucro, colaboren en hacer evolucionar y mejorar el producto, sin costes ni nóminas. Eso repercute en el enriquecimiento del producto y de la propia empresa, que ve cómo el producto es mejor y más adoptado por más Administraciones (lo que se traduce en más contratos y más negocio). La participación de desarrolladores altruistas, además, permiten crear documentación, crear foros, resolver dudas, explicar casos, crear parches, etc. Al ser abierto, otros productos podrían crear integraciones con este producto y viceversa. Se resolvería el problema de las incompatibilidades, y se comenzaría a caminar hacia una verdadera integración entre distintas Administraciones, alcanzando, poco a poco, la realidad de la ventanilla única.&lt;br /&gt;&lt;br /&gt;Indpendientemente de los beneficios que supondría que los productos de eAdministración fueran libres y abiertos, para la Administración supondría un ahorro de costes inmenso, además de reforzar la confianza en un producto que es transparente y que no oculta puertas traseras, spyware y similares. También daría libertad para que si un día la relación con el proveedor de servicio se rompe, otro proveedor pueda seguir prestando el servicio con el mismo producto. Otra ventaja sería que, si en el caso de que el fabricante quebrara o se disolviera por cualquier razón, la comunidad podría continuar desarrollando y manteniendo el producto.&lt;br /&gt;&lt;br /&gt;Por último, daré unos consejos más técnicos y estratégicos sobre mi visión de una eAdministración real.&lt;br /&gt;&lt;br /&gt;- Desarrollado bajo estándares probados y populares de código abierto, con una gran comunidad por detrás.&lt;br /&gt;&lt;br /&gt;- Las tecnologías y los lenguajes de programación utilizados deberían estar en el TOP 15 mundial, a fin de asegurar el no uso de tecnologías místicas, y que puedan ser abordadas por casi cualquier desarrollador con costes aceptables.&lt;br /&gt;&lt;br /&gt;- No usar excesivos frameworks a modo de capas de cebolla. Se deberían analizar realmente las necesidades y el rendimiento, simplificando al máximo su arquitectura, evitando el consumo innecesario de recursos, lo que se traduce en tiempos de respuesta mejores, menos tráfico, más ahorro de energía y más ahorro de recursos físicos (memoria y disco).&lt;br /&gt;&lt;br /&gt;- Uso de tecnologías estándar de comunicaciones, como SOAP o REST, bajo conexiones seguras estándar, como OpenSSL&lt;br /&gt;&lt;br /&gt;- Uso de bases de datos realmente escalables, tanto horizontal como verticalmente, así como también que tengan un altísima disponibilidad. Ante estas necesidades, bases de datos de tipo NoSQL serían una buena opción. En el caso de los documentos, por su estructura, MongoDB, RavenDB o CouchDB serían idóneas. Si el tipo de expedientes es más estadístico u organizado, Cassandra sería una buena opción. Es una recomendación personal.&lt;br /&gt;&lt;br /&gt;- Sólo recomendaría la computación en nube en el caso de que las infraestructuras sean de la Administración, no de un proveedor externo, como una empresa, ya que si no, se pierde el control de los datos, aunque se firmen contratos LOPD. Sería bueno, por ejemplo, para la reducción de costes en caso de mancomunidades entre varios Ayuntamientos, o en el caso de que una Administración de jerarquía superior, financie y de el servicio a las Administraciones de jerarquía inferior, de la cual dependen.&lt;br /&gt;&lt;br /&gt;- La dotación y la mejora de infraestructuras (líneas telefónicas, ADSL, electricidad, etc) es un punto clave para que tenga éxito. Hasta entonces, una opción podría ser compartir el servicio en una mancomunidad de municipios, alojándolos en aquel con mayores garantías de disponibilidad (en el caso de las Administraciones Locales).&lt;br /&gt;&lt;br /&gt;- Esfuerzo inicial de formación y capacitación para los empleados públicos. Un portal de conocimiento sería interesante para alimentar documentación, experiencias, FAQs, etc.&lt;br /&gt;&lt;br /&gt;- Dotación de ordenadores básicos necesarios para las distintas Administraciones. Este sería un esfuerzo económico muy importante, pero si no se invierte en este sentido, muchas Administraciones no lo adoptarían.&lt;br /&gt;&lt;br /&gt;- Conseguir acuerdos con entidades de las cuales dependen servicios externos, tales como pasarelas de pago, firma electrónica, sellado de tiempo, etc., para conseguir descuentos y subvenciones en los costes.&lt;br /&gt;&lt;br /&gt;- Enfocado a uso en diferentes plataformas, no únicamente en Windows. El uso de herramientas Office para el ciudadano o para el empleado público, debería comprender Microsoft Office, LibreOffice, OpenOffice, AbiWord, etc.&lt;br /&gt;&lt;br /&gt;- Enfocado a diferentes navegadores: Internet Explorer, Firefox, Chrome, Safari, Opera, etc.&lt;br /&gt;&lt;br /&gt;- Uso de interfaces ricas de usuario estándar, sin necesidad de plugins. La tecnología Flash puede ser muy buena, pero no es una tecnología nativa del navegador, y no todos los navegadores cuentan con un plugin de Flash.&lt;br /&gt;&lt;br /&gt;- Interfaces pensadas para la accesibilidad de personas con minusvalías.&lt;br /&gt;&lt;br /&gt;- Buscar siempre la forma más sencilla, corta e interactiva posible en la experiencia de usuario, tanto para el ciudadano como para el empleado público.&lt;br /&gt;&lt;br /&gt;- Dirigido (las funcionalidades que se puedan de forma eficiente), a todos los canales tecnológicos posibles: ordenadores, tablets, teléfonos móviles 2G y 3G, TDT, Call Center, eTV, etc.&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-3190780683115467632?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/3190780683115467632/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=3190780683115467632&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/3190780683115467632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/3190780683115467632'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/12/la-necesidad-de-la-administracion.html' title='La necesidad de la Administración Electrónica y la transparencia administrativa'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-1108851531472111825</id><published>2010-12-15T12:19:00.002+01:00</published><updated>2010-12-15T12:19:39.476+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Frases'/><title type='text'>La frase</title><content type='html'>La computación en nube es peor que la estupidez, ya que es una pérdida del control de los datos.&lt;br /&gt;&lt;b&gt;Richard Stallman&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-1108851531472111825?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/1108851531472111825/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=1108851531472111825&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/1108851531472111825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/1108851531472111825'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/12/la-frase_15.html' title='La frase'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-926535499346743220</id><published>2010-12-01T08:39:00.001+01:00</published><updated>2010-12-01T08:39:11.751+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Frases'/><title type='text'>La frase</title><content type='html'>&lt;span style="color: blue;"&gt;El crecimiento necesita alimento.&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color: blue;"&gt;Peter Drucker&lt;/span&gt;&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-926535499346743220?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/926535499346743220/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=926535499346743220&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/926535499346743220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/926535499346743220'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/12/la-frase_930.html' title='La frase'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-9055612915205691495</id><published>2010-12-01T08:37:00.000+01:00</published><updated>2010-12-01T08:37:28.616+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Frases'/><title type='text'>La frase</title><content type='html'>Los negocios (o lo servicios) no ganan por reformar a sus clientes, sino por satisfacerlos.&lt;br /&gt;&lt;b&gt;Peter Drucker&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-9055612915205691495?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/9055612915205691495/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=9055612915205691495&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/9055612915205691495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/9055612915205691495'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/12/la-frase_4106.html' title='La frase'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-5577527822471863295</id><published>2010-12-01T08:36:00.000+01:00</published><updated>2010-12-01T08:36:26.964+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Frases'/><title type='text'>La frase</title><content type='html'>Hay que tener presente que un producto o servicio queda definido por el consumidor y no por el productor.&lt;br /&gt;&lt;b&gt;Peter Drucker&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-5577527822471863295?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/5577527822471863295/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=5577527822471863295&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/5577527822471863295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/5577527822471863295'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/12/la-frase_01.html' title='La frase'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-6118388695266744990</id><published>2010-12-01T08:35:00.001+01:00</published><updated>2010-12-01T08:35:11.979+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Frases'/><title type='text'>La frase</title><content type='html'>Uno innova en el campo que entiende.&lt;br /&gt;&lt;b&gt;Peter Drucker&lt;/b&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-6118388695266744990?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/6118388695266744990/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=6118388695266744990&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6118388695266744990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6118388695266744990'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/12/la-frase.html' title='La frase'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-6119155645652568376</id><published>2010-11-30T09:51:00.000+01:00</published><updated>2010-11-30T09:51:39.528+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Coaching'/><title type='text'>De huevos, gallinas y propietarios con miopía</title><content type='html'>Me gustaría compartir con vosotros, una parábola muy bien redactada y enfocada por &lt;b&gt;Michel Henric-Coll&lt;/b&gt;, creador de &lt;b&gt;Fractal Teams&lt;/b&gt;.&amp;nbsp; (Fuente: &lt;a href="http://blog.fractalteams.com/?p=299"&gt;http://blog.fractalteams.com/?p=299&lt;/a&gt;)&amp;nbsp; ¿A alguno le resulta familiar?&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://blog.fractalteams.com/wp-content/uploads/huevo.jpg"&gt;&lt;img alt="huevo" class="aligncenter size-full wp-image-300" height="329" src="http://blog.fractalteams.com/wp-content/uploads/huevo.jpg" title="huevo" width="500" /&gt;&lt;/a&gt;&lt;/div&gt;Érase una vez una granja que poseía 50 gallinas. Eran gallinas  ponedoras que ponían una media regular de cuatro huevos al día, lo que  permitiera que el feliz granjero vendiera en el mercado a diario 200  huevos.&lt;br /&gt;Pero el propietario de la granja quería sacar más beneficios, así que  emprendió una cruzada contra el encargado para que consiguiera mayor  productividad de las gallinas.&lt;br /&gt;&lt;br /&gt;Eran una gallinas bastante felices. Hasta escuchaban música por los  altavoces repartidos en la granja. Pero debido a la presión que el  propietario aplicaba al granjero para rebajar costes, este vendió el  equipo de música y canceló la suscripción a Spotify. Ansioso, en lugar  de visitar a las gallinas una vez al día, empezó a visitarlas cada dos  horas y a recoger el huevo que habían puesto ya. Pero todo este  movimiento perturbaba a las gallinas y como consecuencia del estrés,  bajaron su producción en un 25%.&lt;br /&gt;&lt;br /&gt;Fueron sólo 150 huevos los que pudieron venderse en el mercado. El  propietario se puso furioso exigiendo mayor rendimiento con amenazas de  despido. Entonces el granjero apretujado cogió una gallina, la mató y la  puso en venta en el mercado junto a los 150 huevos del día. Como una  gallina valía como 50 huevos, el propietario estuvo relativamente  satisfecho con los ingresos. Una gallina menos representaba un ahorro en  comida para animales y esto era muy bueno. Sin embargo, al día  siguiente, sólo habían 146 huevos. Preocupado, el granjero mató a otra  gallina y así sucesivamente durante 10 días. Al cabo de este plazo, le  quedaban 40 gallinas que pusieron 120 huevos. Había conseguir mantener  ingresos cercanos al precio de venta de una producción de 200 huevos  matando gallinas.&lt;br /&gt;&lt;br /&gt;¡Qué demonios! El propietario exigía su rendimiento, así que recortó  el presupuesto para granos, mató a otra gallina y fue a venderla junto  con los 120 huevos del día. Pero los ingresos totales correspondían a  una producción de 170 huevos, nada más. El día siguiente era un martes,  las 39 gallinas sólo habían puesto 117 así que aumentó la presión sobre  ella, molestándolas cada hora y causando aún más estrés.&lt;br /&gt;&lt;br /&gt;El viernes tuvo que matar a dos gallinas. Recogió 100 huevos que las  supervivientes habían puesto, bajando el promedio habitual. Con todo,  ingresó el equivalente a 200 €, como en los buenos tiempos.&lt;br /&gt;Al finalizar del mes, le quedaba una sola gallina que puso dos  huevos. Se hizo una tortilla que degustó con un vaso de tinto y un  mendrugo de pan, preparó el petate y se fue por los caminos sin mirar  atrás.&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-6119155645652568376?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/6119155645652568376/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=6119155645652568376&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6119155645652568376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6119155645652568376'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/de-huevos-gallinas-y-propietarios-con.html' title='De huevos, gallinas y propietarios con miopía'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-5531234278730990640</id><published>2010-11-29T09:14:00.002+01:00</published><updated>2010-11-29T09:14:57.377+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><title type='text'>MondonGO: Herramienta ODM para MongoDB y PHP</title><content type='html'>Las virtudes de &lt;b&gt;MongoDB&lt;/b&gt; como base de datos son cada vez más apreciadas por las empresas, ofreciendo servicios Web, Web 2.0 y cloud computing, además de productos basados en las mismas tecnologías o en tecnologías tradicionales. Por otra parte, aparecen herramientas que facilitan la administración de &lt;b&gt;MongoDB&lt;/b&gt;, backups, el desarrollo de aplicaciones con &lt;b&gt;MongoDB&lt;/b&gt;, etc. En esta ocasión me place presentar una herramienta creada en España, llamada &lt;b&gt;MondonGO&lt;/b&gt;, y que seguro será muy apreciada por los desarrolladores de &lt;b&gt;PHP&lt;/b&gt;.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__eBZmMMBCSI/TNFP137v0tI/AAAAAAAAABY/0sC0fB89OI8/s1600/Mondongo.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 255px; height: 68px;" src="http://2.bp.blogspot.com/__eBZmMMBCSI/TNFP137v0tI/AAAAAAAAABY/0sC0fB89OI8/s320/Mondongo.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5535293203981259474" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;MondonGO&lt;/b&gt; es un &lt;b&gt;ODM&lt;/b&gt; (&lt;i&gt;Object Data Mapper&lt;/i&gt;, o un &lt;i&gt;Mapeador de Objetos de Datos&lt;/i&gt;), lo que permite mapear la estructura de los documentos de &lt;b&gt;MongoDB&lt;/b&gt; automáticamente a objetos en &lt;b&gt;PHP&lt;/b&gt;, simplificando enormemente los desarrollos, ya que el acceso, la seguridad y las tareas del mapeo son realizadas automáticamente, optimizando la sencillez y la productividad a la hora de desarrollar aplicaciones &lt;b&gt;PHP&lt;/b&gt; usando &lt;b&gt;MongoDB&lt;/b&gt;&lt;br /&gt;&lt;div style="width:425px" id="__ss_5616421"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/pablodip/mondongo" title="Mondongo, un ODM para PHP y MongoDB"&gt;Mondongo, un ODM para PHP y MongoDB&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse5616421" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mondongo-101030083533-phpapp01&amp;stripped_title=mondongo&amp;userName=pablodip" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse5616421" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mondongo-101030083533-phpapp01&amp;stripped_title=mondongo&amp;userName=pablodip" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/pablodip"&gt;pablodip&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;MondonGO&lt;/b&gt; es un desarrollo de código abierto, que se puede descargar libremente desde GitHub.&lt;br /&gt;&lt;b&gt;Enlace a MondonGO&lt;/b&gt;: &lt;a href="http://mondongo.es"&gt;http://mondongo.es&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-5531234278730990640?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/5531234278730990640/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=5531234278730990640&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/5531234278730990640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/5531234278730990640'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/mondongo-herramienta-odm-para-mongodb-y.html' title='MondonGO: Herramienta ODM para MongoDB y PHP'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/__eBZmMMBCSI/TNFP137v0tI/AAAAAAAAABY/0sC0fB89OI8/s72-c/Mondongo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-1028492481189584057</id><published>2010-11-29T09:13:00.005+01:00</published><updated>2010-11-29T09:13:54.930+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><title type='text'>MongoDB: Cómo trabaja una consulta en un entorno fragmentado</title><content type='html'>Un servidor pequeño. Queremos más capacidad. ¿Qué hacer? Tradicionalmente, podríamos escalar verticalmente con una caja más grande.&lt;br /&gt;&lt;br /&gt;Con la fragmentación, en su lugar, escalamos horizontalmente para conseguir la misma huella computacional/almacenamiento/memoria desde servidores pequeños.&lt;br /&gt;&lt;br /&gt;He aquí la comparación gráfica de escalabilidad vertical y horizontal:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_T-uXeKcGTnM/TMhlkNDDOTI/AAAAAAAABfA/ldey-aUwG6U/s1600/Escalabilidad.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="288" src="http://2.bp.blogspot.com/_T-uXeKcGTnM/TMhlkNDDOTI/AAAAAAAABfA/ldey-aUwG6U/s400/Escalabilidad.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Una colección fragmentada de MongoDB tiene una clave de fragmento. La colección es particionada en un orden preservando esta clave. En este ejemplo &lt;b&gt;a&lt;/b&gt; es nuestra clave de fragmento:&lt;br /&gt;&lt;br /&gt;{&lt;u&gt;a&lt;/u&gt;:..., b:..., c:... }  &lt;i&gt;a es declarado clave de fragmento para la colección&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Los metadatos son mantenidos en trozos, los cuales están representados por rangos de claves de fragmentos. Cada trozo es asignado a un fragmento en particular.&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;Rango&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Fragmento&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;a en [∞, 2000]&lt;/td&gt;&lt;td align="right"&gt;2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;a en [2000, 2100]&lt;/td&gt;&lt;td align="right"&gt;8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;a en [2100, 2500]&lt;/td&gt;&lt;td align="right"&gt;3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;...&lt;/td&gt;&lt;td align="right"&gt;...&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;a en [88700, ∞]&lt;/td&gt;&lt;td align="right"&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Cuando un trozo se hace demasiado grande, &lt;b&gt;MongoDB&lt;/b&gt; automáticamente lo divide, y el balanceador más tarde migrará los trozos cuando sea necesario.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;find({a:{$gt:333,$lt:400})&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;El proceso &lt;code&gt;mongos&lt;/code&gt; enruta una consulta a los fragmentos adecuados. Para la consulta anterior, todos los datos posiblemente relevantes están en el fragmento 2, así que la consulta es enviada solamente a aquel nodo, y allí procesada.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_T-uXeKcGTnM/TMhu8HvJvOI/AAAAAAAABfE/SH1yeT7i__c/s1600/shard1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="242" src="http://2.bp.blogspot.com/_T-uXeKcGTnM/TMhu8HvJvOI/AAAAAAAABfE/SH1yeT7i__c/s400/shard1.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;A veces, un rango de consulta puede abarcar más de un fragmento, pero muy pocos en total. Esto es razonablemente eficiente.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_T-uXeKcGTnM/TMhvw9gBn0I/AAAAAAAABfI/F25CmiOzLow/s1600/shard2.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="242" src="http://3.bp.blogspot.com/_T-uXeKcGTnM/TMhvw9gBn0I/AAAAAAAABfI/F25CmiOzLow/s400/shard2.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Las consultas que no involucran las claves de fragmentos serán enviadas a todos los fragmentos como una operación "esparcir/reunir". Esto a veces es correcto. Aquí, tanto en nuestra máquina tradicional como en los fragmentos, haremos una exploracion de tabla igualmente (aproximadamente) costosa en ambas.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_T-uXeKcGTnM/TMhxIQqILAI/AAAAAAAABfM/tafjt5bk2BI/s1600/shard3.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/_T-uXeKcGTnM/TMhxIQqILAI/AAAAAAAABfM/tafjt5bk2BI/s400/shard3.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;De nuevo, una consulta con una clave de fragmento resulta en una operación esparcir/reunir. Sin embargo, en cada fragmento, podemos usar el índice &lt;code&gt;{b:1}&lt;/code&gt; para hacer la operación eficiente para dicho fragmento. Tenemos un coste elevado sobre la configuración vertical para el esfuerzo de las comunicaciones desde los procesos &lt;code&gt;mongos&lt;/code&gt; para cada fragmento - no demasiado si el número de fragmentos es pequeño (10), pero digamos que muy sustancial en un sistema de 1000 fragmentos.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_T-uXeKcGTnM/TMhzBEwPwdI/AAAAAAAABfQ/qgdG8phJPXs/s1600/shard3.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/_T-uXeKcGTnM/TMhzBEwPwdI/AAAAAAAABfQ/qgdG8phJPXs/s400/shard3.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;El término &lt;b&gt;a&lt;/b&gt; involucra la clave de fragmento y permite a los procesos &lt;code&gt;mongos&lt;/code&gt; enrutar inteligentemente la consulta al fragmento 2. Una vez que la consulta alcanza el fragmento 2, el índice &lt;code&gt;{b:1}&lt;/code&gt; puede ser usada para procesar eficientemente la consulta.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_T-uXeKcGTnM/TMhz288zDkI/AAAAAAAABfU/15Oo6K3yIDA/s1600/shard5.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="243" src="http://4.bp.blogspot.com/_T-uXeKcGTnM/TMhz288zDkI/AAAAAAAABfU/15Oo6K3yIDA/s400/shard5.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Cuando se especifica una ordenación, los fragmentos relevantes ordenan localmente, y los procesos &lt;code&gt;mongos&lt;/code&gt; funde los resultados. Así, el uso de recursos de los procesos &lt;code&gt;mongos&lt;/code&gt; no es terriblemente alto.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_T-uXeKcGTnM/TMh0kNRaohI/AAAAAAAABfY/MzpVmVQS1Po/s1600/shard6.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="287" src="http://4.bp.blogspot.com/_T-uXeKcGTnM/TMh0kNRaohI/AAAAAAAABfY/MzpVmVQS1Po/s400/shard6.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Cuando se usa la replicación (típicamente un conjunto de réplica), simplemente tenemos más de un nodo por fragmento.&lt;br /&gt;&lt;br /&gt;Abajo, las flechas indican replicación en entornos tradicionales contra fragmentados.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_T-uXeKcGTnM/TMh1QXp7YbI/AAAAAAAABfc/FgCJW08cc-k/s1600/shard7.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="262" src="http://3.bp.blogspot.com/_T-uXeKcGTnM/TMh1QXp7YbI/AAAAAAAABfc/FgCJW08cc-k/s400/shard7.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Fuente original:&lt;/b&gt; &lt;a href="http://www.mongodb.org/download/attachments/2097354/how+queries+work+with+sharding.pdf"&gt;http://www.mongodb.org/download/attachments/2097354/how+queries+work+with+sharding.pdf&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-1028492481189584057?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/1028492481189584057/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=1028492481189584057&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/1028492481189584057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/1028492481189584057'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/mongodb-como-trabaja-una-consulta-en-un.html' title='MongoDB: Cómo trabaja una consulta en un entorno fragmentado'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_T-uXeKcGTnM/TMhlkNDDOTI/AAAAAAAABfA/ldey-aUwG6U/s72-c/Escalabilidad.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-6720757084810181347</id><published>2010-11-29T09:13:00.001+01:00</published><updated>2010-11-29T09:13:07.604+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Primeros pasos con Python y MongoDB</title><content type='html'>Una de las mejores características de &lt;b&gt;MongoDB&lt;/b&gt; es la multitud de drivers existentes para casi cualquier lenguaje de programación (ver &lt;a href=http://www.mongodb.org/display/DOCS/Drivers"&gt;Sección Drivers&lt;/a&gt;). Para los que amamos &lt;b&gt;Python&lt;/b&gt;, tenemos un driver llamado &lt;b&gt;pymongo&lt;/b&gt;, y que está soportado por &lt;a href="http://www.10gen.com"&gt;10gen&lt;/a&gt;, la empresa creadora de &lt;b&gt;MongoDB&lt;/b&gt;. El site oficial de este driver lo encontramos en: &lt;a href="http://api.mongodb.org/python/1.8.1%2B/index.html"&gt;http://api.mongodb.org/python/1.8.1%2B/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Utilizar &lt;b&gt;Python&lt;/b&gt; junto a &lt;b&gt;MongoDB&lt;/b&gt; es muy sencillo, pues su sintaxis es muy similar a la de la consola &lt;code&gt;mongo&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Instalación&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;La instalación de &lt;i&gt;pymongo&lt;/i&gt; es sencilla. En Linux, procederemos a ejecutar el siguiente comando:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ easy_install pymongo&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;O bien, descargamos el código fuente y lo instalamos desde la consola de &lt;i&gt;Python&lt;/i&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ git clone git://github.com/mongodb/mongo-python-driver.git pymongo&lt;br /&gt;$ cd pymongo/&lt;br /&gt;$ python setup.py install&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Abrir conexión&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;La conexión se realiza de la siguiente manera:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; from pymongo import Connection&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; conn = Connection()  # Conexion local por defecto&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; conn = Connection('miServidor', 30500)  # Conexion remota a puerto 30500&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Usar base de datos&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;Para obtener un objeto que referencia a la base de datos:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; db = conn.miBBDD # metodo 1&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; db = conn['miBBDD'] # metodo 2&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Usar una colección&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;Para obtener la colección con la que trabajar:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; coll = db.miColeccion # metodo 1&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; coll = db['miColeccion'] # metodo 2&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Documentos&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;Los documentos se mapean en &lt;i&gt;Python&lt;/i&gt; como un diccionario:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; noticia = {"autor": "Rafael Hernamperez",&lt;br /&gt;...&amp;nbsp;&amp;nbsp;&amp;nbsp;"cuerpo": "Python y MongoDB",&lt;br /&gt;...&amp;nbsp;&amp;nbsp;&amp;nbsp;"etiquetas": ["Tutorial","Python","MongoDB"]}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Algunos tipos de datos especiales requieren de alguna librería específica, como &lt;code&gt;datetime&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; import datetime&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; noticia = {"autor": "Rafael Hernamperez",&lt;br /&gt;...&amp;nbsp;&amp;nbsp;&amp;nbsp;"cuerpo": "Python y MongoDB",&lt;br /&gt;...&amp;nbsp;&amp;nbsp;&amp;nbsp;"etiquetas": ["Tutorial","Python","MongoDB"],&lt;br /&gt;...&amp;nbsp;&amp;nbsp;&amp;nbsp;"fecha": datetime.datetime.utcnow()}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Insertar documentos&lt;/b&gt;&lt;br /&gt;Para insertar un documento:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; coll = db.noticias   # Coleccion "noticias"&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; coll.insert(noticia)&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Recuperar un documento&lt;/b&gt;&lt;br /&gt;Para recuperar un único documento simple (el primero):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; coll.find_one({"autor": "Rafael Hernamperez"})&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Recuperar varios documentos&lt;/b&gt;&lt;br /&gt;Para recuperar todos los documentos de una colección:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; for noticia in coll.find():&lt;br /&gt;...&amp;nbsp;&amp;nbsp;&amp;nbsp; print noticia&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Para recuperar todos los documentos (noticias, en este caso) de un autor concreto:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; for noticia in coll.find({"autor": "Rafael Hernamperez"})&lt;br /&gt;...&amp;nbsp;&amp;nbsp;&amp;nbsp; print noticia&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Contar documentos&lt;/b&gt;&lt;br /&gt;Para contar todos los documentos de una colección:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; coll.count()&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Para contar todos los documentos de un autor concreto:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; coll.find({"autor": "Rafael Hernamperez"}).count()&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Consultas de rango&lt;/b&gt;&lt;br /&gt;Recupera un determinado rango de documentos, delimitados por condiciones. En este caso, recupera aquellas noticias anteriores a una determinada fecha. El resultado se ordenará por autor:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; fecha = datetime.datetime(2010, 9, 28, 0, 0) # 2010/09/38 00:00h&lt;br /&gt;... for noticia in coll.find({"fecha": {"$lt":fecha}}).sort(autor):&lt;br /&gt;...&amp;nbsp;&amp;nbsp;&amp;nbsp; print noticia&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Indexación&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;Para indexar la colección "noticias", por fecha (de la más reciente a la más antigua) y por autor (en orden alfabético):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; from pymongo import ASCENDING, DESCENDING&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; coll.create_index([("fecha", DESCENDING), ("autor", ASCENDING)])&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-6720757084810181347?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/6720757084810181347/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=6720757084810181347&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6720757084810181347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6720757084810181347'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/primeros-pasos-con-python-y-mongodb.html' title='Primeros pasos con Python y MongoDB'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-1874736102814109576</id><published>2010-11-29T09:12:00.000+01:00</published><updated>2010-11-29T09:12:06.580+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><title type='text'>MongoDB: Indexación</title><content type='html'>En &lt;b&gt;MongoDB&lt;/b&gt;, la indexación permite optimizar el rendimiento de las consultas, de forma muy similar a la de una base de datos relacional. Los índices se aplican a claves (campos) de nuestros documentos, ordenando sus valores para que la búsqueda sea más eficiente, y manteniendo dicha ordenación de forma constante. Tiene mucho sentido si las consultas sobre la clave es muy frecuente, especialmente si sobre la búsqueda se aplican filtros (mayor que, menor que, etc.), o si la consulta es lenta. También tiene sentido si en las consultas se muestra en un orden determinado.&lt;br /&gt;&lt;br /&gt;A pesar de las ventajas del uso de índices, hay que tener en cuenta que los índices toman espacio y ralentizan las escrituras.&lt;br /&gt;&lt;br /&gt;El siguiente ejemplo, muestra cómo ordenar una colección por la clave &lt;code&gt;nombre&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;db.articulos.ensureIndex({"nombre":1})&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;El valor &lt;code&gt;&lt;b&gt;1&lt;/b&gt;&lt;/code&gt; indica que la ordenación será en orden ascendente (de menor a mayor valor, o alfabéticamente, de la A a la Z). Para indicar que el orden sea descendente, se indicaría el valor &lt;code&gt;&lt;b&gt;-1&lt;/b&gt;&lt;/code&gt;. El siguiente ejemplo crea un índice compuesto, ordenando por &lt;code&gt;nombre&lt;/code&gt; y por &lt;code&gt;&lt;/code&gt;, en orden descendente (de más reciente a más antiguo):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;db.articulos.ensureIndex({"nombre":1, "fecha":-1})&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Si la clave del índice corresponde a un documento embebido, se ha de indicar la ruta del mismo:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;db.articulos.ensureIndex({"comentarios.autor":1})&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Los índices únicos indican que los valores de la clave no pueden repetirse:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;db.articulos.ensureIndex({"titulo":1}, {unique:true})&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Los índices toman un tiempo para realizar su cometido. Si la colección posee muchos datos, este tiempo ralentizaría el resto de operaciones de la base de datos. Para evitar este tiempo de demora, se puede indicar que el índice se realice en &lt;i&gt;background&lt;/i&gt; o como operación en segundo plano:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;db.articulos.ensureIndex({"nombre":1, "fecha":-1}, {background: true})&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Si se desea conocer los índices que posee una colección determinada:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;db.articulos.getIndexes()&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Para eliminar un índice de una colección:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;db.articulos.dropIndex({"nombre":1})&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Más información:&lt;/b&gt; Os recomiendo ver la presentación de &lt;i&gt;Mike Dirolf&lt;/i&gt;, de la cual se ha extraído gran parte de la información mostrada aquí: &lt;br /&gt;&lt;div style="width:425px" id="__ss_5251895"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/mdirolf/indexing" title="Indexing"&gt;Indexing&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse5251895" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=indexing-100921142822-phpapp02&amp;stripped_title=indexing&amp;userName=mdirolf" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse5251895" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=indexing-100921142822-phpapp02&amp;stripped_title=indexing&amp;userName=mdirolf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/mdirolf"&gt;Mike Dirolf&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-1874736102814109576?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/1874736102814109576/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=1874736102814109576&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/1874736102814109576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/1874736102814109576'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/mongodb-indexacion.html' title='MongoDB: Indexación'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-6213208220403494785</id><published>2010-11-29T09:11:00.001+01:00</published><updated>2010-11-29T09:11:20.876+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><title type='text'>MongoDB: Traducir SQL a MapReduce</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_T-uXeKcGTnM/TIdoKBGwk9I/AAAAAAAABcs/CLW3_cRlN78/s1600/tumblr_kxovt0VLZy1qappj8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="315" src="http://2.bp.blogspot.com/_T-uXeKcGTnM/TIdoKBGwk9I/AAAAAAAABcs/CLW3_cRlN78/s400/tumblr_kxovt0VLZy1qappj8.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Fuente: &lt;a href="http://nosql.mypopescu.com/post/392418792/translate-sql-to-mongodb-mapreduce"&gt;http://nosql.mypopescu.com/post/392418792/translate-sql-to-mongodb-mapreduce&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-6213208220403494785?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/6213208220403494785/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=6213208220403494785&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6213208220403494785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6213208220403494785'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/mongodb-traducir-sql-mapreduce.html' title='MongoDB: Traducir SQL a MapReduce'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_T-uXeKcGTnM/TIdoKBGwk9I/AAAAAAAABcs/CLW3_cRlN78/s72-c/tumblr_kxovt0VLZy1qappj8.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-1952241916613607317</id><published>2010-11-29T09:10:00.002+01:00</published><updated>2010-11-29T09:10:29.720+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>MongoDB: Python y MapReduce</title><content type='html'>El presente post está inspirado en el artículo &lt;a href="http://aimotion.blogspot.com/2010/08/mapreduce-with-mongodb-and-python.html"&gt;"MapReduce with MongoDB and Python"&lt;/a&gt;, de &lt;b&gt;Marcel Caraciolo&lt;/b&gt;, y en el cual veremos cómo implementar la función &lt;b&gt;Map-Reduce&lt;/b&gt; mediante &lt;b&gt;Python&lt;/b&gt; y &lt;b&gt;MongoDB&lt;/b&gt;, donde podremos apreciar su potencial en grandes conjuntos de datos en computación distribuída. &lt;br /&gt;&lt;br /&gt;Como ejemplo sencillo e ilustrativo, contaremos la frecuencia de palabras a través de varios documentos. En primer lugar, veremos cómo funciona &lt;b&gt;map-reduce&lt;/b&gt;,utilizando una lista de sentencias simples. Para ello, tenemos el siguiente diagrama, en donde las palabras son divididas y agrupadas por la función &lt;b&gt;map&lt;/b&gt;, y después reducidas independientemente (agregación) por la función &lt;b&gt;reduce&lt;/b&gt;. Nuestra consulta puede estar distribuída en cuatro ordenadores, por lo que su procesamiento es mucho más rápido en tiempo de ejecución. El ejemplo, además, muestra un árbol balanceado, pero podría estar no balanceado o incluso tener alguna redundancia.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_T-uXeKcGTnM/TIYdmW-j0lI/AAAAAAAABcI/pS6LsJP7r5U/s1600/EjemploMapReduce.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="306" src="http://1.bp.blogspot.com/_T-uXeKcGTnM/TIYdmW-j0lI/AAAAAAAABcI/pS6LsJP7r5U/s400/EjemploMapReduce.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Antes de comenzar a desarrollar las funciones &lt;b&gt;map&lt;/b&gt; y &lt;b&gt;reduce&lt;/b&gt; debes saber que:&lt;br /&gt;1)  El motor &lt;b&gt;MapReduce&lt;/b&gt; puede invocar funciones &lt;b&gt;reduce&lt;/b&gt; de forma iterativa, por lo que éstas deben ser &lt;b&gt;&lt;a href="http://buscon.rae.es/draeI/SrvltConsulta?TIPO_BUS=3&amp;amp;LEMA=idempotente"&gt;idempotentes&lt;/a&gt;&lt;/b&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;for all k,vals : reduce( k, [reduce(k,vals)] ) == reduce(k,vals)&lt;br /&gt;1) Actualmente, el retorno de valores de una función &lt;b&gt;reduce&lt;/b&gt; no puede ser un array (ha de ser un objeto o un número)&lt;br /&gt;3) Si necesitas realizar una operación una única vez, utiliza la funión &lt;b&gt;finalize&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Para implementar el código debes utilizar el framework &lt;b&gt;&lt;a href="http://api.mongodb.org/python/1.8.1%2B/index.html"&gt;Pymongo&lt;/a&gt;&lt;/b&gt;, el cual tiene soporte para &lt;b&gt;Map/Reduce&lt;/b&gt;. Como ejemplo, el discurso de Obama en 2009 tiene muchas palabras repetidas, como puede apreciarse en la siguiente nube de etiquetas, cuyo tamaño de fuente indica la frecuencia de cada palabra:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_T-uXeKcGTnM/TIYgaXfi0yI/AAAAAAAABcQ/ejorTVDNUYg/s1600/ObamaSpeech.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="236" src="http://4.bp.blogspot.com/_T-uXeKcGTnM/TIYgaXfi0yI/AAAAAAAABcQ/ejorTVDNUYg/s400/ObamaSpeech.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;MongoDB&lt;/b&gt; permite a los clientes enviar las implementaciones JavaScript de &lt;b&gt;map&lt;/b&gt; y &lt;b&gt;reduce&lt;/b&gt;, las cuales se evaluarán y ejecutarán en el servidor. La función &lt;b&gt;map&lt;/b&gt; sería la siguiente (&lt;code&gt;wordMap.js)&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;table bgcolor="#ccccff" border="1" cellspacing="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;function wordMap() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;// Buscar palabras en el texto del documento&lt;br /&gt;&amp;nbsp;&amp;nbsp;var palabras = this.text.match(/\w+g);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;if (palabras == null) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;for (var i = 0; i &amp;lt; palabras.length; i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Emitir cada palabra, con contador de uno&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;emit(words[i], {count: 1});&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;b&gt;MongoDB&lt;/b&gt; llamará a la función &lt;b&gt;map&lt;/b&gt; por cada documento en la colección que está consultando, y apuntará al documento donde tendrá acceso una clave como &lt;code&gt;text&lt;/code&gt; mediante &lt;code&gt;this.text&lt;/code&gt;. Esta función no retorna una lista, si no que llama a una función &lt;code&gt;emit&lt;/code&gt; que espera ser definida. Los parámetros de esta función (&lt;code&gt;clave, valor&lt;/code&gt;), serán agrupados con otros resultados intermedios de otras evaluaciones &lt;b&gt;map&lt;/b&gt; que tengan la misma clave (&lt;code&gt;clave, [valor1, valor2]&lt;/code&gt;) y pasada a la función &lt;b&gt;reduce&lt;/b&gt; (&lt;code&gt;wordReduce.js&lt;/code&gt;&lt;br /&gt;&lt;table bgcolor="#ccccff" border="1" cellspacing="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;function wordReduce(key, values) {&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;var total = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;for (var i = 0; i &amp;lt; values.length; i++) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total += values[i].count;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;return {count: total};&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;La función &lt;b&gt;reduce&lt;/b&gt; ha de reducir una lista de un tipo dado a un valor simple del mismo tipo; debe transsitivo para que no tenga problemas sobre cómo están agrupados los elementos mapeados.&lt;br /&gt;&lt;br /&gt;A continuación, el código del cliente &lt;b&gt;Pymongo&lt;/b&gt; que pasa las funciones &lt;b&gt;map/reduce&lt;/b&gt; al servidor:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_T-uXeKcGTnM/TIYoayOnslI/AAAAAAAABcY/Xz4wSq55LVo/s1600/PythonMapReduce.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="398" src="http://3.bp.blogspot.com/_T-uXeKcGTnM/TIYoayOnslI/AAAAAAAABcY/Xz4wSq55LVo/s400/PythonMapReduce.PNG" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-1952241916613607317?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/1952241916613607317/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=1952241916613607317&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/1952241916613607317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/1952241916613607317'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/mongodb-python-y-mapreduce.html' title='MongoDB: Python y MapReduce'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_T-uXeKcGTnM/TIYdmW-j0lI/AAAAAAAABcI/pS6LsJP7r5U/s72-c/EjemploMapReduce.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-8853126739422660721</id><published>2010-11-29T09:08:00.001+01:00</published><updated>2010-11-29T09:08:51.526+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><title type='text'>MongoDB: Un ejemplo de MapReduce</title><content type='html'>&lt;b&gt;&lt;u&gt;Conceptos de MapReduce&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;MapReduce&lt;/b&gt; es una característica importante comprendida por &lt;b&gt;MongoDB&lt;/b&gt;. Este &lt;i&gt;framework&lt;/i&gt; fue creado por &lt;b&gt;Google&lt;/b&gt; para dar solución a la computación paralela sobre grandes colecciones de datos en sistemas distribuídos. El concepto se basa en dos funciones, &lt;b&gt;map&lt;/b&gt; y &lt;b&gt;reduce&lt;/b&gt;, que se aplican sobre datos estructurados en formato de pares &lt;i&gt;clave-valor&lt;/i&gt;. &lt;br /&gt;&lt;br /&gt;La función &lt;i&gt;map&lt;/i&gt; (mapeo) toma uno de estos pares en un dominio de datos, y retorna una lista de pares en un dominio diferente. Se aplica en paralelo por cada elemento de la entrada de datos, produciendo la lista de pares por cada llamada, juntando todos los pares con la misma clave de todas las listas y los agrupa, creando un grupo por cada clave.&lt;br /&gt;&lt;br /&gt;La función &lt;i&gt;reduce&lt;/i&gt; (reducción) se aplica paralelamente a cada grupo, generando una colección de valores para cada dominio, produciendo un valor (o varios) en cada llamada.&lt;br /&gt;&lt;br /&gt;Básicamente, &lt;i&gt;MapReduce&lt;/i&gt; transforma una lista de pares &lt;i&gt;clave-valor&lt;/i&gt; en una lista de valores. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Un ejemplo&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;Para comprender cómo funciona &lt;i&gt;MapReduce&lt;/i&gt;, vamos a ver un ejemplo práctico. Para ello, voy a utilizar uno ya hecho por &lt;b&gt;Kristina Chodorow&lt;/b&gt;, una de las principales creadoras de &lt;b&gt;MongoDB&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Imaginemos que tenemos una colección &lt;code&gt;posts&lt;/code&gt;, que almacena los artículos de nuestro blog. Un documento en esta colección podría tener esta estructura:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_T-uXeKcGTnM/TIAMcVunETI/AAAAAAAABbQ/ffECiM1yQSA/s1600/mapreduce1.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="123" src="http://3.bp.blogspot.com/_T-uXeKcGTnM/TIAMcVunETI/AAAAAAAABbQ/ffECiM1yQSA/s640/mapreduce1.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;La clave &lt;code&gt;tags&lt;/code&gt; es un &lt;i&gt;array&lt;/i&gt; de etiquetas, que permiten categorizar cada artículo. Y sobre esta clave vamos a basar el ejemplo de &lt;i&gt;MapReduce&lt;/i&gt;, como por ejemplo, conocer las etiquetas más populares, dando un resultado como éste:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_T-uXeKcGTnM/TIAN1FpCLVI/AAAAAAAABbY/y63iOPtnyRU/s1600/mapreduce2.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="82" src="http://1.bp.blogspot.com/_T-uXeKcGTnM/TIAN1FpCLVI/AAAAAAAABbY/y63iOPtnyRU/s640/mapreduce2.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;La función &lt;code&gt;map&lt;/code&gt; emitirá cada etiqueta (&lt;i&gt;tag&lt;/i&gt;), y la contará en la función &lt;code&gt;reduce&lt;/code&gt;. &lt;br /&gt;&lt;br /&gt;La función &lt;code&gt;map&lt;/code&gt; es la siguiente:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_T-uXeKcGTnM/TIAPM2BWsJI/AAAAAAAABbg/lJWezRdjMlg/s1600/mapreduce3.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="184" src="http://4.bp.blogspot.com/_T-uXeKcGTnM/TIAPM2BWsJI/AAAAAAAABbg/lJWezRdjMlg/s640/mapreduce3.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;Lo primero que hace es comprobar si existe una clave llamada &lt;code&gt;tags&lt;/code&gt;, para evitar errores. A continuación realiza un bucle sobre esta clave (por cada elemento del array), emitiendo su nombre y un contador de 1.&lt;br /&gt;&lt;br /&gt;La función &lt;code&gt;reduce&lt;/code&gt; inicializa un contador a 0 y le añade cada elemento del array &lt;code&gt;current&lt;/code&gt;. Al final retorna el contador final:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_T-uXeKcGTnM/TIAQ8NQPUHI/AAAAAAAABbo/y9VsEx99PT8/s1600/mapreduce4.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="182" src="http://2.bp.blogspot.com/_T-uXeKcGTnM/TIAQ8NQPUHI/AAAAAAAABbo/y9VsEx99PT8/s640/mapreduce4.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;Para ejecutar ésto, invocaremos al comando &lt;code&gt;mapreduce&lt;/code&gt;:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_T-uXeKcGTnM/TIARqpRSViI/AAAAAAAABbw/eHcAERLSERY/s1600/mapreduce5.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="100" src="http://3.bp.blogspot.com/_T-uXeKcGTnM/TIARqpRSViI/AAAAAAAABbw/eHcAERLSERY/s640/mapreduce5.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;Los parámetros facilitados son:&lt;br /&gt;- &lt;code&gt;mapreduce&lt;/code&gt;: Se facilita la colección sobre la que extraer los datos (&lt;code&gt;posts&lt;/code&gt;).&lt;br /&gt;- &lt;code&gt;map&lt;/code&gt;: Nombre de la función que realizará el mapeo.&lt;br /&gt;- &lt;code&gt;reduce&lt;/code&gt;: Nombre de la función que realizará la reducción.&lt;br /&gt;- &lt;code&gt;out&lt;/code&gt;: Colección donde se pondrá el resultado.&lt;br /&gt;&lt;br /&gt;Finalmente, consultamos la colección &lt;code&gt;tags&lt;/code&gt; para mostrar los resultados:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_T-uXeKcGTnM/TIASiFnkxGI/AAAAAAAABb4/x3U1ygJu5wk/s1600/mapreduce6.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="100" src="http://3.bp.blogspot.com/_T-uXeKcGTnM/TIASiFnkxGI/AAAAAAAABb4/x3U1ygJu5wk/s640/mapreduce6.PNG" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Fuentes consultadas&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Concepto de MapReduce en Wikipedia:&lt;/b&gt; &lt;a href="http://es.wikipedia.org/wiki/MapReduce"&gt;http://es.wikipedia.org/wiki/MapReduce&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Artículo &lt;i&gt;"Contar etiquetas"&lt;/i&gt;, por Kristina Chodorow&lt;/b&gt;: &lt;a href="http://cookbook.mongodb.org/patterns/count_tags/"&gt;http://cookbook.mongodb.org/patterns/count_tags/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-8853126739422660721?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/8853126739422660721/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=8853126739422660721&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/8853126739422660721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/8853126739422660721'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/mongodb-un-ejemplo-de-mapreduce.html' title='MongoDB: Un ejemplo de MapReduce'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_T-uXeKcGTnM/TIAMcVunETI/AAAAAAAABbQ/ffECiM1yQSA/s72-c/mapreduce1.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-9083624996265283124</id><published>2010-11-29T08:23:00.001+01:00</published><updated>2010-11-29T08:23:18.660+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><category scheme='http://www.blogger.com/atom/ns#' term='NoSQL'/><title type='text'>Comparativa MongoDB con otras Bases de datos NoSQL</title><content type='html'>He encontrado en &lt;a href="http://nosql.mypopescu.com"&gt;myNoSQL&lt;/a&gt; algunas tablas comparativas de &lt;b&gt;MongoDB&lt;/b&gt; con respecto a otras bases de datos &lt;i&gt;NoSQL&lt;/i&gt;, creadas por &lt;b&gt;Alex Popescu&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Bases de datos orientadas a documento&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;La primera tabla compara tres bases de datos orientadas a documento: &lt;b&gt;MongoDB&lt;/b&gt;, &lt;b&gt;CouchDB&lt;/b&gt; y &lt;b&gt;RavenDB&lt;/b&gt; (echo en falta una columna para &lt;b&gt;OrientDB&lt;/b&gt;).&lt;br /&gt;&lt;br /&gt;&lt;table border="1" cellspacing="0" cellpadding="0" width="100%"&gt;&lt;tr align="center" bgcolor="#AAAACC"&gt; &lt;td width="25%"&gt;&amp;nbsp;&lt;/td&gt; &lt;td width="25%"&gt;&lt;b&gt;MongoDB&lt;/b&gt;&lt;/td&gt; &lt;td width="25%"&gt;&lt;b&gt;CouchDB&lt;/b&gt;&lt;/td&gt; &lt;td width="25%"&gt;&lt;b&gt;RavenDB&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr bgcolor="#AAAAAA"&gt;&lt;td colspan="4"&gt;&lt;b&gt;Documentos&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr align="center"&gt;&lt;td&gt;Formato&lt;/td&gt;&lt;td&gt;BSON&lt;/td&gt;&lt;td&gt;JSON&lt;/td&gt;&lt;td&gt;JSON&lt;/td&gt;&lt;/tr&gt;&lt;tr align="center"&gt;&lt;td&gt;Metadata&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Sistema&lt;/td&gt;&lt;td&gt;Sistema + personalizado&lt;/td&gt;&lt;/tr&gt;&lt;tr align="center"&gt;&lt;td&gt;Versionado&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Sí&lt;/td&gt;&lt;td&gt;Plugin incluído&lt;/td&gt;&lt;/tr&gt;&lt;tr align="center"&gt;&lt;td&gt;Adjuntos&lt;/td&gt;&lt;td&gt;GridFS&lt;/td&gt;&lt;td&gt;Sí&lt;/td&gt;&lt;td&gt;Sí&lt;/td&gt;&lt;/tr&gt;&lt;tr align="center"&gt;&lt;td&gt;Map/Reduce&lt;/td&gt;&lt;td&gt;JavaScript + otros&lt;/td&gt;&lt;td&gt;JavaScript&lt;/td&gt;&lt;td&gt;LINQ&lt;/td&gt;&lt;/tr&gt;&lt;tr align="center"&gt;&lt;td&gt;Carga masiva&lt;/td&gt;&lt;td&gt;mongoimport&lt;/td&gt;&lt;td&gt;Sí&lt;/td&gt;&lt;td&gt;Sí&lt;/td&gt;&lt;/tr&gt;&lt;tr align="center"&gt;&lt;td&gt;Consulta Adhoc&lt;/td&gt;&lt;td&gt;Sí&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr bgcolor="#AAAAAA"&gt;&lt;td colspan="4"&gt;&lt;b&gt;Almacenamiento&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr align="center"&gt;&lt;td&gt;Fragmentación&lt;/td&gt;&lt;td&gt;Sí&lt;/td&gt;&lt;td&gt;Sí&lt;/td&gt;&lt;td&gt;Sí&lt;/td&gt;&lt;/tr&gt;&lt;tr align="center"&gt;&lt;td&gt;Durabilidad&lt;/td&gt;&lt;td&gt;Servidor simple v1.8&lt;/td&gt;&lt;td&gt;Diseño "crash-only"&lt;/td&gt;&lt;td&gt;Escritura previa trazabilidad y aislamiento de instantáneas para garantizar recuperación vía ESE&lt;/td&gt;&lt;/tr&gt;&lt;tr align="center"&gt;&lt;td&gt;Transacciones&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Sí&lt;/td&gt;&lt;/tr&gt;&lt;tr align="center"&gt;&lt;td&gt;Concurrencia&lt;/td&gt;&lt;td&gt;Actualización in-place&lt;/td&gt;&lt;td&gt;MVCC (Multi-Version Concurrency Control)&lt;/td&gt;&lt;td&gt;Concurrencia optimista&lt;/td&gt;&lt;/tr&gt;&lt;tr align="center"&gt;&lt;td&gt;Consistencia&lt;/td&gt;&lt;td&gt;Maestro fuerte / Esclavo eventual&lt;/td&gt;&lt;td&gt;Nodo fuerte / Cluster eventual&lt;/td&gt;&lt;td&gt;Eventual&lt;/td&gt;&lt;/tr&gt;&lt;tr align="center"&gt;&lt;td&gt;Replicación&lt;/td&gt;&lt;td&gt;Maestro-Maestro con funciones de resolución personalizadas&lt;/td&gt;&lt;td&gt;Maestro-Esclavo&lt;/td&gt;&lt;td&gt;Plugin incluído&lt;/td&gt;&lt;/tr&gt;&lt;tr bgcolor="#AAAAAA"&gt;&lt;td colspan="4"&gt;&lt;b&gt;Interfaz&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr align="center"&gt;&lt;td&gt;Protocolo&lt;/td&gt;&lt;td&gt;Personalizado sobre TCP/IP&lt;/td&gt;&lt;td&gt;HTTP/REST&lt;/td&gt;&lt;td&gt;HTTP/REST&lt;/td&gt;&lt;/tr&gt;&lt;tr align="center"&gt;&lt;td&gt;.NET API&lt;/td&gt;&lt;td&gt;Proyectos de terceros&lt;/td&gt;&lt;td&gt;Proyectos de terceros&lt;/td&gt;&lt;td&gt;Incluído&lt;/td&gt;&lt;/tr&gt;&lt;tr bgcolor="#AAAAAA"&gt;&lt;td colspan="4"&gt;&lt;b&gt;Otros&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr align="center"&gt;&lt;td&gt;Triggers&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Validación de actualización, Seguridad&lt;/td&gt;&lt;td&gt;Sí&lt;/td&gt;&lt;/tr&gt;&lt;tr align="center"&gt;&lt;td&gt;Seguridad&lt;/td&gt;&lt;td&gt;Básica&lt;/td&gt;&lt;td&gt;Básica&lt;/td&gt;&lt;td&gt;Ninguna&lt;/td&gt;&lt;/tr&gt;&lt;tr align="center"&gt;&lt;td&gt;Escrito en&lt;/td&gt;&lt;td&gt;C++&lt;/td&gt;&lt;td&gt;Erlang&lt;/td&gt;&lt;td&gt;C#&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Lenguajes de programación&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;La siguiente tabla muestra el uso de lenguajes de programación en varias bases de datos NoSQL. Yo hubiera añadido también &lt;i&gt;Perl&lt;/i&gt;, &lt;i&gt;C/C++&lt;/i&gt;, &lt;i&gt;Erlang&lt;/i&gt; ó &lt;i&gt;Go&lt;/i&gt;, que son lenguajes populares que también comprende &lt;b&gt;MongoDB&lt;/b&gt; (entre otros muchos).&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;table border="1" cellspacing="0" cellpadding="0"&gt;&lt;tr align="center" bgcolor="#AAAACC"&gt; &lt;td&gt;&amp;nbsp;&lt;/td&gt; &lt;td&gt;&lt;b&gt;BBDD&lt;/b&gt;&lt;/td&gt; &lt;td&gt;&lt;b&gt;Modo durabilidad&lt;/b&gt;&lt;/td&gt; &lt;td&gt;&lt;b&gt;java&lt;/b&gt;&lt;/td&gt; &lt;td&gt;&lt;b&gt;ruby&lt;/b&gt;&lt;/td&gt; &lt;td&gt;&lt;b&gt;python&lt;/b&gt;&lt;/td&gt; &lt;td&gt;&lt;b&gt;php&lt;/b&gt;&lt;/td&gt; &lt;td&gt;&lt;b&gt;.net&lt;/b&gt;&lt;/td&gt; &lt;td&gt;&lt;b&gt;http&lt;/b&gt;&lt;/td&gt; &lt;/tr&gt;&lt;tr align="center" bgcolor="#AAFFAA"&gt; &lt;td&gt;&lt;b&gt;documento&lt;/b&gt;&lt;/td&gt; &lt;td&gt;mongodb&lt;/td&gt; &lt;td&gt;basado en réplica&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;/tr&gt;&lt;tr align="center" bgcolor="#AAFFAA"&gt; &lt;td&gt;&amp;nbsp;&lt;/td&gt; &lt;td&gt;couchdb&lt;/td&gt; &lt;td&gt;nodo simple&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;/tr&gt;&lt;tr align="center" bgcolor="#AAFFAA"&gt; &lt;td&gt;&amp;nbsp;&lt;/td&gt; &lt;td&gt;ravendb&lt;/td&gt; &lt;td&gt;nodo simple&lt;/td&gt; &lt;td&gt;-&lt;/td&gt; &lt;td&gt;-&lt;/td&gt; &lt;td&gt;-&lt;/td&gt; &lt;td&gt;-&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;/tr&gt;&lt;tr align="center" bgcolor="#FFAAAA"&gt; &lt;td&gt;&lt;b&gt;clave-valor&lt;/b&gt;&lt;/td&gt; &lt;td&gt;redis&lt;/td&gt; &lt;td&gt;en memoria, serializado en disco&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;-&lt;/td&gt; &lt;/tr&gt;&lt;tr align="center" bgcolor="#FFAAAA"&gt; &lt;td&gt;&amp;nbsp;&lt;/td&gt; &lt;td&gt;riak&lt;/td&gt; &lt;td&gt;basado en réplica&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;/tr&gt;&lt;tr align="center" bgcolor="#AAFFAA"&gt; &lt;td&gt;&lt;b&gt;tabular&lt;/b&gt;&lt;/td&gt; &lt;td&gt;cassandra&lt;/td&gt; &lt;td&gt;basado en réplica&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;-&lt;/td&gt; &lt;/tr&gt;&lt;tr align="center" bgcolor="#FFAAAA"&gt; &lt;td&gt;&lt;b&gt;grafo&lt;/b&gt;&lt;/td&gt; &lt;td&gt;neo4j&lt;/td&gt; &lt;td&gt;nodo simple&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;-&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;/tr&gt;&lt;tr align="center" bgcolor="#FFAAAA"&gt; &lt;td&gt;&amp;nbsp;&lt;/td&gt; &lt;td&gt;sones&lt;/td&gt; &lt;td&gt;nodo simple&lt;/td&gt; &lt;td&gt;-&lt;/td&gt; &lt;td&gt;-&lt;/td&gt; &lt;td&gt;-&lt;/td&gt; &lt;td&gt;-&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;td&gt;x&lt;/td&gt; &lt;/tr&gt;&lt;/table&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Fuentes&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;a href="http://nosql.mypopescu.com/post/1016366403/nosql-guide-for-beginners"&gt;http://nosql.mypopescu.com/post/1016366403/nosql-guide-for-beginners&lt;/a&gt;&lt;br /&gt;&lt;a href="http://nosql.mypopescu.com/post/978742866/document-databases-compared-couchdb-mongodb-ravendb"&gt;http://nosql.mypopescu.com/post/978742866/document-databases-compared-couchdb-mongodb-ravendb&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-9083624996265283124?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/9083624996265283124/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=9083624996265283124&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/9083624996265283124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/9083624996265283124'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/comparativa-mongodb-con-otras-bases-de.html' title='Comparativa MongoDB con otras Bases de datos NoSQL'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-7603514752681079197</id><published>2010-11-29T08:22:00.002+01:00</published><updated>2010-11-29T08:22:43.370+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><title type='text'>MongoDB: Ejemplo de configuración de fragmentación</title><content type='html'>Este post es una traducción del artículo original &lt;i&gt;&lt;a href="http://www.snailinaturtleneck.com/blog/2010/08/30/return-of-the-mongo-mailbag/"&gt;"Return to the Mongo Mailbag"&lt;/a&gt;&lt;/i&gt;, de &lt;b&gt;Kristina Chodorow&lt;/b&gt;.  &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En la lista de correo &lt;code&gt;mongodb-user&lt;/code&gt; de la semana pasada, alguien preguntó (básicamente):&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"Tengo 4 servidores y quiero dos frgamentos. ¿Cómo lo configuro?"&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Mucha gente está preguntando sobre cómo configurar conjuntos de réplica y fragmentación, por lo que que aquí se explicará en detalle.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;The Architecture&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Prerequisitos. Si no estás familiarizado con los conjuntos de réplica, echa un vistazo a mi &lt;a href="http://www.snailinaturtleneck.com/blog/2010/08/02/replica-sets-part-2-what-are-replica-sets/"&gt;post en mi blog&lt;/a&gt;. El resto de este post no tendrá mucho sentido a menos que tú sepas qué es un árbitro. Además, deberías conocer los &lt;a href="http://www.snailinaturtleneck.com/blog/2010/03/30/sharding-with-the-fishes/"&gt;conceptos de la fragmentación&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Cada fragmento debería ser un conjunto de réplica, por lo que necesitaremos dos conjuntos de réplica (los llamaremos &lt;i&gt;"foo"&lt;/i&gt; y &lt;i&gt;"bar"&lt;/i&gt;). Queremos que nuestro cluster sea correcto si una de las máquinas se cae o se separa de la manada (partición de red), así que extenderemos fuera cada conjunto entre las máquinas disponibles. Los conjuntos de réplica están codificadas por color y las máquinas son nombradas imaginativamente server1-4.&lt;br /&gt;&lt;center&gt;&lt;img src="http://www.snailinaturtleneck.com/blog/wp-content/uploads/2010/08/cluster.psd_1.png"&gt;&lt;/center&gt;&lt;br /&gt;Cada conjunto de replica tiene dos hosts y un árbitro. De esta manera, si un servidor se cae, ninguna funcionalidad se pierde (y ahí no estarán dos maestros en un servidor simple).&lt;br /&gt;&lt;br /&gt;Para configurar ésto, ejecuta:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;server1&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ mkdir -p ~/dbs/foo ~/dbs/bar&lt;br /&gt;$ ./mongod --dbpath ~/dbs/foo --replSet foo&lt;br /&gt;$ ./mongod --dbpath ~/dbs/bar --port 27019 --replSet bar --oplogSize 1&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;server2&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ mkdir -p ~/dbs/foo&lt;br /&gt;$ ./mongod --dbpath ~/dbs/foo --replSet foo&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;server3&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ mkdir -p ~/dbs/foo ~/dbs/bar&lt;br /&gt;$ ./mongod --dbpath ~/dbs/foo --port 27019 --replSet foo --oplogSize 1&lt;br /&gt;$ ./mongod --dbpath ~/dbs/bar --replSet bar&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;server4&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ mkdir -p ~/dbs/bar&lt;br /&gt;$ ./mongod --dbpath ~/dbs/bar --replSet bar&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Los árbitros tienen un tamaño de &lt;i&gt;oplog&lt;/i&gt; de 1. Por defecto, el tamaño de &lt;i&gt;oplog&lt;/i&gt; es un ~5% de tu disco duro, pero los árbitros no necesitan mantener ningún dato, por lo que esto es un gran desperdicio de espacio.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Poner juntos los conjuntos de réplica&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Ahora arrancaremos los dos conjuntos de réplica. Arrancar la consola &lt;code&gt;mongo&lt;/code&gt; y escribir:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt; db = connect("server1:27017/admin")&lt;br /&gt;connecting to: server1:27017&lt;br /&gt;admin&lt;br /&gt;&amp;gt; rs.initiate({"_id" : "foo", "members" : [&lt;br /&gt;... {"_id" : 0, "host" : "server1:27017"},&lt;br /&gt;... {"_id" : 1, "host" : "server2:27017"},&lt;br /&gt;... {"_id" : 2, "host" : "server3:27019", arbiterOnly : true}]})&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;"info" : "Config now saved locally.  Should come online in about a minute.",&lt;br /&gt;&amp;nbsp;&amp;nbsp;"ok" : 1&lt;br /&gt;}&lt;br /&gt;&amp;gt; db = connect("server3:27017/admin")&lt;br /&gt;connecting to: server3:27017&lt;br /&gt;admin&lt;br /&gt;&amp;gt; rs.initiate({"_id" : "bar", "members" : [&lt;br /&gt;... {"_id" : 0, "host" : "server3:27017"},&lt;br /&gt;... {"_id" : 1, "host" : "server4:27017"},&lt;br /&gt;... {"_id" : 2, "host" : "server1:27019", arbiterOnly : true}]})&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;"info" : "Config now saved locally.  Should come online in about a minute.",&lt;br /&gt;&amp;nbsp;&amp;nbsp;"ok" : 1&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ahora tenemos dos conjuntos de réplica en ejecución. Creemos ahora un cluster.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Configurar la fragmentación&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Una vez intentemos configurar un sistema sin puntos simples de fallo, usaremos tres servidores de configuración. Podemos tener tantos procesos &lt;code&gt;mongos&lt;/code&gt; como queramos (se recomienda uno en cada &lt;code&gt;appserver&lt;/code&gt;), pero empezaremos con uno.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;server2&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ mkdir ~/dbs/config&lt;br /&gt;$ ./mongod --dbpath ~/dbs/config --port 20000&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;server3&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ mkdir ~/dbs/config&lt;br /&gt;$ ./mongod --dbpath ~/dbs/config --port 20000&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;server4&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ mkdir ~/dbs/config&lt;br /&gt;$ ./mongod --dbpath ~/dbs/config --port 20000&lt;br /&gt;$ ./mongos --configdb server2:20000,server3:20000,server4:20000 --port 30000&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ahora añadiremos nuestros conjuntos de réplica al cluster. Concta los &lt;code&gt;mongos&lt;/code&gt; y ejecuta el comando &lt;code&gt;&lt;b&gt;addshard&lt;/b&gt;&lt;/code&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt; mongos = connect("server4:30000/admin")&lt;br /&gt;connecting to: server4:30000&lt;br /&gt;admin&lt;br /&gt;&amp;gt; mongos.runCommand({addshard : "foo/server1:27017"})&lt;br /&gt;{ "shardAdded" : "foo", "ok" : 1 }&lt;br /&gt;&amp;gt; mongos.runCommand({addshard : "bar/server3:27017"})&lt;br /&gt;{ "shardAdded" : "bar", "ok" : 1 }&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Como puedes ver, terminarás con un fragmento &lt;i&gt;"foo"&lt;/i&gt; y un fragmento &lt;i&gt;"bar"&lt;/i&gt;. (si estás usando una versión antigua de &lt;b&gt;MongoDB&lt;/b&gt;, tus fragmentos tendrán nombres como &lt;i&gt;“shard0000″&lt;/i&gt; o &lt;i&gt;“shard0001″&lt;/i&gt;)&lt;br /&gt;&lt;br /&gt;Ahora puedes conectar a &lt;code&gt;“server4:30000″&lt;/code&gt; en tu aplicación y utilizarlo con un simple y “normal” &lt;code&gt;mongod&lt;/code&gt;. Si quieres añadir más procesos &lt;code&gt;mongos&lt;/code&gt;, simplemente arráncalos con los mismos parámetros &lt;i&gt;configdb&lt;/i&gt; utilizados anteriormente.&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-7603514752681079197?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/7603514752681079197/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=7603514752681079197&amp;isPopup=true' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/7603514752681079197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/7603514752681079197'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/mongodb-ejemplo-de-configuracion-de.html' title='MongoDB: Ejemplo de configuración de fragmentación'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-4075509135590715857</id><published>2010-11-29T08:22:00.000+01:00</published><updated>2010-11-29T08:22:03.033+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><title type='text'>MongoDB: Conjuntos de réplica. Parte 3</title><content type='html'>Este post asume que sabes qué son los conjuntos de réplica y algo de la sintáxis básica.&lt;br /&gt;&lt;br /&gt;En la parte 1, configuramos un conjunto de réplica desde cero, pero la vida real es más desordenado: puedes querer migrar servidores de desarrollo a producción, añadir nuevos esclavos, priorizar servidores, cambiar cosas en el momento (on the fly)... y ésto es lo que este post cubre.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Antes de empezar…&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;A los conjuntos de réplica no les gusta localhost. Son serviciales para secundarlos... más o menos, bastante... pero a menudo provoca discrepancias. Puedes evitar estas discrepancias usando en su lugar el nombre del servidor (hostname). En Linux, puedes buscar tu nombre de servidor ejecutando el comando:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ hostname&lt;br /&gt;wooster&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;De aquí en adelante, usaremos mi nombre de servidor en lugar de localhost.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Arrancar con datos&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Esto es más o menos que arrancar sin datos, escepto que deberías hacer una copia de seguridad de tus datos antes de arrancar (deberías siempre hacer un backup siempre de tus datos antes de hacer travesuras con tu servidor de configuración).&lt;br /&gt;&lt;br /&gt;Si en el pre-conjunto-réplica, arrancaste tu servidor con algo como:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ ./mongod&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;...conviértelo en el primer miembro de tu conjunto de réplica, por lo que has de parar y arrancar de nuevo con la opción &lt;i&gt;–replset&lt;/i&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ ./mongod --replSet unicomplex/wooster:27017&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ahora, inicializa el conjunto con el único servidor:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt; rs.initiate()&lt;br /&gt;{&lt;br /&gt;"info" : "Config now saved locally.  Should come online in about a minute.",&lt;br /&gt;"ok" : 1&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Agregar esclavos&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Deberías arrancar MongoDB siempre con esclavos, así que agreguemos alguno.&lt;br /&gt;&lt;br /&gt;Arranca tu servidor con las opciones usuales, así como también como &lt;i&gt;–replSet&lt;/i&gt;. Así, por ejemplo, podríamos hacer:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ ./mongod --dbpath ~/dbs/slave1 --port 27018 --replSet unicomplex/wooster:27017&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ahora, agregamos este esclavo al conjunto de réplica. Asegurarse de que &lt;i&gt;db&lt;/i&gt; está conectado a &lt;i&gt;wooster:27017&lt;/i&gt; (el servidor primario) y arrancar:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt; rs.add("wooster:27018")&lt;br /&gt;{"ok" : 1}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Repetir como sea necesario para agregar más esclavos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Agregar un árbitro&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Esto es muy similar a agregar un esclavo. Cuando arranques el árbitro, deberías darle la opción &lt;i&gt;–oplogSize 1&lt;/i&gt;. De esta manera el árbitro no desperdiciará espacio.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ ./mongod --dbpath ~/dbs/arbiter --port 27019 --replSet unicomplex/wooster:27017 --oplogSize 1&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ahora agregarlo al conjunto. Puedes especificar que este servidor es un árbitro pasando en un objeto un campo &lt;i&gt;arbiterOnly&lt;/i&gt; a &lt;i&gt;rs.add&lt;/i&gt;:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt; rs.add({"host" : "wooster:27019", "arbiterOnly" : true})&lt;br /&gt;{"ok" : 1}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Degradar un primario&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Supongamos que nuestra compañía tiene disponibles los siguientes servidores:&lt;br /&gt;&lt;br /&gt;1. Super máquina Gazillion dollar&lt;br /&gt;2. Instancia EC2&lt;br /&gt;3. iMac que encontramos en la calle&lt;br /&gt;&lt;br /&gt;A través de un accidente del destino, el iMac se convierte en primario. Podemos forzarle a que se convierta en esclavo ejecutando el comando:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt; imac = connect("imac.example.com/admin")&lt;br /&gt;connecting to: imac.example.com/admin&lt;br /&gt;admin&lt;br /&gt;&amp;gt; imac.runCommand({"replSetStepDown" : 1})&lt;br /&gt;{"ok" : 1}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ahora el iMac será un esclavo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Establecer prioridades&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Podemos indicar que el iMac nunca sea un maestro (queremos usarlo sólo como backup). Puedes forzar ésto estableciendo su prioridad a cero. La más alta prioridad de un servidor es la que hará que se convierta en maestro si el actual maestro falla. Las únicas opciones son 0 (no puede ser maestro) o 1 (puede ser maestro), pero en el futuro serás capaz de tener una buena graduación de prioridades..&lt;br /&gt;&lt;br /&gt;Así, cambiaremos la prioridad del iMac a 0. Para cambiar la configuración, conectemos al maestro y editemos su configuración:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt; config = rs.conf()&lt;br /&gt;{&lt;br /&gt;"_id" : "unicomplex",&lt;br /&gt;"version" : 1,&lt;br /&gt;"members" : [&lt;br /&gt;{&lt;br /&gt;"_id" : 0,&lt;br /&gt;"host" : "prod.example.com:27017"&lt;br /&gt;},&lt;br /&gt;{&lt;br /&gt;"_id" : 1,&lt;br /&gt;"host" : "ec2.example.com:27017"&lt;br /&gt;},&lt;br /&gt;{&lt;br /&gt;"_id" : 2,&lt;br /&gt;"host" : "imac.example.com:27017"&lt;br /&gt;}&lt;br /&gt;]&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ahora, tenemos que hacer dos cosas: 1) establecer la prioridad del iMac a 0, y 2) actualizar la versión de la configuración. El nuevo número de versión es siempre el anterior más uno&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt; config.members[2].priority = 0&lt;br /&gt;0&lt;br /&gt;&amp;gt; config.version += 1&lt;br /&gt;2&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Finalmente, decimos al conjunto de réplica que tenemos una nueva configuración.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt; use admin&lt;br /&gt;switched to db admin&lt;br /&gt;&amp;gt; db.runCommand({"replSetReconfig" : config})&lt;br /&gt;{"ok" : 1}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Todos los cambios de configuración deben ocurrir en el maestro. Éstos se propagarán de éste a los esclavos. Ahora puedes "matar" cualquier servidor y el iMac nunca se convertirá en maestro.&lt;br /&gt;&lt;br /&gt;Esta configuración es un poco melindrosa para hacer desde la consola. En el futuro, la gente probablemente utilice una GUI para configurar sus conjuntos y trastear con la configuración del servidor.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;&lt;u&gt;Artículo original&lt;/u&gt;&lt;/b&gt;: &lt;a href="http://www.snailinaturtleneck.com/blog/2010/08/03/part-3-replica-sets-in-the-wild/"&gt;http://www.snailinaturtleneck.com/blog/2010/08/03/part-3-replica-sets-in-the-wild/&lt;/a&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-4075509135590715857?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/4075509135590715857/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=4075509135590715857&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/4075509135590715857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/4075509135590715857'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/mongodb-conjuntos-de-replica-parte-3.html' title='MongoDB: Conjuntos de réplica. Parte 3'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-975029630486560317</id><published>2010-11-29T08:20:00.002+01:00</published><updated>2010-11-29T08:21:25.869+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><category scheme='http://www.blogger.com/atom/ns#' term='Parte 2'/><title type='text'>MongoDB: Conjuntos de réplica. Parte 2</title><content type='html'>Los conjuntos de réplica son básicamente maestro-esclavo con failover automático.&lt;br /&gt;&lt;br /&gt;La idea es: tienes un esclavo y uno o más esclavos. Si el maestro se cae, uno de los esclavos automáticamente se convertirá en el nuevo maestro. Los drivers de base de datos, siempre encontrarán al maestro, si el maestro que se está usando se cae, ellos (drivers) automáticamente entenderán quién es el nuevo maestro y envía las escrituras a dichos servidor. Esto es mucho más fácil de manejar (y más rápido) que manejar manualmente el fallo sobre un esclavo.&lt;br /&gt;&lt;br /&gt;Así, tu tienes un pool de servidores con un primario (el maestro) y N secundarios (esclavos). Si el primario tiene un accidente y desaparece, los otros servidores mantendrán una elección para elegir un nuevo primario.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Elecciones&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Un servidor tiene que obtener una mayoría del total de votos para ser elegido, no sólo una mayoría. Esto significa que, si tenemos 50 servidores y cada servidor tiene un voto (por defecto, los últimos post mostrará cómo cambiar el número de votos que un servidor obtiene), un servidor necesita al menos 26 votos para convertirse en primario. Si ninguno obtiene 26 votos, ninguno se convierte en primario. El conjunto puede todavía manejar lecturas, pero no escrituras (ya que no hay maestro).&lt;br /&gt;&lt;br /&gt;Si un servidor obtiene 26 o más votos, éste se convertirá en primario. Todas las futuras escrituras serán direccionadas a éste, hasta que pierda una elección, estalle, etc.&lt;br /&gt;&lt;br /&gt;El primario original es todavía parte del cojunto. Si lo levantas, éste se convertirá en un servidor secundario (hasta que obtenga nuevamente la mayoría de votos).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Una multitud de tres (de buena manera)&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Una complicación con este sistema de votación es que tú no puedes tener sólo un maestro y un esclavo.&lt;br /&gt;&lt;br /&gt;Si estableces sólo un maestro y un esclavo, el sistema tiene un total de 2 votos, así que un servidor necesita ambos botos para ser elegido maestro (1 no es mayoría). Si uno de los servidores se cae, el otro servidor sólo tiene un voto de 2, así que ésto lo convierte (o lo conserva) en un esclavo. Si la red está particionada, y repentinamente el maestro no tiene una mayoría de los votosos (sólo tiene su único voto), será degradado a un esclavo. El esclavo además no tiene una mayoría de los votos, po lo que permanecerá siendo esclavo (así que terminarás con dos esclavos hasta que los servidores se puedan alcanzarse el uno al otro de nuevo).&lt;br /&gt;&lt;br /&gt;Esto es un desperdicio, aunque, tener dos servidores y ningún maestro levantado, los conjuntos de réplica tienen varias formas de evitar esta situación. Una de las más simples y más versátiles es usar un árbitro, un servidor especial que existe para resolver disputas. Éste no sirve ningún dato al mundo exterior, si no que es simplemente un votante (puede incluso estar en la misma máquina como otro servidor, siendo muy ligero). En la &lt;a href="http://mongospanish.blogspot.com/2010/08/conjuntos-de-replica-parte-1.html"&gt;parte 1&lt;/a&gt;, el árbitro era &lt;i&gt;localhost:27019&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Así, digamos que establecemos un maestro, un esclavo y un árbitro, cada un con un voto (total 3 votos). Entonces, si tenemos un maestro y un árbitro en un centro de datos y el esclavo en otro, si se produce una partición de red, el maestro todavía tendrá una mayoría de votos (maestro+árbitro). El esclavo tiene sólo 1 voto. Si el maestro falle y la red no se particiona, el árbitro puede votar por el esclavo, promocionándole como maestro.&lt;br /&gt;&lt;br /&gt;Con esta configuración de tres servidores, obtenemos un failover sensible y robusto.&lt;br /&gt;&lt;br /&gt;Lo próximo: &lt;a href="http://mongospanish.blogspot.com/2010/08/conjuntos-de-replica-parte-3.html"&gt;configuración dinámica de tu conjunto de réplica&lt;/a&gt;. En la parte 1, confiramos todo completamente al empezar. En el mundo real querremos ser capaces de añadir servidores dinámicamente y cambiar la configuración.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;&lt;u&gt;Artículo original&lt;/u&gt;&lt;/b&gt;: &lt;a href="http://www.snailinaturtleneck.com/blog/2010/08/02/replica-sets-part-2-what-are-replica-sets/"&gt;http://www.snailinaturtleneck.com/blog/2010/08/02/replica-sets-part-2-what-are-replica-sets/&lt;/a&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-975029630486560317?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/975029630486560317/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=975029630486560317&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/975029630486560317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/975029630486560317'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/mongodb-conjuntos-de-replica-parte-2.html' title='MongoDB: Conjuntos de réplica. Parte 2'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-6389248100702201162</id><published>2010-11-29T08:19:00.003+01:00</published><updated>2010-11-29T08:21:13.173+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><title type='text'>MongoDB: Conjuntos de réplica. Parte 1</title><content type='html'>&lt;i&gt;Los próximos tres posts están dedicados a los conjuntos de réplica, una de las mejores características de MongoDB para asegurar la alta disponibilidad en un sistema de base de datos. Estos posts los escribió Kristina Chodorow, una de las desarrolladoras más importantes de MongoDB.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Este post muestra cómo hacer el "Hola, mundo" de los conjuntos de réplica. Voy a empezar con un post explicand qué es, pero la codificar es mucho más divertido que leer. Por ahora, todo lo que tienes que saber es que hay maestro-esclavo con failover (a prueba de fallos) automático.&lt;br /&gt;&lt;br /&gt;Asegúrate de que tienes la versión 1.5.7 o superior de la base de datos (MongoDB) antes de probar el código que viene a continuación.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Paso 1: Elegir un nombre para tu conjunto&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Esto es sólo organizacional, así que puedes elegir &lt;a href="http://www.babyzone.com/babynames/nameinventor.asp?gender=neutral"&gt;el que sea&lt;/a&gt;. Yo usaré "&lt;a href="http://www.babyzone.com/babynames/nameinventor.asp?gender=neutral"&gt;unicomplex&lt;/a&gt;" para mi ejemplo.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Nota: Kristina hace uso de su buen humor para la elección de un nombre. El nombre "que sea" es un artículo para dar un nombre a un bebé. Unicomplex se refiere a la saga de Startrek.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Paso 2: Crear los directorios de datos&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Necesitamos un directorio de datos para cada servidor que vayamos a arrancar:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ mkdir -p ~/dbs/borg1 ~/dbs/borg2 ~/dbs/arbiter&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Paso 3: Arrancar los servidores&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Arrancaremos nuestros tres servidores:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ ./mongod --dbpath ~/dbs/borg1 --port 27017 --replSet unicomplex/&lt;br /&gt;$ ./mongod --dbpath ~/dbs/borg2 --port 27018 --replSet unicomplex/&lt;br /&gt;$ ./mongod --dbpath ~/dbs/arbiter --port 27019 --replSet unicomplex/&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Paso 4: Inicializar el conjunto&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Ahora tenemos que decirle al conjunto, "¡hey, existes!". Arranca la consola mongo y ejecuta:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;MongoDB shell version: 1.5.7&lt;br /&gt;connecting to: test&lt;br /&gt;&amp;gt; rs.initiate({"_id" : "unicomplex", "members" : [&lt;br /&gt;... {"_id" : 0, "host" : "localhost:27017"}, &lt;br /&gt;... {"_id" : 1, "host" : "localhost:27018"}, &lt;br /&gt;... {"_id" : 2, "host" : "localhost:27019", "arbiterOnly" : true}]})&lt;br /&gt;{&lt;br /&gt;"info" : "Config now saved locally.  Should come online in about a minute.",&lt;br /&gt;"ok" : 1&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;rs&lt;/i&gt; es una variable global que mantiene un racimo de funciones útiles para conjuntos de réplica.&lt;br /&gt;&lt;br /&gt;El mensaje dice que estará online en aproximadamente un minuto, pero siempre han sido unos ~5 segundos para mi. Una vez que veas la siguiente línea en uno de los logs (trazas):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;replSet PRIMARY&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;¡…tu conjunto de réplica está listo para funcionar!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Jugar con el conjunto&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Uno de los servidores será el maestro (master), el otro es un esclavo (slave). Puedes entender cuál es cuál ejecutando el comando &lt;code&gt;isMaster&lt;/code&gt; en la consola:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt; db.isMaster()&lt;br /&gt;{&lt;br /&gt;"ismaster" : true,&lt;br /&gt;"secondary" : false,&lt;br /&gt;"hosts" : [&lt;br /&gt;"localhost:27017",&lt;br /&gt;"localhost:27018",&lt;br /&gt;],&lt;br /&gt;"arbiters" : [&lt;br /&gt;"localhost:27019"&lt;br /&gt;],&lt;br /&gt;"ok" : 1&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Si &lt;i&gt;db&lt;/i&gt; no es primario, el servidor que está será listado en el campo "primary" (primario):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt; db.isMaster()&lt;br /&gt;{&lt;br /&gt;"ismaster" : false,&lt;br /&gt;"secondary" : true,&lt;br /&gt;"hosts" : [&lt;br /&gt;"localhost:27017",&lt;br /&gt;"localhost:27018",&lt;br /&gt;],&lt;br /&gt;"arbiters" : [&lt;br /&gt;"localhost:27019"&lt;br /&gt;],&lt;br /&gt;"primary" : "localhost:27018",&lt;br /&gt;"ok" : 1&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ahora, prueba a "matar" el servidor primario. Espera un par de segundos y verás que el otro servidor (no-árbitro) será elegido primario.&lt;br /&gt;&lt;br /&gt;Una vez que haya un nuevo primeraio, rearranca el mongod que acabas de "matar". Verás que se une a la refriega, aunque no se convierte en maestro (ya hay un maestro, así que no mecerá el barco). Después de unos pocos segundos, mata el maestro actual. Ahora, el antiguo maestro se convertirá en maestro de nuevo.&lt;br /&gt;&lt;br /&gt;Es bastante divertido jugar con ésto, levantando y cayendo y mirando cómo el maestrazgo va atrás y adelante (o quizá yo me entretenga fácilmente).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Insertar y consultar datos&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Por defecto, los esclavos están sólo como respaldo o backup, por lo que puedes usarlo para consultas (lecturas) si estableces el flag "slave ok". Conecta a cada uno de los servidores y establece este flag:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt; db.getMongo().setSlaveOk()&lt;br /&gt;&amp;gt; borg2 = connect("localhost:27018/test")&lt;br /&gt;connecting to: localhost:27018/test&lt;br /&gt;test&lt;br /&gt;&amp;gt; borg2.getMongo().setSlaveOk()&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ahora puedes insertar, actualizar y eliminar datos en el maestro y leer los cambios en el esclavo.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;&lt;u&gt;Artículo original:&lt;/u&gt;&lt;/b&gt; &lt;a href="http://www.snailinaturtleneck.com/blog/2010/07/30/replica-sets-part-1-master-slave-is-so-2009"&gt;http://www.snailinaturtleneck.com/blog/2010/07/30/replica-sets-part-1-master-slave-is-so-2009&lt;/a&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-6389248100702201162?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/6389248100702201162/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=6389248100702201162&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6389248100702201162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6389248100702201162'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/mongodb-conjuntos-de-replica-parte-1.html' title='MongoDB: Conjuntos de réplica. Parte 1'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-4522646074248500762</id><published>2010-11-29T08:19:00.000+01:00</published><updated>2010-11-29T08:19:00.673+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><title type='text'>MongoDB: Fragmentación y conjuntos de réplica ilustrados</title><content type='html'>Este post asume que conoces qué son los conjuntos de réplica y la fragmentación.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Paso 1: No usar fragmentación&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;En serio. Casi nadie lo necesita. Si estabas en el punto donde necesitabas particionar tu base de datos MySQL, probablemente tengas otras vías de hacerlo antes de que necesites particionar MongoDB (nos burlamos de los billones de filas).&lt;br /&gt;&lt;br /&gt;Ejecuta MongoDB como un conjunto de réplica. Cuando necesites realmente capacidad extra, entonce, y sólo entonces, comienza la fragmentación. ¿Por qué?&lt;br /&gt;&lt;br /&gt;1. Tienes que elegir una clave de fragmentación. Si conoces las características de tu sistema antes de elegir una clave de fragmentación, puedes ahorrarte a tí mismo un mundo de dolor.&lt;br /&gt;2. La fragmentación añade complejidad.: tienes que mantener trazabilidad de más máquinas y procesos.&lt;br /&gt;3. La optimización prematura es la raíz de todo mal. Si tu aplicación no se ejecuta rápido, ¿está tu CPI o tu red limitadas? ¿Tienes demasiados índices? ¿Demasiados pocos? ¿Están siendo golpeados por tus consultas? Verifica (al menos) todas estas causas primero.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Usar la fragmentación&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Un fragmento está definido como uno o más servidores con un maestro. Asi, un fragmento podría ser un simple mongod (mala idea), una configuración maestro-esclavo (mejor idea), o un conjunto de ráplica (mejor idea).&lt;br /&gt;&lt;br /&gt;Digamos que renemos tres fragmentos y cada uno de ellos es un conjunto de réplica. Para tres fragmentos, querrás un mínimo de 3 servidores (la regla general es: mínimo de N servidores para N fragmentos). Haremos también el mínimo en los conjuntos de réplica: un maestro, primario y árbitro para cada conjunto. &lt;br /&gt;&lt;br /&gt;Las tazas son procesos MongoDB. Así, tenemos tres conjuntos de réplica:&lt;br /&gt;&lt;center&gt;&lt;a href="http://www.snailinaturtleneck.com/blog/wp-content/uploads/2010/08/rss.png"&gt;&lt;img src="http://www.snailinaturtleneck.com/blog/wp-content/uploads/2010/08/rss.png"&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;“M” representa al “maestro” (master), “S” representa al “esclavo” (slave), y “A” representa el "árbitro" (arbiter). Tenemos también los servidores de configuración:&lt;br /&gt;&lt;center&gt;&lt;a href="http://www.snailinaturtleneck.com/blog/wp-content/uploads/2010/08/config.psd_.png"&gt;&lt;img src="http://www.snailinaturtleneck.com/blog/wp-content/uploads/2010/08/config.psd_.png"&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;y procesos &lt;i&gt;mongos&lt;/i&gt;:&lt;br /&gt;&lt;center&gt;&lt;a href="http://www.snailinaturtleneck.com/blog/wp-content/uploads/2010/08/mongos.psd_.png"&gt;&lt;img src="http://www.snailinaturtleneck.com/blog/wp-content/uploads/2010/08/mongos.psd_.png"&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;Ahora, soporta estos procesos en servidores (las bandejas son servidores). Cada maestro necesita hacer mucho, así que cada primario toma su propio servidor.&lt;br /&gt;&lt;center&gt;&lt;a href="http://www.snailinaturtleneck.com/blog/wp-content/uploads/2010/08/masters.psd_-300x186.png"&gt;&lt;img src="http://www.snailinaturtleneck.com/blog/wp-content/uploads/2010/08/masters.psd_-300x186.png"&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;Ahora ponemos también un esclavo y un árbitro en cada caja.&lt;br /&gt;&lt;center&gt;&lt;a href="http://www.snailinaturtleneck.com/blog/wp-content/uploads/2010/08/3servers.psd_-300x186.png"&gt;&lt;img src="http://www.snailinaturtleneck.com/blog/wp-content/uploads/2010/08/3servers.psd_-300x186.png"&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;Observar cómo mezclamos las cosas: sin conjunto de réplica está alojado en un servidor simple, así que si un servidor se cae, el conjunto puede recuperarse en un servidor diferente y seguir funcionando.&lt;br /&gt;&lt;br /&gt;Ahora podemos añadir tres servidores de configuración y dos procesos &lt;i&gt;mongos&lt;/i&gt;. Los procesos &lt;i&gt;mongos&lt;/i&gt; son puestos normalmente en el &lt;i&gt;appserver&lt;/i&gt;, pero son muy ligeros, así que soportaremos un par de ellos aquí.&lt;br /&gt;&lt;center&gt;&lt;a href="http://www.snailinaturtleneck.com/blog/wp-content/uploads/2010/08/3serversdone.psd_.png"&gt;&lt;img src="http://www.snailinaturtleneck.com/blog/wp-content/uploads/2010/08/3serversdone.psd_.png"&gt;&lt;/a&gt;&lt;/center&gt;&lt;br /&gt;Un poco cargado, pero posible&lt;br /&gt;&lt;br /&gt;&lt;b&gt;En caso de emergencia...&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Digamos que caemos una bandeja. CRASH! Con esta configuración, tus datos están a salvo (mientras estés usando w) y el cluster no pierde funcionalidad (en términos de lecturas y escrituras).&lt;br /&gt;&lt;br /&gt;Los trozos no estarán disponibles para migrar (debido a que uno de los servidores de configuración está caído), así que un fragmento puede estar "hinchado" si el servidor de configuración está caído por mucho tiempo.&lt;br /&gt;&lt;br /&gt;Las particiones de red y perder dos servidores son problemas grandes, así que deberías tener más de tres servidores si quieres gran disponibilidad.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;Fuente original:&lt;/b&gt; &lt;a href="http://www.snailinaturtleneck.com/blog/2010/08/09/sharding-and-replica-sets-illustrated/"&gt;http://www.snailinaturtleneck.com/blog/2010/08/09/sharding-and-replica-sets-illustrated/&lt;/a&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-4522646074248500762?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/4522646074248500762/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=4522646074248500762&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/4522646074248500762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/4522646074248500762'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/mongodb-fragmentacion-y-conjuntos-de.html' title='MongoDB: Fragmentación y conjuntos de réplica ilustrados'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-2150538387588514250</id><published>2010-11-29T08:17:00.002+01:00</published><updated>2010-11-29T08:17:57.755+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><title type='text'>MongoDB: Tres consejos para la consola</title><content type='html'>La consola MongoDB es una herramienta administrativa poderosa. Algunas de sus características más útiles no son ampliamente conocidas.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. Puedes ejecutar ficheros JavaScript&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Si tienes una serie de comandos que debes mantener ejecutando, considera ponerlos en un fichero. Por ejemplo, si quieres escribir tu propia versión de mongostat con una única operación de información, puedes crear un fichero llamado myMongoStat.js:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;// Impresión de la cabecera&lt;br /&gt;print("inserts\tqueries\ tupdates\tdeletes");&lt;br /&gt;&lt;br /&gt;// Impresión constante de las estadísticas&lt;br /&gt;while (true) {&lt;br /&gt;var stats = db.serverStatus();&lt;br /&gt;&lt;br /&gt;print(stats.opcounters. insert+"\t"+&lt;br /&gt;stats.opcounters.query+"\t"+&lt;br /&gt;stats.opcounters.update+"\t"+&lt;br /&gt;stats.opcounters['delete']);&lt;br /&gt;&lt;br /&gt;sleep(1000);&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Cosas a anotar: &lt;br /&gt;&lt;br /&gt;* No puedes usar asistentes de la consola: cosas como "use foo" ó "show dbs".  Para hacer ésto, utiliza los comandos equivalentes de la base de datos (&lt;i&gt;db.getSisterDB("foo")&lt;/i&gt; ó &lt;i&gt;admin = db.getSisterDB("admin"); admin.runCommand({ listDatabases:1}&lt;/i&gt;) , respectivamente.&lt;br /&gt;* "delete" es una palabra reservada en JavaScript, así que no puedes escribir stats.opcounters.delete, si no que tienes que usar un obtenedor de estilo array asociativo (&lt;i&gt;stats.opcounters["delete"]&lt;/i&gt;).&lt;br /&gt;&lt;br /&gt;Para eje utar este script, abrir un termina y escribir:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ ./mongo myMongoStat.js&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Puedes hacer ésto con cualquier serie de comandos que utilices regularmente.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. Puedes ver (casi) el código fuente de cualquier función&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;¿Curioso con lo que find() está haciendo? ¿No puedes recordar los parámetros de update()?  Simplemente ejecuta el comando sin los paréntesis y la consola mostrará su código fuenrte:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt; db.foo.update&lt;br /&gt;function (query, obj, upsert, multi) {&lt;br /&gt;assert(query, "need a query");&lt;br /&gt;assert(obj, "need an object");&lt;br /&gt;this._validateObject(obj);&lt;br /&gt;this._mongo.update(this._ fullName, query, obj, upsert ? true : false, multi ? true : false);&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Por instancia, si intentas imprimir el código de la función nativa Date.parse(), obtendrás lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt; Date.parse&lt;br /&gt;function parse() {&lt;br /&gt;[native code]&lt;br /&gt;}&lt;/Code&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. Puedes ejecutar cualquier programa&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Una característica de la consola poco conocida e indocumentada es que puedes ejecutar cualquier ejecutable desde la consola.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&amp;gt; runProgram("ls", "-l")&lt;br /&gt;sh7056| -rwxr-xr-x  1 root root 41224968 2010-06-01 18:21 mongo&lt;br /&gt;sh7056| -rwxr-xr-x  1 root root 41224968 2010-06-01 18:21 mongod&lt;br /&gt;sh7056| -rwxr-xr-x  1 root root 41224968 2010-06-01 18:21 mongodump&lt;br /&gt;sh7056| -rwxr-xr-x  1 root root 41195810 2010-06-01 18:21 mongoexport&lt;br /&gt;sh7056| -rwxr-xr-x  1 root root 41204267 2010-06-01 18:22 mongofiles&lt;br /&gt;sh7056| -rwxr-xr-x  1 root root 41237850 2010-06-01 18:22 mongoimport&lt;br /&gt;sh7056| -rwxr-xr-x  1 root root 41275461 2010-06-01 18:23 mongorestore&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-2150538387588514250?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/2150538387588514250/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=2150538387588514250&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/2150538387588514250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/2150538387588514250'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/mongodb-tres-consejos-para-la-consola.html' title='MongoDB: Tres consejos para la consola'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-652206955602631024</id><published>2010-11-29T08:17:00.000+01:00</published><updated>2010-11-29T08:17:01.496+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><title type='text'>MongoDB: Consejos sobre diseño de esquemas</title><content type='html'>El diseño de esquemas es una de las tareas más exigentes para nuevos usuarios de MongoDB. A menudo hay más de un modelo de datos viable, dependiendo de las necesidades de la aplicación, y los sacrificios han de ser medidos. Obtener un buen modelo de datos viene con la experiencia, y desde luego algo de experiencia con MongoDB es siempre útil. Pero si estás empezando, he aquí algunas ideas útiles a tener en mente.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Entender las características de MongoDB&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Entender el conjunto de características de MongoDB es el primer paso para decidir qué patrones de modelo de datos tienen sentido. Por instancia, la habilidad de indexar claves de array y documentos internos, hacen viable el modelo de riqueza de documento. Si estás teniendo problemas modelando datos, primero asegúrate que entiendes las características de las bases de datos. E incluso si eres un veternao con MongoDB, asegúrate de mantener las últimas actualizaciones. Los operadores $slice y $or, recientemente añadidos, por ejemplo, te permiten mucha más flexibilidad en algunos casos.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Uso de documentos ricos&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Parte de la belleza de MongoDB es su capacidad para almacenar estructuras de documentos ricos. Esto permite a los desarrolladores respresentar sus entidades de modelo de datos más holísticamente que lo que podrían hacer con una base de datos relacional. Mientras que en una base de datos relacional, una entidad producto puede ser dividida en docenas de tablas, el mismo producto puede guardarse en un documento simple en MongoDB. Que MongoDB pueda actuar en documentos ricos, usando la notación punto del lenguaje de consulta y una lista creciente de operadores de consulta y actualización, es la razón más convincente para considerar las estructuras ricas de documentos en tus esquemas.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;i&gt;Normalizar cuando sea necesario&lt;/i&gt;&lt;/b&gt;&lt;br /&gt;Con todo lo dicho, no hay nada malo al migrar hacia una representación más normalizada. Algunos desrrolladores sienten que MongoDB no debería ser usado para almacenar relaciones entre colecciones, pero esto no podría estar más lejos de la verdad. Es una práctica común usar múltiples colecciones cuando las entidades involucradas necesitan la máxima cantidad de flexibilidad. Por instancia, si se representan productos y reseñas, recomendamos normalmente tener una colección separada para cada una. Las reseñas necesitan ser actualizadas y consultadas en una variedad de formas, y usualmente tienen en sí mismas una estructura de documento rica, conteniendo votos y otras bondades, información de perfil de usuario, etc. Podría preocuparte que normalizar algo como esto sin joins es ineficiente, así que será necesaria más de una consulta para visualizar una página de productos y sus reseña. Pero MongoDB es muy rápido; un pequeño benchmarking muestra que múltiples consultas no serán un problema para mayor parte de los casos.&lt;br /&gt;&lt;br /&gt;Hay mucho más sobre el diseño de esquemas. La siguiente presentación aporta más información:&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px" id="__ss_4451821"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/kbanker/the-mongodb-metamorphosis-data-as-documents" title="The MongoDB Metamorphosis: Data as Documents"&gt;The MongoDB Metamorphosis: Data as Documents&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse4451821" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mongodb-railsconf-2010-100609084730-phpapp02&amp;stripped_title=the-mongodb-metamorphosis-data-as-documents" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse4451821" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mongodb-railsconf-2010-100609084730-phpapp02&amp;stripped_title=the-mongodb-metamorphosis-data-as-documents" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/kbanker"&gt;kbanker&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-652206955602631024?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/652206955602631024/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=652206955602631024&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/652206955602631024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/652206955602631024'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/mongodb-consejos-sobre-diseno-de.html' title='MongoDB: Consejos sobre diseño de esquemas'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-6706473794314821412</id><published>2010-11-29T08:16:00.001+01:00</published><updated>2010-11-29T08:16:00.542+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>MongoDB y Ruby</title><content type='html'>Estupenda presentación de Kyle Banker en la Mongo France celebrada el pasado día 21 de Junio en París, donde explica la sinergia de MongoDB y el lenguaje de programación Ruby, con multitud de ejemplos y casos. También expone casos de normalización y desnormalización, y cuándo embeber y anidar documentos. Muy interesante.&lt;br /&gt;&lt;br /&gt;&lt;div style="width:425px" id="__ss_4579837"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/kbanker/mongodb-and-ruby-mongodb-france-22-june-2010" title="MongoDB and Ruby - MongoDB France, 22 June, 2010 "&gt;MongoDB and Ruby - MongoDB France, 22 June, 2010 &lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse4579837" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mongodb-paris-ruby-100622182458-phpapp01&amp;stripped_title=mongodb-and-ruby-mongodb-france-22-june-2010" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse4579837" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mongodb-paris-ruby-100622182458-phpapp01&amp;stripped_title=mongodb-and-ruby-mongodb-france-22-june-2010" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/kbanker"&gt;kbanker&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-6706473794314821412?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/6706473794314821412/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=6706473794314821412&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6706473794314821412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6706473794314821412'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/mongodb-y-ruby.html' title='MongoDB y Ruby'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-8291643912049150662</id><published>2010-11-29T08:15:00.001+01:00</published><updated>2010-11-29T08:15:18.669+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><title type='text'>MongoDB: Presentación sobre la fragmentación</title><content type='html'>Interesante presentación de Eliot Horowitz que esboza en líneas generales cómo será la característica de fragmentación en MongoDB.&lt;br /&gt;&lt;div style="width:425px" id="__ss_3926127"&gt;&lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/mongosf/sharding-with-mongodb-eliot-horowitz" title="Sharding with MongoDB (Eliot Horowitz)"&gt;Sharding with MongoDB (Eliot Horowitz)&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse3926127" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=2010-mongosf-sharding-100501004614-phpapp02&amp;stripped_title=sharding-with-mongodb-eliot-horowitz" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse3926127" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=2010-mongosf-sharding-100501004614-phpapp02&amp;stripped_title=sharding-with-mongodb-eliot-horowitz" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="padding:5px 0 12px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/mongosf"&gt;MongoSF&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-8291643912049150662?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/8291643912049150662/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=8291643912049150662&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/8291643912049150662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/8291643912049150662'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/mongodb-presentacion-sobre-la.html' title='MongoDB: Presentación sobre la fragmentación'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-1086121960510777843</id><published>2010-11-29T08:14:00.001+01:00</published><updated>2010-11-29T08:14:31.525+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><title type='text'>Minitutorial: Vistazo rápido a MongoDB</title><content type='html'>En las próximas líneas se presenta un pequeño y rápido tutorial que abarca las nociones más básicas y elementales de MongoDB y la consola &lt;code&gt;mongo&lt;/code&gt;. Este minitutorial está extraído del Tiny MongoDB Browser Shell (&lt;a href="http://try.mongodb.org"&gt;http://try.mongodb.org&lt;/a&gt;), el cual recomiendo utilizar para una toma de contacto y entender los conceptos.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. Consola JavaScript&lt;/b&gt;&lt;br /&gt;La primera cosa a destacar es que la consola MongoDB está basada en JavaScript.&lt;br /&gt;De esta manera, puedes hacer cosas como éstas:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;a = 5; &lt;br /&gt;a * 10; &lt;br /&gt;for(i=0; i&lt;10; i++) { print('hello'); };&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. Documentos&lt;/b&gt;&lt;br /&gt;MongoDB es una base de datos basada en documentos. Esto significa que almacenamos los datos como documento, lo cual es similar a los objetos JavaScript. A continuación hay algunos objetos JS de muestra:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;var a = {age: 25}; &lt;br /&gt;var n = {name: 'Ed', languages: ['c', 'ruby', 'js']}; &lt;br /&gt;var student = {name: 'Jim', scores: [75, 99, 87.2]};&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. Guardar&lt;/b&gt;&lt;br /&gt;He aquí cómo se guarda un documento en MongoDB:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;db.scores.save({a: 99}); &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Esto dice, "guarda el documento '{a: 99}' en la colección 'scores'."&lt;br /&gt;&lt;br /&gt;Para ver si el documento fue guardado:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;db.scores.find();&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4. Guardar y consultar&lt;/b&gt;&lt;br /&gt;Lo siguiente añade algunos documentos a la colección scores:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;for(i=0; i&amp;lt;10; i++) { db.scores.save({a: i, exam: 5}) }; &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Al escribir &lt;br /&gt;&lt;br /&gt;&lt;code&gt;db.scores.find(); &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Verás si se guardaron correctamente. Desde la consola sólo se visualizan 10 resultados al mismo tiempo, por lo que neceistarás el comando 'it' para iterar sobre el resto.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5. Consultas básicas&lt;/b&gt;&lt;br /&gt;Vamos a realizar consultas más específicas, por ejemplo, consultando todos los documentos donde a == 2:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;db.scores.find({a: 2});&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;o todos los documentos donde a &amp;gt; 15:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;db.scores.find({a: {'$gt': 15}}); &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;6. Operadores de consulta&lt;/b&gt;&lt;br /&gt;$gt es uno de los operadores especiales de consulta. He aquí algunos otros:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$lt  - '&amp;lt;',   $lte - '&amp;lt;=', &lt;br /&gt;$gte - '&amp;gt;=',  $ne  - '!='&lt;br /&gt;$in - 'está en un array',  $nin - '! (no) en array'&lt;br /&gt;&lt;br /&gt;db.scores.find({a: {'$in': [2, 3, 4]}}); &lt;br /&gt;db.scores.find({a: {'$gte': 2, '$lte': 4}}); &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;7. Actualizaciones&lt;/b&gt;&lt;br /&gt;Vamos a crear un par de documentos para actualizarlos después:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;db.users.save({name: 'Johnny', languages: ['ruby', 'c']}); &lt;br /&gt;db.users.save({name: 'Sue', languages: ['scala', 'lisp']}); &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Asegúrate de que se han guardado llamando a db.users.find()&lt;br /&gt;&lt;br /&gt;Actualizaremos el primer documento mediante:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;db.users.update({name: 'Johnny'}, {name: 'Cash', languages: ['english']}); &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;8. Operadores de actualización&lt;/b&gt;&lt;br /&gt;La anterior actualización reemplazó el documento entero, pero MongoDB también soporta actualizaciones parciales en los documentos. Por ejemplo, para establecer un valor:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;db.users.update({name: 'Cash'}, {'$set': {'age': 50} }); &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;También puedes poner (push) y extraer (pull) elementos de los arrays:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;db.users.update({name: 'Sue'}, {'$pull': {'languages': 'scala'} }); &lt;br /&gt;db.users.update({name: 'Sue'}, {'$push': {'languages': 'ruby'} }); &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;9. Eliminar datos&lt;/b&gt;&lt;br /&gt;Para eliminar todo en una colección:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;db.scores.remove();&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Para eliminar sólo los documentos coincidentes, agrega un selector de consulta al método remove:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;db.users.remove({name: 'Sue'});&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;10. ¿Lo siguiente?&lt;/b&gt;&lt;br /&gt;Hay mucho más que lo mostrado en este minitutorial. Si te ha interesado, te animo a que te descargues MongoDB (&lt;a href="http://www.mongodb.org/display/DOCSES/Descarga"&gt;http://www.mongodb.org/display/DOCSES/Descarga&lt;/a&gt;) y lo pruebes. También puedes consultar la documentación (&lt;a href="http://www.mongodb.org/display/DOCSES/Inicio"&gt;http://www.mongodb.org/display/DOCSES/Inicio&lt;/a&gt;) para más información.&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-1086121960510777843?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/1086121960510777843/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=1086121960510777843&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/1086121960510777843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/1086121960510777843'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/minitutorial-vistazo-rapido-mongodb.html' title='Minitutorial: Vistazo rápido a MongoDB'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-6503404336536232074</id><published>2010-11-29T08:13:00.001+01:00</published><updated>2010-11-29T08:13:31.140+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><title type='text'>MongoDB: Consistencia distribuida. Parte 6</title><content type='html'>El siguiente diagrama (click para verlo en grande) muestra varios modelos de consistencia que han sido discutidos en esta serie. Los modos de consistencia fuerte generalmente encuentran los requerimientos de los modos débiles, y así de este modo se muestran como subconjuntos en este diagrama tipo Venn.&lt;br /&gt;&lt;br /&gt;Ten en mente que para muchos productos, la consistencia es afinable: un producto no pertenece necesariamente a un rectángulo en particular, pero una opración dada ciertamente lo es.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://i44.tinypic.com/2h3vb6p.png"&gt;&lt;img src="http://i44.tinypic.com/2h3vb6p.png" width="500"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;* Consistencia eventual - la consistencia eventual definica por Amazon en el papel dynamo.&lt;br /&gt;* Consistencia de lectura monotónica - Una forma estricta de consistencia eventual.&lt;br /&gt;* Consistencia lee-tus-propias-escrituras - una forma estricta de consistencia eventual.&lt;br /&gt;* MRC + RYOW - un sistema con propiedades lectura monotónica más lee-tus-propias-escrituras. Un sistema de replicación maestro-maestro, donde un cliente dado siempre interactúa con un maestro simple, podría tener estas propiedades.&lt;br /&gt;* Consistencia inmediata - un sistema que es inmediatamente consistente pero que no soporta operaciones atómicas. Los sitemas de quorum stricto, donde R+W&gt;N, conocen este criterio (y teóricamente podrían hacer más, depende del diseño).&lt;br /&gt;* Consistencia fuerte - un sistema que soporta operaciones lectura/escritura atómicas en entidades simples de datos. Este es el modo por defecto de MongoDB.&lt;br /&gt;* Transacciones completas - Oracle&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Fuente: &lt;a href="http://blog.mongodb.org/post/523516007/on-distributed-consistency-part-6-consistency-chart"&gt;http://blog.mongodb.org/post/523516007/on-distributed-consistency-part-6-consistency-chart&lt;/a&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-6503404336536232074?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/6503404336536232074/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=6503404336536232074&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6503404336536232074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6503404336536232074'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/mongodb-consistencia-distribuida-parte_2789.html' title='MongoDB: Consistencia distribuida. Parte 6'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://i44.tinypic.com/2h3vb6p_th.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-7662265206868461759</id><published>2010-11-29T08:12:00.002+01:00</published><updated>2010-11-29T08:12:44.461+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><title type='text'>MongoDB: Consistencia distribuida. Parte 5</title><content type='html'>En la &lt;a href="http://mongospanish.blogspot.com/2010/04/consistencia-distribuida-parte-2.html"&gt;parte 2&lt;/a&gt; hablamos someramente sobre consistencia eventual de "escritor simple". Aquí discutiremos sobre muchos escritores, y definiremos este término con más precisión.&lt;br /&gt;&lt;br /&gt;Por "muchos escritores" nos referimos a un sistema donde diferentes servidores de datos pueden recibir concurrentemente escrituras (y asíncronas). Algunos ejemplos de sistemas que reciben escrituras eventualmente consistentes:&lt;br /&gt;&lt;br /&gt;* Amazon Dynamo&lt;br /&gt;* Replicación CouchDB maestro-maestro&lt;br /&gt;&lt;br /&gt;Con la consistencia eventual multi-escritora, necesitamos direccionar el fenómeno de conflicto de escrituras. Las escrituras a dos servidores al mismo tiempo pueden actualizar el mismo objeto. Hemos de solucionar el conflicto de una manera que sea aceptable para el caso en cuestión. Algunas soluciones podrían ser:&lt;br /&gt;&lt;br /&gt;* Última escritura gana&lt;br /&gt;* Fusión programática&lt;br /&gt;* Operaciones conmutativas&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Última escritura gana&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Última escritura gana es un popular método por defecto en muchos sistemas. Si recibimos una operación que es antigua, simplemente la ignoramos. En un sistema distribuido, la definición de "último" es tan duro que los relojes no pueden ser sincronizados perfectamente. Así que muchos sistemas utilizan un vector de relojes.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Inserciones&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Sorprendentemente, una operación tradicional de inserción es delicada con muchos escritores. Considera estas operaciones realizadas al mismo tiempo en diferentes servidores:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;op1: insert( { _id : 'joe', age : 30 } )&lt;br /&gt;op2: insert( { _id : 'joe', age : 33 } )&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Si aplicamos nativamente estas dos operaciones en cualquier orden, obtendremos un resultado inconsistente. Insertar significa típicamente:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;if( !already_exists(x._id) ) then set( x );&lt;br /&gt;si( !ya_existe(x._id) ) entonces establece( x );&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Sin embargo, con la consistencia eventual no tenemos un estado global en tiempo real. Verificar already_exists() es delicado.&lt;br /&gt;&lt;br /&gt;La mejor solución no es soportar la inserción, si no más bien set() (establece()) - por ejemplo, "establece un nuevo valor".  A veces, a ésto se le llama un upsert.  Entonces, si tenemos semánticas última-escritura-gana, todo va bien.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Eliminaciones&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;La eliminaciones requieren de una manipulación especial en caso de objetos renacidos. Considera esta secuencia:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;op1: set( { _id : 'joe', age : 40 } }&lt;br /&gt;op2: delete( { _id : 'joe' } )&lt;br /&gt;op3: set( { _id : 'joe', age : 33 } )&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Si op2 y op3 invierten el orden de ejecución, podríamos tener un problema. Así que necesitamos recordar el borrado por un momento, y aplicar semánticas de última-operación-gana.  Algunos productos llaman al recuerdo del borrado una lápida.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Actualizaciones&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Las actualizaciones tienen un asunto similar a las inserciones, así que para las actualizaciones, usamos la operación set() tal y como se describió anteriormente.&lt;br /&gt;&lt;br /&gt;Nótese que las actualizaciones parciales de objeto pueden ser delicadas para replicar de forma eficiente. Considera una operación set() donde deseamos actualizar un simple campo:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;  update users set age=40 where _id=’joe’&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Esto no es problema con la consistencia eventual si replicamos una copia completa del objeto. Sin embargo, ¿qué ocurre si el objeto del usuario tenía 1MB de tamaño? Esto debería ir bien enviando el campo de la nueva edad y el _id, en lugar del objeto completo. Sin embargo, esto es difícil. Considera:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;op1: update users set age=40 where _id='joe'&lt;br /&gt;op2: update users set state='ca' where _id='joe'&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;No podemos replicar simplemente la actualización parcial y usar el método última-escritura-gana; la base de datos neceitará más sofisticación para manipular ésto de manera eficiente.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Fusión programática&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;El método última-escritura-gana es buena, pero no siempre es suficiente. Tener que resolver mediante la aplicación cliente el conflico mediante una fusión es una buena alternativa. Consideremos un ejemplo mencionado en el Papel de Amazon Dynamo: manipulaciones de carritos de la compra. Con una consistencia eventual podría no ser seguro hacer algo como:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;update cart set this[our_sku].qty=1 where _id='joe'&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Si hay múltiples manipulaciones del carrito, algunas podrían perderse utilizando el método última-escritura-gana. En su lugar, el papel de Dynamo habla sobre almacenar las operaciones en el objeto carrito, en lugar del estado actual de los datos. Podríamos almacenar algo como:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;update cart append { time : now(), op : 'addToCart', sku : our_sku, qty : 1 }&lt;br /&gt;where _id='joe'&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Cuando ocurra un conflicto, los objetos carrito pueden ser fusionados. No perdemos ninguna operación. Cuando llega la hora de comprar (check out), reproducimos todas las operaciones, lo cual podría incluir ajuste de cantidades y eliminaciones desde el carrito. Después de la reproducción tenemos el estado final del carrito.&lt;br /&gt;&lt;br /&gt;Los ejemplos anteriores utilizan un campo timestamp - en un sistema real se puede usar un vector para ordenar las operaciones en el carrito.&lt;br /&gt;&lt;br /&gt;Es interesante notar que no sólo hemos evitado conflictos, si no que también somos capaces de realizar operaciones donde la atomicidad sería requerida.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Operaciones conmutativas&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Si todas las operaciones son conmutativas (más precisamente, &lt;a href="http://en.wikipedia.org/wiki/Fold_(higher-order_function)"&gt;plegables&lt;/a&gt;), nunca tendremos ningún conflicto. Las operaciones pueden ser aplicadas simplemente en cualquier orden, y el resultado sería el mismo. Por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;// x starts as { }&lt;br /&gt;x.increment('a', 1);&lt;br /&gt;x.increment('a', 3);&lt;br /&gt;x.addToSet('b', 'foo');&lt;br /&gt;x.addToSet('b', 'bar');&lt;br /&gt;result: { a : 4, b : {bar,foo} }&lt;br /&gt;&lt;br /&gt;// x starts as { }&lt;br /&gt;x.addToSet('b', 'bar');&lt;br /&gt;x.increment('a', 3);&lt;br /&gt;x.increment('a', 1);&lt;br /&gt;x.addToSet('b', 'foo');&lt;br /&gt;result: { a : 4, b : {bar,foo} }&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Sin embargo la composición de addToSet e increment podría no ser plegable; de este modo, tenemos que usar sólo uno o el otro para un campo particular del objeto.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Fuente: &lt;a href="http://blog.mongodb.org/post/520888030/on-distributed-consistency-part-5-many-writer"&gt;http://blog.mongodb.org/post/520888030/on-distributed-consistency-part-5-many-writer&lt;/a&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-7662265206868461759?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/7662265206868461759/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=7662265206868461759&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/7662265206868461759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/7662265206868461759'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/mongodb-consistencia-distribuida-parte_8093.html' title='MongoDB: Consistencia distribuida. Parte 5'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-5043768151161551272</id><published>2010-11-29T08:11:00.003+01:00</published><updated>2010-11-29T08:11:48.460+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><title type='text'>MongoDB: Consistencia distribuida. Parte 4</title><content type='html'>La consistencia eventual hace más fácil el almacenamiento de datos en un centro multi-datos. Hay razones por las que la consistencia eventual es útil para centros multi-datos que no están relatados para la disponibilidad y CAP. Como se mencionó en la &lt;a href="http://mongospanish.blogspot.com/2010/04/consistencia-distribuida-parte-3.html"&gt;parte 3&lt;/a&gt;, algunos tipos comunes de particiones de red, tales como la pérdida de un centro de datos entero, son actualmente &lt;a href="http://i40.tinypic.com/30rxiyu.jpg"&gt;particiones de red triviales&lt;/a&gt; y pueden incluso no tener efecto de disponibilidad de todos modos.&lt;br /&gt;&lt;br /&gt;Hay algunas arquitecturas para el almacenamiento de datos en un centro multi-datos:&lt;br /&gt;&lt;br /&gt;* DR&lt;br /&gt;* Región simple&lt;br /&gt;* Lecturas locales, escrituras remotas&lt;br /&gt;* Búsqueda inteligente&lt;br /&gt;* Consistencia eventual&lt;br /&gt;&lt;br /&gt;&lt;b&gt;DR&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Por DR nos referimos a una arquitectura tradicional de continuidad desastre recuperación / negocio. Es bastante simple: servimos cualquier cosa desde un centro de datos, con replicación a una facilidad secundaria que está offline. En un fallo transferimos todo de forma sincronizada.&lt;br /&gt;&lt;br /&gt;La disponibilidad puede ser muy alta en este modelo, cuando cualquier asunto sobre el primer centro de datos, incluyendo las particiones de red internas, transferimos sincronizadamente, y con todo el primer centro de datos desactivado, la partición es trivial.&lt;br /&gt;&lt;br /&gt;Este modelo funciona bien con consistencia fuerte.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Centro multi datos, Región simple&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Esta opción es análoga a usar múltiples centros de datos dentro de una región simple. Amazon y DoubleClick han usado este esquema en el pasado. Tenemos múltiples centros de datos, separados físicamente, pero todo dentro de una región (por ejemplo, el Noroeste).  La latencia entre centros de datos es entonces razonable: si permanecemos dentro de un radio de 150 millas, podemos tener transmisiones de cerca de 5 milisegundos. Podríamos tener un anillo de fibra entre digamos, 3 o 4 centros de datos. Como la latencia es razonable, para muchos problemas, una operación WAN aquí está bien. Con una topología de anillo, una partición de red no-trivial es poco probable.&lt;br /&gt;&lt;br /&gt;La región simple es útil tanto para arquitecturas de consistencia fuerte como para consistencia eventual. Con un producto del estilo Dynamo, cuando N=W ó N=R, esta es una buena opción, por lo demás cuando se usan múltiples centros de datos tendremos un tiempo de espera grande para confirmar escrituras remotas.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Lecturas locales, Escrituras remotas&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Para casos de lectura pesada, esta es una buena opción. Aquí leemos datos eventualmente consistentes (fácil con la mayor parte de productos de base de datos, incluyendo sistemas RDBMS), pero haciendo que todas las escrituras vuelvan a la facilidad maestro sobre la WAN. Un sistema del estilo dynamo en un cento de datos múltiple con un muy alto valor W y un bajo valor R puede ser también considerado de esta manera.&lt;br /&gt;&lt;br /&gt;Este patrón debería funciona muy bien para gestión de contenidos tradicionales: publicar no es frecuente, y leer es muy frecuente.&lt;br /&gt;&lt;br /&gt;Usar una Red de Entrega de Contenidos (Content Delivery Network (CDN)), con un sitio web origen centralizado sirviendo contenidos dinámicos, es otro ejemplo.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Búsqueda inteligente&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Discutimos un poco sobre "Búsqueda Inteligente" (“Intelligent Homing”) en la &lt;a href="http://mongospanish.blogspot.com/2010/04/consistencia-distribuida-parte-3.html"&gt;parte 3&lt;/a&gt;. La idea es almacenar la copia maestra de una entidad de datos dada cerca de su usuario.&lt;br /&gt;&lt;br /&gt;Esto funciona funciona muy bien si los datos se correlacionan con el usuario, como el perfil del usuario, la bandeja de entrada, etc&lt;br /&gt;&lt;br /&gt;Tenemos rápidas escrituras confirmadas localmente. Si un centro de datos se cae completamente, podríamos estar aún a prueba de fallos sobre el estado maestro a cualquier lugar donde haya una réplica.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Consistencia eventual&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;La consistencia eventual de muchos-escritores nos brinda dos beneficios con centros de datos múltiples:&lt;br /&gt;&lt;br /&gt;* altísima disponibilidad en el caso de apagones de red;&lt;br /&gt;* rápidas escrituras confirmadas localmente&lt;br /&gt;&lt;br /&gt;En el diagrama de debajo, un cliente de un sistema del estilo dynamo escribe los datos a cuatro servidores (N=4). Sin emabargo, únicamente espera confirmación de las escrituras de dos servidores en su centro de datos local, para mantener la latencia baja en la confirmación de escritura.&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;img src="http://i43.tinypic.com/2dbtgg5.png"&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;Nótese sin embargo que si R+W &gt; N, no podemos tener rápidas lecturas y escrituras locales al mismo tiempo si todos los centros de datos son pares iguales.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Combinaciones&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Las combinaciones a menudo tienen sentido. Por ejemplo, es común mezclar DR y Lectura Local / Escritura Remota.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Fuente: &lt;a href="http://blog.mongodb.org/post/516567520/on-distributed-consistency-part-4-multi-data-center"&gt;http://blog.mongodb.org/post/516567520/on-distributed-consistency-part-4-multi-data-center&lt;/a&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-5043768151161551272?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/5043768151161551272/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=5043768151161551272&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/5043768151161551272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/5043768151161551272'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/mongodb-consistencia-distribuida-parte_2604.html' title='MongoDB: Consistencia distribuida. Parte 4'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://i43.tinypic.com/2dbtgg5_th.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-2785822435440248751</id><published>2010-11-29T08:11:00.001+01:00</published><updated>2010-11-29T08:11:01.563+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><title type='text'>MongoDB: Consistencia distribuida. Parte 3</title><content type='html'>Es fascinante que la sentencia formal del teorema para CAP, en la primera &lt;a href="http://lpd.epfl.ch/sgilbert/pubs/BrewersConjecture-SigAct.pdf"&gt;prueba&lt;/a&gt; no usa la palabra partición.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Teorema 1.&lt;/b&gt; &lt;i&gt;Es imposible en el modelo asíncrono de red para implementar un objeto de datos lectura/escritura que garantice las siguientes propiedades:&lt;br /&gt;• Disponibilidad&lt;br /&gt;• Consistencia atómica en todas las ejecuciones aceptables (incluyendo aquellas en las que los mensajes están perdidos).&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Lo dicho, hablemos sobre las particiones, como "mensajes perdidos...en el modelo de red asíncrono" es directamente análogo. &lt;br /&gt;&lt;br /&gt;Echemos un vistazo a un ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;img src="http://i39.tinypic.com/30aykvr.png"&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;En el diagrama anterior, la red está particionada. Las mitades izquierda y derecha (quizá éstas correspondan a dos continentes) no se pueden comunicar del todo. Cuatro clientes y cuatro nodos de servidor de datos son mostrados en el diagrama. Así que ¿cuáles son nuestras opciones?&lt;br /&gt;&lt;br /&gt;1. Denegar todas las escrituras. Si denegamos todas las escrituras entonces la red está particionada, podemos aún escribir datos completamente consistentes en ambos lados. Así que ésta es una opción. Obtenemos disponibilidad para escribir, y consistencia sostenida.&lt;br /&gt;2. Permitir escrituras en un lado. Mediante algún tipo de mecanismo de consenso, podríamos dejar que un lado de la partición "gane" y tener un maestro (mostrado en el diagrama con "M"). En este caso, las lecturas y escrituras podrían ocurrir en ese lado. En otras particiones no-maestras, podríamos tanto (a) ser estrictos y no permitir operaciones, o (b) permitir lecturas eventualmente consistentes, pero no escrituras. Así, en esta situación tenemos consistencia completa en una partición, y operación parcial en el resto.&lt;br /&gt;3. Permitir lecturas y escrituras en todas las particiones. Aquí, mantenemos disponibilidad, pero debemos sacrificar consistencia fuerte. Una partición no verá las operaciones y el estado de la otra hasta que la red sea restaurada. Una vez restaurada, necesitaremos un método para fusionar las operaciones que ocurrieron mientras estaba desconectado.&lt;br /&gt;&lt;br /&gt;Una técnica de mitigación también viene a la mente. Supón que un cliente particular C tenga mucha más probabilidad de necesitar una entidad X que otros clientes. Si almacenamos la copia maestra de X en un servidor dedicado a C, incrementamos la probabilidad de que C pueda leer y escribir X en la anterior opción (2). Llamemos a ésto "buscador inteligente". Un ejemplo del mundo real de ésto podría ser "almacenar copias maestras de datos para los usuarios de la costa este en la costa este". La búsqueda inteligente no soluciona nuestros problemas, pero podría probablemente reducir su frecuencia.&lt;br /&gt;&lt;br /&gt;Afortunadamente lo anterior es una buena "prueba" informal de CAP. Es realmente bastante simple. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Particiones de red triviales&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Muchas particiones de red comunes son lo que nosotros podemos denominar triviales. Considerémoslo desde la perspectiva de la anterior opción (2). Definimos que una partición de red trivial es una tal que en todas las particiones no-maestras, no hay  &lt;br /&gt;&lt;br /&gt;* clientes vivos en todos, o &lt;br /&gt;* servidores en todos&lt;br /&gt;&lt;br /&gt;Por ejemplo si tenemos muchos centros de datos y nuestros clientes son navegadores web de Internet, y uno de nuestros centros de datos se hace completamente oscuro (y nos quedan más), es una partición de red trivial (asumimos aquí que podemos fallar sobre el estado maestro en tal situación). Asimimismo, perder un estante simple en su integridad es a menudo una partición de red trivial.&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;img src="http://i43.tinypic.com/9rlwdz.png"&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;En estas situaciones, puede aún ser consistente y disponible. (Bien, para los clientes particionados, estamos no disponibles, pero por supuesto es una certeza si no puede alcanzar ningún servidor en ningún sitio)&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Fuente: &lt;a href="http://blog.mongodb.org/post/505822180/on-distributed-consistency-part-3-network"&gt;http://blog.mongodb.org/post/505822180/on-distributed-consistency-part-3-network&lt;/a&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-2785822435440248751?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/2785822435440248751/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=2785822435440248751&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/2785822435440248751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/2785822435440248751'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/mongodb-consistencia-distribuida-parte_4106.html' title='MongoDB: Consistencia distribuida. Parte 3'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://i39.tinypic.com/30aykvr_th.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-4094480601535137805</id><published>2010-11-29T08:10:00.001+01:00</published><updated>2010-11-29T08:10:15.577+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><title type='text'>MongoDB: Consistencia distribuida. Parte 2</title><content type='html'>En la &lt;a href="http://mongospanish.blogspot.com/2010/04/consistencia-distribuida-parte-1.html"&gt;parte 1&lt;/a&gt;, discutimos los comportamientos de la clase C y la clase A. Para la clase A, necesitamos restriccciones de consistencia débiles. Esto no significa que el sistema necesite estar completamente inconsistente, pero ello significa que necesitaremos relajar el modelo de consistencia a alguna extensión. &lt;br /&gt;&lt;br /&gt;Amazon popularizó el concepto de "Consistencia eventual". Su &lt;a href="http://queue.acm.org/detail.cfm?id=1466448"&gt;definición&lt;/a&gt; es:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;el sistema de almacenamiento garantiza que si no se realizan nuevas actualizaciones al objeto, eventualmente todos los accesos retornarán el último valor actualizado&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Esto no es nuevo, pero es grande tener el concepto formalizado/popularizado: Unos pocos ejemplos de sistemas eventualmente consistentes:&lt;br /&gt;&lt;br /&gt;1. DNS &lt;br /&gt;2. Replicación asíncrona maestro/esclavo en un RDBMS (también en MongoDB)&lt;br /&gt;3. memcached en frente de mysql, cacheando lecturas&lt;br /&gt;&lt;br /&gt;Muchos (no todos) ejemplos tradicionales que vienen a la mente tienen lecturas eventualmente consistentes, excepto un escritor simple (por "escritor simple" entendemos un servidor de datos, no los clientes). Las cosas se consiguen más interesantes - y complejas - cuando hay muchos escritores. Amazon Dynamo es un ejemplo de sistema de "muchos escritores eventualmente consistentes". Todo lo anterior sea quizás "escritor simple eventualmente consistente".&lt;br /&gt;&lt;br /&gt;Cabe destacar otra tecnología tracional que son las colas de mensajes. Estas tienen propiedades reminiscentes de consistencia eventual.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Formas de consistencia&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Tomemos un vistazo a un ejemplo particular. Considera un sistema usando MongoDB en la siguiente configuración:&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;img src="http://i41.tinypic.com/35lw00x.jpg"&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;“master” (maestro), “slave” (esclavo), y “slave” podrían ser instancias mongo por ejemplo - u otras bases de datos con replicación asíncrona. Los clientes leen aleatoriamente de cualquier esclavo para una consulta dada, y siempre escribe en el maestro. Dos esclavos y dos clientes son mostrados, pero se asume que cada uno de ellos escalan horizontalmente (scale out)&lt;br /&gt;&lt;br /&gt;Este tipo de sistema es lo que calificamos como "escritor simple de consistencia eventual". Así que ¿cuáles son sus propiedades? (1) Un cliente puede leer datos antiguos. (2) El cliente podría ver operaciones de escritura fuera de servicio.&lt;br /&gt;&lt;br /&gt;Supongamos que estamos almacenando alguna entidad x en el repositorio. Asumimos que las entidades tienen un valor inicial de cero. Hay una serie de escrituras a x por clientes:&lt;br /&gt;&lt;br /&gt;W(x=3), W(x=7), W(x=5)&lt;br /&gt;&lt;br /&gt;Debido a que el sistema es eventualmente consistente, si las escrituras a x se detienen en algún punto, sabemos que leeremos eventualmente 5 — que es, R(x==5).  Sin embargo a corto plazo un cliente podría por ejemplo ver:&lt;br /&gt;&lt;br /&gt;R(x==7), R(x==0), R(x==5), R(x==3)&lt;br /&gt;&lt;br /&gt;(Nota: más nodos que 2 esclavos son necesarios para este ejemplo de comportamiento)&lt;br /&gt;&lt;br /&gt;Así que es nuestra forma más débil - eventualmente consistente con lecturas fuera de servicio a corto plazo. &lt;br /&gt;&lt;br /&gt;Podemos hacer ésto más fuerte. considera la configuración mongodb &lt;a href="http://compoundthinking.com/blog/index.php/2009/07/16/turbogears-on-sourceforge/"&gt;SourceForge&lt;/a&gt;  (&lt;a href="http://compoundthinking.com/blog/wp-content/uploads/2009/07/sfconsume.png"&gt;diagrama grande aquí&lt;/a&gt;).  Esta configuración es eventualmente consistente, pero no veremos el resultado de las escrituras fuera de servicio. Esto provee &lt;i&gt;consistencia de lectura monotónica&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;img src="http://compoundthinking.com/blog/wp-content/uploads/2009/07/sfconsume.png"&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;Una posible propiedad de consistencia eventual es la consistencia &lt;i&gt;lee-tus-propias-escrituras&lt;/i&gt;, lo que significa que un proceso está garantizado para ver que las escrituras se han hecho cuando se han leído. Esta es una propiedad muy útil que hace la programación más fácil. Nótese que ninguno de los ejemplos de arriba proveen consistencia lee-tus-propias-escrituras. También el valor a considerar con este modelo es la definición de "tu". En una aplicación web, que puede ser el usuario. Si el balanceador de carga del sistema envía peticiones a diferentes servidores de aplicaciones, tener consistencia lee-tu-propia-escritura para un servidor de aplicaciones simple no soluciona la necesidad de consistencia en el mundo real.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Caso de uso checklist EC&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Así que cuando se usa consistencia eventual, es bueno para la arquitectura preguntarse:&lt;br /&gt;&lt;br /&gt;* ¿mi caso de uso puede tolerar lecturas antiguas?&lt;br /&gt;* ¿puede tolerar lectura de valores fuera de servicio? si no, ¿es mi configuración de lectura monotónica consistente?&lt;br /&gt;* ¿puede tolerar no leer mis propias escrituras? si no, ¿es mi configuración lee-tu-propia-escritura consistente?&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Fuente: &lt;a href="http://blog.mongodb.org/post/498145601/on-distributed-consistency-part-2-some-eventual"&gt;http://blog.mongodb.org/post/498145601/on-distributed-consistency-part-2-some-eventual&lt;/a&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-4094480601535137805?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/4094480601535137805/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=4094480601535137805&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/4094480601535137805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/4094480601535137805'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/mongodb-consistencia-distribuida-parte_29.html' title='MongoDB: Consistencia distribuida. Parte 2'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://i41.tinypic.com/35lw00x_th.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-7414460330065471985</id><published>2010-11-29T08:09:00.001+01:00</published><updated>2010-11-29T08:09:32.828+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><title type='text'>MongoDB: Consistencia distribuida. Parte 1</title><content type='html'>Para las bases de datos distribuidas, los modelos de consistencia son un tópico de gran importancia. Nos gustaría hurgar un poco más en profundidad en este tópico con una serie de artículos, discutiendo asuntos tales como qué modelo es correcto para un caso de uso en particular. &lt;br /&gt;&lt;br /&gt;Empezaremos aquí con una introducción básica sobre este tema.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;CAP&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;El &lt;a href="http://portal.acm.org/citation.cfm?id=564585.564601"&gt;teorema de CAP&lt;/a&gt; (Capability (Capacidad), Availability (Disponibilidad) y Partitions (Particiones)) plantea que uno puede sólo tener dos características al mismo tiempo de consistencia, disponibilidad y tolerancia a particiones de red. En sistemas distribuidos, el particionamiento de red es inevitable y debe ser torleado, así que el CAP esencial significa que no podemos tener tanto consistencia como disponibilidad al 100%. &lt;br /&gt;&lt;br /&gt;Informalmente, deberíamos resumir el teorema de CAP como:&lt;br /&gt;&lt;br /&gt;* Si la red se cae, tu base de datos no funcionará.&lt;br /&gt;&lt;br /&gt;Sin embargo, hemos de afinar la definición de "no funcionará". Esto puede significar tanto caída (no disponible) como inconsistencia (datos viejos).&lt;br /&gt;&lt;br /&gt;¿Qué queremos decir -más precisamente- con "consistencia"? El trabajo académico en este área se refiere a "una copia de serializabilidad" o &lt;a href="http://portal.acm.org/citation.cfm?id=78969.78972"&gt;"linearizabilidad"&lt;/a&gt;. Si una serie de operaciones o transacciones son realizadas, éstas son aplicadas en un orden consistente. Una forma menos formal de pensar sobre compensación sería "¿Podría leer y manipular datos viejos/contaminados? ¿Puedo siempre escribir?"&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Encarnaciones&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Tenemos dos clases de arquitectura: una clase C (fuertemente consistente) y una clase A (alta disponibilidad con pérdida de consistencia). Consideremos algunos sistemas distribuidos del mundo real y dónde están clasificados.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.127.6956"&gt;Amazon Dynamo&lt;/a&gt; es un repositorio de datos distribuido, el cual implementa &lt;a href="http://weblogs.java.net/blog/2007/11/27/consistent-hashing"&gt;hashing consistente&lt;/a&gt; y que está en el grupo A. Provee consistencia eventual. Uno puede leer datos antiguos.&lt;br /&gt;&lt;br /&gt;CouchDB es típicamente utilizada con replicación asíncrona maestro-maestro, y está en el grupo A. Provee consistencia eventual.&lt;br /&gt;&lt;br /&gt;Un cluster MongoDB auto-fragmentación+replicación tiene un servidor maestro y un punto dado en el tiempo para cada fragmento (shard). Éste está en el grupo C. Los sistemas RDBMS tradicionales también tienen consistencia fuerte (como son típicamente utilizadas) - un cluster RDBMS síncrono, por ejemplo.&lt;br /&gt;&lt;br /&gt;Cabe destacar que las configuraciones alternativas de estos productos a veces alteran su propiedades de consistencia (y rendimiento). Para nuestra discusión aquí, asumiremos que estos productos están configurados en su caso común, a menos que se indique otra cosa.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Disponibilidad para escritura, no disponibilidad para lectura, es la cuestión principal&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Con la mayor parte de las bases de datos actuales, es fácil tener cualquier número de réplicas asíncronas distribuidas en el mundo. Si se particionan las redes, debemos tener entonces acceso a los datos esclavos locales. Cuando la replicación es asíncrona, estos datos son eventualmente consistentes, así que este resultado no es sorprendente - estamos ahora en la clase A de sistemas. Sin embargo, casi todos los diseños, incluso de la clase C, pueden añadir fácilmente capacidades de lectura asíncrona. Así, las decisiones de diseño crítico son sobre la capacidad de escritura.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Las compensaciones&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;* incluso la distribución de carga es más fácil en sistemas eventualmente consistentes&lt;br /&gt;* el centro de soporte multi-datos es más fácil en sistemas eventualmente consistentes&lt;br /&gt;* algunos problemas no son solucionables con sistemas eventualmente consistentes&lt;br /&gt;* a veces el código es más fácil escribirlo en sistemas fuertemente consistentes&lt;br /&gt;&lt;br /&gt;Discutiremos sobre los pros y contras en detalle en los artículos subsecuentes.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Fuente: &lt;a href="http://blog.mongodb.org/post/475279604/on-distributed-consistency-part-1"&gt;http://blog.mongodb.org/post/475279604/on-distributed-consistency-part-1&lt;/a&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-7414460330065471985?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/7414460330065471985/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=7414460330065471985&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/7414460330065471985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/7414460330065471985'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/mongodb-consistencia-distribuida-parte.html' title='MongoDB: Consistencia distribuida. Parte 1'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-8539098796547105100</id><published>2010-11-29T08:08:00.001+01:00</published><updated>2010-11-29T08:08:28.536+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><title type='text'>MongoDB: El buen uso de los índices</title><content type='html'>Los índices son referencias a los documentos Mongo, ordenados de forma eficiente por una clave o campo. Estas referencias están almacenadas en una estructura de árbol, permitiendo una búsqueda rápida y eficiente. Los índices son uno de los recursos más estimados en MongoDB, y saber aprovechar su capacidad nos permitirá optimizar el acceso a los datos. Pero también es un arma de doble filo, que puede darnos problemas si no se sabe utilizar correctamente.&lt;br /&gt;&lt;br /&gt;Básicamente, se aplican dos reglas básicas a la hora de aplicar un índice:&lt;br /&gt;- A claves o campos por los que se suele realizar búsquedas.&lt;br /&gt;- A claves o campos que suelene ser ordenados.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;CASOS&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Vamos a ver algunos casos sobre el uso adecuado de índices. Los ejemplos toman en consideración una colección llamada "col", donde los documentos tienen las claves x e y, y el índice (salvo que se indique otra cosa) está construído sobre x.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Caso 1: Usar db.col.find({$where:"this.x==this.y"})&lt;/b&gt;&lt;br /&gt;Los índices no pueden usarse en consultas tipo $where. Sin embargo, en consultas de tipo non-$where, es eficiente usar índices sobre los elementos non-$where.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Caso 2: Rangos usando db.col.find({x:/a/}&lt;/b&gt;&lt;br /&gt;La letra 'a' puede aparecer en cualquier parte del campo, por lo que no es eficiente para la ordenación. Sin embargo, sí sería interesante si x es una cadena o x es la expresión irregular /a/.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Caso 3: Actualización usando db.col.update({x:2}, {$inc:{x:3}})&lt;/b&gt;&lt;br /&gt;Esta operación no está disponible en versiones antiguas de MongoDB. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;Caso 4: Ordenación rápida usando db.col.find({y:1}).sort({x:1})&lt;/b&gt;&lt;br /&gt;El índice asegura la ordenación, pero realizado aquí no es el mejor índice.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Caso 5: Campos perdidos usando db.col.find({x:{$exists:true}})&lt;/b&gt;&lt;br /&gt;Actualmente no se usa el índice. En versiones futuras de Mongo será tenido en cuenta.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Caso 6: Búsqueda en arrays usando db.col.find({x:{$all:[2,10]}}) teniendo en cuenta que x es un array con los valores [2,10]&lt;/b&gt;&lt;br /&gt;El índice realizará búsquedas rápidas en todos los documentos donde coincida el array [2,10].&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Caso 7: Índices compuestos usando db.col.find({y:10}).sort({x:1}), con índice compuesto x e y {x:1,y:1}&lt;/b&gt;&lt;br /&gt;El índice asegura la ordenación, pero realizado aquí no es el mejor índice.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;CREACION DE INDICES&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;La creación de índices en MongoDB es sencilla. Por defecto, siempre se crea un índice, de forma automática, sobre la clave _id de los documentos de una colección.&lt;br /&gt;&lt;br /&gt;Para crear un índice sobre otras claves, usar el siguiente comando:&lt;br /&gt;&lt;code&gt;db.col.ensureIndex({x:1})&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;El índice puede ser creado en cualquier momento. Si la colección tiene muchos documentos, esta operación puede tardar mucho, bloqueando otras operaciones. Para evitar ésto, se puede indicar que el índice se cree en background (en segundo plano):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;db.col.ensureIndex({x:1},{background:true})&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Un índice único asegura que los datos de una clave no se repitan (unicidad) y además que sean obligatorios (si no se especican valores, éstos se asumen null, y no podrían estar repetidos):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;db.col.ensureIndex({x:1},{unique:true})&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Si a la hora de crear el índice sobre la colección, ya existieran documentos con clave duplicada, se podría indicar que que se eliminaran los documentos duplicados:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;db.col.ensureIndex({x:1},{unique:true, dropDups:true})&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;En este caso, sólo se mantendría el primer documento creado (en el orden natural).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;MANTENIMIENTO DE INDICES&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;Los siguientes comandos permiten realizar algunas operaciones de mantenimiento con índices:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;db.system.indexes.find({ns:'db.col'})&lt;/code&gt;&lt;br /&gt;Muestra los índices creados en la colección 'col'.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;db.col.dropIndex({x:1})&lt;/code&gt;&lt;br /&gt;Elimina de la colección 'col' el índice sobre la clave x.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;db.col.dropIndexes()&lt;/code&gt;&lt;br /&gt;Elimina de la colección 'col' todos los índices creados.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;db.col.reIndex()&lt;/code&gt;&lt;br /&gt;Reconstruye todos los índices creados en la colección 'col'.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;LIMITES DE LOS INDICES&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;Una pregunta interesante: ¿hay límites en los índices?:&lt;br /&gt;- Máximo de 40 índices por colección&lt;br /&gt;- No se previenen índices lógicamente equivalentes (por ejemplo, {x:1} y {x:-1})&lt;br /&gt;- Lo índices mejoran las consultas pero que crean inserciones lentas.&lt;br /&gt;- Los índices más específicos ({a:1,b:1,c:1}) pueden ser más útiles que tener que los menos específicos ({a:1} , {b:1}), pero la ordenación de los más específicos puede no ser tan rápida como en los menos específicos.&lt;br /&gt;&lt;br /&gt;Cualquier cambio en las claves, requerirá actualizar también los índices.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Fuente consultada: &lt;a href="http://www.slideshare.net/mongodb/indexing-with-mongodb"&gt;http://www.slideshare.net/mongodb/indexing-with-mongodb&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-8539098796547105100?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/8539098796547105100/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=8539098796547105100&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/8539098796547105100'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/8539098796547105100'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/mongodb-el-buen-uso-de-los-indices.html' title='MongoDB: El buen uso de los índices'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-927792172806319264</id><published>2010-11-29T08:07:00.001+01:00</published><updated>2010-11-29T08:07:27.852+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><title type='text'>Minitutorial de MongoDB interactivo online</title><content type='html'>Ya puedes acceder a un tutorial básico y sencillo (en inglés), donde podrás conocer los comandos básicos a través de una consola online, enseñándote paso a paso cada comando, con su explicación, probando los ejemplos y viendo los resultados.&lt;br /&gt;&lt;br /&gt;Podrás acceder al tutorial a través de la siguiente URL: &lt;a href="http://try.mongodb.org/"&gt;http://try.mongodb.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__eBZmMMBCSI/S7OBOwBvUxI/AAAAAAAAAA4/xXGb2awFqeU/s1600/MongoMiniTutorial.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 200px;" src="http://4.bp.blogspot.com/__eBZmMMBCSI/S7OBOwBvUxI/AAAAAAAAAA4/xXGb2awFqeU/s320/MongoMiniTutorial.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5454845664086151954" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;La traducción de este mini-tutorial se encuentra disponible en este enlace:&lt;br /&gt;&lt;i&gt;&lt;a href="http://mongospanish.blogspot.com/2010/04/minitutorial-vistazo-rapido-mongodb.html"&gt;http://mongospanish.blogspot.com/2010/04/minitutorial-vistazo-rapido-mongodb.html&lt;/a&gt;&lt;/i&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-927792172806319264?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/927792172806319264/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=927792172806319264&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/927792172806319264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/927792172806319264'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/minitutorial-de-mongodb-interactivo.html' title='Minitutorial de MongoDB interactivo online'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/__eBZmMMBCSI/S7OBOwBvUxI/AAAAAAAAAA4/xXGb2awFqeU/s72-c/MongoMiniTutorial.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-4754734721847141257</id><published>2010-11-29T08:06:00.002+01:00</published><updated>2010-11-29T08:06:39.555+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><category scheme='http://www.blogger.com/atom/ns#' term='ODBMS'/><category scheme='http://www.blogger.com/atom/ns#' term='Bases de Datos'/><title type='text'>JSON y ODBMS</title><content type='html'>Las bases de datos orientadas a objetos son filosóficamente más diferentes de lo que uno podría esperar.&lt;br /&gt;&lt;br /&gt;Tenemos una representación estandarizada documento/objeto - JSON es actualmente popular para almacenamientos orientados a documentos, quizá ODL en ODBMS. Lo bueno de JSON es que, al menos para programadores Web, es una tecnología que ya utilizan y con la que están familiarizados. No añadimos nada nuevo qué aprender.&lt;br /&gt;&lt;br /&gt;En un documento, realmente estamos pensando en "documentos", no en objetos. Los objetos tiene métodos, esquemas predefinidos, jerarquías e herencias. Esto no está presente en una base de datos de documentos; el código no es parte de la base de datos.&lt;br /&gt;&lt;br /&gt;Mientras que pueden existir relaciones entre documentos, los punteros entre documentos están desenfatizados. En el almacenamiento de documentos no persisten "grafos" de objetos - ésta no es una base de datos de grafos (las bases de datos de grafos son una nueva categoría NoSQL - ¿qué diferencia hay entre una base de datos de grafos y una ODBMS? Una pregunta interesante)&lt;br /&gt;&lt;br /&gt;El diseño de esquema es importante en las bases de datos de documentos. No podemos pensar en términos de "solamente persiste lo que yo trabajo con memoria RAM desde mi programa". Todavía definimos un esquema. Este esquema puede variar con respecto a un "código de esquema" interno de la aplicación. Por ejemplo, en MongoDB tenemos colecciones (análogas a las tablas) de documentos JSON, y una declaración explícita de índices sobre campos específicos de la colección. Podemos pensar que esta aproximación tiene algunos méritos - un desacoplamiento de datos y de código. El código tiende a cambiar rápidamente.&lt;br /&gt;&lt;br /&gt;Embeber es un concepto importante en el almacenamiento de documentos. Es mucho más común anidar datos dentro de documentos que tener referencias entre documentos.&lt;br /&gt;&lt;br /&gt;¿Por qué desenfatizar las relaciones? Por un par de razones. La primera, con grafos arbitrarios de objetos, es difícil procesar el grafo desde un cliente sin muchos tiempos de espera cliente/servidor. Un objetivo con bases de datos de documentos es mantener el paradigma cliente/servidor y mantener código predispuesto para el cliente (no obstante con algunas excepciones como map/reduce). Segundo, un objetivo clave en el espacio "NoSQL" es la escalabilidad horizontal. Los grafos arbitrarios de objetos dificultarían la partición entre servidores de una manera que garantice el rendimiento.&lt;br /&gt;&lt;br /&gt;Fuente: &lt;a href="http://blog.10gen.com/post/437029788/json-db-vs-odbms"&gt;http://blog.10gen.com/post/437029788/json-db-vs-odbms&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-4754734721847141257?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/4754734721847141257/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=4754734721847141257&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/4754734721847141257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/4754734721847141257'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/json-y-odbms.html' title='JSON y ODBMS'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-6992475917470020278</id><published>2010-11-29T08:05:00.001+01:00</published><updated>2010-11-29T08:05:41.565+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>¿Debertía MongoDB utilizar SQL como lenguaje de consulta?</title><content type='html'>MongoDB no utiliza SQL como lenguaje de consulta. ¿Por qué no?. Es una buena pregunta y en el proyecto hemos discutido sobre ello durante mucho tiempo. Existen razones para ello.&lt;br /&gt;&lt;br /&gt;Dada la naturaleza del almacenamiento orientado a documento, si hiciéramos SQL, el mundo sería una variante, no SQL verdadero. No habría joins, y podríamos necesitar extensiones para gestionar las construcciones anidadas construídas y envueltas elegantemente en el almacenamiento JSON. Estas extensiones no harían mucho y necesitaríamos algo como la notación punto de MongoDB para alcanzar los objetos internos, algo quizá como lo siguiente:&lt;br /&gt;&lt;br /&gt;SELECT * FROM users WHERE addr.state = ‘NY’&lt;br /&gt;&lt;br /&gt;Para alcanzar los arrays también lo necesitaríamos:&lt;br /&gt;&lt;br /&gt;SELECT * FROM posts WHERE comments[].author = ‘fred’&lt;br /&gt;&lt;br /&gt;En Mongo, la sintaxis de consulta JSON de arriba, simplemente sería:&lt;br /&gt;&lt;br /&gt;{ “comments.author” : “fred” }&lt;br /&gt;&lt;br /&gt;El término NoSQL es un poco impreciso - estamos realmente hablando sobre escalabilidad horizontal en almacenamiento postrelacional, no sobre el lenguaje SQL. Debería considerarse la Google App Engine Data Store NoSQL, y utilizar el lenguaje de consulta GQL, similar a SQL.&lt;br /&gt;&lt;br /&gt;La principal razón por la decisión que tomamos con el lenguaje de consulta - representando consultas como JSON - era normalizar los datos con el mecanismo de consulta tal como los almacenamos. Si estás almacenando JSON en la base de datos, ¿no podemos representar las consultas de la misma manera? Pensamos que tiene sentido.&lt;br /&gt;&lt;br /&gt;Nunca he sido un fan de embeber un lenguaje de programación en otro. Construir cadenas SQL dinámicamente me pareció siempre un poco extraño. Prefiero representar las consultas de un modo conducido a datos.&lt;br /&gt;&lt;br /&gt;Fuente: &lt;a href="http://blog.mongodb.org/post/447761175/should-mongodb-use-sql-as-a-query-language"&gt;http://blog.mongodb.org/post/447761175/should-mongodb-use-sql-as-a-query-language&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-6992475917470020278?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/6992475917470020278/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=6992475917470020278&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6992475917470020278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6992475917470020278'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/debertia-mongodb-utilizar-sql-como.html' title='¿Debertía MongoDB utilizar SQL como lenguaje de consulta?'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-7388084400918137136</id><published>2010-11-29T08:04:00.002+01:00</published><updated>2010-11-29T08:04:45.679+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><category scheme='http://www.blogger.com/atom/ns#' term='Bases de Datos'/><title type='text'>Análisis entre modelo relacional y modelo documental en bases de datos</title><content type='html'>El origen de las bases de datos va ligado a la necesidad de organizar la cada vez más exigente cantidad de datos que se requieren. En los inicios, la información estaba delegada a los ficheros, como meros depósitos de información y a los que se accedía a bajo nivel para las operaciones más elementales de lectura y escritura. Con el tiempo, la información requerida se hacía mayor, y la complejidad de gestionarla también creció. Se comenzó a aplicar técnicas como índices para accesos más rápidos y para la ordenación de la misma. Pero las aplicaciones debían tratar los ficheros de forma artesanal y personalizada.&lt;br /&gt;&lt;br /&gt;Surgieron sistemas que automatizaban las operaciones complejas de gestión  de los datos, como los  índices, así como las primeras relaciones entre campos clave entre dos o más tablas. Pioneros en estos sistemas fueron (por citar los más conocidos) fueron dBASE y Clipper, pero también empezaban a gestarse grandes bases de datos profesionales, como Oracle o DB2. Estamos hablando de los años 80.&lt;br /&gt;&lt;br /&gt;Los dispositivos de almacenamiento eran limitados, así como la capacidad de los sistemas operativos en almacenar y direccionar información, aunque suficientes para la época. Es por ello que la optimización del espacio fuera un un factor vital, y que el diseño de las tablas contemplase el acotar el almacenamiento de cada campo, tener en cuenta el tamaño de cada fila, y prever el tamaño total de los ficheros junto con la previsión de crecimiento de los mismos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Bases de datos relacionales&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;El modelo relacional surge ante estas circunstancias, postulado por Frank Codd en 1970. La normalización de los datos permite organizar la información separando en tablas la información más pequeña posible e independiente, para evitar la repetición de la misma. Para acceder a toda la información, las tablas se relacionan unas y otras mediante campos clave comunes, que suelen ser números con un id único. &lt;br /&gt;&lt;br /&gt;Este modelo de almacenamiento es organizado y óptimo, define unas reglas que evitan la redundancia de la información y facilitan la consistencia de los datos. Este sistema de ingeniería de la información es el que ha regido las bases de datos durante los últimos 40 años.&lt;br /&gt;&lt;br /&gt;Para trabajar con este modelo de almacenamiento, surgió el lenguaje SQL, que facilitó el entendimiento de las relaciones a través de una sintaxis sencilla y asimilable.&lt;br /&gt;&lt;br /&gt;Este modelo de almacenamiento tiene las siguientes ventajas:&lt;br /&gt;- Sistema de normalización óptimo en almacenamiento. Idóneo para sistemas con requisitos muy claros y poco dado a cambios.&lt;br /&gt;- Sistema fuertemente estructurado e interrelacionado, formando un esquema.&lt;br /&gt;- Sistema unánimente aceptado y estándar, utilizado en más del 90% de las aplicaciones&lt;br /&gt;- La mayor parte de fabricantes de bases de datos utilizan el SQL estándar en sus productos, si bien puede haber alguna pequeña variación fácilmente subsanable. &lt;br /&gt;- Las migraciones entre bases de datos de diferentes fabricantes  no son excesivamente impactantes&lt;br /&gt;- Las consultas SQL tienen funciones agregadas de cálculo asociadas a columnas en los resultados.&lt;br /&gt;- Los sistemas de bases de datos relacionales asumen el trabajo de las complejidades de la integridad referencial, velando por la consistencia de la información y liberando al desarrollador de estas tareas para que se centre solamente en las consultas.&lt;br /&gt;- Multitud de herramientas productivas construídas en torno a este modelo: business intelligence, datamining, ETL, administración, monitorización, etc.&lt;br /&gt;- Eficiente para gestionar datos para automatizar actividades.&lt;br /&gt;&lt;br /&gt;Sin embargo, también conlleva algunos inconvenientes:&lt;br /&gt;- La normalización  en entidades atómicas no es natural y tiende a complicar su entendimiento y los desarrollos.&lt;br /&gt;- Basar la identificación de los registros y relacionar tablas por códigos numéricos es críptico y poco natural.  &lt;br /&gt;- La información, tal y como está almacenada, difiere mucho de cómo es gestionada, y requiere un esfuerzo importante de adaptaciones.&lt;br /&gt;- Sistema rígido y estricto poco tolerante a fallos y que penaliza los cambios. &lt;br /&gt;- La adición de entidades de relación y de campos clave a una tabla ya existente implica complejidad e impacta en los desarrollos actuales.&lt;br /&gt;- Sistema que gana en complejidad a medida que crece. La escalabilidad de la estructura se torna condicionada.&lt;br /&gt;- El desarrollo de las aplicaciones requiere de capacitación para conocer el modelo entidad-relación.&lt;br /&gt;- El almacenamiento de toda la información requiere dividir la información en entidades atómicas y tratar éstas por separado en varios procesos.&lt;br /&gt;- Las consultas requieren tracear la información separada y reunirla. Las joins suelen ser complejas y pesadas, y a veces no son suficientes, requiriendo varios procesos de consulta adicionales.&lt;br /&gt;- La gestión automatizada de la integridad referencial supone una penalización de tiempo de accesos (lectura y escritura) a la información.&lt;br /&gt;- La gestión automatizada de la integridad referencial no evita que el desarrollador preste atención a errores de integridad y su causa. El desarrollador debe asegurar previamente la integridad y controlar si el sistema le informa de alguna violación de reglas de integridad. Por ejemplo, la creación de una categoría de productos. El sistema informará si se está tratando de crear una categoría ya existente, y el programa debería capturar este aviso para advertir al usuario sobre la causa del problema. Otra forma (sin integridad automatizada) sería consultar previamente cuántas categorías existen con ese nombre. Si es mayor de cero advertir al usuario, y si no guardar la nueva categoría. El trabajo en ambos casos (con y sin integridad automatizada) no difiere mucho.&lt;br /&gt;- La información de cada tabla está limitada a una estructura fija de campos o columnas, sean o no necesarios, y tengan o no valores. Si no se utiliza una columna, ésta se almacena de todas formas en cada fila.&lt;br /&gt;- Poco eficiente a la hora de explotar grandes volúmenes de información textual (maneja mejor datos que información).&lt;br /&gt;- Los principales fabricantes de sistemas de bases de datos relacionales las desarrollan de forma propietaria.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Bases de datos documentales&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Las bases de datos documentales, a diferencia de las bases de datos relacionales, están libres de esquemas y de estructuras. Por tanto, la información no se divide en columnas fijas y filas, si no en documentos que pueden tener libertad de información, como cualquier cantidad de campos o de tipos de campos, e incluso de contener en el propio campo una lista de valores, un documento o una colección de documentos. La información almacenada en un documento está formado por pares de clave y valor. &lt;br /&gt;&lt;br /&gt;La gran ventaja de no poseer esquema (y la consiguiente rigidez de estructuras y relaciones), es que son muy eficientes al trabajar con grandes cantidades de documentos.&lt;br /&gt;&lt;br /&gt;Las principales ventajas de una base documental son las siguientes:&lt;br /&gt;- Libre de esquemas. Al no estar sujeta a estructuras ni relaciones, los cambios de diseño son fáciles de adoptar y con un impacto mínimo.&lt;br /&gt;- Al no tener relaciones se facilita la replicación&lt;br /&gt;- Los sistemas de bases de datos documentales ganan rapidez dedicándose más en exclusiva al almacenamiento y la recuperación de la información (no consumen tiempos en la integridad o en la revisión de las reglas o constraints).&lt;br /&gt;- Poseen un lenguaje de consulta natural.&lt;br /&gt;- Sencillez y potencia en escalabilidad.&lt;br /&gt;- Los campos vacíos no se añaden al documento, optimizando el espacio de almacenamiento.&lt;br /&gt;- Cada documento (o “fila”) puede tener estructuras diferentes (más o menos campos, tipos diferentes de datos, etc.)&lt;br /&gt;- Un documento es un objeto que normalmente es mapeado mediante JSON o XML&lt;br /&gt;- Posibilidad en embeber documentos y colecciones dentro de documentos. Esto solventaría joins entre documentos, aunque agregaría complejidad a la estructura del documento.&lt;br /&gt;Los datos almacenados no necesitan adaptaciones por las aplicaciones (tal como se almacenan se pueden gestionar).&lt;br /&gt;- Muy eficiente a la hora de explotar grandes volúmenes de información textual (maneja mejor información que datos).&lt;br /&gt;- Las migraciones entre bases de datos diferentes tienen muy poco impacto, pues comparten el formato JSON o XML.&lt;br /&gt;- La mayor parte de los fabricantes de sistemas de bases de datos documentales, la desarrollan como open source.&lt;br /&gt;- El auge de la Web está mirando este modelo de datos como clave en sus negocios, por su mayor capacidad de escalabilidad, rendimiento y alta disponibilidad, que los actuales sistemas de bases de datos relacionales.&lt;br /&gt;&lt;br /&gt;Los principales inconvenientes serían:&lt;br /&gt;- El sistema de base de datos no contempla realizar joins entre documentos.&lt;br /&gt;- Más peso por parte de las aplicaciones para asumir la integridad y la consistencia.&lt;br /&gt;- No posee funciones agregadas para realizar cálculos sobre la información de las consultas.&lt;br /&gt;- Redundancia de la información. Penaliza el espacio de almacenamiento en aras de una mayor rapidez de acceso y de claridad de la información.&lt;br /&gt;- Menos eficiente para automatizar actividades.&lt;br /&gt;- Aunque este modelo de información es anterior al relacional, aún tiene una aceptación muy baja (menos de un 10% del total de aplicaciones funcionando en el mundo).&lt;br /&gt;- No hay muchas herramientas de productividad en torno a este tipo de bases de datos, como Business Intelligence, monitorización, etc.&lt;br /&gt;- Aunque es posible migrar un sistema relacional a un sistema documental, la potencia de la integridad referencial ha de ser restituida por código en las aplicaciones. No merece la pena esto, y sí una restrospectiva en la que se adapte los conceptos a documentos teniendo siempre en mente las ventajas que podría ganarse en la migración.&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;a href="http://www.safecreative.org/work/1003275854193" xmlns:cc="http://creativecommons.org/ns#" rel="cc:license"&gt;&lt;img src="http://resources.safecreative.org/work/1003275854193/label/barcode-150" style="border:0;" alt="Safe Creative #1003275854193"/&gt;&lt;/a&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-7388084400918137136?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/7388084400918137136/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=7388084400918137136&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/7388084400918137136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/7388084400918137136'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/analisis-entre-modelo-relacional-y.html' title='Análisis entre modelo relacional y modelo documental en bases de datos'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-2070885661082532177</id><published>2010-11-29T08:03:00.002+01:00</published><updated>2010-11-29T08:03:41.139+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Primeros pasos en MongoDB y Linux</title><content type='html'>MongoDB es una base de datos multiplataforma, con lo que no existen problemas ni apenas diferencias funcionales ni técnicas entre éstas. Donde sí puede notarse alguna diferencia es en el rendimiento y la velocidad que la propia plataforma provee. En este punto, Linux tiene algunos puntos de ventaja con respecto a plataformas Windows.&lt;br /&gt;&lt;br /&gt;En este artículo intentaré ser lo más claro y sencillo posible para que usuarios noveles puedan entender los conceptos. Se asume que el lector ya tiene una nociones mínimas sobre el sistema operativo Linux (al menos el concepto de directorio).&lt;br /&gt;&lt;br /&gt;Este artículo no pretende abarcar muchos conceptos, si no los primeros pasos o los conceptos más básicos para poder funcionar la base de datos y realizar las operaciones más básicas.&lt;br /&gt;&lt;br /&gt;Los conceptos aquí explicados se pueden aplicar también a MongoDB Solaris, OS X y Windows (a excepción de la instalación).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Instalación de MongoDB en Linux&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Los pasos a seguir para instalar MongoDB en Linux son muy sencillos:&lt;br /&gt;&lt;br /&gt;1. Acceder a la página de descargas de  MongoDB en &lt;a href="http://www.mongodb.org/display/DOCS/Downloads"&gt;http://www.mongodb.org/display/DOCS/Downloads&lt;/a&gt;&lt;br /&gt;2. Seleccionar la versión requerida (32bits o 64 bits)&lt;br /&gt;3. Descargar la versión a nuestro disco duro&lt;br /&gt;4. Abrir una consola o terminal&lt;br /&gt;5. Iniciar una sesión como superusuario o root (mediante el comando “su” e introducir la contraseña del mismo)&lt;br /&gt;6. Crear el directorio de datos: &lt;code&gt;mkdir -p /data/db&lt;/code&gt;&lt;br /&gt;7. Acceder al directorio donde se descargó el archivo .tz de MongoDB&lt;br /&gt;8. Descomprimir este archivo en el lugar que deseemos: &lt;code&gt;tar xzf mongodb-linux-i686-1.4.0.tgz&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;b&gt;Notas:&lt;/b&gt;&lt;br /&gt;1. En sistemas Linux antiguos podría no funcionar MongoDB. En este caso, la versión a descargar sería la legacy-static&lt;br /&gt;2. La versión de 32 bits tiene una limitación de hasta 2GB por fichero de datos (más información en &lt;a href="http://blog.mongodb.org/post/137788967/32-bit-limitations"&gt;http://blog.mongodb.org/post/137788967/32-bit-limitations&lt;/a&gt;).&lt;br /&gt;3. MongoDB es muy ligero. El fichero descargado ocupa apenas 23MB&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Arrancar el servidor MongoDB&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Una vez instalado MongoDB, acceder al directorio bin (dentro del directorio donde lo instalamos):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ cd xxx/bin&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Para ejecutar el servidor:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ ./mongodb &amp;amp;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Con “&amp;amp;” el servidor se ejecutará en background. Esto es opcional, y al usarlo damos por hecho que el servidor estará ejecutándose de forma contínua. Si queremos parar el servidor hemos de localizar el proceso con el comando:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ ps&lt;br /&gt;&lt;br /&gt;PID TTY          TIME CMD&lt;br /&gt;12047 pts/1    00:00:00 mongod&lt;br /&gt;12343 pts/1    00:00:00 ps&lt;br /&gt;14633 pts/1    00:00:00 su&lt;br /&gt;14636 pts/1    00:00:00 bash&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Una vez localizado, anotar el PID y especificarlo en el comando kill:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ kill -9 12047&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;En el caso de no especificar “&amp;amp;”, el servidor de MongoDB se ejecuta de forma exclusiva en primer plano, acaparando la atención de la consola. Para para el servidor, simplemente hay que pulsar las teclas Ctrl y C.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;La consola mongo&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Una vez arrancado el servidor ya es posible trabajar con la base de datos. MongoDB provee de una consola (o DB Shell), donde podremos interactuar directamente con la misma. Existen también drivers para cualquier lenguaje de programación (Java, .NET, Perl, Phyton, PHP, C, C++, etc.) para su uso en nuestras aplicaciones.&lt;br /&gt;&lt;br /&gt;Para arrancar la consola:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ mongo&lt;br /&gt;&lt;br /&gt;MongoDB shell version: 1.4.0&lt;br /&gt;url: test&lt;br /&gt;connecting to: test&lt;br /&gt;Sat Mar 27 08:55:36 connection accepted from 127.0.0.1:39720 #1&lt;br /&gt;type "help" for help&lt;br /&gt;&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;El comando “help” nos permitirá conocer un resumen de los comandos posibles:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&gt; help&lt;br /&gt;HELP&lt;br /&gt;show dbs                     show database names&lt;br /&gt;show collections             show collections in current database&lt;br /&gt;show users                   show users in current database&lt;br /&gt;show profile                 show most recent system.profile entries with time &gt;= 1ms&lt;br /&gt;use &lt;db name=""&gt;                set curent database to &lt;db name=""&gt;&lt;br /&gt;db.help()                    help on DB methods&lt;br /&gt;db.foo.help()                help on collection methods&lt;br /&gt;db.foo.find()                list objects in collection foo&lt;br /&gt;db.foo.find( { a : 1 } )     list objects in foo where a == 1&lt;br /&gt;it                           result of the last line evaluated; use to further iterate&lt;br /&gt;&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Para mostrar las bases de datos disponibles:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&gt; show dbs&lt;br /&gt;admin&lt;br /&gt;local&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Para obtener una ayuda sobre los comandos a utilizar con una base de datos:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&gt; db.help()&lt;br /&gt;DB methods:&lt;br /&gt;db.addUser(username, password[, readOnly=false])&lt;br /&gt;db.auth(username, password)&lt;br /&gt;db.cloneDatabase(fromhost)&lt;br /&gt;db.commandHelp(name) returns the help for the command&lt;br /&gt;db.copyDatabase(fromdb, todb, fromhost)&lt;br /&gt;db.createCollection(name, { size : ..., capped : ..., max : ... } )&lt;br /&gt;db.currentOp() displays the current operation in the db&lt;br /&gt;db.dropDatabase()&lt;br /&gt;db.eval(func, args) run code server-side&lt;br /&gt;db.getCollection(cname) same as db['cname'] or db.cname&lt;br /&gt;db.getCollectionNames()&lt;br /&gt;db.getLastError() - just returns the err msg string&lt;br /&gt;db.getLastErrorObj() - return full status object&lt;br /&gt;db.getMongo() get the server connection object&lt;br /&gt;db.getMongo().setSlaveOk() allow this connection to read from the nonmaster member of a replica pair&lt;br /&gt;db.getName()&lt;br /&gt;db.getPrevError()&lt;br /&gt;db.getProfilingLevel()&lt;br /&gt;db.getReplicationInfo()&lt;br /&gt;db.getSisterDB(name) get the db at the same server as this onew&lt;br /&gt;db.killOp(opid) kills the current operation in the db&lt;br /&gt;db.printCollectionStats()&lt;br /&gt;db.printReplicationInfo()&lt;br /&gt;db.printSlaveReplicationInfo()&lt;br /&gt;db.printShardingStatus()&lt;br /&gt;db.removeUser(username)&lt;br /&gt;db.repairDatabase()&lt;br /&gt;db.resetError()&lt;br /&gt;db.runCommand(cmdObj) run a database command.  if cmdObj is a string, turns it into { cmdObj : 1 }&lt;br /&gt;db.serverStatus()&lt;br /&gt;db.setProfilingLevel(level,&lt;slowms&gt;) 0=off 1=slow 2=all&lt;br /&gt;db.shutdownServer()&lt;br /&gt;db.stats()&lt;br /&gt;db.version() current version of the server&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Para probar algo, utilizaremos la base de datos “prueba”:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&gt; use prueba&lt;br /&gt;switched to db prueba&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Esta base de datos aún no existe, pero al especificar este comando, MongDB se prepara para su creación.&lt;br /&gt;&lt;br /&gt;Para obtener el nombre de la base de datos en uso:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&gt; db.getName()&lt;br /&gt;prueba&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Para conocer la versión de la base de datos:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&gt; db.version()&lt;br /&gt;1.4.0&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Para obtener la información del servidor MongoDB al que estamos conectados:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&gt; db.getMongo()&lt;br /&gt;{&lt;br /&gt;"host" : "127.0.0.1",&lt;br /&gt;"setSlaveOk" : function () {&lt;br /&gt;this.slaveOk = true;&lt;br /&gt;},&lt;br /&gt;"getDB" : function (name) {&lt;br /&gt;return new DB(this, name);&lt;br /&gt;},&lt;br /&gt;"getDBs" : function () {&lt;br /&gt;var res = this.getDB("admin").runCommand({listDatabases:1});&lt;br /&gt;assert(res.ok == 1, "listDatabases failed:" + tojson(res));&lt;br /&gt;return res;&lt;br /&gt;}&lt;br /&gt;...&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Esta información está en formato JSON (al igual que toda la información que se trata y utiliza en MongoDB), e incluye código JavaScript. Al principio obtenemos que estamos conectados a un servidor en la dirección 127.0.0.1 (localhost o máquina local). El resto son funciones disponibles para utilizar en el mismo comando. Por ejemplo, para obtener la lista de bases de datos (y su detalle) que gestiona el servidor Mongo al que estamos conectados:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&gt; db.getMongo().getDBs()&lt;br /&gt;{&lt;br /&gt;"databases" : [&lt;br /&gt;{&lt;br /&gt;"name" : "admin",&lt;br /&gt;"sizeOnDisk" : 1,&lt;br /&gt;"empty" : true&lt;br /&gt;},&lt;br /&gt;{&lt;br /&gt;"name" : "local",&lt;br /&gt;"sizeOnDisk" : 1,&lt;br /&gt;"empty" : true&lt;br /&gt;},&lt;br /&gt;{&lt;br /&gt;"name" : "test",&lt;br /&gt;"sizeOnDisk" : 1,&lt;br /&gt;"empty" : true&lt;br /&gt;}&lt;br /&gt;],&lt;br /&gt;"totalSize" : 0,&lt;br /&gt;"ok" : 1&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Comparativa  entre modelo relacional y modelo documental&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Para que nuestra base de datos “pruebas” pueda crearse, ésta debe alojar algún dato, el cual se ubica en una colección. Podemos concebir una colección como un almacén de datos relacionados sobre una temática (agenda, noticia, pedidos, etc.). Puede tener un símil con las tablas de las bases de datos relacionales en cuanto a su concepto, pero no en cuanto a su forma, ya que las tablas tradicionales organizan la información de una manera estructura y rígida. Podemos imaginar una hoja de cálculo con x columnas (campos) y n filas (registros o tuplas). La información se almacena aquí con unas reglas estrictas. Las columnas son siempre las mismas y el tipo de datos es el mismo. Estas reglas aseguran la consistencia de la información, pero la gestión de esos datos resulta limitada a esas mismas reglas.&lt;br /&gt;&lt;br /&gt;MongoDB es una base de datos orientada a documentos (u a objetos), y no está sometida a las reglas de las bases de datos relacionales. Por de pronto, nos olvidamos de las limitaciones de la hoja de cálculo, pues cada fila es un documento (u objeto), el cual puede ser igual, similar o distinto a los documentos precedentes o posteriores de la misma colección.&lt;br /&gt;&lt;br /&gt;Un documento, en sí mismo, una colección de valores clave/valor, con un formato libre. De esta manera, el dato de una clave en un documento puede ser de un tipo, y en otro documento puede ser de otro tipo. Asimismo, una clave puede no estar limitada a un único valor, si no contener un array (o lista) de valores, o incluso un documento o un array de documentos (como si fuera otra colección interna (“inner”)).&lt;br /&gt;Para visualizar gráficamente ésto, imaginemos una base de datos para almacenar noticias. Para no extendernos mucho, almacenaremos la noticia junto con las etiquetas de categoría y los comentarios de los usuarios.&lt;br /&gt;&lt;br /&gt;En una base de datos relacional, necesitaríamos las siguientes tablas:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Tabla noticia&lt;/b&gt;&lt;br /&gt;Campo id_noticia (entero, no nulo, único, clave primaria)&lt;br /&gt;Campo titulo (texto(50), no nulo)&lt;br /&gt;Campo fecha (fecha, no nulo)&lt;br /&gt;Campo autor (texto(20), no nulo)&lt;br /&gt;Campo noticia (texto grande, no nulo)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Tabla comentario&lt;/b&gt;&lt;br /&gt;Campo id_comentario (entero, no nulo, único, clave primaria)&lt;br /&gt;Campo id_noticia (entero, no nulo, clave foránea)&lt;br /&gt;Campo fecha (fecha, no nulo)&lt;br /&gt;Campo autor (texto(20), no nulo)&lt;br /&gt;Campo comentario (texto grande, no nulo)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Tabla etiqueta&lt;/b&gt;&lt;br /&gt;Campo id_etiqueta (entero, no nulo, único, clave primaria)&lt;br /&gt;Campo etiqueta (texto(20), no nulo)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Tabla relacion_etiqueta_noticia&lt;/b&gt;&lt;br /&gt;Campo id_noticia (entero, no nulo, clave foránea)&lt;br /&gt;Campo id_etiqueta (entero, no nulo, clave foránea)&lt;br /&gt;&lt;br /&gt;El modelo entidad relación sería el siguiente:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__eBZmMMBCSI/S63dH47p1gI/AAAAAAAAAAw/pWkIMQipbCk/s1600/modelo_entidad_relacion.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 302px; height: 320px;" src="http://4.bp.blogspot.com/__eBZmMMBCSI/S63dH47p1gI/AAAAAAAAAAw/pWkIMQipbCk/s320/modelo_entidad_relacion.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5453257851426952706" /&gt;&lt;/a&gt;&lt;br /&gt;La normalización de los datos permite evitar la redundancia (repetición) de los mismos, y para ello se divide y se clasifica la información en diferentes tablas. Se crea un campo clave (normalmente con nombre id) que representa ese dato de forma única. En un modelo relacional, los datos están atomizados.&lt;br /&gt;&lt;br /&gt;Este modelo ha funcionado muy bien hasta nuestros días, pero implica una complejidad asociada. Por un lado, hemos de conocer el modelo de los datos para tracear y poder reconstruir y unir de nuevo la información. A veces, con una join es suficiente, pero muchas veces hemos de realizar varios procesos dependientes unos de otros, lo que complica la programación.&lt;br /&gt;&lt;br /&gt;En el modelo documental esto es mucho más sencillo, pues la entidad de documento es en sí un objeto, lo que podemos utilizar clases que directamente carguen los datos sin operaciones de consulta complejas ni intermedias.&lt;br /&gt;&lt;br /&gt;Con el ejemplo propuesto, un documento en MongoDB podría ser el siguiente:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;{ autor: ‘Rafael Hernamperez’,&lt;br /&gt;titulo: ‘Primeros pasos en MongoDB Linux’,&lt;br /&gt;fecha: Date(’03-27-2010’),&lt;br /&gt;noticia: 'bla bla bla',&lt;br /&gt;etiqueta: [‘opensource’,’base de datos’,’MongoDB’],&lt;br /&gt;comentarios: [{autor: ‘adan3000’, fecha: Date('03/27/2010'), comentario: ‘Muy sencillo, gracias’},&lt;br /&gt;{autor: ‘majopero’, fecha: Date('03/27/2010'), comentario: 'Me parece muy interesante'}&lt;br /&gt;]&lt;br /&gt;}&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Como se puede apreciar, todo está ahí, de manera directa. No es necesario reconstruir el documento consultando diferentes fuentes, como en el modelo relacional. Si en otro documento no quiero etiquetas o comentarios, simplemente, no los pongo. Todo ésto, además de versátil y sencillo, es óptimo y legible. El modelo relacional nos obliga a estar ligando los datos a través de códigos id que para nosotros no tienen significado..&lt;br /&gt;&lt;br /&gt;Las ventajas o inconvenientes entre estos dos modelos de datos no acaba ahí. Por ejemplo, si el día de mañana deseamos agregar galerías de imágenes o de vídeos a la noticia (o cualquier otro tipo de adición que pueda acontecer y que no tenemos previsto), se complica en el modelo relacional, pues hay que añadir nuevas tablas, nuevas claves, nuevas relaciones y nuevas reglas. El desarrollo debe añadir un extra para ligar los nuevos datos, reconstruirlos y representarlos.&lt;br /&gt;&lt;br /&gt;Espero que en un artículo futuro pueda recopilar todas las diferencias y analizar los pros y los contras de ambos modelos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Andando, que es gerundio&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Tras la teoría del capítulo anterior, vamos a crear definitivamente la base de datos “pruebas”, creando un documento que se añadirá a una colección llamada “noticias”. Para ello, desde la consola mongo, se creará una variable que contenga el documento y, a continuación se guarda. Se puede realizar directamente, pero para dejarlo más claro, debido a lo extenso de los datos del documento, se ha preferido hacer en dos pasos:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&gt; var noticia = {&lt;br /&gt;... autor: 'Rafael Hernamperez',&lt;br /&gt;... titulo: 'Primeros pasos en MongoDB Linux',&lt;br /&gt;... fecha: Date('03/27/2010'),&lt;br /&gt;... noticia: 'bla bla bla',&lt;br /&gt;... etiqueta: ['opensource', 'base de datos', 'MongoDB'],&lt;br /&gt;... comentarios: [&lt;br /&gt;... {autor: 'adan3000', fecha: Date('03/27/2010'), comentario: 'Muy sencillo, gracias'},&lt;br /&gt;... {autor: 'majopero', fecha: Date('03/27/2010'), comentario: 'Me parece muy interesante'}&lt;br /&gt;... ]&lt;br /&gt;... }&lt;br /&gt;&gt; db.noticias.save(noticia)&lt;br /&gt;Sat Mar 27 10:32:53 allocating new datafile /data/db/pruebas.ns, filling with zeroes...&lt;br /&gt;Sat Mar 27 10:32:53 done allocating datafile /data/db/pruebas.ns, size: 16MB, took 0.066 secs&lt;br /&gt;Sat Mar 27 10:32:53 allocating new datafile /data/db/pruebas.0, filling with zeroes...&lt;br /&gt;Sat Mar 27 10:32:54 done allocating datafile /data/db/pruebas.0, size: 64MB, took 0.185 secs&lt;br /&gt;Sat Mar 27 10:32:54 building new index on { _id: 1 } for pruebas.noticias&lt;br /&gt;Sat Mar 27 10:32:54 Buildindex pruebas.noticias idxNo:0 { name: "_id_", ns: "pruebas.noticias", key: { _id: 1 } }&lt;br /&gt;Sat Mar 27 10:32:54 done for 0 records 0secs&lt;br /&gt;Sat Mar 27 10:32:54 insert pruebas.noticias 261ms&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;De forma implícita, MongoDB ha creado físicamente la colección “noticias” dentro de la base de datos “pruebas” (en uso). Para verificarlo, listamos las bases de datos:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&gt; show dbs&lt;br /&gt;admin&lt;br /&gt;local&lt;br /&gt;pruebas&lt;br /&gt;test&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ahora listamos las colecciones:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&gt; show collections&lt;br /&gt;noticias&lt;br /&gt;system.indexes&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Para listar todos los documentos de la colección:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&gt; use pruebas&lt;br /&gt;switched to db pruebas&lt;br /&gt;&gt; db.noticias.find()&lt;br /&gt;{ "_id" : ObjectId("4badd0c542691c3d5d4ba694"), "autor" : "Rafael Hernamperez", "titulo" : "Primeros pasos en MongoDB Linux", "fecha" : "Sat Mar 27 2010 10:32:39 GMT+0100 (CET)", "noticia" : "bla bla bla", "etiqueta" : [ "opensource", "base de datos", "MongoDB" ], "comentarios" : [&lt;br /&gt;{&lt;br /&gt;"autor" : "adan3000",&lt;br /&gt;"fecha" : "Sat Mar 27 2010 10:32:39 GMT+0100 (CET)",&lt;br /&gt;"comentario" : "Muy sencillo, gracias"&lt;br /&gt;},&lt;br /&gt;{&lt;br /&gt;"autor" : "majopero",&lt;br /&gt;"fecha" : "Sat Mar 27 2010 10:32:39 GMT+0100 (CET)",&lt;br /&gt;"comentario" : "Me parece muy interesante"&lt;br /&gt;}&lt;br /&gt;] }&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Internamente, MondoDB crea claves con el prefijo “_”. La clave “_id” es gestionada de forma interna y exclusiva por MongoDB para evitar la redundancia de documentos.&lt;br /&gt;&lt;br /&gt;Podemos añadir nuevos documentos con claves similares pero no iguales:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&gt; db.noticias.save({autor:'Rafael Hernamperez', titulo:'Noticia2', fecha: Date('03/27/2010'), noticia: 'bla bla bla 2'})&lt;br /&gt;&gt; db.noticias.save({autor:'Claudio Mendetto', titulo:'Noticia3', fecha: Date('03/27/2010'), noticia: 'bla bla bla 3'})&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ahora tenemos tres documentos. Para hacer una búsqueda, por ejemplo, las noticias publicadas por Claudio:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&gt; db.noticias.find({autor: 'Claudio Mendetto'})&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;O las noticias en las cuales 'adan3000' ha dejado comentario:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&gt; db.noticias.find({'comentarios.autor' : 'adan3000'})&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;a href="http://www.safecreative.org/work/1003275848376" cc="http://creativecommons.org/ns#" rel="cc:license"&gt;&lt;img src="http://resources.safecreative.org/work/1003275848376/label/barcode-150" style="border: 0pt none ;" alt="Safe Creative #1003275848376" /&gt;&lt;/a&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-2070885661082532177?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/2070885661082532177/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=2070885661082532177&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/2070885661082532177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/2070885661082532177'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/primeros-pasos-en-mongodb-y-linux.html' title='Primeros pasos en MongoDB y Linux'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/__eBZmMMBCSI/S63dH47p1gI/AAAAAAAAAAw/pWkIMQipbCk/s72-c/modelo_entidad_relacion.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-4965151891995672038</id><published>2010-11-29T08:02:00.003+01:00</published><updated>2010-11-29T08:02:49.398+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><title type='text'>Conceptos básicos de MongoDB</title><content type='html'>&lt;a&gt;&lt;u&gt;Filosofía de almacenamiento en MongoDB&lt;/a&gt;&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;La filosofía de las bases de datos NOSQL suele ser chocante para todos los que llevan años trabajando en bases de datos relacionales. El no tener el concepto de una tabla, o de una integridad referencial con su relación de clave maestra a clave foránea, se hace difícil imaginar cómo puede funcionar y cómo pueden relacionarse y entenderse los datos.&lt;br /&gt;&lt;br /&gt;MongoDB tiene el concepto de la información almacenada como clave/valor. Estos pares se almacenan en forma de documento u objeto dentro de una colección. Podemos imaginar un símil entre clave/valor como campo/valor, entre un objeto o documento y una fila, y entre colección y tabla. Este concepto puede ayudar a entender un poco mejor este sistema, pero no hay que olvidar que es un símil, no una equiparación.&lt;br /&gt;&lt;br /&gt;Un documento u objeto (los dos términos se refieren a lo mismo), aunque se asemeje a una fila, en realidad no tiene nada que ver, pues en una base de datos relacional, cada fila tiene una organización estructurada común entre todas las filas. En MongoDB, cada fila puede tener su propia estructura, tener más o menos campos, e incluso tener campos que en sí mismos son arrays (contener varios valores) o incluso contener otro documento como valor, o incluso un array de documentos. Esto, entendido bien, nos puede dar una idea de la potencia que ello implica, pues es posible tener en un mismo objeto, de manera incrustada, otros objetos, sin necesidad de implicar a la base de datos en varias tablas, definir claves y relacionar dichas claves.  Por ejemplo, imaginemos la clásica relación “Categoría” y  “Producto”. En un sistema de base de datos tradicional, se definirían dos tablas:&lt;br /&gt;&lt;br /&gt;Tabla categoría:&lt;br /&gt;- idcategoria: integer: PRIMARY KEY&lt;br /&gt;- nombrecategoria: char(30)&lt;br /&gt;&lt;br /&gt;Tabla producto:&lt;br /&gt;- idproducto: integer: PRIMARY KEY&lt;br /&gt;- nombreproducto: char(30)&lt;br /&gt;- idcategoria: integer&lt;br /&gt;&lt;br /&gt;Internamente, el gestor de base de datos debe estar constantemente velando para que los datos clave sean únicos, no nulos y que no violan las reglas de integridad referencial, realizando complejas operaciones de índices y actualización de éstos. Estas operaciones son transparentes para los usuarios y desarrolladores. Es cómodo, pero sobrecargan los tiempos de CPU y penalizan otras operaciones que pueden ser más importantes.&lt;br /&gt;&lt;br /&gt;En una base de datos MongoDB se requeriría únicamente una colección de objetos, cada uno de los cuales puede tener una estructura propia (no tiene por qué ser la misma).&lt;br /&gt;&lt;br /&gt;&lt;i&gt;{producto: “Perdiz escabechada”, categoria:[“carne”,”conserva”]}&lt;br /&gt;{producto:”Naranja”, categoria:”fruta”]}&lt;br /&gt;{producto:”Sal”}&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;De este simple ejemplo se pueden extraer algunas reflexiones:&lt;br /&gt;- El almacenamiento físico gana mucho, al no estar supeditada a una estructura fija y definida. Se pueden omitir claves (campos) si se desea, y los campos de texto ocupan sólo el número de caracteres que contiene, no un tamaño fijo.&lt;br /&gt;- Se prescinde de campos id, que dificultan el entendimiento de los datos.&lt;br /&gt;- Se centraliza todo en una única colección, y no añade la dificultad de las relaciones.&lt;br /&gt;- Un producto puede no estar asociado a una categoría, o bien estar asociado a varias categorías. En este último caso, en una base de datos relacional, requeriría de una tercera tabla intermedia con la colección de relaciones, y el trabajo extra en el código para reconstruir las mismas.&lt;br /&gt;- Si bien el control de la redundancia en las categorías es un esfuerzo por parte del código, en el caso de una base de datos relacional, también habría que hacer un esfuerzo en código cuando se determina si hay redundancia por los errores que emite la base de datos (clave duplicada, infracción de integridad…).&lt;br /&gt;- El modo de almacenamiento es más natural para la máquina y para el humano, pues toda la información está en el mismo documento, en lugar de repartido. Esto evita al código repartir la información (al guardar) y de reunirla (al acceder).&lt;br /&gt;- En un modelo relacional, utilizar id’s reduce el espacio de almacenamiento en tablas extensas (ocupa mucho menos un número que un texto), pero complica el desarrollo y el acceso. MongoDB reduce y optimiza espacio de almacenamiento en los campos de texto, supliendo este espacio e incluso mejorándolo. Asimismo, el código para guardar o acceder a la información es mucho más simple (no hay que realizar relaciones (los típicos join o el uso de varias consultas a varias tablas) ni realizar varias actualizaciones por cada una de las tablas involucradas).&lt;br /&gt;&lt;br /&gt;Otro ejemplo de almacenamiento en un documento u objeto sería el siguiente:&lt;br /&gt;&lt;i&gt;{ nombre: ‘Rafael’,&lt;br /&gt;apellidos: ‘Hernamperez Martin’,&lt;br /&gt;fechaingreso: Date(’03-22-2010’),&lt;br /&gt;seleccion: [‘Aprenda MongoDB’,’Flex 4 en una semana’,’AJAX para Dummies’],&lt;br /&gt;comentarios: [{autor: ‘adan3000’, comentario: ‘Buena eleccion’},&lt;br /&gt;{autor: ‘majopero’, comentario: ‘Te has pasado’, puntuacion:5}&lt;br /&gt;]&lt;br /&gt;}&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;La clave “comentarios” es un array de documentos. Un documento puede contener, asimismo, documentos asociados a una clave. Es lógico suponer que el nivel de anidamiento puede ser tan profundo como uno desee.&lt;br /&gt;&lt;br /&gt;El formato de datos utilizado por MongoDB es JSON, una especificación estándar para representar la información. Es similar a la de XML, pero reduce el contenido a expresar y haciendo más legible y natural la interpretación de la información. El último documento en formato XML sería el siguiente:&lt;br /&gt;&lt;i&gt;&amp;lt;documento&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;nombre&amp;gt;Rafael&amp;lt;/nombre&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;apellidos&amp;gt;Hernamperez Martin&amp;lt;/apellidos&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;fechaingreso&amp;gt;03-22-2010&amp;lt;/fechaingreso&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;seleccion&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;titulo&amp;gt;Aprenda MongoDB&amp;lt;/titulo&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;titulo&amp;gt;Flex 4 en una semana&amp;lt;/titulo&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;titulo&amp;gt;AJAX para Dummies&amp;lt;/titulo&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/seleccion&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;comentarios&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;comment autor=”adan3000” comentario=”Buena elección”/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;comment autor=”majopero” comentario=”Te has pasado” puntuación=”5”/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/comentarios&amp;gt;&lt;br /&gt;&amp;lt;/documento&amp;gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Alguno se estará preguntando cómo mantener la consistencia de los datos en las aplicaciones. Por ejemplo, en una aplicación es conveniente evitar al usuario teclear la categoría, pudiendo seleccionar una ya predeterminada en una lista para asegurar que sea unívoca y que no haya multitud de referencias a un mismo valor que esté redundante porque se diferencia en una letra o está mal escrito. Se puede crear una colección de categorías, en un formato muy similar al de una tabla (usando documentos con una única clave), y usar ésta como se haría normalmente, o incluso añadir un documento en nuestra colección cuya clave sea un array de valores posibles. Aunque su estructura no tenga nada que ver con el resto de documentos almacenados en la misma. Se accede a dicho documento dentro de la colección y se extraen los posibles valores. La primera opción es más sencilla y legible. La última es más óptima en cuanto almacenamiento y gestión por parte del motor de base de datos (trabaja en la misma colección y comparte los mismos ficheros). Otra solución intermedia, y a la vez elegante, sería definir una colección exclusiva para almacenar documentos que contengan series de datos maestros (categorías, tipos, etc.)&lt;br /&gt;&lt;br /&gt;Otra de las ventajas de utilizar este sistema de información, es que no tienes tantas limitaciones a la hora de escalar la información si los requisitos cambian (cosa que ocurre, pues nadie conoce el futuro). En bases de datos relacionales, añadir nuevos campos a una tabla, o una nueva tabla relacionada o maestra y normalizar una base de datos que lleva ya tiempo en producción, es cuanto menos un engorro y un agujero de problemas. &lt;br /&gt;&lt;br /&gt;Una vez se entienden estos sencillos conceptos, el adaptar nuestros desarrollos a este tipo de bases de datos es sencillo, e incluso nos beneficiaremos de una mayor legilibilidad y rapidez.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Paso a paso&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;El movimiento se demuestra andando, y para aprender a caminar en MongoDB procederemos a realizar, paso a paso, un ejemplo práctico. El propósito del mismo es tener una colección de datos personales llamada “agenda”, dentro de una base de datos llamada “ejemplo”. En el ejemplo se verá cómo crear la base de datos, la colección y los datos, y a continuación se verá como realizar consultas a dichos datos.&lt;br /&gt;&lt;br /&gt;Arranque del servidor y de la consola MongoDB&lt;br /&gt;&lt;br /&gt;Primeramente, arrancar el servidor de MongoDB desde una consola DOS (para Linux, los pasos son muy similares):&lt;br /&gt;&lt;br /&gt;&lt;i&gt;cd c:\mongodb-win32-i386-1.2.4\bin&lt;br /&gt;mongod&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;A continuación, arrancar la consola de MongoDB (dbShell) en otra consola DOS:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;cd c:\mongodb-win32-i386-1.2.4\bin&lt;br /&gt;mongo&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Creación de la base de datos y de la colección&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Aunque no se haya creado aún la base de datos, utilizar ésta (asumirá que se va a utilizar para ser creada):&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;gt; use ejemplo&lt;br /&gt;switched to db ejemplo&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;A continuación crear un objeto que contendrá un documento, el cual se insertará en la colección “agenda” (aún no creada):&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;gt; doc = {nombre: "Rafael", apellido1: "Gonzalez",  apellido2: "Martin", telefono: "912406790"}&lt;br /&gt;&lt;br /&gt;{&lt;br /&gt;"nombre" : "Rafael",&lt;br /&gt;"apellido1" : "Gonzalez",&lt;br /&gt;"apellido2" : "Martin",&lt;br /&gt;"telefono" : "912406790"&lt;br /&gt;}&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;El siguiente paso es añadir este objeto (documento) a la colección “agenda”:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;gt; db.agenda.save(doc)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Se puede abreviar el proceso en un solo paso, creando directamente el objeto:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;gt; db.agenda.save({nombre: "Rafael", apellido1: "Gonzalez",  apellido2: "Martin", telefono: "912406790"})&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Esto equivaldría a la sentencia SQL:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;INSERT INTO agenda (nombre, apellido1, apellido2, telefono) VALUES (‘Rafael’, ‘Gonzalez’, ‘Martin’, ‘912406790’)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Automáticamente, MongoDB crea los objetos por asunción. De esta manera, crea la base de datos “ejemplo”, y dentro de ésta crea la colección “agenda”, y dentro de ésta crea y agrega el documento “doc”.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Verificaciones&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Para verificar todo lo anterior primero comprobaremos qué base de datos está en uso:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;gt; db&lt;br /&gt;ejemplo&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;A continuación, listaremos las bases de datos creadas con MongoDB:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;gt; show dbs&lt;br /&gt;&lt;br /&gt;admin&lt;br /&gt;ejemplo&lt;br /&gt;local&lt;br /&gt;test&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Las bases de datos “admin”, “local” y “test” son las bases de datos que por defecto tiene MongoDB.&lt;br /&gt;&lt;br /&gt;La siguiente verificación será comprobar qué colecciones disponemos en la base de datos en uso (“ejemplo”):&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;gt; show collections&lt;br /&gt;agenda&lt;br /&gt;system.indexes&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;La colección “system.indexes” es creada y mantenida de forma automática por MongoDB para el control y gestión de los índices de las colecciones.&lt;br /&gt;&lt;br /&gt;Para visualizar solamente las colecciones no internas de MongoDB, se puede usar el siguiente comando:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;gt; db.getCollectionNames()&lt;br /&gt;[ "agenda", "system.indexes" ]&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Para conocer a qué base de datos pertenece una determinada colección:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;gt; db.agenda.getDB()&lt;br /&gt;ejemplo&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Para conocer qué comandos se puede usar para tratar la colección:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;gt; db.agenda.help()&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Consultas a los datos&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Para visualizar todos los objetos (documentos) de la colección:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;gt; db.agenda.find()&lt;br /&gt;{ "_id" : ObjectId("4ba8a3be5b3d00000000710f"), "nombre" : "Rafael", "apellido1" : "Gonzalez", "apellido2" : "Martin", "telefono" : "912406790" }&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Automáticamente, MongoDB asigna un ID único a cada objeto de la colección (clave “_id”).&lt;br /&gt;&lt;br /&gt;Vamos a añadir más documentos a la colección:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;db.agenda.save({nombre:"Carlos",apellido1:"Sanchez",apellido2:"Sanchez",telefono:"91240890012",email:"carlosss@hotmail.com"}) db.agenda.save({nombre:"Javier",apellido1:"Cristobal",apellido2:"Nombela",telefono:"925407561",email:"javichuc@yahoo.es"})&lt;br /&gt;db.agenda.save({nombre:"Yolanda",apellido1:"Ballesteros",apellido2:"Lopez",telefono:"925406902"})&lt;br /&gt;db.agenda.save({nombre:"Antonio",apellido1:"Blazquez",apellido2:"Fernandez",telefono:"937607812"})&lt;br /&gt;db.agenda.save({nombre:"Jose Miguel", apellido1:"Carvajal", apellido2:"Gomez", telefono:"983679103", email:"picachu234@gmx.com"})&lt;br /&gt;db.agenda.save({nombre:"Juan Carlos", apellido1:"Blazquez", apellido2:"Gil", telefono:"925403789"})&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Lista de todos los objetos de la colección:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;gt; db.agenda.find()&lt;br /&gt;{ "_id" : ObjectId("4ba8a3be5b3d00000000710f"), "nombre" : "Rafael", "apellido1" : "Gonzalez", "apellido2" : "Martin", "telefono" : "912406790" }&lt;br /&gt;{ "_id" : ObjectId("4ba8aac55b3d000000007110"), "nombre" : "Carlos", "apellido1" : "Sanchez", "apellido2" : "Sanchez", "telefono" : "91240890012", "email" : "carlosss@hotmail.com" }&lt;br /&gt;{ "_id" : ObjectId("4ba8ab435b3d000000007111"), "nombre" : "Javier", "apellido1" : "Cristobal", "apellido2" : "Nombela", "telefono" : "925407561", "email" : "javichuc@yahoo.es" }&lt;br /&gt;{ "_id" : ObjectId("4ba8ac3f5b3d000000007112"), "nombre" : "Yolanda", "apellido1" : "Ballesteros", "apellido2" : "Lopez", "telefono" : "925406902" }&lt;br /&gt;{ "_id" : ObjectId("4ba8ac865b3d000000007113"), "nombre" : "Antonio", "apellido1" : "Blazquez", "apellido2" : "Fernandez", "telefono" : "937607812" }&lt;br /&gt;{ "_id" : ObjectId("4ba8acde5b3d000000007114"), "nombre" : "Jose Miguel", "apellido1" : "Carvajal", "apellido2" : "Gomez", "telefono" : "983679103", "email" : "picachu234@gmx.com" }&lt;br /&gt;{ "_id" : ObjectId("4ba8af123433000000003118"), "nombre" : "Juan Carlos", "apellido1" : "Blazquez", "apellido2" : "Gil", "telefono" : "925403789" }&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Esto equivaldría a la sentencia SQL:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;SELECT * FROM agenda&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Cuando la colección contiene múltiples objetos será necesario introducir criterios en la búsqueda. El comando “find” permite pasar como parámetros dichos criterios (en formato JSON), los cuales recogen el par (clave/valor) a encontrar. El siguiente comando localiza todos los objetos en cuyo primer apellido sea “Blazquez”:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;gt; db.agenda.find({"apellido1":"Blazquez"})&lt;br /&gt;{ "_id" : ObjectId("4ba8ac865b3d000000007113"), "nombre" : "Antonio", "apellido1" : "Blazquez", "apellido2" : "Fernandez", "telefono" : "937607812" }&lt;br /&gt;{ "_id" : ObjectId("4ba8af123433000000003118"), "nombre" : "Juan Carlos", "apellido1" : "Blazquez", "apellido2" : "Gil", "telefono" : "925403789" }&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Lo anterior equivaldría a la sentencia SQL:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;SELECT * FROM agenda WHERE apellido1=”Blazquez”&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Mediante el siguiente comando sabremos cuántos objetos tiene la colección:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;gt; db.agenda.count()&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;En un conjunto de datos, para limitar el número de objetos retornados, se especificaría añadiendo el comando limit():&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;gt; db.agenda.find().limit(3)&lt;br /&gt;{ "_id" : ObjectId("4ba8a3be5b3d00000000710f"), "nombre" : "Rafael", "apellido1" : "Gonzalez", "apellido2" : "Martin", "telefono" : "912406790" }&lt;br /&gt;{ "_id" : ObjectId("4ba8aac55b3d000000007110"), "nombre" : "Carlos", "apellido1" : "Sanchez", "apellido2" : "Sanchez", "telefono" : "91240890012", "email" : "carlosss@hotmail.com" }&lt;br /&gt;{ "_id" : ObjectId("4ba8ab435b3d000000007111"), "nombre" : "Javier", "apellido1" : "Cristobal", "apellido2" : "Nombela", "telefono" : "925407561", "email" : "javichuc@yahoo.es" }&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;El comando count() también se puede añadir a find() para saber cuántos objetos ha retornado:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;gt; db.agenda.find({apellido1:"Blazquez"}).count()&lt;br /&gt;2&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;En el caso de querer visualizar solamente el primero de un conjunto de datos retornados, se usaría el comando findOne():&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;gt; db.agenda.findOne({apellido1:"Blazquez"})&lt;br /&gt;{&lt;br /&gt;"_id" : ObjectId("4ba8ac865b3d000000007113"),&lt;br /&gt;"nombre" : "Antonio",&lt;br /&gt;"apellido1" : "Blazquez",&lt;br /&gt;"apellido2" : "Fernandez",&lt;br /&gt;"telefono" : "937607812"&lt;br /&gt;}&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Para especificar más criterios, éstos se separan por comas:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;gt; db.agenda.find({"apellido1":"Blazquez","nombre":"Antonio"})&lt;br /&gt;{ "_id" : ObjectId("4ba8ac865b3d000000007113"), "nombre" : "Antonio", "apellido1" : "Blazquez", "apellido2" : "Fernandez", "telefono" : "937607812" }&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Su equivalente en SQL sería el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;SELECT * FROM agenda WHERE apellido1=”Blazquez” AND nombre=”Antonio”&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;El comando find() retorna realmente un cursor, el cual puede ser utilizado para un acceso más controlado. El siguiente ejemplo se declara una variable que recoge el cursor del comando find(), situándose antes del primer registro. A continuación se declara un bucle while que se repetirá mientras el cursor tenga elementos o no alcance el final (hasNext()). En este bucle se imprimirá, en formato JSON, el objeto actual sobre el cual está situado el cursor. Mediante el comando next(), el cursor avanzará al siguiente objeto.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;gt; var cursor = db.agenda.find()&lt;br /&gt;&amp;gt; while (cursor.hasNext()) { print(tojson(cursor.next())); }&lt;br /&gt;{&lt;br /&gt;"_id" : ObjectId("4ba8a3be5b3d00000000710f"),&lt;br /&gt;"nombre" : "Rafael",&lt;br /&gt;"apellido1" : "Gonzalez",&lt;br /&gt;"apellido2" : "Martin",&lt;br /&gt;"telefono" : "912406790"&lt;br /&gt;}&lt;br /&gt;…&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;El siguiente ejemplo, recoge el cursor y accede directamente al tercer objeto del mismo:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;gt; var cursor=db.agenda.find()&lt;br /&gt;&amp;gt; print(tojson(cursor[3]))&lt;br /&gt;{&lt;br /&gt;"_id" : ObjectId("4ba8ac3f5b3d000000007112"),&lt;br /&gt;"nombre" : "Yolanda",&lt;br /&gt;"apellido1" : "Ballesteros",&lt;br /&gt;"apellido2" : "Lopez",&lt;br /&gt;"telefono" : "925406902"&lt;br /&gt;}&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;La variable “cursor” se podría ver como un array de objetos, por lo que si se quiere acceder a cualquier clave del mismo, se especifica mediante un punto, como si fuera una propiedad:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&amp;gt; print(cursor[3].nombre, cursor[3].apellido1, cursor[3].telefono)&lt;br /&gt;Yolanda Ballesteros 925406902&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;a href="http://www.safecreative.org/work/1003235820060" xmlns:cc="http://creativecommons.org/ns#" rel="cc:license"&gt;&lt;img src="http://resources.safecreative.org/work/1003235820060/label/barcode-150" style="border:0;" alt="Safe Creative #1003235820060"/&gt;&lt;/a&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-4965151891995672038?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/4965151891995672038/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=4965151891995672038&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/4965151891995672038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/4965151891995672038'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/conceptos-basicos-de-mongodb.html' title='Conceptos básicos de MongoDB'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-6640639268791447564</id><published>2010-11-29T08:01:00.003+01:00</published><updated>2010-11-29T08:01:50.500+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='MongoDB'/><title type='text'>Primeros pasos en MongoDB</title><content type='html'>&lt;b&gt;&lt;u&gt;Introducción&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;MongoDB es una base de datos opensource que está teniendo mucha aceptación por las prestaciones que ofrece en entorno Web 2.0, aunque puede ser utilizada en cualquier tipo de situaciones. MongoDB acerca el sistema de almacenamiento y gestión de datos tipo clave/valor, puliendo la diferencia con respecto a los sistemas de bases de datos relacionales. Este sistema permite una tremenda rapidez y escalabilidad, frente a la funcionalidad de los sistemas de bases de datos tradicionales.&lt;br /&gt;&lt;br /&gt;Las principales características de MongoDB son las siguientes:&lt;br /&gt;- Software abierto&lt;br /&gt;- Escalable&lt;br /&gt;- Alto rendimiento&lt;br /&gt;- Alta disponibilidad (puede trabajar en modo maestro-esclavo)&lt;br /&gt;- Orientado a documentos (no es relacional)&lt;br /&gt;- Simplicidad basada en esquemas de tipo JSON&lt;br /&gt;- Consultas dinámicas&lt;br /&gt;- Completo soporte de índices, incluyendo índices secundarios, objetos internos, arrays (cadenas) embebidos, geospacial&lt;br /&gt;- Rápido, actualizaciones in situ.&lt;br /&gt;- Perfilado de consultas&lt;br /&gt;- Almacenamiento eficiente de datos binarios en objetos largos, tales como vídeos o fotografías&lt;br /&gt;- Replicación y soporte a prueba de fallos&lt;br /&gt;- Auto fragmentación para escalabilidad a nivel de nube.&lt;br /&gt;- Agregación compleja mediante MapReduce&lt;br /&gt;- Acceso y gestión mediante drivers en multitud de lenguajes de programación: C, C++, C#, .NET, Java, JavaScript, PHP, Phyton, Ruby, Perl, etc.&lt;br /&gt;- Soporte, formación y consultoría.&lt;br /&gt;&lt;br /&gt;En este artículo (que espero sea el primero de muchos), se realiza una pequeña introducción a MongoDB.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Orientación a documentos&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;La información en MongoDB no se almacena en tablas (con sus correspondiente filas y columnas), si no en colecciones (estructuradas o no) cuyos datos forman parejas de clave y valor. Estos datos se almacenan con un estilo JSON, en formato binario llamado BSON. Un ejemplo de este estilo se puede apreciar en el siguiente documento:&lt;br /&gt;&lt;br /&gt;&lt;font face="courier" size="1"&gt;{ nombre: ‘Rafael’,&lt;br /&gt;apellidos: ‘Hernamperez Martin’,&lt;br /&gt;fechaingreso: Date(’03-22-2010’),&lt;br /&gt;seleccion: [‘Aprenda MongoDB’,’Flex 4 en una semana’,’AJAX para Dummies’],&lt;br /&gt;comentarios: [{autor: ‘adan3000’, comentario: ‘Buena eleccion’},&lt;br /&gt;{autor: ‘majopero’, comentario: ‘Te has pasado’, puntuacion:5}&lt;br /&gt;]&lt;br /&gt;}&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Una colección sería similar a una tabla, y un documento sería similar a una fila. Habría que distinguir claramente, pues la colección puede tener documentos con estructura similar pero no igual (algunos documentos podrían tener más o menos claves). Asimismo, una única clave podría tener una colección de valores (array o cadena, como en el caso de la clave “seleccion"), o bien podría ser también una sub-colección con sus respectivos documentos (como en el caso de la clave “comentarios”).&lt;br /&gt;&lt;br /&gt;La sintaxis en formato JSON es muy fácil de entender, eliminando los problemas de errores que pueden ocurrir en el formato XML (ambos son muy sinérgicos), además de reducir el tamaño de la información a transportar.&lt;br /&gt;&lt;br /&gt;Este formato es utilizado no sólo para entenderlos, sino también para gestionarlos y realizar consultas en sus campos internos. Por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;font face="courier" size="1"&gt;db.compras.find({'nombre':'Rafael'})&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Nota: si falla, probar con comillas dobles&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Esta consulta localizaría todos los documentos dentro de la colección “compras” cuya clave “nombre” tenga el valor “Rafael”.&lt;br /&gt;&lt;br /&gt;Otro ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;font face="courier" size="1"&gt;db.compras.find({'comentarios.autor':'adan3000'})&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Esta consulta localizaría todos los documentos dentro de la colección “compras” cuyo comentario haya sido realizado por el “autor” llamado “adan3000”.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Instalación&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;Para nuestros propósitos utilizaremos Windows como plataforma de operaciones. También puede instalarse en sistemas operativos OS X, Linux y Solaris (ver instrucciones en &lt;a href="http://www.mongodb.org/display/DOCS/Quickstart"&gt;http://www.mongodb.org/display/DOCS/Quickstart&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;En primer lugar hay que crear la siguiente ruta de directorio: “c:\data\db”. Esta ruta es la ruta por defecto para los archivos de bases de datos.&lt;br /&gt;&lt;br /&gt;A continuación descargar el archivo zip (ocupa apenas 13MB) de la siguiente URL:&lt;br /&gt;&lt;a href="http://www.mongodb.org/display/DOCS/Downloads"&gt;http://www.mongodb.org/display/DOCS/Downloads&lt;/a&gt;&lt;br /&gt;y descomprimirlo en la ruta que deseemos (por ejemplo en C:\ donde creará un subdirectorio llamado “mongodb-winxx-xxxx”). &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Arrancar un servidor MongoDB&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;MongoDB se ejecuta principalmente en su consola. Para ello se accede al modo consola DOS de Windows (pulsar AltGr+R, escribir “cmd” (sin las comillas) y Aceptar).&lt;br /&gt;&lt;br /&gt;Acceder al directorio “bin” de donde se descomprimió el fichero zip (ejemplo):&lt;br /&gt;&lt;br /&gt;&lt;font face="courier" size="1"&gt;cd c:\mongodb-win32-i386-1.2.4\bin&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Ahora, para lanza MongoDB por defecto, ejecutar el ejecutable:&lt;br /&gt;&lt;br /&gt;&lt;font face="courier" size="1"&gt;mongod&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Con esto, MongoDB accederá a las bases de datos almacenadas en el directorio &lt;br /&gt;c:\data\db y usando el puerto 27017. Si se desea cambiar el directorio de ficheros de bases de datos o el puerto, usar los siguientes parámetros:&lt;br /&gt;&lt;br /&gt;&lt;font face="courier" size="1"&gt;mongod --dbpath [rutadirectorio] --port [puerto]&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Si acaso saltase el cortafuegos, desbloquear el acceso para poder usarlo.&lt;br /&gt;&lt;br /&gt;Para parar la base de datos, pulsar Ctrl+C. Con ello, MongoDB esperará hasta que todas las operaciones se hayan completado, guardando las últimas transacciones y cerrando los ficheros.&lt;br /&gt;&lt;br /&gt;Existen otros parámetros que pueden ser usados por el motor de MongoDB:&lt;br /&gt;-h (--help): Muestra información sobre los parámetros permitidos&lt;br /&gt;--logpath rutafichero: Especifica fichero de log&lt;br /&gt;--logappend: añade al log, en lugar de sobreescribirlo&lt;br /&gt;--cpu: log periódico de la CPU y de los tiempos de entrada/salida&lt;br /&gt;--fork: ejecución como demonio&lt;br /&gt;--auth: Activa la seguridad&lt;br /&gt;--noauth: Desactiva la seguridad (por defecto)&lt;br /&gt;--nohttpinterface: Desactiva la interfaz http (localhost:27018)&lt;br /&gt;--master: Designa este servidor como maestro (entorno de alta disponibilidad)&lt;br /&gt;--slave: Designa este servidor como esclavo (entorno de alta disponibilidad)&lt;br /&gt;--autoresync: Resincronización automática del servidor esclavo.&lt;br /&gt;--source servidor:puerto: Para un servidor esclavo especifica dónde está el servidor maestro para la replicación&lt;br /&gt;&lt;br /&gt;Una forma sencilla de arrancar el servidor MongoDB sin repetir los parámetros, es añadiendo éstos a un fichero de configuración. El formato del fichero sería el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;font face="courier" size="1"&gt;#comentario&lt;br /&gt;parametro1 = valor1&lt;br /&gt;parametro2 = valor 2&lt;br /&gt;…&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Para lanzar el servidor usando este fichero, ejecutar:&lt;br /&gt;&lt;br /&gt;&lt;font face="courier" size="1"&gt;mongod –config ficheroconfiguración&lt;br /&gt;mongod –f ficheroconfiguración&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Consola de MongoDB&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;Una vez arrancado el servidor, podemos utilizar la consola de MongoDB para interactuar con las bases de datos. Para ello, acceder al modo consola DOS de Windows (pulsar AltGr+R, escribir “cmd” (sin las comillas) y Aceptar).&lt;br /&gt;&lt;br /&gt;Acceder al directorio “bin” de donde se descomprimió el fichero zip (ejemplo):&lt;br /&gt;&lt;br /&gt;&lt;font face="courier" size="1"&gt;cd c:\mongodb-win32-i386-1.2.4\bin&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Ahora, lanzar la consola de MongoDB:&lt;br /&gt;&lt;br /&gt;&lt;font face="courier" size="1"&gt;mongo&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;(nótese que no tiene la "d" final).&lt;br /&gt;&lt;br /&gt;En esta nueva consola, nos permitirá escribir los comandos necesarios para interactuar con el servidor (mongod), de tal forma que podamos gestionar documentos y estructuras o acceder a la información (entre muchas acciones). Cada comando ha de estar acompañado por un “Enter” para su ejecución.&lt;br /&gt;&lt;br /&gt;Por defecto se conecta a una base de datos llamada “test” (por defecto).&lt;br /&gt;&lt;br /&gt;Para mostrar la base de datos en uso:&lt;br /&gt;&lt;font face="courier" size="1"&gt;db&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Para autentificar un usuario (sólo cuando se ejecuta el servidor en modo seguridad):&lt;br /&gt;&lt;font face="courier" size="1"&gt;db.auth(usuario,contraseña)&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Para salir de la consola MongoDB, escribir el comando &lt;br /&gt;&lt;font face="courier" size="1"&gt;exit&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Para conseguir ayuda sobre los comandos disponibles, escribir el comando&lt;br /&gt;&lt;font face="courier" size="1"&gt;help&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Para mostrar las bases de datos disponibles:&lt;br /&gt;&lt;font face="courier" size="1"&gt;show dbs&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Para mostrar las colecciones de la base de datos actual:&lt;br /&gt;&lt;font face="courier" size="1"&gt;show collections&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Para mostrar los usuarios de la base de datos actual:&lt;br /&gt;&lt;font face="courier" size="1"&gt;show users&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Para utilizar una base de datos:&lt;br /&gt;&lt;font face="courier" size="1"&gt;use nombrebasedatos&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Para mostrar ayuda sobre los métodos de base de datos:&lt;br /&gt;&lt;font face="courier" size="1"&gt;db.help()&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Para mostrar ayuda sobre los métodos para la colección foo:&lt;br /&gt;&lt;font face="courier" size="1"&gt;db.foo.help()&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;Para mostrar los objetos en una colección foo:&lt;br /&gt;&lt;font face="courier" size="1"&gt;db.foo.find()&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Referencias&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;Sitio oficial de MongoDB: &lt;a href="http://www.mongodb.org"&gt;http://www.mongodb.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.safecreative.org/work/1003225810323" xmlns:cc="http://creativecommons.org/ns#" rel="cc:license"&gt;&lt;img src="http://resources.safecreative.org/work/1003225810323/label/barcode-150" style="border:0;" alt="Safe Creative #1003225810323"/&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-6640639268791447564?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/6640639268791447564/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=6640639268791447564&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6640639268791447564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6640639268791447564'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/primeros-pasos-en-mongodb.html' title='Primeros pasos en MongoDB'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-1703197101608723679</id><published>2010-11-26T08:02:00.000+01:00</published><updated>2010-11-26T08:02:42.743+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Coaching'/><title type='text'>Los picapedreros</title><content type='html'>Cierta vez, el jefe de una cantera visitó a sus picapedreros, preguntándoles qué hacían y cómo les iba:&lt;br /&gt;- Estoy ganándome la vida - dijo indiferente el primero.&lt;br /&gt;- Estoy realizando el mejor y más eficiente trabajo de picar piedras del mundo - dijo con orgullo el segundo.&lt;br /&gt;- Estoy construyendo la mejor de las catedrales - respondió con devoción el tercero.&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-1703197101608723679?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/1703197101608723679/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=1703197101608723679&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/1703197101608723679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/1703197101608723679'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/los-picapedreros.html' title='Los picapedreros'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-4859715352749365985</id><published>2010-11-23T21:27:00.002+01:00</published><updated>2010-11-23T21:27:27.938+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Internet'/><title type='text'>¿Sueñan los bits con redes neutrales?</title><content type='html'>&lt;object width="480" height="390"&gt;&lt;param name="movie" value="http://www.youtube.com/v/jvEOFGvvC2U&amp;hl=es_ES&amp;feature=player_embedded&amp;version=3"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/jvEOFGvvC2U&amp;hl=es_ES&amp;feature=player_embedded&amp;version=3" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="480" height="390"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-4859715352749365985?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/4859715352749365985/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=4859715352749365985&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/4859715352749365985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/4859715352749365985'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/suenan-los-bits-con-redes-neutrales.html' title='¿Sueñan los bits con redes neutrales?'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-6189104769915741840</id><published>2010-11-22T19:35:00.002+01:00</published><updated>2010-11-22T19:35:45.242+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Coaching'/><title type='text'>No me digan que no pueden</title><content type='html'>&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/O-6cS7dtp0o?fs=1&amp;amp;hl=es_ES"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/O-6cS7dtp0o?fs=1&amp;amp;hl=es_ES" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-6189104769915741840?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/6189104769915741840/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=6189104769915741840&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6189104769915741840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/6189104769915741840'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/no-me-digan-que-no-pueden.html' title='No me digan que no pueden'/><author><name>Rafael Hernampérez</name><uri>https://profiles.google.com/111989909116190075662</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-_XHAcDDR-DY/AAAAAAAAAAI/AAAAAAAACCs/94jh3N81t_M/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9291335.post-7779981166568562712</id><published>2010-11-22T19:25:00.001+01:00</published><updated>2010-11-22T19:25:16.237+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Coaching'/><title type='text'>No es cuestión de ganar, si no de llegar</title><content type='html'>&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/JwOhLsEgrbE?fs=1&amp;amp;hl=es_ES"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/JwOhLsEgrbE?fs=1&amp;amp;hl=es_ES" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;Technology IT News&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9291335-7779981166568562712?l=rafinguer.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rafinguer.blogspot.com/feeds/7779981166568562712/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9291335&amp;postID=7779981166568562712&amp;isPopup=true' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/7779981166568562712'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9291335/posts/default/7779981166568562712'/><link rel='alternate' type='text/html' href='http://rafinguer.blogspot.com/2010/11/no-es-cuestion-de-ganar-si-no-de-llegar.html' title='No es cuestión de ganar, si no d
