<?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:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Dime Jaguar</title>
	<atom:link href="http://toxicafunk.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://toxicafunk.wordpress.com</link>
	<description>Anotaciones varias sobre IT.</description>
	<lastBuildDate>Fri, 24 Jul 2009 16:17:41 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='toxicafunk.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/4161cf4f72b7980f0fd239765bdb295d?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Dime Jaguar</title>
		<link>http://toxicafunk.wordpress.com</link>
	</image>
			<item>
		<title>En respuesta a: Las claves para entender qué pasa en Honduras</title>
		<link>http://toxicafunk.wordpress.com/2009/07/24/en-respuesta-a-las-claves-para-entender-que-pasa-en-honduras/</link>
		<comments>http://toxicafunk.wordpress.com/2009/07/24/en-respuesta-a-las-claves-para-entender-que-pasa-en-honduras/#comments</comments>
		<pubDate>Fri, 24 Jul 2009 16:17:41 +0000</pubDate>
		<dc:creator>toxicafunk</dc:creator>
				<category><![CDATA[honduras]]></category>
		<category><![CDATA[politica]]></category>
		<category><![CDATA[golpe]]></category>
		<category><![CDATA[politca]]></category>
		<category><![CDATA[sucesion]]></category>

		<guid isPermaLink="false">http://toxicafunk.wordpress.com/?p=77</guid>
		<description><![CDATA[Yo he evitado hablar de politica en este Blog pero los hechos ocurridos en mi patria y la cantidad de pseudo-expertos en materia politico-social que han surgido por el mundo en torno a mi país Honduras me obligan a publicar un par de notas sobre el tema. Esta entrada es en relación al articulo por [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=toxicafunk.wordpress.com&blog=16471&post=77&subd=toxicafunk&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } 		A:link { so-language: zxx } -->Yo he evitado hablar de politica en este Blog pero los hechos ocurridos en mi patria y la cantidad de pseudo-expertos en materia politico-social que han surgido por el mundo en torno a mi país Honduras me obligan a publicar un par de notas sobre el tema. Esta entrada es en relación al articulo por <a href="http://www.escolar.net/MT/archives/2009/06/las-claves-para-entender-que-pasa-en-honduras.html">Escolar.net</a>. Como no sé que interes (si es que existiese alguno) pueda tener el autor Ignacio Escolar en desinformar sobre lo ocurrido en Honduras, tengo que suponer que se trata de una tarea dejada a medias o algo asi como quien se ha olvidado de hacer una tarea y la hace a la carrera recopilando datos sin interesarle que estos sustenten su tesis o no. Aclaro que mi intencion no es insultar sino más bien informar a la vez que proporciono mi particular punto de vista sobre los acontecimientos que llevaron a la sucesion forzada (o golpe de estado si lo prefieren) acaecida en Honduras el pasado 28 de Junio de 2009. La forma más sencilla y coherente de hacerlo es comentando los puntos expuestos por Ignacio uno a uno, como siempre, estoy abierto al dialogo y fomento la discusión:</p>
<p><em>1- Lo que había convocado para el domingo, lo que los golpistas han impedido, no era la reelección permanente de Zelaya ni la presidencia vitalicia. Ni siquiera la reforma de la constitución. Lo que se votaba era una consulta no vinculante para preguntar a los hondureños si les gustaría que en las próximas elecciones, en las de noviembre, se votase también la creación de una asamblea constituyente que reformase la carta magna. En resumen: era algo en apariencia tan inofensivo como preguntar si se podía preguntar por reformar la constitución, algo que, por otra parte, <a href="http://www.google.es/url?sa=t&amp;source=web&amp;ct=res&amp;cd=1&amp;url=http%3A%2F%2Fpdba.georgetown.edu%2FParties%2FHonduras%2FLeyes%2FReformaElectoral.pdf&amp;ei=xrtISvqbFpLQ-QaW4uTYDg&amp;usg=AFQjCNHZXOvjjYw8DvOXfZ7_tbrh4UePJg&amp;sig2=vTroTAO4VKecFzI_gGd1fQ">la propia constitución hondureña impide</a>.</em></p>
<p>No sé ni por donde comenzar&#8230;. Primero, supone que la &#8220;ENCUESTA PARA LA CUARTA URNA&#8221; solo era una encuesta&#8230; realmente el poder ejecutivo había publicado ya en la gaceta (el periódico oficial del país donde se publican todas las propuestas de leyes, nombramientos, etc.) que aparte de la consulta de la cuarta urna , se instalaría una asamblea nacional constituyente. Solo existen 2 razones prácticas en Honduras para <a href="http://www.proceso.hn/2009/06/27/Nacionales/C.A.Gobierno/14452.html" target="_blank">convocar una asamblea constituyente</a>:</p>
<ol>
<li>
<p style="margin-bottom:0;">Para declarar el acto de guerra,</p>
</li>
<li>Para reformar las partes PETREAS o INAMOVIBLES de la 	Constitución Hondureña, específicamente las partes que impiden el 	continuismo</li>
</ol>
<p>Hay que entender varias cosas sobre Honduras, para establecer el sufragio o votación se establecen tres urnas:</p>
<ol>
<li>
<p style="margin-bottom:0;">para Elección de Presidente,</p>
</li>
<li>
<p style="margin-bottom:0;">para Elección de Diputados y</p>
</li>
<li>para Elección de los Alcaldes</li>
</ol>
<p>La cuarta urna propuesta por Mel dice tener como objetivo &#8220;consultar&#8221; a la población para saber si quieren o no cambiar la constitución, PERO NUNCA DICE QUE PARTE!!!! <strong>No dice que parte quiere cambiar y tampoco dice cuál es el cambio.</strong> ¿Como se puede votar si no nos dicen cual será el nuevo texto de la constitución? Es como que nos pregunten si queremos nuevo presidente pero no nos digan quien será el nuevo presidente!!! ¿Quieren que le cambien el sueldo? Si. Mmm espere, ¿que me lo aumenten o que me lo rebajen? Da igual Ud. vote si quiere que se lo cambien. POR FAVOR!!!</p>
<p style="margin-bottom:0;">Ignacio en un claro ejemplo de la soberbia que suelen mostrar los “primer-mundistas” al referirse a nosotros los “tercer-mundistas” afirma que nuestra constitución prohibe ser reformada&#8230;. esto es simplemente RIDICULO! Existen varios mecanismos para reformar la constitución, por ejemplo, los referendos, véase por ejemplo el <a href="http://www.honduras.net/honduras_constitution.html" target="_blank">Articulo 17</a> y el <a href="http://www.honduras.net/honduras_constitution2.html">Articulo 218</a> de la constitución Hondureña.</p>
<p style="margin-bottom:0;">
<p style="margin-bottom:0;"><strong>ARTICULO 218.-</strong> No será necesaria la sanción, ni el Poder Ejecutivo podrá poner el veto en los casos y resoluciones siguientes:</p>
<p style="margin-bottom:0;">…</p>
<p style="margin-bottom:0;">8. En las reformas que se decreten a la Constitución de la República.</p>
<p style="margin-bottom:0;">…</p>
<p style="margin-bottom:0;">Los artículo 373 y 374 se refieren a que la reforma de la constitución puede hacerse por dos tercios 2/3 de los votos en sesión ordinaria; sin poderse reformar el artículo 373, los artículos sobre la forma de gobierno, el territorio, periodo presidencial y prohibición de reelección presidencial. De los 378 artículos únicamente 6 (¿o 7?)son petreos.</p>
<p style="margin-bottom:0;">
<p style="margin-bottom:0;">Nuestra constitución limita el Poder Ejecutivo y es muy estricta en cuanto como se debe hacer una reforma a sí misma, esto es porque Honduras tiene una rica historia en golpes de estado y hemos aprendido los mecanismos comunes para darlos entre los que se incluye:</p>
<ol type="a">
<li>
<p style="margin-bottom:0;"><strong>Imponer sus propios jueces en 	el Poder Judicial</strong><span style="font-weight:normal;">, cosa que 	“San” <a href="http://www.laprensa.hn/Apertura/Ediciones/2009/01/26/Noticias/Honduras-Juramentan-nueva-Corte-Suprema">Mel 	intento hacer en Enero de 2009</a>.</span></p>
</li>
<li>
<p style="margin-bottom:0;"><strong>Intimidar al Poder Legislativo</strong><span style="font-weight:normal;">, 	<a href="http://www.laprensa.hn/Apertura/Ediciones/2009/01/26/Noticias/Enviados-del-ejecutivo-amenazaron-a-diputados" target="_blank">cosa 	que Mel también intentó</a>. Me quedo con la siguiente frase de 	ese articulo: </span><em><span style="font-weight:normal;">Arístides 	Mejía dejó claro que por instrucciones del Presidente, el Ejército 	estaba listo para salir a las calles a imponer la orden de Zelaya</span></em><span style="font-style:normal;"><span style="font-weight:normal;">.</span></span></p>
</li>
<li>
<p style="margin-bottom:0;"><span style="font-style:normal;"><span style="font-weight:normal;">Reformar 	la constitución para poder perpetrarse&#8230;.. sin comentarios</span></span></p>
</li>
</ol>
<p style="margin-bottom:0;">
<p style="margin-bottom:0;"><em><span style="font-weight:normal;">2- La actual constitución de Honduras establece un mandato único a los presidentes de cuatro años. Zelaya termina el suyo este año y, en cualquier caso, no se podría presentar a la reelección porque para noviembre no estaría aprobada la reforma constitucional que él propone. Como mucho, habría sido posible que en esa fecha se votase la posibilidad de una reforma constitucional. <a href="http://www.elpais.com/articulo/internacional/jefe/Ejercito/desobedecio/comandante/soy/elpepuint/20090628elpepiint_3/Tes">Él mismo ha negado en varias entrevistas que tenga intención de presentarse a la reelección</a>.</span></em></p>
<p style="margin-bottom:0;">
<p style="margin-bottom:0;"><span style="font-style:normal;"><span style="font-weight:normal;">Aquí hay por lo menos 2 puntos importantes:</span></span></p>
<ol type="a">
<li>
<p style="margin-bottom:0;font-weight:normal;"><span style="font-style:normal;">Si 	no podía presentarse y no buscaba la reelección&#8230;. ¿Porque tanta 	insistencia en elaborar la supuesta encuesta?</span></p>
</li>
<li>
<p style="margin-bottom:0;font-weight:normal;"><span style="font-style:normal;">Mel 	no propuso NINGUNA reforma, nunca dijo que parte quería reformar ni 	cual sería ña nueva propuesta. Además </span><span style="font-style:normal;"><strong>¿que 	importancia tiene si le aprobaron algo o no cuando ya habia 	demostrado que NO ACATA LAS LEYES NI LOS DICTAMENES DE LOS PODERES 	DEL ESTADO</strong></span><span style="font-style:normal;">?</span></p>
<p style="margin-bottom:0;font-weight:normal;">
</li>
</ol>
<p style="margin-bottom:0;font-weight:normal;"><span style="font-style:normal;">Llegados a este punto la pregunta de muchos será: </span><span style="font-style:normal;"><strong>¿Como se pasa de una “simple encuesta” al continuismo?</strong></span><span style="font-style:normal;"> Buen, es una simple formula, aquí les va:</span></p>
<ol type="a">
<li>
<p style="margin-bottom:0;"><span style="font-style:normal;"><span style="font-weight:normal;">Se 	propone un voto popular sin especificar que es lo se esta votando.</span></span></p>
</li>
<li>
<p style="margin-bottom:0;"><span style="font-style:normal;"><span style="font-weight:normal;">Llegado 	el día de las elecciones se cambia el texto, por ejemplo, además 	de “reformar” la constitución, se agrega un texto que diga “y 	reelegir a XXX”</span></span></p>
</li>
<li>
<p style="margin-bottom:0;"><span style="font-style:normal;"><span style="font-weight:normal;">Felicidades, 	ha sido Ud. electo DEMOCRATICAMENTE, se ha cumplido la VOLUNTAD DEL 	PUEBLO</span></span></p>
</li>
</ol>
<p style="margin-bottom:0;">
<p style="margin-bottom:0;"><span style="font-style:normal;"><span style="font-weight:normal;">¿No me creen? ¿Piensan que nunca se ha hecho? ¿Que soy paranoico? Bueno, basta con leer algo de historia, para esto les debo el link.</span></span></p>
<p style="margin-bottom:0;">
<p style="margin-bottom:0;"><em><span style="font-weight:normal;">3- El parlamento está enfrentado con el presidente entre otras cosas porque Zelaya, un terrateniente acomodado y conservador que concurrió a las urnas por el Partido Liberal, <a href="http://www.publico.es/internacional/235385/oligarca/cambio/bando">ha hecho después una política de izquierdas y se ha aliado con Hugo Chavez</a>. En Honduras gobiernan desde hace décadas dos partidos, el Liberal -de centro derecha- y el Partido Nacional -de derecha-. Hace unos días, el Congreso aprobó una ley para prohibir que se celebrase cualquier tipo de consulta 180 días antes de unas elecciones. Es una norma </span></em><em> </em><em><span style="font-weight:normal;">ad hoc</span></em><em><span style="font-weight:normal;">, hecha para impedir el referéndum de Zelaya.</span></em></p>
<p style="margin-bottom:0;">
<p style="margin-bottom:0;"><span style="font-style:normal;"><span style="font-weight:normal;">Mejor que cualquier cosa que pueda decir yo, y además, con mayor objetividad, recomiendo este articulo de Septiembre del 2008 titulado <a href="http://www.envio.org.ni/articulo/3882" target="_blank">Now in ALBA, Always in Impunity</a>. Entre otras cosas interesantes menciona la alianza temporal Mel-Micheletti, Micheletti firmaba el acuerdo del ALBA y Mel impedia que Elvin Santos fuera candidato presidencial. Menciona tambien como desde entonces ya estaba Mel planeando remplazar al Congreso por una Asamblea Nacional Constituyente garantizándose así el continuismo. En palabras del autor (traducidas):</span></span></p>
<p style="margin-bottom:0;">
<p style="margin-bottom:0;">“<em><span style="font-weight:normal;">Con el ALBA, Mel Zelaya deja de estar al volante de un gobierno insípido creado por sus decisiones erráticas e incoherentes. Cree que a través del ALBA puede re-inventarse con una alternativa las propuestas que han prevalecido en Honduras desde hace más dos décadas, retratándose a si mismo como un líder valiente que se enfrenta a las clases políticas y económicas”</span></em></p>
<p style="margin-bottom:0;">
<p style="margin-bottom:0;"><span style="font-style:normal;"><span style="font-weight:normal;">Un punto MUY IMPORTANTE que menciona Ignacio es que el Congreso prohibió cualquier tipo de consulta que se realice 180 días antes o después de las elecciones. Esto es muy interesante, es a simple vista una medida preventiva que en todo caso, si Mel no buscaba continuismo, ésta en nada afecta su iniciativa de referendo. Porque Mel quiso convocar a referendo, una facultad exclusiva del Congreso, y como no lo dejaron cambio el nombre a “Encuesta no-vinculante”, y aquí pregunto yo ¿Por que no propuso su “encuesta” para 180 días después de las elecciones? Despues de todo, como señala Ignacio su “reforma” no lo afectaba a él, no se quería presentar a la reelección. Si eso fuera cierto&#8230; ¿Porque insistir en realizar esa “encuesta” ?</span></span></p>
<p style="margin-bottom:0;">
<p style="margin-bottom:0;"><span style="font-style:normal;"><span style="font-weight:normal;">Para realizar encuestas ya esta el Instituto Nacional de Estadística y empresas como Sid-Gallup, si Mel queria consultar al pueblo podia haberlo hecho por estos medios, pero NO ERA UNA ENCUESTA el necesita un urna, una votación sino no le sirve de apoyo para decir que es “la voluntad del pueblo”.</span></span></p>
<p style="margin-bottom:0;">
<p style="margin-bottom:0;"><span style="font-style:normal;"><span style="font-weight:normal;">Por último, ya que Ignacio “recuerda” que Mel es un terrateniente acomodado, aprovecho para recordar <a href="http://www.monografias.com/trabajos25/gobiernos-militares-honduras/gobiernos-militares-honduras.shtml" target="_blank">La Matanza de Los Horcones</a>:</span></span></p>
<p style="margin-bottom:0;">
<p style="margin-bottom:0;"><em><span style="font-weight:normal;">&#8220;Fueron sacados de un presidio de Juticalpa varias personas y los llevaron a la hacienda de &#8220;Los Horcones&#8221; propiedad de José Manuel Zelaya. Los llevaron para interrogarlos pero luego los mataron y mataron a los testigos que había por ahí también. El teniente Benjamín Plata fue el que estaba al mando; ordeno que se metieran los cadáveres en un pozo con dinamita. Se les encontró responsabilidad directa al Mayor José Enrique Chinchilla, Subteniente Benjamín Plata, Manuel Zelaya y Carlos Bahr.</span></em></p>
<p style="margin-bottom:0;">
<p style="margin-bottom:0;">Continuo en otro post, para no aburrirlos. Ah, y <a href="http://www.hondurasdesdefuera.net/Imagenes/MEL%20GUERRILLERO.JPG" target="_blank">una foto de Mel</a>.</p>
<p style="margin-bottom:0;">
<p><!-- 		@page { margin: 2cm } 		P { margin-bottom: 0.21cm } 		A:link { so-language: zxx } --></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/toxicafunk.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/toxicafunk.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/toxicafunk.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/toxicafunk.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/toxicafunk.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/toxicafunk.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/toxicafunk.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/toxicafunk.wordpress.com/77/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/toxicafunk.wordpress.com/77/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/toxicafunk.wordpress.com/77/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=toxicafunk.wordpress.com&blog=16471&post=77&subd=toxicafunk&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://toxicafunk.wordpress.com/2009/07/24/en-respuesta-a-las-claves-para-entender-que-pasa-en-honduras/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05c1f4677695e182c62fc42c226ad68d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">toxicafunk</media:title>
		</media:content>
	</item>
		<item>
		<title>Tratar XML con JavaScript Core</title>
		<link>http://toxicafunk.wordpress.com/2009/03/23/tratar-xml-con-javascript-core/</link>
		<comments>http://toxicafunk.wordpress.com/2009/03/23/tratar-xml-con-javascript-core/#comments</comments>
		<pubDate>Mon, 23 Mar 2009 01:35:20 +0000</pubDate>
		<dc:creator>toxicafunk</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XSLT]]></category>
		<category><![CDATA[xslt dom]]></category>

		<guid isPermaLink="false">http://toxicafunk.wordpress.com/2009/03/23/tratar-xml-con-javascript-core/</guid>
		<description><![CDATA[Recientemente preguntaron en el maillist de javascript en español “ JavaEScript” sobre los ejemplos de  W3Schools. El problema es que se quería insertar en una array el  title,  author,  year y  price de cada elemento  book para posteriormente ordenarlos en una tabla. Al parecer estaban teniendo problema con que [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=toxicafunk.wordpress.com&blog=16471&post=70&subd=toxicafunk&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Recientemente preguntaron en el maillist de javascript en español “ <a href="http://lists.scriptia.net/listinfo.cgi/javaescript-scriptia.net" target="_blank">JavaEScript</a>” sobre los ejemplos de  <a href="http://www.w3schools.com/dom/dom_examples.asp" target="_blank">W3Schools</a>. El problema es que se quería insertar en una array el  <em>title</em>,  <em>author</em>,  <em>year</em> y  <em>price</em> de cada elemento  <em>book</em> para posteriormente ordenarlos en una tabla. Al parecer estaban teniendo problema con que al leer el fichero no sabían discriminar los nodos que tiene. Los ejemplos de  <a href="http://www.w3schools.com/dom/dom_examples.asp" target="_blank">W3Schools</a> utilizan la implementación DOM que viene en javascript por defecto en (casi) cualquier navegador moderno, el cuál no es precisamente fácil de utilizar y/o entender.<br />
El XML en cuestión es el siguiente:</p>
<pre><span lang="en-US">&lt;bookstore&gt;</span><span lang="en-US">&lt;book category="cooking"&gt;</span>
    <span lang="en-US">&lt;title lang="en"&gt;Everyday Italian&lt;/title&gt;</span>
 <span lang="en-US">   &lt;author&gt;Giada De Laurentiis&lt;/author&gt;</span>
 <span lang="en-US">   &lt;year&gt;2005&lt;/year&gt;</span>
 <span lang="en-US">   &lt;price&gt;30.00&lt;/price&gt;</span>
 <span lang="en-US"> &lt;/book&gt;</span>
 <span lang="en-US"> &lt;book category="children"&gt;</span>
    <span lang="en-US">&lt;title lang="en"&gt;Harry Potter&lt;/title&gt;</span>
 <span lang="en-US">   &lt;author&gt;J K. Rowling&lt;/author&gt;</span>
 <span lang="en-US">   &lt;year&gt;2005&lt;/year&gt;</span>
 <span lang="en-US">   &lt;price&gt;29.99&lt;/price&gt;</span>
 <span lang="en-US"> &lt;/book&gt;</span>
 <span lang="en-US"> &lt;book category="web"&gt;</span>
 <span lang="en-US">   &lt;title lang="en"&gt;XQuery Kick Start&lt;/title&gt;</span>
 <span lang="en-US">   &lt;author&gt;James McGovern&lt;/author&gt;</span>
 <span lang="en-US">   &lt;author&gt;Per Bothner&lt;/author&gt;</span>
 <span lang="en-US">   &lt;author&gt;Kurt Cagle&lt;/author&gt;</span>
 <span lang="en-US">   &lt;author&gt;James Linn&lt;/author&gt;</span>
 <span lang="en-US">   &lt;author&gt;Vaidyanathan Nagarajan&lt;/author&gt;</span>
 <span lang="en-US">   &lt;year&gt;2003&lt;/year&gt;</span>
 <span lang="en-US">   &lt;price&gt;49.99&lt;/price&gt;</span>
 <span lang="en-US"> &lt;/book&gt;</span>
 <span lang="en-US"> &lt;book category="web" cover="paperback"&gt;</span>
 <span lang="en-US">   &lt;title lang="en"&gt;Learning XML&lt;/title&gt;</span>
 <span lang="en-US">   &lt;author&gt;Erik T. Ray&lt;/author&gt;</span>
 <span lang="en-US">   &lt;year&gt;2003&lt;/year&gt;</span>
 <span lang="en-US">   &lt;price&gt;39.95&lt;/price&gt;</span>
 <span lang="en-US"> &lt;/book&gt;</span>
<span lang="en-US">&lt;/bookstore&gt;</span></pre>
<p>Modifique el ejemplo de  <a href="http://www.w3schools.com/dom/tryit.asp?filename=try_dom_list_loop">http://www.w3schools.com/dom/tryit.asp?filename=try_dom_list_loop</a>, para utilizar el DOM  <em>core</em> <span style="font-style:normal;">sin ninguna librería que facilitara el trabajo y a la vez usar código que entendiera la persona que hizo la pregunta, para hacer lo que se pedía:</span></p>
<pre><span lang="en-US">&lt;html&gt;
 &lt;head&gt;
  &lt;script type="text/javascript" src="loadxmldoc.js"&gt;&lt;/script&gt;
 &lt;/head&gt;
 &lt;body&gt;
</span> &lt;script type="text/javascript"&gt;
   var arrayExterior = new Array();
   xmlDoc=loadXMLDoc("books.xml");
   x=xmlDoc.getElementsByTagName("book");
   for (i=0;i&lt;x.length;i++)
   {
    var arrayInterior = new Array();
    for (j=0;j&lt;x[i].childNodes.length;j++)
    {
    if (x[i].childNodes[j].nodeType==1)
    {
       var textValue = x[i].childNodes[j].childNodes[0].nodeValue;
       arrayInterior.push(textValue);
     }
   }
  arrayExterior.push(arrayInterior);
  }
 document.write("Total elementos: "+arrayExterior.length+"&lt;br/&gt;")
 for (i=0; i&lt;arrayExterior.length; i++) {
  document.write("book "+i+"&lt;br/&gt;");
  for (j=0; j&lt;arrayInterior.length; j++) {
    document.write(arrayExterior[i][j]+"&lt;br/&gt;");
  }
  document.write("&lt;hr/&gt;");
 }
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p style="margin-bottom:0;"><span style="font-size:small;">El punto a destacar es que los nodos como</span> <span style="font-size:small;"><em>book</em></span> <span style="font-size:small;">tienen un nodo implícito tipo text &#8220;invisible”, es decir, entre</span> <span style="font-size:small;"><em>book</em></span> <span style="font-size:small;"><span style="font-style:normal;">y</span></span> <span style="font-size:small;"><em>title</em></span> <span style="font-size:small;"><span style="font-style:normal;">existe un nodo</span></span> <span style="font-size:small;"><em>text</em></span> <span style="font-size:small;"><span style="font-style:normal;">que no tienen ningún valor, algo similar a esto</span></span> <span style="font-size:small;">:</span></p>
<pre style="margin-bottom:.5cm;"> <span lang="en-US">&lt;book category="children"&gt;</span>
  <span style="color:#00ae00;"><span lang="en-US">&lt;text-node/&gt;</span></span>
 <span lang="en-US">&lt;title lang="en"&gt;Harry Potter&lt;/title&gt;</span></pre>
<p style="margin-bottom:0;"><a id="lw_1237769741_3" name="lw_1237769741_3"></a> <span style="font-size:small;">por eso lo mas fácil es un bucle que recorra los childNodes y preguntar el nodeType (1=Element, 3=Text, la lista completa aqui:  <a href="http://www.w3schools.com/Dom/dom_nodetype.asp" target="_blank">http://www.w3schools.com/Dom/dom_nodetype.asp</a>).</span></p>
<p style="margin-bottom:0;">
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/toxicafunk.wordpress.com/70/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/toxicafunk.wordpress.com/70/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/toxicafunk.wordpress.com/70/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/toxicafunk.wordpress.com/70/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/toxicafunk.wordpress.com/70/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/toxicafunk.wordpress.com/70/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/toxicafunk.wordpress.com/70/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/toxicafunk.wordpress.com/70/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/toxicafunk.wordpress.com/70/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/toxicafunk.wordpress.com/70/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=toxicafunk.wordpress.com&blog=16471&post=70&subd=toxicafunk&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://toxicafunk.wordpress.com/2009/03/23/tratar-xml-con-javascript-core/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05c1f4677695e182c62fc42c226ad68d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">toxicafunk</media:title>
		</media:content>
	</item>
		<item>
		<title>Benchmarks de lxml, urllib2 y pycurl</title>
		<link>http://toxicafunk.wordpress.com/2009/03/21/benchmarks-de-lxml-urllib2-y-pycurl/</link>
		<comments>http://toxicafunk.wordpress.com/2009/03/21/benchmarks-de-lxml-urllib2-y-pycurl/#comments</comments>
		<pubDate>Sat, 21 Mar 2009 03:41:07 +0000</pubDate>
		<dc:creator>toxicafunk</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[callbacks]]></category>
		<category><![CDATA[crawler]]></category>
		<category><![CDATA[lxml]]></category>
		<category><![CDATA[pycurl]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[scree-scraping]]></category>
		<category><![CDATA[spider]]></category>
		<category><![CDATA[urllib2]]></category>

		<guid isPermaLink="false">http://toxicafunk.wordpress.com/?p=64</guid>
		<description><![CDATA[Llevo como mes y medio jugando con Python y la verdad me gusta. Para los que no estan famirializados con Python pues basta mencionar que urllib2 es una libreria para recuperar el contenido de una pagina Web. BeautifulSoup es un parser HTML/XML para lo que se conoce como screen-scraping, es decir analizar un contenido (en este caso texto) palabra por palabra para extraer la informacion que nos interesa. lxml viene siendo como urllib2 y BeautifulSoup en una sola libreria excepto que lxml nos permite utilizar XSLT y Selectores CSS para realizar el scraping. PyCurl en cambio, es una interfaz (o binding) de Python a la libreria de C libcurl. Ya que hablamos de bindings vale la pena mencionar,para entender el porque de este benchmark, que lxml es, a su vez, binding de libxml2 y libxslt. Los bindings son una interfaz, es decir, el modo de acceder a los servicios a librerias de C, generalmente, se trata de librerias del sistema operativo por lo que en teoria se supone que son mucho m&#xC3;&#xA1;s rapidas quelas librerias escritas en python puro (o en java o ruby o cualquier otro lenguaje distinto a C/C++).<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=toxicafunk.wordpress.com&blog=16471&post=64&subd=toxicafunk&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Llevo como mes y medio jugando con Python y la verdad me gusta. Para los que no estan famirializados con Python pues basta mencionar que urllib2 es una libreria para recuperar el contenido de una pagina Web. BeautifulSoup es un parser HTML/XML para lo que se conoce como <a title="Screen-Scraping Wikipedia (nueva ventana)" href="http://es.wikipedia.org/wiki/Screen_scraping" target="_blank">screen-scraping</a>, es decir analizar un contenido (en este caso texto) palabra por palabra para extraer la informacion que nos interesa. <a title="Home de lxml (nueva ventana)" href="http://codespeak.net/lxml/" target="_blank">lxml</a> viene siendo como <a title="Documentacion oficial de urllib2" href="http://docs.python.org/library/urllib2.html" target="_blank">urllib2</a> y <a title="Home de BeautifulSoup (nueva ventana)" href="http://www.crummy.com/software/BeautifulSoup/" target="_blank">BeautifulSoup</a> en una sola libreria excepto que lxml nos permite utilizar <a title="XSLT en Wikipedia (nueva ventana)" href="http://es.wikipedia.org/wiki/XSLT" target="_blank">XSLT</a> y <a title="Selectores CSS que deberias conocer (anieto2k)" href="http://www.anieto2k.com/2006/09/06/selectores-css-que-deberias-conocer/" target="_blank">Selectores CSS</a> para realizar el scraping. <a title="Home de PyCurl (nueva ventana)" href="http://pycurl.sourceforge.net/" target="_blank">PyCurl</a> en cambio, es una interfaz (o binding) de Python a la libreria de C <a title="Home de libcurl (nueva ventana)" href="http://curl.haxx.se/libcurl/" target="_blank">libcurl</a>. Ya que hablamos de bindings vale la pena mencionar,para entender el porque de este benchmark, que lxml es, a su vez, binding de <a class="reference external" href="http://xmlsoft.org/">libxml2</a> y <a class="reference external" href="http://xmlsoft.org/XSLT">libxslt</a><span class="reference external">. Los bindings son una interfaz, es decir, el modo de acceder a los servicios a librerias de C, generalmente, se trata de librerias del sistema operativo por lo que en teoria se supone que son mucho m&#xE1;s rapidas quelas librerias escritas en python puro (o en java o ruby o cualquier otro lenguaje distinto a C/C++).</span></p>
<p><span class="reference external">En resumen, urllib2 es libreria de python puro para realizar peticiones (requests) HTTP, lxml es binding de C para tratar XML/HTML (pero no para tratar requests HTTP), PyCurl es un binding de C para hacer peticiones HTTP (pero no para parsear el resultado). La pregunta entonces es, &#xBF;cual combinacion ofrece el mejor rendimiento (performance)?. La pregunta me ha surgido mientras realizaba un ejercicio del libro <a title="Web del libro en  O'Reilly (nueva ventana)" href="http://oreilly.com/catalog/9780596529321/" target="_blank">Programming Collective Intelligence</a> de <a title="Blog de Toby Seagaran (nueva ventana)" href="http://blog.kiwitobes.com/" target="_blank">Toby Seagaran</a> el cual recomiendo (<a title="Programming Collective Intelligence en Google Books" href="http://books.google.es/books?id=fEsZ3Ey-Hq4C&amp;dq=programming+collective+intelligence&amp;printsec=frontcover&amp;source=bn&amp;hl=es&amp;ei=C07ESY2BOZGv-AbNx_DjBg&amp;sa=X&amp;oi=book_result&amp;resnum=4&amp;ct=result#PPR16,M1" target="_blank">enlace enGoogle Books</a>), por lo que el codigo original que utilizo es codigo del libro que adapte a los diferebtes casos de prueba.</span></p>
<p><span class="reference external">Los benchmarks son: urllib2 con BeautifulSoup, solucion pura de lxml y PyCurl con lxml para parsear la pagina. Hay quemencionar que una de las grandes ventajas de PyCurl es utilizar su derivado <a title="Ejemplo de CurlMulti (nueva ventana)" href="http://pycurl.cvs.sourceforge.net/viewvc/pycurl/pycurl/examples/retriever-multi.py?revision=1.29&amp;view=markup" target="_blank">CurlMulti</a> ya que este permite realizar varias conexiones concurrentes lo cual es mucho m&#xE1;s eficiente para este benchmark, sin embargo, el benchmark utiliza su modo normal el cual es secuencial ya que el prop&#xF3;sito del benchmark es ver cual libreria es m&#xE1;s r&#xE1;pida recuperando una pagina Web, extrayendo sus enlaces (&lt;a&gt;) y luego recuperando cada enlace para repetir el proceso, en escencia: un crawler/spider.</span></p>
<p><span class="reference external"><br />
</span></p>
<p><span class="reference external">Primero, estos son los imports que necesitaremos:</span></p>
<pre><span class="reference external">import urllib2
from BeautifulSoup import *
from urlparse import urljoin
import pycurl
from lxml import etree, html
from StringIO import StringIO
import sys</span></pre>
<p>urllib2, urlparse, StringIO y, por supuesto, sys son parte del core de Python (yo utilizo la version 2.5 en Ubuntu). las demas librerias se pueden obtener todas con apt-get (tambien cuentan con un instalador para Windows en sus respectivas paginas Web). Ahora definimos la primera funci&#xF3;n, la cual utiliza urllib2 + BeautifulSoup:</p>
<pre>def crawl(pages, depth):
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; '''A partir de una lista de p&#xE1;ginas, hacemos un crawling completo
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; hasta la profundidad dada'''
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; for i in range(depth):
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; newpages=set()
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; for page in pages:
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; try:
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; c=urllib2.urlopen(page)
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; except:
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; print 'Could not open %s' % page
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; continue

&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; soup=BeautifulSoup(c.read())

&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; links=soup('a')
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; print 'found %d links on %s' % (len(links), page)
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; for link in links:
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; if 'href' in dict(link.attrs):
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; url=urljoin(page, link['href'])
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; if url.find("'")!=-1:
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; print "' found on %s" % url
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; continue
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; url=url.split('#')[0] # remove location part
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; if url[0:4]=='http':
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; newpages.add(url)
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; pages=newpages</pre>
<p><span class="reference external">Esta funci&#xF3;n es, para efectos pr&#xE1;cticos, la misma que encontramos es en libro. En resumen, la primera parte obtiene la pagina con urllib2, luego se parsea con BeautifulSoup y se extraen sus links. Luego se itera cada link obteniendo el &#8216;<em>href</em>&#8216; de cada uno, se utiliza <em>urljoin</em> para convertir los links relativos en absolutos, si el link apunta hacia un anchor (contiene #), se extrae la parte del anchor. Por ultimo se a&#xF1;ade la URL obtenida al set <em>newpages</em> y asignamos el valor de <em>newpages</em> a <em>pages</em> de modo que la siguiente iteracion utilice las URLS que acabamos de encontrar. Ahora la versi&#xF3;n lxml pura:</span></p>
<pre><span class="reference external">def lxmlCrawl(pages, depth):
&#xA0;&#xA0;&#xA0; for i in range(depth):
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; newpages=set()
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; for page in pages:
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; try:
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; doc = html.parse(page).getroot()
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; doc.make_links_absolute()
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; except:
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; print 'Could not open %s' % page
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; continue

&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; links=doc.cssselect('a')
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; print 'found %d links on %s' % (len(links), page)
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; for link in links:
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; if 'href' in dict(link.attrib):
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; url = link.attrib['href']
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; if url.find("'")!=-1:
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; print "' found on %s" % url
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; continue
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; url=url.split('#')[0] # remove location part
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; if url[0:4]=='http':
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; newpages.add(url)
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; pages=newpages</span></pre>
<p>esta versi&#xF3;n es muy similar a la anterior excepto que (1) la peticion y el parseo se hace en un solo paso:</p>
<pre><span class="reference external">doc = html.parse(page).getroot()</span></pre>
<p>(2) lxml nos da un metodo para convertir los links relativos a absolutos:</p>
<pre><span class="reference external">doc.make_links_absolute()</span></pre>
<p>y (3) utilizamos un selector de CSS (<em>&#8216;a&#8217;</em>) para obtener los links. Ahora la versi&#xF3;n PyCurl (modo sencillo) + lxml para parsear el resultado:</p>
<pre>def pycurlCrawl(pages, depth):
&#xA0;&#xA0;&#xA0; print depth
&#xA0;&#xA0;&#xA0; if depth&gt;0:
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; queue=[]
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; newpages=set()
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; for page in pages:
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; try:
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; c = pycurl.Curl()
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; parser = PyCurlParser(page);
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; queue.append(parser)
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; c.setopt(c.URL, page)
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; c.setopt(c.WRITEFUNCTION, parser.curl_body_callback)
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; c.perform()
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; except:
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; print 'Could not open %s' % page
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; continue
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; c.close

&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; for p in queue:
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; newpages.update(p.parseHTML())
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; print newpages
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; pycurlCrawl(newpages,depth-1)

class PyCurlParser:
&#xA0;&#xA0;&#xA0; def __init__(self, url):
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; self.url = url
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; self.contents = ''
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; self.newpages = set()

&#xA0;&#xA0;&#xA0; def curl_body_callback(self, buf):
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; self.contents = self.contents + buf

&#xA0;&#xA0;&#xA0; def parseHTML(self):
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; parser = etree.HTMLParser()
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; tree&#xA0;&#xA0; = etree.parse(StringIO(self.contents), parser)
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; links = tree.getroot().xpath('//a')
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; print 'found %d links on %s' % (len(links), self.url)
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; for link in links:
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; if 'href' in dict(link.attrib):
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; url=urljoin(self.url, link.attrib['href'])
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; print url
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; url=url.split('#')[0] # remove location part
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; if url[0:4]=='http':
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; self.newpages.add(url)
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; print 'added url: %s' % url
&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0; return self.newpages</pre>
<p>esta versi&#xF3;n es la mas larga y compleja y no es en vano, libcurl es una libreria muy potente, es as&#xED;ncrona y no es precisamente sencilla, por lo que su binding hereda esa complejidad. Se compone de 2 partes principales: (1) la funcion <em>pycurlCrawl</em> y (2) la clase <em>PyCurlParser</em>.</p>
<p><em>pycurlCrawl</em> se encarga de realizar las peticiones a cada p&#xE1;gina asignandole una instancia de <em>PyCurlParser</em> a cada peticion de curl, por &#xFA;ltimo cada instancia es encolada (se agrega a <em>queue</em>). La cola y la clase <em>PyCurlParser</em> son necesarias porque PyCurl al ser as&#xED;ncrona utiliza callbacks, pero cada peticion tarda distinto tiempo, es decir, algunas peticiones reciben archivos HTML de mayor tama&#xF1;o que otras y algunas puede incluso que fallen (pero no fallan de inmediato, primero tiene que vencerse el TIMEOUT del request). Esto crea un problema de sincronizaci&#xF3;n ya que la sentencia</p>
<pre>c.setopt(c.WRITEFUNCTION, curl_body_callback)</pre>
<p>dice a Curl que escriba el resultado de la peticion (es decir, el contenido de la p&#xE1;gina) a la funcion <em>curl_body_callback </em>la cual simplemente asigna el contenido de la p&#xE1;gina a la variable <em>contents</em>. Es importante distinguir que <em>contents</em> se llena con un buffer <em>buf</em> que es lo que envia Curl con su funcion <em>c.WRITEFUNCTION</em>. Esto se d&#xE1; porque si la p&#xE1;gina es muy grande o la conexi&#xF3;n muy lenta, necesitaremos varios chunks (buffers) para llenar todo el contenido de la p&#xE1;gina. El resultado de todo esto es que necesito asegurarme que cada peticion tenga su propia variable <em>contents</em> para que el bucle de <em>pycurlCrawl</em> siga enviando peticiones mientras cada instancia de <em>PyCurlParser</em> espera que su callback finalice. Como no s&#xE9; cuanto pueda tardar, la forma m&#xE1;s f&#xE1;cil (a mi modo de ver) es encolar todas las instancias de <em>PyCurlParser</em> para que, una vez finalizadas todas las peticiones, proceder a parsear la p&#xE1;gina y extraer sus enlaces (links), esto se hace con la funci&#xF3;n<em> PyCurlParser.parseHTML</em>. A diferencia de la version de lxml pura, aqui <em>etree.HTMLParser()</em> para parsear la p&#xE1;gina a partir de la variable tipo string <em>contents</em> para lo que hace falta StringIO que b&#xE1;sicamente es convertir un string en un stream. Tambien, a diferencia de la versi&#xF3;n de lxml puro, en esta versi&#xF3;n utilizo una expresi&#xF3;n XPath (<em>&#8216;//a&#8217;</em>) en lugar de un selector CSS para obtener todos los enlaces de cada p&#xE1;gina. La &#xFA;ltima diferencia importante es que <em>pycurlCrawl</em>, a diferencia de sus versions para urllib2 y lxml puro, no usa un bucle <em>for</em> para controlar la profundidad del crawler sino que lo hace a traves de recursi&#xF3;n</p>
<pre>pycurlCrawl(newpages,depth-1)</pre>
<p><span class="reference external">esto tambien es una consecuencia del funcionamiento as&#xED;ncrono de PyCurl.</span></p>
<p><span class="reference external">Por &#xFA;ltimo necesitamos una funci&#xF3;n que se encargar&#xE1; de medir el rendimiento de cada funci&#xF3;n. Para ello utilizamos la libreria de Python, <em>timeit</em>:</span></p>
<pre><span class="reference external">if __name__=='__main__':
&#xA0;&#xA0;&#xA0; from timeit import Timer
&#xA0;&#xA0;&#xA0; iter = int(sys.argv[1]) if len(sys.argv)==2 else 1
&#xA0;&#xA0;&#xA0; ul = Timer("crawl(['http://kiwitobes.com/wiki/Pirates_of_Silicon_Valley.html'],2)",\
&#xA0;   "from __main__ import crawl")
&#xA0;&#xA0;&#xA0; u = ul.timeit(iter)
&#xA0;&#xA0;&#xA0; lx = Timer("lxmlCrawl(['http://kiwitobes.com/wiki/Pirates_of_Silicon_Valley.html'],2)",\
   &#xA0;"from __main__ import lxmlCrawl")
&#xA0;&#xA0;&#xA0; x = lx.timeit(iter)
&#xA0;&#xA0;&#xA0; pc = Timer("pycurlCrawl(['http://kiwitobes.com/wiki/Pirates_of_Silicon_Valley.html'],2)",\
   &#xA0;"from __main__ import pycurlCrawl")
&#xA0;&#xA0;&#xA0; p = lx.timeit(iter)
&#xA0;&#xA0;&#xA0; print "Completed in: urlib: %f lxml: %f pycurl: %f" % (u,x,p)</span></pre>
<p>Para finalizar solo queda mencionar que la URL<span class="reference external"> <em>http://kiwitobes.com/wiki/</em> pertenece al blog de Toby Seagaran y es basicamente una copia est&#xE1;tica (o sea que nadie la edita) de Wikipedia. Muchos enlaces en la url que utilizo de prueba fallaran, pero esto me da una aproximaci&#xF3;n m&#xE1;s realista a lo que encontraria un crawler en condiciones reales. Para realizar el benchmark, se pone todo junto en un mismo archivo (compare.py) y desde linea de comando ejecutas:</span></p>
<pre><span class="reference external">python compare.py [iteraciones]
</span></pre>
<p><span class="reference external">El argumento <em>iteraciones</em> es opcional, debe ser un numero entero positvo (si se omite se utiliza <em>iteraciones=1</em>) y es el numero de veces que se ejecutar&#xE1; <strong>cada funci&#xF3;n</strong> antes imprimir los resultados. La raz&#xF3;n para hacer esto es que al ejecutarlo &#xFA;nicamente 1 vez el resultado de cada ejecuci&#xF3;n variaba demasiado, es decir, una vez <em>crawl</em> era la m&#xE1;s r&#xE1;pida, a la siguiente era <em>lxmlCrawl</em> la m&#xE1;s veloz, etc. por lo que decid&#xED; usar varias iteraciones y luego obtener un promedio sencillo de forma que los resultados sean </span><span class="reference external">estadisticamente</span><span class="reference external"> m&#xE1;s confiables.</span></p>
<p><span class="reference external">Al ejecutarlo con 10 iteraciones obtuve el siguiente resultado:</span></p>
<pre><span class="reference external">Completed in: urlib: 991.923360 lxml: 742.943314 pycurl: 751.931897
</span></pre>
<p><span class="reference external">es decir:</span></p>
<pre><span class="reference external">urllib: 99.192sec. lxml: 74.294sec.y pycurl: 75.193sec.
</span></pre>
<p><span class="reference external">en promedio por cada ejecuci&#xF3;n. Se aceptan sugerencia de mejora de c&#xF3;digo y si alguien obtiene resultados distintos agradeceria que los ponga en los comentarios.<br />
</span></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/toxicafunk.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/toxicafunk.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/toxicafunk.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/toxicafunk.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/toxicafunk.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/toxicafunk.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/toxicafunk.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/toxicafunk.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/toxicafunk.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/toxicafunk.wordpress.com/64/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=toxicafunk.wordpress.com&blog=16471&post=64&subd=toxicafunk&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://toxicafunk.wordpress.com/2009/03/21/benchmarks-de-lxml-urllib2-y-pycurl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05c1f4677695e182c62fc42c226ad68d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">toxicafunk</media:title>
		</media:content>
	</item>
		<item>
		<title>M&#225;s sobre Musictracker</title>
		<link>http://toxicafunk.wordpress.com/2008/10/18/ms-sobre-musictracker/</link>
		<comments>http://toxicafunk.wordpress.com/2008/10/18/ms-sobre-musictracker/#comments</comments>
		<pubDate>Sat, 18 Oct 2008 01:38:56 +0000</pubDate>
		<dc:creator>toxicafunk</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[apps]]></category>
		<category><![CDATA[pidgin. musictracker]]></category>

		<guid isPermaLink="false">http://toxicafunk.wordpress.com/2008/10/18/ms-sobre-musictracker/</guid>
		<description><![CDATA[Descubri un bug muy curioso. Resulta que el player que uso actualmente es Amarok que en principio va enfocado a KDE. Como yo uso Xubuntu (basado en XFCE) queria evitar usarlo y probe varios otros (Exaille, gMusicBrowser, Quod Libet, Rythmbox, BPMx, etc.) pero ninguno tenia el grado de estabilidad que deseaba. Banshee se acerc&#243;, pero [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=toxicafunk.wordpress.com&blog=16471&post=60&subd=toxicafunk&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Descubri un bug muy curioso. Resulta que el player que uso actualmente es <a href="http://amarok.kde.org/">Amarok</a> que en principio va enfocado a KDE. Como yo uso Xubuntu (basado en XFCE) queria evitar usarlo y probe varios otros (Exaille, gMusicBrowser, Quod Libet, Rythmbox, BPMx, etc.) pero ninguno tenia el grado de estabilidad que deseaba. Banshee se acerc&#243;, pero un dia simplemente dejo de funcionar asi que de vuelta a Amarok que la verdad sigue siendo el m&#225;s completo y estable.</p>
<p>&#160;</p>
<p>Volviendo al bug, resulta que una vez configurado Musictracker necesitas que antes de iniciar Pidgin hayas abierto Amarok (o el player que se este usando) de lo contrario Pidgin pedir&#225; su status a Amarok y al no encontralo se queda colgado&#8230;.</p>
<p>&#160;</p>
<p>La soluci&#243;n, y creo que sobra decirlo, es abrir el player antes que Pidgin.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/toxicafunk.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/toxicafunk.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/toxicafunk.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/toxicafunk.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/toxicafunk.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/toxicafunk.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/toxicafunk.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/toxicafunk.wordpress.com/60/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/toxicafunk.wordpress.com/60/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/toxicafunk.wordpress.com/60/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=toxicafunk.wordpress.com&blog=16471&post=60&subd=toxicafunk&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://toxicafunk.wordpress.com/2008/10/18/ms-sobre-musictracker/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05c1f4677695e182c62fc42c226ad68d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">toxicafunk</media:title>
		</media:content>
	</item>
		<item>
		<title>Pidgin &#8211; Musictracker</title>
		<link>http://toxicafunk.wordpress.com/2008/10/16/pidgin-musictracker/</link>
		<comments>http://toxicafunk.wordpress.com/2008/10/16/pidgin-musictracker/#comments</comments>
		<pubDate>Thu, 16 Oct 2008 15:21:57 +0000</pubDate>
		<dc:creator>toxicafunk</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[pidgin apps musictracker]]></category>

		<guid isPermaLink="false">http://toxicafunk.wordpress.com/?p=55</guid>
		<description><![CDATA[El otro d&#xED;a vi en un foro gente buscando un player de linux que tuviera plugin para actualizar el estado en Pidgin seg&#xFA;n las canciones que se escucha en el player. Amarok, entre otros tiene un plugin que hace esto, pero en estos casos es mejor aplicar el Principio Hollywood:
No nos llames que ya te [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=toxicafunk.wordpress.com&blog=16471&post=55&subd=toxicafunk&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>El otro d&#xED;a vi en un foro gente buscando un player de linux que tuviera plugin para actualizar el estado en Pidgin seg&#xFA;n las canciones que se escucha en el player. Amarok, entre otros tiene un plugin que hace esto, pero en estos casos es mejor aplicar el <a href="http://en.wikipedia.org/wiki/Hollywood_Principle" target="_blank">Principio Hollywood</a>:</p>
<pre>No nos llames que ya te llamaremos nosotros</pre>
</p>
<p>. Es decir, mejor utilizar Musictracker, un plugin de Pidgin que hace exactamente lo mismo y funciona con varios players incluyendo: Amarok, Rhythmbox, Audacious, XMMS, MPC/MPD, Exaile, Banshee y Quod Libet.</p>
<pre>apt-get install pidgin-musictracker</pre>
<p> &#xF3; sino usas Debian (o alguna variacion de Ubuntu) bajalo de su web: <a href="http://code.google.com/p/musictracker/" target="_blank">Musictracker</a>. </p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/toxicafunk.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/toxicafunk.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/toxicafunk.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/toxicafunk.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/toxicafunk.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/toxicafunk.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/toxicafunk.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/toxicafunk.wordpress.com/55/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/toxicafunk.wordpress.com/55/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/toxicafunk.wordpress.com/55/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=toxicafunk.wordpress.com&blog=16471&post=55&subd=toxicafunk&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://toxicafunk.wordpress.com/2008/10/16/pidgin-musictracker/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05c1f4677695e182c62fc42c226ad68d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">toxicafunk</media:title>
		</media:content>
	</item>
		<item>
		<title>Uno de los mejores Monitores de Sistema</title>
		<link>http://toxicafunk.wordpress.com/2008/10/16/uno-de-los-mejores-monitores-de-sistema/</link>
		<comments>http://toxicafunk.wordpress.com/2008/10/16/uno-de-los-mejores-monitores-de-sistema/#comments</comments>
		<pubDate>Thu, 16 Oct 2008 12:14:02 +0000</pubDate>
		<dc:creator>toxicafunk</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[apps]]></category>
		<category><![CDATA[gestion]]></category>
		<category><![CDATA[sistemas]]></category>

		<guid isPermaLink="false">http://toxicafunk.wordpress.com/?p=53</guid>
		<description><![CDATA[Conky  es un simple monitor de sistema para X&#8230; bueno, &#8217;simple&#8217; lo que se dice simple no tanto si tomamos encuenta lo altamente configurable que es.
Personalmente no me gusta la configuracion que trae por defecto asi que aqui dejo un par de retoques que pintan el monitor directamente en el desktop. Funciona bien contra [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=toxicafunk.wordpress.com&blog=16471&post=53&subd=toxicafunk&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://conky.sourceforge.net/">Conky </a> es un simple monitor de sistema para X&#8230; bueno, &#8217;simple&#8217; lo que se dice simple no tanto si tomamos encuenta lo altamente configurable que es.</p>
<p>Personalmente no me gusta la configuracion que trae por defecto asi que aqui dejo un par de retoques que pintan el monitor directamente en el desktop. Funciona bien contra fondos oscuros pero sino, es fácil de configurar:</p>
<pre>
alignment top_right
background no
border_width 1
cpu_avg_samples 2
default_color white
default_outline_color white
default_shade_color white
draw_borders no
draw_graph_borders yes
draw_outline no
draw_shades no
font 10x20
gap_x 5
gap_y 60
minimum_size 5 5
net_avg_samples 2
no_buffers yes
out_to_console no
own_window no
own_window_class Conky
own_window_type desktop
own_window_transparent true
stippled_borders 0
update_interval 3.0
uppercase no
use_spacer none
double_buffer yesy

TEXT
$nodename - $sysname $kernel on $machine
$hr
${color grey}Uptime:$color $uptime
${color grey}Frequency (in MHz):$color $freq
${color grey}Frequency (in GHz):$color $freq_g
${color grey}RAM Usage:$color $mem/$memmax - $memperc% ${membar 4}
${color grey}Swap Usage:$color $swap/$swapmax - $swapperc% ${swapbar 4}
${color grey}CPU Usage:$color $cpu% ${cpubar 4}
${color grey}Processes:$color $processes  ${color grey}Running:$color $running_processes
$hr
${color grey}File systems:
 / $color${fs_free /}/${fs_size /} ${fs_bar 6 /}
${color grey}Networking:
Up:$color ${upspeed eth0} k/s${color grey} - Down:$color ${downspeed eth0} k/s
$hr
${color grey}Name                  PID   CPU%   MEM%
${color lightgrey} ${top name 1} ${top pid 1} ${top cpu 1} ${top mem 1}
${color lightgrey} ${top name 2} ${top pid 2} ${top cpu 2} ${top mem 2}
${color lightgrey} ${top name 3} ${top pid 3} ${top cpu 3} ${top mem 3}
${color lightgrey} ${top name 4} ${top pid 4} ${top cpu 4} ${top mem 4}
</pre>
<p>se guarda como<em>‎~/.conkyrc</em> y luego puedes ejecutar <em>conky -d</em>. La configuracion es una pequeña modificación de la que viene por defecto. Tambien se puede hacer <em>tail</em> de algun log o ejecutar comandos con <em>exec</em>. Aqui se puede ver la lista completa de <a href="http://conky.sourceforge.net/variables.html">variables</a> y de<a href="http://conky.sourceforge.net/config_settings.html"> settings de configuración</a>.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/toxicafunk.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/toxicafunk.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/toxicafunk.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/toxicafunk.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/toxicafunk.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/toxicafunk.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/toxicafunk.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/toxicafunk.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/toxicafunk.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/toxicafunk.wordpress.com/53/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=toxicafunk.wordpress.com&blog=16471&post=53&subd=toxicafunk&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://toxicafunk.wordpress.com/2008/10/16/uno-de-los-mejores-monitores-de-sistema/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05c1f4677695e182c62fc42c226ad68d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">toxicafunk</media:title>
		</media:content>
	</item>
		<item>
		<title>Drivel</title>
		<link>http://toxicafunk.wordpress.com/2008/10/16/drivel/</link>
		<comments>http://toxicafunk.wordpress.com/2008/10/16/drivel/#comments</comments>
		<pubDate>Thu, 16 Oct 2008 12:02:24 +0000</pubDate>
		<dc:creator>toxicafunk</dc:creator>
				<category><![CDATA[Blogroll]]></category>

		<guid isPermaLink="false">http://toxicafunk.wordpress.com/?p=51</guid>
		<description><![CDATA[Probando Drivel Journal Editor desde Xubuntu 8.0.4. Recordatorio: la url de wordpress debe terminar con /xmlrpc.php
Otra cosa importante es que el type  es &#8220;Movable Type&#8221;.
       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=toxicafunk.wordpress.com&blog=16471&post=51&subd=toxicafunk&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Probando Drivel Journal Editor desde Xubuntu 8.0.4. <strong>Recordatorio</strong>: la url de wordpress debe terminar con /xmlrpc.php</p>
<p>Otra cosa importante es que el type  es &#8220;Movable Type&#8221;.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/toxicafunk.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/toxicafunk.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/toxicafunk.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/toxicafunk.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/toxicafunk.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/toxicafunk.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/toxicafunk.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/toxicafunk.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/toxicafunk.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/toxicafunk.wordpress.com/51/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=toxicafunk.wordpress.com&blog=16471&post=51&subd=toxicafunk&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://toxicafunk.wordpress.com/2008/10/16/drivel/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05c1f4677695e182c62fc42c226ad68d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">toxicafunk</media:title>
		</media:content>
	</item>
		<item>
		<title>Mas Sobre Jamendo</title>
		<link>http://toxicafunk.wordpress.com/2008/08/27/mas-sobre-jamendo/</link>
		<comments>http://toxicafunk.wordpress.com/2008/08/27/mas-sobre-jamendo/#comments</comments>
		<pubDate>Wed, 27 Aug 2008 11:45:05 +0000</pubDate>
		<dc:creator>toxicafunk</dc:creator>
				<category><![CDATA[Musica]]></category>
		<category><![CDATA[Web Related]]></category>
		<category><![CDATA[Web2.0]]></category>
		<category><![CDATA[jamendo]]></category>

		<guid isPermaLink="false">http://toxicafunk.wordpress.com/?p=47</guid>
		<description><![CDATA[Otras 2 joyas que encontre en Jamendo:

if : then :: iminami por Voodoo Economics (El nombre esta DPM!) que viene siendo PostRock Electrónico Experimental  
Embryonal Confinement por Psychocean que viene siendo Metal Progresivo pero del estilo de Tool y no el metal progresivo del estilo de Dream Theater.

Enjoy!
       [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=toxicafunk.wordpress.com&blog=16471&post=47&subd=toxicafunk&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Otras 2 joyas que encontre en <a title="Jamendo" href="http://www.jamendo.com" target="_blank">Jamendo</a>:</p>
<ol>
<li><a title="iminami - Jamendo" href="http://www.jamendo.com/es/album/29394#">if : then :: iminami</a> por <a title="Voodoo Economics - Jamendo" href="http://www.jamendo.com/es/artist/Voodoo_Economics" target="_blank">Voodoo Economics</a> (El nombre esta DPM!) que viene siendo PostRock Electrónico Experimental <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </li>
<li><a title="Embryonal Confinement - Jamendo" href="http://www.jamendo.com/es/album/9715" target="_blank">Embryonal Confinement</a> por <a title="Psychocean - Jamendo" href="http://www.jamendo.com/es/artist/psychocean" target="_blank">Psychocean</a> que viene siendo Metal Progresivo pero del estilo de Tool y no el metal progresivo del estilo de Dream Theater.</li>
</ol>
<p>Enjoy!</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/toxicafunk.wordpress.com/47/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/toxicafunk.wordpress.com/47/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/toxicafunk.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/toxicafunk.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/toxicafunk.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/toxicafunk.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/toxicafunk.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/toxicafunk.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/toxicafunk.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/toxicafunk.wordpress.com/47/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/toxicafunk.wordpress.com/47/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/toxicafunk.wordpress.com/47/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=toxicafunk.wordpress.com&blog=16471&post=47&subd=toxicafunk&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://toxicafunk.wordpress.com/2008/08/27/mas-sobre-jamendo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05c1f4677695e182c62fc42c226ad68d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">toxicafunk</media:title>
		</media:content>
	</item>
		<item>
		<title>Problemas con eclipse</title>
		<link>http://toxicafunk.wordpress.com/2008/06/13/problemas-con-eclipse/</link>
		<comments>http://toxicafunk.wordpress.com/2008/06/13/problemas-con-eclipse/#comments</comments>
		<pubDate>Fri, 13 Jun 2008 09:34:27 +0000</pubDate>
		<dc:creator>toxicafunk</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[eclipse ide java]]></category>

		<guid isPermaLink="false">http://toxicafunk.wordpress.com/2008/06/13/problemas-con-eclipse/</guid>
		<description><![CDATA[Hoy inicio eclipse y sorpresa: JVM terminated. Exit code=-1
Investigando un poco encontre una descripción y solución del problema. La solución es simplemente limpiar el archivo eclipse.ini, iniciar eclipse y luego modificar el eclipse.ini a como se tenia antes. Esto me funcionó, lo que no cuadra es que el caso en el citado blog y en [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=toxicafunk.wordpress.com&blog=16471&post=46&subd=toxicafunk&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Hoy inicio eclipse y sorpresa: <strong>JVM terminated. Exit code=-1</strong></p>
<p>Investigando un poco encontre una <a href="http://xiaoxing.wordpress.com/2007/07/25/jvm-terminated-exit-code-1/" target="_blank">descripción y solución del problema</a>. La solución es simplemente limpiar el archivo eclipse.ini, iniciar eclipse y luego modificar el eclipse.ini a como se tenia antes. Esto me funcionó, lo que no cuadra es que el caso en el citado blog y en otros describiendo similares implican que antes se instaló algun programa que tambien use Java o basado en eclipse (ya conocia yo bien los problemas de intalar WebSphere o algunas aplicaciones de Oracle que agregan su JRE propio al path lo que causa que eclipse intente iniciar con un JRE distinto al que deberia), pero el caso es que desde hace varias semanas no habia instalado nada nuevo ni en eclipse ni en el ordenador asi que, sí problema resuelto, ¿pero porque fallo?</p>
<p>La unica pista que tengo al respecto es que el dia anterior habia estado usando <a href="http://www.aptana.com/" target="_blank">Aptana</a> y <a href="http://www.adobe.com/products/flex/features/flex_builder/" target="_blank">Flex3 Builder</a>, aún así, los llevo utilizando desde hace ya varias semanas y nunca me han dado problemas. En todo caso parece que haber usado primero Aptana luego Flex Builder y por ultimo hoy Eclipse desconfiguró el eclipse.ini de eclipse.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/toxicafunk.wordpress.com/46/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/toxicafunk.wordpress.com/46/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/toxicafunk.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/toxicafunk.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/toxicafunk.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/toxicafunk.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/toxicafunk.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/toxicafunk.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/toxicafunk.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/toxicafunk.wordpress.com/46/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/toxicafunk.wordpress.com/46/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/toxicafunk.wordpress.com/46/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=toxicafunk.wordpress.com&blog=16471&post=46&subd=toxicafunk&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://toxicafunk.wordpress.com/2008/06/13/problemas-con-eclipse/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05c1f4677695e182c62fc42c226ad68d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">toxicafunk</media:title>
		</media:content>
	</item>
		<item>
		<title>Jamendo</title>
		<link>http://toxicafunk.wordpress.com/2008/05/23/jamendo/</link>
		<comments>http://toxicafunk.wordpress.com/2008/05/23/jamendo/#comments</comments>
		<pubDate>Fri, 23 May 2008 16:04:32 +0000</pubDate>
		<dc:creator>toxicafunk</dc:creator>
				<category><![CDATA[Musica]]></category>
		<category><![CDATA[creative commons]]></category>
		<category><![CDATA[jamendo]]></category>
		<category><![CDATA[open source]]></category>

		<guid isPermaLink="false">http://toxicafunk.wordpress.com/?p=45</guid>
		<description><![CDATA[Se trata de musica bajo licencia Creative Commons, puedes usarla como quieras siempre que reconozcas la autoria del grupo. Tambien es una buena forma de encontrar nueva música y una herramienta útil para promocionar tu propia música.
Me encontre esto bajo jazz experimental y me gustó mucho:
Revolution Void
GeoSuPhat
       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=toxicafunk.wordpress.com&blog=16471&post=45&subd=toxicafunk&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Se trata de musica bajo licencia Creative Commons, puedes usarla como quieras siempre que reconozcas la autoria del grupo. Tambien es una buena forma de encontrar nueva música y una herramienta útil para promocionar tu propia música.</p>
<p>Me encontre esto bajo jazz experimental y me gustó mucho:<br />
<a href="http://www.jamendo.com/album/2534?refuid=25428">Revolution Void</a><br />
<a href="http://www.jamendo.com/album/24855?refuid=25428">GeoSuPhat</a></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/toxicafunk.wordpress.com/45/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/toxicafunk.wordpress.com/45/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/toxicafunk.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/toxicafunk.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/toxicafunk.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/toxicafunk.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/toxicafunk.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/toxicafunk.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/toxicafunk.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/toxicafunk.wordpress.com/45/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/toxicafunk.wordpress.com/45/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/toxicafunk.wordpress.com/45/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=toxicafunk.wordpress.com&blog=16471&post=45&subd=toxicafunk&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://toxicafunk.wordpress.com/2008/05/23/jamendo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/05c1f4677695e182c62fc42c226ad68d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">toxicafunk</media:title>
		</media:content>
	</item>
	</channel>
</rss>