<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
	xmlns:media="http://search.yahoo.com/mrss/"
>

<channel>
	<title>Con G de GNU &#187; Programación</title>
	<atom:link href="http://www.congdegnu.es/category/programacion/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.congdegnu.es</link>
	<description>aptitude install freedom</description>
	<lastBuildDate>Mon, 21 Jun 2010 16:53:23 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<!-- podcast_generator="podPress/8.8" -->
		<copyright>&#xA9; </copyright>
		<managingEditor>congdegnu@gmail.com ()</managingEditor>
		<webMaster>congdegnu@gmail.com()</webMaster>
		<category></category>
		<itunes:keywords></itunes:keywords>
		<itunes:subtitle></itunes:subtitle>
		<itunes:summary>aptitude install freedom</itunes:summary>
		<itunes:author></itunes:author>
		<itunes:category text="Society &amp; Culture"/>
		<itunes:owner>
			<itunes:name></itunes:name>
			<itunes:email>congdegnu@gmail.com</itunes:email>
		</itunes:owner>
		<itunes:block>No</itunes:block>
		<itunes:explicit>no</itunes:explicit>
		<itunes:image href="http://www.congdegnu.es/wp-content/plugins/podpress/images/powered_by_podpress_large.jpg" />
		<image>
			<url>http://www.congdegnu.es/wp-content/plugins/podpress/images/powered_by_podpress.jpg</url>
			<title>Con G de GNU</title>
			<link>http://www.congdegnu.es</link>
			<width>144</width>
			<height>144</height>
		</image>
		<item>
		<title>Gestiona tu mensajes y contactos de tu movil nokia</title>
		<link>http://www.congdegnu.es/2009/09/18/gestiona-tu-mensajes-y-contactos-de-tu-movil-nokia/</link>
		<comments>http://www.congdegnu.es/2009/09/18/gestiona-tu-mensajes-y-contactos-de-tu-movil-nokia/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 17:34:10 +0000</pubDate>
		<dc:creator>Maxpowel</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[contactos]]></category>
		<category><![CDATA[cut]]></category>
		<category><![CDATA[mensajes]]></category>
		<category><![CDATA[nokia]]></category>
		<category><![CDATA[sed]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.congdegnu.es/?p=1085</guid>
		<description><![CDATA[mensajes-nokia.tarEsta idea surgió cuando me tocó cambiar de móvil porque mi pequeño nokia n70 ya pedía el botijo.Por lo que ha pasado el pobre n70 y lo que ha aguantado&#8230; pero desde que se me cayó en un cachi de vodka naranja hace unos dos meses ya no ha vuelto a ser el mismo. Pobre [...]]]></description>
			<content:encoded><![CDATA[<p>mensajes-nokia.tarEsta idea surgió cuando me tocó cambiar de móvil porque mi pequeño nokia n70 ya pedía el botijo.Por lo que ha pasado el pobre n70 y lo que ha aguantado&#8230; pero desde que se me cayó en un cachi de vodka naranja hace unos dos meses ya no ha vuelto a ser el mismo. Pobre móvil, en fin, la vida sigue y ahora tengo un nokia 5310 xpressmusic que es muy cuco.</p>
<p>Vayamos con el tema. El pobre n70 funcionar funciona, pero se bloquea, a veces se queda siempre iluminado (con lo que la batería dura apenas un día) y puesto que en ese teléfono tengo muchos mensajes que no quiero perder (en torno a dos mil) pues sería una tarea un poco suicida la de ir pasando de uno en uno los mensajes.</p>
<p><span id="more-1085"></span></p>
<p>Busqué aplicaciones para exportar todos estos datos pero o bien no funcionaba en el n70 (symbian viejo) o daba error al leer mensajes de la memoria o&#8230; siempre había algún problema.</p>
<p>En un principió pensé en hacer un programa para leer los mensajes directamente del directorio Mail del móvil pero después de ver esos archivos pensé que acabaría antes descifrando todos los jeroglíficos de la pirámides de Egipto que en comprender cómo narices guarda los mensajes. Si alguien tiene documentación acerca de eso que me lo diga y entonces hago el programa en un plis plas (todos ganamos).</p>
<p>Al final me decidí por usar el malvado software de Nokia para exportar los mensajes y contactos a un archivo CSV. CSV es una manera de guardar datos que permite el parseo de un archivo de datos de manera muy sencilla, tanto que desde un script BASH conseguiremos procesarlo.</p>
<p>En el archivo de mensajes cada línea del archivo CSV corresponde a un mensaje y cada linea esta separa por un carácter delimitador. Quizás habrás deducido que simplemente con romper cada línea a partir de esos delimitadores es la solución.</p>
<p>Ahora tenemos los datos pero&#8230; ¿Qué hacemos con ellos? Pues muy fácil, si queremos tener los datos accesibles pues usaremos un SGBD (sistema gestor de bases de datos). Yo usaré mi favorito, MySQL (vaya ya tuvo que salir MySQL, para que sueño con él)</p>
<p>Lo que voy a hacer es que a partir de esos archivos CSV se genere una consulta SQL para insertar los datos en MySQL (uy cuantas siglas) y después tener control total sobre ellos y poder hacer las consultas que quiera sobre ellos (qué lujazo!).</p>
<p>Comencemos.</p>
<p><strong>Paso 1:</strong> Usar el Nokia Pc Suite para exportar los mensajes y contactos (si nokia dijera como demonios guarda los mensajes o el protocolo de comunicación no haría falta pecar y usar un windows virtualizado para ésto ya no tengo tiempo de andar con ingeniería inversa)</p>
<p><strong>Paso 2</strong>: Procesar los archivos.<br />
El formato de estos archivos es:</p>
<pre>sms;deliver,"nºEmisor";"no se";"no se";"fecha";"no se";"Contenido del mensaje";</pre>
<p>sms indica que es sms<br />
deliver es una palabra literal que aparece<br />
nºEmisor es el número de quien te lo ha enviado<br />
no se es que no se que guarda ese campo porque siempre esta vacío<br />
fecha es la fecha en formato AAAA.MM.DD HH:MM<br />
contenido del mensaje es el mensaje en sí</p>
<p>Y para un mms es algo ta que así</p>
<pre>mms;"nºEmisor";"nºReceptor";"no se";"fecha";"no se";"Texto del mensaje";</pre>
<p>Ya sabemos que tenemos lo datos, ahora vamos a ver cuales nos interesan.</p>
<p>Observamos que se nos facilita la labor de adivinar si es sms o mms porque al principio no los dice. El primer campo entonces nos vale. Además si es sms el formato es uno mientras que si es mms el formato cambia así que ya podemos ir haciéndonos un poco a la idea de como va a ser la lógica del programa (si es sms haz esto, si no haz lo otro).<br />
A mi sólo me interesa el numero del emisor que lo usaremos para relacionarlo con el emisor (parece lógico pero hay que tener clara desde el principio las claves para relacionar tablas de la base de datos), la fecha y el contenido. Todo eso lo tengo así que adelante.</p>
<p>Ahora vamos a pensar qué consulta SQL queremos generar. En mi caso me decanto por introducir todos los datos con una sola consulta INSERT</p>
<pre>INSERT INTO mensajes (numero,fecha,mensaje)</pre>
<pre>VALUES</pre>
<pre>(123456789,2009.05.05,'Hola tio que tal'),</pre>
<pre>(123456789,2009.05.06,'A que mola esto'),</pre>
<pre>(123456789,2009.05.07,'Ha llegado el cansinoo'),</pre>
<pre>...</pre>
<pre>(123456789,2009.12.05,'Ultimo mensaje');</pre>
<p>Pero antes, tenemos que tener claro la estructura de la tabla:<br />
Un identificador único como clave primaria, el número de telefono de tamaño 9, la fecha y el mensaje.</p>
<pre>CREATE TABLE mensajes (</pre>
<pre> id int(11) NOT NULL auto_increment,</pre>
<pre> numero char(9) NOT NULL,</pre>
<pre> fecha timestamp NOT NULL,</pre>
<pre> mensaje varchar(1000) NOT NULL,</pre>
<pre> CONSTRAINT mensajes_pk PRIMARY KEY (id)</pre>
<pre>)</pre>
<p>Fíjate que el <strong>numero de teléfono lo trato como CHAR y no como INT</strong>. Es un error muy común pensar que un numero de teléfono es un número pero no lo es (¿Acaso vas a realizar operaciones matemáticas con ellos?). También funcionaria usando INT, pero seamos profesionales. Un char de tamaño 9 es muchisisisimo más rápido y fácil de manejar para un ordenador que un entero de tamaño 9 y nosotros queremos una base de datos eficiente, verdad? Para este caso no notaríamos la diferencia pero tener buenos hábitos nunca sobra. Aunque bueno, si tenemos decenas de miles de &#8220;amigos&#8221; y en vez de teléfono móvil tenemos un robot emisor de spam teléfonico pues sí notaríamos la velocidad de las consultas.</p>
<p>Ahora desde BASH a generar esa consultaza.  El script consistirá en usar <em>cut</em> para dividir la líneas.<br />
No me pararé en todos los detalles, si quieres el script completo ve al final.<br />
Abrimos el fichero y por cada línea comprobamos si es un sms o un mms</p>
<pre>tipo=`echo $LINEA | cut -f 1 -d ";"`</pre>
<pre> if [ "$tipo" == "sms" ]</pre>
<pre>then</pre>
<pre>    bla bla bla</pre>
<pre>else</pre>
<pre>   es un mms bla bla</pre>
<pre>fi</pre>
<p>Pasamos la línea a <em>cut</em>. A <em>cut</em> le decimos que nos rompa la cadena usando el caracter ; (punto y coma) a través del parámetro -d &#8220;;&#8221; y que de esos trozos coja el primero -f 1<br />
Después simplemente comprobamos si es sms. Un problema que me surgió es que los datos estan encapsulados bajo comillas. Me explico, el menaje &#8220;hola que tal tio&#8221; aparece tal y como lo he escrito, con las comillas y no hola que tal tio. Esto es lógico pero nos fastidia si el mensaje tiene dentro unas comillas. Por ejemplo en el mensaje: &#8220;hola que tal, he cogido la marca &#8220;huevera&#8221; porque la marca &#8220;cojonera&#8221; no estaba&#8221;. Una persona ve perfectamente que las comillas en la palabra huevera y cojonera son para especificar la marca y que forman parte del mensaje pero un ordenador pensará que el mensaje termina justo en las segundas comillas, antes de la palabra huevera, y al procesar el resto del texto no lo comprenderá y te lanzará un error. Esta explicación va directamente orientada a MySQL, que es quién al insertar los datos daría este error.</p>
<p>Para evitar ese problema hice una función que quita el primer y último caracter de cada dato. Lo que viene a hacer es una especie de trim a las comillas.</p>
<pre>function trim()</pre>
<pre>{</pre>
<pre>    actual=$1</pre>
<pre>    tam=${#actual}</pre>
<pre>    let tam=$tam-2</pre>
<pre>    trimeado=${actual:1:$tam}</pre>
<pre>    echo "'$trimeado'"</pre>
<pre>}</pre>
<p>En BASH, la variable $1 es el primer parámetro asi como $2 es el segundo hasta $9. Si queremos más de 9 parametros usaremos shift para &#8220;avanzar&#8221; y hacer que $8 valga $9 y así $9 obtiene el valor del siguiente parametro (pero perderíamos el de $1 así que cuidado).<br />
Con <em>${#actual}</em> obtenemos el tamaño de la cadena (como str_len de php, strlen de C o el metodo length de la clase string de java)<br />
Lo que queremos hacer es eliminar el primer caracter del cual sabemos su posición (la posicion 1) y el último, que ahora ya sabemos su posición.<br />
Al tamaño le restamos dos. No funciona como el un substr de php o java, que le indicas la posición y el tamaño. Aquí especificas el inicio y el fin, por eso hay que restarle dos a la posición final.<br />
Y por último, devolvemos el string &#8220;trimeado&#8221; (haciendo uso de spanglish del cutre).</p>
<p>Cuando vayamos a generar una consulta SQL, encapsularemos entre comillas simples el string y así no nos darán problemas las comillas dobles.</p>
<p>Otro detalle que nos viene mal es que guada el prefijo de país. Lo de +34 para el caso de españa. Nosotros estamos usando 9 caracteres para identificar números así que vamos a eliminar esos prefijos y para ello usaremos <em>sed</em> con una <em>expresión regular</em>. En este caso la expresión regular es muy sencilla pero pueden ser extremadamente complejas y potentes. Nosotros sólo queremos quitar +NN de cada número (si lo hay).<br />
Fácil, la expresión regular sería s/+[0-9][0-9]//g  por ejemplo. Una expresión regular va limitada por //. Lo que va fuera son por así decirlo parámetros. La &#8220;s&#8221; es para indicarle que busque. En este caso va a buscar un símbolo más + seguido por dos números. En caso de encontrarlo, lo sustituye por nada y la g del final es un hábito que tengo yo para evitar bucles infinitos pero para este caso no hace falta ya que hacemos sólo 1 reemplazo.</p>
<p>Bien, ya tenemos todas las herramientas. Dividir la cadena de texto, adaptar los datos&#8230; ahora vamos a juntarlo.<br />
Para sacar el número de teléfono de un sms lo hacemos así:</p>
<address>trim &#8220;`echo $LINEA | cut -f 3 -d &#8220;;&#8221; | sed -e \&#8221;s/+[0-9][0-9]//g\&#8221;`&#8221;</address>
<p>Uff, que línea más fea, ¿verdad? Y cualquier signo (comilla, barra&#8230;) tiene que estar en esa posición o sino falla. Pero no es fea la línea, es bonita pero a su modo.<br />
Primero se ejecuta el comando que está entre las comillas simples <em>echo $LINEA | cut -f 3 -d &#8220;;&#8221; | sed -e \&#8221;s/+[0-9][0-9]//g\&#8221;</em><br />
Eso envía a <em>cut</em> la línea, <em>cut</em> extrae el tercer elemento y luego con <em>sed</em> corregimos el número. Con este comando pasamos de tener:<br />
<em>sms;deliver;&#8221;+34655655655&#8243;;&#8221;";&#8221;";&#8221;2007.07.07 07:07&#8243;;&#8221;";&#8221;Mensajeeerl&#8221;</em> a tener <em>&#8220;655655655&#8243;</em>. Luego eso lo pasamos como parámetro a la función trim para que nos deje <em>655655655</em>.<br />
Para obtener la fecha y el mensaje hacemos lo mismo, pero omitiendo la parte del <em>sed</em> que no es necesaria y cambiando la posición de cut (lo de -f)<br />
La fecha la dejamos tal cual ya que MySQL la interpreta bien en ese formato.</p>
<p>Ya lo tenemos todo. Ahora solo queda crear la consulta y meterla en un archivo. Yo esto lo he hecho mediante <em>echo variable &gt;&gt; archivo</em> pero ahí cada uno elige.<br />
Aquí el código completo, tiene algún detalle más como por ejemplo para meter los datos de archivo de origen y destino mediante parámetros y cosas así.</p>
<h3>SCRIPT PARA GENERA LA CONSULTA SQL A PARTIR DEL CSV</h3>
<pre>#!/bin/bash

function trim()
{
   actual=$1
   tam=${#actual}
   let tam=$tam-2
   trimeado=${actual:1:$tam}
   echo "'$trimeado'"
}

if [ $# -lt 2 ]
then
   echo "Uso: ./$1 archivoOrigen.csv archivoDestino.sql";
else
  origen=$1
  destino=$2

  echo "INSERT INTO mensajes (numero,fecha,mensaje) VALUES " &gt; $destino
  while read LINEA
  do
   tipo=`echo $LINEA | cut -f 1 -d ";"`
   echo "(" &gt;&gt; $destino
   if [ "$tipo" == "sms" ]
   then
      #La expresion regular del sed es para quitar el prefijo del pais
      trim "`echo $LINEA | cut -f 3 -d ";" | sed -e \"s/+[0-9][0-9]//g\"`" &gt;&gt; $destino
      echo "," &gt;&gt; $destino
      trim "`echo $LINEA | cut -f 6 -d ";"`" &gt;&gt; $destino
      echo "," &gt;&gt; $destino
      trim  "`echo $LINEA | cut -f 8 -d ";"`" &gt;&gt; $destino
   else
      trim "`echo $LINEA | cut -f 2 -d ";" | sed -e \"s/+[0-9][0-9]//g\"`" &gt;&gt; $destino
      echo "," &gt;&gt; $destino
      trim "`echo $LINEA | cut -f 5 -d ";"`" &gt;&gt; $destino
      echo "," &gt;&gt; $destino
      trim  "`echo $LINEA | cut -f 7 -d ";"`" &gt;&gt; $destino
   fi
  echo ")," &gt;&gt; $destino
  done &lt; $origen
  cantidadLineas=`wc -l $destino |cut -d " " -f 1`
  let cantidadLineas=$cantidadLineas-1
  head -$cantidadLineas $destino &gt; tmp.sql
  echo ");" &gt;&gt; tmp.sql
  rm $destino
  mv tmp.sql $destino
fi</pre>
<p>El archivo lo adjunto tambien, junto al de los contactos.</p>
<p><strong>Paso 3</strong>: La base de datos mola<br />
Para interpretar el archivo de contactos seria hacer lo mismo. Yo uso esta tabla:</p>
<pre>CREATE TABLE contactos (</pre>
<pre>       numero char(9) NOT NULL,</pre>
<pre>      nombre varchar(255) NOT NULL,</pre>
<pre>      PRIMARY KEY  (numero),</pre>
<pre>      UNIQUE KEY nombre (nombre)</pre>
<pre>)</pre>
<p>Uso como clave primaria el número de teléfono (entiendo que solo puede haber una persona con un número) y como clave alternativa el nombre. Si una persona tiene varios teléfonos pues le pones un nombre diferente a cada teléfono (es mi modo de verlo).</p>
<p>Luego los datos se relacionan a través del número de teléfono. Ahora podemos hacer todas las consultas que queramos.<br />
Por ejemplo, quiero ver los mensajes de un tal Juan no se qué:</p>
<pre>SELECT * FROM contactos</pre>
<pre>JOIN mensajes USING (numero)</pre>
<pre>WHERE nombre LIKE 'Juan%'</pre>
<p>Con eso nos apareceran todos los mensajes cuyo nombre de autor empiece por Juan (Juan, Juanito, Juan el de Palencia)<br />
Quiero saber los mensajes que he recibido este último mes, pues algo tan fácil como</p>
<pre>SELECT count(*) FROM mensajes</pre>
<pre>WHERE EXTRACT(YEAR_MONTH FROM fecha) = EXTRACT(YEAR_MONTH FROM NOW())</pre>
<p>Las posibiliades son infinitas, puedes incluso buscar en el texto o lo que quieras (a ver qué gestor de mensajes es tan potente). El problema esta en saber SQL claro. Y si ya te sobra más tiempo pues puedes desarrollar tu propia interfaz en php (o java o el leguaje que te guste) y acceder desde ahí. Seguramente cuando me aburra haga una pero de momento no&#8230; que tengo muchas cosas que hacer. Aunque si alguien me dice como leer mensajes del telefono (ya sea por bluetooth o cable) pues me animaría bastante. Uh, podría ser el comienzo de un Nokia Pc suite libre? Habrá que seguir soñando.</p>
<p>Termino diciendo que el uso práctico que le puedas dar a estos script es nulo o acercándose bastante a nulo pero creo que a alguien sin mucho conocimiento de BASH le pueden ayudar estos códigos para sus chapucillas caseras.</p>
<p>Nos vemos!</p>
<p>ARCHIVO CON LOS SCRIPTS</p>
<p><a href="http://www.congdegnu.es/wp-content/uploads/2009/09/mensajes-nokia.tar.gz">mensajes-nokia.tar</a></p>


<p>Entradas relacionadas.</p>]]></content:encoded>
			<wfw:commentRss>http://www.congdegnu.es/2009/09/18/gestiona-tu-mensajes-y-contactos-de-tu-movil-nokia/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Necesito una polla 1.0</title>
		<link>http://www.congdegnu.es/2009/07/12/necesito-una-polla-1-0/</link>
		<comments>http://www.congdegnu.es/2009/07/12/necesito-una-polla-1-0/#comments</comments>
		<pubDate>Sun, 12 Jul 2009 18:32:06 +0000</pubDate>
		<dc:creator>DiCrEn</dc:creator>
				<category><![CDATA[Programación]]></category>

		<guid isPermaLink="false">http://www.congdegnu.es/?p=1014</guid>
		<description><![CDATA[Quien haya escuchado el gpodcast 2.3 sabra que los degenerados compañeros de NUA nos hicieron un encargo para poder superar el reto que mando mariog para conseguir camisetas de podzapp. Pues bien, aquí teneis el programa unos screens y la documentación.

La documentación puedes verla on-line desde google docs ademas de venir incluida con el programa.
 [...]]]></description>
			<content:encoded><![CDATA[<p>Quien haya escuchado el<a href="http://www.congdegnu.es/2009/07/06/gpodcast-2-3-mitad-y-mitad/"> gpodcast 2.3</a> sabra que los <span style="text-decoration: line-through;">degenerados</span> compañeros de <a href="http://necesitounarma.com/">NUA</a> nos hicieron un encargo para poder superar el reto que mando mariog para conseguir camisetas de podzapp. Pues bien, aquí teneis el programa unos screens y la documentación.</p>
<p><div id="attachment_1015" class="wp-caption aligncenter" style="width: 503px"><img class="size-full wp-image-1015" title="1" src="http://www.congdegnu.es/wp-content/uploads/2009/07/1.gif" alt="1" width="493" height="246" /><p class="wp-caption-text">La imagen ha sido censurada para evitar ofender a los lectores del blog.</p></div></p>
<p style="text-align: center;">
<p><div id="attachment_1016" class="wp-caption aligncenter" style="width: 375px"><img class="size-full wp-image-1016" title="2" src="http://www.congdegnu.es/wp-content/uploads/2009/07/2.gif" alt="Aunque yo creo que es peor ponerla censurada..." width="365" height="462" /><p class="wp-caption-text">Aunque yo creo que censuradas son peores...</p></div></p>
<p style="text-align: left;">La documentación puedes verla on-line desde <a href="http://docs.google.com/View?id=dgjpt98k_3hs3nxpfq">google docs</a> ademas de venir incluida con el programa.</p>
<p><a href="http://www.congdegnu.es/wp-content/uploads/2009/07/nup.zip"><img class="size-full wp-image-62 alignleft" title="torchlight_tar" src="http://www.congdegnu.es/wp-content/uploads/2008/11/torchlight_tar.png" alt="torchlight_tar" width="23" height="23" /> Descargar código fuente</a></p>


<p>Entradas relacionadas.</p>]]></content:encoded>
			<wfw:commentRss>http://www.congdegnu.es/2009/07/12/necesito-una-polla-1-0/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Gpodcast en el arca de la alianza</title>
		<link>http://www.congdegnu.es/2009/05/09/gpodcast-en-el-arca-de-la-alianza/</link>
		<comments>http://www.congdegnu.es/2009/05/09/gpodcast-en-el-arca-de-la-alianza/#comments</comments>
		<pubDate>Sat, 09 May 2009 09:39:46 +0000</pubDate>
		<dc:creator>DiCrEn</dc:creator>
				<category><![CDATA[Podcast]]></category>
		<category><![CDATA[Programación]]></category>
		<category><![CDATA[cutrenti]]></category>
		<category><![CDATA[elarcadelaalianza]]></category>
		<category><![CDATA[entrevista]]></category>

		<guid isPermaLink="false">http://www.congdegnu.es/?p=961</guid>
		<description><![CDATA[Gpodcast ha sido entrevistado por Dani en su podcast, el arca de la alianza, si alguien quiere escucharlo que se pase por su blog.
Muy buenas a todos.
Aquí estoy de nuevo teniendo una charla muy interesante y divertida con los chicos de GPodcast
Os recomiendo que visitéis su blog, que ponen artículos muy interesantes y la red [...]]]></description>
			<content:encoded><![CDATA[<p>Gpodcast ha sido entrevistado por Dani en su podcast,<strong> el arca de la alianza</strong>, si alguien quiere escucharlo que se pase por<a href="http://www.elarcadelaalianza.es/?p=85"> su blog.</a></p>
<blockquote><p>Muy buenas a todos.</p>
<p>Aquí estoy de nuevo teniendo una <a title="10 Entrevista a GPodcast" href="http://blip.tv/file/get/Elarcadelaalianza-10EntrevistaAGPodcast912.mp3" target="_blank">charla</a> muy interesante y divertida con los chicos de <a href="../" target="_blank">GPodcast</a></p>
<p><a href="../" target="_blank"></a>Os recomiendo que visitéis su blog, que ponen artículos muy interesantes y la red social creada por Álvaro mediante software libre <a href="http://www.cutrenti.es">Cutrenti</a></p></blockquote>


<p>Entradas relacionadas:<ol><li><a href='http://www.congdegnu.es/2009/10/20/gpodcast-2-8-gpodcast-en-vinagre/' rel='bookmark' title='Permanent Link: GPodcast 2.8 &#8211; &#8220;GPodcast en vinagre&#8221;'>GPodcast 2.8 &#8211; &#8220;GPodcast en vinagre&#8221;</a> <small> Casi un mes mas tarde del último GPodcast volvemos,...</small></li><li><a href='http://www.congdegnu.es/2009/04/06/gpodcast-especial-1/' rel='bookmark' title='Permanent Link: Gpodcast Especial #1'>Gpodcast Especial #1</a> <small> Tenemos un GPodcast especial, con solo dos secciones, pero...</small></li><li><a href='http://www.congdegnu.es/2009/07/26/gpodcast-2-4-sin-sl-y-sin-alvaro-gpodcast-pierde-la-cabeza/' rel='bookmark' title='Permanent Link: GPodcast 2.4 &#8211; Sin SL y sin Álvaro gpodcast pierde la cabeza'>GPodcast 2.4 &#8211; Sin SL y sin Álvaro gpodcast pierde la cabeza</a> <small> Ante todo disculpad por los problemas de sonido que...</small></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.congdegnu.es/2009/05/09/gpodcast-en-el-arca-de-la-alianza/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://blip.tv/file/get/Elarcadelaalianza-10EntrevistaAGPodcast912.mp3" length="99975755" type="audio/mpeg" />
		</item>
		<item>
		<title>Implementación cliente HTTP 2ª Parte</title>
		<link>http://www.congdegnu.es/2009/01/06/implementacion-cliente-http-2%c2%aa-parte/</link>
		<comments>http://www.congdegnu.es/2009/01/06/implementacion-cliente-http-2%c2%aa-parte/#comments</comments>
		<pubDate>Tue, 06 Jan 2009 20:16:51 +0000</pubDate>
		<dc:creator>Maxpowel</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[How to]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[map]]></category>

		<guid isPermaLink="false">http://www.congdegnu.es/?p=387</guid>
		<description><![CDATA[Buenas, debido al chapucero código de mi anterior artículo me decidí por hacer una implementación decente. En este caso intentaré hablar lo menos posible sobre el protocolo y centrarme principalmente en el código, aun así sed libres de preguntar lo que querais  
La primera versión (no publicada) fué escrita íntegramente en C. Funcionaba pero [...]]]></description>
			<content:encoded><![CDATA[<p>Buenas, debido al chapucero código de mi anterior artículo me decidí por hacer una implementación decente. En este caso intentaré hablar lo menos posible sobre el protocolo y centrarme principalmente en el código, aun así sed libres de preguntar lo que querais <img src='http://www.congdegnu.es/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><span id="more-387"></span>La primera versión (no publicada) fué escrita íntegramente en C. Funcionaba pero no era sencilla de usar y yo lo que buscaba era algo sencillo de usar, que <img class="alignright size-full wp-image-388" src="http://www.congdegnu.es/wp-content/uploads/2009/01/curl.png" alt="curl" width="99" height="37" />para bibliotecas complejas ya existen algunas como por ejemplo <a href="http://curl.haxx.se/" target="_blank">curl</a>. Curl es muy potente y con infinidad de funciones pero es necesario echarle unas horas para aprender a usarlo. Otro día os hablare de curl, que también es una biblioteca muy estandar en el mundo GNU/Linux.</p>
<p>Después decidí aprovechar ese código y realicé un híbrido C/C++ (la versión del <a href="http://www.congdegnu.es/2008/12/01/protocolo-http-y-pequena-implementacion/" target="_blank">otro artículo</a>) pero el código que quedó era muy feo y de muchas líneas así que dije &#8220;ala, a empezar desde cero pero siguiendo un diseño orientado a objetos&#8221; y me puse con ello.</p>
<p>El cambio más radical fué la nueva forma de almacenar la información. Como ya dije, la estructura de datos en  html son &#8220;nombre de variable&#8221; &#8220;valor&#8221;, podemos verlo tanto en las cabeceras (ej: Host localhost) o los formularios (ej: usuario maxpowel). Se que esta explicación es muy abstracta pero en el <a href="http://www.congdegnu.es/2008/12/01/protocolo-http-y-pequena-implementacion/" target="_blank">otro artículo</a> hablo mas detenidamente sobre ello (después de las DNS). Para guardar estos datos antes usaba listas enlazadas y vale, serán muy eficientes pero hoy en día no merece la pena para esta tarea. Además, todo el que haya trabajado con punteros sabrá lo que se sufre cuando el programa te salta con una <a href="http://es.wikipedia.org/wiki/Access_violation" target="_blank">violación de segmento</a>, aaahhh! que no cunda el pánico!! Se puede arreglar pero puedes encontrar el fallo en 2 minutos o estar 2 días y sin ver donde está el fallo.</p>
<p><div id="attachment_389" class="wp-caption aligncenter" style="width: 493px"><img class="size-full wp-image-389" src="http://www.congdegnu.es/wp-content/uploads/2009/01/fault.png" alt="Menos mal que el sistema operativo mata al proceso que intenta acceder a memoria que no es suya...." width="483" height="139" /><p class="wp-caption-text">Menos mal que el sistema operativo mata al proceso que intenta acceder a memoria que no es suya....</p></div></p>
<p>Para programadores de otros lenguajes, por ejemplo php, pensarán &#8220;vaya chorrada, yo uso un array con un string como índice y listo&#8221; pero por la naturaleza de los arrays de C/C++ esto no es posible aunque por suerte existen otros métodos. Una de las novedades que trae C++ es una clase llamada map. No se si quien hizo esta clase lo hizo pensando en mí porque la verdad que me venía perfecto. Cumple las mismas funciones que mis listas enlazadas y alguna más de regalo pero lo mejor esque el número de líneas de mi programa se reducía drásticamente y seguro que sus algoritmos son mucho mas eficientes que los míos.</p>
<p>Un map nos permite crear una lista de elementos cuyos índices pueden ser cualquier tipo de dato (string, int, incluso tipos de datos propios&#8230;) y como valor lo mismo, cualquier tipo de dato. Para esta caso, necesitamos un mapa cuyo índice sera un string (ej. usuario) y el valor otro string (ej. maxpowel). Map trae métodos para insertar, buscar, modificar, eliminar&#8230; así que, a jugar! Además, sabemos que en un formulario html no puede haber dos campos con el mismo valor (o por lo menos no debería) y hasta en esto map no favorece ya que si intentas insertar un elemento cuyo índice ya existe lo que hace es modificar el existente. Ayy la de quebramientos de cabeza que me hizo pasar conseguir que mis listas enlazadas hicieran eso&#8230;</p>
<p>La clase donde uso estos mapas se llama AFEBLcontainer, en los archivos afeblcontainer.h y afeblcontainer.cpp.<br />
Ahora al usar mapas podemos acceder siemple a un valor de igual manera que en un array de php</p>
<p>string usuario=mapa["usuario"];</p>
<p>Aunque para hacerlo mas seguro solo se puede acceder al mapa mediante los metodos que implemente la clase.<br />
El resto de los cambios del programa son básicamente el uso de strings en vez de arrays de chars, que hace un código infinitamente más sencillo y fácil y leer.</p>
<p>En este nuevo programa, la clase con la que trabajamos la he llamado AFEBLbrowser. Mediante esta clase se puede hacer todo lo que necesitamos. Esta a su vez trabja con otras tres clases container, una para las cabeceras, otra para los inputs y la última para las cookies. Decir que tanto el contenedor de los inputs como el de las cookies son clases especiales porque realizan alguna función más. Luego heredan las propiedades principales de un contenedor normal. Para comprenderlo un poco mejor pongo un esquemita (pincha sobre él para verlo más grande).</p>
<p><img class="aligncenter size-medium wp-image-391" src="http://www.congdegnu.es/wp-content/uploads/2009/01/esquema-300x128.png" alt="esquema" width="300" height="128" /><br />
Como podeis comprobar, el diseño es bien sencillote. También vemos que para hacer unas pocas tareas he creado bastantes clases. Todo esto se podría haber empaquetado en una única clase browser con varios maps y todos lo métodos juntos pero eso sería un GRAN ERROR. La experiencia nos lleva diciendo durante años que la clave es la <strong>MODULARIZACIÓN</strong>.<br />
Imaginad que por lo que sea queremos hacer un cambio en el contenedor, por ejemplo para que cada uno tenga un nombre. Tal  como está hecho ahora solo modificamos una clase (AFEBLcontainer) mientras que si lo tenemos todo junto tendriamos que modificar cada mapa, que este caso serían tres. Otra ventaja es que si por ejemplo quiero añadir más metodos a la clase que maneja las cookies solo modifico esa, dejando intacta la clase contenedor. Este el motivo por el que hice otras dos clases (AFEBLpostData y AFEBLcookies) en vez de modificar el contenedor (AFEBLcontainer) a pesar de que cada clase tiene solo método, pero de esta manera abro la puertas a futuras mejoras y evitar así tener reescribir código para añadir nuevas funcionalidades.<br />
Además, viendo este sencillito esquema observamos que para las cabeceras siemplemente necesitamos almacenar datos (porque no ha ninguna clase intermediaria) mientras que las otras dos seguro que van a procesar esos datos.<br />
Ésta es la gracia de la modularización, dividir problemazas en problemillas. Porque problemillas son más fáciles de resolver que problemazas, y en la programación en concreto es una medida para evitar que cuando arregles algo rompas otra cosa. Y recordad, un buen diseño de un programa es lo más importante. Escribir el código es lo último, hay que ir paso a paso. Seguramente se podría haber hecho un diseño mejor pero es una aplicación tan pequeña no merece gastar mucho tiempo jeje. Un ejemplo de lo que sucede cuando no se piensa antes de programar es lo que me pasó a mi con esta misma aplicación. Al principio la hice a lo loco porque solo lo quería para un bot sencillito de rapidshare (no voy a bajar 70 partes a mano, que lo haga el ordenador por mi jaja) y luego cuando quise mejorarlo un poco para un proyecto que tenemos entre manos Dicren y yo me vi con el problema de que poco se podía hacer con ese código&#8230;</p>
<p>Venga, al tema, la página del proyecto es <a href="http://www.nongnu.org/afebl/">http://www.nongnu.org/afebl/</a><br />
Para bajarlo por subversion <strong>svn co svn://svn.savannah.nongnu.org/afebl/0.1</strong><br />
o directamente el tarball <strong><a href="http://svn.savannah.gnu.org/viewvc/*checkout*/tarballs/afebl-0.1.tar.gz?root=afebl">http://svn.savannah.gnu.org/viewvc/*checkout*/tarballs/afebl-0.1.tar.gz?root=afebl</a></strong></p>
<p>Para probar que te compila bien y que tienes todo lo necesario entra en el direcotorio y ejecutas make. Si no da problemas perfecto <img src='http://www.congdegnu.es/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> , si te da problemas te agradecería que me lo hagas saber. En el archivo main.cpp hay un ejemplo de uso básico pero yo os voy a explicar como usarlo.</p>
<p>Lo primero de todo es incluir mis clases y las de entrada y salida estandar (recomiendo meter AFEBL en un directorio propio para que no se mezcle entre tus archivos)</p>
<pre lang="Cpp" line="1" colla="+">
#include <iostream>
#include "AFEBL/afeblbrowser.cpp"
</pre>
<p>Me permito el lujo de copiar el manual que hice para la página del proyecto<br />
Las opciones que tenemos son o enviar información al servidor o recibirla. Para recibir una pagina usaremos el método &#8220;get&#8221;<br />
Los nombres están en inglés por el tema de hacerlo mas internacional y esas cosas.</p>
<p><span style="font-weight: bold; text-decoration: underline;">OBTENIENDO UNA PÁGINA</span><br />
Prototipo:</p>
<pre lang="Cpp" line="1" colla="+">
	string get(string host);
</pre>
<p>Ejemplo	</p>
<pre lang="Cpp" line="1" colla="+">
	AFEBLbrowser *browser=new AFEBLbrowser();
	string host="http://www.congdegnu.es/";
	string response;
	response=browser->get(host);
	cout << response;
	delete browser;
</pre>
<p>Con este código mostraremos por pantalla el HTML de la página. Podemos usar la variable "response" para todo lo que queramos, teniendo en cuenta que ahí está el código HTML</p>
<p>Para enviar información en una página web solemos usar formularios, aquí os dejo un ejemplo.</p>
<p><span style="font-weight: bold; text-decoration: underline;">ENVIAR UN FORMULARIO</span><br />
Prototipos: (uso la palabra input para ver la semejanza con el campo input de html)</p>
<pre lang="Cpp" line="1" colla="+">
	void addInput(string inputName,string inputValue); //Crear nuevo input
	bool modifyInput(string inputName,string newValue);//Modificar input
	bool removeInput(string inputName); //Eliminar un input
	string getInputValue(string inputName); //Obtener el valor de un input
	void clearInputs(); //Borrar todos los inputs
	void showInputs(); //Mostrar los inputs
</pre>
<p>Ejemplo<br />
Vamos a "emular" el siguiente formulario html</p>
<pre lang="HTML" line="1" colla="+">
<form method="POST" action="http://congdegnu.es/index.php">
<input type="username" value="maxpowel">
<input type="password" value="123456">
	</form>
</pre>
<pre lang="Cpp" line="1" colla="+">
	AFEBLbrowser *browser=new AFEBLbrowser();
	string response;
	browser->addInput("username","maxpowel");
	browser->addInput("password","123456");
	browser->showInputs();
	response=browser->submit("http://congdegnu.es/index.php");//Usamos el método submit para enviar
</pre>
<p>Este código enviará la información al servidor, mostrará el contenido del formulario y guardará la respuesta del servidor en la variable response.</p>
<p><span style="font-weight: bold; text-decoration: underline;">COOKIES</span><br />
Las cookies son cargadas automáticamente cuando se obtiene una página<br />
Prototipos:</p>
<pre lang="Cpp" line="1" colla="+">
	void clearCookies(); //Borrar cookies
</pre>
<p>Ejemplo<br />
Borrar cookies (por ejemplo para terminar una sesión)</p>
<pre lang="Cpp" line="1" colla="+">
	AFEBLbrowser *browser=new AFEBLbrowser();
	string response;
        //Completamos el formulario de login
	browser->addInput("username","maxpowel");
	browser->addInput("password","123456");
	response=browser->submit("<a href="http://webpage.com/page.php">http://webpage.com/page.php</a>");
	//Estamos autenticados en el servidor
	browser->clearCookies();
	//Cookies destruidas
</pre>
<p>Me he dado cuenta de que en algunos servidores tarda más tiempo del debido. Actualmente estoy trabajando en ello. Se que el problema está en los sockets (la herramienta que crea la conexión con el servidor de la página web) y a pesar de estar en modo no bloqueante sigue esperando a que el servidor finalice la conexión. Por el resto, todo debería funcionar bien pero ya se sabe que siempre hay bugs jeje.</p>
<p>Un último ejemplo práctico, basado en el del main.cpp. Quería hacer un búsquedas en google pero me he dado cuenta de que google no permite hacer POST así que esto es lo que hay jeje.</p>
<pre lang="Cpp" line="1" colla="+">
#include <iostream>
#include "afeblbrowser.cpp"

using namespace std;
int main()
{

AFEBLbrowser *browser=new AFEBLbrowser();
//Hago post localhost/index2.php, en el archivo php pones print_r($_POST) para que muestre los posteado
browser->addInput("q","alvaro");
cout << browser->submit("localhost/index2.php");

//Get the page localhost/index2.php
cout << browser->get("http://www.google.es/search?hl=es&amp;q=congdegnu");
delete browser;
return 0;
}
</pre>
<p>Nos vemos!</p>


<p>Entradas relacionadas:<ol><li><a href='http://www.congdegnu.es/2008/12/01/protocolo-http-y-pequena-implementacion/' rel='bookmark' title='Permanent Link: Protocolo HTTP y pequeña implementación'>Protocolo HTTP y pequeña implementación</a> <small>Quizá te hayas preguntado alguna vez cómo hacen los navegadores...</small></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.congdegnu.es/2009/01/06/implementacion-cliente-http-2%c2%aa-parte/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Snake con ncurses</title>
		<link>http://www.congdegnu.es/2008/12/02/snake-con-ncurses/</link>
		<comments>http://www.congdegnu.es/2008/12/02/snake-con-ncurses/#comments</comments>
		<pubDate>Tue, 02 Dec 2008 21:25:50 +0000</pubDate>
		<dc:creator>DiCrEn</dc:creator>
				<category><![CDATA[Programación]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[ncurses]]></category>
		<category><![CDATA[snake]]></category>

		<guid isPermaLink="false">http://congdegnu.es/?p=63</guid>
		<description><![CDATA[Hace un par de meses o tres, decidí poner todo de mi parte y aprender a programar, sin prisa pero sin pausa. Por supuesto, no podía haber hecho nada sin maxpowel, que me animo y ayudo, y lo sigue haciendo.
Tengo pensado ir subiendo aquí mis programitas y mis pequeñas hazañas según valla aprendiendo, tampoco espereis [...]]]></description>
			<content:encoded><![CDATA[<p>Hace un par de meses o tres, decidí poner todo de mi parte y aprender a programar, sin prisa pero sin pausa. Por supuesto, no podía haber hecho nada sin maxpowel, que me animo y ayudo, y<a href="http://www.congdegnu.es/2008/11/30/capitulo-0-prologo/"> lo sigue haciendo</a>.</p>
<p>Tengo pensado ir subiendo aquí mis programitas y mis pequeñas hazañas según valla aprendiendo, tampoco espereis una periodicidad constante ni nada, es algo que hago como hobby (por ahora) y lo hago con calma.</p>
<p>Este programa lo hice apenas aprender las nociones mas básicas de C, gracias a multitud de guías, manuales y ejemplos que existen en la red y por supuesto, gracias a la desinteresada y gratificante ayuda de mi compañero, y, sin embargo, amigo maxpowel. Ya me había cansado de hacer programas solo para ver como funcionan las cosas y me atrevi a escribir algo mínimamente interesante usando ncurses.</p>
<p><div id="attachment_64" class="wp-caption alignleft" style="width: 337px"><a href="http://congdegnu.es/wp-content/uploads/2008/11/dicrsnake.gif"><img class="size-medium wp-image-64" src="http://congdegnu.es/wp-content/uploads/2008/11/dicrsnake-300x210.gif" alt="dicrsnake" width="327" height="228" /></a><p class="wp-caption-text">dicrsnake en funcionamiento! ¿emocionante, eh?</p></div></p>
<p>Se trata del clásico juego de los primeros nokias, el snake, como podéis intuir, rebautizado en un alarde de originalidad como &#8220;dicrstake&#8221;. En realidad yo al principio solo quería jugar un poco con ncurses, para ver como funcionaba, pero me fui liando me fui liando&#8230; y salio esto. Quizás por culpa de esto el programa no sea lo mejor del mundo, ya que esta escrito según probaba y se me iban ocurriendo cosas, ademas, lo hice solo con los conocimientos mas básicos de C, ni siquiera uso punteros o estructuras, pero puedo decir que es mio y que funciona, y con eso me sobra.</p>
<p>Seguro que si tienes un PC viejo (muy viejo) y quieres pasar un rato te puede servir <img src='http://www.congdegnu.es/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Si queréis descargarlo, probarlo, modificarlo y todo lo que queráis bajo licencia GPL, al final de la entrada lo podéis descargar. Recordad que tenéis que tener instalado gcc y ncurses, y compilarlo así:</p>
<p><a href="http://congdegnu.es/wp-content/uploads/2008/11/term.png"><img class="alignnone size-medium wp-image-32" src="http://congdegnu.es/wp-content/uploads/2008/11/term.png" alt="" width="27" height="24" /></a> <em><span class="postbody">gcc -lncurses dicrsnake1.0.c </span></em></p>
<p>Si tenéis alguna duda sobre el funcionamiento del programa podéis preguntarlo, aunque no creo que sea muy difícil para alguien un poquito experimentado, y si no lo eres quizas que podamos aprender juntos <img src='http://www.congdegnu.es/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>Espero seguir subiendo mis pequeños programitas de aprendizaje&#8230; últimamente estoy ya liadillo con examenes y no tengo mucho tiempo, pero seguiré, a el ritmo que sea.</p>
<p><a href="http://congdegnu.es/wp-content/uploads/2008/11/torchlight_tar.png"><img class="alignnone size-medium wp-image-62" src="http://congdegnu.es/wp-content/uploads/2008/11/torchlight_tar.png" alt="" width="27" height="27" /></a> <a href="http://congdegnu.es/wp-content/uploads/2008/11/dicresnake10ctar.bz2">dicresnake1.0.c</a></p>


<p>Entradas relacionadas.</p>]]></content:encoded>
			<wfw:commentRss>http://www.congdegnu.es/2008/12/02/snake-con-ncurses/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
