<?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>La bitacora de laparca &#187; Desarrollo</title>
	<atom:link href="http://blog.laparca.es/category/desarrollo/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.laparca.es</link>
	<description>donde el conocimiento es nulo</description>
	<lastBuildDate>Mon, 06 Jun 2011 22:02:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Código ofuscado</title>
		<link>http://blog.laparca.es/2011/05/10/codigo-ofuscado/</link>
		<comments>http://blog.laparca.es/2011/05/10/codigo-ofuscado/#comments</comments>
		<pubDate>Tue, 10 May 2011 10:36:27 +0000</pubDate>
		<dc:creator>laparca</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[codigo]]></category>
		<category><![CDATA[ofuscado]]></category>

		<guid isPermaLink="false">http://blog.laparca.es/?p=604</guid>
		<description><![CDATA[Muchos de los que leen este blog seguro que ya saben a qué me refiero por código ofuscado. Si es ese el caso, probablemente lo que cuente a continuación ya lo sepas. Para los demás, si os apetece ver las cosas que un friki de la programación puede hacer cuando se aburre, continúa leyendo. El [...]]]></description>
			<content:encoded><![CDATA[<p>Muchos de los que leen este blog seguro que ya saben a qué me refiero por código ofuscado. Si es ese el caso, probablemente lo que cuente a continuación ya lo sepas. Para los demás, si os apetece ver las cosas que un friki de la programación puede hacer cuando se aburre, continúa leyendo.</p>
<p>El código ofuscado es, según la Wikipedia el &#8220;[..] acto deliberado de realizar un cambio no destructivo, ya sea en el <a href="http://es.wikipedia.org/wiki/C%C3%B3digo_fuente">código fuente</a> de un <a href="http://es.wikipedia.org/wiki/Programa_inform%C3%A1tico">programa informático</a> o <a title="Código máquina" href="http://es.wikipedia.org/wiki/C%C3%B3digo_m%C3%A1quina">código máquina</a>cuando el programa está en forma <a title="Compilador" href="http://es.wikipedia.org/wiki/Compilador">compilada</a> o binaria, con el fin de que no sea fácil de entender o leer&#8221;. De cara al programado que quiere echarse unas risas es hacer un programa correcto pero que no pueda entenderse leyéndolo. ¿Y eso por qué? Porque podemos.</p>
<p>Imaginemos algo sencillo: en C hacer un programa que muestre por pantalla un &#8220;Hola, mundo&#8221; es algo tan aburrido como lo siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
   <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Hola, mundo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
   <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Sin duda algo muy soso, sería más divertido una cosa como la siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#define __ main</span>
<span style="color: #339933;">#define ___ printf</span>
<span style="color: #993333;">int</span>
__<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> _<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>b<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
   <span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span>_ <span style="color: #339933;">&amp;</span>gt<span style="color: #339933;">;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">?</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>_<span style="color: #339933;">==</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">?</span>__<span style="color: #009900;">&#40;</span>_<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span>___<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Hola, mundo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Ahora mismo no sé si funciona, pero como podéis comprobar es muuuucho más clarooooo (entiendase el sarcasmo). Ya lo único que le faltaría es ocultar el mensaje de algún modo estrafalario.</p>
<p>A parte de las connotaciones divertidas que pueda tener la ofuscación de código (hay códigos con forma de avión, círculos, etc.), también sirve para reducir el tamaño del código de ciertos programas. Por ejemplo, en el mundo de la web, los códigos javascript se suelen comprimir utilizando técnicas de sustitución parecidas a las de la ofuscación para que ocupen menos y se transmitan más rápido por la red.</p>
<p>También hay quien utiliza este tipo de códigos para evitar que se copien los algoritmos utilizados y que no se pueda hacer ingeniería inversa.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laparca.es/2011/05/10/codigo-ofuscado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Distributed Hash Cracker</title>
		<link>http://blog.laparca.es/2011/03/29/distributed-hash-cracker/</link>
		<comments>http://blog.laparca.es/2011/03/29/distributed-hash-cracker/#comments</comments>
		<pubDate>Tue, 29 Mar 2011 20:52:00 +0000</pubDate>
		<dc:creator>laparca</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Software libre]]></category>
		<category><![CDATA[dhc]]></category>
		<category><![CDATA[distributed hash cracker]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[pfc]]></category>

		<guid isPermaLink="false">http://blog.laparca.es/?p=597</guid>
		<description><![CDATA[Ese nombre tan rimbombante es, ni más ni menos, que la base de mi proyecto final de carrera, felizmente entregado ya. Es una herramienta que en su momento se encontraba en internet con licencia BSD y que por algún motivo desapareció. Lo curioso no es que no esté ya el programa, sino toda la web [...]]]></description>
			<content:encoded><![CDATA[<p>Ese nombre tan rimbombante es, ni más ni menos, que la base de mi proyecto final de carrera, felizmente entregado ya. Es una herramienta que en su momento se encontraba en internet con licencia BSD y que por algún motivo desapareció. Lo curioso no es que no esté ya el programa, sino toda la web que lo albergaba junto a más proyectos.</p>
<p>Tras hablarlo con mi director de PFC hemos decidido publicar el código con las modificaciones introducidas en los próximos meses (puede que antes haya que hacer aún algún cambio). De momento mi idea es ponerlo en GitHub y aún tengo la duda de si puedo cambiar la licencia de BSD a GNU GPL v3 o si sólo puedo cambiar los ficheros que haya modificado (que creo son bastantes).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laparca.es/2011/03/29/distributed-hash-cracker/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Transformaciones AST para importar clases de IDL</title>
		<link>http://blog.laparca.es/2010/05/31/transformaciones-ast-para-importar-clases-de-idl/</link>
		<comments>http://blog.laparca.es/2010/05/31/transformaciones-ast-para-importar-clases-de-idl/#comments</comments>
		<pubDate>Mon, 31 May 2010 09:28:34 +0000</pubDate>
		<dc:creator>laparca</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[ast]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://blog.laparca.es/?p=536</guid>
		<description><![CDATA[En la anterior entraba hablaba un poco sobre las transformaciones AST de Groovy y que me maravillaban (y si esto último no lo dije, lo digo ahora). Como me gustan y las veo útiles decidí ponerlas en práctica para un uso real. En donde trabajo se utiliza un lenguaje de programación llamado IDL. Este lenguaje [...]]]></description>
			<content:encoded><![CDATA[<p>En la anterior entraba hablaba un poco sobre las transformaciones AST de Groovy y que me maravillaban (y si esto último no lo dije, lo digo ahora). Como me gustan y las veo útiles decidí ponerlas en práctica para un uso real.</p>
<p>En donde trabajo se utiliza un lenguaje de programación llamado IDL. Este lenguaje se utilizan en muchos entornos de investigación y para ser sinceros se haría un favor al mundo amputándole las manos a la persona o personas que lo diseñó/aron (pero dejemos esto para un posible futuro artículo). En IDL se pueden crear funciones y procedimientos o se puede crear clases con métodos y atributos. Cuando se necesita ofrecer a otro lenguaje de las funcionalidades que hemos creado en IDL se hace uso siempre de clases y objetos. Además provee de una herramientas denominada Export Bridge Assistant (EBA) para facilitar la tarea de generar los <i>bindings</i> del lenguaje destino. Debo decir que me EBA hace cierto trabajo por el programador, concretamente genera una clase en java o .Net con los métodos seleccionados, pero en el caso de Java no hace distinción de los tipos de datos. Para él solo existe el JIDLNumber, pero está prohibido por el programador su uso, sino que debes utilizar JIDLFloat, JIDLLong, etc. Además, estos tipos de datos no son nativos de Java lo que supone un sobreesfuerzo para el programador.</p>
<p>En esta situación se me ocurrió crear una transformación AST que generase el código de los métodos usando datos nativos de Java. En lugar de llamar a EBA para generar el <i>binding</i> se crea una clase de esta forma:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="groovy" style="font-family:monospace;">@IDLClass<span style="color: #66cc66;">&#40;</span>idlclass<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;CLASE_DE_IDL&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #000000; font-weight: bold;">class</span> MiClaseEnJava <span style="color: #000000; font-weight: bold;">extends</span> JIDLObject <span style="color: #66cc66;">&#123;</span>
   @IDLFunction<span style="color: #66cc66;">&#40;</span>name<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;FUNCION_IDL&quot;</span><span style="color: #66cc66;">&#41;</span>
   <span style="color: #993333;">float</span> miFuncion<span style="color: #66cc66;">&#40;</span><span style="color: #993333;">float</span> a, <span style="color: #993333;">float</span> b, <span style="color: #aaaadd; font-weight: bold;">String</span> cadena<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>Durante la compilación de la clase se detecta la nota IDLClass y se pasa el control a la transformación AST que añade un constructor por defecto necesario para los objetos que heredan de JIDLObject. Además se busca de nota IDLFunction y cuando se encuentra se interpretan los parámetros para generar el código con las transformaciones de tipos necesarias.</p>
<p>Sinceramente creo que esto es más óptimo que hacer uso de EBA, ya que de todos modos me termino creando métodos que realizan la transformación de tipos y de este modo me ahorro dicho trabajo.</p>
<p>Lo que más me ha costado es entender como funciona la generación de código ya que se basa en la estructura del compilador. Concretamente me ha constado 1 semana hacer la transformación.</p>
<p>En cuanto pueda publicaré el código para que lo pueda utilizar quien quiera, que seguro que mal no hará.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laparca.es/2010/05/31/transformaciones-ast-para-importar-clases-de-idl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Haciendo memoria</title>
		<link>http://blog.laparca.es/2010/04/16/haciendo-memoria/</link>
		<comments>http://blog.laparca.es/2010/04/16/haciendo-memoria/#comments</comments>
		<pubDate>Fri, 16 Apr 2010 14:33:32 +0000</pubDate>
		<dc:creator>laparca</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Opinión]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[abuelo cebolleta]]></category>
		<category><![CDATA[ast]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[opinion]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://blog.laparca.es/?p=527</guid>
		<description><![CDATA[Esta semana he recordado uno de mis viejos proyectos de cuando era más joven (sería el año 97). En aquel momento tenía en mente la creación de un lenguaje que pudiese ser modificado en tiempo de compilación. Con esto me refiero a que pudiesen crearse reglas que permitieran modificar el cómo este compilaba o añadiese [...]]]></description>
			<content:encoded><![CDATA[<p>Esta semana he recordado uno de mis viejos proyectos de cuando era más joven (sería el año 97). En aquel momento tenía en mente la creación de un lenguaje que pudiese ser modificado en tiempo de compilación. Con esto me refiero a que pudiesen crearse reglas que permitieran modificar el cómo este compilaba o añadiese nuevas posibilidades al lenguaje.</p>
<p>En aquel momento yo no tenía conocimiento alguno de lenguajes, gramáticas o compiladores y el único curso que vi fue el de la revista Solo Programadores de varios años atrás y, la verdad, no me resolvió ninguna duda (esto se debe a que entonces no solía leer tanto y miraba solo por encima las cosas).</p>
<p>El caso es que me he encontrado que ya lo han inventado. En <a title="Lenguaje de programación Groovy" href="http://groovy.codehaus.org/" target="_blank">Groovy</a> existe una característica denominada <a href="http://groovy.codehaus.org/Compile-time+Metaprogramming+-+AST+Transformations" target="_blank">transformaciones AST</a> que permite modificar las reglas de compilación.  Debo reconocer que es una característica tan chula como difícil de utilizar (todo hay que decirlo).</p>
<p>En estos momentos me encuentro estudiando la documentación para ponerme a hacer pruebas y comprobar qué tal funciona. La verdad es que permite hacer cosas tan increíbles como <a href="http://code.google.com/p/groovypptest/" target="_blank">Groovy++</a>, que es un optimizador de Groovy (lo que hace es eliminar algunas características de Groovy para acelerar la ejecución de las aplicaciones).</p>
<p>He podido encontrar una gran cantidad de ejemplo y la verdad es que me sorprenden mucho. Por ejemplo se pueden automatizar patrones de diseño con este sistema tal y como se hace con la transformación <em>Bindable</em>. Ésta convierte un atributo de clase en un sistema que permite monitorizar los cambios del mismo (patron ). De este modo si tenemos algo como:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> ClaseDeEjemplo <span style="color: #66cc66;">&#123;</span>
    @Bindable <span style="color: #aaaadd; font-weight: bold;">String</span> prop
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>Se transformará de forma automática en:</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
17
18
19
</pre></td><td class="code"><pre class="groovy" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> ClaseDeEjemplo <span style="color: #66cc66;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #aaaadd; font-weight: bold;">String</span> prop
    <span style="color: #aaaadd; font-weight: bold;">PropertyChangeSupport</span> pcs <span style="color: #66cc66;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #aaaadd; font-weight: bold;">PropertyChangeSupport</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> addPropertyChangeListener<span style="color: #66cc66;">&#40;</span><span style="color: #aaaadd; font-weight: bold;">PropertyChangeListener</span> l<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        pcs.<span style="color: #006600;">add</span><span style="color: #66cc66;">&#40;</span>l<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">;</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> removePropertyChangeListener<span style="color: #66cc66;">&#40;</span><span style="color: #aaaadd; font-weight: bold;">PropertyChangeListener</span> l<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        pcs.<span style="color: #006600;">remove</span><span style="color: #66cc66;">&#40;</span>l<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">;</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #aaaadd; font-weight: bold;">String</span> getProp<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">return</span> prop<span style="color: #66cc66;">;</span>
    <span style="color: #66cc66;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #993333;">void</span> setProp<span style="color: #66cc66;">&#40;</span><span style="color: #aaaadd; font-weight: bold;">String</span> prop<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span>
        pcs.<span style="color: #006600;">firePropertyChanged</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;prop&quot;</span>, <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006600;">prop</span>, <span style="color: #000000; font-weight: bold;">this</span>.<span style="color: #006600;">prop</span> <span style="color: #66cc66;">=</span> prop<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">;</span>
    <span style="color: #66cc66;">&#125;</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

<p>Con lo que evitamos tener que escribir un gran número de líneas de código. Sinceramente me parece un gran avance.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laparca.es/2010/04/16/haciendo-memoria/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A vueltas con las plantillas</title>
		<link>http://blog.laparca.es/2009/05/29/a-vueltas-con-las-plantillas/</link>
		<comments>http://blog.laparca.es/2009/05/29/a-vueltas-con-las-plantillas/#comments</comments>
		<pubDate>Fri, 29 May 2009 08:58:40 +0000</pubDate>
		<dc:creator>laparca</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[cpp]]></category>
		<category><![CDATA[functores]]></category>
		<category><![CDATA[plantillas]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[templates]]></category>

		<guid isPermaLink="false">http://blog.laparca.es/?p=483</guid>
		<description><![CDATA[Ando haciendo pruebas últimamente con C++ y hay algo que ahora no soy capaz de hacer, que es que elija entre un método u otro dependiendo de si lo que se le pasa por parámetro es una función o un functor. Concretamente tengo algo como esto: template&#60;typename T, typename Proxy = queue_proxy&#60;T&#62; &#62; class channel [...]]]></description>
			<content:encoded><![CDATA[<p>Ando haciendo pruebas últimamente con C++ y hay algo que ahora no soy capaz de hacer, que es que elija entre un método u otro dependiendo de si lo que se le pasa por parámetro es una función o un functor.</p>
<p>Concretamente tengo algo como esto:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">typename</span> T, <span style="color: #0000ff;">typename</span> Proxy <span style="color: #000080;">=</span> queue_proxy<span style="color: #000080;">&lt;</span>T<span style="color: #000080;">&gt;</span> <span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">class</span> channel
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
	<span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">typename</span> Result<span style="color: #000080;">&gt;</span>
	channel<span style="color: #000080;">&lt;</span>Result, <span style="color: #0000ff;">typename</span> Proxy<span style="color: #008080;">::</span><span style="color: #0000ff;">template</span> bind<span style="color: #000080;">&lt;</span>Result<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span><span style="color: #000080;">&gt;</span>
	operator<span style="color: #000080;">&gt;&gt;</span><span style="color: #008000;">&#40;</span>Result <span style="color: #008000;">&#40;</span><span style="color: #000040;">&amp;</span>receiver<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span>T<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		channel<span style="color: #000080;">&lt;</span>Result, <span style="color: #0000ff;">typename</span> Proxy<span style="color: #008080;">::</span><span style="color: #0000ff;">template</span> bind<span style="color: #000080;">&lt;</span>Result<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span><span style="color: #000080;">&gt;</span> out_channel<span style="color: #008080;">;</span>
		threads.<span style="color: #007788;">push_back</span><span style="color: #008000;">&#40;</span><span style="color: #0000dd;">new</span> boost<span style="color: #008080;">::</span><span style="color: #007788;">thread</span><span style="color: #008000;">&#40;</span>create_stream_channel_thread<span style="color: #008000;">&#40;</span><span style="color: #000040;">*</span><span style="color: #0000dd;">this</span>, out_channel, receiver<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
		<span style="color: #0000ff;">return</span> channel<span style="color: #000080;">&lt;</span>Result, <span style="color: #0000ff;">typename</span> Proxy<span style="color: #008080;">::</span><span style="color: #0000ff;">template</span> bind<span style="color: #000080;">&lt;</span>Result<span style="color: #000080;">&gt;</span><span style="color: #008080;">::</span><span style="color: #007788;">type</span><span style="color: #000080;">&gt;</span><span style="color: #008000;">&#40;</span>out_channel<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></div></div>

<p>La idea es que este código permite hacer algo como lo siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> fac<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> x<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	<span style="color: #0000ff;">if</span><span style="color: #008000;">&#40;</span>x <span style="color: #000080;">&lt;</span> <span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">1</span><span style="color: #008080;">;</span>
	<span style="color: #0000ff;">return</span> x <span style="color: #000040;">*</span> fac<span style="color: #008000;">&#40;</span>x<span style="color: #000040;">-</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> show<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> x<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> x <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #ff0000; font-style: italic;">/* some code here */</span>
&nbsp;
channel<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> ch<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #ff0000; font-style: italic;">/* Se redirige el canal a fac y la salida del factorial a show */</span>
ch <span style="color: #000080;">&gt;&gt;</span> fac <span style="color: #000080;">&gt;&gt;</span> show<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #ff0000; font-style: italic;">/* more code here */</span></pre></div></div>

<p>Sí, el código se parece mucho a Axum de Microsoft, que la idea es crear algo parecido para C++.</p>
<p>El caso es que el operador funciona bien cuando se pasan funciones, pero no funciona si le paso un functor, como podría ser el caso siguiente:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">class</span> functor
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
	functor<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span><span style="color: #008000;">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">int</span> operator<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> a<span style="color: #008000;">&#41;</span>
	<span style="color: #008000;">&#123;</span>
		<span style="color: #ff0000; font-style: italic;">/* do something interesting */</span>
	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
<span style="color: #ff0000; font-style: italic;">/* some code here */</span>
&nbsp;
channel<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> ch<span style="color: #008080;">;</span>
ch <span style="color: #000080;">&gt;&gt;</span> functor<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&gt;&gt;</span> show<span style="color: #008080;">;</span></pre></div></div>

<p>La cosa es que no sé como hacer para detectar que se me pasa un functor y qué parametros son los que tiene, aunque aún tengo que hacer alguna prueba más antes de dar por imposible la tarea.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laparca.es/2009/05/29/a-vueltas-con-las-plantillas/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Muchas cosas</title>
		<link>http://blog.laparca.es/2009/04/13/muchas-cosas/</link>
		<comments>http://blog.laparca.es/2009/04/13/muchas-cosas/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 12:01:20 +0000</pubDate>
		<dc:creator>laparca</dc:creator>
				<category><![CDATA[Derechos de autor]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[derechos autor]]></category>
		<category><![CDATA[economia]]></category>
		<category><![CDATA[opinion]]></category>

		<guid isPermaLink="false">http://blog.laparca.es/?p=466</guid>
		<description><![CDATA[Ya hace tiempo que no escribo nada, sobre todo desde que uso Twitter. Pero aún así hay cosas que no va bien ponerlas en dicho servicio. La primera de todas son mis opiniones sobre la economía. Es curioso como los estados están gastando grandes cantidades de dinero en bancos, industria automovilística y otros para mantener [...]]]></description>
			<content:encoded><![CDATA[<p>Ya hace tiempo que no escribo nada, sobre todo desde que uso <a href="http://twitter.com/" target="_blank">Twitter</a>. Pero aún así hay cosas que no va bien ponerlas en dicho servicio.</p>
<p>La primera de todas son mis opiniones sobre la economía. Es curioso como los estados están gastando grandes cantidades de dinero en bancos, industria automovilística y otros para mantener dichos sectores cuando la gente no consume. ¿No sería más lógico darle dicho dinero a los usuarios para que puedan realizar compras?</p>
<p>Lo segundo tiene que ver con la reciente sentencia sobre derechos de autor en la que se ha condenado a un webmaster por hacer uso lucrativo de descargas en internet. En este sentido me he dado cuenta que la SGAE (y otras) hace un uso lucrativo de dichas descargas gracias a la retribución por compensación de copia (el canon). Dicho de otro modo, ellos se lucran por las descargas de internet más incluso que las mafias del top manta (no tengo datos de esto, pero como ellos se los inventan, yo también).</p>
<p>Por último, y ya fuera de este ámbito, he estado viendo algunas cosillas de C++ que molan. El profesor Daniel nos comentó en clase sobre la plantilla <em>future</em> de las bibliotecas <a href="http://www.boost.org/" target="_blank">Boost C++</a> y me dio por implementarla yo para ver como debía funcionar. Está super chulo, ya escribiré algo sobre eso más delante.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laparca.es/2009/04/13/muchas-cosas/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Plantillas en C++</title>
		<link>http://blog.laparca.es/2008/07/25/plantillas-en-c/</link>
		<comments>http://blog.laparca.es/2008/07/25/plantillas-en-c/#comments</comments>
		<pubDate>Fri, 25 Jul 2008 10:55:28 +0000</pubDate>
		<dc:creator>laparca</dc:creator>
				<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[cpp]]></category>
		<category><![CDATA[plantillas]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[templates]]></category>

		<guid isPermaLink="false">http://blog.laparca.es/?p=372</guid>
		<description><![CDATA[Recuerdo cuando empecé a aprender C++ que la cosa que menos entendía era el uso de plantillas. Debo reconocer que me ha costado mucho comprender como funciona porque era algo completamente diferente a lo que hasta entonces había visto. Por otro lado, hemos visto en los últimos tiempos como gran cantidad de arquitecturas han copiado [...]]]></description>
			<content:encoded><![CDATA[<p>Recuerdo cuando empecé a aprender C++ que la cosa que menos entendía era el uso de plantillas. Debo reconocer que me ha costado mucho comprender como funciona porque era algo completamente diferente a lo que hasta entonces había visto.</p>
<p>Por otro lado, hemos visto en los últimos tiempos como gran cantidad de arquitecturas han copiado el modelo para implementarlo a su modo. Aquí es donde vemos los genéricos de Java y de .Net. El problema es que no tienen ni de cerca la misma potencia que el sistema de C++, pero que como ventaja consumen menos espacio de ejecutable.</p>
<p>Para entrar un poco en materia, comentar que las plantillas de C++ son como documentos en los que dejamos lineas en blanco y luego las rellenamos cuando ya sabemos qué queremos poner en ahí. Pero en C++ no ha líneas en blanco, estas tienen nombre.</p>
<p>La principal ventaja de este sistema es que permite programar clases genéricas, como pueda ser una clase lista que automáticamente se adapte al tipo que debe contener. La segunda ventaja es el rendimiento, por el mismo motivo anterior.</p>
<p>Para empezar a ver un poco como va la cosa vamos a ver un ejemplo sencillo de plantilla:</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
17
18
19
20
21
22
23
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">typename</span> T, <span style="color: #0000ff;">int</span> S<span style="color: #000080;">&gt;</span>
<span style="color: #0000ff;">class</span> array
<span style="color: #008000;">&#123;</span>
<span style="color: #0000ff;">private</span><span style="color: #008080;">:</span>
   T <span style="color: #000040;">*</span>ptr<span style="color: #008080;">;</span>
&nbsp;
<span style="color: #0000ff;">public</span><span style="color: #008080;">:</span>
   array<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
   <span style="color: #008000;">&#123;</span>
      ptr <span style="color: #000080;">=</span> <span style="color: #0000dd;">new</span> T<span style="color: #008000;">&#91;</span>S<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
   <span style="color: #008000;">&#125;</span>
&nbsp;
   T<span style="color: #000040;">&amp;</span> operator<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> idx<span style="color: #008000;">&#41;</span>
   <span style="color: #008000;">&#123;</span>
      <span style="color: #0000ff;">return</span> T<span style="color: #008000;">&#91;</span>idx<span style="color: #008000;">&#93;</span><span style="color: #008080;">;</span>
   <span style="color: #008000;">&#125;</span>
&nbsp;
   <span style="color: #0000ff;">int</span> size<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
   <span style="color: #008000;">&#123;</span>
      <span style="color: #0000ff;">return</span> S<span style="color: #008080;">;</span>
   <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
<span style="color: #666666;">//&lt;/typename&gt;</span></pre></td></tr></table></div>

<p>Como vemos, hemos utilizado la palabra reservada <i>template</i> para indicar que se trata de una plantilla y luego, entre los símbolos &lt; y &gt; hemos introducido la lista de elementos de la plantilla. Estos elementos son los tipos y nombres de los valores a sustituir. En este caso son <i>T</i> de tipo <i>typename</i> y <i>S</i> de tipo <i>int</i>. Esto significa que cada vez que dentro de la clase aparezca <i>T</i> deberá sustituirse por su corresponditente valor pasado en la plantilla y que necesariamente deberá ser un tipo de dato (por ejemplo un <i>int</i>, una clase, etc.) y que cada vez que aparezca <i>S</i> deberá sustituirse por su valor que deberá ser un número entero. Para utilizar la plantilla sólo deberemos hacer lo siguiente:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">void</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std<span style="color: #008080;">;</span>
&nbsp;
   array<span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span> , <span style="color: #0000dd;">5</span><span style="color: #000080;">&gt;</span> a<span style="color: #008080;">;</span>
   <span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;</span> <span style="color: #000080;">&lt;</span> <span style="color: #FF0000;">&quot;Tamaño del array: &quot;</span> <span style="color: #000080;">&lt;&lt;</span> a.<span style="color: #007788;">size</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #000080;">&lt;&lt;</span> endl<span style="color: #008080;">;</span>
   a<span style="color: #008000;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #008000;">&#93;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">5</span><span style="color: #008080;">;</span>
&nbsp;
   <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>Como vemos, lo único que hemos hecho ha sido añadir al nombre del la clase la lista de argumentos. En este caso concreto, deberá devolver que el tamaño es 5, que es el indicado en el parámetro de la plantilla.</p>
<p>Si nos fijamos en bibliotecas como STL o Boost, hacen un uso intensivo de las plantillas. El principal motivo es que C++ está optimizado para funcionar con plantillas, así que se prefieren al uso de mecanismos como la herencia. Además, la herencia hace que las llamadas a métodos sean más lentos, por lo que también se evita. Es en este momento cuando nos podemos preguntar el cómo hace C++ entonces para garantizar que se implementan ciertas funcionalidades. Por ejemplo, si queremos tener una lista ordenada, nos interesa que los elementos de la lista puedan compararse entre ellos con el operador <i>&lt;=</i>. Pues la respuesta es sencilla: en la clase de plantilla simplemente utilizamos ese método y en tiempo de compilación se comprueba si está o no. Por ejemplo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #0000ff;">template</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">typename</span> T<span style="color: #000080;">&gt;</span>
T<span style="color: #000040;">&amp;</span> mayor<span style="color: #008000;">&#40;</span>T<span style="color: #000040;">&amp;</span> a, T<span style="color: #000040;">&amp;</span> b<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">return</span> a <span style="color: #000080;">&gt;=</span> b <span style="color: #008080;">?</span> a <span style="color: #008080;">:</span> b<span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #666666;">//&lt;/typename&gt;</span></pre></td></tr></table></div>

<p>Hemos creado una función <i>mayor</i> que devuelve el mayor de dos elementos de tipo <i>T</i>. Los elementos de tipo <i>T</i> deben sobrecargar el operador <i>&gt;=</i> para que funcione. Como se ve, no es necesario hacer herencia de ningún tipo, el compilador detecta automáticamente si está o no sobrecargado y dará el correspondiente error en caso necesario (si miramos el caso de Java o de .Net veremos como sí es necesario hacer herencia para que el mecanismo de genéricos funcione de este modo).</p>
<p>Debo decir que el tema de las plantillas está muy bien y se puede hacer muchas cosas interesantes, como la clase array, que funciona igual que un array y que tiene un rendimiento muy parecido (benditos métodos <i>inline</i> de C++).</p>
<p>Otro día, seguiré hablando sobre plantillas, que dan para mucho.</int></pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.laparca.es/2008/07/25/plantillas-en-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aprendiendo Grails</title>
		<link>http://blog.laparca.es/2008/04/07/aprendiendo-grails/</link>
		<comments>http://blog.laparca.es/2008/04/07/aprendiendo-grails/#comments</comments>
		<pubDate>Mon, 07 Apr 2008 16:13:33 +0000</pubDate>
		<dc:creator>laparca</dc:creator>
				<category><![CDATA[Beca]]></category>
		<category><![CDATA[Desarrollo]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[groovy]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[RoR]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>

		<guid isPermaLink="false">http://blog.laparca.es/?p=305</guid>
		<description><![CDATA[La verdad es que últimamente me encuentro algo perro y escribo poco en la bitácora, lo cual no me molestaría lo más mínimo si no fuera porque casi cada día se me ocurre algo que escribir en ella. Una de estas cosas que me están ocurriendo actualmente es que estoy aprendiendo a programar en Groovy [...]]]></description>
			<content:encoded><![CDATA[<p>La verdad es que últimamente me encuentro algo perro y escribo poco en la bitácora, lo cual no me molestaría lo más mínimo si no fuera porque casi cada día se me ocurre algo que escribir en ella.</p>
<p>Una de estas cosas que me están ocurriendo actualmente es que estoy aprendiendo a programar en <a title="Web del lenguaje de programación ágil Groovy" href="http://groovy.codehaus.org/" target="_blank">Groovy</a> para utilizarlo junto a <a title="Web del entorno de desarrollo de aplicaciones web Grails" href="http://grails.codehaus.org/" target="_blank">Grails</a>. ¿Y qué serán estos &#8220;insultos&#8221; que acabo de soltar? Pues Grails es un conjunto de herramientas que busca ayudar a hacer aplicaciones web de forma rápida gracias al uso de convenciones. Para los que sepan un poco de qué va todo esto, es una copia de <a title="Sistema de desarrollo ágil de aplicaciones web" href="http://www.rubyonrails.org/" target="_blank">Ruby on Rails</a> (RoR, de aquí en adelante), pero utilizando herramientas Java.</p>
<p>El caso es que no lo he elegido frente a RoR por ser mejor que este ni más bonito. Lo he elegido porque tiene buena compatibilidad con Java y así puedo aprovechar cosas que ya tenía desarrolladas en este otro lenguaje (ahorrándome tiempo de desarrollo).</p>
<p>Ahora estoy haciendo una aplicación para la beca. No será muy compleja y me servirá para comprobar como funciona esta arquitectura. De momento las pruebas son realmente prometedoras <img src='http://blog.laparca.es/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laparca.es/2008/04/07/aprendiendo-grails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Diseño UML</title>
		<link>http://blog.laparca.es/2007/12/18/diseno-uml/</link>
		<comments>http://blog.laparca.es/2007/12/18/diseno-uml/#comments</comments>
		<pubDate>Mon, 17 Dec 2007 22:44:12 +0000</pubDate>
		<dc:creator>laparca</dc:creator>
				<category><![CDATA[Desarrollo]]></category>

		<guid isPermaLink="false">http://blog.laparca.es/index.php/2007/12/18/diseno-uml/</guid>
		<description><![CDATA[Hasta hace poco andaba buscando una herramienta de diseño UML que fuese portable, pudiese generar ficheros XMI y, como no, que me gustase. Después de mucho buscar he encontrado ArgoUML. Dispone de todo lo necesario: Diagramas de clases, interacción, despliegue, etc. Exportar a XMI e imágenes. Importar a partir de código fuente (Java, C++, IDL). [...]]]></description>
			<content:encoded><![CDATA[<p>Hasta hace poco andaba buscando una herramienta de diseño UML que fuese portable, pudiese generar ficheros XMI y, como no, que me gustase. Después de mucho buscar he encontrado <a href="http://argouml.tigris.org/" title="Herramienta de diseño UML" target="_blank" rel="nofollow">ArgoUML</a>.</p>
<p>Dispone de todo lo necesario:</p>
<ul>
<li>Diagramas de clases, interacción, despliegue, etc.</li>
<li>Exportar a XMI e imágenes.</li>
<li>Importar a partir de código fuente (Java, C++, IDL).</li>
<li>Generador de código (Java, C++, C#, PHP5, etc.).</li>
<li>Check lists para comprobar si se están definiendo adecuadamente las clases.</li>
</ul>
<p>Ahora me toca probarlo más en profundidad a ver qué tal, pero tiene muy buena pinta. Hay algunas cosillas que podrían ser más simples y estaría bien que los tipos de datos fuesen configurables ya que utiliza los de Java por defecto.</p>
<p>A ver si un poco más adelante puedo hacer una reseña más completa sobre la herramienta.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laparca.es/2007/12/18/diseno-uml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java reflection y los tipos genéricos (y II)</title>
		<link>http://blog.laparca.es/2007/12/15/java-reflection-y-los-tipos-genericos-y-ii/</link>
		<comments>http://blog.laparca.es/2007/12/15/java-reflection-y-los-tipos-genericos-y-ii/#comments</comments>
		<pubDate>Sat, 15 Dec 2007 11:48:15 +0000</pubDate>
		<dc:creator>laparca</dc:creator>
				<category><![CDATA[Desarrollo]]></category>

		<guid isPermaLink="false">http://blog.laparca.es/index.php/2007/12/15/java-reflection-y-los-tipos-genericos-y-ii/</guid>
		<description><![CDATA[Después de mucho pegarme con esto conseguí que me funcionase. Debo decir que no me gusta nada el hecho de no poder saber el tipo con el que se ha creado un genérico. Para que se comprenda qué es lo que he hecho y para qué lo necesitba tengo que decir que en la beca [...]]]></description>
			<content:encoded><![CDATA[<p>Después de mucho pegarme con esto conseguí que me funcionase. Debo decir que no me gusta nada el hecho de no poder saber el tipo con el que se ha creado un genérico.</p>
<p>Para que se comprenda qué es lo que he hecho y para qué lo necesitba tengo que decir que en la beca tengo una aplicación realizada en C++ que tiene impletentado su propio tipo de seriado (La palabra en español para <em>serializar</em> es <a rel="nofollow" href="http://buscon.rae.es/draeI/SrvltConsulta?TIPO_BUS=3&amp;LEMA=seriar" target="_blank">seriado</a>. Como en C++ no hay mecanismos de introspección (como java reflection, system.reflection, etc.), el modo de hacerlo es un poco más feo.</p>
<h2>Seriado en C++</h2>
<p>El mecanismo de seriado que he utilizado en C++ ha consistido en crear una clase abstracta con dos métodos abstractos, uno se seria los datos a un canal (puede ser un fichero, la red, MPI, etc.) y otro que realiza la operación inversa:</p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/**
* Clase abstracta que define los dos métodos necesarios para poder
* seriar cualquier clase por un canal de almacenamiento o de
* comunicaciones.
*/</span>
<span style="color: #0000ff;">class</span> Serializable <span style="color: #008000;">&#123;</span>
   <span style="color: #ff0000; font-style: italic;">/**
   * Seria el objeto a través de flujo os.
   */</span>
   <span style="color: #0000ff;">void</span> writeObject<span style="color: #008000;">&#40;</span>OutputStream <span style="color: #000040;">&amp;</span>os<span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
   <span style="color: #ff0000; font-style: italic;">/**
   * Lee los datos del objeto desde el flujo is.
   */</span>
   <span style="color: #0000ff;">void</span> readObject<span style="color: #008000;">&#40;</span>InputStream <span style="color: #000040;">&amp;</span>is<span style="color: #008000;">&#41;</span> <span style="color: #000080;">=</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span></pre></div></div>

<p>Es importante hacer notar que cualquier mecanismo de seriado exige que la clase seriable tenga un constructor vacío, para permitir regenerar todos los datos a partir del mecanismo de seriado.</p>
<p>El problema del mecanismo anterior es que el programador debe saber qué es lo que se va a transmitir y, por tanto, sabe qué tipo de dato le va a llegar. Esto no sucede con el sistema de seriado de java, que transmite el tipo de dato a través del canal.</p>
<p>Cuando quise ponerme a realizar esto mismo en java pensé que si ya tenía un mecanismo que me decía qué era lo que tenía que leer, no sería necesario implementar <em>readObject</em> y <em>writeObject</em> en cada clase, ya que puedo consultar cuales son los atributos de la clase. Pero el problema sobrevino cuando llegaron los genéricos.</p>
<h2>Los genéricos en Java</h2>
<p>Los genéricos en Java funcionan igual que las plantillas de C++, pero con una salvedad. En C++ las plantillas se transforman en una implementación distinta para cada tipo con el que se generase la plantilla, en Java sólo existe una implementación con el tipo más simple de la plantilla (si no se especifica nada, es Object).</p>
<p>Lo anterior significa que si yo tengo un vector de simulaciones, en C++ se creará una implemtanción específica de vector que sólo trabaja con simulaciones (y ningún otro tipo). En Java no sucede lo mismo. En Java sólo hay una implementación que será de tipo Object (todos heredan de Object) pero el control de que sea una simulación se realiza en tiempo de compilación. Esto supone que cuando se ejecute la aplicación ya no conoce si es correcto el dato que se le está pasando, ha sido el compilador el que hico la comprobación. Esto supone que no puedo regenerar de la forma deseada el vector.</p>
<h2>Solución actual</h2>
<p>En estos momentos he conseguido que funcione. Lo primero que hice fue ponerlo todo igual que lo tenía en C++, pero en Java. De este modo, todas las clases seriables deberán tener un readObject y un writeObject. Y para solucionar el tema de los genéricos hice lo siguiente:</p>
<p>Cree el tipo vector genérico que es seriable por este mecanismo. Para garantizar que funcionará he formazado a la clase a ser abstracta. Con lo que comenté en la anterior entrada sobre cómo obtener el tipo genérico, que dije que no funcionaba, pues sí funciona, pero no como yo esperaba. Para que funcione hay que heredar de la clase genérica de este modo:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">abstract</span> <span style="color: #000000; font-weight: bold;">class</span> VectorSeriable <span style="color: #009900;">&#123;</span>
   <span style="color: #000066; font-weight: bold;">void</span> readObject<span style="color: #009900;">&#40;</span><span style="color: #003399;">InputStream</span> is<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   <span style="color: #666666; font-style: italic;">/* Leo utilizando el tipo del generíco como se dijo en la anterior entrada */</span>
   <span style="color: #009900;">&#125;</span>
   <span style="color: #000066; font-weight: bold;">void</span> writeObject<span style="color: #009900;">&#40;</span><span style="color: #003399;">OutputStream</span> os<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   <span style="color: #666666; font-style: italic;">/* Grabo los objetos */</span>
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #008000; font-style: italic; font-weight: bold;">/**
* Al heredar de este modo, estamos creando una clase VectorSimulaciones
* que es idéntica a VectorSerializable, pero que ya conoce cual es el tipo
* de su genérico.
*/</span>
<span style="color: #000000; font-weight: bold;">class</span> VectorSimulaciones <span style="color: #000000; font-weight: bold;">extends</span> VectorSeriable <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span></pre></div></div>

<p>Como se puede apreciar, esto es igual que utilizat <em>typedef</em> en C++. De este modo he conseguido que funcione. Ahora debería ser posible eliminar los metodos readObject y writeObject para automatizar todo ya que es bastante feo tenerlos en cada clase.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.laparca.es/2007/12/15/java-reflection-y-los-tipos-genericos-y-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

