<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.0" -->
<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/"
	>

<channel>
	<title>diego sevilla's weblog</title>
	<link>http://neuromancer.inf.um.es/blog</link>
	<description>Random comments, CORBA, CCM...</description>
	<pubDate>Mon, 01 Mar 2010 13:03:11 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.0</generator>
	<language>en</language>
			<item>
		<title>Más de bases de datos NoSQL: Consistent Hashing</title>
		<link>http://neuromancer.inf.um.es/blog/?p=1287</link>
		<comments>http://neuromancer.inf.um.es/blog/?p=1287#comments</comments>
		<pubDate>Mon, 01 Mar 2010 12:56:42 +0000</pubDate>
		<dc:creator>Diego Sevilla</dc:creator>
		
	<category>General</category>
		<guid isPermaLink="false">http://neuromancer.inf.um.es/blog/?p=1287</guid>
		<description><![CDATA[Ahondando más en el tema de las bases de datos que no usan SQL, que nos interesan al grupo por cuestiones bastante diferentes (como por ejemplo, cómo representar tipos complejos e incluso XML usando estructuras JSON), encuentro en Hacker Medley una referencia a varios artículos. En particular, el que explica el algoritmo que se utilza [...]]]></description>
			<content:encoded><![CDATA[<p>Ahondando más en el tema de las bases de datos que no usan SQL, que nos interesan al grupo por cuestiones bastante diferentes (como por ejemplo, cómo representar tipos complejos e incluso XML usando estructuras JSON), encuentro en <a href="http://hackermedley.org/archives/51">Hacker Medley</a> una referencia a varios artículos. En particular, el que explica el algoritmo que se utilza en <a href="http://s3.amazonaws.com/AllThingsDistributed/sosp/amazon-dynamo-sosp2007.pdf">Dynamo</a>, la base de datos escalable interna de Amazon, que mueve desde los carros de la compra hasta las bases de datos como S3: <a href="http://www.tomkleinpeter.com/2008/03/17/programmers-toolbox-part-3-consistent-hashing/">Consistent Hashing</a>. Me ha parecido interesante y lo guardo aquí para referencia futura. El artículo es divertido, y tiene frases como esta:</p>
<blockquote><p><em>Now imagine hashing resources into points on the circle. They could be URLs, GUIDs, integer IDs, or any arbitrary sequence of bytes. Just run them through MD5 or SHA and shave off everything but 8 bytes (and if anyone tells you that you shouldn’t use MD5 for this because it isn’t secure, just nod and back away slowly. You have identified someone not worth arguing with). [&#8230;]</em></p></blockquote>
]]></content:encoded>
			<wfw:commentRSS>http://neuromancer.inf.um.es/blog/?feed=rss2&amp;p=1287</wfw:commentRSS>
		</item>
		<item>
		<title>NoSQL databases</title>
		<link>http://neuromancer.inf.um.es/blog/?p=1286</link>
		<comments>http://neuromancer.inf.um.es/blog/?p=1286#comments</comments>
		<pubDate>Tue, 23 Feb 2010 11:28:57 +0000</pubDate>
		<dc:creator>Diego Sevilla</dc:creator>
		
	<category>General</category>
		<guid isPermaLink="false">http://neuromancer.inf.um.es/blog/?p=1286</guid>
		<description><![CDATA[Una tendencia muy a tener en cuenta últimamente. Un estupendo artículo comparando las alternativas. En ese mismo blog, una comparación entre Groovy, Scala y Clojure.

]]></description>
			<content:encoded><![CDATA[<p>Una tendencia muy a tener en cuenta últimamente. Un <a href="http://www.vineetgupta.com/2010/01/nosql-databases-part-1-landscape.html">estupendo artículo</a> comparando las alternativas. En ese mismo blog, <a href="http://www.vineetgupta.com/2009/12/groovy-scala-and-clojure-comparison_3480.html">una comparación entre Groovy, Scala y Clojure</a>.
</p>
]]></content:encoded>
			<wfw:commentRSS>http://neuromancer.inf.um.es/blog/?feed=rss2&amp;p=1286</wfw:commentRSS>
		</item>
		<item>
		<title>Primera aproximación de un mecanismo de actores para C++</title>
		<link>http://neuromancer.inf.um.es/blog/?p=1284</link>
		<comments>http://neuromancer.inf.um.es/blog/?p=1284#comments</comments>
		<pubDate>Tue, 09 Feb 2010 12:34:24 +0000</pubDate>
		<dc:creator>Diego Sevilla</dc:creator>
		
	<category>General</category>
	<category>español</category>
	<category>código/code</category>
	<category>free software/software libre</category>
		<guid isPermaLink="false">http://neuromancer.inf.um.es/blog/?p=1284</guid>
		<description><![CDATA[Desde hace tiempo quiero escribir esta entrada, pero por falta de tiempo no he podido. El mecanismo de actores se utiliza en lenguajes de programación como Erlang y Scala para sincronizar diferentes «actores» que están funcionando en el sistema. Tradicionalmente, la programación con hilos (salvo en casos como BSP, por ejemplo) se ha realizado básicamente [...]]]></description>
			<content:encoded><![CDATA[<p>Desde hace tiempo quiero escribir esta entrada, pero por falta de tiempo no he podido. El mecanismo de actores se utiliza en lenguajes de programación como Erlang y Scala para sincronizar diferentes «actores» que están funcionando en el sistema. Tradicionalmente, la programación con hilos (salvo en casos como BSP, por ejemplo) se ha realizado básicamente como la programación monoproceso, pero haciendo que el programador tuviera en la cabeza las posibles colisiones que varios hilos ejecutando un código podrían tener.</p>
<p>La otra cara de esta moneda la han tenido lenguajes y paradigmas que cambiaban la manera de programación hacia esquemas que hicieran más fácil escalar en el número de hilos/cores a la vez que permitían una programación más natural de programas multihilo. Estos nuevos paradigmas también evitaban, por diseño, los problemas que se dan con los candados, reentrancia, etc.</p>
<p>El paradigma sobre el que hablaré hoy es el de los actores. Este mecanismo, que data de 1986, se utiliza en Erlang y en <a href="http://lamp.epfl.ch/~phaller/doc/haller07coord.pdf">Scala</a>, por ejemplo, pero no he encontrado ejemplos de cómo implementar este mecanismo en C++, salvo un <a href="http://people.cs.vt.edu/~kafura/PreviousPapers/act++-joop93.pdf">artículo de 1993 de Kafura, Mukherji y Lavender</a> en el que no se hace uso de ninguna característica «moderna» de C++, como los tipos parametrizados o la sobrecarga de operadores.</p>
<p>En resumen, el mecanismo de actores se basa en definir un actor como un objeto reactivo que se ejecuta en su propio hilo. Son similares a los objetos <em>stricto sensu</em>, en el sentido de que se les puede enviar invocaciones (en mi caso eventos), y los actores responden ejecutándolos, como los objetos normales. No obstante, son diferentes porque las invocaciones se ejecutan de manera que no causan problemas de concurrencia. ¿Cómo? Pues asegurando que todas las invocaciones sobre un actor se ejecutan en un mismo hilo. En este sentido, un actor también aglutina, en general, un hilo de ejecución propio en el que se ejecutan las llamadas al mismo (esto puede no ser así exactamente, pero la idea es la misma).</p>
<p>Existe una diferencia con los paradigmas tradicionales de programación. Por ejemplo, para no causar problemas de concurrencia, todos los métodos de un objeto se podrían marcar como «<code>synchronized</code>» al estilo de Java. Esto, efectivamente, hace que no haya problemas de concurrencia (al menos los más usuales), ya que todas las invocaciones a un objeto se realizan en exclusión mutua. Sin embargo, una invocación a objeto normal lleva consigo asociada un hilo de ejecución, y el hilo de ejecución del objeto llamante es el que realiza la llamada al objeto llamado, con lo que también se tienen que prevenir problemas como interbloqueos, esperas de candados, etc.</p>
<p>En resumen, sería casi como un sistema basado en eventos en donde los objetos se envían mensajes que son a su vez procesados en los hilos respectivos de cada actor. Ahora bien, ¿cómo implementar en C++ este mecanismo sin ser excesivamente intrusivo, teniendo en cuenta que el mecanismo de envío de eventos no existe en C++? Pensé en utilizar <code>boost.signal</code>, pero éste no asegura que el objeto receptor va a ejecutar la señal en su propio hilo. Los requisitos que establecí pues para el desarrollo fueron los siguientes:</p>
<ol>
<li>El mecanismo debe ser poco intrusivo, en el sentido de que las clases que quieran beneficiarse de este mecanismo no tienen por qué escribirse heredando de un interfaz en particular, sino que sólo tienen que definir una serie de tipos para saber tratarlas como actor.
</li>
<li>Cualquier clase puede definir de manera sencilla qué eventos puede recibir y cómo actuará ante cualquier evento, y estos serán los únicos requisitos que tendrá que especificar la clase.</li>
<li>Las clases pueden modificar de forma sencilla qué eventos producen y reciben.</li>
<li>Las clases no tendrán que preocuparse de tratar con hilos, asincronía, almacenamiento y reproducción de eventos, etc.
</li>
<li>El mecanismo de envío de eventos debe estar integrado en el lenguaje C++ de forma natural. Por ejemplo, con un operador que muestre que se está enviando un evento: <code>objeto < < mensaje;</code>.</code></li>
</ol>
<p>Con estos requisitos, pensé hacer la clase <code>actor</code> que pudiera aceptar como parámetro cualquier otra clase, y convertirla así en un actor. Este mecanismo es poco intrusivo, sólo obligando a que la clase que se quiere beneficiar de este mecanismo especifique qué eventos es capaz de recibir. La clase actor que me quedó fue la siguiente, con comentarios al estilo de la <em>literate programming</em> (si alguien está interesado le puedo pasar el código sin los comentarios):</p>
<pre>
<span style="color: #6495ed; font-weight: bold;">template</span> &lt;<span style="color: #6495ed; font-weight: bold;">typename</span> <span style="color: #9290ff;">Klass</span>&gt;
<span style="color: #6495ed; font-weight: bold;">struct</span> <span style="color: #9290ff;">actor</span>
{
    <span style="color: #6495ed; font-weight: bold;">typedef</span> <span style="color: #6495ed; font-weight: bold;">typename</span> <span style="color: #9932cc; font-weight: bold;">Klass</span>::<span style="color: #9290ff;">events_type</span> <span style="color: #9290ff;">VariantType</span>;
</pre>
<p>Uno de los requisitos que tiene que proveer la clase que se va a convertir en actor es ofrecer el tipo <code>VariantType</code> con los distintos eventos que va a poder recibir. Para esto se usará el tipo <code>boost.variant</code> como se verá después.</p>
<pre>
    <span style="color: #6495ed; font-weight: bold;">typedef</span> <span style="color: #9290ff;">actor</span>&lt;<span style="color: #9290ff;">Klass</span>&gt; <span style="color: #9290ff;">self</span>;

    <span style="color: #87ceeb;">actor</span> (<span style="color: #9290ff;">Klass</span>&amp; <span style="color: #98fb98;">a</span>)
        : delegate_ (a)
    {
        thread_ = <span style="color: #9932cc; font-weight: bold;">boost</span>::thread (<span style="color: #9932cc; font-weight: bold;">boost</span>::ref (*<span style="color: #6495ed; font-weight: bold;">this</span>));
    }
</pre>
<p>Cada actor posee su propio hilo. Esto, por supuesto puede modificarse después. Sólo quería hacer una prueba de concepto. En scala existen <em>schedulers</em> que enlazan actores con hilos.</p>
<pre>
    <span style="color: #66cdaa;">// </span><span style="color: #66cdaa;">Thread func.
</span>    <span style="color: #9290ff;">void</span> <span style="color: #6495ed; font-weight: bold;">operator</span><span style="color: #87ceeb;">()</span>()
    {
        <span style="color: #9932cc; font-weight: bold;">std</span>::cout &lt;&lt; <span style="color: #32cd32;">&#8220;running thread&#8221;</span> &lt;&lt; <span style="color: #9932cc; font-weight: bold;">std</span>::endl;

        <span style="color: #6495ed; font-weight: bold;">while</span>(!stop_)
        {
            <span style="color: #9290ff;">bool</span> <span style="color: #98fb98;">b</span>;
            {
                <span style="color: #9932cc; font-weight: bold;">boost</span>::<span style="color: #9290ff;">lock_guard</span>&lt;<span style="color: #9932cc; font-weight: bold;">boost</span>::mutex&gt; <span style="color: #98fb98;">guard</span> (list_mutex_);
                b = el_.empty();
            }

            <span style="color: #6495ed; font-weight: bold;">if</span> (b)
            {
                <span style="color: #9932cc; font-weight: bold;">boost</span>::<span style="color: #9290ff;">unique_lock</span>&lt;<span style="color: #9932cc; font-weight: bold;">boost</span>::mutex&gt; <span style="color: #98fb98;">lock</span> (mut_);

                <span style="color: #66cdaa;">// </span><span style="color: #66cdaa;">wait on the cond. var.
</span>                cond_.wait (lock);
            }

            <span style="color: #6495ed; font-weight: bold;">while</span> (<span style="color: #9932cc; font-weight: bold;">true</span>)
            {
                <span style="color: #9290ff;">VariantType</span> <span style="color: #98fb98;">vtv</span>;
                {
                    <span style="color: #9932cc; font-weight: bold;">boost</span>::<span style="color: #9290ff;">lock_guard</span>&lt;<span style="color: #9932cc; font-weight: bold;">boost</span>::mutex&gt; <span style="color: #98fb98;">guard</span> (list_mutex_);
                    <span style="color: #6495ed; font-weight: bold;">if</span> (el_.empty())
                        <span style="color: #6495ed; font-weight: bold;">break</span>;

                    vtv = el_.front();
                    el_.pop_front();
                }

                <span style="color: #66cdaa;">// </span><span style="color: #66cdaa;">Call the delegate without holding the mutex locked
</span>                <span style="color: #9932cc; font-weight: bold;">boost</span>::apply_visitor (<span style="color: #9932cc; font-weight: bold;">detail</span>::<span style="color: #9290ff;">event_caller</span>&lt;Klass&gt; (<span style="color: #98fb98;">delegate_</span>),
                                      vtv);
            }
        }
    }
</pre>
<p>El <code>operator()()</code> de la clase actor ejecuta el código del hilo. He utilizado variables de condición porque me parecen más ricas semánticamente. El hilo básicamente extrae eventos de la cola de eventos y los ejecuta sobre el delegate. Como los eventos de la cola pueden ser de diferentes <em>tipos</em> (nótese que este punto es especialmente difícil en C++), hay que utilizar estructuras que permitan tratar diferentes tipos de eventos de forma genérica. Para eso he usado la construcción <code>boost::apply_visitor</code> de <code>boost.variant</code>. Con el uso de una clase especial, <code>detail::event_caller</code>, que se verá más abajo, se consigue llamar a la clase original, a los métodos <code>process(Evento)</code>, para cada uno de los eventos recibidos.</p>
<pre>
    <span style="color: #6495ed; font-weight: bold;">template</span> &lt;<span style="color: #6495ed; font-weight: bold;">typename</span> <span style="color: #9290ff;">Event</span>&gt;
    <span style="color: #9290ff;">self</span>&amp; <span style="color: #6495ed; font-weight: bold;">operator</span><span style="color: #87ceeb;">&lt;&lt;</span>(<span style="color: #9290ff;">Event</span>&amp; <span style="color: #98fb98;">e</span>)
    {
        <span style="color: #9932cc; font-weight: bold;">std</span>::cout &lt;&lt; <span style="color: #32cd32;">&#8220;Received event&#8221;</span> &lt;&lt; <span style="color: #9932cc; font-weight: bold;">std</span>::endl;
        {
            <span style="color: #9932cc; font-weight: bold;">boost</span>::<span style="color: #9290ff;">lock_guard</span>&lt;<span style="color: #9932cc; font-weight: bold;">boost</span>::mutex&gt; <span style="color: #98fb98;">lock</span> (list_mutex_);
            el_.push_back (e);
        }

        <span style="color: #66cdaa;">// </span><span style="color: #66cdaa;">signal that a new event is available
</span>        cond_.notify_one();

        <span style="color: #6495ed; font-weight: bold;">return</span> *<span style="color: #6495ed; font-weight: bold;">this</span>;
    }
</pre>
<p>El operador <code>&lt;&lt;</code> se puede usar para enviar un evento al actor. Esta es una construcción que queda muy natural. Enviar un mensaje es diferente a realizar una llamada, aunque también se puede pensar en un mecanismo de llamada a función modificado. Al final, el envío de mensajes, como se verá después, será algo así como <code>actor &lt;&lt; Clase::Evento(valores);</code>.</p>
<pre>
    <span style="color: #9290ff;">void</span> <span style="color: #87ceeb;">join</span>()
    {
        thread_.join();
    }

    <span style="color: #9290ff;">void</span> <span style="color: #87ceeb;">stop</span>()
    {
        stop_ = <span style="color: #9932cc; font-weight: bold;">true</span>;
        cond_.notify_one();
    }

<span style="color: #6495ed; font-weight: bold;">private</span>:
    <span style="color: #9290ff;">Klass</span>&amp; <span style="color: #98fb98;">delegate_</span>;

    <span style="color: #6495ed; font-weight: bold;">typedef</span> <span style="color: #9932cc; font-weight: bold;">std</span>::<span style="color: #9290ff;">deque</span>&lt;<span style="color: #9290ff;">VariantType</span>&gt;  <span style="color: #9290ff;">event_list</span>;
    <span style="color: #9290ff;">event_list</span> <span style="color: #98fb98;">el_</span>;
    <span style="color: #9290ff;">bool</span> <span style="color: #98fb98;">stop_</span>; <span style="color: #66cdaa;">// </span><span style="color: #66cdaa;">stop?
</span>    <span style="color: #9932cc; font-weight: bold;">boost</span>::<span style="color: #9290ff;">thread</span> <span style="color: #98fb98;">thread_</span>;

    <span style="color: #9932cc; font-weight: bold;">boost</span>::<span style="color: #9290ff;">mutex</span> <span style="color: #98fb98;">mut_</span>;
    <span style="color: #9932cc; font-weight: bold;">boost</span>::<span style="color: #9290ff;">mutex</span> <span style="color: #98fb98;">list_mutex_</span>;
    <span style="color: #9932cc; font-weight: bold;">boost</span>::<span style="color: #9290ff;">condition_variable</span> <span style="color: #98fb98;">cond_</span>;
};
</pre>
<p>Por completitud, aquí está la clase <code>detail::event_caller</code>. Es necesaria para visitar un tipo <code>boost.variant</code> a través de la función <code>boost::apply_visitor</code>. Simplemente llama a la función <code>process()</code> correspondiente.</p>
<pre>
<span style="color: #6495ed; font-weight: bold;">namespace</span> <span style="color: #9932cc; font-weight: bold;">detail</span>
{

<span style="color: #6495ed; font-weight: bold;">template</span> &lt;<span style="color: #6495ed; font-weight: bold;">typename</span> <span style="color: #9290ff;">Klass</span>&gt;
<span style="color: #6495ed; font-weight: bold;">struct</span> <span style="color: #9290ff;">event_caller</span> : <span style="color: #6495ed; font-weight: bold;">public</span> <span style="color: #9932cc; font-weight: bold;">boost</span>::<span style="color: #9290ff;">static_visitor</span>&lt;&gt;
{
    <span style="color: #9290ff;">Klass</span>&amp; <span style="color: #98fb98;">instance_</span>;

    <span style="color: #87ceeb;">event_caller</span> (<span style="color: #9290ff;">Klass</span>&amp; <span style="color: #98fb98;">i</span>)
        : instance_ (i)
    {
    }

    <span style="color: #6495ed; font-weight: bold;">template</span> &lt;<span style="color: #6495ed; font-weight: bold;">typename</span> <span style="color: #9290ff;">T</span>&gt;
    <span style="color: #9290ff;">void</span> <span style="color: #6495ed; font-weight: bold;">operator</span><span style="color: #87ceeb;">()</span>( <span style="color: #9290ff;">T</span> <span style="color: #6495ed; font-weight: bold;">const</span> &amp; <span style="color: #98fb98;">operand</span> ) <span style="color: #6495ed; font-weight: bold;">const</span>
    {
        instance_.process (operand);
    }
};
}
</pre>
<p>Llegamos a la clase sobre la que queremos construir el actor, llamada para este ejemplo <code>TestClass</code>. La clase define internamente un par de eventos (<code>Event1</code> y <code>Event2</code>), y, como comentamos arriba, el tipo <code>events_type</code>, como un <code>boost.variant</code> de los diferentes eventos que puede recibir. Se pueden ver los métodos <code>process()</code> más abajo. En este caso la clase tiene métodos propios para retornar un actor interno. Esto no tiene por qué ser así, y como se ha visto, los actores son independientes de las clases de las que actúan en representación.</p>
<pre>
<span style="color: #6495ed; font-weight: bold;">class</span> <span style="color: #9290ff;">TestClass</span>
{
<span style="color: #6495ed; font-weight: bold;">public</span>:
    <span style="color: #6495ed; font-weight: bold;">typedef</span> <span style="color: #9290ff;">actor</span>&lt;<span style="color: #9290ff;">TestClass</span>&gt; <span style="color: #9290ff;">actor_type</span>;

    <span style="color: #6495ed; font-weight: bold;">struct</span> <span style="color: #9290ff;">Event1</span>
    {
        <span style="color: #9290ff;">int</span> <span style="color: #98fb98;">data</span>;
    };

    <span style="color: #6495ed; font-weight: bold;">struct</span> <span style="color: #9290ff;">Event2</span>
    {
        <span style="color: #9932cc; font-weight: bold;">std</span>::<span style="color: #9290ff;">string</span> <span style="color: #98fb98;">ss</span>;
    };

    <span style="color: #66cdaa;">// </span><span style="color: #66cdaa;">Obligatory
</span>    <span style="color: #6495ed; font-weight: bold;">typedef</span> <span style="color: #9932cc; font-weight: bold;">boost</span>::<span style="color: #9290ff;">variant</span>&lt; <span style="color: #9290ff;">Event1</span>, <span style="color: #9290ff;">Event2</span> &gt; <span style="color: #9290ff;">events_type</span>;

    <span style="color: #9290ff;">actor_type</span>&amp; <span style="color: #87ceeb;">the_actor</span>()
    {
        <span style="color: #6495ed; font-weight: bold;">return</span> *actor_;
    }

    <span style="color: #66cdaa;">// </span><span style="color: #66cdaa;">Ctor.
</span>    <span style="color: #87ceeb;">TestClass</span>()
        : actor_ (<span style="color: #6495ed; font-weight: bold;">new</span> <span style="color: #9290ff;">actor_type</span> (*<span style="color: #6495ed; font-weight: bold;">this</span>))
    {
    }

    ~<span style="color: #87ceeb;">TestClass</span>()
    {
        actor_-&gt;stop();
        actor_-&gt;join();
        <span style="color: #6495ed; font-weight: bold;">delete</span> actor_;
    }

<span style="color: #6495ed; font-weight: bold;">private</span>:
    <span style="color: #9290ff;">actor_type</span>* <span style="color: #98fb98;">actor_</span>;

<span style="color: #6495ed; font-weight: bold;">public</span>:
    <span style="color: #9290ff;">void</span> <span style="color: #87ceeb;">process</span> (Event1 <span style="color: #6495ed; font-weight: bold;">const</span>&amp; <span style="color: #98fb98;">e</span>)
    {
        <span style="color: #9932cc; font-weight: bold;">std</span>::cout &lt;&lt; <span style="color: #32cd32;">&#8220;Processed event: &#8220;</span>  &lt;&lt; e.data &lt;&lt; <span style="color: #9932cc; font-weight: bold;">std</span>::endl;
    }

    <span style="color: #9290ff;">void</span> <span style="color: #87ceeb;">process</span> (Event2 <span style="color: #6495ed; font-weight: bold;">const</span>&amp; <span style="color: #98fb98;">e</span>)
    {
        <span style="color: #9932cc; font-weight: bold;">std</span>::cout &lt;&lt; <span style="color: #32cd32;">&#8220;Processed event 2: &#8220;</span>  &lt;&lt; e.ss &lt;&lt; <span style="color: #9932cc; font-weight: bold;">std</span>::endl;
    }
};
</pre>
<p>Por último, ¿cómo se usa este mecanismo de actores? Lo ideal es proveer de mecanismos que sean semánticamente ricos y que sigan el principio de mínima sorpresa. Con las clases de arriba podemos escribir código sencillo como el siguiente:</p>
<pre>
    <span style="color: #9932cc; font-weight: bold;">TestClass</span>::<span style="color: #9290ff;">Event1</span> <span style="color: #98fb98;">ev</span>;
    ev.data = -2;

    <span style="color: #9932cc; font-weight: bold;">TestClass</span>::<span style="color: #9290ff;">Event2</span> <span style="color: #98fb98;">ev2</span>;
    ev2.ss = <span style="color: #32cd32;">&#8220;abcdef.&#8221;</span>;

    <span style="color: #9290ff;">TestClass</span> <span style="color: #98fb98;">tc</span>;

    <span style="color: #9932cc; font-weight: bold;">TestClass</span>::<span style="color: #9290ff;">actor_type</span>&amp; <span style="color: #98fb98;">ac</span> = tc.the_actor();</pre>
<p>Primero se crean un par de eventos de los dos tipos que puede recibir la clase <code>TestClass</code>, y se obtiene el actor <code>ac</code>. Se puede usar ese actor para enviar eventos a la clase:</p>
<pre>
    <span style="color: #66cdaa;">// </span><span style="color: #66cdaa;">Send the event2
</span>    ac &lt;&lt; ev2;

    <span style="color: #66cdaa;">// </span><span style="color: #66cdaa;">Send message
</span>    ac &lt;&lt; ev;
    <span style="color: #6495ed; font-weight: bold;">for</span> (<span style="color: #9290ff;">int</span> <span style="color: #98fb98;">i</span> = 0; i &lt; 2000; ++i)
    {
        ev.data = i;
        ac &lt;&lt; ev;
        ac &lt;&lt; ev2;
    }
</pre>
<p>Aquí se envía primero un evento de tipo <code>Event1</code>, y luego otro del tipo 2. Después se entra en un bucle que envía ambos mensajes, modificando el primer evento con un dato distinto. El programa va mostrando la salida de eventos de la clase en orden:</p>
<pre>
...
Processed event: 1996
Processed event 2: abcdef.
Processed event: 1997
Processed event 2: abcdef.
Processed event: 1998
Processed event 2: abcdef.
Processed event: 1999
Processed event 2: abcdef.
</pre>
<p>Un último apunte. Las diferencias con los actores de otros lenguajes dinámicos (Scala, por ejemplo), son que en estos lenguajes se puede especificar un procesado basado en máquinas de estados, como por ejemplo, cuando se recibe el evento 1, después sólo se puede recibir el evento 2. Esta máquina de estados se puede implementar. Es una primera implementación de prueba.</p>
<p>No dudéis en contactar conmigo para ideas o comentarios.
</p>
]]></content:encoded>
			<wfw:commentRSS>http://neuromancer.inf.um.es/blog/?feed=rss2&amp;p=1284</wfw:commentRSS>
		</item>
		<item>
		<title>Más ventas de objetivos</title>
		<link>http://neuromancer.inf.um.es/blog/?p=1285</link>
		<comments>http://neuromancer.inf.um.es/blog/?p=1285#comments</comments>
		<pubDate>Sun, 07 Feb 2010 22:23:57 +0000</pubDate>
		<dc:creator>Diego Sevilla</dc:creator>
		
	<category>General</category>
	<category>español</category>
	<category>fotografía/photo</category>
		<guid isPermaLink="false">http://neuromancer.inf.um.es/blog/?p=1285</guid>
		<description><![CDATA[Renovando mi equipo fotográfico, he puesto en venta tres objetivos, por si le puede interesar a alguien. Están en Ebay. Son los que he tenido tiempo de poner hoy, que hacer fotos, escribir las descripciones, etc., te lleva al final toda la tarde. Vendrán más anuncios, como mi D200 (ya que he comprado la D700), [...]]]></description>
			<content:encoded><![CDATA[<p>Renovando mi equipo fotográfico, he puesto en venta tres objetivos, por si le puede interesar a alguien. Están en Ebay. Son los que he tenido tiempo de poner hoy, que hacer fotos, escribir las descripciones, etc., te lleva al final toda la tarde. Vendrán más anuncios, como mi D200 (ya que he comprado la D700), y alguna otra cosa más, como una Hasselblad 500c/m con un carl-zeiss 80mm/2.8 T* que no uso, y que voy a vender. Ahí van las referencias:</p>
<ul>
<li><a href="http://cgi.ebay.es/ws/eBayISAPI.dll?ViewItem&#038;item=230434485404&#038;ssPageName=STRK:MESELX:IT">SIGMA 30mm 1.4 EX DC HSM for NIKON</a>, un objetivo grandioso para formato DX, que fue el objetivo preferido cuando usaba la D200.</li>
<li><a href="http://cgi.ebay.es/ws/eBayISAPI.dll?ViewItem&#038;item=230434496972&#038;ssPageName=STRK:MESELX:IT">Nikon Zoom-Nikkor 55-200 AFS DX f/4-5.6G ED</a>, un zoom sin pretensiones, pero que no está nada mal, y además pesa muy poco. Lo he usado poco, pero es ideal si quieres tener un zoom largo y no quieres cargar con un objetivo tocho.
</li>
<li><a href="http://cgi.ebay.es/ws/eBayISAPI.dll?ViewItem&#038;item=230434505692&#038;ssPageName=STRK:MESELX:IT">SIGMA 17-70 f. 2.8-4.5 DC SLD Macro</a>, un zoom muy versátil desde gran angular (17mm) hasta telefoto medio (70mm) y con una gran apertura (f/2.8) y con características de macro.</li>
</ul>
]]></content:encoded>
			<wfw:commentRSS>http://neuromancer.inf.um.es/blog/?feed=rss2&amp;p=1285</wfw:commentRSS>
		</item>
		<item>
		<title>C++ más rápido que C, o atoi versus boost.spirit v2</title>
		<link>http://neuromancer.inf.um.es/blog/?p=1283</link>
		<comments>http://neuromancer.inf.um.es/blog/?p=1283#comments</comments>
		<pubDate>Fri, 05 Feb 2010 19:42:05 +0000</pubDate>
		<dc:creator>Diego Sevilla</dc:creator>
		
	<category>General</category>
	<category>español</category>
	<category>código/code</category>
	<category>free software/software libre</category>
		<guid isPermaLink="false">http://neuromancer.inf.um.es/blog/?p=1283</guid>
		<description><![CDATA[Leo en C++ soup un test que hizo Alex Ott comparando la implementación de la función atoi de la librería de C con la versión de boost.spirit versión 2. En su artículo ponía de manifiesto que la versión de boost spirit es unas 3 veces más rápida. Sinceramente, es un resultado que alienta las nuevas [...]]]></description>
			<content:encoded><![CDATA[<p>Leo en <a href="http://cplusplus-soup.com/2010/01/08/boost-spirit-v2-x-versus-cs-atoi/">C++ soup</a> un test que hizo Alex Ott comparando la implementación de la función <code>atoi</code> de la librería de C con la versión de <a href="http://boost-spirit.com">boost.spirit versión 2</a>. En su <a href="http://alexott.blogspot.com/2010/01/boostspirit2-vs-atoi.html">artículo</a> ponía de manifiesto que la versión de boost spirit es unas 3 veces más rápida. Sinceramente, es un resultado que alienta las nuevas técnicas de meta-programación basadas en templates para C++. Ya traté el tema hace un tiempo para mostrar cómo el compilador no generaba código para las sentencias de log <a href="http://neuromancer.inf.um.es/blog/?p=1204">cuando la clase se creaba con un parámetro de template <code>false</code></a>.
</p>
]]></content:encoded>
			<wfw:commentRSS>http://neuromancer.inf.um.es/blog/?feed=rss2&amp;p=1283</wfw:commentRSS>
		</item>
		<item>
		<title>http://typography.soup.io/</title>
		<link>http://neuromancer.inf.um.es/blog/?p=1282</link>
		<comments>http://neuromancer.inf.um.es/blog/?p=1282#comments</comments>
		<pubDate>Fri, 05 Feb 2010 18:40:15 +0000</pubDate>
		<dc:creator>Diego Sevilla</dc:creator>
		
	<category>General</category>
	<category>español</category>
	<category>fotografía/photo</category>
		<guid isPermaLink="false">http://neuromancer.inf.um.es/blog/?p=1282</guid>
		<description><![CDATA[No me canso de mirarlo. Una fuente de inspiración contínua de arte gráfico con tipografía, recopilado de varias fuentes. Para muestra un botón:


]]></description>
			<content:encoded><![CDATA[<p><a href="http://typography.soup.io/">No me canso de mirarlo</a>. Una fuente de inspiración contínua de arte gráfico con tipografía, recopilado de varias fuentes. Para muestra un botón:</p>
<p><center><a href="http://www.flickr.com/photos/spacesick/4102341648/sizes/o/"><img src="http://asset.soup.io/asset/0650/3362_e225.jpeg" alt="" /></a></center>
</p>
]]></content:encoded>
			<wfw:commentRSS>http://neuromancer.inf.um.es/blog/?feed=rss2&amp;p=1282</wfw:commentRSS>
		</item>
		<item>
		<title>Curso de fotografía digital, por «El Mundo»</title>
		<link>http://neuromancer.inf.um.es/blog/?p=1281</link>
		<comments>http://neuromancer.inf.um.es/blog/?p=1281#comments</comments>
		<pubDate>Thu, 07 Jan 2010 20:43:10 +0000</pubDate>
		<dc:creator>Diego Sevilla</dc:creator>
		
	<category>español</category>
	<category>crítica/critics</category>
	<category>fotografía/photo</category>
		<guid isPermaLink="false">http://neuromancer.inf.um.es/blog/?p=1281</guid>
		<description><![CDATA[No es que me sorprenda ya, pero podríamos tener unos medios (y unos políticos) de mayor calidad, ¿no? Vamos, que en portada llamen a Zapatero y a González «los reyes del paro»&#8230; Que les falte rigor, vale, pero que les falte la educación también&#8230; Vía.

]]></description>
			<content:encoded><![CDATA[<p>No es que me sorprenda ya, pero podríamos tener unos medios (y unos políticos) de mayor calidad, ¿no? Vamos, que en portada llamen a Zapatero y a González «los reyes del paro»&#8230; Que les falte rigor, vale, pero que les falte la educación también&#8230; <a href="http://www.javiercasal.com/2010/01/curso-de-fotografia.html">Vía</a>.
</p>
]]></content:encoded>
			<wfw:commentRSS>http://neuromancer.inf.um.es/blog/?feed=rss2&amp;p=1281</wfw:commentRSS>
		</item>
		<item>
		<title>(concat &#34;Happy &#34; (replace-regexp-in-string &#34;2009&#34; &#34;2010&#34; (format-time-string &#34;%Y&#34;)) &#34;!&#34;)</title>
		<link>http://neuromancer.inf.um.es/blog/?p=1280</link>
		<comments>http://neuromancer.inf.um.es/blog/?p=1280#comments</comments>
		<pubDate>Thu, 31 Dec 2009 19:23:46 +0000</pubDate>
		<dc:creator>Diego Sevilla</dc:creator>
		
	<category>General</category>
	<category>english</category>
	<category>código/code</category>
	<category>free software/software libre</category>
		<guid isPermaLink="false">http://neuromancer.inf.um.es/blog/?p=1280</guid>
		<description><![CDATA[Thanks to emacs-lisp  . Valid at least the whole 2010  .

]]></description>
			<content:encoded><![CDATA[<p>Thanks to emacs-lisp <img src='http://neuromancer.inf.um.es/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Valid at least the whole 2010 <img src='http://neuromancer.inf.um.es/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .
</p>
]]></content:encoded>
			<wfw:commentRSS>http://neuromancer.inf.um.es/blog/?feed=rss2&amp;p=1280</wfw:commentRSS>
		</item>
		<item>
		<title>Vídeos y clases sobre Scheme,  LISP, Clojure, etc.</title>
		<link>http://neuromancer.inf.um.es/blog/?p=1279</link>
		<comments>http://neuromancer.inf.um.es/blog/?p=1279#comments</comments>
		<pubDate>Wed, 30 Dec 2009 14:57:27 +0000</pubDate>
		<dc:creator>Diego Sevilla</dc:creator>
		
	<category>english</category>
	<category>español</category>
	<category>código/code</category>
	<category>free software/software libre</category>
		<guid isPermaLink="false">http://neuromancer.inf.um.es/blog/?p=1279</guid>
		<description><![CDATA[Las encontré el otro día por casualidad. En la entrada del sitio web enlazan varias y contiene vídeos. En particular, me encantó ésta, sobre Scribble, el sistema de documentación de PLT Scheme, y que utiliza el módulo de presentaciones de DrScheme (slideshow) para crear una presentación inicial con gancho para la audiencia.

]]></description>
			<content:encoded><![CDATA[<p>Las encontré el otro día por casualidad. En <a href="http://programming-musings.org/2009/12/23/scheme-lectures-mostly/">la entrada</a> del sitio web enlazan varias y contiene vídeos. En particular, me encantó <a href="http://www.vimeo.com/6630691">ésta</a>, sobre Scribble, el sistema de documentación de PLT Scheme, y que utiliza el módulo de presentaciones de DrScheme (<em>slideshow</em>) para crear una presentación inicial con gancho para la audiencia.
</p>
]]></content:encoded>
			<wfw:commentRSS>http://neuromancer.inf.um.es/blog/?feed=rss2&amp;p=1279</wfw:commentRSS>
		</item>
		<item>
		<title>Pobre Miguel Hernández</title>
		<link>http://neuromancer.inf.um.es/blog/?p=1278</link>
		<comments>http://neuromancer.inf.um.es/blog/?p=1278#comments</comments>
		<pubDate>Tue, 29 Dec 2009 16:03:56 +0000</pubDate>
		<dc:creator>Diego Sevilla</dc:creator>
		
	<category>General</category>
	<category>español</category>
	<category>crítica/critics</category>
		<guid isPermaLink="false">http://neuromancer.inf.um.es/blog/?p=1278</guid>
		<description><![CDATA[No escapa a las catetas y sesgadas manos de la derecha.

]]></description>
			<content:encoded><![CDATA[<p>No escapa a las catetas y sesgadas manos de <a HREF="http://www.adn.es/cultura/20091229/NWS-0458-Familiares-Hernandez-Zapatero-Miguel-referencia.html">la derecha</a><a>.</a>
</p>
]]></content:encoded>
			<wfw:commentRSS>http://neuromancer.inf.um.es/blog/?feed=rss2&amp;p=1278</wfw:commentRSS>
		</item>
		<item>
		<title>SOAP, entre lo peor de la década</title>
		<link>http://neuromancer.inf.um.es/blog/?p=1277</link>
		<comments>http://neuromancer.inf.um.es/blog/?p=1277#comments</comments>
		<pubDate>Mon, 21 Dec 2009 19:09:33 +0000</pubDate>
		<dc:creator>Diego Sevilla</dc:creator>
		
	<category>english</category>
	<category>español</category>
	<category>crítica/critics</category>
	<category>código/code</category>
		<guid isPermaLink="false">http://neuromancer.inf.um.es/blog/?p=1277</guid>
		<description><![CDATA[Yo ya lo dije hace tiempo&#8230; Vía, que a su vez lo saca del &#8220;radar&#8221; de O&#8217;reilly. En ese artículo compara SOAP con CORBA, pero ni de lejos. Sobre todo porque la primera ha fracasado por su pésimo diseño arquitectural, mientras que CORBA fracasó por intereses económicos, no por que la tecnología estuviera mal diseñada.

]]></description>
			<content:encoded><![CDATA[<p>Yo ya lo dije hace tiempo&#8230; <a href="http://blogs.zdnet.com/service-oriented/?p=3742">Vía</a>, que a su vez lo saca del &#8220;<a href=http://radar.oreilly.com/2009/12/the-best-and-the-worst-tech-of.html"">radar</a>&#8221; de O&#8217;reilly. En ese artículo compara SOAP con CORBA, pero ni de lejos. Sobre todo porque la primera ha fracasado por su pésimo diseño arquitectural, mientras que CORBA fracasó por intereses económicos, no por que la tecnología estuviera mal diseñada.
</p>
]]></content:encoded>
			<wfw:commentRSS>http://neuromancer.inf.um.es/blog/?feed=rss2&amp;p=1277</wfw:commentRSS>
		</item>
		<item>
		<title>El desafío de Arc, en Clojure</title>
		<link>http://neuromancer.inf.um.es/blog/?p=1276</link>
		<comments>http://neuromancer.inf.um.es/blog/?p=1276#comments</comments>
		<pubDate>Sun, 20 Dec 2009 23:38:59 +0000</pubDate>
		<dc:creator>Diego Sevilla</dc:creator>
		
	<category>General</category>
	<category>english</category>
	<category>español</category>
	<category>crítica/critics</category>
	<category>código/code</category>
	<category>free software/software libre</category>
		<guid isPermaLink="false">http://neuromancer.inf.um.es/blog/?p=1276</guid>
		<description><![CDATA[No conocía que Paul Graham, el inventor de un dialecto de Lisp llamado Arc, había lanzado un desafío. El desafío incluye escribir varias páginas web en cascada en la que la primera pide algo al usuario a través de un formulario. Al pulsar el botón de enviar del formulario, se muestra una segunda página con [...]]]></description>
			<content:encoded><![CDATA[<p>No conocía que Paul Graham, el inventor de un dialecto de Lisp llamado <a href="http://www.paulgraham.com/arc.html">Arc</a>, había lanzado un desafío. El desafío incluye escribir varias páginas web en cascada en la que la primera pide algo al usuario a través de un formulario. Al pulsar el botón de enviar del formulario, se muestra una segunda página con un enlace que lleva a una tercera que muestra lo que el usuario escribió. El ejemplo en Arc se supone que es extremadamente simple (gracias, por supuesto, a un <em>framework</em> Web escrito para el lenguaje en cuestión.</p>
<p>Tampoco sabía que se habían lanzado en masa a mostrar cómo resolver este problema en otros lenguajes, pero enlazo aquí la <a href="http://www.bestinclass.dk/index.php/2009/12/beating-the-arc-challenge-in-clojure/">resolución en Clojure</a> también porque esa página lleva enlaces a otros ejemplos de cómo resolverlo, y enlaces a los foros de Arc.
</p>
]]></content:encoded>
			<wfw:commentRSS>http://neuromancer.inf.um.es/blog/?feed=rss2&amp;p=1276</wfw:commentRSS>
		</item>
		<item>
		<title>API design matters</title>
		<link>http://neuromancer.inf.um.es/blog/?p=1275</link>
		<comments>http://neuromancer.inf.um.es/blog/?p=1275#comments</comments>
		<pubDate>Sun, 20 Dec 2009 23:33:55 +0000</pubDate>
		<dc:creator>Diego Sevilla</dc:creator>
		
	<category>General</category>
	<category>español</category>
	<category>crítica/critics</category>
	<category>código/code</category>
		<guid isPermaLink="false">http://neuromancer.inf.um.es/blog/?p=1275</guid>
		<description><![CDATA[API design matters. Una versión distribuida de esto intento hacer en la asignatura de distribuidos. En sistemas distribuidos el API importa aún más.

]]></description>
			<content:encoded><![CDATA[<p><a href="http://cacm.acm.org/magazines/2009/5/24646-api-design-matters/fulltext">API design matters</a>. Una versión distribuida de esto intento hacer en la asignatura de distribuidos. En sistemas distribuidos el API importa aún más.
</p>
]]></content:encoded>
			<wfw:commentRSS>http://neuromancer.inf.um.es/blog/?feed=rss2&amp;p=1275</wfw:commentRSS>
		</item>
		<item>
		<title>having a baby leaves you this way :)</title>
		<link>http://neuromancer.inf.um.es/blog/?p=1274</link>
		<comments>http://neuromancer.inf.um.es/blog/?p=1274#comments</comments>
		<pubDate>Sat, 12 Dec 2009 10:43:07 +0000</pubDate>
		<dc:creator>Diego Sevilla</dc:creator>
		
	<category>english</category>
	<category>español</category>
	<category>fotografía/photo</category>
		<guid isPermaLink="false">http://neuromancer.inf.um.es/blog/?p=1274</guid>
		<description><![CDATA[
	

	having a baby leaves you this way  , originally uploaded by dsevilla.


	(a.k.a. wonders of iso 3200)
I saw her in the bathroom and I had to do this  
Nikon D700 + Nikkor 50mm/1.4.

]]></description>
			<content:encoded><![CDATA[<div>
	<a href="http://www.flickr.com/photos/dsevilla/4177928039/" title="photo sharing"><img src="http://farm3.static.flickr.com/2487/4177928039_e23334e5f8.jpg" alt="" /></a><br />
<br />
	<a href="http://www.flickr.com/photos/dsevilla/4177928039/">having a baby leaves you this way <img src='http://neuromancer.inf.um.es/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </a>, originally uploaded by <a href="http://www.flickr.com/people/dsevilla/">dsevilla</a>.
</div>
<p>
	(a.k.a. wonders of iso 3200)</p>
<p>I saw her in the bathroom and I had to do this <img src='http://neuromancer.inf.um.es/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Nikon D700 + Nikkor 50mm/1.4.
</p>
]]></content:encoded>
			<wfw:commentRSS>http://neuromancer.inf.um.es/blog/?feed=rss2&amp;p=1274</wfw:commentRSS>
		</item>
		<item>
		<title>Mark Volkmann: Clojure</title>
		<link>http://neuromancer.inf.um.es/blog/?p=1273</link>
		<comments>http://neuromancer.inf.um.es/blog/?p=1273#comments</comments>
		<pubDate>Fri, 11 Dec 2009 21:06:12 +0000</pubDate>
		<dc:creator>Diego Sevilla</dc:creator>
		
	<category>english</category>
	<category>español</category>
	<category>free software/software libre</category>
		<guid isPermaLink="false">http://neuromancer.inf.um.es/blog/?p=1273</guid>
		<description><![CDATA[Interesante página sobre clojure..

]]></description>
			<content:encoded><![CDATA[<p><a href="http://java.ociweb.com/mark/clojure/">Interesante página sobre clojure.</a>.
</p>
]]></content:encoded>
			<wfw:commentRSS>http://neuromancer.inf.um.es/blog/?feed=rss2&amp;p=1273</wfw:commentRSS>
		</item>
		<item>
		<title>Sacha di Manolo: Ride on</title>
		<link>http://neuromancer.inf.um.es/blog/?p=1272</link>
		<comments>http://neuromancer.inf.um.es/blog/?p=1272#comments</comments>
		<pubDate>Fri, 04 Dec 2009 22:39:19 +0000</pubDate>
		<dc:creator>Diego Sevilla</dc:creator>
		
	<category>General</category>
	<category>español</category>
		<guid isPermaLink="false">http://neuromancer.inf.um.es/blog/?p=1272</guid>
		<description><![CDATA[Buscando la música del anuncio retro de Citroën me he encontrado con esta:




Y su MySpace.
PD. ¿Por qué todos los artistas emergentes tienen que tener su sitio en MySpace? Es lo más caótico y peor diseñado que me podía haber imaginado en mis peores pesadillas. Supongo que los veinteañeros lo verán de lo más normal tener [...]]]></description>
			<content:encoded><![CDATA[<p>Buscando la música del anuncio retro de Citroën me he encontrado con esta:</p>
<p><center><object width="425" height="344"><br />
<param name="movie" value="http://www.youtube.com/v/Zf3qnZT2r6w&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=en_US&#038;feature=player_embedded&#038;fs=1"></param>
<param name="allowFullScreen" value="true"></param>
<param name="allowScriptAccess" value="always"></param><embed src="http://www.youtube.com/v/Zf3qnZT2r6w&#038;color1=0xb1b1b1&#038;color2=0xcfcfcf&#038;hl=en_US&#038;feature=player_embedded&#038;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="425" height="344"></embed></object></center></p>
<p>Y su <a href="http://www.myspace.com/zachaz">MySpace</a>.</p>
<p>PD. ¿Por qué todos los artistas emergentes tienen que tener su sitio en MySpace? Es lo más caótico y peor diseñado que me podía haber imaginado en mis peores pesadillas. Supongo que los veinteañeros lo verán de lo más normal tener páginas totalmente desestructuradas, pero yo&#8230;
</p>
]]></content:encoded>
			<wfw:commentRSS>http://neuromancer.inf.um.es/blog/?feed=rss2&amp;p=1272</wfw:commentRSS>
		</item>
		<item>
		<title>martina, 1 day old</title>
		<link>http://neuromancer.inf.um.es/blog/?p=1271</link>
		<comments>http://neuromancer.inf.um.es/blog/?p=1271#comments</comments>
		<pubDate>Fri, 04 Dec 2009 16:10:05 +0000</pubDate>
		<dc:creator>Diego Sevilla</dc:creator>
		
	<category>General</category>
		<guid isPermaLink="false">http://neuromancer.inf.um.es/blog/?p=1271</guid>
		<description><![CDATA[
	

	martina, 1 day old, originally uploaded by dsevilla.


	¡Aquí está! ¡Qué bonita es!   Con un día de vida en el hospital. No he tenido tiempo ni de subir más fotos, pero todo se andará  
Here she is! How beautiful she is! Just one day after birth at the hospital. I haven&#8217;t had time [...]]]></description>
			<content:encoded><![CDATA[<div>
	<a href="http://www.flickr.com/photos/dsevilla/4157498429/" title="photo sharing"><img src="http://farm3.static.flickr.com/2653/4157498429_f10854c3f8.jpg" alt="" /></a><br />
<br />
	<a href="http://www.flickr.com/photos/dsevilla/4157498429/">martina, 1 day old</a>, originally uploaded by <a href="http://www.flickr.com/people/dsevilla/">dsevilla</a>.
</div>
<p>
	¡Aquí está! ¡Qué bonita es! <img src='http://neuromancer.inf.um.es/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Con un día de vida en el hospital. No he tenido tiempo ni de subir más fotos, pero todo se andará <img src='http://neuromancer.inf.um.es/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Here she is! How beautiful she is! Just one day after birth at the hospital. I haven&#8217;t had time to upload any more photos, but hopefuly I will in the near future <img src='http://neuromancer.inf.um.es/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>D700 + 50mm/1.4 AF
</p>
]]></content:encoded>
			<wfw:commentRSS>http://neuromancer.inf.um.es/blog/?feed=rss2&amp;p=1271</wfw:commentRSS>
		</item>
		<item>
		<title>Carta a mis nietos. Enrique Amat en La Verdad de hoy</title>
		<link>http://neuromancer.inf.um.es/blog/?p=1270</link>
		<comments>http://neuromancer.inf.um.es/blog/?p=1270#comments</comments>
		<pubDate>Tue, 01 Dec 2009 23:42:12 +0000</pubDate>
		<dc:creator>Diego Sevilla</dc:creator>
		
	<category>General</category>
	<category>español</category>
	<category>crítica/critics</category>
		<guid isPermaLink="false">http://neuromancer.inf.um.es/blog/?p=1270</guid>
		<description><![CDATA[De lo mejor que he leído últimamente. Vía.

]]></description>
			<content:encoded><![CDATA[<p>De lo mejor que he leído últimamente. <a HREF="http://www.laverdad.es/murcia/20091201/opinion/simbolos-religiosos-escuela-20091201.html">Vía</a>.
</p>
]]></content:encoded>
			<wfw:commentRSS>http://neuromancer.inf.um.es/blog/?feed=rss2&amp;p=1270</wfw:commentRSS>
		</item>
		<item>
		<title>Intereconomía, las dos españas del 2009 y de por qué los condones no son más que un peligro para África</title>
		<link>http://neuromancer.inf.um.es/blog/?p=1269</link>
		<comments>http://neuromancer.inf.um.es/blog/?p=1269#comments</comments>
		<pubDate>Sun, 29 Nov 2009 20:06:21 +0000</pubDate>
		<dc:creator>Diego Sevilla</dc:creator>
		
	<category>General</category>
	<category>español</category>
	<category>crítica/critics</category>
		<guid isPermaLink="false">http://neuromancer.inf.um.es/blog/?p=1269</guid>
		<description><![CDATA[No me podía creer el vídeo. Creía que era una broma al estilo de la de la becaria del Wyoming. Pero sí. A través de escolar.net y periodismo + derechos humanos.

El vídeo no tiene desperdicio. De hecho, comienza tal que así (las negritas son mías):
Los medios de comunicación de izquierdas han atizado en las últimas [...]]]></description>
			<content:encoded><![CDATA[<p>No me podía creer el vídeo. Creía que era una broma al estilo de la de la becaria del Wyoming. Pero sí. A través de <a href="http://www.escolar.net/MT/archives/2009/11/por-que-el-condon-no-funciona-en-africa-segun-intereconomia.html">escolar.net</a> y <a href="http://www.pmasdh.com/2009/11/periodista-muchos-africanos-tienen-unas-manos-no-aptas-para-manipular-un-preservativo/">periodismo + derechos humanos</a>.</p>
<p><center><a href="http://www.youtube.com/watch?v=xvx4sjQspnM"><img src="http://img.youtube.com/vi/xvx4sjQspnM/0.jpg" alt="YouTube Preview Image" /></a></center></p>
<p>El vídeo no tiene desperdicio. De hecho, comienza tal que así (las negritas son mías):</p>
<blockquote><p><em>Los <strong>medios de comunicación de izquierdas</strong> han atizado en las últimas semanas al papa&#8230;</em></p></blockquote>
<p>Para que luego digan que lo de las dos españas está muy trasnochado&#8230; Pero eso es con mucho lo de menos. Del vídeo, periodismo + derechos humanos ha destacado un conjunto de frases. Las negritas, de nuevo, son mías.</p>
<blockquote><p><em><br />
    “En aquellos países donde se difunde la fe católica, la enfermedad del SIDA se expande menos que en las regiones donde se reparte el profiláctico”</p>
<p>    “Hay que tener cuidado y no rasgar el producto con las manos; <strong>en fin, la manicura en África no destaca</strong>”</p>
<p>    “Y si a esto sumamos que <strong>los ciudadanos del Tercer Mundo no saben leer</strong>, el uso del <strong>preservativo puede ser un peligro</strong>”</p>
<p>    “Prácticamente toda la población del continente se encuentra en zonas donde el clima es eminentemente caluroso, lo que hace dificil la conservación de los preservativos”</p>
<p>    “Aun si entendieran lo que leen, es dudoso que los africanos lleguen a aplicar directrices como la de tener cuidado al desplegar la funda. Muchos habitantes de zonas rurales del <strong>continente negro tienen unas manos que pueden ser no aptas para la manipulación del preservativo</strong>”.<br />
</em></p></blockquote>
<p>Eso sí que es rigor periodístico. Y respeto por los demás. El problema son los preservativos, por supuesto, no que la población sea analfabeta. Hay que luchar, por supuesto, para que siga siendo así y no puedan ni leer la documentación adjunta. Y si no saben nada de nada y se creen a pies juntillas lo que le dice la Iglesia, pues mejor que mejor&#8230;</p>
<p>Me quedo sin palabras. Sobre todo porque los religiosos que están al pie del cañón en misiones allí en «el continente negro», están a favor del preservativo.</p>
<p>Como dicen por ahí, sin embargo, quizá sea incluso más penoso que haya gente que se lo crea.
</p>
]]></content:encoded>
			<wfw:commentRSS>http://neuromancer.inf.um.es/blog/?feed=rss2&amp;p=1269</wfw:commentRSS>
		</item>
		<item>
		<title>martina</title>
		<link>http://neuromancer.inf.um.es/blog/?p=1268</link>
		<comments>http://neuromancer.inf.um.es/blog/?p=1268#comments</comments>
		<pubDate>Fri, 27 Nov 2009 09:32:16 +0000</pubDate>
		<dc:creator>Diego Sevilla</dc:creator>
		
	<category>english</category>
	<category>fotografía/photo</category>
		<guid isPermaLink="false">http://neuromancer.inf.um.es/blog/?p=1268</guid>
		<description><![CDATA[
	

	martina, originally uploaded by dsevilla.


	She&#8217;s comming but not here yet   Just to be prepared, we bought a d700 to get just great photos of her  
This is her room, that we prepared with such care and eagerness. I just have to fix that bulb and it will be done. Note the nice [...]]]></description>
			<content:encoded><![CDATA[<div>
	<a href="http://www.flickr.com/photos/dsevilla/4138129486/" title="photo sharing"><img src="http://farm3.static.flickr.com/2797/4138129486_c72352fd66.jpg" alt="" /></a><br />
<br />
	<a href="http://www.flickr.com/photos/dsevilla/4138129486/">martina</a>, originally uploaded by <a href="http://www.flickr.com/people/dsevilla/">dsevilla</a>.
</div>
<p>
	She&#8217;s comming but not here yet <img src='http://neuromancer.inf.um.es/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Just to be prepared, we bought a d700 to get just great photos of her <img src='http://neuromancer.inf.um.es/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>This is her room, that we prepared with such care and eagerness. I just have to fix that bulb and it will be done. Note the nice frame made by my mother with her name. Lovely.</p>
<p>Nikon D700 + Stone Age Tamron 17mm/3.5.
</p>
]]></content:encoded>
			<wfw:commentRSS>http://neuromancer.inf.um.es/blog/?feed=rss2&amp;p=1268</wfw:commentRSS>
		</item>
	</channel>
</rss>
