<?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>Aleph</title>
	<atom:link href="http://aleph.llull.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://aleph.llull.net</link>
	<description></description>
	<lastBuildDate>Tue, 10 Aug 2010 17:30:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>El porqué de las instancias &#8220;spot&#8221; de Amazon EC2</title>
		<link>http://aleph.llull.net/2010/08/10/el-porque-de-las-instancias-spot-de-amazon-ec2/</link>
		<comments>http://aleph.llull.net/2010/08/10/el-porque-de-las-instancias-spot-de-amazon-ec2/#comments</comments>
		<pubDate>Tue, 10 Aug 2010 17:30:11 +0000</pubDate>
		<dc:creator>Eduard</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[ec2]]></category>
		<category><![CDATA[rentabilidad]]></category>
		<category><![CDATA[spot]]></category>
		<category><![CDATA[velocity 2010]]></category>

		<guid isPermaLink="false">http://aleph.llull.net/?p=872</guid>
		<description><![CDATA[Desde que las conocí, las instancias spot de Amazon EC2 siempre me habían llamado la atención desde la perspectiva económica. Aunque me parecía una forma interesante de sacar provecho económico a un exceso de capacidad de la plataforma EC2 en horas valle, que de otra forma sería desperdiciada, no acababa de entender sus ventajas frente [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-876" src="http://assets.llull.net/wp-content/uploads/logo_aws.gif" alt="Amazon Web Services" width="164" height="60" /></p>
<p>Desde que las conocí, las <a href="http://aws.amazon.com/ec2/spot-instances/">instancias spot de Amazon EC2</a> siempre me habían llamado la atención desde la perspectiva económica. Aunque me parecía una forma interesante de sacar provecho económico a un exceso de capacidad de la plataforma EC2 en horas valle, que de otra forma sería desperdiciada, no acababa de entender sus ventajas frente a consolidar los servidores virtuales en un menor número de hosts y apagar los ociosos para ahorrar en consumo eléctrico. Siempre había supuesto, como gran parte de la industria, que el consumo eléctrico era el principal gasto en un datacenter.</p>
<p>No lo entendía hasta que hace unos días tuve la oportunidad de ver la presentación &#8220;<a title="Video de la presentación &quot;Datacenter Infrastructure Innovation&quot;" href="http://www.youtube.com/watch?v=kHW-ayt_Urk">Datacenter Infrastructure Innovation</a>&#8221; (<a title="Transperencias de la presentación &quot;Datacenter Infrastructure Innovation&quot;" href="http://mvdirona.com/jrh/TalksAndPapers/JamesHamilton_Velocity20100623.pdf">trasparencias</a>) que <a title="Blog de James Hamilton" href="http://perspectives.mvdirona.com/">James Hamilton</a> dió durante el <a href="http://en.oreilly.com/velocity2010/">Velocity 2010</a>. En su presentación realiza un estudio de los costes mensuales de un datacenter, mensualizando el coste de los servidores y de las infraestructuras de distribución y refrigeración a lo largo de sus periodos de amortización (3 y 10 años, respectivamente). De esta manera, puede comparar esos gastos con el consumo eléctrico. Y resulta que el que yo suponía era el principal gasto realmente es el tercero, siendo los dos primeros el hardware de los servidores y las infraestructuras, en ese orden.</p>
<p>Como bien explica James, consolidando y apagando hosts se ahorraría en consumo eléctrico pero, al no estar sacando ningún provecho económico al servidor físico ni a la parte proporcional de las infraestructuras de distribución y refrigeración, realmente se está perdiendo dinero. Al contrario de lo que ocurre con el consumo eléctrico, la amortización de las infraestructuras no es algo que puedas ahorrarte.</p>
<p>Pero si tienes exceso de capacidad y apagar los servidores supone realmente un gasto, ¿qué se puede hacer? Ahí es donde encajan las instancias spot. Permiten sacarle provecho al exceso de capacidad que se produce en las horas valle, a un precio que resulta atractivo a los clientes. Mientras escribo este artículo, el precio de las instancias spot es un ~60% más barato que las on-demand. Eso sí, las aplicaciones que corran en este tipo de instancias deben estar preparadas para los apagados abruptos que se producen en cuanto la demanda de instancias &#8220;normales&#8221; aumenta.</p>
<p>Instancias spot, ahorro económico para los clientes y una forma de aprovechar la capacidad sobrante para Amazon.</p>
]]></content:encoded>
			<wfw:commentRss>http://aleph.llull.net/2010/08/10/el-porque-de-las-instancias-spot-de-amazon-ec2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Origen (Inception)</title>
		<link>http://aleph.llull.net/2010/08/08/origen-inception/</link>
		<comments>http://aleph.llull.net/2010/08/08/origen-inception/#comments</comments>
		<pubDate>Sun, 08 Aug 2010 19:31:44 +0000</pubDate>
		<dc:creator>Eduard</dc:creator>
				<category><![CDATA[Cine]]></category>
		<category><![CDATA[cristopher nolan]]></category>
		<category><![CDATA[scifi]]></category>
		<category><![CDATA[sueños]]></category>
		<category><![CDATA[surrealismo]]></category>
		<category><![CDATA[thiller]]></category>

		<guid isPermaLink="false">http://aleph.llull.net/?p=881</guid>
		<description><![CDATA[Ayer Kiko y yo fuimos a ver la última película de ﻿﻿﻿﻿Christopher Nolan, el thriller de ciencia ficción &#8220;Origen&#8220;, en la que nos sumerge en la surrealista física de los sueños donde todo es posible: DiCaprio es un agente dedicado al espionaje industrial que se introduce en los sueños de sus víctimas para hacerse con sus secretos cuando [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://assets.llull.net/wp-content/uploads/cartel-origen-e1281296153109.jpg" alt="" title="Cartel &quot;Origen&quot;" width="180" height="253" class="alignright size-full wp-image-883" />Ayer Kiko y yo fuimos a ver la última película de ﻿﻿﻿﻿Christopher Nolan, el thriller de ciencia ficción &#8220;<a title="Página oficial de &quot;Origen&quot;" href="http://www.origen-es.com/">Origen</a>&#8220;, en la que nos sumerge en la surrealista física de los sueños donde todo es posible:</p>
<p>DiCaprio es un agente dedicado al espionaje industrial que se introduce en los sueños de sus víctimas para hacerse con sus secretos cuando son más vulnerables. Recibirá el encargo del que podría ser su último trabajo, pero en esta ocasión consistirá en introducir una idea en el subconsciente de su víctima.</p>
<p>Seguramente muchos de vosotros hayáis visto otras películas de este director como &#8220;<a href="http://www.otnemem.com/">Memento</a>&#8220;, &#8220;<a href="http://www.es.warnerbros.com/batmanbegins/">Batman Begins</a>&#8221; o &#8220;<a href="http://wwws.warnerbros.es/thedarkknight/">El caballero oscuro</a>&#8220;. En esta película vuelve a sorprendernos jugando con el tiempo, arquitecturas imposibles y tramas con varios niveles de profundidad, que pueden llegar a dejarte algo cansado mentalmente, pero cuya originalidad se agradece tras una larga temporada de precuelas, secuelas, adaptaciones y remakes. Igual le sobra un poco de acción pero indudablemente es la mejor película de ciencia ficción desde hace bastante tiempo.</p>
<p>Imprescindible.</p>
]]></content:encoded>
			<wfw:commentRss>http://aleph.llull.net/2010/08/08/origen-inception/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Como afecta el algoritmo al rendimiento (o resolviendo una pregunta de Google)</title>
		<link>http://aleph.llull.net/2010/04/11/como-afecta-el-algoritmo-al-rendimiento-o-resolviendo-una-pregunta-de-google/</link>
		<comments>http://aleph.llull.net/2010/04/11/como-afecta-el-algoritmo-al-rendimiento-o-resolviendo-una-pregunta-de-google/#comments</comments>
		<pubDate>Sun, 11 Apr 2010 14:35:31 +0000</pubDate>
		<dc:creator>Eduard</dc:creator>
				<category><![CDATA[Informática]]></category>
		<category><![CDATA[algoritmo]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[optimización]]></category>
		<category><![CDATA[rendimiento]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://aleph.llull.net/?p=836</guid>
		<description><![CDATA[Tras nueve meses de sequía bloguera, vuelvo con un post bastante parecido al de &#8220;Exponenciación modular&#8221; (uno de los que más visitas tiene) que toca uno de los temas que me apasionan: el rendimiento de los algoritmos. Hace bastantes meses leí, via meneame, un post con 140 preguntas que (supuestamente) Google puede hacerte en una [...]]]></description>
			<content:encoded><![CDATA[<p>Tras nueve meses de sequía bloguera, vuelvo con un post bastante parecido al de &#8220;<a href="http://aleph.llull.net/2005/10/15/exponenciacion-modular/">Exponenciación modular</a>&#8221; (uno de los que más visitas tiene) que toca uno de los temas que me apasionan: el rendimiento de los algoritmos. Hace bastantes meses leí, <a href="http://www.meneame.net/story/140-preguntas-google-puede-hacer-entrevista-trabajo">via meneame</a>, <a href="http://blog.seattleinterviewcoach.com/2009/02/140-google-interview-questions.html">un post</a> con 140 preguntas que (supuestamente) Google puede hacerte en una entrevista de trabajo. Una de esas preguntas me llamó la atención, tanto que unos cuantos compañeros del trabajo la estuvimos comentando. Te pedían que escribieras un algoritmo muy simple:</p>
<blockquote><p>Dado un array A[N] de N números. Tienes que generar un array Ouput[N] de manera que Output[i] sea la multiplicación de todos los elementos de A[N] excepto A[i]. Por ejemplo Output[0] será la multiplicación desde A[1] hasta A[N-1] y Output[1] sera la multiplicación de A[0] y desde A[2] hasta A[N-1]&#8230;</p></blockquote>
<p>En ruby es tan sencillo como:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">n = A.<span style="color:#9900CC;">length</span>
Ouput = <span style="color:#CC0066; font-weight:bold;">Array</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>i<span style="color:#006600; font-weight:bold;">|</span>
  result = <span style="color:#006666;">1</span>
  n.<span style="color:#9900CC;">times</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>j<span style="color:#006600; font-weight:bold;">|</span> result <span style="color:#006600; font-weight:bold;">*</span>= A<span style="color:#006600; font-weight:bold;">&#91;</span>j<span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#9966CC; font-weight:bold;">unless</span> j == i <span style="color:#006600; font-weight:bold;">&#125;</span>
  result
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>El problema es que la pregunta continuaba con:</p>
<blockquote><p>&#8230; hazlo en O(n) &#8230;</p></blockquote>
<p>Ups, hay que repensarlo ya que el algoritmo anterior tiene dos bucles sobre N anidados por lo que es O(n<sup>2</sup>). Se me ocurrió hacerlo precalculando el producto de todos los elementos de A[N] y hacer que Output[i] = Total / A[i]. Así queda O(n).</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">product = A.<span style="color:#9900CC;">inject</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>total, n<span style="color:#006600; font-weight:bold;">|</span> total <span style="color:#006600; font-weight:bold;">*</span> n <span style="color:#006600; font-weight:bold;">&#125;</span>
Output = A.<span style="color:#9900CC;">collect</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>n<span style="color:#006600; font-weight:bold;">|</span> product <span style="color:#006600; font-weight:bold;">/</span> n <span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>

<p>Pero faltaba un último detalle de la pregunta:</p>
<blockquote><p>&#8230; sin el operador de división.</p></blockquote>
<p>Uff, ahora se pone interesante. Tras pensarlo un poco y escribir Ouput como una matriz de los elementos a multiplicar, ví un patrón que me podía servir. La matriz está formada por dos &#8220;triángulos&#8221; (perdón si el termino no es correcto. Hay algún matemático entre la audiencia?) que llamaremos L, resaltado en azul, y R, en rojo.</p>
<pre>
Output[0]   = [<span style="color: blue;">   1</span>,<span style="color: red;"> A[1], A[2], ..., A[N-1]</span>]
Output[1]   = [<span style="color: blue;">A[0]</span>,    1,<span style="color: red;"> A[2], ..., A[N-1]</span>]
Output[2]   = [<span style="color: blue;">A[0], A[1]</span>,    1,<span style="color: red;"> ..., A[N-1]</span>]
...
Output[N-1] = [<span style="color: blue;">A[0], A[1], A[2], ...</span>,<span style="color: red;">      1</span>]
</pre>
<p>Se me ocurrió que esos dos &#8220;triángulos&#8221; o productos parciales se podían calcular a la vez en un único bucle para usarlos posteriormente para calcular Ouput[i] = L[i] * R[i] ya que:</p>
<ul>
<li>L[i] = L[i-1] * A[i-1] para i &gt; 0 (L[0] = 1)</li>
<li>R[i] = R[i+1] * A[i+1] para i &lt; N-1 (R[N-1] = 1)</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">n = A.<span style="color:#9900CC;">length</span>
left,right = <span style="color:#CC0066; font-weight:bold;">Array</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>n, <span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span>, <span style="color:#CC0066; font-weight:bold;">Array</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>n, <span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span>
1.<span style="color:#9900CC;">upto</span><span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>i<span style="color:#006600; font-weight:bold;">|</span>
  left<span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">&#93;</span>        =  left<span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">*</span> A<span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>
  right<span style="color:#006600; font-weight:bold;">&#91;</span>n<span style="color:#006600; font-weight:bold;">-</span><span style="color:#006600; font-weight:bold;">&#40;</span>i<span style="color:#006600; font-weight:bold;">+</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#93;</span> = right<span style="color:#006600; font-weight:bold;">&#91;</span>n<span style="color:#006600; font-weight:bold;">-</span>i<span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">*</span> A<span style="color:#006600; font-weight:bold;">&#91;</span>n<span style="color:#006600; font-weight:bold;">-</span>i<span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
Output = <span style="color:#CC0066; font-weight:bold;">Array</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>i<span style="color:#006600; font-weight:bold;">|</span> left<span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">*</span> right<span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>

<p>Bien, creo que al final lo hemos conseguido. Un algoritmo O(n) que no usa la división y que calcula los resultados según la formula indicada. Además, el algoritmo que usa la división tiene un problema: necesita que los elementos de A[N] sean <a href="http://es.wikipedia.org/wiki/Número_natural">números naturales</a> (es decir, que no puedan ser 0) mientras que los otros dos algoritmos no tienen esta restricción.</p>
<p>Si os estáis preguntando si realmente hay diferencia de rendimiento entre los tres algoritmos (principalmente el primero versus los otros dos), aquí tenéis un gráfico que lo demuestra.</p>
<p style="text-align: center;"><img class="size-full wp-image-854  aligncenter" title="Algorithms benchmark" src="http://assets.llull.net/wp-content/uploads/bench.jpg" alt="" width="858" height="532" /></p>
<p>Como se puede ver, a medida que el tamaño del array A[N] crece los tiempos del primer algoritmo (<em>double loop</em>) crecen exponencialmente mientras que los otros dos (<em>division</em> y <em>triangles</em>) tienen un comportamiento lineal. <strong>Por tanto, si que hay diferencia, y mucha</strong>.</p>
<p>Los datos de benchmarking para generar el gráfico con el <a href="http://www.openoffice.org/product/calc.html">OpenOffice.org Calc</a> los he obtenido he usado el siguiente script que genera CSV.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#! /usr/bin/env ruby</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'benchmark'</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> double_loop<span style="color:#006600; font-weight:bold;">&#40;</span>input<span style="color:#006600; font-weight:bold;">&#41;</span>
  n = input.<span style="color:#9900CC;">length</span>
  <span style="color:#CC0066; font-weight:bold;">Array</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>i<span style="color:#006600; font-weight:bold;">|</span>
    result = <span style="color:#006666;">1</span>
    n.<span style="color:#9900CC;">times</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>j<span style="color:#006600; font-weight:bold;">|</span> result <span style="color:#006600; font-weight:bold;">*</span>= input<span style="color:#006600; font-weight:bold;">&#91;</span>j<span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#9966CC; font-weight:bold;">unless</span> j == i <span style="color:#006600; font-weight:bold;">&#125;</span>
    result
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> division<span style="color:#006600; font-weight:bold;">&#40;</span>input<span style="color:#006600; font-weight:bold;">&#41;</span>
  product = input.<span style="color:#9900CC;">inject</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>total, n<span style="color:#006600; font-weight:bold;">|</span> total <span style="color:#006600; font-weight:bold;">*</span> n <span style="color:#006600; font-weight:bold;">&#125;</span>
  input.<span style="color:#9900CC;">collect</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>n<span style="color:#006600; font-weight:bold;">|</span> product <span style="color:#006600; font-weight:bold;">/</span> n <span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">def</span> triangles<span style="color:#006600; font-weight:bold;">&#40;</span>input<span style="color:#006600; font-weight:bold;">&#41;</span>
  n = input.<span style="color:#9900CC;">length</span>
  left,right = <span style="color:#CC0066; font-weight:bold;">Array</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>n, <span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span>, <span style="color:#CC0066; font-weight:bold;">Array</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>n, <span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  1.<span style="color:#9900CC;">upto</span><span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>i<span style="color:#006600; font-weight:bold;">|</span>
     left<span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">&#93;</span>       =  left<span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">*</span> input<span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">-</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>
    right<span style="color:#006600; font-weight:bold;">&#91;</span>n<span style="color:#006600; font-weight:bold;">-</span><span style="color:#006600; font-weight:bold;">&#40;</span>i<span style="color:#006600; font-weight:bold;">+</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#93;</span> = right<span style="color:#006600; font-weight:bold;">&#91;</span>n<span style="color:#006600; font-weight:bold;">-</span>i<span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">*</span> input<span style="color:#006600; font-weight:bold;">&#91;</span>n<span style="color:#006600; font-weight:bold;">-</span>i<span style="color:#006600; font-weight:bold;">&#93;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#CC0066; font-weight:bold;">Array</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>i<span style="color:#006600; font-weight:bold;">|</span> left<span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">*</span> right<span style="color:#006600; font-weight:bold;">&#91;</span>i<span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
t = <span style="color:#006666;">1</span>_000
max_size  = <span style="color:#006666;">250</span>
step_size = <span style="color:#006666;">10</span>
&nbsp;
step_size.<span style="color:#9900CC;">step</span><span style="color:#006600; font-weight:bold;">&#40;</span>max_size, step_size<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>n<span style="color:#006600; font-weight:bold;">|</span>
  input = <span style="color:#CC0066; font-weight:bold;">Array</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>n<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#CC0066; font-weight:bold;">rand</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">100</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#006666;">1</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
  t1 = <span style="color:#CC00FF; font-weight:bold;">Benchmark</span>.<span style="color:#9900CC;">realtime</span> <span style="color:#006600; font-weight:bold;">&#123;</span> t.<span style="color:#9900CC;">times</span> <span style="color:#006600; font-weight:bold;">&#123;</span> double_loop<span style="color:#006600; font-weight:bold;">&#40;</span>input<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#125;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
  t2 = <span style="color:#CC00FF; font-weight:bold;">Benchmark</span>.<span style="color:#9900CC;">realtime</span> <span style="color:#006600; font-weight:bold;">&#123;</span> t.<span style="color:#9900CC;">times</span> <span style="color:#006600; font-weight:bold;">&#123;</span> division<span style="color:#006600; font-weight:bold;">&#40;</span>input<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#125;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
  t3 = <span style="color:#CC00FF; font-weight:bold;">Benchmark</span>.<span style="color:#9900CC;">realtime</span> <span style="color:#006600; font-weight:bold;">&#123;</span> t.<span style="color:#9900CC;">times</span> <span style="color:#006600; font-weight:bold;">&#123;</span> triangles<span style="color:#006600; font-weight:bold;">&#40;</span>input<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#125;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;#{input.length};#{t1};#{t2};#{t3}&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Por cierto, si a alguién se le ocurre otro algoritmo que lo ponga en los comentarios.</p>
]]></content:encoded>
			<wfw:commentRss>http://aleph.llull.net/2010/04/11/como-afecta-el-algoritmo-al-rendimiento-o-resolviendo-una-pregunta-de-google/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Actualización automática de los plugins de WordPress por SSH</title>
		<link>http://aleph.llull.net/2009/07/11/actualizacion-automatica-de-los-plugins-de-wordpress-por-ssh/</link>
		<comments>http://aleph.llull.net/2009/07/11/actualizacion-automatica-de-los-plugins-de-wordpress-por-ssh/#comments</comments>
		<pubDate>Sat, 11 Jul 2009 15:09:37 +0000</pubDate>
		<dc:creator>Eduard</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[SysAdmin]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://aleph.llull.net/?p=823</guid>
		<description><![CDATA[Las versiones recientes de WordPress te permiten actualizar los plugins instalados con un simple click. Aunque interesante, nunca había usado esa funcionalidad porque requería tener instalado y configurado un servidor FTP o FTPS. Y, la verdad, me daba mucha pereza tener que mantener un servicio sólo para esto. Pero hoy, tras actualizar a la versión [...]]]></description>
			<content:encoded><![CDATA[<p>Las versiones recientes de <a href="http://wordpress.org/">WordPress</a> te permiten actualizar los <em>plugins</em> instalados con un simple <em>click</em>. Aunque interesante, nunca había usado esa funcionalidad porque requería tener instalado y configurado un servidor <acronym title="File Transfer Protocol">FTP</acronym> o <acronym title="File Transfer Protocol over SSL">FTPS</acronym>. Y, la verdad, me daba mucha pereza tener que mantener un servicio sólo para esto.</p>
<p>Pero hoy, tras actualizar a la <a href="http://wordpress.org/development/2009/07/wordpress-2-8-1/">versión 2.8.1</a>, por casualidad he lanzado un <em>grep</em> en un directorio que no tocaba y he descubierto el fichero <code>wp-admin/includes/class-wp-filesystem-ssh2.php</code>. Resulta que WordPress también puede usar <acronym title="Secure SHell">SSH</acronym> para realizar esas actualizaciones. Normalmente esa opción no aparece por que no disponemos de todo el software necesario para que funcione, pero es bastante sencillo conseguirlo. Veamos como hacerlo en una <a href="http://www.debian.org/">Debian</a>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">aptitude</span> <span style="color: #c20cb9; font-weight: bold;">install</span> libssh2-<span style="color: #000000;">1</span> libssh2-<span style="color: #000000;">1</span>-dev php5-dev
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> pecl <span style="color: #c20cb9; font-weight: bold;">install</span> <span style="color: #660033;">-f</span> ssh2
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">vi</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>php5<span style="color: #000000; font-weight: bold;">/</span>conf.d<span style="color: #000000; font-weight: bold;">/</span>ssh2.ini
    <span style="color: #007800;">extension</span>=ssh2.so
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>apache2 restart</pre></div></div>

<p>Una vez tenemos instalada la extensión <strong>ssh2.so</strong> de <a href="http://www.php.net/">PHP</a>, podemos desinstalar los paquetes de desarrollo que instalamos en el primer paso.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">aptitude</span> remove libssh2-<span style="color: #000000;">1</span> libssh2-<span style="color: #000000;">1</span>-dev php5-dev</pre></div></div>

<p>Listo, ya podemos actualizar los <em>plugins</em> desde la comodidad de nuestro navegador sin necesidad de tener un servidor FTP o FTPS. Seguramente también se puede usar para actualizar el propio WordPress, aunque no lo puedo confirmar ya que yo lo <a title="`Como usar subversion para actualizar versiones` por Perroverd" href="http://mitago.net/archives/2009/05/19/T19_32_33/index.html">actualizo usando subversión</a>.</p>
<p>Como se puede ver es bastante sencillo. De todas formas, os dejo un screencast que he hecho sobre la instalación (inaugurando mi cuenta de YouTube).</p>
<p style="text-align: center;"><span class="youtube">
<object type="application/x-shockwave-flash" width="480" height="360" data="http://www.youtube.com/v/v6IyBoLznRo&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=0&amp;fs=1&amp;hl=en&amp;autoplay=0&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0?rel=0&amp;hd=1">
<param name="movie" value="http://www.youtube.com/v/v6IyBoLznRo&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=0&amp;fs=1&amp;hl=en&amp;autoplay=0&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0?rel=0&amp;hd=1" />
<param name="allowFullScreen" value="true" />
<param name="wmode" value="transparent" />
</object>
</span><p><a href="http://www.youtube.com/watch?v=v6IyBoLznRo&fmt=18"><img src="http://img.youtube.com/vi/v6IyBoLznRo/default.jpg" width="130" height="97" border=0></a></p></p>
]]></content:encoded>
			<wfw:commentRss>http://aleph.llull.net/2009/07/11/actualizacion-automatica-de-los-plugins-de-wordpress-por-ssh/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>¿A que os recuerda este anuncio?</title>
		<link>http://aleph.llull.net/2009/06/24/a-que-os-recuerda-este-anuncio/</link>
		<comments>http://aleph.llull.net/2009/06/24/a-que-os-recuerda-este-anuncio/#comments</comments>
		<pubDate>Wed, 24 Jun 2009 08:00:57 +0000</pubDate>
		<dc:creator>Eduard</dc:creator>
				<category><![CDATA[Days go by]]></category>
		<category><![CDATA[anuncio]]></category>
		<category><![CDATA[autobus]]></category>
		<category><![CDATA[ayuntamiento]]></category>
		<category><![CDATA[emt]]></category>
		<category><![CDATA[palma]]></category>

		<guid isPermaLink="false">http://aleph.llull.net/?p=797</guid>
		<description><![CDATA[Hace unos días, mientras conducía por Palma, al pararme en un semáforo en rojo tras uno de los autobuses de la EMT vi el siguiente anuncio del ayuntamiento en su parte trasera y me recordó a algo. ¿Y a vosotros? Si ponéis el cursor sobre la imágen, veréis a que me refiero. #anuncio a {display: [...]]]></description>
			<content:encoded><![CDATA[<p>Hace unos días, mientras conducía por Palma, al pararme en un semáforo en rojo tras uno de los autobuses de la EMT vi el siguiente anuncio del ayuntamiento en su parte trasera y me recordó a algo. ¿Y a vosotros? Si ponéis el cursor sobre la imágen, veréis a que me refiero. <img src='http://aleph.llull.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>
<p id="anuncio" style="text-align: center;"><a href="http://assets.llull.net/wp-content/uploads/anuncio-duff.jpg"><img class="aligncenter size-full wp-image-798" title="Campaña &quot;He crescut&quot; del Ayuntamiento de Palma" src="http://assets.llull.net/wp-content/uploads/anuncio-autobus.jpg" alt="Campaña &quot;He crescut&quot; del Ayuntamiento de Palma" width="400" height="275" /></a></p>
<style type="text/css">
#anuncio a {display: block; width: 400px; height: 275px; background:url("http://assets.llull.net/wp-content/uploads/anuncio-duff.jpg") left top no-repeat; margin-left: auto; margin-right: auto;}
#anuncio a:hover img {position:absolute; left:-999em; top:-999em;}
#anuncio a:hover {zoom:1;}
</style>
]]></content:encoded>
			<wfw:commentRss>http://aleph.llull.net/2009/06/24/a-que-os-recuerda-este-anuncio/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ya tengo los DVD de la 1ª temporada de &#8220;The Big Bang Theory&#8221;</title>
		<link>http://aleph.llull.net/2009/06/23/ya-tengo-los-dvd-de-la-1a-temporada-de-the-big-bang-theory/</link>
		<comments>http://aleph.llull.net/2009/06/23/ya-tengo-los-dvd-de-la-1a-temporada-de-the-big-bang-theory/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 20:18:37 +0000</pubDate>
		<dc:creator>Eduard</dc:creator>
				<category><![CDATA[TV]]></category>
		<category><![CDATA[dvd]]></category>
		<category><![CDATA[geek]]></category>
		<category><![CDATA[humor]]></category>
		<category><![CDATA[serie]]></category>
		<category><![CDATA[the big bang theory]]></category>

		<guid isPermaLink="false">http://aleph.llull.net/?p=779</guid>
		<description><![CDATA[Como comenté ayer en twitter, hoy se han puesto a la venta en España los DVDs de la primera temporada de la serie &#8220;The Big Bang Theory&#8221; y me ha faltado tiempo para ir a comprármela. Es una serie genial. La mejor comedia que he visto en mucho tiempo. Para aquellos que todavía no la [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-medium wp-image-787" title="DVDs de la primera temporada de &quot;The Big Bang Theory&quot;" src="http://assets.llull.net/wp-content/uploads/bigbangtheory_dvd-214x300.jpg" alt="DVDs de la primera temporada de &quot;The Big Bang Theory&quot;" width="214" height="300" /></p>
<p>Como comenté <a href="http://twitter.com/ellull/statuses/2280539464">ayer en twitter</a>, hoy se han puesto a la venta en España los DVDs de la primera temporada de la serie &#8220;<em>The Big Bang Theory</em>&#8221; y me ha faltado tiempo para ir a comprármela. Es una serie genial. La mejor comedia que he visto en mucho tiempo.</p>
<p>Para aquellos que todavía no la conozcan, aunque eso querría decir que no habéis leído <a href="http://aleph.llull.net/2008/10/29/the-big-bang-theory/">mi post al respecto</a> de hace unos ocho meses <img src='http://aleph.llull.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  , es una seríe producida por la <a href="http://www.cbs.com/primetime/big_bang_theory/">CBS</a> que nos muestra las vivencias de cuatro científicos/geeks  con gran cociente intelectual pero escasas aptitudes sociales (y que, entre otras cosas, juegan al Scrabble Klingon) que conocen a <a href="http://en.wikipedia.org/wiki/Penny_(The_Big_Bang_Theory_character)">la nueva y atractiva vecina</a> que se acaba de mudar a Los Angeles en busca de una carrera como actriz. La interacción de esos dos mundos tan diferentes provocan situaciones francamente hilarantes.</p>
<p>Para que os hagáis una idea de  la serie, os remito a <a title="Big Bang Theory best bits - Episode 1" href="http://www.youtube.com/watch?v=ZFS1F-3XVtk">YouTube</a>. Y si estais en Facebook, os podéis hacer <a title="&quot;The Big Bang Theory&quot; en Facebook" href="http://www.facebook.com/TheBigBangTheory">fans</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://aleph.llull.net/2009/06/23/ya-tengo-los-dvd-de-la-1a-temporada-de-the-big-bang-theory/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Post número 100</title>
		<link>http://aleph.llull.net/2009/06/11/post-numero-100/</link>
		<comments>http://aleph.llull.net/2009/06/11/post-numero-100/#comments</comments>
		<pubDate>Thu, 11 Jun 2009 09:00:23 +0000</pubDate>
		<dc:creator>Eduard</dc:creator>
				<category><![CDATA[Days go by]]></category>
		<category><![CDATA[aniversario]]></category>
		<category><![CDATA[estadisticas]]></category>

		<guid isPermaLink="false">http://aleph.llull.net/?p=764</guid>
		<description><![CDATA[Aunque no soy muy dado a las celebraciones (por no celebrar, casi no celebro ni mis cumpleaños ) he pensado que estaría bien aprovechar la publicación del post número 100 para recapitular un poco lo que ha sido la irregular historia de este blog hasta el momento. El prímer artículo es de mediados de octubre [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-full wp-image-769" title="Post #100" src="http://assets.llull.net/wp-content/uploads/100posts.jpg" alt="Post #100" width="240" height="240" /></p>
<p>Aunque no soy muy dado a las celebraciones (por no celebrar, casi no celebro ni mis cumpleaños <img src='http://aleph.llull.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  ) he pensado que estaría bien aprovechar la publicación del post número 100 para recapitular un poco lo que ha sido la irregular historia de este blog hasta el momento.</p>
<p>El prímer artículo es de mediados de octubre del 2004, es decir, que en unos cuatro meses el blog cumplirá ya cinco años (jo, como pasa el tiempo), y significa que, de media, he publicado un post cada aproximadamente dos semanas y media. Pero la verdad es que he tenido grandes altibajos motivados por mi estado de ánimo. Pero a pesar de esa irregularidad en la publicación, hay cerca de 200 comentarios, una media de dos por artículo., y eso me ha hecho mucha ilusión. ¡Hay gente que lee mi blog!</p>
<p>En cuanto a visitas, según Google Analytics, tengo una media de unas 35 visitas diárias, viniendo casí todas ellas de buscadores que suponen unas 50 páginas vistas al día, siendo las más visitadas (si obviamos la página de inicio) los post de <a href="http://aleph.llull.net/2005/11/03/velocidad-de-obturacion-y-apertura/">Velocidad de obturación y apertura</a>, <a href="http://aleph.llull.net/2005/05/02/nudos-de-corbata/">Nudos de corbata</a> y <a href="http://aleph.llull.net/2005/10/15/exponenciacion-modular/">exponenciación modular</a>, cosa que encaja con las frases más usadas en los buscadores para llegar a mi web. Pero me apena un poco que ninguno de <a href="http://aleph.llull.net/tag/how-to/">mis recientes posts técnicos</a> estén en el top-10.</p>
<p>No se puede decir que sean unos grandes números (sé que si pusiera publicidad no me haría a hacer rico, pero no es esa la intención de este blog) pero me ha hecho ilusión recopilar y analizar ligeramente todos estos datos.</p>
<p>Espero algún día llegar a los 200.</p>
]]></content:encoded>
			<wfw:commentRss>http://aleph.llull.net/2009/06/11/post-numero-100/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Coraline</title>
		<link>http://aleph.llull.net/2009/06/08/coraline/</link>
		<comments>http://aleph.llull.net/2009/06/08/coraline/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 14:00:19 +0000</pubDate>
		<dc:creator>Eduard</dc:creator>
				<category><![CDATA[Literatura]]></category>
		<category><![CDATA[fantasía]]></category>
		<category><![CDATA[juvenil]]></category>
		<category><![CDATA[neil gaiman]]></category>

		<guid isPermaLink="false">http://aleph.llull.net/?p=749</guid>
		<description><![CDATA[Aprovechando el reciente estreno de la adaptación cinematográfica [IMDb][Trailer], dejadme que os presente &#8220;Coraline&#8220;: una historia de fantasía cuasi onírica en la que Coraline, una niña de 14 años que se acaba de mudar, descubre en su nueva casa un pasadizo que la llevará a otra casa increíblemente parecida a la suya pero en la [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_750" class="wp-caption alignleft" style="width: 208px"><img class="size-medium wp-image-750" title="Coraline" src="http://assets.llull.net/wp-content/uploads/coraline-cover-198x300.jpg" alt="Coraline" width="198" height="300" /><p class="wp-caption-text">Portada del libro &quot;Coraline&quot;</p></div>
<p>Aprovechando el reciente estreno de <a title="Official Coraline Movie Site" href="http://coraline.com/">la adaptación cinematográfica</a> [<a title="Coraline en IMDb" href="http://www.imdb.com/title/tt0327597/">IMDb</a>][<a title="Trailer de Coraline en YouTube" href="http://www.youtube.com/watch?v=Js7wxoqeVK0">Trailer</a>], dejadme que os presente &#8220;<em>Coraline</em>&#8220;: una historia de fantasía cuasi onírica en la que Coraline, una niña de 14 años que se acaba de mudar, descubre en su nueva casa un pasadizo que la llevará a otra casa increíblemente parecida a la suya pero en la que viven otros padres muy cariñosos, que le prestan toda la atanción, que quieren que se quede con ellos para siempre y que tienen botones por ojos. Pronto se dará cuenta que no todo es tan bonito como parece&#8230;</p>
<p>El autor del relato es <a title="Neil Gaiman's official website" href="http://www.neilgaiman.com/">Neil Gaiman</a> quien, como ya he comentado en <a title="Post &quot;Mirrormask&quot; en Aleph" href="http://aleph.llull.net/2005/05/12/mirrormask/">alguna ocasión</a>, es uno de los escritores contemporáneos de fantasía que más me gustan. Otras obras suyas son los libros &#8220;<em>American Gods</em>&#8221; y &#8220;<em>Los hijos de Anansi</em>&#8220;, el afamado cómic &#8220;<em>The Sandman</em>&#8221; y la novela gráfica &#8220;<em>Stardust</em>&#8220;, también <a title="Official Stardust Movie Site" href="http://www.stardustmovie.com/">convertida en film</a>.</p>
<p>Algo que comparten la mayoría de sus obras son su atmósfera lúgubre, como de penumbra, y unas historias que te enganchan desde el primer momento y &#8220;<em>Coraline</em>&#8221; no es diferente. Aunque está publicitada como lectura a partir de los 12 años no desmerece la lectura por un adulto. Y, a pesar de los momentos algo oscuros que podrían asustar a los jóvenes más sensibles, tiene cierta moraleja en la historia que no estaría mal que conocieran. En resumen, un libro entretenido de lectura fácil que os recomiendo a todos.</p>
<p>El libró lo editó Salamandra en el 2003 pero todavía se puede encontrar en varias <a title="Coraline en la Casa del Libro" href="http://www.casadellibro.com/libro-coraline/2900000911424">librerías</a> <a title="Coraline en Fnac" href="http://www.fnac.es/dsp/?servlet=extended.HomeExtendedServlet&amp;Code1=206874398&amp;Code2=1572&amp;prodID=428922">online</a>. También está disponible en <a title="Coraline (en Catalán) en la Casa del Libro" href="http://www.casadellibro.com/libro-coraline-catalan/2900000915238">catalán</a> de la mano de editorial Empuries.</p>
<p>Como anécdota, Gaiman ha comentado en alguna ocasión que el título viene de un error tipográfico de  Caroline que le ocurrió accidentalmente.</p>
<p>Por cierto, me apetece mucho ir a ver la película (cuya ambientación me recuerda exageradamente a &#8220;<em>Pesadilla antes de Navidad</em>&#8220;) en 3D algún día de estos. ¿Se apunta alguién?</p>
]]></content:encoded>
			<wfw:commentRss>http://aleph.llull.net/2009/06/08/coraline/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Firmas DKIM con Postfix y Amavis</title>
		<link>http://aleph.llull.net/2009/06/06/firmas-dkim-con-postfix-y-amavis/</link>
		<comments>http://aleph.llull.net/2009/06/06/firmas-dkim-con-postfix-y-amavis/#comments</comments>
		<pubDate>Sat, 06 Jun 2009 15:57:31 +0000</pubDate>
		<dc:creator>Eduard</dc:creator>
				<category><![CDATA[SysAdmin]]></category>
		<category><![CDATA[amavis]]></category>
		<category><![CDATA[correo]]></category>
		<category><![CDATA[dkim]]></category>
		<category><![CDATA[firma digital]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[postfix]]></category>

		<guid isPermaLink="false">http://aleph.llull.net/?p=730</guid>
		<description><![CDATA[Hace bastantes meses escribí un artículo sobre como configurar el SpamAssassin para que verifique las firmas DKIM para luchar contra el Spam y me quedó pendiente explicar como firmar nuestros própios correos. Por aquel entonces era más o menos complicado pero desde la release de Debian Lenny, que incluye el paquete amavisd-new 2.6.1, la tarea se [...]]]></description>
			<content:encoded><![CDATA[<p>Hace bastantes meses escribí <a title="DomainKeys Identified Mail" href="http://aleph.llull.net/2008/10/23/domainkeys-identified-mail/">un artículo</a> sobre como configurar el <a href="http://spamassassin.apache.org/">SpamAssassin</a> para que verifique las firmas <abbr title="DomainKeys Identified Mail">DKIM</abbr> para luchar contra el Spam y me quedó pendiente explicar como firmar nuestros própios correos. Por aquel entonces era más o menos complicado pero desde la <em>release</em> de <a href="http://www.debian.org/">Debian</a> <a href="http://www.debian.org/releases/lenny/">Lenny</a>, que incluye el paquete amavisd-new 2.6.1, la tarea se ha simplificado.</p>
<p>Voy a dar por sentado que tenemos un Postfix instalado y configurado para que use el Amavis para las funciones de anti-virus y anti-spam. Si no es así, te recomiendo que leas <a title="Configuración de un completo servidor de correo seguro con Postfix y Cyrus" href="http://linuxsilo.net/articles/postfix.html">el excelente artículo de Jaume Sabater</a>.</p>
<p>El primer problema lo tenemos si el mismo servidor está actuando como <abbr title="Mail eXchange">MX</abbr> y como servidor <abbr title="Simple Mail Transfer Protocol">SMTP</abbr> para nuestros usuarios: Amavis firmaría tanto los correos de nuestros usuarios como los que le llegan en su función de MX, y no es lo que queremos. Por tanto, lo primero es separar esas dos funciones (MX y submission) en el Postfix añadiendo las siguientes líneas en <code>/etc/postfix/master.cf</code> (seguramente ya haya algo parecido pero comentado)</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="postfix" style="font-family:monospace;">submission inet n       -       n       -       -       smtpd
-o smtpd_enforce_tls=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o content_filter=smtp-amavis:[127.0.0.1]:10026</pre></td></tr></table></div>

<p>Con estas líneas estamos indicándole al Postfix que también escuche por el puerto de submission (587/tcp), que por ese puerto sólo acepte correo de conexiones autentificadas y cifradas por <abbr title="Transport Layer Security">TLS</abbr>, y que debe enviar los correos recibidos al Amavis usando el puerto 10026 (mientras que el resto se seguirá enviando por el puerto 10024). Con esto conseguiremos que Amavis distinga y trate de forma diferente los correos de los usuarios.</p>
<p>Lo siguiente es hacer que Amavis también escuche por el puerto 10026 y hacer que firme los correos que le lleguen por ese puerto. Lo haremos añadiendo al fichero <code>/etc/amavis/conf.d/50-user</code>:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #0000ff;">$inet_socket_port</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">10024</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">10026</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #0000ff;">$interface_policy</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'10026'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'AUTH'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #0000ff;">$policy_bank</span><span style="color: #009900;">&#123;</span><span style="color: #ff0000;">'AUTH'</span><span style="color: #009900;">&#125;</span>   <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>           <span style="color: #666666; font-style: italic;"># Authenticated clients</span>
os_fingerprint_method   <span style="color: #339933;">=</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</span> <span style="color: #000066;">undef</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;"># don't fingerprint authenticated clients</span>
bypass_spam_checks_maps <span style="color: #339933;">=</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>   <span style="color: #666666; font-style: italic;"># don't spam check authenticated clients</span>
originating <span style="color: #339933;">=</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">,</span>
<span style="color: #666666; font-style: italic;">#</span>
<span style="color: #666666; font-style: italic;"># force MTA to convert mail to 7-bit before DKIM signing</span>
<span style="color: #666666; font-style: italic;"># to avoid later conversions which could destroy signature:</span>
smtpd_discard_ehlo_keywords <span style="color: #339933;">=</span><span style="color: #0000ff;">&amp;gt</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#91;</span><span style="color: #ff0000;">'8BITMIME'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #0000ff;">$enable_dkim_signing</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
dkim_key<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'llull.net'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'personal'</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">'/etc/dkim/llull.net.key.pem'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>En la última línea le indicamos que para el dominio &#8216;<em>llull.net</em>&#8216; y el selector &#8216;<em>personal</em>&#8216; debe firmar los correos con la clave privada contenida en el fichero <code>/etc/dkim/llull.net.key.pem</code>. Para generar ese fichero ejecutaremos como <strong>root</strong> el comando</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">server:~# amavisd-new genrsa /etc/dkim/llull.net.key.pem
Private RSA key successfully written to file &quot;/etc/dkim/llull.net.key.pem&quot; (1024 bits, PEM format)</pre></div></div>

<p>Ya sólo falta obtener y configurar en nuestro servidor <abbr title="Domain Name System">DNS</abbr> la clave pública y para ello disponemos de otro comando:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">server:~# amavisd-new showkeys
personal._domainkey.llull.net.  3600 TXT (
&quot;v=DKIM1; p=&quot;
&quot;MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDoTaWXxsXpNi100Flp7fIKJSlZ&quot;
&quot;ptMP4aCCZjUFgT7TsWokWQJhnGUNnxexEqqPtCDbCUAvEg3iieMRrKwZoHAUDqCf&quot;
&quot;fvW9dcYR7+NdnaxAXCBpOh8Wg5GFJeIid9Gsx3ByBObBQnRGSMOxdBRBO4VXwGb2&quot;
&quot;hKAIOiBMPxaFghdDZQIDAQAB&quot;)</pre></div></div>

<p>Y ya sólo falta añadir la salida del anterior comando a la zona de nuestro dominio en el servidor DNS. La salida está en formato Bind por lo que si usamos ese servidor DNS no tendremos más que añadir  ese texto en el fichero correspondiente.</p>
<p>Acordaos de reiniciar el Postfix, Amavis y Bind para que apliquen las nuevas configuraciones. Para comprobar que todo está funcionando correctamente, podemos enviar un correo a <a title="DKIM Reflectors" href="http://testing.dkim.org/reflector.html">uno de los reflectores existentes</a>.</p>
<p>Ahora ya no tenéis escusa para que vuestro servidor de correo no firme los correos salientes. Si os surge alguna duda, usad los comentarios. Aunque creo que me he acordado de todo, han pasado algunos meses desde que lo configuré y es posible que haya pasado algo por alto.</p>
<p style="text-align: right"><em>Artículo basado en <a title="Setting up DKIM mail signing and verification" href="http://www.ijs.si/software/amavisd/amavisd-new-docs.html#dkim">la documentación oficial de Amavis</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://aleph.llull.net/2009/06/06/firmas-dkim-con-postfix-y-amavis/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>All is full of love</title>
		<link>http://aleph.llull.net/2009/05/27/all-is-full-of-love/</link>
		<comments>http://aleph.llull.net/2009/05/27/all-is-full-of-love/#comments</comments>
		<pubDate>Wed, 27 May 2009 13:00:22 +0000</pubDate>
		<dc:creator>Eduard</dc:creator>
				<category><![CDATA[Cultura]]></category>
		<category><![CDATA[björk]]></category>
		<category><![CDATA[cyberpunk]]></category>
		<category><![CDATA[videoclip]]></category>

		<guid isPermaLink="false">http://aleph.llull.net/?p=720</guid>
		<description><![CDATA[Hasta ahora nunca le había dedicado un post a nada relacionado con la música. Aunque, como a todo el mundo, me gusta, no es un tema que me apasione fuertemente. Pero hoy me ha apetecido comentaros el que, según mi parecer, es uno de los mejores vídeos musicales (sin menospreciar a la canción, que es [...]]]></description>
			<content:encoded><![CDATA[<p>Hasta ahora nunca le había dedicado un post a nada relacionado con la música. Aunque, como a todo el mundo, me gusta, no es un tema que me apasione fuertemente. Pero hoy me ha apetecido comentaros el que, según mi parecer, es uno de los mejores vídeos musicales (sin menospreciar a la canción, que es el 50% del vídeo): &#8220;All is full of love&#8221; de Björk, publicada en el álbum <a title="Björk - Homogenic Album" href="http://unit.bjork.com/specials/albums/homogenic/">Homogenic</a>, y reversionada para <a title="Björk - Greatest Hits Album" href="http://unit.bjork.com/specials/gh/">el de grandes éxitos</a>.</p>
<p>Para aquellos que no la conozcáis, <a href="http://bjork.com/">Björk</a> [<a title="Björk @ Wikipedia (es)" href="http://es.wikipedia.org/wiki/Björk">wikipedia</a>] es una cantante y compositora islandesa, que también ha hecho sus pinitos como actriz, con una voz muy particular. La verdad es que no es la típica voz de cantante, pero creo que encaja bastante bien con el tipo de música que realiza: difícil de definir.</p>
<p>El vídeo tiene ya sus años (finales de los &#8217;90) pero no ha quedado en absoluto desfasado. De ambientación cyberpunk (supongo que por eso me gusta). muestra la elegante y delicada construcción de dos Björk robot que se enamoran, inmersas en un escenario muy industrial, muy <em>high-tech</em>, mientras suena una musica con ciertos toques orientales.</p>
<p>La verdad, como la descripción que he realizado no le hace justicia (por mucho que lo  intentara no creo que nunca llegara ha hacerlo) y si una imagen vale más que mil palabras entonces veinticinco por segundo valdrán muchas más, creo que lo mejor es que lo veáis y valoréis vosotros mismos. Ya me diréis que os parece.</p>
<p style="text-align: center;"><span class="youtube">
<object type="application/x-shockwave-flash" width="480" height="360" data="http://www.youtube.com/v/EjAoBKagWQA&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=0&amp;fs=1&amp;hl=en&amp;autoplay=0&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0?rel=0&amp;hd=1">
<param name="movie" value="http://www.youtube.com/v/EjAoBKagWQA&amp;color1=d6d6d6&amp;color2=f0f0f0&amp;border=0&amp;fs=1&amp;hl=en&amp;autoplay=0&amp;showinfo=0&amp;iv_load_policy=3&amp;showsearch=0?rel=0&amp;hd=1" />
<param name="allowFullScreen" value="true" />
<param name="wmode" value="transparent" />
</object>
</span><p><a href="http://www.youtube.com/watch?v=EjAoBKagWQA&fmt=18"><img src="http://img.youtube.com/vi/EjAoBKagWQA/default.jpg" width="130" height="97" border=0></a></p></p>
<p style="text-align: left;">Para los curiosos, os dejo <a title="The Making of Björk's &quot;All Is Full Of Love&quot;" href="http://www.youtube.com/watch?v=VgYGFk7pL-U">el enlace al making of</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://aleph.llull.net/2009/05/27/all-is-full-of-love/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
