<?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/"
	>

<channel>
	<title>El blog de Deigote &#187; lectores</title>
	<atom:link href="http://blog.deigote.com/tag/lectores/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.deigote.com</link>
	<description>El mundo de Deigote. Un diario de cualquier cosa que me resulte interesante (si a alguien más se lo resulta, es otro cantar). Espero que os guste o disguste. Incluso que os deje indiferentes sería una opción tan buena como cualquier otra.</description>
	<lastBuildDate>Thu, 07 Apr 2011 15:29:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Refréscame esa caché</title>
		<link>http://blog.deigote.com/2009/01/02/refrescame-esa-cache/</link>
		<comments>http://blog.deigote.com/2009/01/02/refrescame-esa-cache/#comments</comments>
		<pubDate>Fri, 02 Jan 2009 11:43:25 +0000</pubDate>
		<dc:creator>Deigote</dc:creator>
				<category><![CDATA[Informática, internet y tecnología]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[awk]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[dreamhost]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[lectores]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[servidor web]]></category>
		<category><![CDATA[sitemap]]></category>
		<category><![CDATA[url]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[wpcache]]></category>
		<category><![CDATA[wpsupercache]]></category>

		<guid isPermaLink="false">http://blog.deigote.com/?p=289</guid>
		<description><![CDATA[Wordpress, el CMS que uso para gestionar mi blog, dispone de varios plugins para acelerar su carga mediante cachés, algo muy necesario en general, y más si, como yo, eres usuario de un servicio de hosting barato.
En mi caso, el plugin de caché que estoy usando es WPSuperCache, que guarda una copia estática de cada [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://wordpress.org">Wordpress</a>, el <a href="http://es.wikipedia.org/wiki/CMS">CMS</a> que uso para gestionar mi blog, dispone de varios plugins para acelerar su carga mediante <a href="http://es.wikipedia.org/wiki/Cache">cachés</a>, algo muy necesario en general, y más si, como yo, eres usuario de <a href="http://blog.deigote.com/about/#dreamhost">un servicio de hosting barato</a>.</p>
<p>En mi caso, el plugin de caché que estoy usando es <a href="http://wordpress.org/extend/plugins/wp-super-cache/">WPSuperCache</a>, que guarda una copia estática de cada página generada por Wordpress, y la sirve directamente en próximas peticiones, siempre y cuando el usuario no esté registrado. Esto evita todas las peticiones contra la base de datos por parte de Wordpress. Además, opcionalmente, el plugin permite guardar las páginas estáticas con una estructura de directorios equivalente a la URL que las representa, y proporciona <a href="http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html">reescrituras de URL</a> para llegar a dichas páginas directamente, evitando toda intervención por parte de Wordpress (y evitando, por lo tanto, la ejecución de código PHP en el servidor). Finalmente, además, te da la opción de guardar los archivos HTML comprimidos con <a href="http://es.wikipedia.org/wiki/Gzip">GZip</a>. Todas estas opciones aceleran notablemente la carga de la página, puesto que el único trabajo que debe realizarse es el del servidor web: encontrar la página html y servirla.</p>
<p><a href="http://wordpress.org/extend/plugins/wp-super-cache/">WPSuperCache</a>, como la mayoría de plugins de caché, cuenta con un borrado automático de la caché cada cierto tiempo. Cada vez que se ejecuta esta tarea, las siguientes peticiones (si las hay <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':-D' title=':-D' class='wp-smiley smiley-2' /> ) a las distintas páginas del blog harán que se regenere la caché automáticamente.</p>
<p>Sin embargo, cuando tienes pocas visitas, no es buena idea hacer que la caché sea regenerada por los lectores. En ese caso, el mío <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':-)' title=':-)' class='wp-smiley smiley-19' /> , es probable que un lector obtenga una página no cacheada en vez de una que sí lo está. Una posiblidad es aumentar en gran medida el intervalo de borrado de la caché, pero en general es preferible tener una caché actualizada. La otra posiblidad es, además de borrar la caché, regenerarla automáticamente, de tal manera que todos los lectores del blog se beneficien de la caché del mismo.</p>
<p>En mi caso, he escrito un script que visita todos los enlaces de una página web basándose en el <a href="http://es.wikipedia.org/wiki/Site_map">sitemap</a> de la misma, siempre que este cumpla el <a href="http://www.sitemaps.org/protocol.php">protocolo descrito por Sitemaps.org</a>. El código es el siguiente:</p>
<pre><code>#!/bin/bash
# Visit all the links provided by a sitemap file.
# Diego Toharia - http://blog.deigote.com

# Verify parameter
if [[ $# -ne 1 ]] ; then
    echo "Error: first parameter (sitemap URL) missing"
    echo "Usage: `basename $0` "
    exit 1
fi

url=$1
links=`wget -q -O - http://blog.deigote.com/sitemap.xml | awk '{ print $1 }' | grep "^http" | awk 'BEGIN { FS="&gt;" } { print $2 }' | awk 'BEGIN { FS="&lt;" } { print $1 }'`

for i in $links ; do
	echo "Visiting " $i
	wget -q -O - $i &gt; /dev/null
done
</code></pre>
<p>Seguro que hay formas más elegantes de hacerlo, pero awk es tan potente que es difícil resistirse a usarlo <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':-D' title=':-D' class='wp-smiley smiley-2' /> . Lo he llamado <a href="http://deigote.com/scripts/visit_site_by_sitemap">visit_site_by_sitemap</a>, original que es uno <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':roll:' title=':roll:' class='wp-smiley smiley-17' /> .</p>
<p>Una vez tenemos el script, lo más fácil es programar una tarea del cron que cada cierto tiempo (preferiblemente, en franjas horarias con el menor tráfico posible) borre la caché y ejecute el script pasándole como parámetro la URL del sitemap. Por cierto que, en mi caso, el sitemap lo genera el plugin <a href="http://wordpress.org/extend/plugins/google-sitemap-generator/">Google Sitemap Generator</a>. El mandato para la regla en mi caso sería algo como:</p>
<pre><code>cd path/al/blog/wp-content ; find cache -type f -name '*.html' -exec rm {} \; -o -name '*.gz' -exec rm {} \; ; ~/bin/visit_site_by_sitemap http://blog.deigote.com/sitemap.xml
</code></pre>
<p>La idea es borrar todos los ficheros html y gz generados por la caché y regenerar la misma visitando todos los enlaces proporcionados por el sitemap del blog.</p>
<p>Podemos hacer un par de pruebas que, sin ser demasiado científicas, nos dan una idea del beneficio que obtenemos. La primera sería ejecutar en local el script dos veces, previo borrado de la caché. La primera visitaría todos los enlaces sin disponer de caché, mientras que la segunda lo haría usando la caché.</p>
<pre><code>$ cd path/al/blog/wp-content
$ find cache -type f -name '*.html' -exec rm {} \; -o -name '*.gz' -exec rm {} \;
$ time ~/bin/visit_site_by_sitemap http://blog.deigote.com/sitemap.xml
Visiting  http://blog.deigote.com/
...
real    4m12.102s
$ time ~/bin/visit_site_by_sitemap http://blog.deigote.com/sitemap.xml
Visiting  http://blog.deigote.com/
...
real	0m7.759s
</code></pre>
<p>Podemos ver que los resultados son espectaculares. De 4 minutos hemos pasado a 7 segundos. Sin embargo, estamos probando el caso óptimo, en el que la latencia es mínima y la velocidad de conexión con el servidor web es máxima, lo que hacen que la capacidad de proceso sea el único parámetro que influye en los resultados.</p>
<p>Si ejecutamos esta misma prueba en una máquina externa y situada en España, la misma desde la que estoy escribiendo, obtenemos unos resultados bien distintos: casi trece minutos (12m45) frente a casi 9 (8m44s).</p>
<p>Sin embargo, esto es culpa de la lamentable latencia y velocidad de conexión que Dreamhost tiene en España, ya que ejecutando la prueba en una máquina situada en USA (y de otro servicio de hosting distinto), se obtienen 3 minutos (3m02s) frente a 22 segundos, resultados más parecidos a la ejecución en local. Tendré que pensar seriamente en cambiar de hosting <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':cry:' title=':cry:' class='wp-smiley smiley-5' /> .</p>
<p>La otra prueba que se puede hacer es algo más realista: medir el tiempo de descarga de una única página, que es lo que hace un usuario cualquiera (no creo que tenga ningún lector tan fan como para visitarse todas las entradas del blog una detrás de otra <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':lol:' title=':lol:' class='wp-smiley smiley-10' /> ). En mi caso, he usado un navegador <a href="http://www.mozilla-europe.org/es/firefox/">Firefox</a> con la caché deshabilitada y con la extensión <a href="https://addons.mozilla.org/es-ES/firefox/addon/1843">Firebug</a> instalada, usando la pestaña Red de dicha extensión para medir el tiempo de carga del HTML de la página de inicio. He realizado varias pruebas con la caché vacía y con la caché llena y he obtenido de media unos 2.5 segundos frente a medio segundo respectivamente, lo cual no está mal. Sin embargo, el resto de elementos de la página (malditos emoticonos <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':evil:' title=':evil:' class='wp-smiley smiley-7' /> ) ralentiza la carga total de la misma en gran medida, aunque eso es otra historia <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':-)' title=':-)' class='wp-smiley smiley-19' /> .</p>
<p>Gracias a Álvaro por su inestimable ayuda a la hora de lanzar el <em>juego de pruebas</em> <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':P' title=':P' class='wp-smiley smiley-15' /> en un servidor externo a españa.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.deigote.com/2009/01/02/refrescame-esa-cache/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Subdominio o subdirectorio, esa era la cuestión</title>
		<link>http://blog.deigote.com/2008/09/03/subdominio-o-subdirectorio-esa-era-la-cuestion/</link>
		<comments>http://blog.deigote.com/2008/09/03/subdominio-o-subdirectorio-esa-era-la-cuestion/#comments</comments>
		<pubDate>Wed, 03 Sep 2008 16:27:58 +0000</pubDate>
		<dc:creator>Deigote</dc:creator>
				<category><![CDATA[Informática, internet y tecnología]]></category>
		<category><![CDATA[deigote]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[lectores]]></category>
		<category><![CDATA[mod rewrite]]></category>
		<category><![CDATA[mod_rewrite]]></category>
		<category><![CDATA[rewriterule]]></category>
		<category><![CDATA[servidor web]]></category>
		<category><![CDATA[url]]></category>
		<category><![CDATA[url rewriting]]></category>

		<guid isPermaLink="false">http://blog.deigote.com/?p=212</guid>
		<description><![CDATA[Mis lectores más observadores (y el único con el que he hablado del tema no ha demostrado serlo  te espero en los comentarios) habrán notado que el nuevo blog está alojado en una URL distinta al anterior: ahora está en blog.deigote.com mientras que antes era deigote.com/blog.
Sin embargo, es muy probable que la entrada en [...]]]></description>
			<content:encoded><![CDATA[<p>Mis lectores más observadores (y el único con el que he hablado del tema no ha demostrado serlo <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':P' title=':P' class='wp-smiley smiley-15' /> te espero en los comentarios) habrán notado que el nuevo blog está alojado en una URL distinta al anterior: ahora está en <a href="http://blog.deigote.com">blog.deigote.com</a> mientras que antes era <a href="http://deigote.com/blog">deigote.com/blog</a>.</p>
<p>Sin embargo, es muy probable que la entrada en la que se anuncia el nuevo blog, la cual está en el nuevo blog ( <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':roll:' title=':roll:' class='wp-smiley smiley-17' /> ). ¿Cómo es posible que si la URL ha cambiado los enlaces para el feed sigan siendo válidos? O una de dos: o mis lectores son muy poco observadores o pasotas, o tengo muy pocos lectores <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':-D' title=':-D' class='wp-smiley smiley-2' /> (yo pienso que es una mezcla de los dos <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':cry:' title=':cry:' class='wp-smiley smiley-5' /> )</p>
<p>Volviendo a la pregunta anterior, la respuesta es haber usado un simple <em><a title="URL rewriting en la wikipedia" href="http://en.wikipedia.org/wiki/Rewrite_engine">URL rewriting</a></em> gracias al módulo <a title="Módulo mod_rewrite" href="http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html">mod_rewrite</a> de <a title="Servidor web Apache" href="http://httpd.apache.org/">Apache</a>. Gracias a este módulo, es posible reescribir una URL cuando esta llega al servidor web, cambiando las cabeceras de la petición, y redirigiéndola a donde corresponde tras realizar el cambio.</p>
<p>En mi caso, he necesitado las siguientes reglas para el dominio deigote.com:</p>
<p><code>RewriteRule ^blog$ http://blog.deigote.com [L]<br />
RewriteRule ^blog/(.*) http://blog.deigote.com/$1 [L]</code></p>
<p>La primera de ellas sirve para cuando la URL entrante es <em>http://deigote.com/blog</em> (sin un <em>slash</em> o barra del siete <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':-)' title=':-)' class='wp-smiley smiley-19' /> al final). La segunda sirve para el resto de URLs que comiencen por <em>http://deigote.com/blog</em>. Seguro que algún lector (la esperanza es lo último que se pierde <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':lol:' title=':lol:' class='wp-smiley smiley-10' /> ) está pensando que ambas reglas se podrían fusionar en una como la siguiente:</p>
<p><code>RewriteRule ^blog(.*) http://blog.deigote.com$1 [L]</code></p>
<p>Es decir, eliminando los <em>slash</em> en la segunda regla para que englobe también el primer caso. El problema de hacer esto es que una URL del tipo <em>http://deigote.com/blogstats</em> sería redirigida a <em>http://blog.deigote.comstats</em>. Por ello, es mejor proteger todas las URLs con un <em>slash</em> al final y añadir una regla para el único caso en que no hace falta poner dicha barra (aunque quizá <a title="Ruido blanco" href="http://ruido-blanco.net/blog">algún lector</a> me corrija en este punto dándome una solución para unificar ambas reglas <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':-)' title=':-)' class='wp-smiley smiley-19' /> ).</p>
<p>De esta manera, todos los enlaces anteriores, ya sean los del feed, entradas, comentarios, etcétera&#8230; siguen funcionando correctamente <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':-)' title=':-)' class='wp-smiley smiley-19' /> .</p>
<p>PD: Si, tampoco es algo tan increible como para hacer una entrada tan larga, pero bueno, a mi me ha costado lo mío <img src='http://blog.deigote.com/wp-includes/images/blank.gif' alt=':-P' title=':-P' class='wp-smiley smiley-15' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.deigote.com/2008/09/03/subdominio-o-subdirectorio-esa-era-la-cuestion/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
