<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>oFlute</title>
	<atom:link href="https://oflute.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://oflute.wordpress.com</link>
	<description>oflute&#039;s development blog - Blog del desarrollo del proyecto oFlute</description>
	<lastBuildDate>Sun, 18 Mar 2012 14:07:19 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='oflute.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>https://s0.wp.com/i/buttonw-com.png</url>
		<title>oFlute</title>
		<link>https://oflute.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="https://oflute.wordpress.com/osd.xml" title="oFlute" />
	<atom:link rel='hub' href='https://oflute.wordpress.com/?pushpress=hub'/>
	<item>
		<title>Presentado PFC: Sobresaliente 10</title>
		<link>https://oflute.wordpress.com/2011/09/27/presentado-pfc-sobresaliente-10/</link>
					<comments>https://oflute.wordpress.com/2011/09/27/presentado-pfc-sobresaliente-10/#comments</comments>
		
		<dc:creator><![CDATA[JoseTomasTocino]]></dc:creator>
		<pubDate>Tue, 27 Sep 2011 13:09:51 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">http://oflute.wordpress.com/?p=227</guid>

					<description><![CDATA[¡Hola a todos! Acabo de venir de defender oFlute como Proyecto Fin de Carrera de la Ingeniería Técnica en Informática de Sistemas, con un resultado muy favorable. ¡He obtenido un 10-Sobresaliente de nota! Muchas gracias a todos por el apoyo 😀]]></description>
										<content:encoded><![CDATA[<p>¡Hola a todos!</p>
<p>Acabo de venir de defender oFlute como Proyecto Fin de Carrera de la Ingeniería Técnica en Informática de Sistemas, con un resultado muy favorable. ¡He obtenido un <strong>10-Sobresaliente</strong> de nota!</p>
<p>Muchas gracias a todos por el apoyo <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
					
					<wfw:commentRss>https://oflute.wordpress.com/2011/09/27/presentado-pfc-sobresaliente-10/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		
		<media:content url="https://2.gravatar.com/avatar/2515d0ef2f5da3d87492e1974a400983edaa6b5974d1caa7a9472ccf9b63762c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">josetomastocino</media:title>
		</media:content>
	</item>
		<item>
		<title>My point en la lucha biblioteca vs librería</title>
		<link>https://oflute.wordpress.com/2011/02/20/my-point-en-la-lucha-biblioteca-vs-libreria/</link>
					<comments>https://oflute.wordpress.com/2011/02/20/my-point-en-la-lucha-biblioteca-vs-libreria/#comments</comments>
		
		<dc:creator><![CDATA[JoseTomasTocino]]></dc:creator>
		<pubDate>Sun, 20 Feb 2011 16:33:18 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">http://oflute.wordpress.com/?p=224</guid>

					<description><![CDATA[Se han escrito muchocientos posts sobre si se dice librería o biblioteca cuando intentamos traducir library del inglés en el contexto informático. La traducción directa de library al español es biblioteca, cuando la traducción de librería en inglés es bookshop. Esto está claro, y de aquí se deduce que, en principio, deberíamos decir «la biblioteca [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Se han escrito muchocientos posts sobre si se dice librería o biblioteca cuando intentamos traducir <em>library </em>del inglés en el contexto informático. La traducción directa de <em>library</em> al español es <em>biblioteca</em>, cuando la traducción de <em>librería </em> en inglés es <em>bookshop</em>. Esto está claro, y de aquí se deduce que, en principio, deberíamos decir<em> «la biblioteca boost»</em> en lugar de <em>«la librería boost»</em>.</p>
<p>Ahora bien, mi opinión es que se puede decir de las dos maneras, basándome en una razón puramente semántica más que de traducción directa. Cuando hablamos de una <em>library</em>, utilizamos esa palabra como metáfora del conjunto de clases, funciones, ficheros y demás que la conforman, igual que cuando le decimos a un ávido lector<em> «¡qué biblioteca tan variada tienes!»</em> nos estamos refiriendo al conjunto de libros, no a las estanterías. En definitiva, nos estamos acogiendo a la <a href="http://buscon.rae.es/draeI/SrvltGUIBusUsual?LEMA=biblioteca">cuarta acepción de biblioteca en el dRAE</a>.</p>
<p>Si nos vamos al artículo de <em>librería </em>en el mismo dRAE, vemos que su<a href="http://buscon.rae.es/draeI/SrvltGUIBusUsual?LEMA=librer%C3%ADa"> segunda acepción</a> indica que es un sinónimo de la definición previamente mencionada de <em>biblioteca</em>. Por lógica, se concluye que a una colección más o menos numerosa de libros se le puede llamar tanto <em>biblioteca </em>como <em>librería</em>.  Quedando clara la equivalencia de ambos términos para ese significado, que es el que se utiliza al traducir <em>library</em> del inglés, queda igualmente validada la posibilidad de usar ambos términos al traducir aquél.</p>
<p>Q.E.D.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://oflute.wordpress.com/2011/02/20/my-point-en-la-lucha-biblioteca-vs-libreria/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
		
		<media:content url="https://2.gravatar.com/avatar/2515d0ef2f5da3d87492e1974a400983edaa6b5974d1caa7a9472ccf9b63762c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">josetomastocino</media:title>
		</media:content>
	</item>
		<item>
		<title>Por qué Gosu me está decepcionando</title>
		<link>https://oflute.wordpress.com/2011/02/07/por-que-gosu-me-esta-decepcionando/</link>
					<comments>https://oflute.wordpress.com/2011/02/07/por-que-gosu-me-esta-decepcionando/#comments</comments>
		
		<dc:creator><![CDATA[JoseTomasTocino]]></dc:creator>
		<pubDate>Sun, 06 Feb 2011 23:20:04 +0000</pubDate>
				<category><![CDATA[Librerías]]></category>
		<guid isPermaLink="false">http://oflute.wordpress.com/?p=221</guid>

					<description><![CDATA[Hola a todos. Por twitter y a algunos por GTalk les he comentado mis últimas y cambiantes opiniones sobre Gosu. Para los no iniciados, Gosu es una biblioteca open-source y multiplataforma para el desarrollo de videojuegos 2D, con aceleración OpenGL y un esquema de clases sencillísimo de usar. Lo he usado activamente estos últimos dos [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Hola a todos.</p>
<p>Por twitter y a algunos por GTalk les he comentado mis últimas y cambiantes opiniones sobre Gosu. Para los no iniciados, <a href="http://libgosu.org/">Gosu</a> es una biblioteca open-source y multiplataforma para el desarrollo de videojuegos 2D, con aceleración OpenGL y un esquema de clases sencillísimo de usar. Lo he usado activamente estos últimos dos años, tanto en mi proyecto oflute, como en <a href="http://code.google.com/p/freegemas/">freegemas</a> y en otros proyectos personales, y además he escrito tres artículos para la edición española de la revista <a href="http://www.linux-magazine.es/">Linux Magazine</a> que trataban sobre los conceptos básicos del desarrollo de videojuegos con Gosu. Por último, estoy preparando un taller sobre Gosu para las VI JOSLUCA. Creo que esto pondrá en perspectiva al lector en cuanto a mi familiaridad con Gosu.</p>
<p>Las razones por las que me está decepcionando son varias. El principal (y único, creo) desarrollador de Gosu es <a href="http://twitter.com/#!/jlnr">Julian Raschke</a>, un tío con mucho talento que lleva bastantes años detrás del proyecto. Por desgracia, es 100% maquero, y claro, eso se nota en el progreso de Gosu: lógicamente, la plataforma para la que más pulido está es Mac OS y iOS, seguido de Windows (por la obvia superioridad en el mercado de videojuegos) y por último Linux, que es la <strong>plataforma menos pulida</strong> de todas. </p>
<p>Quede claro que me parece loable el trabajo de Julian en cuanto a llevar hacia adelante el desarrollo en plataformas tan diversas, sobre todo en un tema tan variopinto como es una biblioteca para gamedev. Pero sin duda, se nota que Linux no es la que más atención recibe. El<strong> script de autotools</strong>, por ejemplo, lleva años sin actualizarse y con muchos errores de compilación</p>
<p>Uno de los problemas con los que me encontré al empezar mi andadura con Gosu fue que, en Linux, no se podían <strong>cargar fuentes</strong> si no estaban instaladas en el sistema. Es decir, no podías adjuntar un .ttf con tu proyecto con una fuente para tu menú principal, sino que, una de dos, o hacías que el usuario instalara la fuente (que es un coñazo en sistemas GNU/Linux) o convertías los textos a imágenes en tu Photoshop (olvidándote de los textos dinámicos). Este problema llevaba así desde el principio y nadie se había parado a intentar arreglarlo. A mí se me ocurrió adaptar la biblioteca SDL TTF, y le ofrecí un parche a J. Raschke, que amablemente incluyó en la distribución oficial, siendo posible desde entonces usar fuentes TTF en Linux.</p>
<p>Pero claro, de aquí surgió otro problema: ahora las fuentes <strong>no aparecían exactamente igual </strong>en los diferentes sistemas. De hecho, en Windows y en Linux, para un mismo tamaño de fuente, el <strong>renderizado era diferente</strong>. Teóricamente, esto se arregló en una de las últimas versiones, pero yo no estoy del todo convencido.</p>
<p>Otro problema que encontré hace poco es un pequeño bug, también solo de Linux, en el el método para <strong>ocultar el puntero del ratón</strong> no tenía efecto alguno, mostrándose siempre. Propuse una solución en el foro y supongo que para la próxima versión se incluirá.</p>
<p>Pero la gota que casi ha colmado el vaso ha sido en el tema del <strong>sonido</strong>. En este aspecto, Linux también andaba atrasada respecto a las otras plataformas. En particular, era Linux el único SO en el que a los sonidos no se les podía modificar el tono. En un intento por arreglar esto y unificar el back-end de sonido de Windows y Linux, se portó el sistema a la biblioteca Audiere. Pero, ay amigos, fue peor el remedio que la enfermedad. Audiere solo funciona con OSS, y esto la limita a que <strong>solo pueda haber un programa accediendo al dispositivo </strong>de sonido a la vez, por lo que si, por ejemplo, tenemos un vídeo de youtube abierto, no podremos lanzar nuestro juego. He hablado con Raschke y la decisión más probable es que se volverá a SDL Mixer mientras se buscan otras soluciones, basadas principalmente en OpenAl.</p>
<p>A mí Gosu me encanta, me parece facilísimo de usar y probablemente siga usándolo a medida que vayan mejorando. Pero todas estas cosas, que siempre pasan en la plataforma donde más trabajo, que es Linux, hacen que me esté planteando buscar otra opción con una comunidad más fuerte y mayor estabilidad, además de que me joden mucho, porque he dado mucha caña con Gosu y siempre me ha parecido una opción muy buena.</p>
<p>Lógicamente no voy a dar un paso atrás y volver a la SDL, ni tampoco voy a desechar el trabajo hecho con Gosu, que aún funciona. Pero quiero abrirme otras puertas que sean más sólidas.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://oflute.wordpress.com/2011/02/07/por-que-gosu-me-esta-decepcionando/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		
		<media:content url="https://2.gravatar.com/avatar/2515d0ef2f5da3d87492e1974a400983edaa6b5974d1caa7a9472ccf9b63762c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">josetomastocino</media:title>
		</media:content>
	</item>
		<item>
		<title>Novedades y puesta al día</title>
		<link>https://oflute.wordpress.com/2010/09/13/novedades-y-puesta-al-dia/</link>
					<comments>https://oflute.wordpress.com/2010/09/13/novedades-y-puesta-al-dia/#respond</comments>
		
		<dc:creator><![CDATA[JoseTomasTocino]]></dc:creator>
		<pubDate>Mon, 13 Sep 2010 19:55:31 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">http://oflute.wordpress.com/?p=216</guid>

					<description><![CDATA[Buenas, queridos y poco numerosos lectores. Estamos a 13 de septiembre, que casualmente es el día número 256 del año, lo cual lo convierte, por iniciativa popular, en el Programmer Day. Sentíos orgullosos. Dejando de lado las festividades de dudosa relevancia, os pongo un poco al día del estado de oFlute: Tenía pensado (y aún [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Buenas, queridos y poco numerosos lectores.</p>
<p>Estamos a 13 de septiembre, que casualmente es el día número 256 del año, lo cual lo convierte, por iniciativa popular, en el <a href="http://www.programmerday.info/">Programmer Day</a>. Sentíos orgullosos.</p>
<p>Dejando de lado las festividades de dudosa relevancia, os pongo un poco al día del estado de <strong>oFlute</strong>:</p>
<ul>
<li>Tenía pensado (y aún guardo alguna esperanza) presentar el proyecto a finales de septiembre. Para ello tendría que entregar la memoria, como muy tarde, este viernes día 17, cosa harto improbable, ya que la escritura de documentos repletos de morralla no es mi fuerte, además de que la ingeniería del software es una de las materias peor impartidas en mi carrera, por lo que no estoy muy al día. Pero bueno.</li>
<li>A pesar del punto anterior, voy a matricularme en el segundo ciclo de ingeniería informática, aquí en la Universidad de Cádiz. Se da la casualidad de que es posible matricularse sin tener la ingeniería técnica acabada, así que allá vamos. Entre el pseudo-gap-year que me he tomado, que el 99% del feedback que obtengo sobre el segundo ciclo es negativo y que todas las clases son por la tarde, no tengo muy claro cómo me va a ir este año. De todas formas tengo cierto proyecto secreto que tal vez me permita evadirme un poco.</li>
<li>En cuanto al proyecto, las siguientes novedades respecto a la última vez:
<ul>
<li>La parte del software podría decirse que está <strong>terminada</strong>, aunque cada día lo miro y retoco algunas cosillas.</li>
<li>Deseché mi sistema de traducción bananero y le eché valor al tema, adaptando exitosamente el proyecto a <strong>gettext</strong>, que al fin y al cabo es muy sencillo de utilizar. </li>
<li>Adapté el algoritmo de drop-shadows de <a href="http://www.curious-creature.org/2005/07/07/fast-or-good-drop-shadows/">esta web</a> y ahora puedo crear sombras al más puro estilo Photoshop de forma dinámica. Fijaos en el antes y después:
<p><a href="https://oflute.wordpress.com/wp-content/uploads/2010/09/difmenu.png"><img data-attachment-id="217" data-permalink="https://oflute.wordpress.com/2010/09/13/novedades-y-puesta-al-dia/difmenu/" data-orig-file="https://oflute.wordpress.com/wp-content/uploads/2010/09/difmenu.png" data-orig-size="353,242" data-comments-opened="1" data-image-meta="{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;}" data-image-title="difMenu" data-image-description="" data-image-caption="" data-medium-file="https://oflute.wordpress.com/wp-content/uploads/2010/09/difmenu.png?w=300" data-large-file="https://oflute.wordpress.com/wp-content/uploads/2010/09/difmenu.png?w=353" src="https://oflute.wordpress.com/wp-content/uploads/2010/09/difmenu.png?w=600" alt="" title="difMenu"   class="aligncenter size-full wp-image-217" srcset="https://oflute.wordpress.com/wp-content/uploads/2010/09/difmenu.png 353w, https://oflute.wordpress.com/wp-content/uploads/2010/09/difmenu.png?w=150&amp;h=103 150w, https://oflute.wordpress.com/wp-content/uploads/2010/09/difmenu.png?w=300&amp;h=206 300w" sizes="(max-width: 353px) 100vw, 353px" /></a></li>
<li>What else&#8230; Bueno, la parte de las canciones está terminada. Hago un llamamiento para que busquéis en vuestros cajones los cuadernos de pauta con canciones de flauta, que falta me hacen <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> aunque probablemente acabe metiendo, de oído, canciones de videojuegos famosos <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f600.png" alt="😀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li>
</ul>
</li>
<li>Y algunas cosillas más que se me escapan.</li>
</ul>
<p>¡Os mantendré informados!</p>
]]></content:encoded>
					
					<wfw:commentRss>https://oflute.wordpress.com/2010/09/13/novedades-y-puesta-al-dia/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
		<media:content url="https://2.gravatar.com/avatar/2515d0ef2f5da3d87492e1974a400983edaa6b5974d1caa7a9472ccf9b63762c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">josetomastocino</media:title>
		</media:content>

		<media:content url="https://oflute.wordpress.com/wp-content/uploads/2010/09/difmenu.png" medium="image">
			<media:title type="html">difMenu</media:title>
		</media:content>
	</item>
		<item>
		<title>Dependencias en los makefiles</title>
		<link>https://oflute.wordpress.com/2010/08/06/dependencias-en-los-makefiles/</link>
					<comments>https://oflute.wordpress.com/2010/08/06/dependencias-en-los-makefiles/#comments</comments>
		
		<dc:creator><![CDATA[JoseTomasTocino]]></dc:creator>
		<pubDate>Fri, 06 Aug 2010 14:48:36 +0000</pubDate>
				<category><![CDATA[Código]]></category>
		<category><![CDATA[General]]></category>
		<guid isPermaLink="false">http://oflute.wordpress.com/?p=210</guid>

					<description><![CDATA[Saludos veraniegos. Con la calor, es difícil acordarse de todas las dependencias de cada fichero, y a menudo se nos escapan algunas al escribir nuestro Makefile. Mi compañero David me comentó la existencia de makedepend, una herramienta para la gestión automática de dependencias que había visto de refilón en algún makefile ajeno pero que apenas [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Saludos veraniegos. Con la calor, es difícil acordarse de todas las dependencias de cada fichero, y a menudo se nos escapan algunas al escribir nuestro Makefile. Mi compañero <a href="http://siondream.com/blog/acerca-de/">David</a> me comentó la existencia de <a href="http://en.wikipedia.org/wiki/Makedepend">makedepend</a>, una herramienta para la gestión automática de dependencias que había visto de refilón en algún makefile ajeno pero que apenas conocía. </p>
<p>Leyendo su entrada en Wikipedia y algunos comentarios en StackOverflow, vi que actualmente se desaconseja su uso, prefiriéndose las alternativas que la mayoría de compiladores ofrecen de forma nativa. Así fue como conocí la opción <a href="https://www.redhat.com/docs/manuals/enterprise/RHEL-3-Manual/gcc/preprocessor-options.html">-MM</a> de gcc, cuyo cometido es el mismo que el de makedepend: generar, en formato makefile, una lista de dependencias para cada fichero, basándose en las cabeceras incluidas. El funcionamiento es sencillo:</p>
<pre class="brush: bash; title: ; notranslate">
gcc -MM $(CXXFLAGS) ficherosFuente
</pre>
<p>Es importante pasarle las flags de compilación, ya que suelen incluir directivas como -I, que indican las carpetas en las que buscar ficheros de cabecera. </p>
<h2>Problema 1: utilización de las dependencias generadas</h2>
<p>La utilidad makedepend automáticamente actualizaba el makefile que la ejecutaba, añadiendo al final del fichero las dependencias generadas. Sin embargo, gcc -MM muestra su resultado en la salida estándar (o en un fichero que indiquemos), en lugar de añadirlo al Makefile actual, por lo que había que buscar una forma de incluir el resultado en nuestro Makefile. Con utilizar</p>
<pre class="brush: bash; title: ; notranslate">
-include dependencias.dep
</pre>
<p>Podremos incluir cualquier fichero en nuestro Makefile como parte del mismo.</p>
<h2>Problema 2: rutas en el fichero generado</h2>
<p>En mi caso, tengo tres carpetas que cuelgan de la raíz del proyecto: src, obj e include, en las que se guardan los cpp, los ficheros objeto y las cabeceras respectivamente. El problema de gcc -MM es que, al generar las dependencias, quita la ruta de la cabecera de las reglas, esto es, si tenemos un fichero objeto <code>obj/main.o</code> que depende de <code>main.cpp</code>, en el fichero generado aparecería así:</p>
<pre class="brush: plain; title: ; notranslate">
main.o: src/main.cpp
</pre>
<p>Por ahora, la única solución que he encontrado es utilizar sed para añadir al inicio la ruta correspondiente, aunque me habría gustado que gcc incluyera una opción al respecto.</p>
<pre class="brush: bash; title: ; notranslate">
gcc -MM $(CXXFLAGS) $(shell ls -t $(SRCDIR)/*.cpp) | sed 's/^\([a-zA-Z]\+.o:\)/$(OBJDIR)\/\1/g' &gt; $(DEPFILE)
</pre>
<p>La explicación de la expresión regular es muy sencilla: Simplemente, cada vez que encuentre al inicio de la línea el nombre de un fichero objeto, que añada el nombre del directorio de los objetos (OBJDIR) y luego el nombre del fichero. Se utilizan grupos, primero agrupando el nombre con paréntesis y luego haciendo referencia al grupo con \1.</p>
<p>Por último, comentar que he puesto como dependencia del binario final al archivo de dependencias, y como dependencia del archivo de dependencias (valga la redundancia) todos los ficheros de código. El objetivo es que, si modifico algún fichero de código, puede que los includes cambien, así que hay que regenerar las dependencias. Tal vez acabe quitando esta dependencia cruzada, ya que estar regenerando las dependencias constantemente es un rollo. Otra opción que tal vez baraje es la de tener un archivo de dependencias por cada fichero objeto, así la regeneración no será tan pesada.</p>
<p>Opciones hay muchas.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://oflute.wordpress.com/2010/08/06/dependencias-en-los-makefiles/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		
		<media:content url="https://2.gravatar.com/avatar/2515d0ef2f5da3d87492e1974a400983edaa6b5974d1caa7a9472ccf9b63762c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">josetomastocino</media:title>
		</media:content>
	</item>
		<item>
		<title>[Boost en español] Ejemplo rápido de aplicación de Bind</title>
		<link>https://oflute.wordpress.com/2010/07/15/boost-en-espanol-ejemplo-rapido-de-aplicacion-de-bind/</link>
					<comments>https://oflute.wordpress.com/2010/07/15/boost-en-espanol-ejemplo-rapido-de-aplicacion-de-bind/#comments</comments>
		
		<dc:creator><![CDATA[JoseTomasTocino]]></dc:creator>
		<pubDate>Thu, 15 Jul 2010 12:26:14 +0000</pubDate>
				<category><![CDATA[boost]]></category>
		<category><![CDATA[Código]]></category>
		<category><![CDATA[Librerías]]></category>
		<guid isPermaLink="false">http://oflute.wordpress.com/?p=207</guid>

					<description><![CDATA[Justo ayer, peleándome un rato con freegemas, me surgió la necesidad de iterar por un vector y borrar los elementos que tuvieran cierta propiedad. A primera vista puede parecer sencillo, pero la solución no es trivial: Si utilizas un bucle for, al borrar un elemento el tamaño y los índices de los elementos también, por [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Justo ayer, peleándome un rato con <a href="https://code.google.com/p/freegemas/">freegemas</a>, me surgió la necesidad de iterar por un vector y borrar los elementos que tuvieran cierta propiedad. A primera vista puede parecer sencillo, pero la solución no es trivial:</p>
<ul>
<li>Si utilizas un bucle for, al borrar un elemento el tamaño y los índices de los elementos también, por lo que la variable de seguimiento (típicamente <code>size_t i</code>) ya no vale.</li>
<li>Si utilizas iteradores, al eliminar un elemento aquellos quedan invalidados.</li>
</ul>
<p>Estuve pensando un poco cómo hacerlo y se me ocurrieron algunas formas poco ortodoxas o que podrían llevar a error. Una de las formas que encontré por internet fue la siguiente, con iteradores y un for algo especial:</p>
<pre class="brush: cpp; title: ; notranslate">
for (iterator it = v.begin(); 
     it != v.end(); 
    ) 
{ 
    if (condition) 
	it = v.erase(it); 
    else 
	++it; 
}
</pre>
<p>Si os fijáis, el <code>for</code> no tiene tercer parámetro, sino que somos nosotros los que movemos el iterador manualmente. Para evitar la invalidación, utilizamos el valor de retorno de <code>erase</code>.</p>
<p>Pero otra forma de hacerlo, más elegante a mi parecer, era utilizar el algoritmo <code>remove_if</code> y un predicado adecuado. En mi caso, el contenedor tenía objetos de una clase con un método que devolvía un booleano tal que, si es <em>verdadero</em>, el elemento debería borrarse. En un primer intento hice</p>
<pre class="brush: cpp; title: ; notranslate">
remove_if(contenedor.begin(), contenedor.end(), boost::bind&lt;bool&gt;(&amp;Clase::Comprobar, _1));
</pre>
<p>Pero los elementos no se borraban. «Qué raro», pensé. Resulta que el funcionamiento de <code>remove_if</code> no es el de borrar directamente los elementos, sino que reordena los elementos a borrar al final del contenedor y devuelve un iterador que apunta al primero de esos elementos a borrar. Así, junto al método <code>erase</code> del vector, tenemos:</p>
<pre class="brush: cpp; title: ; notranslate">
contenedor.erase(remove_if(contenedor.begin(), contenedor.end(), boost::bind&lt;bool&gt;(&amp;Clase::Comprobar, _1)), contenedor.end());
</pre>
<p>Esto se conoce como el <a href="http://en.wikipedia.org/wiki/Erase-remove_idiom">Erase-remove idiom</a> y tiene hasta su propio artículo en la Wikipedia. Muy curioso.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://oflute.wordpress.com/2010/07/15/boost-en-espanol-ejemplo-rapido-de-aplicacion-de-bind/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		
		<media:content url="https://2.gravatar.com/avatar/2515d0ef2f5da3d87492e1974a400983edaa6b5974d1caa7a9472ccf9b63762c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">josetomastocino</media:title>
		</media:content>
	</item>
		<item>
		<title>[Boost en español III] Tuplas</title>
		<link>https://oflute.wordpress.com/2010/07/14/boost-en-espanol-iii-tuplas/</link>
					<comments>https://oflute.wordpress.com/2010/07/14/boost-en-espanol-iii-tuplas/#comments</comments>
		
		<dc:creator><![CDATA[JoseTomasTocino]]></dc:creator>
		<pubDate>Wed, 14 Jul 2010 15:25:31 +0000</pubDate>
				<category><![CDATA[boost]]></category>
		<category><![CDATA[Librerías]]></category>
		<guid isPermaLink="false">http://oflute.wordpress.com/?p=203</guid>

					<description><![CDATA[Las tuplas en C++ son una versión generalizada de std::pair, en las que podremos almacenar un número arbitrario de valores de distinto tipo. Al formar parte de TR1, podréis encontrarlas: En la cabecera boost/tuple/tuple.hpp, como boost::tuple. En la biblioteca estándar, en la cabecera tr1/tuple, como std::tr1::tuple. Las tuplas se declaran de manera similar a los [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Las tuplas en C++ son una versión generalizada de <code>std::pair</code>, en las que podremos almacenar un número arbitrario de valores de distinto tipo.</p>
<p>Al formar parte de TR1, podréis encontrarlas:</p>
<ul>
<li>En la cabecera <code>boost/tuple/tuple.hpp</code>, como <code>boost::tuple</code>.</li>
<li>En la biblioteca estándar, en la cabecera <code>tr1/tuple</code>, como <code>std::tr1::tuple</code>.</li>
</ul>
<p>Las tuplas se declaran de manera similar a los pares, indicando la cantidad y tipos de los datos contenidos como parámetros de plantilla. Podemos inicializar los datos pasándole los valores al constructor.</p>
<pre class="brush: cpp; title: ; notranslate">
boost::tuple&lt;int, string, string&gt; miTupla (1, &quot;Cisco&quot;, &quot;Pepe&quot;);
</pre>
<p>Para los pares, se utilizaba <code>first</code> y <code>second</code> para acceder a los datos, pero al tener un número variable de elementos, con las tuplas hace falta alguna forma más genérica. Para ello se proporciona la función paramétrica <code>get</code>, que recibe como parámetro de plantilla el índice el elemento al que queremos acceder. Al devolver una referencia, nos servirá tanto de <code>getter</code> como de <code>setter</code>.</p>
<pre class="brush: cpp; title: ; notranslate">
string cadena = miTupla.get&lt;1&gt;();
miTupla.get&lt;0&gt;() = 5;
</pre>
<p>Otra de las utilidades que vienen con las tuplas es <code>tie</code>, que nos permitirá darle valor a varias variables de una vez, incluso utilizando el valor de retorno de una función. Además, <code>tie</code> funciona tanto con tuplas como con los pares tradicionales.</p>
<pre class="brush: cpp; title: ; notranslate">
pair&lt;int, int&gt; fun (){
    return make_pair(5, 3);
}

int main(int argc, char *argv[])
{
    int a, b;
    tr1::tie(a, b) = fun();
    printf(&quot;a:%i, b:%i\n&quot;, a, b);
}
</pre>
<p>Las tuplas traen muchas más funciones y utilidades, como por ejemplo para personalizar los operadores de flujos facilitando la entrada y salida, y muchas otras opciones que podéis observar en la <a href="http://www.boost.org/doc/libs/release/libs/tuple/doc/tuple_users_guide.html">documentación</a> oficial.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://oflute.wordpress.com/2010/07/14/boost-en-espanol-iii-tuplas/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		
		<media:content url="https://2.gravatar.com/avatar/2515d0ef2f5da3d87492e1974a400983edaa6b5974d1caa7a9472ccf9b63762c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">josetomastocino</media:title>
		</media:content>
	</item>
		<item>
		<title>FreeGemas</title>
		<link>https://oflute.wordpress.com/2010/07/12/freegemas/</link>
					<comments>https://oflute.wordpress.com/2010/07/12/freegemas/#comments</comments>
		
		<dc:creator><![CDATA[JoseTomasTocino]]></dc:creator>
		<pubDate>Mon, 12 Jul 2010 22:04:29 +0000</pubDate>
				<category><![CDATA[General]]></category>
		<guid isPermaLink="false">http://oflute.wordpress.com/?p=200</guid>

					<description><![CDATA[Hace unos pocos días comencé el proyecto FreeGemas, una versión open source del clásico Bejeweled escrita, cómo no, en C++ y Gosu. Entre la noche del 7 y la mañana del 8 de julio tenía la parte del principal del motor andando. Creo que ha sido un gran ejercicio de diseño y desarrollo rápido, y [&#8230;]]]></description>
										<content:encoded><![CDATA[<div style="text-align:center;"><img src="https://i0.wp.com/freegemas.googlecode.com/svn/web/freegemas_header.png" alt="" /></div>
<p>Hace unos pocos días comencé el proyecto <a href="https://code.google.com/p/freegemas/">FreeGemas</a>, una versión <em>open source</em> del clásico <a href="http://en.wikipedia.org/wiki/Bejeweled">Bejeweled</a> escrita, cómo no, en C++ y <a href="http://www.libgosu.org">Gosu</a>.</p>
<p>Entre la noche del 7 y la mañana del 8 de julio tenía la parte del principal del motor andando. Creo que ha sido un gran ejercicio de diseño y desarrollo rápido, y espero seguir desarrollándolo. Huelga decir que todas las imágenes y recursos son libres. Ahora estoy en la búsqueda de sonidos libres, ¿sugerencias?.</p>
<p>En la <a href="https://code.google.com/p/freegemas/">web del proyecto</a> podréis encontrar las instrucciones de instalación, que son casualmente similares a las de oFlute <img src="https://s0.wp.com/wp-content/mu-plugins/wpcom-smileys/twemoji/2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>Espero que os guste.</p>
<p>ACTUALIZACIÓN: acaba de lanzarse Guadalinex V8 y FreeGemas ha sido incluido en la distribución como uno de las novedades. Para más información y donaciones (xD) al desarrollador, dirígete a mi web personal <a href="http://josetomastocino.com">JoseTomasTocino.com</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://oflute.wordpress.com/2010/07/12/freegemas/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		
		<media:content url="https://2.gravatar.com/avatar/2515d0ef2f5da3d87492e1974a400983edaa6b5974d1caa7a9472ccf9b63762c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">josetomastocino</media:title>
		</media:content>

		<media:content url="http://freegemas.googlecode.com/svn/web/freegemas_header.png" medium="image" />
	</item>
		<item>
		<title>[Boost en español II] Bind y Function</title>
		<link>https://oflute.wordpress.com/2010/07/12/boost-en-espanol-ii-bind-y-function/</link>
					<comments>https://oflute.wordpress.com/2010/07/12/boost-en-espanol-ii-bind-y-function/#comments</comments>
		
		<dc:creator><![CDATA[JoseTomasTocino]]></dc:creator>
		<pubDate>Mon, 12 Jul 2010 21:40:31 +0000</pubDate>
				<category><![CDATA[boost]]></category>
		<category><![CDATA[Librerías]]></category>
		<guid isPermaLink="false">http://oflute.wordpress.com/?p=190</guid>

					<description><![CDATA[Seguimos con la segunda entrega de esta serie de posts sobre Boost en español. En esta ocasión hablaremos de las bibliotecas Bind y Function, que nos facilitan el uso de objetos función, punteros a funciones y cosas parecidas. Conceptos previos Un objeto función es una instancia de una clase que tiene definido el operador (). [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Seguimos con la segunda entrega de esta serie de posts sobre Boost en español. En esta ocasión hablaremos de las bibliotecas Bind y Function, que nos facilitan el uso de objetos función, punteros a funciones y cosas parecidas.</p>
<h2>Conceptos previos</h2>
<p>Un <strong>objeto función</strong> es una instancia de una clase que tiene definido el operador (). Esto nos permite usar el objeto como si de una función se tratara:</p>
<pre class="brush: cpp; title: ; notranslate">
struct Functor{
  void operator()(){
    cout &lt;&lt; &quot;Waking up in vegas&quot; &lt;&lt; endl;
  }
};

int main(){
  Functor F;
  F();
}
</pre>
<p>El verdadero potencial de estos objetos radica en que permiten expandir de manera sencilla la mayoría de los algoritmos de la STL de C++, ya que suelen poder recibir objetos función que modifiquen su funcionamiento para adaptarlo a nuestras necesidades.</p>
<p>Por ejemplo, el algoritmo <code>for_each</code>, contenido en la cabecera <code>algorithm</code>, nos permite iterar sobre un contenedor y aplicar una función por cada elemento (<em>for each element</em>). En estos casos, es útil utilizar un objeto función como extensión al algoritmo:</p>
<pre class="brush: cpp; title: ; notranslate">
#include &lt;iostream&gt;
#include &lt;boost/array.hpp&gt;
#include &lt;algorithm&gt;

using namespace std;

struct Botella{
    string etiqueta;
    Botella(string e) : etiqueta(e) { }
};

struct Impresor{
    string destino;
    int n;
    Impresor(string d = &quot;ERROR&quot;) : destino(d), n(0){ }

    void operator() (Botella &amp; B){
	cout &lt;&lt; destino &lt;&lt; &quot;(&quot; &lt;&lt; n++ &lt;&lt; &quot;): &quot; &lt;&lt; B.etiqueta &lt;&lt; endl;
    }
};

int main(int argc, char *argv[])
{
    boost::array&lt;Botella, 3&gt; vector = { {Botella(&quot;Cruzcampo&quot;),
					 Botella(&quot;San Miguel&quot;),
					 Botella(&quot;Mahou&quot;) } };
    Impresor I(&quot;DEBUG&quot;);
    for_each(vector.begin(), vector.end(), I);
    return 0;
}
</pre>
<p>En la STL hay un gran número de algoritmos que podemos usar. Para más información, recomiendo la lectura del punto 8, capítulo 7, del libre «Fundamentos de C++», del Servicio de Publicaciones de la UCA.</p>
<p>La pega que tiene el uso de los objetos función en los algoritmos de la STL es que la sobrecarga del operador() debe tener un solo parámetro del tipo del contenedor, lo cual nos limita bastante.</p>
<h2>Boost.Bind</h2>
<p>Bind nos da la posibilidad de ligar los parámetros de una función o un objeto función a un valor concreto, o a otra posición. ¿Qué quiere decir esto? Si tenemos, por ejemplo, un objeto función que recibe dos parámetros y nos interesa que uno de ellos sea siempre el mismo, podemos usar bind. Notar que bind siempre <strong>devuelve un objeto función</strong> cuyo operador () estará ligado a la función original.</p>
<pre class="brush: cpp; title: ; notranslate">
#include &lt;iostream&gt;
#include &lt;algorithm&gt;

#include &lt;boost/array.hpp&gt;
#include &lt;boost/bind.hpp&gt;

using namespace std;

struct Elemento{
    int n;
    Elemento(int n = 0) : n(n) { }
};

struct Comparador{
    void operator() (int n, Elemento &amp; E){
	if(E.n &gt; n)
	    cout &lt;&lt; &quot;HOYGAN, parece que este elemento (&quot; &lt;&lt; E.n 
		 &lt;&lt; &quot;) es mayor que &quot; &lt;&lt; n &lt;&lt; endl;
    }
};

int main(int argc, char *argv[])
{
    boost::array&lt;Elemento, 3&gt; arr = {{Elemento(2),
				      Elemento(4),
				      Elemento(8)}};

    for_each(arr.begin(), arr.end(),
	     boost::bind&lt;void&gt;(Comparador(), 3, _1));
    return 0;
}
</pre>
<p>Si os fijáis, la sintaxis de <code>bind</code> es sencilla: Recibe un parámetro de plantilla que indica el tipo de dato de vuelto por la función ligada. Normalmente es capaz de deducir qué tipo de datos se devuelve, pero hay casos en los que es necesario indicarlo explícitamente.</p>
<p>Luego, recibe como argumentos la función u objeto función a ligar, y seguidamente los parámetros de ésta. Podemos indicar directamente el valor, o utilizar <em>placeholders</em>, que nos permiten ligar los parámetros de entrada con los de salida. En nuestro ejemplo, _1 que está en el segundo lugar indica que el segundo parámetro de la función será el primero que reciba <code>bind</code>.</p>
<p>La reorganización de parámetros se puede ver mejor con este otro ejemplo:</p>
<pre class="brush: cpp; title: ; notranslate">
#include &lt;iostream&gt;
#include &lt;algorithm&gt;

#include &lt;boost/bind.hpp&gt;

using namespace std;

void fun (int A, int B){
    cout &lt;&lt; &quot;A: &quot; &lt;&lt; A &lt;&lt; endl
	 &lt;&lt; &quot;B: &quot; &lt;&lt; B &lt;&lt; endl;
}

int main(int argc, char *argv[])
{
    boost::bind(fun, _2, _1) (1, 2);
    return 0;
}
</pre>
<h2>Boost.Function</h2>
<p>En ocasiones nos interesará tener la función ligada como un objeto con el que trabajar, por ejemplo para poder recibirla como argumento de una función. Para esos casos, boost nos proporciona <code>function</code>. Se trata de una clase paramétrica cuyo operador () se sobrecargará para llamar a la función ligada.</p>
<pre class="brush: cpp; title: ; notranslate">
class miClase{
public:

    void hacerSuma(int a){
        cout &lt;&lt; &quot;Hago una suma: &quot; &lt;&lt; a &lt;&lt; endl;
    }

    void hacerResta(int a){
        cout &lt;&lt; &quot;Hago una resta: &quot; &lt;&lt; a &lt;&lt; endl;
    }
};

int main(){
 boost::function&lt;void(miClase, int)&gt; operacion;

    if(1 == 0){
        operacion = boost::bind(&amp;miClase::hacerSuma, _1, _2);
    }else{
        operacion = boost::bind(&amp;miClase::hacerResta, _1, _2);
    }
    miClase c;
    operacion(c, 2);
}
</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://oflute.wordpress.com/2010/07/12/boost-en-espanol-ii-bind-y-function/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		
		<media:content url="https://2.gravatar.com/avatar/2515d0ef2f5da3d87492e1974a400983edaa6b5974d1caa7a9472ccf9b63762c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">josetomastocino</media:title>
		</media:content>
	</item>
		<item>
		<title>[Boost en español I] Las bibliotecas en el TR1 (1ª part, Array y Hash)</title>
		<link>https://oflute.wordpress.com/2010/07/03/boost-en-espanol-i-las-bibliotecas-en-el-tr1-1%c2%aa-parte/</link>
					<comments>https://oflute.wordpress.com/2010/07/03/boost-en-espanol-i-las-bibliotecas-en-el-tr1-1%c2%aa-parte/#respond</comments>
		
		<dc:creator><![CDATA[JoseTomasTocino]]></dc:creator>
		<pubDate>Sat, 03 Jul 2010 17:09:59 +0000</pubDate>
				<category><![CDATA[boost]]></category>
		<category><![CDATA[Librerías]]></category>
		<category><![CDATA[array]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[container]]></category>
		<category><![CDATA[contenedor]]></category>
		<category><![CDATA[español]]></category>
		<category><![CDATA[hash]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[spanish]]></category>
		<category><![CDATA[tr1]]></category>
		<category><![CDATA[vector]]></category>
		<guid isPermaLink="false">http://oflute.wordpress.com/?p=171</guid>

					<description><![CDATA[Este es el primero de una serie de posts sobre Boost en español, en el que haremos un repaso por un subconjunto de estas bibliotecas. Descargando, compilando y usando Boost Además de su utilidad, las bibliotecas Boost brillan en su facilidad de uso, ya que la inmensa mayoría de las mismas están totalmente definidas en [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Este es el primero de una serie de posts sobre <a href="http://www.boost.org">Boost</a> en español, en el que haremos un repaso por un subconjunto de estas  bibliotecas.</p>
<h2>Descargando, compilando y usando Boost</h2>
<p>Además de su utilidad, las bibliotecas Boost brillan en su facilidad de uso, ya que la inmensa mayoría de las mismas están totalmente definidas en ficheros de cabecera que simplemente incluiremos en nuestro proyecto, evitando tener que compilarlas y enlazarlas de forma independiente. Hay una serie de bibliotecas que, por su complejidad, necesitan ser compiladas y enlazadas, pero son casos en los que la compilación es indispensable y merece la pena por la funcionalidad que ofrecen.</p>
<p>Hoy en día la mayoría de las distribuciones de GNU/Linux alojan en sus repositorios paquetes con las bibliotecas Boost. Por regla general, se distribuye un paquete con la mayoría de las bibliotecas de cabecera, y por separado un paquete por cada biblioteca que necesita enlazado. En esta serie de artículos se indicará convenientemente cuándo es necesario realizar alguna clase de operación especial al compilar y enlazar.</p>
<h2>C++ Technical Report 1</h2>
<p>Como comenté en el<a href="https://oflute.wordpress.com/2010/07/02/taller-de-boost-ahora-en-posts/"> post anterior</a>, vamos a empezar comentando por encima las bibliotecas de Boost que aparecen en el <a href="http://en.wikipedia.org/wiki/C%2B%2B_Technical_Report_1">C++ Technical Report 1</a>. Pero primero, ¿qué es ese documento?</p>
<p>Tal y como <a href="http://en.wikipedia.org/wiki/C%2B%2B_Technical_Report_1">explica la wikipedia</a>, se trata de un documento que propone una serie de adiciones a la biblioteca estándar de C++. No es un estándar en sí mismo, sino una propuesta borrador, aunque con toda probabilidad gran parte o la totalidad del mismo formará parte de la siguiente versión de C++. Por lo tanto, es interesante echarle un vistazo para familiarizarse con lo que está por llegar.</p>
<p>En cuanto a Boost, 12 de sus bibliotecas han sido incluídas en el TR1, aquí las veremos todas por encima y algunas con más profundidad.</p>
<div style="border:2px solid red;padding:5px;"><span style="color:red;">Nota</span> Dado que las primeras librerías que vamos a ver está en el TR1, es posible usar directamente las implementaciones de los compiladores. </p>
<p>Por ejemplo, para boost.array, en lugar de usar la cabecera <code>boost/array.hpp</code> podemos usar <code>tr1/array</code> (sin extensión, típico de la std), y cambiar el namespace <code>boost</code> por el <code>tr1</code>. Sin modificar nada más, el código compilará usando la implementación de array de GCC.</div>
<h2>Boost.Array</h2>
<p>Documentación: <a href="http://www.boost.org/doc/libs/1_43_0/doc/html/array.html">http://www.boost.org/doc/libs/1_43_0/doc/html/array.html</a><br />
Cabecera: <code>boost/array.hpp</code></p>
<p>Se trata de un wrapper que adapta las arrays de tamaño fijo, típicas de C, para su uso como contenedor estándar, añadiendo una serie de métodos y tipos de datos tales como <code>size</code> y <code>at</code>, iteradores, etcétera. Las ventajas sobre los arrays clásicos son claras: métodos útiles para conocer el tamaño, métodos de acceso con control de límites, etcétera.</p>
<p>Hay muchas ocasiones en las que utilizamos <code>std::vector</code> incluso sabiendo que el tamaño no va a variar, simplemente por evitar utilizar arrays <em>a pelo</em>. En esos casos, <code>boost::array</code> es ideal, ya que comparte la mayoría de métodos de <code>vector</code> y, al no tener que lidiar con ampliaciones y reducciones dinámicas de memoria, es mucho más eficiente.</p>
<p>Por último, otra de las grandes ventajas de esta biblioteca es la posibilidad de inicializarse en línea como un <a href="http://msdn.microsoft.com/en-us/library/sdwe79a4%28VS.80%29.aspx">agregado</a>, lo que nos evita andar inicializando los elementos uno a uno.</p>
<pre class="brush: cpp; title: ; notranslate">
#include &lt;boost/array.hpp&gt;

#include &lt;iostream&gt;
#include &lt;string&gt;

using namespace std;

int main(int argc, char *argv[])
{
    /*
      Ejemplo 1: Inicialización básica de un boost::array
    */
    boost::array&lt;string, 3&gt; primos = { {&quot;Shurmano&quot;, &quot;Shurprimo&quot;, &quot;Shurperro&quot;} };
    cout &lt;&lt; primos[0] &lt;&lt; endl
	 &lt;&lt; primos[1] &lt;&lt; endl
	 &lt;&lt; primos[2] &lt;&lt; endl;

    /*
      Ejemplo 2: Métodos típicos de los contenedores
     */

    // Tamaño
    cout &lt;&lt; &quot;Tamaño: &quot; &lt;&lt; primos.size() &lt;&lt; endl;

    // Bound checking (comprobación de límites)
    try{
	cout &lt;&lt; primos.at(4) &lt;&lt; endl;
    }catch(std::out_of_range&amp;){
	cout &lt;&lt; &quot;Fuera de rango&quot; &lt;&lt; endl;
    }

    // Iteradores
    cout &lt;&lt; *primos.begin() &lt;&lt; endl
	 &lt;&lt; *(primos.end()-1) &lt;&lt; endl;

    // Operadores
    boost::array&lt;int, 4&gt; yo = { {0, 1, 2, 3} };
    boost::array&lt;int, 4&gt; another = { {0, 1, 2, 5} };
    cout &lt;&lt; ((yo == another)?&quot;Iguales&quot;:&quot;Diferentes&quot;) &lt;&lt; endl;

    return 0;
}

</pre>
<p>En <a href="http://std.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1548.htm">este enlace</a> se explican las motivaciones y detalles detrás de <code>boost.array</code>.</p>
<h2>Boost.Hash</h2>
<p><a href="http://www.boost.org/doc/libs/1_43_0/doc/html/hash.html">Documentación</a>.<br />
Cabecera: <code>boost/functional/hash.hpp</code></p>
<p>Un <a href="http://es.wikipedia.org/wiki/Hash">hash</a> es una forma de identificar de forma unívoca a cualquier elemento. Se utiliza una<strong> función hash</strong> que, a partir de las propiedades de un objeto, genera un código único. Los hashes se suelen utilizar en contextos en los que es necesario identificar e indexar elementos, como en los contenedores. La ventaja que ofrece el indexar por hash en lugar de por otro tipo de clave es que la comparación de hashes es muy eficiente, por lo que los accesos se hacen más rápido.</p>
<p><code>Boost.Hash</code> nos permite generar hashes para enteros, flotantes, punteros y cadenas de forma nativa, y además, provee soporte para la generación de hashes de tipos de datos definidos por el usuario y hashes combinados. La utilización de esta biblioteca es muy sencilla: simplemente creamos una instancia de la clase paramétrica <code>boost::hash</code>, que recibe como parámetro el tipo de dato a <em>hashear</em>. Seguidamente, cuando queramos generar un hash, utilizaremos el operador () del objeto creado.</p>
<pre class="brush: cpp; title: ; notranslate">
boost::hash&lt;std::string&gt; string_hash;
    cout &lt;&lt; &quot;Hash de cadena: &quot; 
	 &lt;&lt; string_hash(&quot;Don't hash me, bro!&quot;) &lt;&lt; endl;
</pre>
<p>Si tenemos un tipo de datos propio, por ejemplo una clase, y queremos calcular su hash, previamente tendremos que sobrecargar la función <code>size_t hash_value(const T &amp; t)</code>, siendo T nuestro tipo de datos. Dentro de esa función tendremos que implementar el algoritmo de hash para nuestra clase concreta.</p>
<p>Por regla general, a la hora de implementar el hash de un tipo propio, tenemos que fijarnos en qué propiedades tiene cada instancia de esa clase que la hace única. Si, por ejemplo, tenemos una clase <code>código de barras</code> con un atributo <code>número</code> que la identifica, el hash de la clase será el hash del código.</p>
<pre class="brush: cpp; title: ; notranslate">
class codigoBarras{
  int numero;
public:
  // ...
  friend std::size_t hash_value(const codigoBarras &amp; C){
    boost::hash&lt;int&gt; hasher; 
    return hasher(C.numero);
  }
};
</pre>
<p>Otro ejemplo: si tenemos una clase <code>alumno</code> con dos atributos <code>nombre</code> y <code>apellido</code>, el hash de esa clase será una combinación del hash del nombre y el hash del apellido.</p>
<pre class="brush: cpp; title: ; notranslate">
class alumno{
  string nombre, apellido;

public:
  // ...
  friend std::size_t hash_value(const alumno &amp; a){
    std::size_t valor = 0;
    boost::hash_combine(valor, a.nombre);
    boost::hash_combine(valor, b.nombre);
    return valor;
  }
};
</pre>
<p><code>Boost.hash</code> se utiliza en la biblioteca <code>Boost.unordered</code>, que proporciona alternativas no ordenadas a los conjuntos (set) y mapas (map) de la STL, mejorando la eficacia en órdenes de magnitud.</p>
<p>Hasta aquí la primera entrega de estos artículos. </p>
]]></content:encoded>
					
					<wfw:commentRss>https://oflute.wordpress.com/2010/07/03/boost-en-espanol-i-las-bibliotecas-en-el-tr1-1%c2%aa-parte/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		
		<media:content url="https://2.gravatar.com/avatar/2515d0ef2f5da3d87492e1974a400983edaa6b5974d1caa7a9472ccf9b63762c?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">josetomastocino</media:title>
		</media:content>
	</item>
	</channel>
</rss>
