<?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-2414767007963539564</id><updated>2011-10-23T12:02:05.224+02:00</updated><category term='Python'/><category term='RSS'/><category term='Ruby'/><category term='Chromium OS'/><category term='Bluetooth'/><category term='Hardware'/><category term='VB.NET'/><category term='RubyGems'/><category term='Ubuntu'/><category term='Ruby on Rails'/><category term='Blogger'/><category term='Java'/><category term='PyInstaller'/><category term='Symbian'/><category term='Google'/><category term='PyS60'/><category term='USB'/><title type='text'>Todos somos NewBies</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://devnewbies.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2414767007963539564/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://devnewbies.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>germaN</name><uri>http://www.blogger.com/profile/01856778823794723379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://bp0.blogger.com/_0EkSTb-lzIQ/SFntmejoClI/AAAAAAAAAA4/CtxIoSeIl0E/S220/1188220980_f.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2414767007963539564.post-4526977661289349232</id><published>2011-04-26T14:41:00.003+02:00</published><updated>2011-04-26T14:46:02.842+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'></title><content type='html'>Hoy vengo con una entrada muy sencillita, es una tonteria pero me dije voy a publicarla que es simpatica.&lt;br /&gt;&lt;br /&gt;es un escanner de puertos MUY basico, en java.&lt;br /&gt;&lt;br /&gt;import java.net.*;&lt;br /&gt;import java.io.*;&lt;br /&gt;&lt;br /&gt;public class Escaner {&lt;br /&gt;&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt;String host = "localhost";&lt;br /&gt;Socket s;&lt;br /&gt;for (int puerto = 1; puerto &amp;lt; 65.535; puerto ++) {&lt;br /&gt;try {&lt;br /&gt; s = new Socket(host,puerto);&lt;br /&gt; System.out.println(puerto + " Abierto");&lt;br /&gt;}&lt;br /&gt;catch (UnknownHostException e) {&lt;br /&gt;    System.out.println("Host Sin resultado");&lt;br /&gt;}&lt;br /&gt;catch (IOException e) {&lt;br /&gt;System.out.println(puerto + " Cerrado");&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Como podeis ver usa la excepcion IOException para ver que no hay ningun servidor escuchando.&lt;br /&gt;&lt;br /&gt;Cambiando el host podeis probar la que querias.&lt;br /&gt;&lt;br /&gt;Un saludo&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2414767007963539564-4526977661289349232?l=devnewbies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devnewbies.blogspot.com/feeds/4526977661289349232/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devnewbies.blogspot.com/2011/04/hoy-vengo-con-una-entrada-muy.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2414767007963539564/posts/default/4526977661289349232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2414767007963539564/posts/default/4526977661289349232'/><link rel='alternate' type='text/html' href='http://devnewbies.blogspot.com/2011/04/hoy-vengo-con-una-entrada-muy.html' title=''/><author><name>Manu</name><uri>http://www.blogger.com/profile/00088060795123367009</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2414767007963539564.post-9126506075898872777</id><published>2011-01-18T15:57:00.009+01:00</published><updated>2011-01-24T11:49:53.414+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VB.NET'/><title type='text'>El proveedor ‘Microsoft.ACE.OLEDB.12.0′ no está registrado en el equipo local</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Bueno, a raíz de una sencilla practica en visual basic .net de clase , una aplicación típica de gestión de clientes, proveedores, stock..etc la cual accede a una base de datos en access. al llevármelo a casa y probarlo me tiraba el siguiente err&lt;span class="Apple-style-span"&gt;or:&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); line-height: 19px; "&gt;&lt;span style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;"El proveedor ‘Microsoft.ACE.OLEDB.12.0′ no está registrado en el equipo local&lt;/span&gt;&lt;span class="Apple-style-span"&gt;."&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(51, 51, 51); line-height: 19px; "&gt;&lt;span style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;b&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;Según &lt;/span&gt;&lt;span class="Apple-style-span" style="line-height: 19px; "&gt;descubrí&lt;/span&gt;&lt;span class="Apple-style-span" style="line-height: 19px; "&gt; este error puede darse por 2 motivos:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px; "&gt;&lt;b&gt;1- No existen los drivers 2007 para la plataforma 64 bits.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;Solución:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px; "&gt;Configurar Visual &lt;/span&gt;Studio&lt;span class="Apple-style-span" style="line-height: 19px;"&gt; para x86 en las propiedades del proyecto, en la pestaña "Compilar" pulsamos "Opciones de compilación avanzada..." y a continuación seleccionamos x86 en el CPU de destino.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;img src="http://2.bp.blogspot.com/_IV7820Tjy5w/TTWwV-wD9tI/AAAAAAAAAAU/n5LlOwtsEoo/s320/entera.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 256px;" border="0" alt="" id="BLOGGER_PHOTO_ID_5563546806354441938" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;b&gt;2- El Equipo desde donde lo ejecutas no tiene los drivers de office 2007&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px; color: rgb(51, 51, 51); "&gt;En este caso también tiene sencilla solución, puedes descargar estos drivers desde &lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;u&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=7554f536-8c28-4598-9b72-ef94e038c891&amp;amp;displayLang=es"&gt;aquí&lt;/a&gt;&lt;/u&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;Bueno espero que a alguno le ahorre buscar por ahí :P&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;Saludos y hasta otra!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px;"&gt;Manu Figueroa&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="line-height: 19px; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2414767007963539564-9126506075898872777?l=devnewbies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devnewbies.blogspot.com/feeds/9126506075898872777/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devnewbies.blogspot.com/2011/01/bueno-raiz-de-una-sencilla-practica-en.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2414767007963539564/posts/default/9126506075898872777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2414767007963539564/posts/default/9126506075898872777'/><link rel='alternate' type='text/html' href='http://devnewbies.blogspot.com/2011/01/bueno-raiz-de-una-sencilla-practica-en.html' title='El proveedor ‘Microsoft.ACE.OLEDB.12.0′ no está registrado en el equipo local'/><author><name>Manu</name><uri>http://www.blogger.com/profile/00088060795123367009</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_IV7820Tjy5w/TTWwV-wD9tI/AAAAAAAAAAU/n5LlOwtsEoo/s72-c/entera.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2414767007963539564.post-3639873571124723912</id><published>2009-12-16T22:44:00.003+01:00</published><updated>2009-12-17T02:50:58.732+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PyS60'/><category scheme='http://www.blogger.com/atom/ns#' term='Symbian'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Python en Symbian con PyS60</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Hoy nos vamos a cambiar de plataforma. Vamos a ver como instalar el intérprete de &lt;b&gt;Python&lt;/b&gt; en un teléfono&lt;b&gt; móvil&lt;/b&gt; con sistema operativo &lt;b&gt;Symbian S60&lt;/b&gt; y pondré un par de ejemplos sencillos para dar un primer impulso a todos los que estéis interesados en la programación en Python para dispositivos móviles.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En mi caso voy a utilizar un teléfono Nokia E65. Lo primero que debemos hacer es asegurarnos de que edición de S60 tiene nuestro teléfono. Estó lo podremos solucionar visitando &lt;a href="http://en.wikipedia.org/wiki/Nokia_S60_and_Symbian_OS"&gt;esta página&lt;/a&gt;. En el caso del Nokia E65 podemos ver que usa S60 3rd Edition. Visto esto nos dispondremos a descargarnos el intérprete de Python para nuestra versión del sistema operativo y la shell interactiva por si nos interesa hacer alguna prueba.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Nos dirigimos a la página del proyecto PyS60 en &lt;a href="http://sourceforge.net/projects/pys60/files/"&gt;sourceforge.net&lt;/a&gt; y descargamos la versión que corresponda tanto del intérprete como de la shell interactiva. En el caso de mi dispositivo descargué:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; - PythonForS60_1_4_5_3rdEd.sis&amp;nbsp; ( Interprete de Python )&lt;br /&gt;&amp;nbsp;&amp;nbsp; - PythonScriptShell_1_4_5_3rdEd.SIS ( Shell interactiva ) &lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Una vez tengamos esto descargado en nuestro ordenador conectamos el teléfono vía USB y cuando nos muestre el tipo de conexión que queremos realizar elegimos "Transferencia de Datos". Primeramente debemos crear una carpeta en "E:" llamada Python (E:\Python, esto solamente es necesario para los dispositivos de la 3ª Edición) que es donde alojaremos nuestros scripts y donde se alojarán además los scripts de prueba que vienen por defecto en la instalación. Hecho esto podemos volver a conectar el móvil usando esta vez la opción Nokia PC Suite. En el menú elegiremos instalar aplicación y buscaremos primero el intérprete de Python y lo instalaremos. Al finalizar su instalación haremos lo propio con la shell interactiva y ya podemos probar el funcionamiento de Python en nuestro teléfono.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Para ello vamos a aplicaciones y seleccionamos Python. Una vez dentro le damos a opciones y luego Run Script. Se nos mostrarán los siguientes scripts de prueba que podremos ejecutar para ver su funcionamiento:&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; - ball.py&amp;nbsp;&amp;nbsp; ( Una bola que podremos mover con las teclas )&lt;br /&gt;&amp;nbsp;&amp;nbsp; - filebrowser.py&amp;nbsp;&amp;nbsp; ( Un navegador de archivos simple )&lt;br /&gt;&amp;nbsp;&amp;nbsp; - gles_demo.py&amp;nbsp;&amp;nbsp; ( Figuras en 3D en movimiento )&lt;br /&gt;&amp;nbsp;&amp;nbsp; - imgviewer.py&amp;nbsp;&amp;nbsp; ( Un visor de imágenes sencillo )&lt;br /&gt;&amp;nbsp;&amp;nbsp; - simplecube.py&amp;nbsp;&amp;nbsp; ( Un cubo en 3D girando )&lt;br /&gt;&amp;nbsp;&amp;nbsp; - snake.py&amp;nbsp;&amp;nbsp; ( Típico juego de la serpiente escrito en Python )&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Todos estos scripts se encuentran en la carpeta creada anteriromente E:\Python&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Ahora desde nuestro ordenador podemos crear nuestro propio "Hello World" para nuestro teléfono. Es muy sencillo, basta con éstas dos líneas:&lt;br /&gt;&lt;/div&gt;&lt;code&gt;&lt;br /&gt;import appuifw&lt;br /&gt;&lt;br /&gt;appuifw.note(u"Hello Symbian!", "info")&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Para hacerlo más personal podemos añadir una línea más:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import appuifw&lt;br /&gt;&lt;br /&gt;nombre = appuifw.query(u"¿Como te llamas? ", "text")&lt;br /&gt;appuifw.note(u"Bienvenido " + nombre, "info")&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Ahora solo tendremos que copiarlo a la carpeta E:\Python de nuestro teléfono y ejecutarlo igual que los anteriores. Un detalle importante que cabe destacar antes de que empecéis a desarrollar aplicaciones es que para imprimir cadenas en pantalla es imprescindible tratarlas como unicode, por tanto no os olvidéis de la "u" delante de la cadena, de otra forma no funcionará. &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;span style="color: purple;"&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;span style="font-weight: bold;"&gt;germaNRG&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2414767007963539564-3639873571124723912?l=devnewbies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devnewbies.blogspot.com/feeds/3639873571124723912/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devnewbies.blogspot.com/2009/12/python-en-symbian-con-pys60.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2414767007963539564/posts/default/3639873571124723912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2414767007963539564/posts/default/3639873571124723912'/><link rel='alternate' type='text/html' href='http://devnewbies.blogspot.com/2009/12/python-en-symbian-con-pys60.html' title='Python en Symbian con PyS60'/><author><name>germaN</name><uri>http://www.blogger.com/profile/01856778823794723379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://bp0.blogger.com/_0EkSTb-lzIQ/SFntmejoClI/AAAAAAAAAA4/CtxIoSeIl0E/S220/1188220980_f.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2414767007963539564.post-5187754075527865373</id><published>2009-12-08T07:07:00.004+01:00</published><updated>2009-12-16T23:18:53.520+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Gráficas con Ruby en Ubuntu 9.10</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Hoy vamos a ver cómo hacer una gráfica de forma muy sencilla mediante Ruby. Para ello necesitaremos instalar el intérprete de Ruby que ya instalamos en &lt;a href="http://devnewbies.blogspot.com/2009/11/ruby-rubygems.html"&gt;posts anteriores&lt;/a&gt; así como el comando gems. Además de esto, tendremos que instalar la librería &lt;i&gt;RMagick&lt;/i&gt;, necesaria para hacer funcionar a la estrella de hoy:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;-&amp;nbsp; La librería &lt;a href="http://nubyonrails.com/pages/gruff"&gt;Gruff Graphs&lt;/a&gt; de Ruby&lt;br /&gt;&lt;br /&gt;Para las instalaciones lo haremos de la siguiente forma:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ sudo apt-get install librmagick-ruby&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ sudo gem install gruff&lt;br /&gt;&lt;br /&gt;Y una vez instalado todo, vamos a ver ejemplos de gráficas sencillas, rápidas y muy útiles!&lt;br /&gt;&lt;br /&gt;Primero una simple de barras:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/ruby&lt;br /&gt;&lt;br /&gt;require 'rubygems'&lt;br /&gt;require 'gruff'&lt;br /&gt;&lt;br /&gt;g = Gruff::Bar.new&lt;br /&gt;g.title = 'Una simple de Barras'&lt;br /&gt;g.data('Uno', 5)&lt;br /&gt;g.data('Dos', 3)&lt;br /&gt;g.data('Tres', 15)&lt;br /&gt;g.write('simple_de_barras.png')&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://img138.imageshack.us/img138/7856/simpledebarras.png" target="_blank"&gt;&lt;img alt="Simple de Barras" border="0" src="http://img138.imageshack.us/img138/7856/simpledebarras.th.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ahora una simple de líneas:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/ruby&lt;br /&gt;&lt;br /&gt;require 'rubygems'&lt;br /&gt;require 'gruff'&lt;br /&gt;&lt;br /&gt;g = Gruff::Line.new&lt;br /&gt;g.title = "Una simple de lineas"&lt;br /&gt;g.data("Uno", [24, 25, 18])&lt;br /&gt;g.data("Dos", [17.5, 17, 16.5])&lt;br /&gt;g.data("Tres", [4, 3.5, 9.5])&lt;br /&gt;g.data("Cuatro", [1, 6.5, 2.5])&lt;br /&gt;g.labels = {0 =&amp;gt; '2007', 1 =&amp;gt; '2008', 2 =&amp;gt; '2009'}&lt;br /&gt;g.write('simple_de_lineas.png')&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://img196.imageshack.us/img196/573/simpledelineas.png" target="_blank"&gt;&lt;img alt="Simple de lineas" border="0" src="http://img196.imageshack.us/img196/573/simpledelineas.th.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Y por último, otra de barras, con un poco más de gracia:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/ruby&lt;br /&gt;&lt;br /&gt;require 'rubygems'&lt;br /&gt;require 'gruff'&lt;br /&gt;&lt;br /&gt;g = Gruff::Bar.new('800x500')&lt;br /&gt;g.sort = false &lt;br /&gt;g.maximum_value = 50&lt;br /&gt;g.minimum_value = 0&lt;br /&gt;&lt;br /&gt;g.theme_37signals&lt;br /&gt;g.title = 'Una mejorada de barras'&lt;br /&gt;&lt;br /&gt;g.data('Votos', [5, 10, 24])&lt;br /&gt;g.data('Registros', [15, 3, 10])&lt;br /&gt;g.data('Visitas', [38, 15, 32])&lt;br /&gt;g.labels = {0 =&amp;gt; 'Hace 2 años', 1 =&amp;gt; 'Hace un año', 2 =&amp;gt; 'Este año'} &lt;br /&gt;g.write('mejorada_de_barras.png')&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://img46.imageshack.us/img46/1038/mejoradadebarras.png" target="_blank"&gt;&lt;img alt="Mejorada de barras" border="0" src="http://img46.imageshack.us/img46/1038/mejoradadebarras.th.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;b&gt;&lt;span style="background-color: white; color: purple; font-family: Arial,Helvetica,sans-serif;"&gt;germaNRG&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2414767007963539564-5187754075527865373?l=devnewbies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devnewbies.blogspot.com/feeds/5187754075527865373/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devnewbies.blogspot.com/2009/12/graficas-con-ruby-en-ubuntu-910.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2414767007963539564/posts/default/5187754075527865373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2414767007963539564/posts/default/5187754075527865373'/><link rel='alternate' type='text/html' href='http://devnewbies.blogspot.com/2009/12/graficas-con-ruby-en-ubuntu-910.html' title='Gráficas con Ruby en Ubuntu 9.10'/><author><name>germaN</name><uri>http://www.blogger.com/profile/01856778823794723379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://bp0.blogger.com/_0EkSTb-lzIQ/SFntmejoClI/AAAAAAAAAA4/CtxIoSeIl0E/S220/1188220980_f.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2414767007963539564.post-5085864004333718403</id><published>2009-12-06T03:48:00.000+01:00</published><updated>2009-12-16T23:13:36.820+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Hardware'/><category scheme='http://www.blogger.com/atom/ns#' term='USB'/><title type='text'>Mirando al 2010 - USB 3.0</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En estas fechas, que mejor que echar un vistazo a lo que se avecina para el próximo año. Vamos ha hablar del USB 3.0. Intel ya presentó este estándar hace algún tiempo en la IDF prometiendo que vería la luz a lo largo del año 2010. Pero, si aún hay algún despistado que no conoce lo que este nuevo estándar puede ofrecernos, vamos ha hacer aquí un pequeño resumen del avance que éste supone.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Para empezar, hablemos de los "problemas" o deficiencias que se han ido notando con el paso del tiempo en nuestro querido USB 2.0:&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&amp;nbsp;&amp;nbsp; - Relativa lentitud de transferencia de datos &lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&amp;nbsp;&amp;nbsp; - Poca capacidad de alimentación &lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Las principal novedad de este nuevo estándar radica en la adición de 5 líneas al cable. Un USB 2.0 disponía de cuatro líneas, dos de datos, una de corriente y otra de toma de tierra. Con el aumento se conseguirá, entre otras cosas, que se usen dos líneas para enviar datos y otras dos para la recepción permitiendo así un flujo de datos bidireccional en ambos sentidos al mismo tiempo y, un punto muy importante, un aumento de la velocidad muy considerable. El récord de velocidad de transmisión de un USB 2.0 se encontraba en 53 MBytes/seg. y con este nuevo estándar se pretenden alcanzar (teóricamente) los 600 MBytes/seg. Enlas primeras pruebas realizadas se han conseguido velocidade de hasta 307 MBytes/seg. y se espera que siga en aumento conforme se acerquen a la versión final. Esto se resume en transferir 50 GB en aproximadamente 2 minutos. De ahí que ya se le conozca también por el nombre de USB SuperSpeed.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Respecto a la alimentación, se ha aumentado 9 veces la actual. La intensidad de la corriente pasará de los 100 miliamperios actuales a 900. Esto nos dará la ventaja de cargar dispositivos más rápidamente o poder cargar un mayor número de dispositivos, por ejemplo, mediante un hub.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;La única pega que, por el momento, le pondría a este avance es el aumento de grosor del cable, que pasaría de ser muy fino y flexible a ser algo más duro y tener el grosor aproximado de un cable de red. Pero ponerle una pega con lo que sabemos por ahora, es ponerse quisquilloso. Ya veremos hasta donde nos sorprende...&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;b&gt;&lt;span style="color: purple; font-family: Arial,Helvetica,sans-serif;"&gt;germaNRG&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2414767007963539564-5085864004333718403?l=devnewbies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devnewbies.blogspot.com/feeds/5085864004333718403/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devnewbies.blogspot.com/2009/12/mirando-al-2010-usb-30.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2414767007963539564/posts/default/5085864004333718403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2414767007963539564/posts/default/5085864004333718403'/><link rel='alternate' type='text/html' href='http://devnewbies.blogspot.com/2009/12/mirando-al-2010-usb-30.html' title='Mirando al 2010 - USB 3.0'/><author><name>germaN</name><uri>http://www.blogger.com/profile/01856778823794723379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://bp0.blogger.com/_0EkSTb-lzIQ/SFntmejoClI/AAAAAAAAAA4/CtxIoSeIl0E/S220/1188220980_f.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2414767007963539564.post-9062110404018375475</id><published>2009-11-30T19:46:00.005+01:00</published><updated>2009-12-16T23:14:09.265+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Chromium OS'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><title type='text'>Google Chromium OS - III</title><content type='html'>Seguimos en la línea del sistemo operativo recientemente presentado por Google. Navegando por YouTube encontré este interesante vídeo cortesía de Google Chrome Channel que ellos definen como una demostración para hacernos ver la experiencia que puede tener un usuario con este nuevo sistema operativo. Para los que aún no sepan que es o no lo hayan visto funcionando es un vídeo muy recomendable para hacernos una idea general de las posibilidades que ofrece y sus principales ventajas.&lt;br /&gt;&lt;br /&gt;&lt;object height="315" width="500"&gt;&lt;param name="movie" value="http://www.youtube.com/v/ANMrzw7JFzA&amp;hl=es_ES&amp;fs=1&amp;rel=0&amp;color1=0xcc2550&amp;color2=0xe87a9f&amp;hd=1&amp;border=1"&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/ANMrzw7JFzA&amp;hl=es_ES&amp;fs=1&amp;rel=0&amp;color1=0xcc2550&amp;color2=0xe87a9f&amp;hd=1&amp;border=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="400" height="260"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color: purple; font-family: Arial,Helvetica,sans-serif; text-align: right;"&gt;&lt;b&gt;germaNRG&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2414767007963539564-9062110404018375475?l=devnewbies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devnewbies.blogspot.com/feeds/9062110404018375475/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devnewbies.blogspot.com/2009/11/google-chromium-os-iii.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2414767007963539564/posts/default/9062110404018375475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2414767007963539564/posts/default/9062110404018375475'/><link rel='alternate' type='text/html' href='http://devnewbies.blogspot.com/2009/11/google-chromium-os-iii.html' title='Google Chromium OS - III'/><author><name>germaN</name><uri>http://www.blogger.com/profile/01856778823794723379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://bp0.blogger.com/_0EkSTb-lzIQ/SFntmejoClI/AAAAAAAAAA4/CtxIoSeIl0E/S220/1188220980_f.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2414767007963539564.post-8734167938391130004</id><published>2009-11-26T15:00:00.002+01:00</published><updated>2009-12-16T23:14:09.266+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Chromium OS'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><title type='text'>Google Chromium OS - II</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Hola de nuevo!!&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Hoy vengo con una forma rápida y muy fácil de probar Chromium OS en nuestros pc's por cortesía de &lt;a href="http://twitter.com/hexxeh"&gt;Hexxeh&lt;/a&gt;. Os dejo abajo un enlace para que descarguéis el archivo .torrent para que os descarguéis el archivo que contiende la imagen con las instrucciones para instalarlo tanto en windows como en Linux. De todas formas os dejo una pequeña referencia aquí de los pasos a seguir.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Primeramente necesitaremos una memoria USB de unos 4Gb (la imagen a descargar no pesa más de 400Mb pero al descomprimirla, la imagen de Chromium OS asciende a alrededor de los 2,7Gb) Descomprimimos la imagen donde queramos y ahora hacemos lo siguiente.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En el caso de Windows:&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Descargamos el programa Image Writer para windows (podemos hacerlo desde &lt;a href="http://bit.ly/7gRu0n"&gt;aquí&lt;/a&gt;). Luego lo descomprimimos y lo ejecutamos. Una vez dentro de éste seleccionamos la imagen descomprimida anteriormente "chromiumos.img" y seleccionamos también la letra de nuestra unidad USB. Hecho esto haremos click en "write" que escribira la imagen seleccionada en nuestro USB. Cuando termine, cerramos el programa y ya podemos arrancar Chromium OS desde nuestro dispositivo.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;En el caso de Linux:&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Extraemos la imagen "chromiumos.img" y ejecutamos el siguiente comando en el mismo directorio donde se encuentra el archivo. Cambiaremos la X del comando por lo que se corresponda con nuestro dispositivo USB. El comando es el siguiente:&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ sudo dd if=chromiumos.img of=/dev/X bs=4M&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Cuando el comando termine de ejecutarse, nuestro dispositivo USB estará listo para que arranquemos desde él. =)&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Bueno, un apunte más, si no tienes cuenta de Google o no quieres usar la tuya, puedes usar "facepunch" tanto para nombre de usuario como para contraseña. Repito una vez más que todo esto es cortesía de &lt;a href="http://twitter.com/hexxeh"&gt;Hexxeh.&lt;/a&gt; Disfruten del sistema operativo y ya veremos si somos de los satisfechos con él o de los decepcionados.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://bit.ly/5ZxEtx"&gt;chromiumos-211109.torrent&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;b&gt;&lt;span style="color: purple;"&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;germaNRG&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2414767007963539564-8734167938391130004?l=devnewbies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devnewbies.blogspot.com/feeds/8734167938391130004/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devnewbies.blogspot.com/2009/11/google-chromium-os-ii.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2414767007963539564/posts/default/8734167938391130004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2414767007963539564/posts/default/8734167938391130004'/><link rel='alternate' type='text/html' href='http://devnewbies.blogspot.com/2009/11/google-chromium-os-ii.html' title='Google Chromium OS - II'/><author><name>germaN</name><uri>http://www.blogger.com/profile/01856778823794723379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://bp0.blogger.com/_0EkSTb-lzIQ/SFntmejoClI/AAAAAAAAAA4/CtxIoSeIl0E/S220/1188220980_f.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2414767007963539564.post-2574651092506635619</id><published>2009-11-23T17:20:00.003+01:00</published><updated>2009-12-16T23:14:09.266+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Chromium OS'/><category scheme='http://www.blogger.com/atom/ns#' term='Google'/><title type='text'>Google Chromium OS - I</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Bueno, hoy vamos a hablar del jefazo Google. Después de muchas alegrías a lo largo de estos años (para ellos y para nosotros) como han podido ser:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - El propio &lt;a href="http://www.google.com/"&gt;www.google.com&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - La revolución del correo web con &lt;a href="http://mail.google.com/"&gt;gMail&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - El servicio &lt;a href="http://maps.google.com/"&gt;Google Maps&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - &lt;a href="http://www.google.com/talk/"&gt;Google Talk&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; - Y un largo &lt;a href="http://www.google.com/options/"&gt;etcétera&lt;/a&gt;...&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Después de todo eso y no conformes con ello, siguen intentando innovar en todo lo que pueden. Ultimamente una de las últimas sorpresas gratas que hemos recibido de su parte ha sido Android, su sistema operativo para móviles. Pero los dos últimos lanzamientos (esperadísimos) de Google no han dejado a nadie indiferente.&lt;br /&gt;&lt;br /&gt;Primero Google Wave. Prometía (y promete) el fin de lo que conocemos como web-mail, chat, mensajería instantánea, etc... Una interfaz web digna de elogiar, la verdad, un funcionamiento bastante aceptable contando con que aún estamos usando su versión Alpha y unas promesas de funcionalidad bastante amplias y variadas. Parece extraordinario si. Pero el descontento/desilusión/decepción de ALGUNOS usuarios ya se ha hecho latente en la web. Muchos, en cambio, elogian el producto. Otros dicen básicamente eso, que esperaban más, que nos han vendido como revolucionario algo que no lo es tanto, y cosas por el estilo. Yo, sinceramente, aplaudo a Google y su Google Wave. Aunque no tenía muchas expectativas creadas alrededor de éste y así la decepción es mucho menos probable, creo que es un proyecto bastante innovador y sobre todo útil. Bajo mi punto de vista, debemos darle tiempo al tiempo, y ya se verá si cumple con las expectativas o no. Creo que aún es pronto para hablar de decepciones pero claro, cada uno sabrá lo que dice y porqué lo dice.&lt;br /&gt;&lt;br /&gt;Ahora vamos con el último lanzamiento, quizás el más esperado de todos. Chromium OS. "¿Google? ¿Un sistema operativo? ¡Este se carga al mocosoft a la manzana y al pingüino de un plumazo!". Nada más lejos de la realidad. Como bien dejan dicho en la web de &lt;a href="http://www.error500.net/"&gt;Error500&lt;/a&gt;, quién esperara eso, no está de suerte ya que en Google se ha apostado por un sistema operativo con vistas de futuro. Las palabras de algunos directivos de la empresa han sido éstas: "Es nuestro intento de replantear lo que los Sistemas Operativos deberían ser", "Estamos diseñando un Sistema Operativo fundamentalmente simple y seguro, pero que a su vez sea rápido y ligero para que solamente tarde en arrancar unos pocos segundos".&lt;br /&gt;&lt;br /&gt;En líneas generales, Chromium OS consiste en un Sistema Operativo basado en la web. Se podrán descargar archivos, realizar documentos ofimáticos, escuchar música, ver vídeos, utilizar el correo y, evidentemente, navegar por la red. No permitirá la ejecución de otro software y funcionará sobre un hardware seleccionado. Eso sí, arrancar arranca que da gusto! Ya digo que, con vistas al futuro y al usuario común, es una opción bastante a tener en cuenta debido a su simplicidad y sobre todo viendo el nivel de usabilidad que está alcanzando la web de un tiempo a esta parte. Sobre esto también he leído lamentos, sollozos, decepciones y elogios varios.&lt;br /&gt;&lt;br /&gt;En resumen, Google, ya sea con sistemas operativos diferentes, con aplicaciones web unificadoras de otras aplicaciones web o con cualquier cosa que se le ocurra, puede decepcionar o puede agradar, pero no deja indiferente a nadie. Veremos como evolucionan las cosas mientras tanto =)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.chromium.org/chromium-os"&gt;Chromium OS&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://wave.google.com/"&gt;Google Wave&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;b style="color: purple;"&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;germaNRG&lt;/span&gt;&lt;/b&gt; &lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2414767007963539564-2574651092506635619?l=devnewbies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devnewbies.blogspot.com/feeds/2574651092506635619/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devnewbies.blogspot.com/2009/11/google-chrome-os.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2414767007963539564/posts/default/2574651092506635619'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2414767007963539564/posts/default/2574651092506635619'/><link rel='alternate' type='text/html' href='http://devnewbies.blogspot.com/2009/11/google-chrome-os.html' title='Google Chromium OS - I'/><author><name>germaN</name><uri>http://www.blogger.com/profile/01856778823794723379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://bp0.blogger.com/_0EkSTb-lzIQ/SFntmejoClI/AAAAAAAAAA4/CtxIoSeIl0E/S220/1188220980_f.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2414767007963539564.post-2333251823544777134</id><published>2009-11-18T20:52:00.006+01:00</published><updated>2009-12-16T23:11:08.567+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PyInstaller'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>PyInstaller 1.3</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Estoy trabajando ultimamente en proyectos multiplataforma en python y me picó la curiosidad de ver como funcionaban los empaquetadores más conocidos como por ejemplo py2exe o PyInstaller. He leído unos cuantos posts en varios lugares y pude constatar que, a pesar de que py2exe parece más extendido y más conocido, muchos acaban decantándose por PyInstaller ya que, según cuentan los usuarios, da menos problemas en determinados momentos.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Yo finalmente decidí probar ambos (sólo los he probado bajo Windows) ya que lo que más me movía era la simple curiosidad. Después de probar cada uno de ellos con un simple y llano "HolaMundo.py" debo decir que me quedo con PyInstaller por dos cosas. La primera, por su facilidad de uso e instalación. La segunda, porque las opciones que pude ver en un vistazo rápido superan en facilidad y funcionalidad las de py2exe (resaltando lo de "vistazo rápido").&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A raíz de esto he decidido crear un ejecutable de el primer programa que posteé en el blog, gDiscover.py, en su versión para Windows. Así, además de portar dicho programa, explico como lo hice y todos podréis hacer vuestros propios ejecutables rapidamente.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Primero descargamos PyInstaller para windows desde su &lt;a href="http://www.pyinstaller.org/static/source/1.3/pyinstaller_1.3.zip"&gt;AQUÍ&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Como ya he dicho, su instalación es bastante sencilla. Descomprimimos la carpeta pyinstaller-1.3 del archivo comprimido en nuestro directorio de python que en mi caso es C:\Python26\ . Hecho esto abrimos la línea de comandos y nos dirigimos a la carpeta C:\Python26\pyinstaller-1.3 y desde ahí ejecutamos:&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ Configure.py &lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://img194.imageshack.us/img194/9748/pyinstaller01.png" target="_blank"&gt;&lt;img alt="PyInstaller 01" border="0" src="http://img194.imageshack.us/img194/9748/pyinstaller01.th.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Et Voilà! Ya podemos empezar a usarlo. Para crear nuestro ejecutable basta con dos órdenes sencillas desde la carpeta en la que nos encontramos (podéis poner la ruta que queráis. No hace falta cambiar el programa de sitio):&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ Makespec.py C:\Projects\gDiscoverWin.py&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://img32.imageshack.us/img32/693/pyinstaller02.png" target="_blank"&gt;&lt;img alt="PyInstaller 02" border="0" src="http://img32.imageshack.us/img32/693/pyinstaller02.th.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Esta orden se encarga de analizar nuestro archivo .py y sus dependencias y crea una carpeta para nuestro programa dentro de la carpeta pyinstaller-1,3. Además crea un archivo con el mismo nombre que el programa pero con la extensión .spec dentro de esta nueva carpeta que servirá a la siguiente orden para la creación de nuestro ejecutable.  &lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Lo que debemos hacer a continuación es llamar a Build.py con la ruta que nos devolvió la ejecución de Makespec.py de esta forma:&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ Build.py C:\Python26\pyinstaller-1.3\gDiscoverWin\gDiscoverWin.spec&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://img27.imageshack.us/img27/9756/pyinstaller03.png" target="_blank"&gt;&lt;img alt="PyInstaller 03" border="0" src="http://img27.imageshack.us/img27/9756/pyinstaller03.th.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Hecho esto, en C:\Python26\pyinstaller-1.3\gDiscoverWin\ se nos creará una carpeta BuildgDiscoverWin y otra distgDiscoverWin. La primera simplemente es utilizada por el programa y no nos será de utilidad. En cambio, dentro de distgDiscoverWin estará nuestro archivo .exe con todas las dependencias necesarias para su ejecución.&amp;nbsp; Solo tenemos que hacer por ejemplo un archivo .rar con todo el interior de esta carpeta y podremos ejecutar nuestro programa sin necesidad de que en el pc donde lo hagamos tenga instalado nada más que un windows XP.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Aquí os dejo la prueba de ello. =)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="http://www.megaupload.com/?d=OKNBBNF5"&gt;gDiscoverWin.rar&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color: purple; font-family: Arial,Helvetica,sans-serif; text-align: right;"&gt;&lt;b&gt;germanNRG'09&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2414767007963539564-2333251823544777134?l=devnewbies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devnewbies.blogspot.com/feeds/2333251823544777134/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devnewbies.blogspot.com/2009/11/pyinstaller-13.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2414767007963539564/posts/default/2333251823544777134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2414767007963539564/posts/default/2333251823544777134'/><link rel='alternate' type='text/html' href='http://devnewbies.blogspot.com/2009/11/pyinstaller-13.html' title='PyInstaller 1.3'/><author><name>germaN</name><uri>http://www.blogger.com/profile/01856778823794723379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://bp0.blogger.com/_0EkSTb-lzIQ/SFntmejoClI/AAAAAAAAAA4/CtxIoSeIl0E/S220/1188220980_f.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2414767007963539564.post-2825090376506180499</id><published>2009-11-18T04:32:00.007+01:00</published><updated>2009-12-16T23:15:04.130+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby on Rails'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Ruby On Rails</title><content type='html'>Siguiendo la línea del post anterior, vamos a hablar hoy de Ruby on Rail y de como echarlo a andar de un modo fácil y rápido bajo Ubuntu 9.10.&lt;br /&gt;&lt;br /&gt;Como ya vimos, habrá dos posibilidades de instalación para Ruby on Rails ya que recuerdo que Debian tiene sus propias &lt;a href="http://pkg-ruby-extras.alioth.debian.org/rubygems.html"&gt;políticas&lt;/a&gt; respecto a RubyGems. Teníamos ya instalado el comando "gem" para poder utilizarlo a nuestro antojo así que podremos instalarlo mediante este comando ejecutando en la consola lo siguiente:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ sudo gem install rails --include-dependecies&lt;br /&gt;&lt;br /&gt;Pero si seguimos utilizando los paquetes que Ubuntu pone a nuestra disposición a través de los repositorios como hemos hecho para instalar tanto Ruby como RubyGems. Para la instalación desde los repositorios bastaría con ejecutar:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ sudo apt-get install rails&lt;br /&gt;&lt;br /&gt;Esto instalará en nuestro sistema muchos paquetes necesarios para el correcto funcionamiento de Ruby on Rails pero, entre todos ellos, cabe destacar el uso de las bases de datos provistas por sqlite3 en lugar de MySQL. &lt;br /&gt;&lt;br /&gt;Una vez instalado "Rails" vamos a proceder a testear que funciona correctamente. Primero debemos crear un proyecto de Rails. Esto lo haremos de la siguiente manera:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ rails nombreDelProyecto&lt;br /&gt;&lt;br /&gt;Lo cual nos creará, en la ruta donde lo hayamos ejecutado, una carpeta "nombreDelProyecto" donde se encontrarán todos los datos relacionados con este nuevo proyecto. Esta carpeta tendrá la siguiente estructura:&lt;br /&gt;&lt;br /&gt;/nombreDelProyecto&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; app/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; controllers/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; helpers/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; models/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; views/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; config/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; environments/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; initializaers/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; locales/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; db/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; doc/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; api/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; lib/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; tasks/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; log/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; images/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; javascripts/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; stylesheets/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; script/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; performance/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; process/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; test/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fixtures/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; functional/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; integration/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; performance/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; unit/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; tmp/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; cache/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; pids/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; sessions/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; sockets/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; vendor/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; actionmailer/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; actionpack/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; activemodel/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; activerecord/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; activeresource/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; activesupport/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; rails/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; railties/&lt;br /&gt;&lt;br /&gt;Cada directorio cumple una función específica y aquí os adjunto una descripción breve de algunos de ellos por cortesía de &lt;a href="http://www.maestrosdelweb.com/"&gt;Maestros del Web&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;app&lt;/b&gt;: Aquí se almacenaran los componentes de nuestra aplicación: vistas y 'helpers', controladores y modelos.&lt;br /&gt;&lt;b&gt;config&lt;/b&gt;: Contiene la configuración de nuestra aplicación: configuración de la base de datos (database.yml) , estructura del entorno de Rails (environment.rb) y el enrutador de peticiones web (routes.rb).&lt;br /&gt;&lt;b&gt;public&lt;/b&gt;: Esto es parecido al directorio public de un servidor web. Contiene los archivos JavaScript, images, hojas de estilo y HTML.&lt;br /&gt;&lt;b&gt;script&lt;/b&gt;: Este directorio contiene scripts que inician y administran las diversas herramientas que puedes usar en Rails. Ejemplo: estan los scripts que generan código (generate) e inician el servidor web (server).&lt;br /&gt;&lt;br /&gt;Para ejecutar el servidor de pruebas que viene con Ruby, Webrick (gnome posee una guía en español bastante interesante sobre el &lt;a href="http://naupacto.com/rubydoc/guiaWEBrick/index.html"&gt;AQUÍ&lt;/a&gt;) para poder hacer pruebas con nuestro nuevo proyecto habrá que llamar al archivo "server" que se encuentra en la carpeta scripts/ descrita anteriormente. Para ello bastará con introducirnos en el directorio /nombreDelProyecto y ejecutar dicho script anteponiendo el comando ruby:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ cd nombreDelProyecto&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ ruby script/server&lt;br /&gt;&lt;br /&gt;Ya tenemos un servidor de pruebas corriendo en nuestro sistema local. Para acceder a él y ver que nuestro proyecto a sido creado correctamente y funciona debemos acceder mediante el navegador web a la direccion local en el puerto 3000 que es donde corre el server de prueba por defecto:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://localhost:3000/"&gt;http://localhost:3000&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Y debería mostrarnos algo como &lt;a href="http://img689.imageshack.us/img689/6393/rubyonrailsrun.png"&gt;esto&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://img689.imageshack.us/i/rubyonrailsrun.png/" target="_blank"&gt;&lt;img alt="Servidor básico de RoR" border="0" src="http://img689.imageshack.us/img689/6393/rubyonrailsrun.th.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Ya tenemos a nuestro servidor corriendo en nuestro pc correctamente. Ahora viene lo de siempre cuando se empieza, desarrollar un Hola Mundo. Primero crearemos un controlador tecleando en el directorio nombreDelProyecto este comando:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ ruby script/generate controller test&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; exists&amp;nbsp; app/controllers/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; exists&amp;nbsp; app/helpers/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; create&amp;nbsp; app/views/test&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; exists&amp;nbsp; test/functional/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; create&amp;nbsp; app/controllers/test_controller.rb&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; create&amp;nbsp; test/functional/test_controller_test.rb&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; create&amp;nbsp; app/helpers/test_helper.rb&lt;br /&gt;&lt;br /&gt;Como podemos ver esto nos a creado algunos archivos nuevos en el esqueleto de nuestra aplicación. Vamos a editar primeramente el archivo nombreDelProyecto/app/controllers/test_controller.rb sustituyendo su contenido por el siguiente método:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; class TestController &amp;lt; ActionController::Base&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; def index&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; end&lt;br /&gt;&lt;br /&gt;Ahora crearemos la vista para esta acción que acabamos de crear añadiendo un nuevo archivo en nombreDelProyecto/app/views/test/ llamado index.rhtml en el que introduciremos el texto que queramos mostrar en nuestro HolaMundo. Por ejemplo:&lt;br /&gt;&lt;br /&gt;&amp;lt;h1&amp;gt; Un saludo de&amp;lt;a href="http://devnewbies.blogspot.com"&amp;gt; DevNewBies&amp;lt;/a&amp;gt; desde Ruby On Rails!&amp;lt;/h1&amp;gt;&lt;br /&gt;&lt;br /&gt;Guardamos el archivo y ya podemos probarlo accediendo a &lt;a href="http://localhost:3000/test/%20"&gt;http://localhost:3000/test/&lt;/a&gt; (No olvidemos mantener a Webrick corriendo en nuestro pc).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ya tenemos listo nuestro HolaMundo sobre RoR pero, no es lo mas ortodoxo que los usuarios tengan que acceder a tu web teniendo que añadir /test/ al final del nombre del dominio. Para paliar esto debemos editar el archivo nombreDelProyecto/config/routes.rb de la siguiente forma:&lt;br /&gt;&lt;br /&gt;Buscamos las líneas donde pone:&lt;br /&gt;&lt;br /&gt;&amp;nbsp; # You can have the root of your site routed with map.root -- just remember to delete public/index.html.&lt;br /&gt;&amp;nbsp; # map.root :controller =&amp;gt; "welcome"&lt;br /&gt;&lt;br /&gt;La primera de ellas nos recuerda que si cambiamos la ruta servida por defecto, debemos eliminar/renombrar el archivo que se encuentra en nombreDlProyecto/public/index.html. Yo lo renombré a index.old para no perderlo por si me da por restaurarlo por cualquier motivo. Una vez eliminado/renombrado este archivo, descomentaremos la segunda línea y modificaremos la palabra "welcome" por la palabra "test" para que sea éste el directorio listado como raíz. Una vez hecho esto, ya podemos acceder nuevamente a Webrick mediante http://localhost:3000/ y nos mostrará nuestro &lt;a href="http://img196.imageshack.us/img196/576/rubyonrailsrun2.png"&gt;HolaMundo&lt;/a&gt;. =)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://img196.imageshack.us/i/rubyonrailsrun2.png/" target="_blank"&gt;&lt;img alt="Free Image Hosting at www.ImageShack.us" border="0" src="http://img196.imageshack.us/img196/576/rubyonrailsrun2.th.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Si te interesa Ruby y RubyOnRails Aquí dejo unos enlaces interesantes:&lt;br /&gt;&lt;br /&gt;Web de RoR: &lt;a href="http://rubyonrails.org/"&gt;http://rubyonrails.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;RoR en español:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://www.ruby-forum.com/forum/22"&gt;http://www.ruby-forum.com/forum/22&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://www.forosdelweb.com/f105/"&gt;http://www.forosdelweb.com/f105/&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://sobrerailes.com/"&gt;http://sobrerailes.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;b style="color: purple;"&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;germaNRG'09&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2414767007963539564-2825090376506180499?l=devnewbies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devnewbies.blogspot.com/feeds/2825090376506180499/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devnewbies.blogspot.com/2009/11/ruby-on-rails.html#comment-form' title='1 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2414767007963539564/posts/default/2825090376506180499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2414767007963539564/posts/default/2825090376506180499'/><link rel='alternate' type='text/html' href='http://devnewbies.blogspot.com/2009/11/ruby-on-rails.html' title='Ruby On Rails'/><author><name>germaN</name><uri>http://www.blogger.com/profile/01856778823794723379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://bp0.blogger.com/_0EkSTb-lzIQ/SFntmejoClI/AAAAAAAAAA4/CtxIoSeIl0E/S220/1188220980_f.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2414767007963539564.post-3589495775789852744</id><published>2009-11-17T10:30:00.002+01:00</published><updated>2009-11-18T20:58:46.751+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RubyGems'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><title type='text'>Ruby &amp; RubyGems</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Hoy vamos a hablar de Ruby y RubyGems. Según nos dice la Wikipedia en español: "&lt;a href="http://es.wikipedia.org/wiki/Ruby"&gt;Ruby&lt;/a&gt; es, un lenguaje interpretado, reflexivo y orientado a objetos. Combina una sintaxis inspirada en Python, Perl y con características de programación orientada a objetos similares a &lt;a href="http://es.wikipedia.org/wiki/Smalltalk"&gt;Smalltalk&lt;/a&gt;."&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Además cabe destacar que , según su desarrolador, Ruby está está diseñado para la productividad y la diversión del desarrollador. Aunque será mejor que cada uno juzgue por si mismo. Así que, vamos a lo que nos ocupa.&lt;br /&gt;&lt;br /&gt;Primeramente vamos a instalar el interprete de Ruby en Ubuntu 9.10. Para ello abriremos una terminal y ejecutaremos:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ sudo apt-get install ruby&lt;br /&gt;&lt;br /&gt;Lo cual nos instalará los paquetes ruby, libruby1.8 y ruby1.8.&lt;br /&gt;&lt;br /&gt;Ahora hablemos un poco sobre RubyGems:&lt;br /&gt;&lt;br /&gt;Según su propia página web un gem es un paquete de aplicación o librería creada en Ruby. Estas contienen un nombre (ejemplo: rails) y una versión (ejemplo: 2.3.0). Los Gems son administrados en tu pc mediante el uso del comando "gem" los cuales son almacenados en la librería de RubyGems. Tu puedes instalar, quitar y buscar (entre otras cosas) mediante el propio comando "gem". &lt;br /&gt;RubyGems es la librería principal de ruby. Y provee:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Un formato estándar para la distribución de programas y librerías de Ruby.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Una herramienta de fácil uso para la administración e instalación de los paquetes de gem.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Una utilidad de servidor para navegar en la documentación de las gems instaladas mediante el RubyGems.&lt;br /&gt;&lt;br /&gt;Puedes encontrar más información en la documentación de &lt;a href="http://docs.rubygems.org/"&gt;RubyGems&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Para la instalación de RubyGems hay que destacar algo bastante importante si lo vamos ha hacer desde un sistema basado en Debian como es nuestro caso. Según pude leer en la web de &lt;a href="http://www.pablasso.com/"&gt;Pablo&lt;/a&gt; en caso de que se quiera estar actualizado con rapidez (respecto a Ruby) sin tener dependencia de terceros, la opción más adecuada para su instalación es descargar el paquete oficial de RubyGems desde &lt;a href="http://rubyforge.org/projects/rubygems"&gt;AQUI&lt;/a&gt; luego descomprimirlo y desde la carpeta descomprimida ejecutar:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ ruby setup.rb&lt;br /&gt;&lt;br /&gt;Como decía, los sistemas Debian como Ubuntu nos brindan la posibilidad de instalar este paquete directamente de los repositorios si queremos tener disponible en nuestro sistema el comando "gem". En este caso ejecutaremos:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ sudo apt-get install rubygems&lt;br /&gt;&lt;br /&gt;Esto instalará los paquetes irb1.8 libreadline-ruby1.8 rdoc1.8 rubygems y rubygems1.8&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Yo, al empezar ahora en Ruby, aún no veo la necesidad de estar actualizado más rápido que Debian así que me parece que la segunda instalación estará más adecuada a mi sistema y cumplirá satisfactoriamente los requisitos para dar unos primeros pasos en Ruby.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Hecho esto podremos probar su funcionamiento haciendo un hola mundo interactivo mediante la consola de ruby irb. Para ello ejecutaremos lo siguiente:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ irb&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; irb(main):001:0&amp;gt; puts "Hola Mundo!"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Hola Mundo!&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; =&amp;gt; nil&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; irb(main):003:0&amp;gt; exit()&lt;br /&gt;&lt;br /&gt;Ruby se instaló correctamente, y funciona. =)&lt;br /&gt;&lt;br /&gt;Si queremos probar el correcto funcionamiento del comando gems podemos hacerlo también desde la consola:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $ sudo gem list&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; *** LOCAL GEMS ***&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; actionmailer (2.3.4)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; actionpack (2.3.4)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; activerecord (2.3.4)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; activeresource (2.3.4)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; activesupport (2.3.4)&lt;br /&gt;&lt;br /&gt;En el pŕoximo post pondré un ejemplo interesante de gráficos en Ruby y otro de como hacer andar un servidor de pruebas con RunbyOnRails facilmente. =)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif; text-align: right;"&gt;&lt;b&gt;&lt;span style="color: purple; font-size: small;"&gt;germaNRG'09&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2414767007963539564-3589495775789852744?l=devnewbies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devnewbies.blogspot.com/feeds/3589495775789852744/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devnewbies.blogspot.com/2009/11/ruby-rubygems.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2414767007963539564/posts/default/3589495775789852744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2414767007963539564/posts/default/3589495775789852744'/><link rel='alternate' type='text/html' href='http://devnewbies.blogspot.com/2009/11/ruby-rubygems.html' title='Ruby &amp; RubyGems'/><author><name>germaN</name><uri>http://www.blogger.com/profile/01856778823794723379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://bp0.blogger.com/_0EkSTb-lzIQ/SFntmejoClI/AAAAAAAAAA4/CtxIoSeIl0E/S220/1188220980_f.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2414767007963539564.post-743651620701028635</id><published>2009-11-13T00:18:00.005+01:00</published><updated>2009-12-16T23:12:54.349+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blogger'/><category scheme='http://www.blogger.com/atom/ns#' term='RSS'/><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><title type='text'>Universal Feed Parser</title><content type='html'>Hace unos días, buceando por algunos blogs, he descubierto un módulo para python 2.6.4 (aprovechando que ya lo instalamos en el post anterior =) ) llamado feedparser.&lt;br /&gt;&lt;br /&gt;Encontré varios ejemplos de su uso en aplicaciones sencillas de consola. La mayoría explicaba un ejemplo sencillo de como actualizar tu twitter desde python con este módulo pero, como no tengo twitter, pues me propuse hacer un lector rss para blogger ( MUY cutre, pero también MUY facilmente mejorable) con el fin de explicar su funcionamiento en líneas generales.&lt;br /&gt;&lt;br /&gt;Para instalar este módulo en ubuntu no hay mas que teclear en consola&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;gt; sudo apt-get install python-feedparser&lt;br /&gt;&lt;br /&gt;Bajo windows podéis descarlos desde &lt;a href="http://feedparser.googlecode.com/files/feedparser-4.1.zip"&gt;aquí&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;Una vez descargado no tenéis más que descomprimirlo donde más os guste y desde la línea de comandos dirigíos a la carpeta en cuestión. Una vez dentro de ella tecleáis &lt;br /&gt;&lt;br /&gt;&amp;gt; setup.py install&lt;br /&gt;&lt;br /&gt;y listo. Ya tenemos feedparser listo para ser usado desde python.&lt;br /&gt;&lt;br /&gt;Hay poco que explicar sobre él ya que es muy sencillo de utilizar. Voy a poner aquí dos o tres ejemplos básicos para que os hagáis una pequeña idea y luego que el código hable por si mismo!&lt;br /&gt;&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; import feedparser&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; blog = feedparser.parse('http://devnewbies.blogspot.com/feeds/posts/default')&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; blog['feed']['title']&lt;br /&gt;u'Todos somos NewBies'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; blog.feed.link&lt;br /&gt;u'http://devnewbies.blogspot.com/'&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; blog.version&lt;br /&gt;'atom10'&lt;br /&gt;&lt;br /&gt;Sencillo a más no poder. Y no digáis que no! Aquí abajo os dejo el código para que le echéis un vistazo. Y un poco más abajo un enlace con el archivo .py y el .zip del módulo para windows. El programilla funciona tanto en windows como en Ubuntu. Espero que os sirva de algo =)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#!/usr/bin/env python&lt;br /&gt;# germaNRG'09 - http://devnewbies.blogspot.com&lt;br /&gt;&lt;br /&gt;import sys&lt;br /&gt;import re&lt;br /&gt;&lt;br /&gt;def addRss(web):&lt;br /&gt;&amp;nbsp; if web[:7] != "http://": web = "http://" + web&lt;br /&gt;&amp;nbsp; if web[-1:] != "/": web += "/"&lt;br /&gt;&amp;nbsp; web += "feeds/posts/default"&lt;br /&gt;&amp;nbsp; return web&lt;br /&gt;&lt;br /&gt;def removeTags(html):&lt;br /&gt;&amp;nbsp; inside = 0&lt;br /&gt;&amp;nbsp; text = ''&lt;br /&gt;&amp;nbsp; for char in html:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if char == '&amp;lt;':&amp;nbsp;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inside = 1&amp;nbsp;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; continue&amp;nbsp;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; elif (inside == 1 and char == '&amp;gt;'):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inside = 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; continue&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; elif inside == 1: continue&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else: text += char&lt;br /&gt;&amp;nbsp; return text&lt;br /&gt;&lt;br /&gt;def badChars(text):&lt;br /&gt;&amp;nbsp; text = re.sub("&amp;nbsp;","\n",text)&lt;br /&gt;&amp;nbsp; text = re.sub("---&amp;gt;","\n",text)&lt;br /&gt;&amp;nbsp; text = re.sub("\\u2026","...",text)&lt;br /&gt;&amp;nbsp; return text&lt;br /&gt;&lt;br /&gt;try:&lt;br /&gt;&amp;nbsp; import feedparser&lt;br /&gt;except:&lt;br /&gt;&amp;nbsp; print "FeedParser module is required"&lt;br /&gt;&amp;nbsp; sys.exit()&lt;br /&gt;&lt;br /&gt;page = raw_input("Introduzca la direccion de bloger: ")&lt;br /&gt;blog = addRss(page)&lt;br /&gt;rss = feedparser.parse(blog)&lt;br /&gt;try:&lt;br /&gt;&amp;nbsp; blogTitle = rss.feed.title&lt;br /&gt;&amp;nbsp; blogLink = rss.feed.link&lt;br /&gt;except:&lt;br /&gt;&amp;nbsp; print "El blog introducido no responde. Compruebe la direccion."&lt;br /&gt;&amp;nbsp; sys.exit()&lt;br /&gt;&lt;br /&gt;blogPosts = len(rss['entries'])&lt;br /&gt;if not blogPosts:&lt;br /&gt;&amp;nbsp; print "Este blog no contiene entradas."&lt;br /&gt;&amp;nbsp; sys.exit()&lt;br /&gt;&lt;br /&gt;print "El blog tiene disponibles %s entradas." % blogPosts&lt;br /&gt;req = raw_input("Que entrada desea leer: ")&lt;br /&gt;req = int(req)&lt;/code&gt;&lt;br /&gt;&lt;code&gt;req += 1&lt;br /&gt;entTitle = rss.entries[req].title&lt;br /&gt;print "\n\nTitulo del blog: %s" % blogTitle&lt;br /&gt;print "Entrada: %s" % entTitle&lt;br /&gt;ent = rss.entries[req]&lt;br /&gt;entLink = ent.link&lt;br /&gt;entAuthorName = ent.author_detail.name&lt;br /&gt;entAuthorMail = ent.author_detail.email&lt;br /&gt;entDate = ent.updated_parsed ## Devuelve un time.struct_time&lt;br /&gt;try:&lt;br /&gt;&amp;nbsp; entData = ent.content[0]['value']&lt;br /&gt;&amp;nbsp; plainText = removeTags(entData)&lt;br /&gt;&amp;nbsp; plainText = badChars(plainText)&lt;br /&gt;&amp;nbsp; noData = 0&lt;br /&gt;except:&lt;br /&gt;&amp;nbsp; noData = 1&lt;br /&gt;&amp;nbsp; print "Autor del blog: %s" % entAuthorName&lt;br /&gt;&amp;nbsp; print "Mail del autor: %s \n\n" % entAuthorMail&lt;br /&gt;&amp;nbsp;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;try:&lt;br /&gt;&amp;nbsp; print "Contenido de la entrada:"&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&amp;nbsp; print plainText[:150]+"...\n"&lt;br /&gt;&amp;nbsp; print "Para verla completa dirijase a: %s" % entLink  &lt;br /&gt;except:&lt;br /&gt;&amp;nbsp; print "No se pudo previsualizar la entrada."&lt;br /&gt;&amp;nbsp; print "Para verla online dirijase a: %s" % entLink&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Descarga el programa para leer tus blogs de Blogger favoritos mas el módulo feedparser desde aquí:&lt;br /&gt;&lt;a href="http://www.megaupload.com/?d=Z9FI3JII"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://www.megaupload.com/?d=6E74RJ8A"&gt;blogger.rar&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;span style="font-size: small;"&gt;&lt;b style="color: purple; font-family: Arial,Helvetica,sans-serif;"&gt;germaNRG'09&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2414767007963539564-743651620701028635?l=devnewbies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devnewbies.blogspot.com/feeds/743651620701028635/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devnewbies.blogspot.com/2009/11/hace-unos-dias-buceando-por-algunos.html#comment-form' title='0 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2414767007963539564/posts/default/743651620701028635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2414767007963539564/posts/default/743651620701028635'/><link rel='alternate' type='text/html' href='http://devnewbies.blogspot.com/2009/11/hace-unos-dias-buceando-por-algunos.html' title='Universal Feed Parser'/><author><name>germaN</name><uri>http://www.blogger.com/profile/01856778823794723379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://bp0.blogger.com/_0EkSTb-lzIQ/SFntmejoClI/AAAAAAAAAA4/CtxIoSeIl0E/S220/1188220980_f.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2414767007963539564.post-1931923040917152811</id><published>2009-11-06T01:43:00.016+01:00</published><updated>2009-12-16T23:13:13.136+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Python'/><category scheme='http://www.blogger.com/atom/ns#' term='Ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='Bluetooth'/><title type='text'>Python &amp; Bluetooth   -   gDiscover.py</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Vamos a ver un ejmplo muy sencillo de como interactuar con dispositivos bluetooth desde python en ubuntu 9.10. Es un ejemplo muy simple de un programa que se encarga de descubrir dispositivos bluetooth que se encuentren dentro del alcance del ordenador donde ejecutemos gDiscover. La aplicación podrá devolvernos la dirección MAC de los dispositivos bluetooth que encuentre dentro de su radio de acción, el nombre a mostrar de dichos dispositivos o ambas cosas a la vez según lo desee el usuario. Aunque quizás pueda parecer algo difícil, no lo es. Sabiendo lo mínimo sobre python podremos hacer una aplicación como esta y comprenderla. Tampoco resultara demasiado complicado ampliarla añadiendole más funciones.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Para empezar necesitaremos una distribución &lt;a href="http://www.ubuntu.com/getubuntu/download"&gt;Ubuntu 9.10&lt;/a&gt; aunque la aplicación funciona desde la versión 7.04 en adelante (no he probado en las anteriores). También necesitaremos tener instalado en el sistema el intérprete de python 2.6.4 y sus librerias estándar que, en caso de ubuntu, viene instalado por defecto. De todos modos podéis descargarlo desde su página web &amp;nbsp; ---&amp;gt; &amp;nbsp; &lt;a href="http://www.python.org/download/"&gt;Descargar &lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;También vamos a necesitar instalar el paquete python-bluez. Podemos encontrarlo en los repositorios de Ubuntu como podeis ver en la imagen:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://img198.imageshack.us/img198/7970/pantallazo01.jpg"&gt;ScreenShot01.jpg&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;O también podemos descargarlo de la página web del proyecto PyBluez, alojado en GoogleCode&amp;nbsp; ---&amp;gt; &amp;nbsp; &lt;a href="http://code.google.com/p/pybluez/downloads/list"&gt;Descargar&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Obviamente será indispensable disponer de un dispositivo bluetooth ya sea integrado en el pc o portátil, o uno usb.&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Una vez aclarado esto ya estamos listos para empezar a programar. Con respecto a la sintaxis general del programa en python hay muy poco que comentar. Es sencillo y fácil de leer y comprender. No tiene nada de extravagante. En relación al bluetooth basta con importar la libreria instalada con "import bluetooth"&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Para ver las funciones disponibles podemos ejecutar el interprete python y teclear lo siguiente&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;$ python&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&amp;gt;&amp;gt;&amp;gt; import bluetooth&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&amp;gt;&amp;gt;&amp;gt; list=dir(bluetooth)&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Esto nos devolvera una lista con todos los metodos que podemos usar. En nuestro caso por ejemplo vamos a usar los dos siguientes:&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&amp;gt;&amp;gt;&amp;gt; list[181]&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;'discover_devices'&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&amp;gt;&amp;gt;&amp;gt; list[186]&lt;br /&gt;&lt;div style="text-align: justify;"&gt;'lookup_name'&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;La función discover_devices() se encargará de buscar dispositivos bluetooth activos dentro del alcance del ordenador donde ejecutamos gDiscover y nos devolverá una lista con las direcciones MAC de todos los dispositivos encontrados. Por otra parte lookup_name(MAC) recibe como argumento una cadena con una dirección MAC y devuelve una lista con el nombre asociado a esa dirección. Fácil ¿Verdad?&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;a href="http://www.megaupload.com/?d=G93BBCTZ"&gt;gDiscover.tar.gz&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Ahí os dejo la aplicación terminada para que le echéis un vistazo. No dudéis en mandarnos vuestras propias versiones o extensiones del programa. Espero que os sirva de ayuda. Para cualquier duda, consulta o sugerencia poneros en contacto con nosotros.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: right;"&gt;&lt;b style="color: purple;"&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;germaNRG'09 &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: right;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2414767007963539564-1931923040917152811?l=devnewbies.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devnewbies.blogspot.com/feeds/1931923040917152811/comments/default' title='Enviar comentarios'/><link rel='replies' type='text/html' href='http://devnewbies.blogspot.com/2009/11/python-bluetooth-gdiscoverpy.html#comment-form' title='2 comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2414767007963539564/posts/default/1931923040917152811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2414767007963539564/posts/default/1931923040917152811'/><link rel='alternate' type='text/html' href='http://devnewbies.blogspot.com/2009/11/python-bluetooth-gdiscoverpy.html' title='Python &amp; Bluetooth   -   gDiscover.py'/><author><name>germaN</name><uri>http://www.blogger.com/profile/01856778823794723379</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='33' height='25' src='http://bp0.blogger.com/_0EkSTb-lzIQ/SFntmejoClI/AAAAAAAAAA4/CtxIoSeIl0E/S220/1188220980_f.jpg'/></author><thr:total>2</thr:total></entry></feed>
