<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2enclosuresfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:media="http://search.yahoo.com/mrss/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-6671913855625335983</atom:id><lastBuildDate>Sat, 17 Dec 2011 13:15:06 +0000</lastBuildDate><category>linux</category><category>lenovo review</category><category>sistemas</category><category>red</category><category>cuda</category><category>seguridad</category><category>howto</category><category>smime</category><category>programacion</category><category>ssh</category><category>openbox</category><category>bash</category><category>general</category><category>c</category><category>unixlike</category><category>out of topic</category><category>vsftpd</category><category>python</category><category>tips</category><category>debian</category><category>microsoft</category><category>windows</category><category>linux ubuntu</category><category>unicode</category><category>atajos</category><category>vim</category><category>ftp</category><category>reflexión</category><category>google</category><category>codigo</category><title>inedit00</title><description>Recopilando pelusillas en mi ombligo con las que, algún día, dominaré el Mundo entero! Muahaahahaha!</description><link>http://inedit00.blogspot.com/</link><managingEditor>noreply@blogger.com (inedit00)</managingEditor><generator>Blogger</generator><openSearch:totalResults>98</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/inedit00" /><feedburner:info uri="inedit00" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><itunes:owner><itunes:email>noreply@blogger.com</itunes:email></itunes:owner><itunes:explicit>no</itunes:explicit><itunes:subtitle>Recopilando pelusillas en mi ombligo con las que, algún día, dominaré el Mundo entero! Muahaahahaha!</itunes:subtitle><feedburner:emailServiceId>inedit00</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:browserFriendly></feedburner:browserFriendly><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6671913855625335983.post-6217860557534309123</guid><pubDate>Sat, 17 Dec 2011 12:55:00 +0000</pubDate><atom:updated>2011-12-17T14:15:06.399+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">general</category><title>Plugins Firefox II</title><description>Hace tiempo &lt;a href="http://inedit00.blogspot.com/2009/09/add-ons-firefox.html"&gt;escribí una entrada&lt;/a&gt; sobre los plugins que venía usando en Firefox. Bueno, parece ser que he tirado hacia el minimalismo últimamente y resulta que ya no uso ninguno de los plugins mencionados. Ahora uso tan solo dos:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Adblock Plus&lt;/span&gt;: Te quita toooooda la publicidad de Internet. Dejas de verla. Incluso la propaganda que pone youtube.com antes de visualizar un video? Esta también dejas de verla. Es genial. Recomiendo a todo el mundo que se lo instale ni que sea para probar. Además, se va actualizando solo cada tanto, para mantener la base de datos de contenidos publicitaros que tu navegador no tiene que cargar. Super chulo.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ShareMeNot&lt;/span&gt;: Sirve para que todos aquellos botones "sociales" como por ejemplo el "Me gusta" de facebook, o el "+1" de Google, dejen de mandar información a Facebook/Google/Twitter sobre las páginas que visitas. Muy interesante para mantener la privacidad.&lt;br /&gt;&lt;br /&gt;El ShareMeNot puede que requiera de una explicación adicional. Imaginemos que www.marca.com decide poner el botón "Me gusta" en todas sus páginas. Pues si estás logueado en facebook en el navegador y al mismo momento entras en www.marca.com, Facebook sabe que has entrado en esta página. Esto es debido a que automáticamente asocia el "Me gusta" con tu perfil. El problema es que Facebook sabe las páginas que vas visitando y lo va registrando. Y esto no mola. Por ejemplo, si la página web www.MeGustanLasGordasPelirrojas.com tiene un botón de "Me gusta" y estás logueado en facebook al mismo tiempo, Facebook a partir de ahora ya sabe "un poquito más" acerca de tí. Puede que a partir de ahora te haga publicidad de ciertas chicas con cierto problema de obesidad. Por esto está bien tener un plugin de firefox que te prevenga que se vaya mandando información sobre qué visito a todos los sitios web 2.0 y mantener así la privacidad de nuestros datos.&lt;br /&gt;&lt;br /&gt;Y esto es todo por hoy. Un saludo!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6671913855625335983-6217860557534309123?l=inedit00.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://inedit00.blogspot.com/2011/12/plugins-firefox-ii.html</link><author>noreply@blogger.com (inedit00)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6671913855625335983.post-9221172315879592644</guid><pubDate>Sun, 20 Nov 2011 11:18:00 +0000</pubDate><atom:updated>2011-11-20T12:36:34.198+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">reflexión</category><category domain="http://www.blogger.com/atom/ns#">linux</category><category domain="http://www.blogger.com/atom/ns#">codigo</category><title>Clase de buceo</title><description>En el &lt;a href="http://inedit00.blogspot.com/2011/09/sudo-su-sin-espera-nodelay.html"&gt;post anterior&lt;/a&gt;[1] comentaba cómo configurar las PAM para desactivar el tiempo de espera en caso de haberte equivocado escribiendo un password. Este post explica el proceso que seguí para saber que no es posible establecer un tiempo de espera personalizado. Siempre te tienes que esperar dos segundos en caso de haberte equivocado de password, o puedes desactivar el tiempo de espera. Lo que no puedes hacer es decir, "espérate 5 segundos en caso de que me haya equivocado de password antes de volver a preguntarme".. También se puede ver lo bonito que es el OpenSource, y la de que el código fuente sea público.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Preámbulo]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Resulta que en el fichero /etc/pam.d/login hay una opción que pone: "auth  optional  pam_faildelay.so delay=3000000". Un comentario al lado explica claramente lo que hace esto:&lt;br /&gt;&lt;br /&gt;"Enforce a minimal delay in case of failure (in microseconds)". O lo que es lo mismo: Fuerza una pequeña espera en caso de fallo en la autenticación. 3 segundos, para ser mas exactos.&lt;br /&gt;&lt;br /&gt;Pues parece obvio pensar que si cambio 3000000 a 1000000, el tiempo de espera cuado haga login fallido se reducirá a 1 segundo.&lt;br /&gt;&lt;br /&gt;Probemos antes de hacer el cambio:&lt;br /&gt;$ sudo echo 1  # Comando chorra, pero lo importante es que nos pida el password&lt;br /&gt;[sudo] password for inedit: badpassword&lt;br /&gt;--- pasan unos dos segundos, aproximadamente ---&lt;br /&gt;&lt;br /&gt;Hacemos el cambio en el fichero, poniendo el parámetro "delay=1000000". Probamos de nuevo:&lt;br /&gt;$ sudo echo 1&lt;br /&gt;[sudo] password for inedit: badpassword&lt;br /&gt;--- pasan unos dos segundos, aproximadamente. Lo mismo que antes... ---&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mmmm... mierda, no funciona. Probemos lo propuesto en el &lt;a href="http://inedit00.blogspot.com/2011/09/sudo-su-sin-espera-nodelay.html"&gt;post anterior&lt;/a&gt;, o sea, poner el parámetro nodelay en el fichero /etc/pam.d/common-auth:&lt;br /&gt;auth    [success=2 default=ignore]    pam_unix.so nullok_secure nodelay&lt;br /&gt;&lt;br /&gt;Probamos de nuevo:&lt;br /&gt;&lt;br /&gt;$ sudo echo 1&lt;br /&gt;[sudo] password for inedit: badpassword&lt;br /&gt;--- inmediatamente despues nos dice que la contraseña es incorrecta y que lo intentemos de nuevo. Tiempo de espera: cero segunos ---&lt;br /&gt;&lt;br /&gt;Genial. Parece que el parámetro "nodelay" funciona. Pero ¿Por qué no funciona el "delay=3000000"?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Siguiendo pasos lógicos]&lt;/span&gt;&lt;br /&gt;Vale, resulta que el parámetro "nodelay" se lo ponemos como parámetro a un fichero llamado "pam_unix.so". Ni idea de qué coño hace este fichero, pero busquemos a ver si existe ene el sistema:&lt;br /&gt;&lt;br /&gt;$ locate pam_unix.so&lt;br /&gt;/lib/x86_64-linux-gnu/security/pam_unix.so&lt;br /&gt;&lt;br /&gt;Touché, existe. mmmm..... vale. ¿Ahora qué hacemos con el? Ni idea de que hace realmente el fichero. Lo he abierto y es un binario....mmmm.... Vale, ya lo tengo. &lt;a href="http://inedit00.blogspot.com/2011/09/sudo-su-sin-espera-nodelay.html"&gt;Descubramos qué paquete ha creado este fichero&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;$ dpkg-query -S /lib/x86_64-linux-gnu/security/pam_unix.so&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;libpam-modules&lt;/span&gt;: /lib/x86_64-linux-gnu/security/pam_unix.so&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Con que &lt;span style="font-weight: bold;"&gt;libpam-modules&lt;/span&gt;, eh? Vaaaale, pues mira, estamos siguiendo la pista y no nos va mal. Ahora ¿cuál puede ser el siguiente paso? Pues descargar el código fuente y que hace realmente el código:&lt;br /&gt;$ mkdir ~/killme&lt;br /&gt;$ cd ~/killme&lt;br /&gt;$ apt-get source libpam-modules&lt;br /&gt;&lt;br /&gt;Esto nos habrá creado un par de ficheros en el directorio "killme" [2].&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Buceando en el código]&lt;/span&gt;&lt;br /&gt;Vale, ahora tenemos el código de la "libpam". ¿Qué hacemos? Lo obvio, aquí sería buscar alguna referéncia a "pam_unix.so". Pero como los ficheros ".so" son compilados y nosotros nos hemos descargado el código fuente, vamos a probar lo siguiente:&lt;br /&gt;$ find -name "pam_unix*"&lt;br /&gt;&lt;br /&gt;Oh! Genial, tenemos resultados! Parece que existe una carpeta interesante: "./pam-1.1.3/modules/pam_unix"&lt;br /&gt;&lt;br /&gt;Vale, ahora deberíamos buscar algo de utilidad dentro de esta carpeta. Juguemos con "grep", a ver si hay suerte:&lt;br /&gt;$ cd ./pam-1.1.3/modules/pam_unix2&lt;br /&gt;$ grep nodelay -i       # -i es para hace "ignore-case". O sea, que no distinga entre mayúsculas y minúsculas.&lt;br /&gt;&lt;blockquote&gt;pam_unix.8:\fBnodelay\fR&lt;br /&gt;pam_unix.8.xml:          &lt;option&gt;nodelay&lt;/option&gt;&lt;br /&gt;README:nodelay&lt;br /&gt;support.c:    if (off(UNIX_NODELAY, ctrl)) {&lt;br /&gt;support.h:#define UNIX_NODELAY             16    /* admin does not want a fail-delay */&lt;br /&gt;support.h:/* UNIX_NODELAY */         {"nodelay",         _ALL_ON_,             0100000},&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tenemos resultados! Parecen interesantes los ficheros "support.c" y "support.h". Revisado el fichero "support.h" parece que solo hay la declaración del parámetro UNIX_NODELAY.&lt;br /&gt;Veamos el fichero "support.c", a ver que contiene:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;[...]&lt;br /&gt;#ifdef HAVE_PAM_FAIL_DELAY&lt;br /&gt;    if (off(UNIX_NODELAY, ctrl)) {&lt;br /&gt;        D(("setting delay"));&lt;br /&gt;        (void) pam_fail_delay(pamh, 2000000);    /* 2 sec delay for on failure */&lt;br /&gt;    }&lt;br /&gt;#endif&lt;br /&gt;[...]&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Eureka! Lo hemos encontrado! Vale, yo no tengo ni idea de C. Nunca he programado nada serio en C, ni mucho menos una librería de sistema para Linux. Pero si hemos llegado hasta este fichero buscando cosas lógicas, ahora no nos va a detener un poco de código en C. Parece que es el código fuente de "pam_unix.so".&lt;br /&gt;&lt;br /&gt;Vamos a intentar leer lo que pone este pedacito de código. La condición "if" parece que comprueba lo siguiente:&lt;br /&gt;    SI (el parámetretro UNIX_NODELAY és igual a falso) ENTONCES {&lt;br /&gt;        Espérate 2 segundos&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Pues ya lo tenemos, señores. Resulta que &lt;span style="font-weight: bold;"&gt;no se puede definir un tiempo de espera&lt;/span&gt;, ya que el tiempo de espera &lt;span style="font-weight: bold;"&gt;está puesto de modo estático en el código&lt;/span&gt;. En ningún momento el código va a leer la variable "delay=3000000", por lo que si ponemos "delay=5000000" es normal que lo ignore.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[conclusión]&lt;/span&gt;&lt;br /&gt;¿Cómo hemos podido sacar todo esto? Pues la respuesta es muy simple: porque es Software Libre y se puede conseguir el código fuente muy facilmente a través de Internet. Inspeccionando el código vemos claramente lo que hace ( y mejor todavía, lo que &lt;span style="font-weight: bold;"&gt;no hace&lt;/span&gt; ). En este punto, y si tuviese los conocimientos de C necesarios, podría reescribir el código fuente para que aceptara un parámetro "delay" y que pudiese ser definido des de la pam.d/login. Una vez hechos los cambios, podría mandarlos al mantenedor del paquete y en caso de gustarle dichos cambios, los incorporaría en el código de la libpam. Y el mundo sería un lugar mejor y lloverían gominolas del cielo :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;[1] Recomiendo que te lo leas, sinó este pot no tiene mucho sentido.&lt;br /&gt;[2] Me gusta bastante crear directorios con el nombre "kill" o "killme" para usos temporales, ya que es un modo de saber si puedo borrar el directorio sin ni tan solo preocuparme de ver que contiene. En cambio, un directorio que llamado "temp" o "temporal".... bueno, si, son datos temporales. Pero hasta cuando? Servirá lo que hay dentro? Es algo lioso. Usando "killme" el tema está claro, puedes borrar la carpeta cuando quieras sin ningun problema, ya que el contenido de la misma no es importante ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6671913855625335983-9221172315879592644?l=inedit00.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://inedit00.blogspot.com/2011/11/clase-de-buceo.html</link><author>noreply@blogger.com (inedit00)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6671913855625335983.post-5226925811922573947</guid><pubDate>Thu, 08 Sep 2011 21:39:00 +0000</pubDate><atom:updated>2011-09-09T08:39:50.354+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><category domain="http://www.blogger.com/atom/ns#">tips</category><title>Saber a qué paquete pertenece un fichero</title><description>Algunas veces hay ficheros con nombres curiosos, y uno se pregunta qué paquete debe haber instalado este fichero. Por ejemplo el fichero:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;/usr/bin/pico&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Yo me pregunto, ¿quién lo habrá puesto ahí?&lt;br /&gt;&lt;br /&gt;Pues fácil:&lt;br /&gt;$ sudo aptitude install dlocate -y&lt;br /&gt;$ dlocate /usr/bin/pico&lt;br /&gt;&amp;gt; &lt;span style="font-weight: bold;"&gt;perl&lt;/span&gt;: /usr/bin/piconv&lt;br /&gt;&lt;br /&gt;Pues mira, ha sido el paquete "perl".&lt;br /&gt;&lt;br /&gt;Esto también sirve para ficheros de configuración, así como carpetas del sistema. Todo lo que esté "trackeado" por &lt;span style="font-style: italic;"&gt;dpkg&lt;/span&gt;, es suceptible de ser encontrado por dlocate.&lt;br /&gt;&lt;br /&gt;Un saludo, Jan.&lt;br /&gt;&lt;br /&gt;UPDATE: El comando "dpkg-query -S /usr/bin/see" también hace lo mismo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6671913855625335983-5226925811922573947?l=inedit00.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://inedit00.blogspot.com/2011/09/saber-que-paquete-pertenece-un-fichero.html</link><author>noreply@blogger.com (inedit00)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6671913855625335983.post-8281638913992352100</guid><pubDate>Thu, 08 Sep 2011 21:02:00 +0000</pubDate><atom:updated>2011-09-08T23:21:20.557+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">debian</category><category domain="http://www.blogger.com/atom/ns#">tips</category><category domain="http://www.blogger.com/atom/ns#">seguridad</category><title>"sudo su" sin espera ( nodelay )</title><description>Pues como hoy me he tirado 30 minutos buscando esta opción y considerando que hay poca información sobre ella ( y menos en castellano ), así va:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;¡NODELAY&lt;/span&gt; en pam_unix.so!&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[¿De qué va el tema?]&lt;/span&gt;&lt;br /&gt;Pues se trata de optimización de tiempo y comodiad en la consola. Cuando ejecutamos un comando con "sudo", normalmente nos pide la contraseña ( a menos que lo hayamos desactivado ). Esto es la política de seguridad bastante recomendada, ya que si no cualquier persona te podria juankear el ordenador si lo dejas solo un momento sin bloquear.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Total, dónde está el problema, entonces?]&lt;/span&gt;&lt;br /&gt;Pues que si al ejectuar cualquier comando con &lt;span style="font-style: italic;"&gt;sudo&lt;/span&gt;, te equivocas al picar tu password, te tienes que esperar 3 segundos para volverlo a picar. Y esto es un coñazo. Ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;inedit@tpad:~$ sudo echo 1&lt;br /&gt;[sudo] password for inedit: &lt;span style="font-style: italic;"&gt;foo&lt;/span&gt;&lt;br /&gt;- espera de tres segundos -&lt;br /&gt;Invalid password, please try again:&lt;br /&gt;[sudo] password for inedit: &lt;span style="font-style: italic;"&gt;bar&lt;br /&gt;&lt;/span&gt;- espera otra vez de tres segundos -&lt;span style="font-style: italic;"&gt;&lt;br /&gt;....etc...&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;[HOWTO]&lt;/span&gt;&lt;br /&gt;Total, que esta opción se puede desactivar a través de las PAM de linux del siguiente modo:&lt;br /&gt;&lt;br /&gt;sudo vim &lt;span style="font-weight: bold;"&gt;/etc/pam.d/common-auth&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Y modificar la lína donde pone:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;auth    [success=2 default=ignore]    pam_unix.so nullok_secure&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Y cambiarla por:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;auth    [success=2 default=ignore]    pam_unix.so nullok_secure nodelay&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;De este modo se desactiva totalmente el tiempo de espera entre logins. Cuando te equivoques al escribir tu password, automáticamente te volverá a preguntar la clave.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Precaución]&lt;/span&gt;&lt;br /&gt;Y uno se preguntará, ¿por qué puñetas no estaba desactivado esto ya? Pues por motivos de seguridad: previene que se lanzen ataques de fuerza bruta contra el PC, ya que el hecho de que te tengas que esperar 3 segundos tras cada intento fallido, limita mucho los ataques ( los hace inviables por la cantidad de tiempo que se necesita probar un número acceptable de claves ). Aplicando la regla anterior estamos quiando esta restricción. O sea que cuidadín en ejecutar algo así en una máquina de producción donde tenga SSH expuesto en Internet y demás. Quien avisa no es traidor.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Nota final]&lt;/span&gt;&lt;br /&gt;Como siempre, en un extremo tenemos seguridad, y en el otro tenemos comodidad. No podemos elegir ambos. Por lo que lo mejor es quedarse siempre en un punto medio.&lt;br /&gt;&lt;br /&gt;Un saludo, Jan.&lt;br /&gt;&lt;br /&gt;Posdata: Si alguien consigue sacar algo en claro sobre el fichero /etc/pam.d/login  y su parámetro "pam_faildelayso delay=3000000", que por favor deje un comentario y así completamos la información. Yo no he sido capaz de ajustarlo a un segundo. Gracias de antemano.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6671913855625335983-8281638913992352100?l=inedit00.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://inedit00.blogspot.com/2011/09/sudo-su-sin-espera-nodelay.html</link><author>noreply@blogger.com (inedit00)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6671913855625335983.post-7327179140913431507</guid><pubDate>Tue, 26 Jul 2011 18:05:00 +0000</pubDate><atom:updated>2011-07-26T20:14:30.669+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><title>Unetbootin</title><description>Un programita muy simple, pero que hace su trabajo.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;[Pa que sirve?]&lt;/b&gt;&lt;/div&gt;&lt;div&gt;Cuando te descargas una ISO de un nuevo SO ( debian/arch/back track....) y la quieres instalar en un ordenador tienes varias opciones. La mas común es tostarla en un CD y instalar des de ahí. Pero hay un problema en los notebooks y servidores y es que pueden no tener unidad de cederoms.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Unetbootin te soluciona la papeleta y te pone la ISO en un pendrive.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;[Cómo utilizarlo]&lt;/b&gt;&lt;/div&gt;&lt;div&gt;En mi caso me he encontrado con algún problemilla, utilizando el programa. Para ello sigo los siguientes pasos:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Meto el pendrive en el PC&lt;/li&gt;&lt;li&gt;Con gparted formateo el pendrive enterito, y le creo una partición fat16 de 4GB&lt;/li&gt;&lt;li&gt;Abro el programa unetbootin&lt;/li&gt;&lt;li&gt;Selecciono la ISO que quiero cargar en el pendrive ( el mismo programa te ofrece descargar la ISO vía web ).&lt;/li&gt;&lt;li&gt;Monto el pendrive&lt;/li&gt;&lt;li&gt;Le doy a OK&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;Te esperas 5 minutos a que copie los ficheritos de una lado pa otro y ya lo tienes. Al reiniciar, inicias des del pendrive y es lo mismo como si estuvieses haciendo el boot des de un CD.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Facil simple y para toda la familia. Y ya sabes, para instalar simplemente lo tienes que buscar en los repositorios de tu distribución favorita.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Un saludo, Jan.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;P.D: Ahora mismo estoy tostando ArchLinux de mientras escribo este post, a ver si lo puedo instalar O_0&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6671913855625335983-7327179140913431507?l=inedit00.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://inedit00.blogspot.com/2011/07/unetbootin.html</link><author>noreply@blogger.com (inedit00)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6671913855625335983.post-3062689504130649292</guid><pubDate>Wed, 29 Jun 2011 15:59:00 +0000</pubDate><atom:updated>2011-06-29T18:03:34.351+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">unixlike</category><title>unclutter</title><description>Estos pequeños programas, unixlike, que nos hacen la vida mas fácil en nuestro día a día. Esto es lo que realmente mola de linux.&lt;br /&gt;&lt;br /&gt;Esta vez se trata de una pequeñez, que cuando lo tienes puesto te olvidas de que lo tienes. Cumple exactamente su propósito porque para esto ha sido creado.&lt;br /&gt;&lt;br /&gt;unclutter, es una aplicación que simplemente te esconde el cursor del mouse de la pantalla después de un tiempo de no ser usado, o cuando estás escribiendo. Es especialmente cómodo en caso de tener una pantalla no muy grande, o si te pasas el dia programando ( como un servidor ).&lt;br /&gt;&lt;br /&gt;[Instalación]&lt;br /&gt;Bueno..... que os voy a contar que no sepais?&lt;br /&gt;sudo aptitude install unclutter&lt;br /&gt;&lt;br /&gt;[Configuración]&lt;br /&gt;Qué? Nono, U-N-I-X-L-I-K-E. La configuración por defecto ya va de lujo.&lt;br /&gt;&lt;br /&gt;[Cómo usarlo]&lt;br /&gt;unclutter &amp;amp;&lt;br /&gt;&lt;br /&gt;Y listo. Cada 12 segundos, aproximadamente, de inactividad del ratón, el cursor desaparece, a la que mueves el ratón, el cursor aparece de nuevo.&lt;br /&gt;&lt;br /&gt;Genial!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6671913855625335983-3062689504130649292?l=inedit00.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://inedit00.blogspot.com/2011/06/unclutter.html</link><author>noreply@blogger.com (inedit00)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6671913855625335983.post-1654641775943831299</guid><pubDate>Sun, 12 Jun 2011 13:47:00 +0000</pubDate><atom:updated>2011-06-12T15:48:51.134+02:00</atom:updated><title>Famoso "noatime"</title><description>Bueno señores, hoy vamos a ver una configuración muy simple de aplicar, y que hace que el sistema vaya muuucho más flúido. Y estoy hablando del parámetro "noatime".&lt;br /&gt;&lt;br /&gt;Qué es esto de "noatime"? Pues "noatime " es un parámetro especial en el montaje de los dispositivos como discos duros o memórias extraibles. Se acostumbra a modificar en el fichero /etc/fstab.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Explicación]&lt;/span&gt;&lt;br /&gt;Resulta que nuestro sistema de ficheros guarda, para cada uno de nuestros ficheros, un parámetro que se llama "atime", o "access time". Total, que cada vez que accedemos ( leemos ) un fichero, el valor "atime" se actualiza. Así podemos saber cuál fué la última vez que accedimos/leimos un determinado fichero.&lt;br /&gt;&lt;br /&gt;Pero claro, esto tiene un comportamiento no deseado:  Resulta que por cada lectura que hacemos a disco, necesitamos escribir algo a disco!! ( actualizar el valor "access time"). Esto parece absurdo! Para leer tenemos que escribir.&lt;br /&gt;&lt;br /&gt;Habrá alguien que pensará: exagerado! No es para tanto. Total, tiene que escribir a disco tan solo unos pocos bytes, esto no es nhà.&lt;br /&gt;&lt;br /&gt;Pues bueno, resulta que escribir estos pocos bytes si jode, y mucho. Me explico. Linux tiene un sistema fantástico de caches, completamente transparente para el usuario. Te permite hacer lo siguiente:&lt;br /&gt;&lt;br /&gt;# cat ./bashrc&lt;br /&gt;# cat ./bashrc&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;La primera vez que haces el "cat" de cualquier fichero ( en nuestro caso, .bashrc ), se va al disco duro, y lo lee. Pero también lo pone en la memória RAM. La segunda vez que ejecutas el comando "cat", sabe que lo tiene cacheado y lo lee directamente de memória RAM. No hace falta tocar disco duro. Esto hace que el sistema vaya muuuucho más rápido, ya que todo los ficheros que hayas leido una vez ( y no se hayan modificado ) ya están cacheados, y no se precisa leer a disco. Pero que pasa si no tenemos desactivado el "atime", pues que con cada lectura, aunque la tuvieses cacheada, tienes que hacer una escritura a disco para actualizar el tiempo de acceso. Nos ha jodido.&lt;br /&gt;&lt;br /&gt;Esto, en portátiles tiene un impacto muy grande ya que al cabo de X segundos de no utilizar el disco duro, éste se para. Un tema de ahorro de energía. Que pasa si queremos hacer una lecturo o escritura? Pues que el disco se tiene que volver a poner a girar con el consiguiente consumo energético/tiempo perdido. Pero si intentamos leer un fichero CACHEADO por el sistema, el disco duro ni se entera. Sigue parado. Por lo que es genial.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[HOTWO]&lt;/span&gt;&lt;br /&gt;Cómo activar la opción "noatime"?&lt;br /&gt;Con tu editor preferido (gedit, nano, emacs) el fichero, en mi caso "vim":&lt;br /&gt;# sudo vim /etc/fstab&lt;br /&gt;&lt;br /&gt;Busca tu disco duro principal. Lo mas seguro es que sea una entrada como esta:&lt;br /&gt;UUID=3e9532f9-226c-4f17-ae64-dad42519a1fc /               ext4    errors=remount-ro 0       1&lt;br /&gt;&lt;br /&gt;y añade simplemente "noatime" en las opciones para que quede tal que así:&lt;br /&gt;UUID=3e9532f9-226c-4f17-ae64-dad42519a1fc /               ext4    noatime,errors=remount-ro 0       1&lt;br /&gt;&lt;br /&gt;y punto. Reinicia y ya lo tienes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Prueba de concepto]&lt;/span&gt;&lt;br /&gt;Para los menos crédulos: que os den ¬¬. Y para los mas frikis vamos a hacer una prueba de concepto. El siguiente comando busca TODOS los ficheros están en /etc y les hace un "cat". Redirijo la salida a /dev/null porque no me interesa ver el contenido de los ficheros, sinó que simplemente mi máquina los lea enteritos una vez y los cachee. Fijáos, de 2.62 segundos a 0.037. Y la segunda vez sin tocar disco duro!!! It rocks!!&lt;br /&gt;&lt;br /&gt;inedit@tpad:/etc$ time find /etc  -name ".*" -exec cat '{}' ";" &amp;gt; /dev/null 2&amp;gt;/dev/null&lt;br /&gt;&lt;br /&gt;real    0m2.622s&lt;br /&gt;user    0m0.024s&lt;br /&gt;sys    0m0.044s&lt;br /&gt;inedit@tpad:/etc$ time find /etc  -name ".*" -exec cat '{}' ";" &amp;gt; /dev/null 2&amp;gt;/dev/null&lt;br /&gt;&lt;br /&gt;real    0m0.037s&lt;br /&gt;user    0m0.020s&lt;br /&gt;sys    0m0.016s&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Cuándo aplicar esta configuración]&lt;/span&gt;&lt;br /&gt;Bueno pues, recomendado, a todas las máquinas en general. Sin excepción.&lt;br /&gt;&lt;br /&gt;Muy recomendado, en portátiles. Por el tema de ahorro de corriente, y del encendido/parado del disco.&lt;br /&gt;&lt;br /&gt;Y OBLIGATORIO en los equipos:&lt;br /&gt;- Servidores ( web-ftp-sambda ) con muchas lecturas. Aquí si que utilizar el sistema de cachés es algo básico, y no quitar el atime podría hacer que el rendimiento fuese pésimo.&lt;br /&gt;- Equipos con discos duros SSD. Esto es debido a que los SSD tienen un número de escrituras máximas por bloque, y al llegar este número&lt;br /&gt;se desactiva el bloque y no se utiliza nunca más. Por lo que tener el "atime" activado significa que la vida del disco va a ser mucho mas corta.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;El desarrollador del kernel Ingo Molnar dijo:&lt;br /&gt;&lt;br /&gt;Atime updates are by far the biggest IO performance deficiency that Linux has today. Getting rid of atime updates would give us more everyday Linux performance than all the pagecache speedups of the past 10 years, _combined_.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Un saludo, Jan!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6671913855625335983-1654641775943831299?l=inedit00.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://inedit00.blogspot.com/2011/06/famoso-noatime.html</link><author>noreply@blogger.com (inedit00)</author><thr:total>7</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6671913855625335983.post-1304963669777737152</guid><pubDate>Sun, 12 Jun 2011 12:47:00 +0000</pubDate><atom:updated>2011-06-12T14:53:47.214+02:00</atom:updated><title>x201 Software - Sobre configuraciones, programas instalados y demás</title><description>En el post anterior he hecho un pequeño&lt;a href="http://inedit00.blogspot.com/2011/06/lenovo-x201-review.html"&gt; review sobre el Lenovo ThinkPad x201&lt;/a&gt;. En el hablábamos de las prestaciones a nivel de hardware. Ahora toca hablar de el software que tengo instalado en el juguetito.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Sistema Operativo]&lt;/span&gt;&lt;br /&gt;Pues, por supuesto, Debian 6.0 en testing. La instalación limpia, sin servidor de X, ni impresoras ni nada. Todo lo he ido instalando después "on demand".&lt;br /&gt;&lt;br /&gt;Por qué Debian y no otra? Bueno, al final hay 1000 distribuciones y cada uno elige la que más se adapta a sus necesidades. En mi caso:&lt;br /&gt;&lt;br /&gt;Es estable: esto es importante ya que utilizo el portátil tanto para ocio como para el trabajo. No me puedo permitir el lujo de actualizar por la noche y que la mañana siguiente en el curro me peten las X, o que me quede sin audio (para poder recibir llamdas por VozIP y demás).&lt;br /&gt;Sistema gestor de paquetes: es genial, muy práctico y simple de usar. Cualquier cosa que necesite está ahí.&lt;br /&gt;Altamente configurable: me encanta toquetear y personalizar todo. Pero las configuraciones por defecto ya te lo dejan listo para trabajar.&lt;br /&gt;Actualizan cada vez que hace falta: Antes usaba Ubuntu y sacaban muchas cosas en poco tiempo. Cada 6 meses, nueva versión. Esto va en contra de la estabilidad del sistema.&lt;br /&gt;Y la mas importante de todas: porque me sale de los mismísimos _ _ _ _ _ _ _ (rellénese con "cojones")&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Programas básicos]&lt;/span&gt;&lt;br /&gt;Nótese que me he tirado muchas horas ( debería decir dias? ) configurando el juguetito. Primero porque me la pone morcillona, segundo porque trabajo mas cómdo/rápido/mejor. Quiero decir que todas estas configuraciones no las he hecho en una tarde. Pero es cosa de ir haciendo poco a poco. Vale bastante la pena tener las cosas exactamente como a uno le gustan.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Gestor de ventanas: OpenBox # MUY tuneado&lt;/li&gt;&lt;li&gt;Navegadores: Chromium, Firefox4.0&lt;/li&gt;&lt;li&gt;Editor de texto: vim&lt;/li&gt;&lt;li&gt;Terminal: gnome-terminal y xterm, también uso tilda # bastante personalizado, tanto .bashrc como .inputrc&lt;/li&gt;&lt;li&gt;File Manager: Thunar ( no lo utilizo para un carajo )&lt;/li&gt;&lt;li&gt;Visor de imágenes: feh&lt;/li&gt;&lt;li&gt;Visor de PDF's: xpdf / evince&lt;/li&gt;&lt;li&gt;Mensajería (MSN/Jabber): Pidgin&lt;/li&gt;&lt;li&gt;Dock: tint2&lt;/li&gt;&lt;li&gt;Gestor de escritorio: ninguno. Lo tengo siempre vacío de iconos.&lt;/li&gt;&lt;li&gt;Información sistema: conky en el escritorio.&lt;/li&gt;&lt;li&gt;Conexiones: network-manager ( a falta de alternativa mejor ).&lt;/li&gt;&lt;li&gt;Cliente IRC: irssi&lt;/li&gt;&lt;li&gt;Cliente correo: Normalmente utilizo el navegador, pero tengo el mutt configurado también.&lt;/li&gt;&lt;li&gt;Servicios: ssh, básico. openvpn que se conecta a un servidorcillo dándome un canal seguro por si lo necesito.&lt;/li&gt;&lt;li&gt;Lanzador de comandos: gmrun&lt;/li&gt;&lt;li&gt;Cliente de VozIP: blink o sjphone. También uso Skype para el curro&lt;/li&gt;&lt;li&gt;Reproductor de música: moc (básico, es un reproductor por línea de comandos)&lt;/li&gt;&lt;li&gt;Escriotorio remoto: rdesktop para cuando tengo que trabajar con Juindous, y TeamView para dar soporte a clientes.&lt;/li&gt;&lt;li&gt;Volumen audio: aumix / alsamixer. Los dos por línea de comandos.&lt;/li&gt;&lt;li&gt;Ofimatica: libreoffice (casi no lo uso para nada)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Scripts]&lt;/span&gt;&lt;br /&gt;Pues tengo un script, que iré comentado en los próximos posts, que es el centro del universo de mi portátil. Ahí he ido recopilando todos los procedimientos que voy repitiendo cada día en un solo script. El script se llama "tpad" en un alarde de originalidad (el portátil es un ThinkPAD). Me permite hacer cosas tan variadas como: blockear las pantalla, añadir las claves SSH al ssh-agent, montar de forma segura un flash drive con encriptación Luks, cambiar el idioma del teclado, apagar/reiniciar el equipo, control de la salida de video, etc... la mayoría de estos comandos son accesibles mediante un shortcut configurado en .config/openbox/rc.conf, así como des de cualquier termianl. Al comando en cuestión le he puesto completion y ayuda. Como digo, ya os iré mostrando lo que hace este ficherito.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Configuraciones de sistema]&lt;/span&gt;&lt;br /&gt;Por ejemplo:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Modificar /etc/fstab para poner el parámetro "noatime" a los discos, así como crear puntos de montaje de tipo /tmpfs par hacer que vaya todo mas flúido.&lt;/li&gt;&lt;li&gt;Que tanto Firefox como Chrome utilizen la memória RAM para almacenar sus ficheros temporales ( normalmente van sobre disco ).&lt;/li&gt;&lt;li&gt;Quitar servicios innecesarios al inicio del sistema.&lt;/li&gt;&lt;li&gt;Cambiar el sistema de completion de bash, para que cuando inicies una nueva terminal todo cargue mucho mas rápido.&lt;/li&gt;&lt;li&gt;Cachear ficheros para que estén en memória y tenga que hacer menos lecturas a disco cuando trabajo.&lt;/li&gt;&lt;li&gt;Desactivar la memória swap.&lt;/li&gt;&lt;li&gt;Configurar "iptables" para blindar el PC contra ataques en red local.&lt;/li&gt;&lt;li&gt;Quitar el puto "beep" de los cojones del sistema.&lt;/li&gt;&lt;li&gt;Remapear algunas teclas del teclado.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bueno vamos, que estos son los programas mínimos que necesito para ir tirando. Como ya os he dicho, voy a ir comentado próximamente algunos de ellos, y las configuraciones que me han sido más útiles a mi, tanto por un tema de usabilidad, como por un tema de eficiencia.&lt;br /&gt;&lt;br /&gt;Os dejo con una captura de pantalla del escritorio, y otra con un benchmarck sacado por el programa bootchart, para ponerle los dientes largos a mas de uno ;)  [1]. Si por lo sea has leido algo que te interesa en este post, y quieres que amplie un poco la información, no dudes en dejar un comentario y te soluciono las dudas que tengas!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/-Jf6iJJljlXw/TfS1ywwRd-I/AAAAAAAAARc/79fggJm6OUQ/s1600/2011-06-12_14%253A39.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 200px;" src="http://3.bp.blogspot.com/-Jf6iJJljlXw/TfS1ywwRd-I/AAAAAAAAARc/79fggJm6OUQ/s320/2011-06-12_14%253A39.png" alt="" id="BLOGGER_PHOTO_ID_5617314518923311074" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/-HXOI4hqOLFo/TfS2ATUFz9I/AAAAAAAAARk/532eCwyHbs8/s1600/bootchart.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 70px; height: 320px;" src="http://1.bp.blogspot.com/-HXOI4hqOLFo/TfS2ATUFz9I/AAAAAAAAARk/532eCwyHbs8/s320/bootchart.png" alt="" id="BLOGGER_PHOTO_ID_5617314751538646994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;[1]: Arranque en 21 segundos ;) Y sin SSD. Todavía.&lt;br /&gt;Un saludo, y hasta la próxima!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6671913855625335983-1304963669777737152?l=inedit00.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://inedit00.blogspot.com/2011/06/x201-software-sobre-configuraciones.html</link><author>noreply@blogger.com (inedit00)</author><media:thumbnail url="http://3.bp.blogspot.com/-Jf6iJJljlXw/TfS1ywwRd-I/AAAAAAAAARc/79fggJm6OUQ/s72-c/2011-06-12_14%253A39.png" height="72" width="72" /><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6671913855625335983.post-3917729362957315482</guid><pubDate>Sun, 12 Jun 2011 10:53:00 +0000</pubDate><atom:updated>2011-06-12T13:05:48.398+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">lenovo review</category><title>Lenovo X201 review</title><description>Hace tiempo ya -sobre noviembre del año pasao- me compré un portátil nuevo.&lt;br /&gt;&lt;br /&gt;El juguete en cuestión es un Lenovo ThinkPad x201. Una monada, la verdad. Con decir que ha sido una de las mejores compras que he hecho en la vida, creo que lo digo todo. Y voy a hacer un poquito de review:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[PRESTACIONES&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;]&lt;/span&gt;&lt;br /&gt;Veamos de prestaciones quetal está:&lt;br /&gt;Modelo: Lenovo ThinkPad x201 - 3249&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Procesador: Intel i5 M540 a 2.53GHz. 3M de caché. 2 cores o 4 con HyperThreading ( 5053.44 bogomits cada uno ). [1]&lt;/li&gt;&lt;li&gt;Memória RAM: 6GB (4GB+2GB) DDR3 a 1066. No soporta Dual Channel.&lt;/li&gt;&lt;li&gt;Disco duro: 240GB a 5200rpms.&lt;/li&gt;&lt;li&gt;Gráfica: Integrada en el procesador [1]. Soporta video de alta definición así como dos pantallas conectadas al mismo tiempo.&lt;/li&gt;&lt;li&gt;Pantalla: 12.1 pulgadas, WXGA Display (16:10)&lt;/li&gt;&lt;li&gt;Batería: 6 celdas, nos da una autonomia de entre 3.5 horas de trabajo intensivo, o unas 5 si no utilizamos internet ni mucho disco.&lt;/li&gt;&lt;li&gt;Puertos: Gibabit Ethernet, Modem, 3USB, microfono/audio, ExpressCard, 5-1 MediaCard Reader, VGA&lt;/li&gt;&lt;li&gt;Otros: Lector de huella digital, LED que ilumina el teclado&lt;/li&gt;&lt;li&gt;Teclado: De lo mejorcito, full-size con un tacto espectacular.&lt;/li&gt;&lt;li&gt;Mouse: TrackPad y TouchPad (utilizo el TrackPad, es MUY cómodo)&lt;/li&gt;&lt;li&gt;Peso: 1,47 Kg&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[HARDWARE]&lt;/span&gt;&lt;br /&gt;Y ahora que hemos visto los datos en bruto, vamos a comentarlos un poquito.&lt;br /&gt;&lt;br /&gt;El procesador es un i5, y va muy muy fino. Haciendo "vida normal" (navegando, programando, etc...) el uso siempre está en un 1% [2]. La temperatura ronda los 46 grados en invierno y los 50 en verano. El ventilador que refrigera todo se oye muy poquito ( almenos no parece que el portátil vaya a hacer un despegue vertical, como hacen muchos otros portátiles ). Con 6GB de memória voy mas que sobrado; al iniciar el sistema hay 100MB de memória usados, a la horita de utilizar el PC hay entre 400MB y 600MB usados. Nunca lo he visto superar el GB[2]. La targeta gráfica funciona muy bien para el uso doméstico/trabajo. Nunca lo he probado para jugar a juegos de última generación, pero seguramente se quede un poco corto. Para reproducir flash o ver videos HD va muy fina, aunque utiliza el 25% de la CPU, por lo que el portátil inevitablemente se calienta.&lt;br /&gt;&lt;br /&gt;El disco duro es mas que suficiente, y con mi configuración[2] necesito solo 6GB para el sistema/programas. Los demás son para mis cosicas. Aún así dentro de muy poquito lo voy a cambiar por un SSD y disco que hay ahora montado lo usaré de disco extraible USB. Esto si va a ser la caña.&lt;br /&gt;&lt;br /&gt;Todo lo demás: pues la pantalla tiene el tampaño perfecto para mi: no es un netbook donde no puedes ver casi nhà, pero tampoco es una pantalla de cine enorme que hace que la batería del portátil se gaste antes, y el tamaño/peso del juguete aumente considerablemente. La batería es suficiente, aunque siempre tienes que ir con el cargador ( con 4 horas de autonomía lo tengo que cargar 3 veces al día, como os podeis imaginar ). Sobre los puertos solo se hecha en falta otro conector de vídeo que no sea VGA, pero bueno. El TrackPad va de lujo y lo mejor sin duda es el teclado. Si os fijais en las fotos, ocupa el 100% de la superfície del portátil pero el tamaño de las teclas es el estándart. Va muy muy bien. Un tacto genial. Cuando cambias a cualquier otro teclado te das cuenta de lo cómodo que es el del x201.&lt;br /&gt;&lt;br /&gt;Lo que le falla: Los altavoces, sin duda, son una mierda. La calidad del audio deja bastante que desear. Y le falta otra salida de vídeo como DVI. Y en el modelo que compré también le falta una webcam. Pero hay modelos que si la incluyen. Estaría bien un puerto USB 3.0, que no tiene. Y le sobra el Modem. Ya no estamos en los años noventa.&lt;br /&gt;&lt;br /&gt;Estética: se puede ver en las fotos. Pequeño, ligero, el teclado ocupa toda la superfície. Cuando lo coges se nota sólido. El diseño es algo austero, pero a mi personalmente me gusta así.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[PRECIO]&lt;/span&gt;&lt;br /&gt;Pues no lo regalan. Yo lo compré en EEUU por unos 920€. En españa creo que el precio base ronda los 1100€. Pero, sin duda alguna, vale mucho la pena gastarse este dinero. Yo, antes de comprarlo me decía: "vale Jan, por 1100€ puedes tener un porátil de 600€ un PC de sobremesa de 500€". Si ahora mismo tuviese que volver a comprarlo, compraría exactamente este mismo modelo. Mis compañeros y gente del mundillo de la informática me ha dicho que me va a durar 4-5 años fácil fácil. Mi jefe y un compañero mio tienen un x60s de hace 5 años y todavía trabajan a diario con ellos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[CONLUSIÓN]&lt;/span&gt;&lt;br /&gt;Un porátil con unas prestaciones muy buenas. Tiene muchos pros y pocos contras. Es un portátil para trabajar y navegar, no para jugar. Portable, ligero pero con la última tecnología del mercado. Lo recomiendo al 100%. No es barato, pero la inversión vale la pena con creces. Yo, después de 7 meses ya lo he amortizado :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[FOTICAS]&lt;/span&gt;&lt;br /&gt;&lt;a href="http://tpholic.com/xe/files/attach/images/63/226/373/004/SNC00489.jpg"&gt;http://tpholic.com/xe/files/attach/images/63/226/373/004/SNC00489.jpg&lt;/a&gt;&lt;br /&gt;&lt;a href="http://buildaroo.com/wp-content/uploads/2010/12/Lenovo-ThinkPad-x201-side-and-back.jpeg"&gt;http://buildaroo.com/wp-content/uploads/2010/12/Lenovo-ThinkPad-x201-side-and-back.jpeg&lt;/a&gt;&lt;br /&gt;&lt;a href="http://ultimosavances.com/wp-content/uploads/2010/02/x201.jpg"&gt;http://ultimosavances.com/wp-content/uploads/2010/02/x201.jpg&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.abeststore.com/blog/wp-content/uploads/2010/07/Lenovo-ThinkPad-X201.jpg"&gt;http://www.abeststore.com/blog/wp-content/uploads/2010/07/Lenovo-ThinkPad-X201.jpg&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nótese que algunos portátiles tienen touchPad o webcam y otros no. Todo esto es opcional.&lt;br /&gt;&lt;br /&gt;[1]: http://ark.intel.com/Product.aspx?id=43544&lt;br /&gt;[2]: Ya hablaremos porqué en el apartado de Software&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6671913855625335983-3917729362957315482?l=inedit00.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://inedit00.blogspot.com/2011/06/lenovo-x201-review.html</link><author>noreply@blogger.com (inedit00)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6671913855625335983.post-8438126991378603625</guid><pubDate>Tue, 31 May 2011 05:51:00 +0000</pubDate><atom:updated>2011-05-31T07:58:13.908+02:00</atom:updated><title>Así afectará a los blogs la Ley Mordaza que prepara Leire Pajín</title><description>Artículo muy interesante. Preparar una tila, que la verdad que duele:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.outono.net/elentir/2011/05/29/asi-afectara-a-los-blogs-la-ley-mordaza-que-prepara-leire-pajin/"&gt;http://www.outono.net/elentir/2011/05/29/asi-afectara-a-los-blogs-la-ley-mordaza-que-prepara-leire-pajin/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6671913855625335983-8438126991378603625?l=inedit00.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://inedit00.blogspot.com/2011/05/asi-afectara-los-blogs-la-ley-mordaza.html</link><author>noreply@blogger.com (inedit00)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6671913855625335983.post-4879840399311526108</guid><pubDate>Sun, 27 Mar 2011 13:43:00 +0000</pubDate><atom:updated>2011-03-27T16:19:23.150+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">unicode</category><category domain="http://www.blogger.com/atom/ns#">codigo</category><category domain="http://www.blogger.com/atom/ns#">programacion</category><title>El Mínimo Absoluto que Todos los Desarrolladores  Deberían Conocer Sobre Unicode y Codificaciones.</title><description>Este artículo pretende ser una traducción más o menos fiel [1] de el &lt;a href="http://www.joelonsoftware.com/articles/Unicode.html"&gt;artículo de Joel Spolsky&lt;/a&gt;. Me ha gustado tanto que me he decidido a traducirlo para hacerlo accesible a todos aquellos que no dominan el inglés, o que prefieren leer en castellano. Es un magnífico texto que todavía hoy sigue vigente. Te recomiendo la lectura, ya seas programador, administrador de sistemas, o simplemente un curioso de la informática.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-C7YUHF9NTMg/TY9EL6kvLMI/AAAAAAAAAQ4/ZmOKhQ0bLto/s1600/i-love-unicode.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 180px; height: 45px;" src="http://4.bp.blogspot.com/-C7YUHF9NTMg/TY9EL6kvLMI/AAAAAAAAAQ4/ZmOKhQ0bLto/s400/i-love-unicode.png" alt="" id="BLOGGER_PHOTO_ID_5588760634082667714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;----------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;font-size:180%;" &gt;El Mínimo Absoluto que Todos los Desarrolladores  Deberían Conocer Sobre Unicode y Codificaciones.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Miércoles, 08 de Octubre de 2003 by Joel Spolsky&lt;br /&gt;&lt;br /&gt;Alguna vez te has preguntado acerca de la etiqueta misteriosa "Content-Type"? Ya sabes, la que se supone que debes poner en el HTML y que nunca has sabido realmente que poner?&lt;br /&gt;&lt;br /&gt;Alguna vez has recibido un correo de tus amigos de Bulgaria con un asunto igual a "???? ??? ?? ????? ??" ?&lt;br /&gt;&lt;br /&gt;Me he molestado al descubrir que muchos desarrolladores no saben realmente como funciona el misterioso mundo de las codificaciones de caracteres, Unicode, etc... Unos años atrás un &lt;span style="font-style:italic;"&gt;beta tester&lt;/span&gt; de FogBUGZ se estaba preguntando si podría recibir correos en Japonés. Japonés? Ellos escriben correos en Japonés? No tenía ni idea. Cuando miré mas de cerca el componente comercial que estábamos desarrollando en ActiveX para parsear las cabeceras MIME de los e-mails, nos dimos cuenta de que lo estábamos haciendo mal con las codificaciones de caracteres, por lo que tuvimos que reescribir el código de conversión. Cuando miré el código de otra aplicación comercial, también tenia una mala implementación en la codificación de caracteres. Mandé un par de e-mails al desarrollador del paquete, pero el dijo algo así como: "no puedo hacer nada al respecto".&lt;br /&gt;&lt;br /&gt;Cuando descubrí que en el lenguaje de programación PHP no se habían tenido en cuenta las condificaciones y que usaba tan solo 8 bits para la codificación de caracteres, haciendo prácticamente imposible el desarrollo de buenas aplicaciones internacionales, pensé: ya es suficiente.&lt;br /&gt;&lt;br /&gt;Tengo un anuncio que hacer: si eres un programador y no tienes unos conocimientos mínimos sobre caracteres, tabas de caracteres, codificaciones y Unicode, te voy a pillar y te castigaré haciéndote pelar cebollas durante 6 meses en un submarino. Te juro que te pillaré.&lt;br /&gt;&lt;br /&gt;Y algo más:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;** NO ES TAN DIFÍCIL **&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;En este artículo voy a explicar exactamente lo que &lt;span style="font-weight: bold;"&gt;todos los programadores deberían saber&lt;/span&gt;. Todo esto de que "texto en claro = ASCII = caracteres de 8 bits" no está solamente mal, sino que está fatal, y si sigues programando de este modo, no eres mucho mejor que un doctor que no cree en los gérmenes. POR FAVOR, no escribas otra línea de código antes de haber acabado de leer este artículo.&lt;br /&gt;&lt;br /&gt;Antes de que empiece, debería advertirte de que si eres una de estas raras personas que sabe algo sobre la internacionalización, vas a encontrar todo lo de este posto un poco "simplificado". Yo estoy intentando establecer un mínimo, para que todo el mundo pueda entender de qué va el tema, y pueda escribir código que tenga alguna oportunidad de funcionar en textos escritos en cualquier lenguaje  ( o en otro subset de inglés que no incluya palabras acentuadas ¬¬ ). Y debo advertirte que el tratamiento de caracteres es solo una pequeña parte de lo que conlleva crear software que funcione intencionalmente. Me temo que yo solo puedo escribir artículos sobre una cosa a la vez, o sea que hoy tocan codificaciones de caracteres.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Des de la perspectiva histórica&lt;/span&gt;&lt;br /&gt;========================&lt;br /&gt;&lt;br /&gt;La manera mas fácil de entender todo esto es ir viéndolo de manera cronológica.&lt;br /&gt;&lt;br /&gt;Probablemente estarás pensando que voy a hablar sobre antiguas tablas de caracteres como EBCDIC. Bueno, no voy a hacerlo. EBCDIC no es relevante para tu vida. No tenemos que ir tan atrás en el tiempo.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-y4Ypv0fxBUI/TY9ClDIC38I/AAAAAAAAAQg/pzIo2AIG_mk/s1600/ascii.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 274px; height: 146px;" src="http://4.bp.blogspot.com/-y4Ypv0fxBUI/TY9ClDIC38I/AAAAAAAAAQg/pzIo2AIG_mk/s400/ascii.png" alt="" id="BLOGGER_PHOTO_ID_5588758866851717058" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Volviendo atrás en los tiempos semi-antiguos, cuando Unix fue inventado y K&amp;amp;R estaba escribiendo The C Programming Language, todo parecía muy simple. EBCDIC estaba ya de salida. Los únicos caracteres que importaban eran los caracteres del inglés, con letras no acentuadas. Así se creó el ASCII que eran unas tablas capaces de representar todos los caracteres usando números del 32 al 127. El carácter que se correspondía con el espacio era el 32, la letra "A" se correspondía con el 65, etc. Todo esto se podía guardar perfectamente en 7 bits. La mayoría de ordenadores en estos días usan bytes de 8 bits, entonces no solo podrías almacenar todos los caracteres ASCII, sino que tenías un bit adicional que "sobraba" ( no se usaba ) y que, si querías podías utilizar para tus propios ( y maléficos ) fines. Este bit adicional se utilizó en WordStar para indicar la última letra de una palabra, condenando, así, WordStart a que sólo funcionara en inglés. Los códigos por debajo de 32 se llamaban "unprintables" ( que no se pueden escribir ) y se utilizaban para insultar. Estaba bromeando. Realmente se usaban como caracteres de control, como el 7, que hacía que ordenador emitiese un "beep", y el 12, que se interpretaba por las impresoras como un salto de página, por lo que dejaba de imprimir en la hoja actual y cargaba otra hoja.&lt;br /&gt;&lt;br /&gt;Todo esto estaba muy bien. Suponiendo, claro, que fueses de habla inglesa.&lt;br /&gt;&lt;br /&gt;Como el código ASCII solo ocupaba 7 bits, mucha gente pensó "caramba, puedo utilizar los código 128 hasta el 255 para almacenar mis cosas". El problema fue que MUCHA gente pensó esto en el mismo momento, pero cada uno tuvo su propia idea de qué debería ir en el espacio de 128 a 255. El IBM-PC creó algo que se llegó a conocer como mapa de caracteres OEM, que contenía caracteres acentuados para los lenguajes Europeos, así como muchos caracteres para dibujar líneas.... barras horizontales, barras verticales, etc... así que tu podías usar estas líneas para dibujar caracteres en la pantalla y hacer cuadros y líneas a tu gusto ( era un recurso para embellecer las aplicaciones de  línea de comandos ). Asimismo, cuando la gente empezó a comprar ordenadores fuera de EEUU, se diseñaron muchos tipos diferentes de tablás de caracteres OEM. Cada una de ellas usaba los últimos 128 caracteres para sus propios propósitos. Por ejemplo, en algunos ordenadores el código 130 se mostraba como "é", pero en los ordenadores vendidos en Isael se veía la letra Hebrea Gimel (&lt;img alt="ג" src="http://www.joelonsoftware.com/pictures/unicode/gimel.png" width="5" border="0" height="9" /&gt;), así que si des de Estados Unidos enviaban un documento con la palabra "résumés" los israelitas las recibían como "r&lt;img alt="ג" src="http://www.joelonsoftware.com/pictures/unicode/gimel.png" width="5" border="0" height="9" /&gt;sum&lt;img alt="ג" src="http://www.joelonsoftware.com/pictures/unicode/gimel.png" width="5" border="0" height="9" /&gt;s". En muchos casos, como en Rusia, hubieron muchas ideas sobre qué hacer con los últimos 128 caracteres, por lo que intercambiar documentos en la misma Rusia se convertía en un problema.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/--JcfaF7g8Vw/TY9C0P8lEpI/AAAAAAAAAQo/_YAGl8xN86I/s1600/oem.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 271px; height: 209px;" src="http://3.bp.blogspot.com/--JcfaF7g8Vw/TY9C0P8lEpI/AAAAAAAAAQo/_YAGl8xN86I/s400/oem.png" alt="" id="BLOGGER_PHOTO_ID_5588759127991325330" border="0" /&gt;&lt;/a&gt;Eventualmente, este "libre albedrío" de qué hacer en los últimos 128 caracteres se acabó con el estándar ANSI. En este nuevo estándar, todo el mundo accedió en "qué hacer con estos 128 caracteres". Pero este nuevo método establecía muchos maneras de tratar los últimos 128 caracteres, dependiendo del sitio donde vivieras. Estos sistemas diferentes se llamaron *code pages* (páginas de código). En Israel, por ejemplo, el sistema operativo DOS usaba la página con código 862, mientras que en Grecia usaban la página de códigos 737. O sea, sus tablas de códigos eran igual por debajo de los 128 ( ASCII ), pero eran diferentes por encima de los 128 ( donde se ponían todos aquellos "caracteres divertidos" de cada país o región ). Las versiones de MS-DOS tenían docenas de páginas de códigos, que permitían hacer que un mismo ordenador fuera "multilenguaje", de modo que podían abrir documentos escritos en inglés, islandés o esperanto (usando una tabla de códigos que suportara los tres idiomas al mismo tiempo). Pero qué pasaba si querías usar el hebreo y el griego en el mismo ordenador? Pues que no podías ya que cada uno tenía su tabla de códigos específica, y no había ninguna tabla de códigos "compartida" entre estos dos idiomas.&lt;br /&gt;&lt;br /&gt;Mientras tanto en Asia, estaban pasando cosas bastante mas complicadas por el hecho de que los alfabetos asiáticos tienen cientos de carácteres. Ellos lo solucionaron con un sistema muy lioso llamado DBCS, "double byte charse set" en el que _algunas_ letras se guardaban en un byte, otras letras se guardaban en dos bytes. Este sistema te permitía moverte sin problemas hacia "adelante" en un string, pero era realmente complicado moverte "hacia atrás". Por esto los programadores dejaron de usar s++ o s-- y empezaron a usar las funciones de Windows AnsiNext y AnsiPrev para no tener que pelearse con este complicado sistema.&lt;br /&gt;&lt;br /&gt;Pero aún así la gente seguía programando de modo que un carácter fuese un byte, y que un carácter tenía 8 bits, lo que significava que "nunca muevas un texto de un ordenador a otro". Pero claro, con la aparición de Internet hubo un sitio muy propicio para intercambiar textos de un ordenador a otro, y todo el tema de las codificaciones se vino abajo. Por suerte se inventó Unicode.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Unicode&lt;/span&gt;&lt;br /&gt;=======&lt;br /&gt;Unicode fue el resultado de un gran esfuerzo por crear un solo set de caracteres que incluía cualquier sistema de escritura razonable en el planeta, y algún otro como el Klingon, también. Algunas personas, malentendiendo lo que Unicode es, piensan realmente que es un sistema de 16 bits, donde cada carácter ocupa 16 bits. Esto significaría que con este sistema se podrían escribir hasta 65.536 caracteres. &lt;span style="font-weight: bold;"&gt;Pero esto no es realmente cierto&lt;/span&gt;. Es uno de los mitos mas tontos sobre Unicode, por lo que si creías que que era así, no te sientas mal.&lt;br /&gt;&lt;br /&gt;De hecho, Unicode tiene un modo diferente de pensar sobre los caracteres, y tu tienes que entender este modo de pensar, o nada va a tener ningún sentido para ti.&lt;br /&gt;&lt;br /&gt;Hasta ahora, hemos asumido que un carácter se guarda en un número determinado de bytes como por ejemplo:&lt;br /&gt;&lt;br /&gt;A = 0100 0001&lt;br /&gt;&lt;br /&gt;En Unicode, los caracteres se llaman "code point", que son solo un concepto teórico. El cómo un "code point" se representa en memoria o en disco, es otra historia.&lt;br /&gt;&lt;br /&gt;En Unicode, la letra A es una idea platónica. Solo está flotando en el aire:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;A&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;Esta platónica &lt;span style="font-weight: bold;font-size:130%;" &gt;A&lt;/span&gt; es diferente de &lt;span style="font-weight: bold;font-size:130%;" &gt;B&lt;/span&gt;, y diferente de &lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;a&lt;/span&gt;&lt;/span&gt;, pero igual a &lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;A&lt;/span&gt;&lt;/span&gt;, y &lt;span style="font-weight: bold; font-style: italic;font-size:130%;" &gt;A&lt;/span&gt;, y A. La es idea que A en el tipo de letra Times Roman es lo mismo que A en el tipo de fuente Helvetica, pero diferente de "a" en minúscula. Esto no parece que tenga que causar mucha controversia, pero en algunos lenguajes, determinar lo que realmente una letra &lt;span style="font-style: italic;"&gt;es&lt;/span&gt; puede ser complicado. Por ejemplo en Alemán la letra ß es una letra real o es otro modo de escribir &lt;span style="font-style: italic;"&gt;ss&lt;/span&gt;? Si una letra cambia, por el hecho de estar escrita al final de una palabra, es la misma letra? Los hebreos dicen que si. Los arábigos dicen que no. De todos modos, la gente inteligente de el consorcio de Unicode, se han estado preguntando todo esto durante la última década, acompañado por un gran debate político. Por esto tu no debes preocuparte por todo esto. Ellos ya lo han calculado todo ya.&lt;br /&gt;&lt;br /&gt;Cualquier letra platónica ( concepto de letra ) en todos los alfabetos, es un número mágico en el consorcio Unicode, que se escribe tal que así: U+0639. Este número mágico es llamado "code point". El U+ significa Unicode y los números son hexadecimal.&lt;br /&gt;&lt;br /&gt;No hay un límite real en el número de letras que Unicode puede definir, aún a pesar de que parezca de que solo se utilicen 2 bytes, y por tanto, solo se pueden definir 65535 letras. Esto es otro mito sobre Unicode.&lt;br /&gt;&lt;br /&gt;Bien, aquí tenemos una cadena de texto:&lt;br /&gt;&lt;div style="text-align: center;"&gt;  Hello&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;que, en Unicode, corresponde a estos cinco puntos de código:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;U+0048  U+0065  U+006C  U+006C  U+006F&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Solo sólo un montón de puntos de código (codepoints). Números, en realidad. Todavía no hemos hablado de cómo guardar esto en memoria o en disco, o cómo representarlo en un mensaje de correo electrónico.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Econdings&lt;/span&gt;&lt;br /&gt;=========&lt;br /&gt;Aquí es donde entran los "encodings" (codificaciones).&lt;br /&gt;&lt;br /&gt;La primera idea de las codificaciones en Unicode, que nos deja el mito sobre los dos bytes, fué: "ei! vamos a guardar estos números en dos bytes cada uno". Así que "Hello" se convierte en:&lt;br /&gt;&lt;div style="text-align: center;"&gt; 00 48 00 65 00 6C 00 6C 00 6F&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Bien? No, demasiado rápido! No podría escribirse como?&lt;br /&gt;&lt;div style="text-align: center;"&gt; 48 00 65 00 6C 00 6C 00 6F 00 ?&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Bueno, técnicamente, si. Creo que se podría, y de hecho, los primeros programadores querían ser capaces de guardar los "code points" de Unicode en "high-endian" o "low-endian" en función de si su procesador iba mas rápido en un sistema que en el otro. Entonces la gente estuvo forzada a adoptar la convención bizarra de guardar FE FF al principio de cada texto Unicode; esto se llama Unicode Byte Order Mark ( Marca de orden de bytes Unicode ), y, si tu estabas girando el orden tus bytes de mayor y menor peso, esta marca sería FF FE, así la persona que leyera tu texto sabría si tiene que girar el orden de los bytes o no. Ufff. No todos los textos Unicode tendría la marca de orden al principio, o sea que ya os podéis imaginar los problemas que conllevaría esto.&lt;br /&gt;&lt;br /&gt;Durante un tiempo, esto parecía que debería suficiente, pero los programadores se estaban quejando y diciendo: "Ei! Mira todos estos ceros!", ya que ellos eran americanos y estaban mirando texto en inglés. El texto en inglés cumplía la propiedad de que rara vez habían "code points"por encima de U+00FF. También estaban los hippies liberales de California que querían conservar (grrr). Si fueran tejanos, no les habría importado el consumo del doble de memoria para guardar un texto en inglés ( chiste americano ). Pero los cobardes de California no podían soportar la idea de &lt;span style="font-style: italic;"&gt;duplicar&lt;/span&gt; la cantidad de espacio almacenado para guardar textos. De todos modos habían muchos documentos antiguos por ahí almacenados en ANSI y DBCS. Y que iban a hacer, convertirlos todos? Ellos? Solo por esta razón hubo mucha gente que decidió hacer caso omiso a Unicode durante varios años, y por tanto la cosa empeoró.&lt;br /&gt;&lt;br /&gt;Así, se inventó el concepto brillante de UTF-8. UTF-8 fue otro sistema para guardar "code points" en Unicode, pero solo usando 8 bits de memoria. En UTF-8, cada "code point" de 0 a 127 solo se guarda en &lt;span style="font-style: italic;"&gt;un solo byte&lt;/span&gt;". Solo los "code points" de 128 para arriba se guardan en 2, 3, 4, 5 o 6 bytes.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-WtjKwm-G9Fs/TY9DxqqUYbI/AAAAAAAAAQw/iZItpKjk874/s1600/utf8.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 63px;" src="http://4.bp.blogspot.com/-WtjKwm-G9Fs/TY9DxqqUYbI/AAAAAAAAAQw/iZItpKjk874/s400/utf8.png" alt="" id="BLOGGER_PHOTO_ID_5588760183134511538" border="0" /&gt;&lt;/a&gt;Esto también tuvo un "efecto secundario" muy bueno en los textos escritos inglés. El texto era &lt;span style="font-weight: bold;"&gt;exactamente igual en UTF-8, que en ASCII&lt;/span&gt;, así que los americanos no verían nada extraño. Solo el resto del mundo debía pasar por el aro. Específicamente "Hello", que es: U+0048 U+0065 U+006C U+006C U+006F, se guardaría como: 48 65 6C 6C 6F!! Exactamente igual como se guardaría en ASCII y ANSI, y en todos los grupos de caracteres OEM del planeta! Ahora bien, si eres tan valiente como para utilizar letras acentuadas, o letras griegas o letras Klingon, tendrás que utilizar varios bytes para almacenar un "code point" único, pero los estadounidenses nunca se darán cuenta de eso.&lt;br /&gt;&lt;br /&gt;Hasta ahora te he dicho tres formas de codificación Unicode. Los métodos tradicionales guardalo-en-dos-bytes son llamados UCS-2 ( por que tiene 2 bytes ) o UTF-16 ( porque tiene 16 bytes ), y uno todavía tiene que averiguar si se trata de UCS-2 big-endian o UCS-2 low-endian. Y también tenemos el nuevo y popular estándar UTF-8 que tiene la agradable propiedad de funcionar perfectamente bien con el texto en ingles ( tanto ASCII como ANSI ) y con programas que no tienen ni idea de que existan otras cosas que no sean ASCII.&lt;br /&gt;&lt;br /&gt;Hoy en día hay un montón de otras formas de codificar Unicode. Hay algo llamado UTF-7, que se parece mucho a UTF-8 pero que garantiza que el mayor bit va a ser siempre cero. Si tienes, por ejemplo, algún tipo de servidor de correo nazi, que cree que 7 bits son "suficientes, gracias", todavía puedes salir ileso y enviar tus e-mails codificándolos con UTF-7. También hay UCS-4, que guarda cada "code point" en 4 bytes, y tiene la bonita propiedad de que cada "code point" puede ser guardado en el mismo número de bytes, pero, caramba! Incluso la gente de Texas no sería tan osada como para gastar tanta memoria.&lt;br /&gt;&lt;br /&gt;De hecho, ahora que estás pensando en la idea platónica que representan los "code points" en Unicode, te puedes dar cuenta que estos "code points" se pueden encodear en cualquier encoding de la "vieja escuela". Por ejemplo, podrías encodear "Hello" ( U+0048 U+0065 U+006C U+006C U+006F ) en ASCII, o el OEM de Grecia, o en la codificación ASCII del Hebreo, o con cualquier codificación anteriormente inventada. Solo con una pega: dejarás de ver algunas letras! Si no existe ningún equivalente para el "code point" de Unicode en el encoding en el que lo estas intentando transformar, normalmente vas a ver el símbolo de pregunta, "?", o quizás puedes llegar a ver el símbolo �. Te suena?&lt;br /&gt;&lt;br /&gt;Hay cientos de encodings tradicionales, que solo pueden almacenar ALGUNOS de los "code points" de Unicode. Los "code points" que no tienen una representación en el encoding viejo, se cambian por símbolos de interrogación. Algunos encodings populares en inglés son: Windows-1252 ( el estándar  Europeo para Windows 9x ), y el ISO 8859-1 ( también llamado Latin-1 ), también usado por los idiomas del oeste Europeo. Pero intenta almacenar Ruso, o Hebreo en estos encodings, y solo vas a ver un montón de símbolos de interrogación. UTF 7, 8, 16 y 32 tienen la propiedad de poder almacenar &lt;span style="font-style: italic;"&gt;cualquier&lt;/span&gt; "code point" de manera correcta.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;La cosa mas importante sobre los encodings&lt;/span&gt;&lt;br /&gt;==========================================&lt;br /&gt;Si has olvidado todo lo que te acabo de explicar, por favor aprende una cosa muy importante. &lt;span style="font-weight: bold;"&gt;No tiene ningún sentido tener una cadena de texto sin saber que encoding usa&lt;/span&gt;. Ya no puedes seguir pensando que "texto claro" es ASCII.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt; El texto claro (plain text) no existe.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Si tu tienes un texto, en memoria, o en un fichero, o en un e-mail DEBES saber en que encoding ha sido guardado, o no serás capaz de mostrar los caracteres correctamente.&lt;br /&gt;&lt;br /&gt;Casi todos los problemas estúpidos "mi web parece un galimatías" o "mi amiga no puede leer mi correo electrónico cuando lleva acentos", se reducen a que un programador ingenuo que no comprendía el simple hecho de que si no me dices como has codificado el texto, ya sea en UTF-8, o ASCII, o ISO-8859-1 o Windows 1252 yo SIMPLEMENTE no puedo mostrar correctamente el texto ( ni saber donde el texto termina )!&lt;br /&gt;&lt;br /&gt;¿Dónde podemos preservar la información sobre qué codificación usa el texto que mandamos? Bueno, hay maneras estándar para hacer esto. Por ejemplo, para un correo electrónico, uno espera encontrar en la cabecera un string que ponga:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;Content-Type: text/plain; charset="UTF-8"&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Para una página web, la idea original era que el servidor web devolviese una cabecera (HTTP) con el Content-Type, ( y no en el HTML ).  De manera que uno ya sepa la codificación de la página &lt;span style="font-style: italic;"&gt;antes&lt;/span&gt; de recibir el HTML.&lt;br /&gt;&lt;br /&gt;Esto da problemas. Imagina que tienes un gran servidor web con muchos sitios, y con cientos de páginas con contribuciones de gente de todo el mundo, en diferentes idiomas. Y que todas utilizan la codificación que quiera que use el Microsfot FrontPage. El servidor web no nunca sabrá &lt;span style="font-style: italic;"&gt;realmente&lt;/span&gt; qué encoding tiene cada archivo, por lo que no podrá mandar una cabecera con el Content-Type.&lt;br /&gt;&lt;br /&gt;Sería conveniente que pudieses poner un Content-Type en el HTML donde va el fichero mismo, utilizando algún tipo de tag especial. Por supuesto esto llevó a la locura a los puristas... "¿Cómo se puede leer un fichero HTML hasta que no sepas que codificación lleva?!" Por suerte, casi cada encoding común usa los mismos caracteres entre 32 y 127, entonces siempre podemos empezar a leer HTML sin ver caracteres estaños:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&amp;gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Por lo que el meta tag tiene que estar estar justo después de declarar la sección &lt;span style="font-style: italic;"&gt;head&lt;/span&gt; ya que, tan pronto como el navegador web vea este tag, va a parar de interpretar la página y volverá a empezar reinterpretando toda la página con el encoding que has especificado.&lt;br /&gt;&lt;br /&gt;¿Que hacen los navegadores si no encuentran ningún Content-Type y ningún tag en el &lt;span style="font-style: italic;"&gt;header&lt;/span&gt; HTML? Internet Exploiter hace algo bastante interesante: intenta adivinar, basado en la frecuencia en la que aparecen algunos bytes en los típicos encodings en diferentes idiomas. Ya que varios encodings de 8 bits intentaban poner sus letras de su idioma nativo entre el rango entre 128 y 255, y ya que todos los idiomas tienen diferentes características de frecuencia en el uso de determinadas letras en texto escrito, se podía adivinar mas o menos el encoding en el que ha sido escrito el texto. Es bastante raro, pero parece funcionar bastante bien para las páginas programadas por ingenuos programadores que necesitarían echarle un vistazo a lo que es el Content-Type de su página web. ¿ Que pasa? Que si no se ajusta bien el encoding ( la detección falla ), y si Internet Exploiter decide que el idioma es coreano, pues el usuario que ha cargado la página no puede entender nada. Esto prueba, creo, la Ley de Postel sobre: "conservador en lo que dices y liberal en lo que aceptas" no es un principio bueno para un trabajo de ingeniería. De todos modos, ¿Qué hace el pobre lector que entra en una página escrita en búlgaro y la ve en coreano? Va al menú View&amp;gt;Encoding y prueba diferentes codificaciones (hay varias docenas de codificaciones en el Este de Europa ), hasta que ve bien el texto. Esto si sabe que puede hacerlo, claro, y mucha gente ni lo sabe.&lt;br /&gt;&lt;br /&gt;Para la última versión de CityDesk un sitio de administración web publicado por mi compañía, decidimos internamente utilizar Unicode UCS-2 (dos bytes), que es el tipo nativo de Visual Basic, COM y Windows NT/2000/XP para los tipos de datos string. En C++, declarábamos los strings como &lt;span style="font-style: italic;"&gt;wchar_t&lt;/span&gt;, en vez de &lt;span style="font-style: italic;"&gt;char&lt;/span&gt;, y usábamos la función &lt;span style="font-style: italic;"&gt;wcs&lt;/span&gt; en vez de &lt;span style="font-style: italic;"&gt;str&lt;/span&gt;. Para crear un literal UCS-2 en C, simplemente poníamos un L antes, así quedaba algo como: L"Hello".&lt;br /&gt;&lt;br /&gt;Cuando CityDesk publicó su página, se convirtió todo en UTF-8, que siempre ha sido una codificación muy bien soportada por todos los navegadores. Aquí tenemos el muro de las 29 versiones en las que está ecodeada la página de "Joel on Software", y yo nunca he escuchado a ninguna persona que haya tenido algún problema al visitar mi página.&lt;br /&gt;&lt;br /&gt;Este artículo se está haciendo demasiado largo, y me es imposible explicar todo lo relacionado con la codificación de caracteres en Unicode, pero creo que si has leído hasta aquí, has aprendido suficiente como para volver a programar, y usar antibióticos, en vez de sanguijuelas y hechizos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/-C7YUHF9NTMg/TY9EL6kvLMI/AAAAAAAAAQ4/ZmOKhQ0bLto/s1600/i-love-unicode.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 180px; height: 45px;" src="http://4.bp.blogspot.com/-C7YUHF9NTMg/TY9EL6kvLMI/AAAAAAAAAQ4/ZmOKhQ0bLto/s400/i-love-unicode.png" alt="" id="BLOGGER_PHOTO_ID_5588760634082667714" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;[1]: Teniendo en cuenta que mi nivel de inglés es bastante.... humilde. Aún así he hecho un gran esfuerzo para traducir del mejor modo que he podido el artículo. Se aceptan correcciones.&lt;br /&gt;&lt;br /&gt;Nota: Se ha usado “cadena de texto” como sinónimo de “string”.&lt;br /&gt;Nota2: Se ha cambiado intencionadamente “Internet Explorer(tm)(r)” por “Internet Exploiter”. Seguramente el autor no estaría de acuerdo con esto. Es un chiste fácil.&lt;br /&gt;Nota 3: Si te ha gustado el artículo y eres un blogger, agradecería que creases un post mencionando el al artículo original ( o hacia esta traducción, o ambos ). Un mundo con mejor comprensión sobre el Unicode, es un mundo mejor. Gracias. ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6671913855625335983-4879840399311526108?l=inedit00.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://inedit00.blogspot.com/2011/03/el-minimo-absoluto-que-todos-los.html</link><author>noreply@blogger.com (inedit00)</author><media:thumbnail url="http://4.bp.blogspot.com/-C7YUHF9NTMg/TY9EL6kvLMI/AAAAAAAAAQ4/ZmOKhQ0bLto/s72-c/i-love-unicode.png" height="72" width="72" /><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6671913855625335983.post-8988601379112697302</guid><pubDate>Sun, 25 Jul 2010 17:00:00 +0000</pubDate><atom:updated>2010-07-25T19:27:43.674+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">out of topic</category><title>Mi dia a dia... o.... dentro de poco vuelvo.... o ... hecho en falta publicar un post...</title><description>Hace ya bastante que no digo nada. La verdad que me gustaría retomar el blog y seguir posteando cosas, a mi parecer, interesantes. Tengo que decir que estoy muy muy liado, ahora mismo. Tengo muchas cosas en marcha y una lista demasiada larga de "thinks to do".&lt;br /&gt;&lt;br /&gt;Todavía me esperaré un poquito a volver a retomar el blog, al menos hasta que las cosas se calmen un poco y tenga mas cosas para publicar. Pero para ir haciendo boca os cuento en que ando metido:&lt;br /&gt;&lt;br /&gt;Me compré un juguetito: un minibarebone. Es una chulada. Pequeño, silencioso, y de prestaciones moderadas. Cuando tenga tiempo ya os lo presentaré. El caso es que le he instalado un debian y lo tengo como servidor expuesto a internet. Es una gozada. Estoy instalando los servicios más basicos ( ssh, vsftpd, bind9, postfix y dovecot, apache + ssl ) y simulo que se trata de un servidor real que está a producción y que tiene bastantes accesos, osea que no me permito el hecho de reiniciar la máquina a menos que tenga que tocar algo de hardware, o cosas así. Una disfrute, vaya.&lt;br /&gt;&lt;br /&gt;Por otra parte, al tener un servidor web propio, tengo que poner algo detrás, aparte de la página estática de saludo, y he pensado en varias cosas. Todas ellas para uso personal, pero van a ser públicas para quien quiera verlo.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;La primera y como ejercicio puramente académico, un &lt;span style="font-weight: bold;"&gt;acortador de urls&lt;/span&gt;. Lo estoy haciendo usando pylons y mongo por detrás. De esto haré un pequeño manualillo para quien quiera iniciarse en esto de los sistemas model-view-controller y las bases de datos no relacionales.&lt;/li&gt;&lt;li&gt;El segundo, y para satisfacer una necesidad personal, estoy haciendo una web ( en pylons también ) que sirve para&lt;span style="font-weight: bold;"&gt; guardar tus ficheros de configuración&lt;/span&gt; de tu PC ( .vimrc, .bashrc, etc..) de modo que tu puedas administrar tus ficheros de configuración, y descargarlos en donde quieras que estés o simplemente para tener un backup. Este proyectito todavía se está gestando, pero cuando tenga algo os lo enseño, lo prometo. Tengo idea de publicarlo bajo una licencia libre, por si alguien quiere usarlo también en su servidor=)&lt;/li&gt;&lt;li&gt;Y la novedad, en lo que todavía no me he puesto pero no estaré mucho es con los &lt;span style="font-weight: bold;"&gt;Arduinos&lt;/span&gt;. Arduino es una plataforma de hardware libre, donde se puede programar microcontroladores para que hagan determinadas tareas. Desde robots que siguen líneas, apagado y encendido de luces en función de la luz exterior, controles para peceras, o hasta helicópteros a radio control. Una pasada. Todo es software libre y hay una comunidad enorme detrás. Están por llegar, y dentro de poco podré empezar a jugar con ellos. Prometo contar cosas también!&lt;/li&gt;&lt;/ul&gt;Bueno, con estas cosas que os he comentado, el curro, otras casillas ( como por ejemplo estudiar mates, para ir preparándome para la carrera ), más estas cosas molestas y tontas que tenemos que hacer los humanos como comer, dormir o tener relaciones sociales, estoy ocupado unas treinta horas al día. Y todavía quedan cosas por hacer! Pero lo disfrutando todo al máximo, todo sea dicho.&lt;br /&gt;&lt;br /&gt;Bueno, siento haber vomitado todo esto, pero la verdad que me apetecía escribir algo en el blog, y como es mío...&lt;br /&gt;&lt;br /&gt;Saludos y, hasta.... pronto?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6671913855625335983-8988601379112697302?l=inedit00.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://inedit00.blogspot.com/2010/07/mi-dia-dia-o-dentro-de-poco-vuelvo-o.html</link><author>noreply@blogger.com (inedit00)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6671913855625335983.post-5045104633277493541</guid><pubDate>Sun, 16 May 2010 19:56:00 +0000</pubDate><atom:updated>2010-05-16T22:11:59.363+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">sistemas</category><category domain="http://www.blogger.com/atom/ns#">linux</category><category domain="http://www.blogger.com/atom/ns#">howto</category><title>Virtual Hosts en Apache2, para dummies</title><description>&lt;span style="font-weight: bold;"&gt;[Problema]&lt;/span&gt;&lt;br /&gt;Visitante: "Escucha inEdit00!"&lt;br /&gt;inEdit00: "Si, dime!"&lt;br /&gt;Visitante: "Si, mira, que seguí tu manualillo sobre como poner arriba un servidor Apache y he estado haciendo mis cosillas. Ahora ya se HTML y CSS y he empezado a programar en PHP"&lt;br /&gt;inEdit00: "Muy bien. Y cual es el problema?"&lt;br /&gt;Visitante: "Pues mira, te cuento: ahora tengo dos páginas www.mipaginapersonal.com y www.lawebdemicurro.com, y, así como tu me enseñastes en el otro manual, he creado dos entradas en el fichero '/etc/hosts' así:"&lt;br /&gt;&lt;span style="font-style: italic;"&gt;127.0.0.1 www.lawebdemicurro.com&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;127.0.0.1 www.mipaginapersonal.com&lt;/span&gt;&lt;br /&gt;Visitante: "Pero claro... estas dos URL's, apuntan hacia el directorio principal del servidor ( /var/www ) y puedo cargar un dominio, o el otro, pero no las dos a la vez!!"&lt;br /&gt;inEdit00: "Bien, este problema que tienes se resuelve con lo que se llaman VirtualHosts. Te explico:"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Explicación]&lt;/span&gt;&lt;br /&gt;Cuando tu entras en una página web con tu navegador, haces una petición al servidor por REST ( órdenes del protocolo HTTP ), por ejemplo, si accedes a la URL: "http://localhost/index.html" realmente estás haciendo una petición al servidor tal que así:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;GET /index.html&lt;br /&gt;Host: localhost&lt;/blockquote&gt;&lt;br /&gt;Esto puedes verlo con programas como Wireshark, que se encargan de analizar los paquetes que viajan por la red, a bajo nivel. Bien, que significa esto?&lt;br /&gt;Pues que del host "localhost" quieres el fichero "/index.html", así de simple.&lt;br /&gt;&lt;br /&gt;Si haces una petición a la web "http://www.mipaginapersonal.com", haces una petición que sería así:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;GET /&lt;br /&gt;Host: www.mipaginapersonal.com&lt;/blockquote&gt;&lt;br /&gt;"GET" singnifica "dame", la barra ("/") significa el directorio principal ( que sería lo mismo que "/index.html" ) y el "Host" es la página que quieres cargar. En este caso, si tienes configurado el fichero "/etc/hosts" como tu me has dicho, te debería dar el contenido del fichero de "/var/www/index.html".&lt;br /&gt;&lt;br /&gt;Otro ejemplo: Si vamos a la página web "http://www.lawebdemicurro.com" pasa lo mismo:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;GET /&lt;br /&gt;Host: www.lawebdemicurro.com&lt;/blockquote&gt;&lt;br /&gt;Dame el fichero "/" ( que Apache entiende como "/index.html" ) del Host "www.lawebdemicurro.com", y esto devuelve el fichero de "/var/www/index.html". Que es el mismo de antes!&lt;br /&gt;&lt;br /&gt;Claro, así no puedes conseguir lo que te propones. Ya que los dos nombres de HOST distintos, apuntan al mismo sitio ( "/var/www" ).&lt;br /&gt;&lt;br /&gt;Vale, ahora vamos a crear dos carpetas en el servidor, algo así:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ sudo mkdir /var/www/mipaginapersonal.com&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ sudo mkdir /var/www/lawebdemicurro.com&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Si te fijas, no he puesto las www. Es solo una preferencia personal. Pero son nombres de carpetas, les puedes poner los nombres que quieras. Bien, y ahora lo que haremos será crear un VirtualHost. Que me propongo? Algo así:&lt;br /&gt;Cuando abramos www.mipaginapersonal.com abra la ruta /var/www/mipaginapersonal.com&lt;br /&gt;Cuando abaramos www.laewebdemicurro.com abra la ruta /var/www/lawebdemicurro.com&lt;br /&gt;&lt;br /&gt;inEdit00: "Te parece?"&lt;br /&gt;Visitante: "Si, esto es jutsto lo que yo quiero!! Como se hace?"&lt;br /&gt;inEdit00: "Bien, antes hagamos lo siguiente:"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ sudo gedit /var/www/mipaginapersonal.com&lt;/span&gt;&lt;br /&gt;Y añadimos aqui el siguiente texto "Bienvenido a mi página personal!!!". Guardamos y salimos.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ sudo gedit /var/www/lawebdemicurro.com&lt;/span&gt;&lt;br /&gt;Y añadimos aqui el siguiente texto "Bienvenido a la web de mi curro!!!". Guardamos y salimos.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Virtual Hosts]&lt;/span&gt;&lt;br /&gt;Bien, al lío, a por los virtual Hosts. Vamos a crear el siguiente fichero:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ sudo gedit /etc/apache2/sites-aviable/lawebdemicurro.com&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Y en este fichero añadiremos algo tal que así:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;    ServerName      www.lawebdemicurro.com&lt;br /&gt;    ServerAlias     www.lawebdemicurro.com&lt;br /&gt;    DocumentRoot /var/www/lawebdemicurro.com&lt;br /&gt;&lt;br /&gt;    &amp;lt;Directory /&amp;gt;&lt;br /&gt;        Options FollowSymLinks&lt;br /&gt;        AllowOverride None&lt;br /&gt;    &amp;lt;/Directory&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/VirtualHost&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Visitante: "Vale, que significa cada línea?"&lt;br /&gt;inEdit00: Bueno, con esto "&lt;virtualhost&gt;" decimos que estamos creando un virtual host que "escuchará" cualquier IP de origen "*" y escucha en el puerto 80.&lt;br /&gt;"ServerName" y "ServerAlias" sirven para especificar el nombre del Host. Este debe ser exactamente el que tu quieras. Y el mismo que hayas puesto en el fichero /etc/hosts, ok?&lt;br /&gt;Y aquí viene la importante "DocumentRoot /var/www/lawebdemicurro.com". Te imaginas lo que es, verdad? Aqui le decimos en que carpeta tiene que buscar cuando intren en el nombre de dominio seleccionado. Capito?&lt;br /&gt;Visitante: "Si, ya veo!"&lt;br /&gt;inEdit00: "Lo demás es un tema de permisos y no me he mirado con profundiad y no acabo de entender bien, la verdad. Tu dejalo igual y debería funcionar perfecto".&lt;br /&gt;Visitante: "Bien, voy a probar!"&lt;br /&gt;inEdit00 Piensa que tienes que hacer lo mismo con tu dominio "www.mipaginapersonal.com", eh?"&lt;br /&gt;Visitante: "Haber, pone como sería la configuración..."&lt;br /&gt;inEdit00: "Justo así"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ sudo gedit /etc/apache2/sites-aviable/mipaginapersonal.com&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;    ServerName      www.mipaginapersonal.com&lt;br /&gt;    ServerAlias     www.mipaginapersonal.com&lt;br /&gt;    DocumentRoot /var/www/mipaginapersonal.com&lt;br /&gt;&lt;br /&gt;    &amp;lt;Directory /&amp;gt;&lt;br /&gt;        Options FollowSymLinks&lt;br /&gt;        AllowOverride None&lt;br /&gt;    &amp;lt;/Directory&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/VirtualHost&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Puesta apunto]&lt;/span&gt;&lt;br /&gt;Visitante: "Bien, he reiniciado el apache como me dijistes ( primero con reload y después con restart ) y no funciona!"&lt;br /&gt;inEdit00: "Yaaaa, prisas! Tate un momento, todavía falta algo. Ejecuta lo siguiente:"&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ cd /etc/apache2/sites-aviable&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ sudo a2ensite mipaginapersonal.com&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ sudo a2ensite lawebdemicurro.com&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ sudo service apache2 reload"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Final]&lt;/span&gt;&lt;br /&gt;inEdit00: "Y ya debería funcionar! Ahora si entras en 'www.lawebdemicurro.com' debería salirte el mensaje:&lt;br /&gt;Bienvenido a la web de mi curro!!!&lt;br /&gt;inEdit00: "Y si entras en 'www.mipaginapersonal.com' te debería mostrar:&lt;br /&gt;Bienvenido a mi página personal!!!&lt;br /&gt;&lt;br /&gt;inEdit00: "Bueno, ahora solo hace falta que te copies tus paginas con todos sus directorios dentros de las carpetas correspondientes de '/var/www' y ya está."&lt;br /&gt;Visitante: "Gracias! Es justo lo que quería!"&lt;br /&gt;&lt;br /&gt;inEdit00: "Un último detalle! Es muy importante que tengas una entrada en el fichero /etc/hosts para cada domino, de otro modo, si intentas entrar en: 'http://www.mipaginapersonal.com' y no está en el fichero hosts, no se encontrará, y la irá a buscar por DNS a ver si está en Internet (que no está, y si está no es la tuya seguro), ok?"&lt;br /&gt;inEdit00: Fíjate en esto, Si accedes a :"&lt;br /&gt;http://localhost/index.html  estás pidiendo /var/www&lt;br /&gt;http://www.lawebdemicurro.com/index.html estás pidiendo /var/www/lawebdemicurro.com/index.html&lt;br /&gt;http://index.html/lawebdemicurro/index.html estás pidiendo /var/www/lawebdemicurro.com/index.html&lt;br /&gt;&lt;br /&gt;inEdit00: "Lo entiendes?"&lt;br /&gt;Visitante: "Si, si, claro. Como localhost es el directorio raíz y dentro hay carpetas, yo puedo acceder desde las dos rutas! Pero si quiero acceder desde un ordenador remoto deberé poner la URL completa y no localhost, porque sinó no funcionaría, verdad"&lt;br /&gt;inEdit00: "Exactamente! Ala , hasta la próxima!"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Nota: Recuerta, TÚ eres el visitante, si tienes dudas o necesitas ayuda, no dudes en dejar comentarios!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6671913855625335983-5045104633277493541?l=inedit00.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://inedit00.blogspot.com/2010/05/virtual-hosts-en-apache2-para-dummies.html</link><author>noreply@blogger.com (inedit00)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6671913855625335983.post-1179564589759484916</guid><pubDate>Sun, 16 May 2010 18:35:00 +0000</pubDate><atom:updated>2010-07-25T19:28:43.608+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">sistemas</category><category domain="http://www.blogger.com/atom/ns#">linux</category><category domain="http://www.blogger.com/atom/ns#">howto</category><category domain="http://www.blogger.com/atom/ns#">red</category><title>Instalando Apache2, para dummies [I]</title><description>&lt;span style="font-weight: bold;"&gt;[Disclaimer]&lt;/span&gt;&lt;br /&gt;Hace nade que dije que dejaba el blog, porque no tenía cosas interesantes que contar y falta de tiempo. Dije que escribiría esporádicamente. Pues este fin de semana he tenido algo de tiempo libre y ha salido algo así:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Introducción]&lt;/span&gt;&lt;br /&gt;Esto quiere ser un pequeño manualillo, sobre la instalación Apache. Me gusta empezar con lo básico y después ir subiendo el nivel. (si tengo tiempo)&lt;br /&gt;Bueno, como introducción diremos que Apache es un servidor web que se encarga de servir contenido web, ya sea estático o dinámico. Hay muchos servidores web, pero Apache es uno de los más usados en el mundo, ya sea para webs modestas o para webs con mucho tráfico. Al final el manualillo debes ser capaz de empezar a aprender HTML, PHP, JavaScript o CSS ( o todos a la vez! ).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Instalación]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para empezar tenemos que instalar Apache ( y PHP, ya que estamos ):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ sudo aptitude install apache2 php5 libapache2-mod-php5&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para ver si la instalación ha ido bien abrimos nuestro navegador por defecto y entramos en:&lt;br /&gt;http://localhost&lt;br /&gt;&lt;br /&gt;Debería salir una de mis frases preferidas en informática: "It works"&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Configuración y gestión]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bien, con apache instalado vamos a aprender unas comandas básicas para gestionarlo, antes de ponernos a jugar con el.&lt;br /&gt;Si queremos [apagar/encender/reiniciar] el servicio Apache 2 podemos hacer:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ sudo service apache2 stop&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ sudo service apache2 start&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ sudo service apache2 restart&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cuando iniciamos el servidor apache, éste carga todas las configuraciones a memória, lo que significa que si hacemos un cambio en los ficheros de configuración ( que se encuentran en /etc/apache2 ), los cambios no tendrán efecto hasta el próximo reinicio de Apache. Es importante acordarse de reiniciar el servicio después de cada modificación! Para no tener que hacer un restart ( que realmente hace un "stop" y para luego hacer un "start" ) tenemos el comando siguiente:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ sudo service apache2 reload&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Este nos cargará los nuevos ficheros de configuración a memória si todo ha ido bien.&lt;br /&gt;&lt;br /&gt;Es bastante típico encontrarse con un error tal que así: Editamos el fichero "/etc/apache2/apache2.conf" ( podría ser cualquier otro ) y ponemos una línea nuevo con "ErrorrrLevel debug", que está mal escrito a propósito. Si ahora reiniciamos apache nos da un mensajito, nada amistoso a mi parecer, que reza algo así:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;inedit@wally:/etc/apache2$ sudo service apache2 reload&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Syntax error on line 110 of /etc/apache2/apache2.conf:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Invalid command 'ErrorrLevel', perhaps misspelled or defined by a module not included in the server configuration&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;   ...fail!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bueno, realmente el servicio sigue corriendo con la configuración antigua, no se ha roto nada. Para comprobar si todos los ficheros de configuración són correctos podemos ejecutar el comando:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ apache2ctl configtest&lt;/span&gt;&lt;br /&gt;El error sería exactamente el mismo que hemos visto antes haciendo un "reload":&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;inedit@wally:/etc/apache2$ apache2ctl configtest &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Syntax error on line 110 of /etc/apache2/apache2.conf:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Invalid command 'ErrorrLevel', perhaps misspelled or defined by a module not included in the server configuration&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Es una buena práctica ejecutar este comando para ver si todo se ha configurado correctamente.&lt;br /&gt;&lt;br /&gt;Que pasa si hacemos un "sudo service apache2 restart" en un servidor que está en producción? Osea, en un servidor que puede estar teniendo conexiones en el mismo momento que reiniciamos? Pues facil, que los clientes van a recibir un precioso error en su navegador. Y claro, no queremos que esto ocurra. Para ello usa siempre que puedas (es la manera educada de decir que lo uses SIEMPRE) "reload". Pero aún así hay un comando que nos garantiza que no van a perderse las conexiones activas con el servidor. Este comando es:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ sudo apache2ctl graceful&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Creación de contenido y URL's]&lt;/span&gt;&lt;br /&gt;Visitante: "Si, pero yo he entrado en esta página esperando hacer cosas chulas con Apache, y tu solo me hablas de configuracioneees".&lt;br /&gt;inEdit00: "Ya lo seee, impacienteee! Vamos a hacer un brake:"&lt;br /&gt;&lt;br /&gt;En la carpeta "/var/www" es donde se almacena el contenido de tu página web. Esto significa que si haces un:&lt;br /&gt;http://localhost/index.html  estás accediendo a /var/www/index.html&lt;br /&gt;del mismo modo que si pones:&lt;br /&gt;http://localhost/foo.html  estás accediendo a /var/www/foo.html&lt;br /&gt;o que si pones:&lt;br /&gt;http://127.0.0.1/imagenes/foo.jpg estás accediendo a /var/www/imagenes/foo.jpg&lt;br /&gt;&lt;br /&gt;Pillas la idea? Es evidente que estos ejemplos no van a funcionar si no tienes los ficheros "index.html", "foo.html" o la carpeta "imágenes" con una foto dentro!&lt;br /&gt;&lt;br /&gt;Visitante: "Por que has puesto "localhost" y después '127.0.0.1'?  Me confunde."&lt;br /&gt;inEdit00: "127.0.0.1" designa tu ordenador, esto se llama loopback ( prueba a hacer "ifconfig lo" ). Osea, es una IP que "apunta" al mismo equipo. Todos los equipos tienen esta configuración. Como tu tienes instalado el servidor web de Apache en tu equipo, necesitas conectarte a el. Si tienes Apache instalado en un PC fijo y quieres acceder al servidor desde un portátil de tu misma red puedes hacer algo tal que así: deberás buscar tu dirección IP ( ejecuta "ifconfig" para saber que IP local tienes ) que será algo así: 192.168.1.96 ( por ejemplo ). Entonces desde el portátil tienes que poner en el navegador "http://192.168.1.96" y deberías ver "IT WORKS", o lo que contenga el fichero "/var/www/index.html" . Capito?&lt;br /&gt;&lt;br /&gt;Visitante: "...o sea, que si en mi portátil pongo la IP del PC fijo puedo ver lo que sirve Apache... interesante"&lt;br /&gt;inEdit00: "Claro, siempre que Apache esté funcionando! A partir de ahora se va a ejecutar como demonio ( en segundo plano ) cada vez que inicies el PC fijo"&lt;br /&gt;Visitante: "Ei! Esto no funciona! He hecho un 'http://localhost' en el portátil y no tira!"&lt;br /&gt;inEdit00: "Claro, alma de cántaro. 'localhost' designa el mismo ordenador. Si pones esto en el portátil, él intenta conectarse a si mismo, y como no tienes ningún servidor web instalado, no funciona! Usa la IP del PC fijo, que para esto están"&lt;br /&gt;Visitante: "..ah, si... tiene sentido."&lt;br /&gt;Visitante: "entiendo. Entonces localhost es parecido a '127.0.0.1'?"&lt;br /&gt;inEdit00: "Acertaste! De hecho quiero que veas esto. Ejecuta el siguiente comando:"&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ cat /etc/hosts&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;inedit@wally:~/hola$ cat /etc/hosts&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;127.0.0.1        localhost&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;127.0.0.1       linuxjan.ib&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;127.0.0.1       js.com&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;192.168.1.36    ofelia&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bueno, a ti te deberían salir menos entradas que a mi. Qué es esto? Pues es una relación clave-valor (IP-nombre). A la izquierda se encuentran las IP's y a la derecha los nombres de dominio. Osea, si te fijas tengo asignados diferentes nombres para "127.0.0.1": "localhost, linuxjan.ib, js.com". Lo que significa que si pongo "linuxjan.ib" en mi navegador, se dirige a '127.0.0.1' igual que si pongo 'localhost'. Esto sirve para no tener que recordar IP's, sino nombres de dominio. Puedes ver que el último elemento de la lista es diferente del resto. Lo que yo hago aqui es decirle que la dirección IP "192.168.1.36" se llama "ofelia", para no tener que acordarme de su IP.&lt;br /&gt;&lt;br /&gt;inEdit: "Que te parece?"&lt;br /&gt;Visitante: "osea que si modifico localhost..."&lt;br /&gt;inEdit: "yo no haría esto! Mucho programas usan localhost como referencia a la misma máquina, mejor deja la entrada donde está"&lt;br /&gt;Visitante: "pero puedo añadir elementos a la lista? Como por ejemplo: '127.0.0.1   www.paginapersonaldeprueba.com'  ?"&lt;br /&gt;inEdit: "claro. Pruebalo. Cuando accedas a la URL que hayas elegido, deberías ver lo de 'It works!'"&lt;br /&gt;Visitante: "y también puedo añadir '127.0.0.1 www.google.com'?"&lt;br /&gt;inEdit: 'si pero...&lt;br /&gt;Visitante: "Pues voy a probarlo! Mola. Pero... ostia! El google ha dejado de funcionar!!!!"&lt;br /&gt;inEdit: "... pero si pones un nombre de dominio que ya exista, este se resolverá primero con las entradas de tu fichero "/etc/hosts" y si allí no se encuentra, se intentará resolver por DNS. Puedes arreglarlo quitando la línea del fichero."&lt;br /&gt;Visitante: "No, la dejo! Y ahora voy a putear a mi hermana quitándole el google"&lt;br /&gt;inEdit: ".... ¬¬"&lt;br /&gt;(dos minutos después)&lt;br /&gt;Visitante: "No lo entiendo, a mi no me funciona pero a ella si!"&lt;br /&gt;inEdit: "claro, macho! Porque el fichero /etc/hosts está en tu PC, y no en el suyo. Esto solo son cambios locales, si tu pones una entrada así: '127.0.0.1  srv.com' esto solo funcionará en tu PC. Ok?"&lt;br /&gt;Visitante: "Vale, lo entiendo. Los cambios solo son locales."&lt;br /&gt;inEdit. "Exacto. Sigamos:"&lt;br /&gt;&lt;br /&gt;A partir de ahora ya puedes empezar a crear tus páginas creando ficheros dentro de "/var/www". También puedes ( debes! ) crear carpetas para distinguir las imágenes de las hojas de estilos ( CSS ) del JavaScript! Si haces esto:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ sudo mkdir /var/www/sub-folder&lt;/span&gt;&lt;br /&gt;Y después creas el fichero "index.html" dentro así:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ sudo gedit /var/www/sub-folder/index.html&lt;/span&gt;&lt;br /&gt;Y pones como contenido algo así:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;&gt;&lt;br /&gt;&lt;&gt;&lt;br /&gt;&lt;&gt;Estamos en sub folder!&lt;  /p&gt;&lt;br /&gt;&lt;  /body&gt;&lt;br /&gt;&lt;  /html&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;br /&gt;Nota: he puesto dos espacios antes de cada "tag" para que blogger no lo interprete. Se debe escribir sin doble espaciado.&lt;br /&gt;Para acceder a este contenido puedes hacerlo así ( en tu navegador ):&lt;br /&gt;&lt;span style="font-style: italic;"&gt;http://localhost/sub-folder&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;http://localhost/sub-folder/index.html&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Apache se encarga de cargar el fichero "index.html" ( si existe! ) si como nombre de la ruta se le especifica una carpeta.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Despedida]&lt;/span&gt;&lt;br /&gt;Bueno, y esto es todo por hoy. Ahora puedes buscar por internet cualquier manual sobre:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;HTML: para contenido estático.&lt;/li&gt;&lt;li&gt;CSS: para estilo ( colores, formatos, dimensiones, efectos, etc... )&lt;/li&gt;&lt;li&gt;JavaScript: para validaciones, para hacer peticiones asíncronas al servidor, modificación/creación de objetos del DOM en tiempo real..etc ( muy recomendado usar MooTools )&lt;/li&gt;&lt;li&gt;PHP: lenguaje de programación muy asequible para empezar ( por dificultad ) y muy fácil coger malas costumbres. Las birrias funcionan, aún siendo birrias. Pero bueno, por algo se tiene que empezar.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6671913855625335983-1179564589759484916?l=inedit00.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://inedit00.blogspot.com/2010/05/instalando-apache2-para-dummies-i.html</link><author>noreply@blogger.com (inedit00)</author><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6671913855625335983.post-5442726155341244639</guid><pubDate>Tue, 11 May 2010 18:37:00 +0000</pubDate><atom:updated>2010-05-11T21:01:35.298+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">out of topic</category><title>Me preguntaba...</title><description>...&lt;a href="http://inedit00.blogspot.com/2009/09/mi-primera-vez.html"&gt;hasta cuando duraría la broma&lt;/a&gt;. Muy señores mios: &lt;span style="font-weight: bold;"&gt;todo se acaba&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Empezar con el blog fue algo divertido, compartía lo que iba haciendo y que encontraba que podía ser de interés para otros. Yo he disfrutado mucho haciendo esto. Pero desgraciadamente ya no puedo llevarlo con el ritmo de antes. Ahora estoy currando ( en prácticas ) y aprendiendo un montón. Me encantaría poder compartir mis conocimientos y todo lo que estoy aprendiendo ahora con todos vosotros, pero me temo que no tengo tiempo para dedicarme, y todo va muy deprisa.&lt;br /&gt;&lt;br /&gt;Es por esto que digo oficialmente que el blog queda en estado de hibernación. No es un adiós, es un "&lt;span style="font-weight: bold;"&gt;hasta luego&lt;/span&gt;". No quiere decir que haga un post ocasional, pero seguro que será algo extraordinario. Y volveré! Con mas cosas nuevas para compartir con todos ustedes. Gracias por estar aquí.&lt;br /&gt;&lt;br /&gt;¡¡Saludos!!!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;P.D::&lt;br /&gt;Siempre que un blogger al que seguía ha dicho que no publicaría más, me sabe mal. Pero se entiende que la gente tenga vida también. Yo seguro que no soy muy leído, pero aquí os dejo una lista de los blogs que sigo y que mas me gustan para que me podáis reemplazar y no lloréis tanto mi pérdida ( xD ). Ahí van:&lt;br /&gt;[INFORMÁTICA]&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.kriptopolis.org/"&gt;http://www.kriptopolis.org/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ubuntizandoelplaneta.com/"&gt;http://www.ubuntizandoelplaneta.com/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://phyx.wordpress.com/"&gt;http://phyx.wordpress.com/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://120linux.com/"&gt;http://120linux.com/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gnometips.wordpress.com/"&gt;http://gnometips.wordpress.com/&lt;/a&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class=" on down" style="display: block;" id="formatbar_CreateLink" title="Enlace" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;img src="img/blank.gif" alt="Enlace" class="gl_link" border="0" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.muylinux.com/"&gt;http://www.muylinux.com/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.linuxzone.es/"&gt;http://www.linuxzone.es/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.tribulinux.com/"&gt;http://www.tribulinux.com/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gallir.wordpress.com/"&gt;http://gallir.wordpress.com/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.forat.info/"&gt;http://www.forat.info/&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;[TECNOLOGÍA]&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.neoteo.com"&gt;http://www.neoteo.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.genbeta.com/"&gt;http://www.genbeta.com/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mundogeek.net/"&gt;http://mundogeek.net/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://tecnoloxiaxa.blogspot.com/"&gt;http://tecnoloxiaxa.blogspot.com/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;[SISTEMAS]&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://zonasystem.blogspot.com/"&gt;http://zonasystem.blogspot.com/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.s21sec.com/"&gt;http://blog.s21sec.com/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.logadmin.net/"&gt;http://www.logadmin.net/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.tail-f.com.ar/"&gt;http://www.tail-f.com.ar/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rm-rf.es/"&gt;http://rm-rf.es/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;[FUN]&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://mundowdg.com/blog/"&gt;http://mundowdg.com/blog/&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.tiraecol.net/modules/comic/"&gt;http://www.tiraecol.net/modules/comic/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://geekandpoke.typepad.com/geekandpoke/"&gt;http://geekandpoke.typepad.com/geekandpoke/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rufadas.com/"&gt;http://rufadas.com/&lt;/a&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class=" on down" style="display: block;" id="formatbar_CreateLink" title="Enlace" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;img src="img/blank.gif" alt="Enlace" class="gl_link" border="0" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class=" on down" style="display: block;" id="formatbar_CreateLink" title="Enlace" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;a href="http://www.dosisdiarias.com/"&gt;http://www.dosisdiarias.com/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class=" on down" style="display: block;" id="formatbar_CreateLink" title="Enlace" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;a href="http://www.estonoeh.es/"&gt;http://www.estonoeh.es/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class=" on down" style="display: block;" id="formatbar_CreateLink" title="Enlace" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;a href="http://www.dosisdiarias.com/"&gt;http://www.dosisdiarias.com/&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class=" on down" style="display: block;" id="formatbar_CreateLink" title="Enlace" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;img src="img/blank.gif" alt="Enlace" class="gl_link" border="0" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.ubuntizandoelplaneta.com/"&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class=" on down" style="display: block;" id="formatbar_CreateLink" title="Enlace" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;img src="img/blank.gif" alt="Enlace" class="gl_link" border="0" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class="on" style="display: block;" id="formatbar_CreateLink" title="Enlace" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;img src="img/blank.gif" alt="Enlace" class="gl_link" border="0" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6671913855625335983-5442726155341244639?l=inedit00.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://inedit00.blogspot.com/2010/05/me-preguntaba.html</link><author>noreply@blogger.com (inedit00)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6671913855625335983.post-2992318989952069182</guid><pubDate>Sat, 01 May 2010 23:27:00 +0000</pubDate><atom:updated>2010-05-02T01:34:29.315+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">out of topic</category><title>Androide Libre, sorteo de Nexus One</title><description>Muy señores mios, hoy he visto que sortean en &lt;a href="www.elandroidelibre.com"&gt;www.elandroidelibre.com&lt;/a&gt; un Nexus One, ni mas ni menos!&lt;br /&gt;&lt;br /&gt;La verdad sea dicha, normalmente no participo en estos sorteos, pero la verdad que un Nexus One es un buen filón. Lo mejor de todo? Que tiene Android. En el trabajo hemos estado jugando con Android y la verdad que se puede hacer de todo! Ya viene con Python instalado por defecto con todas sus librerías preparadas para ser usadas. También incluye la típica consola,  lo que convierte al SO en un buen candidado para administrar un sistema de manera remota, en caso de urgencia ( ver los, reiniciar servicios, etc... ).&lt;br /&gt;Aparte de todos los sensores, como el acelerometro, que supongo que dan mucho juego cuando programas aplicaciones visuales.&lt;br /&gt;&lt;br /&gt;Bueno, que si me toca un Nexus One ya haré un par de posts sobre como es el sistema y que tal se puede programar en el.&lt;br /&gt;Saludos!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6671913855625335983-2992318989952069182?l=inedit00.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://inedit00.blogspot.com/2010/05/androide-libre-sorteo-de-nexus-one.html</link><author>noreply@blogger.com (inedit00)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6671913855625335983.post-676527101201175630</guid><pubDate>Sun, 25 Apr 2010 08:53:00 +0000</pubDate><atom:updated>2010-04-25T11:43:06.965+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">vim</category><category domain="http://www.blogger.com/atom/ns#">linux</category><category domain="http://www.blogger.com/atom/ns#">atajos</category><title>Dandole caña a VIM</title><description>Venga va, una de VIM. Como todo el mundo conocerá, VIM es uno de los grades editores de texto modo consola que existen. En todas las máquina UNIX viene instalado VI por defecto, que es su versión little ( de hecho VIM es la versión ampliada ). Bien, hay un montón de manuales sobre VIM en internet, muchísimos. Pero una buena herramienta para aprender a usar el vim es el vimtutor. Es un comando que ejecutas en la consola y se te va a abrir un manual/tutorial para que vayas siguiendo. Muy útil.&lt;br /&gt;Instalar el VIM:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;$ sudo aptitude install vim&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bien, este post es una recopilación de comandos que uso en Normal mode, que me ayudan a trabajar mucho mas rápido. Es de nivel medio-avanzado. Si nunca has usado VIM, ejecuta "vimtutor" en un terminal y peléate con el durante un par de días, mejor.&lt;br /&gt;&lt;br /&gt;Para empezar vamos a ver los típicos de borrar:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;dd&lt;/span&gt; =  Borra la línea actual&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;d&lt;fin&gt;&lt;/span&gt; = Borra desde donde estás hasta el fin de la línea&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;d3&lt;flecha&gt;&lt;/span&gt; Borra la línea actual más las tres líneas inferiores a la actual&lt;br /&gt;&lt;br /&gt;Estos mismos comandos se pueden hacer con solo copia, y no borrado:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;yy&lt;/span&gt; = Copia la línea actual.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Y&lt;/span&gt; = Lo mismo que "yy"&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;y&lt;fin&gt;&lt;/span&gt; = Copia hasta el final&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;y3&lt;flecha&gt;&lt;/span&gt; = Copia la línea actual más las tres de arriba.&lt;br /&gt;&lt;br /&gt;Pero para hacer el copiado de una manera mas humana tenemos el modo VISUAL. Este se activa pulsando la tecla "v". Con el modo VISUAL activado podemos, desde nuestra posición actual, mover las flechas de dirección y ir seleccionando un texto deseado. Veamos un ejemplo:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;v&lt;fin&gt;&lt;flecha&gt;&lt;flecha&gt;&lt;flecha&gt;y&lt;/span&gt; = Esto nos pone vim en modo VISUAL, seleccionamos hasta el final de la línea y vamos marcando las tres líneas de abajo para ser copiadas. Finalizamos con "y" para copiar. Si pulsásemos "d" en vez de "y", borraríamos el texto seleccionado.&lt;br /&gt;Y si queremos copiar todo un párrafo? Pues muy simple. Para movernos al inicio del párrafo, en normal mode ( Pulsar Esc ) pulsamos "{". De este modo estaremos situados al inicio del párrafo. Ahora, para seleccionarlo debemos ponernos en modo visual y pulsar la tecla "}". Y el comando "y". Quedaría algo como lo siguiente:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;{v}y&lt;/span&gt;&lt;br /&gt;Esto se puede simplificar y ahorrarnos ponernos en modo visual,  haciendo uso de "y" primero. Seria algo así:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;{y}&lt;/span&gt; = Nos situamos al inicio del párrafo, le damos a copiar y le decimos hasta donde. Con "}" estamos diciendo que queremos copiar hasta el final de párrafo actual. La misma manera de hacer una cosa, pero de dos modos distintos.&lt;br /&gt;&lt;br /&gt;Si queremos copiar desde un sitio, digamos A, hasta un sitio B, tenemos un par de comandos muy buenos.&lt;br /&gt;Para empezar nos situamos en A, y lo "marcamos" con el siguiente comando:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ma&lt;/span&gt;&lt;br /&gt;ahora, para nos movemos hasta B y pulsamos, para copiar o para borrar los comandos:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;d'a&lt;/span&gt; = borrar&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;y'a&lt;/span&gt; = copiar&lt;br /&gt;Osea, marcamos el inicio y después borramos o copiamos desde el final.&lt;br /&gt;&lt;br /&gt;Otra cosa que puede parecer una tontería pero que va bastante bien es lo siguiente. En Normal mode pulsar&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;:10&lt;/span&gt; = Esto nos mueve la línea número 10&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;:+15&lt;/span&gt; = Esto nos mueve 15 lineas adelante de la línea actual.&lt;br /&gt;&lt;br /&gt;Mas comandos interesantes. Para moverte por un texto, si el cursor se encuentra en la parte de arriba y tu quieres bajar tiene que "recorrerte" toda la pantalla ya visible con el cursor para "empujar" la pantalla por la parte de abajo, esto se soluciona con los siguientes comandos:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Control + e&lt;/span&gt; =  Para bajar&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Control + y &lt;/span&gt;= Para subir&lt;br /&gt;&lt;br /&gt;Y ahora los mas simples, pero que se usan mucho.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;o&lt;/span&gt;: inserta una línea nueva justo por debajo de la línea actual&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;O&lt;/span&gt;: inserta una línea nueva justo por encima de la línea actual&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;p&lt;/span&gt;: pega justo por debajo de la línea actual&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;P&lt;/span&gt;: pega por encima de la línea actual&lt;br /&gt;&lt;br /&gt;Para salir y guardar del documento actual se tiene que pulsar ":wq". Un modo mas simple para hacer esto mismo es pulsando ZZ. Hace lo mismo. Para guardar, cada vez tenemos que pulsar:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;:w&lt;/span&gt;&lt;br /&gt;para ahorrarnos esto, podemos hacer uso del comando nmap:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;:nmap ññ :w&lt;enter&gt;&lt;/span&gt;&lt;br /&gt;"&lt;enter&gt;" se tiene que escribir también. Ahora, cuando pulsemos ññ en el teclado, se va a ejecutar el comando ":w". Bonito, verdad? Si queremos hacer que esta opción esté siempre disponible al inicio del vim, tenemos que ediar el fichero ~/.vimrc y añadir la linea mencionada anteriormente.&lt;br /&gt;&lt;br /&gt;Me tomo la libertad de darte un consejo: No intentes memorizar un comando. Apúntate en un papelito un par de comandos que encuentres útiles y tenlo cerca de modo que cuando quieras usarlo sepas que lo tienes ahí. En una semana te sabrás todos los comandos que te resultan más útiles de memoria, los otros seguramente no merezca la pena aprendérselos, ya que los usas mucho menos. Y cada semana, busca algún comando nuevo. Y practica mucho, mucho!&lt;br /&gt;&lt;br /&gt;Y ahora te pregunto: cuales son tus atajos/trucos que usas? Deja tu comentario. Saludos!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6671913855625335983-676527101201175630?l=inedit00.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://inedit00.blogspot.com/2010/04/dandole-cana-vim.html</link><author>noreply@blogger.com (inedit00)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6671913855625335983.post-8191883577213751447</guid><pubDate>Sat, 17 Apr 2010 20:35:00 +0000</pubDate><atom:updated>2010-04-17T23:03:33.185+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><category domain="http://www.blogger.com/atom/ns#">openbox</category><title>OpenBox: Gestor de ventanas rápido y ligero</title><description>Bueno, hoy os quiero hablar un poquito de algo que estoy probando. Un nuevo gestor de ventanas: Open Box. Ya sabéis lo que es un gestor de ventanas: los típicos ejemplos pueden ser GNOME y KDE.&lt;br /&gt;&lt;br /&gt;Por que cambiar a algo nuevo y diferente? Bueno, el cambio es bueno. En el curro hay un compañero que lo usa y me ha picado la curiosidad. Aviso: no es algo que te instales y esté todo funcionando y perfecto. No. Se tiene que personalizar de modo que tu crees una interface entre el PC y tu de modo que te sientas cómodo para trabajar. Pero se puede personalizar hasta limites insospechados. Por ejemplo, puedes configurar hasta que cuando hagas una combinación de teclas determinada ( keybindings ) te abra tus 4 programas preferidos ( firefox, thunderbird, rythmbox y givm ) en un escritorio virtual determinado, con una resolución que tu especifiques y una disposición a tu gusto.&lt;br /&gt;&lt;br /&gt;El estilo es muy austero, se deja de cosas visuales bonitas, pero por otra parte es muy muy rápido. Se nota mucho el cambio de GNOME a OpenBox, desde luego. El cambio de escritorio o cambiar de aplicación mediante Alt+Tab van volados. Al ser altamente personalizable, puedes ir puliendo tu escritorio de modo que cada vez te mueves más rápido en el.&lt;br /&gt;&lt;br /&gt;Bueno, cuando instalas OpenBox, de buenas a primeras, lo único que tienes es un fondo de pantalla. Nada mas. Ni un menú, ni icono, ni barras, ni nada. Tu puntero de ratón y un fondo de pantalla. Punto. La única acción obvia que acabas probando es haciendo clic en algún espacio vació de la pantalla ( literalmente: le puedes dar en cualquier sitio ) con el botón derecho y ahí si sale un menú con un par de opciones. La verdad que a la gente que le guste experimentar ( y que tenga tiempo libre para dedicarle ) le recomiendo que lo pruebe. Que le de una oportunidad. La instalación es extremadamente simple y lo mejor es que uno no tiene que desinstalar GNOME o KDE, sino que puedes elegir el gestor de ventanas que quieres utilizar cuando haces login en tu sistema. Que te cansas o que no sabes hacer alguna cosa con OpenBox? Sales de la sesión y cargas tu gestor de ventanas habitual. Así de fácil.&lt;br /&gt;&lt;br /&gt;Bueno, les voy a recomendar que si quieren probar OpenBox y no frustrarse al principio, le hechen una leída al siguiente manual, que es muy muy bueno ( y en inglés ):&lt;br /&gt;&lt;a href="http://urukrama.wordpress.com/openbox-guide"&gt;&lt;/a&gt;&lt;blockquote&gt;&lt;a href="http://urukrama.wordpress.com/openbox-guide"&gt;Urukrama OpenBox Guide&lt;/a&gt;&lt;/blockquote&gt;&lt;br /&gt;Para configurar OpenBox lo único que se tiene que hacer es modificar ficheros .XML de un modo muy simple y claro. También hay algunas aplicaciones con GUI que se encargan de reducir las modificaciones de ficheros de texto, aunque la verdadera potencia de todo esto es que tu puedes modificar y adaptar los ficheros XML a tu gusto.&lt;br /&gt;&lt;br /&gt;Links de interés:&lt;br /&gt;[1]: &lt;a href="http://wiki.debian.org/Openbox"&gt;Debian OpenBox&lt;/a&gt;&lt;br /&gt;[2]: &lt;a href="http://urukrama.wordpress.com/2008/07/22/my-openbox-keybindings/"&gt;Urukrama OpenBox Keybindings&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6671913855625335983-8191883577213751447?l=inedit00.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://inedit00.blogspot.com/2010/04/openbox-gestor-de-ventanas-rapido-y.html</link><author>noreply@blogger.com (inedit00)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6671913855625335983.post-3835697889556676162</guid><pubDate>Sun, 11 Apr 2010 19:43:00 +0000</pubDate><atom:updated>2010-04-11T21:55:35.734+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">out of topic</category><category domain="http://www.blogger.com/atom/ns#">seguridad</category><category domain="http://www.blogger.com/atom/ns#">general</category><title>Thunderbird - HOWTO configurar mal tu contraseña maestra</title><description>Pues hoy me he quedado bastante sorprendido, la verdad.&lt;br /&gt;He instalado la versión 3.0 de Thunderbird y cuando la he ejecutado, me ha pedido mi contraseña maestra. Ni idea. Típico de mi. Pruebo un par y no va. Bueno, no importa. Las restablezco y no ha pasado nada.&lt;br /&gt;Google. Buscar "reestablecer thunderbird contraseña maestra". De los primeros resultados encuentro lo que busco:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-weight: bold;"&gt;openDialog("chrome://pippki/content/resetpassword.xul")&lt;/span&gt;&lt;/blockquote&gt;Abro el Thunderbird 2.0, para borrar la clave maestra. Herramientras&gt;Consola de errores y donde hay un espacio en blanco, pego la orden que hay justo aquí arriba. "Desea restablecer blablala...?". Si.&lt;br /&gt;&lt;br /&gt;Y nada, que se ha quitado la contraseña maestra. Peeero, lo que no se han borrado han sido mis contraseñas de los diferentes correos :S. Le doy a "ver contraseñas" y, si, si, son las mías.&lt;br /&gt;Pues se trataba de un mala configuración, claro. El error en cuestión es el siguiente:&lt;br /&gt;En Editar&gt;Preferencias&gt;Privacidad&gt;Contraseñas la opción "Usar una contraseña maestra para cifrar las contraseñas guardadas" tiene que estar marcada. Si no tus claves están desprotegidas.&lt;br /&gt;Al realizar el mismo ejercicio con esta opción marcada, al borrar la clave maestra también se borran las password que protege. Realmente no se para que puede servir poner una contraseña maestra si no protege tus contraseñas, y con una sola orden se pueden conseguir. Bueno señores, revisen sus configuraciones y saludos!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6671913855625335983-3835697889556676162?l=inedit00.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://inedit00.blogspot.com/2010/04/thunderbird-howto-configurar-mal-tu.html</link><author>noreply@blogger.com (inedit00)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6671913855625335983.post-2529216006283766045</guid><pubDate>Fri, 09 Apr 2010 11:34:00 +0000</pubDate><atom:updated>2010-04-09T14:47:38.120+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">linux</category><category domain="http://www.blogger.com/atom/ns#">howto</category><category domain="http://www.blogger.com/atom/ns#">programacion</category><category domain="http://www.blogger.com/atom/ns#">cuda</category><title>CUDA [II]  Instalación de toolkit y  SDK para CUDA</title><description>Buenooo. Ahora nos &lt;a href="http://inedit00.blogspot.com/2010/04/cuda-i-introduccion-sobre-tarjetas.html"&gt;dejamos ya de palabras&lt;/a&gt; y empezamos haciendo algo interesante. Pero antes quiero hacer un par de notitas:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Vamos a instalar drivers nuevos. Lo más fácil es que los drivers nuevos no funcionarán a la primera o vete a saber tu qué. Entiendase que se puede liar la cosa.&lt;/li&gt;&lt;li&gt;Hay gente que ha conseguido instalar todo el SDK y todo en Ubuntu 9.10. Yo no puede/supe. Lo he probado en Ubuntu 9.04 y ha funcionado perfectamente. El soporte de nVidia llega hasta 9.04.&lt;/li&gt;&lt;li&gt;AVISO. El material que voy a poner aqui, en su mayoría van a ser cópido de otras páginas. Como podeis imaginar hay mucha gente que ha hablado hasta ahora del proceso de instalación, lo que la información está un poco "separada". Yo os pondré lo que me ha funcionado a mi, a modo de recopilación/traducción. No dejen de visitar las fuentes originales.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Comprueben que sus tarjetas sean &lt;a href="http://www.nvidia.com/object/cuda_gpus.html"&gt;compatibles&lt;/a&gt; con CUDA.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Dados estos avisos, empezemos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[INSTALANDO 9.04]&lt;/span&gt;&lt;br /&gt;Tuve muchos problemas en Ubuntu 9.10. Como nVidia da soporte a Ubuntu 9.04 me dije, pues instalalo. Y esto hice. He creado una partición en mi disco y he instalado 9.04. Os recomiendo que hagais igual, si os quereis ahorrar problemas. Además, así podeis hacer las pruebas que querais sin miedo a perder datos ni nada. La instalación tiene que ser nativa! No virtualizeis!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[INSTALANDO DRIVERS]&lt;/span&gt;[1]&lt;br /&gt;Una vez tenemos nuestro 9.04 funcionando y operativo, debemos instalar los últimos drivers de nVidia, los 195. Para ello seguiremos estos pasos:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ sudo su&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ echo DRIVERS NVIDIA 195 &gt;&gt; /etc/apt/sources.list&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ echo deb http://ppa.launchpad.net/nvidia-vdpau/ppa/ubuntu jaunty main &gt;&gt; /etc/apt/sources.list&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ echo deb-src http://ppa.launchpad.net/nvidia-vdpau/ppa/ubuntu jaunty main &gt;&gt; /etc/apt/sources.list&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ apt-key adv --keyserver keyserver.ubuntu.com --recv-keys CEC06767&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ aptitude update&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ aptitude install nvidia-195-modaliases nvidia-glx-195&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[DESCARGANDO PAQUETES]&lt;/span&gt;&lt;br /&gt;Tenemos que ir a la pagina web de CUDA, a &lt;a href="http://developer.nvidia.com/object/cuda_3_0_downloads.html"&gt;descargas&lt;/a&gt;. Los paquetes que necesitamos son:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;CUDA Toolkit for Ubuntu Linux 9.04&lt;/li&gt;&lt;li&gt;GPU Computing SDK code samples and more&lt;/li&gt;&lt;/ul&gt;La versión 32bits o 64 bits. Como corresponda. Los descargamos en el escritorio.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[INSTALANDO TOOLKIT]&lt;/span&gt; [2]&lt;br /&gt;Para ello damos permisos de ejecución con el comando:&lt;span style="font-style: italic;"&gt;&lt;br /&gt;$ chmod +x ~/Escritorio/cudatoolkit_3.0_linux_32_ubuntu9.04.run&lt;/span&gt;&lt;br /&gt;Y ahora lo instalaremos. Pero resulta que al instalarlo, si tenemos GDM iniciado, da un error. Para esto utilizaremos una consola tty1. Apunta los pasos ya que cerraremos GDM y te vas a quedar sin gestor de ventanas. Será solo un momento.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Pulsamos Control+Alt+F1&lt;/li&gt;&lt;li&gt;Entramos con un usuarios que tenga privilegios administrativos&lt;/li&gt;&lt;li style="font-style: italic;"&gt;$ sudo service gdm stop&lt;/li&gt;&lt;li style="font-style: italic;"&gt;$ cd /home/nombre_del_usuario/Escritorio&lt;/li&gt;&lt;li style="font-style: italic;"&gt;$ sudo ./cudatoolkit_3.0_linux_32_ubuntu9.04.run&lt;/li&gt;&lt;li style="font-style: italic;"&gt;$ sudo service gdm start&lt;/li&gt;&lt;li&gt;Pulsamos Control+Alt+F7, iniciamos sesion normalmente y seguimos el proceso&lt;/li&gt;&lt;/ul&gt;Ahora tenemos que añadir los directorios de nvidia a PATH. Abrimos un terminal:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;$ sudo vim /etc/bash.bash.rc&lt;/span&gt;      #Si no sabes usar vim, pon "gedit" en lugar de "vim"&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Al final del fichero incluiremos dos líneas:&lt;/li&gt;&lt;/ul&gt;&lt;blockquote&gt;export PATH=${PATH}:/usr/local/cuda/bin&lt;br /&gt;export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda/lib64&lt;/blockquote&gt;&lt;br /&gt;Si tenemos un sistema de 32 bits, cambiamos "lib64" por "lib". Guardamos el fichero y Toolkit instalado.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[INSTALANDO EL SDK]&lt;/span&gt;[2]&lt;br /&gt;Hacemos el fichero ejecutable con:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ chmod +x ~/Escritorio/gpucomputingsdk_3.0_linux.run&lt;/span&gt;&lt;br /&gt;No hace falta que se instale con privilegios de ROOT. Instalar con el usuario que va a usar el SDK.&lt;br /&gt;$ ./&lt;span style="font-style: italic;"&gt;gpucomputingsdk_3.0_linux.run&lt;/span&gt;&lt;br /&gt;Las preguntas que nos hace las contestamos con un "enter". El default ya nos sirve. Una vez instalado entramos en la carpeta del SDK:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ cd ~/NVIDIA_GPU_Computing_SDK/C&lt;/span&gt;&lt;br /&gt;Instalamos dependencias:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ sudo aptitude install freeglut3 freeglut3-dev libx11-dev mesa-common-dev libxmu6&lt;/span&gt; libxi-dev libxmu-dev&lt;br /&gt;Y compilamos los codigos:&lt;br /&gt;$ make&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[EJECUTANDO EJEMPLOS]&lt;/span&gt;[2]&lt;br /&gt;Si todo ha funcionado correctamente, ahora podremos ejecutar los siguientes comandos:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ cd ~/NVIDIA_GPU_Computing_SDK/C/bin/linux/released&lt;/span&gt;&lt;br /&gt;$ ./deviceQuery&lt;br /&gt;$ ./fluidsGL&lt;br /&gt;$ ./smokeParticles&lt;br /&gt;$ ./particles&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[POSIBLES PROBLEMAS]&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;El compilador gcc tiene que ser verión 4.3 ( en mi caso 4.3.3 ). El compilador 4.4 no funciona directamente. Diríganse a [2] para ver como se puede "arreglar" el problema.&lt;/li&gt;&lt;li&gt;Es muy importante tener instalado ( y funcionando ) los últimos drivers de nVidia. El SDK funciona solo con los drivers más nuevos.&lt;/li&gt;&lt;li&gt;Links dónde encontré respuestas que ayudaron a aclararme: [3] [4]&lt;/li&gt;&lt;li&gt;De dependencias. Pero siguiendo los pasos anteriores deberían quedar todas cubiertas.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;[1] Via: &lt;a href="http://dame-linux.blogspot.com/2010/03/driver-nvidia-en-ubuntu-mediante.html"&gt;dame-linux&lt;/a&gt;. Un post simple, fácil y para toda la familia. No dejen de hecharle un vistazo.&lt;br /&gt;[2] Vía &lt;a href="http://www.stealthcopter.com/blog/tag/nvidia/"&gt;stealthcopter&lt;/a&gt; Fué el mejor post que encontré. Lo instalan en 9.10, pero a mi no me llegó a funcionar. Yo lo he traducido y adaptado a 9.04, pero es una copia de este post.&lt;br /&gt;[3] &lt;a href="http://forums.nvidia.com/index.php?showtopic=104118"&gt;Foro de nVidia&lt;/a&gt;. Problemas a la ejecución de algunas demos.&lt;br /&gt;[4] &lt;a href="http://forums.nvidia.com/lofiversion/index.php?t30464.html"&gt;Foro de nVidia&lt;/a&gt;. Error con ficheros gl.h glu.h&lt;br /&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif; line-height: 20px;"&gt;&lt;span style="color: rgb(142, 124, 195);"&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6671913855625335983-2529216006283766045?l=inedit00.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://inedit00.blogspot.com/2010/04/cuda-ii-instalacion-de-toolkit-y-sdk.html</link><author>noreply@blogger.com (inedit00)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6671913855625335983.post-3665141690024326719</guid><pubDate>Fri, 09 Apr 2010 10:26:00 +0000</pubDate><atom:updated>2010-07-25T19:36:25.265+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">howto</category><category domain="http://www.blogger.com/atom/ns#">programacion</category><category domain="http://www.blogger.com/atom/ns#">cuda</category><title>CUDA [I]  Introducción sobre tarjetas gráficas</title><description>&lt;span style="font-weight: bold;"&gt;[Sobre que me voy a enrollar hoy]&lt;/span&gt;&lt;br /&gt;Hace tiempo ya, me picó el gusanillo de la programación de GPU's [&lt;a href="http://inedit00.blogspot.com/2009/12/tecnologia-cuda.html"&gt;1&lt;/a&gt;]. Es por todos conocido que las tarjetas gráficas tienen una alta capacidad de procesamiento y que se necesitan para jugar a los juegos de nueva generación. Pero, por que son tan potentes?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Explicación]&lt;/span&gt;&lt;br /&gt;Resulta que este tipo de hardware ha sido pensado para trabajar con mucha paralelización, es decir, muchos cálculos hechos al mismo tiempo.&lt;br /&gt;Para ello, las tarjetas gráficas tienen un reloj relativamente bajo como 500MHz, o 1GHz. Y vosotros me direis: "Si ya! Pero mi PC tiene un procesador de 2.5GHz, esto es más rapido!" Y es cierto, la única diferencia es que lo más seguro es que tu procesador solo tenga un core. Y en el mejor de los casos va a tener dos o cuatro cores.&lt;br /&gt;&lt;br /&gt;La diferencia fundamental es que las tarjetas gráficas tienen 64, 128, 256 o incluso 480 cores! Esto significa que cada uno de los 64 cores, por ejemplo, tiene una velocidad de 500MHz. Lo que una simple multiplicación (0.5GHz por 64 cores ) nos da una asombrosa velocidad de reloj de 32GHz. Eso, señores, es bastante mas que 2.5GHz. Se pueden imaginar las últimas tarjetas gráficas como la &lt;a href="http://www.nvidia.com/object/product_geforce_gtx_480_us.html"&gt;GTX&lt;/a&gt; 480: 480 cores a 1,401GHz = 672 GHz!!&lt;br /&gt;&lt;br /&gt;Bien, pero no nos dejemos engañar por las cifras. 672GHz es la capacidad que puede desarrollar una tarjeta haciendo &lt;span style="font-weight: bold;"&gt;CÁLCULOS PARALELIZABLES&lt;/span&gt;! Osea, esto incluye toda una metodología de programación diferente a la "programación tradicional", y no todos los cálculos són paralelizables, claro! Por este motivo tenemos un procesador y una tarjeta gráfica. El procesador se encarga de los programas "unicore" ( no es una afirmación del todo cierta, ahora os lo cuento) y tiene una velociad de reloj relativamente alta, por otra parte la tarjeta gráfica se encarga de ejecutar aplicaciones que pueden ser altamente paralelizables como, [surprise surpriseee], la renderización de imágenes que es lo que se usa en los juegos. Para ello usa velocidades de reloj bajas, pero muchos cores.&lt;br /&gt;&lt;br /&gt;Aprovechando que hablo del tema: los procesadores convencionales, a su vez, también disponen de varios cores, osea que realmente también podemos echar las mismas cuentas: Si el procesador es de 2.5GHz y tenemos 4 cores, el procesador tendrá una potencia de 10GHz para &lt;span style="font-style: italic;"&gt;procesos paralelizables&lt;/span&gt;. Muy importante destacar esto último. La mayoría de programas no utilizan los diferentes cores de un procesador. Por lo que los programas pensados del modo "tradicional" trabajarían a una velocidad de reloj de 2.5GHz, mientras que los que han sido pensados para ser paralelizados trabajarían a una velocidad de 10GHz como máximo ( insisto en esto ).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Ejemplo serializable]&lt;/span&gt;&lt;br /&gt;Vamos a poner un ejemplo: Imaginemos que tenemos 128 números ( vamos a hacer números "redondos" 2^7 ) y queremos comprobar si son números primos o no. Nosotros programamos en un lenguaje convencional como C, por ejemplo, una función de &lt;span style="font-style: italic;"&gt;es_primo(numero)&lt;/span&gt;. Esta función recibe un número determinado, y devuelve verdadero o falso dependiendo si es primo o no. Bien. Pues si tenemos 128 números a comprobar lo que hará el programa será algo así:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Procesador1:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;es_primo(1)&lt;/li&gt;&lt;li&gt;es_primo(2)&lt;/li&gt;&lt;li&gt;es_primo(3)&lt;/li&gt;&lt;li&gt;es_primo(...)&lt;/li&gt;&lt;li&gt;es_primo(127)&lt;/li&gt;&lt;li&gt;es_primo(128)&lt;/li&gt;&lt;/ul&gt;Bien! Entonces, cada llamada a la función &lt;span style="font-style: italic;"&gt;es_primo()&lt;/span&gt; tardará 1 unidad de tiempo ( es un ejemplo ). Con lo que si llamamos 128 veces a la función tardaremos 128 unidades de tiempo. ok?&lt;br /&gt;&lt;br /&gt;Imaginamos que hemos hecho el programa de modo que nosotros utilizamos una tarjeta gráfica que *casualmente* tiene 128 cores. Lo que podemos hacer es asignar a cada uno de los cores un trabajo concreto. Solo le asignamos el trabajo, todavía no lo ejecutamos! Vean:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Core1: es_primo(1)&lt;/li&gt;&lt;li&gt;Core2: es_primo(2)&lt;/li&gt;&lt;li&gt;Core3: es_primo(3)&lt;/li&gt;&lt;li&gt;CoreN: es_primo(N)&lt;/li&gt;&lt;li&gt;Core128: es_primo(128)&lt;/li&gt;&lt;/ul&gt;Y ahora, una vez le hemos asignado el trabajo a cada uno de los cores, les decimos a cada uno de ellos: ejecutad. Y todos, a la vez, van a hacer el cálculo. &lt;span style="font-style: italic;"&gt;A la vez&lt;/span&gt;. Lo que significa que vamos a estar 1 unidad de tiempo para hacer todos los cálculos. Asombroso, verdad? Pero claro, ahora estaréis pensando. Justamente has hecho un ejemplo donde el número de cores són iguales a los números que queremos comprobar!! Vaaaale. Cierto, veamos un último ejemplo. Imaginemos que tenemos una gráfica con solo 64 cores. Seguimos queriendo calcular 128 números. Entonces asignamos dos números a cada core, de modo que queda algo así:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Core1: es_primo(1)  es_primo(2)&lt;/li&gt;&lt;li&gt;Core2: es_primo(3)  es_primo(4)&lt;/li&gt;&lt;li&gt;Core3: es_primo(5)  es_primo(5)&lt;/li&gt;&lt;li&gt;CoreN: es_primo(n)  es_primo(n+1) &lt;/li&gt;&lt;li&gt;Core128: es_primo(127) es_primo(128) &lt;/li&gt;&lt;/ul&gt; De este modo, cuando el Core1 acabe de ejecutar "&lt;span style="font-style: italic;"&gt;es_primo(1)&lt;/span&gt;", empezará a ejecutar "&lt;span style="font-style: italic;"&gt;es_primo(2)&lt;/span&gt;". Cuando demos la orden a todos los cores de que empiezen su trabajo, tardarán 2 unidades de tiempo en realizar el trabajo, ya que cada uno tiene que hacer dos cálculos, pero todos harán sus dos cálculos a la vez. Interesante, verdad?&lt;br /&gt;&lt;br /&gt;**Nota: en el ejemplo se considera que el coste de comprobar&lt;span style="font-style: italic;"&gt; es_primo(1)&lt;/span&gt; es igual a &lt;span style="font-style: italic;"&gt;es_primo(128)&lt;/span&gt;, aunque en realidad no tiene el mismo coste computacional. Es solo para que el ejemplo se entienda.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Ejemplo no serializable]&lt;/span&gt;&lt;br /&gt;Calcular los decimales del número PI. PI no puede calcularse en "partes". No le puedo decir al Core1, cálculame los decimales de PI de 1 a 100 y al Core2 que me calcule los decimales de 101 hasta 200 ya que para calcular los decimales de 101 al 200 se necesita haber encontrado los decimales de 1 a 100. Este cálculo lo hará mejor el procesador, ya que trabaja a una velocidad de reloj más alta.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Tecnología]&lt;/span&gt;&lt;br /&gt;Pues al tener una gráfica de nvidia ( 9600GT ), me ha apetecido probar de programarla. Para ello hay un lenguaje de programación, CUDA. Este lenguaje, que es muy parecido a C, nos permite programar y compilar los programas para que se ejecuten el la/las gráficas que tengamos instaladas. Para ello usaré ubuntu 9.04 ( ya explicaré por qué ) los drivers 195 de nVidia y el SDK que dan en su pagina web.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;[Resumiendo...]&lt;/span&gt;&lt;br /&gt;CUDA mola. Aprendamos a programar. En la &lt;a href="http://inedit00.blogspot.com/2010/04/cuda-ii-instalacion-de-toolkit-y-sdk.html"&gt;próxima entrega&lt;/a&gt; os explico como instalar todo el SDK para programar en CUDA (ardua tarea). Espero no haberles aburrido mucho!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6671913855625335983-3665141690024326719?l=inedit00.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://inedit00.blogspot.com/2010/04/cuda-i-introduccion-sobre-tarjetas.html</link><author>noreply@blogger.com (inedit00)</author><thr:total>5</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6671913855625335983.post-6081444024987779466</guid><pubDate>Fri, 26 Mar 2010 12:20:00 +0000</pubDate><atom:updated>2010-03-26T14:04:53.206+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">vim</category><category domain="http://www.blogger.com/atom/ns#">howto</category><category domain="http://www.blogger.com/atom/ns#">general</category><title>Insertar codigo funente en Blogger</title><description>En el post anterior me he encontrado con el problemilla: quería insertar un código C en blogger y no me dejaba. Solución: VIM&lt;br /&gt;&lt;br /&gt;Los pasos que he seguido han sido estos:&lt;br /&gt;[MODO FIKI]&lt;br /&gt;1) Abrir con vim el documento con el código que quiero incluir en un post de Blogger ( o en una página web ).&lt;br /&gt;2) Lo transformamos a HTML con VIM pulsando lo siguiente:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;:TOhtml&lt;/span&gt;&lt;br /&gt;3) Guardamos el nuevo documento en un fichero con el siguiente comando (opcional)&lt;br /&gt;&lt;span style="font-style: italic;"&gt;:w nombre_de_fichero.html&lt;/span&gt;&lt;br /&gt;4 ) Quitamos todos los tags "br" para que no nos haga doble espaciado. Para ello escribimos[1***]:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;:1,$  s/&lt;&gt;//g&lt;/span&gt;&lt;br /&gt;5 ) Seleccionamos todo el documento con el comando (nótese que no se han puesto ":" al inicio )&lt;br /&gt;&lt;span style="font-style: italic;"&gt;ggVG&lt;/span&gt;&lt;br /&gt;6) Copiamos con el comando&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"+y&lt;/span&gt;&lt;br /&gt;7) Pegamos en el lugar deseado de "Edición de HTML", en blogger.&lt;br /&gt;&lt;br /&gt;[MODO MENOS FRIKI]&lt;br /&gt;1) Abrir con GVim el documento con el código que quiero incluir en un post de Blogger ( o en una página web ).&lt;br /&gt;2) Lo transformamos a HTML con GVim pulsando lo siguiente:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;:TOhtml&lt;/span&gt;&lt;br /&gt;3) Guardamos el nuevo documento en un fichero (opcional)&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Archivo&gt;Guardar&lt;/span&gt;&lt;br /&gt;4 ) Quitamos todos los tags "br" para que no nos haga doble espaciado. Para ello escribimos:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Edición&gt;Buscar y reemplazar&lt;/span&gt;&lt;br /&gt;y buscamos "&lt;&gt;"[1***] y lo reemplazamos por "" (osea, nada. dejamos el campo vacío)&lt;br /&gt;5 ) Seleccionamos todo el documento:&lt;br /&gt;&lt;span style="font-style: italic;"&gt; Editar&gt;Select All&lt;/span&gt;&lt;br /&gt;6) Copiamos:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Editar&gt;Copiar&lt;/span&gt;&lt;br /&gt;7) Pegamos en el lugar deseado de "Edición de HTML", en blogger.&lt;br /&gt;&lt;br /&gt;[1***] Nótese que he escrito cada vez "&lt;&gt;". Así no está bien. Se tiene que escribir SIN espacios, ok?&lt;br /&gt;&lt;br /&gt;Bueno! Y esto es todo por hoy! Saludos!&lt;br /&gt;&lt;br /&gt;Pregunta: Como lo haces tú? Deja tu comentario! Gracias.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6671913855625335983-6081444024987779466?l=inedit00.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://inedit00.blogspot.com/2010/03/insertar-codigo-funente-en-blogger.html</link><author>noreply@blogger.com (inedit00)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6671913855625335983.post-8100625931378441820</guid><pubDate>Fri, 26 Mar 2010 10:43:00 +0000</pubDate><atom:updated>2010-03-26T13:18:06.276+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">codigo</category><category domain="http://www.blogger.com/atom/ns#">programacion</category><category domain="http://www.blogger.com/atom/ns#">c</category><title>Criba de Eratóstenes</title><description>[Estoy de vacaciones.... y claro, me aburro. Lo mío es ir haciendo cositas, y ahora me encuentro con demasiadas horas por delante vacías]&lt;br /&gt;&lt;br /&gt;Bueno, hoy quiero hablar de la Criba de Eratóstenes. Más información en su &lt;a href="http://es.wikipedia.org/wiki/Criba_de_Erat%C3%B3stenes"&gt;wiki&lt;/a&gt;. De manera resumida es algo así:&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Explicación&lt;/span&gt;&lt;br /&gt;La criba de Eratóstenes consiste en calcular los números primos menores que N. Este algoritmo es muy eficiente para calcular números primos pequeños ( menores de 10M ).&lt;br /&gt;Para ello utilizaremos un vector de booleanos. Si una celda vale 1, es primo, si vale cero, no lo es. Bien. Al principio ponemos a 1 todos el vector, de modo que, en todos los números sean "primos". Ahora empezamos con el 2 ( ya que todos los números son divisibles entre 1 ). Por cada numero divisible entre 2 menor que N, lo tachamos (4, 6, 8, 10, .... ). Después hacemos lo mismo con el número 3 (6, 9 12...) . Cuando llegamos al número 4, vemos que está tachado ya que es múltiplo de 2, entonces lo ignoramos. Llegamos al 5, y tachamos todos los múltiplos de 5 menores que N. Y así... si llegamos a un número tachado, pasamos al siguiente. Si llegamos a un número que no está tachado, vamos tachando todos sus múltiplos. Al final, los números NO tachados ( con un 1 ), son los números primos. Vean su wiki para ver la representación visual.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Qué he hecho&lt;/span&gt;&lt;br /&gt;Bien, pues he hecho un código en C ( estoy aprendiendo a programar ) para calcular los números primos entre 2 y N, siendo N=10.000.000 y que guarda los resultados en un fichero. En mi PC tarda aproximadamente 1.45 segundos. Me he complicado un poco la vida y lo he que uno pueda .  Al final he conseguido poner el valor de N tan grande como quiera ( en realidad no es así, ya que estamos limitados por la memória RAM del sistema )calcular los números primos entre 2 y 450.000.000. El fichero resultante pesa unos 400MB.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Compilación&lt;/span&gt;&lt;br /&gt;Para compilar el código fuente, lo grabamos en un fichero "criba.c" y lo compilamos así:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ gcc criba.c -o criba -lm&lt;/span&gt;&lt;br /&gt;Y para ejecutar el código tan solo tenemos que escribir:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;$ ./criba&lt;/span&gt;&lt;br /&gt;Esto nos creará un ficherito "primos.txt" con los resultados.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Configuración&lt;/span&gt;&lt;br /&gt;Pues básicamente jugaremos con las constantes N y M. N es el tamaño del bloque y M en número de bloques. Osea, que se van a calcular los números primos que vayan desde 2 hasta N*M. En mi PC N=1M funciona, pero en otro PC igual podría dar fallo. Disminuyese esta cantidad y auméntese en numero de iteraciones ( M ). Recuerden que el algoritmo se vuelve ineficiente a partir de 10M!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Codigo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#8080ff"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#8080ff"&gt;#include &amp;lt;math.h&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#8080ff"&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;/font&gt;&lt;br /&gt;// Each size block&lt;br /&gt;&lt;font color="#8080ff"&gt;#define N 1000000&lt;/font&gt;&lt;br /&gt;// Iterations&lt;br /&gt;&lt;font color="#8080ff"&gt;#define M&amp;nbsp;&amp;nbsp;10&lt;/font&gt;&lt;br /&gt;//Memory that will be used for store all primes( must be aviable )&lt;br /&gt;&lt;font color="#8080ff"&gt;#define memory_size M*N*sizeof(long int)*0.08&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;// Put all values to zero &lt;br /&gt;void initialization(unsigned long int * primes_numbers[]){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (i=0;i&amp;lt;memory_size;i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(*primes_numbers)[i] = 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Save all primes calculated in a file&lt;br /&gt;void save_in_file(unsigned long int * primes_numbers[]){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FILE * fp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned long long int i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fp = fopen(&lt;font color="#ff6060"&gt;&amp;quot;primos.txt&amp;quot;&lt;/font&gt;, &lt;font color="#ff6060"&gt;&amp;quot;w&amp;quot;&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (i=0;(*primes_numbers)[i];i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fprintf(fp, &lt;font color="#ff6060"&gt;&amp;quot;%ld\n&amp;quot;&lt;/font&gt;, (*primes_numbers)[i]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fclose(fp);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Count all the primes calculated&lt;br /&gt;void count(unsigned long int * primes_numbers[]){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned long long int i,j;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (i=0;(* primes_numbers)[i];i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;font color="#ff6060"&gt;&amp;quot;Total primos encontrados: %lld\n&amp;quot;&lt;/font&gt;, j);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Check that in the list of prime numbers all are primes&lt;br /&gt;// alert: very slow in very large amount of numbers&lt;br /&gt;void check(unsigned long int * primes_numbers[]){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned long long int i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (i=1; (*primes_numbers)[i] != 0; i++){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ( is_prime((*primes_numbers)[i]) != 1)&lt;br /&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;printf(&lt;font color="#ff6060"&gt;&amp;quot;FUckkk! %ld\n&amp;quot;&lt;/font&gt;, (*primes_numbers)[i] );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Print all primes calculated&lt;br /&gt;void imprime(unsigned long int * datos[]){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned long long int i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;font color="#ff6060"&gt;&amp;quot;Llistat:\n&amp;quot;&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (i=0;(*datos)[i]!=0;i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;font color="#ff6060"&gt;&amp;quot;%ld\n&amp;quot;&lt;/font&gt;, (*datos)[i]);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int sieve_of_eratosthenes(unsigned long int * primes[], long long int * last_prime_inserted){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char list[N];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned long long int i, j, max;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;list[0] = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (i=2;i&amp;lt;N;i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;list[i] = 1;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;max = sqrt(N)+1;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (i=2;i&amp;lt;max;i++){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (list[i])&lt;br /&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;for (j=2; i*j&amp;lt;N;j++)&lt;br /&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;list[i*j] = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (i=0;i&amp;lt;N;i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (list[i]){&lt;br /&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;(*primes)[j] = i;&lt;br /&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;j++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*last_prime_inserted = j - 1; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Calculate the next block of primes&lt;br /&gt;int next(unsigned long int * prime[], unsigned long long int block_number, long long int * last_prime_inserted){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;char list[N];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned long long int i, j, min, max;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;min = (block_number-1)*N;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;max = block_number*N;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Set all numbers as primes&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (i=0;i&amp;lt;N;i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;list[i] = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;list[0] = 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Mark all numbers alredy calculated&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (i=0;(*prime)[i];i++){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (j=min/(*prime)[i]; (*prime)[i]*j&amp;lt;max; j++){&lt;br /&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;if ((*prime)[i]*j&amp;gt;min){&lt;br /&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;list[((*prime)[i]*j)%N] = 0;&lt;br /&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j = *last_prime_inserted;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Save the new primes&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (i=0;i&amp;lt;N;i++){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (list[i]){&lt;br /&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;printf(&lt;font color="#ff6060"&gt;&amp;quot;%ld&amp;nbsp;&amp;nbsp;j:%ld\n&amp;quot;&lt;/font&gt;, i+min, j);&lt;br /&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;(*prime)[j] = i+min; &lt;br /&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;j++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*last_prime_inserted = j - 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// Calculate all the primes&lt;br /&gt;int calc(int n){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned long long int position_last_prime;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned long int * primes_numbers;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;primes_numbers = malloc(memory_size * sizeof(unsigned long int));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;initialization(&amp;amp;primes_numbers);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sieve_of_eratosthenes(&amp;amp;primes_numbers, &amp;amp;position_last_prime);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int j;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (j=2; j&amp;lt;=n; j++){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;font color="#ff6060"&gt;&amp;quot;Calculando %d...\n&amp;quot;&lt;/font&gt;, j);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;next(&amp;amp;primes_numbers, j, &amp;amp;position_last_prime);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//imprime(numeros_primos);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;font color="#ff6060"&gt;&amp;quot;Guardando...\n&amp;quot;&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;save_in_file(&amp;amp;primes_numbers);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//check(&amp;amp;numeros_primos); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;count(&amp;amp;primes_numbers);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;font color="#ff6060"&gt;&amp;quot;Done!\n&amp;quot;&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;free(primes_numbers);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(void){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;calc(M);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int is_prime(int n){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int i, j, prime;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;prime = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (j=2; j&amp;lt;n/2; j++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (n % j == 0){&lt;br /&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;prime = 0;&lt;br /&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;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return prime;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Fin Codigo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pues esto es todo, señores. Espero no haberles aburrido demasiado.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6671913855625335983-8100625931378441820?l=inedit00.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://inedit00.blogspot.com/2010/03/criba-de-eratostenes.html</link><author>noreply@blogger.com (inedit00)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6671913855625335983.post-8274600907591394079</guid><pubDate>Mon, 22 Mar 2010 08:37:00 +0000</pubDate><atom:updated>2010-03-22T10:08:36.020+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">python</category><category domain="http://www.blogger.com/atom/ns#">programacion</category><title>Jugando con MongoDB y Python</title><description>Bien, siguiendo el &lt;a href="http://inedit00.blogspot.com/2010/03/base-de-datos-geonames.html"&gt;post anterior&lt;/a&gt;, vamos a cargar de GeoNames todos los datos sobre España en una base de datos MongoDB. Aqui no se va a explicar como instalar un servidor de Mongo. Se pueden encontrar todas las indicaciones en su &lt;a href="http://www.mongodb.org/display/DOCS/Home"&gt;pagina web oficial&lt;/a&gt; si no sabes que es Mongo, visita esta &lt;a href="http://www.dosideas.com/noticias/base-de-datos/657-nosql-el-movimiento-en-contra-de-las-bases-de-datos.html"&gt;página&lt;/a&gt;.  No es nada complicado. Bien, al lío.&lt;br /&gt;&lt;br /&gt;Primero tenemos que ir a &lt;a href="http://www.geonames.org/"&gt;GeoNames&lt;/a&gt; ir a la parte de "descargas" y bajarnos algún país. En mi caso me he descargado ES.txt, documento que contiene todos los todos sobre España. Descomprimido, el fichero pesa unos 6.8MiB. Bien, ahora tenemos que "meterlo" en la base de datos. Lo podemos hacer así:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;#! /usr/bin/env python&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;# -*- coding: utf-8 -*-&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;#Filename: buscar.py&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;#Filename: cargar_datos.py&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;from pymongo.connection import Connection&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;#Abrimos una conexión con la BBDD de mongo y creamos una colección llamada ES.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;connection = Connection()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;db = connection.ES&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;collection = db.ES&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;#Estos son los campos que contiene el fichero&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;fields = [&lt;br /&gt;"geonameid",&lt;br /&gt;"name",&lt;br /&gt;"asciiname",&lt;br /&gt;"alternatenames",&lt;br /&gt;"latitude",&lt;br /&gt;"longitude",&lt;br /&gt;"feature_class",&lt;br /&gt;"feature_code",&lt;br /&gt;"country_code",&lt;br /&gt;"cc2",&lt;br /&gt;"admin1_code",&lt;br /&gt;"admin2_code",&lt;br /&gt;"admin3_code",&lt;br /&gt;"admin4_code",&lt;br /&gt;"population",&lt;br /&gt;"elevation",&lt;br /&gt;"gtopo30",&lt;br /&gt;"timezone",&lt;br /&gt;"modification_date"&lt;br /&gt;]&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;#Abrimos el fichero de datos&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;file = open('ES.txt', 'r')&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;#Insertamos todos los datos en la BBDD. Simple y llanamente.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;for data in file: &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    collection.insert(dict(zip(fields, data.split('\t'))))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;print 'Done! =)'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;#Cerramos el fichero y la conexión.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;file.close()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;connection.disconnect()&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bien, señores. Ahora solo queda ejecutar el comando con un simple "&lt;span style="font-family:arial;"&gt;python cargar_datos.py&lt;/span&gt;". En mi ordenador, el proceso tarda unos 25 segundos, aproximadamente. Carga 58.317 registros ( llamados documentos, en la jerga de Mongo ).&lt;br /&gt;Y ya tenemos todos los datos en la BBDD!!&lt;br /&gt;&lt;br /&gt;Pero claro, ahora con todos estos datos que hacemos? Pues vamos a crear un pequeño codigo para hacer consultas:&lt;br /&gt;&lt;span style="font-family:arial;"&gt;#! /usr/bin/env python&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;# -*- coding: utf-8 -*-&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;import pymongo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;import re&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;import sys&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;#Nos conectamos a la BBDD, a la colección ES&lt;br /&gt;&lt;span style="font-family:arial;"&gt;db = pymongo.Connection().ES&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;collection = db.ES&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;#Cogemos el primer argumentos que nos han pasado como parámetro&lt;br /&gt;&lt;span style="font-family:arial;"&gt;busca = sys.argv[1]&lt;/span&gt;&lt;br /&gt;#Compilamos una expresión regular para la búsqueda&lt;br /&gt;&lt;span style="font-family:arial;"&gt;regex = re.compile(busca)&lt;br /&gt;#Buscamos en la base de datos la expresión regular en el campo "alternatenames". Los resultados los guardamos en una lista.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;resultados = [ n for n in collection.find({"alternatenames":regex})]&lt;/span&gt;&lt;br /&gt;#Por cada elemento de la lista pintamos los siguientes datos.&lt;br /&gt;&lt;span style="font-family:arial;"&gt;for tupla in resultados:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    print "&gt;Nombre:",tupla["name"]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    print "Nombres comunes:",tupla["alternatenames"]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    print "Coordenadas [Longitud][Latitud]:", tupla["latitude"], tupla["longitude"]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    print "Link:", "http://maps.google.com/?ie=UTF8&amp;amp;ll=" + str(tupla["latitude"]) + "," + str(tupla["longitude"])  + "&amp;amp;spn=0.047113,0.109863&amp;amp;t=h&amp;amp;z=12"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;print "Resultados encontrados:", len(resultados)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;print ""&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Como funciona el programa? Muy simple:&lt;br /&gt;&lt;span style="font-family:arial;"&gt;$ python buscar.py Pollença&lt;/span&gt;&lt;br /&gt;Y esto nos va a dar los resultados. Si usamos una terminal Bash, podemos hacer clic con Control pulsado sobre el link y automáticamente se abrirá en Google Maps el la posición exacta del lugar buscado. Espero que se haya entendido algo =). No dejen de postear sus dudas/mejoras. Gracias!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6671913855625335983-8274600907591394079?l=inedit00.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://inedit00.blogspot.com/2010/03/jugando-con-mongodb-y-python.html</link><author>noreply@blogger.com (inedit00)</author><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6671913855625335983.post-6648854259155236765</guid><pubDate>Mon, 22 Mar 2010 08:23:00 +0000</pubDate><atom:updated>2010-03-22T10:14:10.119+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">general</category><title>Base de datos GeoNames</title><description>Muy señores míos. Siento que haya estado un tiempo sin poner ningún post de interés. La semana pasada estuve de exámenes finales y ahora ya he terminado. Espero poder volver a coger un poquito la rueda.&lt;br /&gt;&lt;br /&gt;Bien, dejémonos de historias. Que tengo para vosotros hoy? Pues os quiero presentar la página de &lt;a href="http://www.geonames.org/"&gt;GeoNames&lt;/a&gt;. Es una pagina web donde recopila información sobre: nombres de ciudades, de lagos, de pueblos, montañas, sobre municipios/provincias. Y contiene información, muuucha información. Entre otras la coordenadas del lugar que se busca, altitud, la población, el país, nombres similares que recibe este mismo sitio, wiki, etc...&lt;br /&gt;Todos los datos del mundo en cleartext pesa unos 800MB aproximadamente. Bien. Pero me direis "si, ya, esto ya existe. Se llama Google Maps". Y lo cierto es que se parece, pero no es exactamente lo mismo. Las bases de datos de GeoNames se pueden descargar libremente. Es tan fácil como entrar en la página, ir a "Download server" y elegir el país que te quieres descargar.&lt;br /&gt;&lt;br /&gt;Mas exactamente la información información que guardan es la siguiente:&lt;br /&gt;&lt;pre&gt;The main 'geoname' table has the following fields :&lt;br /&gt;---------------------------------------------------&lt;br /&gt;geonameid         : integer id of record in geonames database&lt;br /&gt;name              : name of geographical point (utf8) varchar(200)&lt;br /&gt;asciiname         : name of geographical point in plain ascii characters, varchar(200)&lt;br /&gt;alternatenames    : alternatenames, comma separated varchar(5000)&lt;br /&gt;latitude          : latitude in decimal degrees (wgs84)&lt;br /&gt;longitude         : longitude in decimal degrees (wgs84)&lt;br /&gt;feature class     : see http://www.geonames.org/export/codes.html, char(1)&lt;br /&gt;feature code      : see http://www.geonames.org/export/codes.html, varchar(10)&lt;br /&gt;country code      : ISO-3166 2-letter country code, 2 characters&lt;br /&gt;cc2               : alternate country codes, comma separated, ISO-3166 2-letter country code, 60 characters&lt;br /&gt;admin1 code       : fipscode (subject to change to iso code), see exceptions below, see file admin1Codes.txt for display names of this code; varchar(20)&lt;br /&gt;admin2 code       : code for the second administrative division, a county in the US, see file admin2Codes.txt; varchar(80)&lt;br /&gt;admin3 code       : code for third level administrative division, varchar(20)&lt;br /&gt;admin4 code       : code for fourth level administrative division, varchar(20)&lt;br /&gt;population        : bigint (4 byte int)&lt;br /&gt;elevation         : in meters, integer&lt;br /&gt;gtopo30           : average elevation of 30'x30' (ca 900mx900m) area in meters, integer&lt;br /&gt;timezone          : the timezone id (see file timeZone.txt)&lt;br /&gt;modification date : date of last modification in yyyy-MM-dd format&lt;br /&gt;&lt;/pre&gt;Bueno, en el &lt;a href="http://inedit00.blogspot.com/2010/03/jugando-con-mongodb-y-python.html"&gt;siguiente post&lt;/a&gt; os muestro como volcar todos estos datos en una BBDD como MongoDB.&lt;br /&gt;Saludos!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6671913855625335983-6648854259155236765?l=inedit00.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://inedit00.blogspot.com/2010/03/base-de-datos-geonames.html</link><author>noreply@blogger.com (inedit00)</author><thr:total>0</thr:total></item><language>en-us</language><media:rating>nonadult</media:rating></channel></rss>

