<?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>Desert Zarzamora &#187; programacion</title>
	<atom:link href="http://zarzamora.com.mx/tags/programacion/feed" rel="self" type="application/rss+xml" />
	<link>http://zarzamora.com.mx</link>
	<description>However, there is no real definition of a desert.</description>
	<lastBuildDate>Mon, 30 Jan 2012 23:22:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Firewire: del infierno a tu escritorio [2/2]</title>
		<link>http://zarzamora.com.mx/archivo-historico/1007</link>
		<comments>http://zarzamora.com.mx/archivo-historico/1007#comments</comments>
		<pubDate>Fri, 19 Mar 2010 03:46:07 +0000</pubDate>
		<dc:creator>Desert Zarzamora</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[camaras]]></category>
		<category><![CDATA[dc1394]]></category>
		<category><![CDATA[dc1394-22]]></category>
		<category><![CDATA[firewire]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://zarzamora.com.mx/?p=1007</guid>
		<description><![CDATA[Pues resulta que estaba yo programando rutinas para captura usando el puerto Firewire.  Como ya explique en el post anterior, comenzaron a surgir problemas justo en el momento que comence a usar un extender. Y no era cualquier extender, era un extender de Kramer Electronics, algo que es bastante profesional y de buena calidad. La [...]]]></description>
			<content:encoded><![CDATA[<p><a title="firewire by trust no one, on Flickr" href="http://www.flickr.com/photos/trustnoone/3061716739/"><img class="alignright" src="http://farm4.static.flickr.com/3195/3061716739_85e80753f6.jpg" alt="firewire" width="375" height="500" /></a>Pues resulta que estaba yo programando rutinas para captura usando el puerto Firewire.  Como ya explique en el post anterior, comenzaron a surgir problemas justo en el momento que comence a usar un extender. Y no era cualquier extender, era un extender de Kramer Electronics, algo que es bastante profesional y de buena calidad.</p>
<p>La camara que estoy usando es una cámara que puede dar 120FPS. Pero misteriosamente cuando conecté el extender nomas no queria ni siquiera comenzar la &#8220;ISO Transmission&#8221;.</p>
<p>Y luego descubri que si la hacia funcionar a propósito mas lento, digamos a 7.5 FPS, entonces sí funcionaba. ¿Que estará pasando?.</p>
<p>Hagamos algunas cuentas. La camara chafona Unibran Fire-i da 30FPS a 640&#215;480 en modo escala de grises de 8 bit, que en realidad es un formato <a href="http://en.wikipedia.org/wiki/Bayer_filter">Bayer</a> RGGB que al hacer el <em>demosaic</em> y postprocesarse da una imagen 640&#215;480 en color de 24 bits.</p>
<p>A ver, quede que iba a hacer cuentas y las cuentas son:</p>
<p>640 x 480 x 8 x 30 = 73,728,000</p>
<p>Eso es aproximadamente  70 Mbit/seg.</p>
<p>Ahora, si quiero hacer funcionar la PointGray, digamos a 120 FPS deberá necesitar:</p>
<p>752 x 480 x 12 x 120 = 519,782,400</p>
<p>Eso es muchisimo mas, son poco mas de 500 Mbit/seg. A caray! eso es más de lo que el bus Firewire 400 puede dar (400 Mbit/seg).</p>
<p>Indagando más descubro que la cámara esta funcionando solo a 8bit por pixel y no a 12, y que de alguna manera esta siendo forzada a funcionar a 60 FPS cuando la tengo sin el extender. Eso es 173,260,800 o bien, como 170 Mbit/seg.</p>
<p>Y eso nos da una pista, ¿que hay de diferencia entre 73 Mbit/seg y 170 Mbit/seg? Pues 100Mbit, pero eso no es lo interesante, sino la barrera de 100Mbit que existe en las especificaciones de firewire. En Firewire 400, no siempre tienes garantizados los 400Mbit, algunos dispositivos solo necesitan 200Mbit y otros solamente 100Mbit, por lo que el estandar permite reducir la velocidad y permite a los fabricantes hacer dispositivos que puedan funcionar a velocidades reducidas y aun así conectarse al puerto Firewire 400.</p>
<p>¿<a href="http://www.kramer-us.com/products/model.asp?pid=324&amp;sf=87#t">Que dice Kramer al respecto</a>? Tengo dos de los TP-300FW,  incluso con el TP-400W no funcionará. Esos nombres son engañosos, esos dos dispositivos unicamente funcionan a 100 Mbit/seg.</p>
<p>Entonces, ¿puedo meter la camara rapida que usa 170 Mbit/s sobre extenders TP-400W que funcionan a 100Mbit/seg? Claramente no. La culpa no era de firewire sino de los extenders, y lo aprendí por las malas, pero para poder llegar a la solución aprendí mucho del protocolo Firewire y mucho más sobre la librería <a href="http://damien.douxchamps.net/ieee1394/libdc1394/">libDC1394</a> v2.x, sobre el kernel de linux y sobre otras tantas cosas que vistas en retrospectiva, fueron divertidas.</p>
]]></content:encoded>
			<wfw:commentRss>http://zarzamora.com.mx/archivo-historico/1007/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>_Z17qt_message_output9QtMsgTypePKc ?</title>
		<link>http://zarzamora.com.mx/archivo-historico/946</link>
		<comments>http://zarzamora.com.mx/archivo-historico/946#comments</comments>
		<pubDate>Wed, 27 Jan 2010 17:49:48 +0000</pubDate>
		<dc:creator>Desert Zarzamora</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[qt]]></category>

		<guid isPermaLink="false">http://zarzamora.com.mx/?p=946</guid>
		<description><![CDATA[Intentas desarrollar en Windows con Qt, pero te aparece el siguiente error: The procedure entry point _Z17qt_message_output9QtMsgTypePKc could not be located in the dynamic link library QtCore4.dll. Este error me salio cuando instale la version 2010.01 de Qt 4.6 en Windows XP. Lo instalé en C:\Qt como indica por default. Solucion El asunto es que [...]]]></description>
			<content:encoded><![CDATA[<p>Intentas desarrollar en Windows con Qt, pero te aparece el siguiente error:</p>
<blockquote><p><strong>The procedure entry point _Z17qt_message_output9QtMsgTypePKc could not be located in the dynamic link library QtCore4.dll.</strong></p></blockquote>
<p>Este error me salio cuando instale la version 2010.01 de Qt 4.6 en Windows XP. Lo instalé en C:\Qt como indica por default.</p>
<p>Solucion</p>
<p>El asunto es que al agregar rutas al enlazador, debes usar <strong>C:\Qt\2010.01\qt\bin</strong> y no como yo: <span style="text-decoration: line-through;"><strong>C:\Qt\2010.01\bin\</strong></span>. Al  arreglar esa ruta se arregla el problema.</p>
<p>Recuerda también que las siguientes rutas deben estar en el PATH de windows para ejecutar los binarios sin problemas:</p>
<ul>
<li>C:\Qt\2010.01\mingw\bin;</li>
<li>C:\Qt\2010.01\<strong>qt\bin</strong>;</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://zarzamora.com.mx/archivo-historico/946/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>¿Como resolver un conflicto &#8216;git svn dcommit&#8217;  (o &#8216;git svn rebase&#8217;)?</title>
		<link>http://zarzamora.com.mx/archivo-historico/833</link>
		<comments>http://zarzamora.com.mx/archivo-historico/833#comments</comments>
		<pubDate>Thu, 17 Sep 2009 22:36:20 +0000</pubDate>
		<dc:creator>Desert Zarzamora</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[conflict]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[diff]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[merge]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[rebase]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[update]]></category>
		<category><![CDATA[version]]></category>

		<guid isPermaLink="false">http://zarzamora.com.mx/?p=833</guid>
		<description><![CDATA[Cuando usas Git para envolver un repositorio svn, llegara un dia el momento en que te encontrarás con un conflicto. No te espantes, no es tan dificil arreglarlo. Primero, puede que hayas encontrado el conflicto haciendo $ git svn dcommit Pero pronto te das cuenta que git svn dcommit realiza un git svn rebase, antes [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando usas Git para envolver un repositorio svn, llegara un dia el momento en que te encontrarás con un conflicto. No te espantes, no es tan dificil arreglarlo.</p>
<p>Primero, puede que hayas encontrado el conflicto haciendo</p>
<p><code>$ git svn dcommit</code></p>
<p>Pero pronto te das cuenta que <code>git svn dcommit</code> realiza un <code>git svn rebase</code>, antes de todo. Así que en realidad el problema es causado por el &#8220;rebase&#8221;.</p>
<p>Notas:</p>
<ul>
<li>Estarás en la rama &#8220;no branch&#8221; o sea en ninguna rama (no puedes descomponer nada).</li>
<li>Tal vez haya archivos <strong>.dotest, </strong>simplemente ignoralos</li>
</ul>
<p>Técnica de resolución:</p>
<ul>
<li>En cualquier momento puedes cancelar con: <code>git rebase --abort</code></li>
<li>Para el archivo en cuestión, abrelo (vi?), y corrige el conflicto (Estarán marcados con muchos &#8220;mayor que&#8221; y &#8220;menor que&#8221; indicando las versiones). Simplemente elimina uno de los bloques y quita los simbolos.</li>
<li>Ya que lo corregiste, agrégalo: <code>git add &lt;archivo&gt;</code></li>
<li>Despues de agregarlo, continua el &#8220;rebase&#8221; : <code>git rebase --continue</code></li>
<li>Pueden ocurrir que te diga: <em>did you forget to call &#8216;git add&#8217;?</em>. En ese caso tu parche se ha convertido en no-op, o sea no hay cambios. Usa <code>git rebase --skip</code>.</li>
<li>Repite con cada uno de los archivos del conflicto.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://zarzamora.com.mx/archivo-historico/833/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Visualizacion del SVN Log</title>
		<link>http://zarzamora.com.mx/archivo-historico/733</link>
		<comments>http://zarzamora.com.mx/archivo-historico/733#comments</comments>
		<pubDate>Mon, 30 Mar 2009 00:12:20 +0000</pubDate>
		<dc:creator>Desert Zarzamora</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[codeswarm]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[swarm]]></category>
		<category><![CDATA[trabajo]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[visualizacion]]></category>

		<guid isPermaLink="false">http://zarzamora.com.mx/?p=733</guid>
		<description><![CDATA[Ya no usamos SVN, pero por conveniencia, usamos GIT sobre el servidor SVN existente. Tenemos apenas alrededor de 360 commits, pero de todas maneras pude hacer una visualizacion de unos pocos segundos. Cada punto es un archivo, los archivos se acercan a su desarrollador, mientras mas brillan mas actividad hay sobre ellos. Si dos desarrolladores [...]]]></description>
			<content:encoded><![CDATA[<p>Ya no usamos SVN, pero por conveniencia, usamos GIT sobre el servidor SVN existente. Tenemos apenas alrededor de 360 commits, pero de todas maneras pude hacer una visualizacion de unos pocos segundos.</p>
<p><object width="600" height="450" data="http://vimeo.com/moogaloop.swf?clip_id=3888385&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=ff9933&amp;fullscreen=1" type="application/x-shockwave-flash"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=3888385&amp;server=vimeo.com&amp;show_title=0&amp;show_byline=0&amp;show_portrait=0&amp;color=ff9933&amp;fullscreen=1" /></object></p>
<p>Cada punto es un archivo, los archivos se acercan a su desarrollador, mientras mas brillan mas actividad hay sobre ellos. Si dos desarrolladores trabajan en los mismos archivos se acercan entre ellos y los puntos intentan reflejarlo acercandose o alejandose.</p>
<p>En la visualización se pueden ver los commits iniciales y la rapida evolucion de la API en etapas tempranas como cientos de puntos(archivos) junto a mi nombre, luego se puede ver como Mario se involucra en el desarrollo. Casi al final, apenas se nota, que Mario comienza a trabajar en archivos &#8220;lejanos&#8221; a los mios, por eso ya se alcanzan a notar 2 anillos distintos, uno para cada quien. Al parecer Mario tiene mucha actividad sobre unos pocos archivos, por eso crecen los puntos.</p>
]]></content:encoded>
			<wfw:commentRss>http://zarzamora.com.mx/archivo-historico/733/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>El motor de física, pruebas preliminares</title>
		<link>http://zarzamora.com.mx/archivo-historico/626</link>
		<comments>http://zarzamora.com.mx/archivo-historico/626#comments</comments>
		<pubDate>Mon, 10 Nov 2008 03:14:26 +0000</pubDate>
		<dc:creator>Desert Zarzamora</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[fisica]]></category>
		<category><![CDATA[matematicas]]></category>
		<category><![CDATA[newton]]></category>
		<category><![CDATA[opengl]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[simulacion]]></category>

		<guid isPermaLink="false">http://zarzamora.com.mx/?p=626</guid>
		<description><![CDATA[First Physics Tests in OpenGL from Ariel Molina on Vimeo. En realidad el sistema corre muy suave, pero el video quedó muy cortado pues se tomó como a 10FPS, el sistema en la compu logra dar mas de 160FPS.]]></description>
			<content:encoded><![CDATA[<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="455" height="487" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://vimeo.com/moogaloop.swf?clip_id=2200447&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=ff9933&amp;fullscreen=1" /><embed type="application/x-shockwave-flash" width="455" height="487" src="http://vimeo.com/moogaloop.swf?clip_id=2200447&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=ff9933&amp;fullscreen=1" allowscriptaccess="always" allowfullscreen="true"></embed></object><br />
<a href="http://vimeo.com/2200447">First Physics Tests in OpenGL</a> from <a href="http://vimeo.com/user532173">Ariel Molina</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p>En realidad el sistema corre muy suave, pero el video quedó muy cortado pues se tomó como a 10FPS, el sistema en la compu logra dar mas de 160FPS.</p>
]]></content:encoded>
			<wfw:commentRss>http://zarzamora.com.mx/archivo-historico/626/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Enlazar una libreria con GCC</title>
		<link>http://zarzamora.com.mx/archivo-historico/622</link>
		<comments>http://zarzamora.com.mx/archivo-historico/622#comments</comments>
		<pubDate>Sun, 09 Nov 2008 22:51:04 +0000</pubDate>
		<dc:creator>Desert Zarzamora</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Trucos]]></category>
		<category><![CDATA[enlazar]]></category>
		<category><![CDATA[gcc]]></category>
		<category><![CDATA[libreria]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://zarzamora.com.mx/?p=622</guid>
		<description><![CDATA[El problema: Tienes librerias personales que tú mismo creaste, o bien librerías sin instalar que no estan en /usr/lib sino en otros directorios raros y quieres enlazar con gcc. La solución: Se debe indicar a gcc en donde estan las librerias usando -L&#60;dir&#62;, luego enlazarlas como librerías normales usando -l&#60;name&#62;. Por ejemplo para enlazar la [...]]]></description>
			<content:encoded><![CDATA[<p>El problema: Tienes librerias personales que tú mismo creaste, o bien librerías sin instalar que no estan en /usr/lib sino en otros directorios raros y quieres enlazar con gcc.</p>
<p>La solución: Se debe indicar a gcc en donde estan las librerias usando <strong>-L&lt;dir&gt;</strong>, luego enlazarlas como librerías normales usando <strong>-l&lt;name&gt;</strong>. Por ejemplo para enlazar la librería /home/user/tmp/libtrompete.a:</p>
<pre>gcc -L/home/user/tmp/ -ltrompete main.cpp</pre>
<p>Nota que solo se le indica el nombre <strong>trompete</strong>, porque gcc le agrega <strong>lib+trompete = libtrompete</strong>. GCC también busca automáticamente si es <strong>.o</strong>, <strong>.so</strong> o si es una AR <strong>.a</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://zarzamora.com.mx/archivo-historico/622/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Debugging con el &#8216;cerdo&#8217; y con std::cerr</title>
		<link>http://zarzamora.com.mx/archivo-historico/599</link>
		<comments>http://zarzamora.com.mx/archivo-historico/599#comments</comments>
		<pubDate>Thu, 30 Oct 2008 17:54:15 +0000</pubDate>
		<dc:creator>Desert Zarzamora</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Trucos]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[cerdo]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://zarzamora.com.mx/?p=599</guid>
		<description><![CDATA[Es muy útil hacer debugging con std::cerr, y si usas: #include &#60;iostream&#62; using namespace std; main(blabla...){ cerr &#60;&#60; "This is a debug message" &#60;&#60; endl; } Todo funciona maravillosamente, hasta que tus 20 threads comienzan a vomitar cientos y cientos de mensajes que hacen imposible leer el debug. Para ello lo ideal sería definir &#8220;debug [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-601" title="oldkhaki-pig" src="http://zarzamora.com.mx/wp-content/uploads/2008/10/oldkhaki-pig.jpg" alt="" width="500" height="351" /></p>
<p>Es muy útil hacer debugging con std::cerr, y si usas:</p>
<pre>#include &lt;iostream&gt;
using namespace std;
main(blabla...){
  cerr &lt;&lt; "This is a debug message" &lt;&lt; endl;
}</pre>
<p>Todo funciona maravillosamente, hasta que tus 20 threads comienzan a vomitar cientos y cientos de mensajes que hacen imposible leer el debug. Para ello lo ideal sería definir &#8220;debug levels&#8221;. Hay dos formas la forma simple y tonta:</p>
<pre>#ifdef DEBUG_N
  cerr &lt;&lt; "This is a debug message" &lt;&lt; endl;
#endif</pre>
<p>Pero esa forma es muy fastidiosa, así que mejor definimos un &#8216;<strong>cerdo</strong>&#8216; (cerdo = <strong>cerr</strong> <strong>d</strong>ebug <strong>o</strong>utput). O incluso mejor un <strong>cerdo</strong> con niveles: cerdo, cerdo2, cerdo3,&#8230; , cerdoN. He aqui uno para 3 niveles (donde hacemos que cerdo=cerdo1):</p>
<pre>// ----- cerdo.h -----
#ifndef DEBUG
  #define cerdo if(0) cerr
  #define cerdo1 if(0) cerr
  #define cerdo2 if(0) cerr
  #define cerdo3 if(0) cerr
endif
#if (DEBUG==1)
#define cerdo cerr
  #define cerdo1 cerr
  #define cerdo2 if(0) cerr
  #define cerdo3 if(0) cerr
#endif
#if (DEBUG==2)
#define cerdo  cerr
#define cerdo1 cerr
  #define cerdo2 cerr
  #define cerdo3 if(0) cerr
#endif
#if (DEBUG==3)
  #define cerdo  cerr
  #define cerdo1 cerr
  #define cerdo2 cerr
  #define cerdo3 cerr
#endif
// ---- end cerdo.h ----</pre>
<p>Ahora solo queda usar los cerdos.</p>
<pre>#define DEBUG 2
#include "cerdo.h"
using namespace std;
main(blabla...){
  cerdo &lt;&lt; "This is a debuglevel 1 message" &lt;&lt; endl;
  cerdo1 &lt;&lt; "This is a debuglevel 1 message" &lt;&lt; endl;
  cerdo2 &lt;&lt; "This is a debuglevel 2 message" &lt;&lt; endl;
  cerdo3 &lt;&lt; "This is a debuglevel 3 message" &lt;&lt; endl;
}</pre>
<p>Bye.<span id="more-599"></span><br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/-zCPBy41vSU&amp;hl=en&amp;fs=1" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/-zCPBy41vSU&amp;hl=en&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://zarzamora.com.mx/archivo-historico/599/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Merge del trunk a una branch</title>
		<link>http://zarzamora.com.mx/archivo-historico/597</link>
		<comments>http://zarzamora.com.mx/archivo-historico/597#comments</comments>
		<pubDate>Wed, 29 Oct 2008 19:38:08 +0000</pubDate>
		<dc:creator>Desert Zarzamora</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Trucos]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://zarzamora.com.mx/?p=597</guid>
		<description><![CDATA[Hay dos formas, directo del repositorio y usando una copia local del trunk. Directo del repositorio $ svn merge -r START:END http://repo/svn/trunk /directorio/branch De una copia local: $ svn up /directorio/trunk $ svn merge -r START:END /directorio/trunk   /directorio/branch Cualquiera de las dos anteriores te hace un merge a la copia local que está en /directorio/branch. [...]]]></description>
			<content:encoded><![CDATA[<p>Hay dos formas, directo del repositorio y usando una copia local del trunk.</p>
<p>Directo del repositorio</p>
<pre>$ svn merge -r START:END http://repo/svn/trunk /directorio/branch</pre>
<p>De una copia local:</p>
<pre>$ svn up /directorio/trunk
$ svn merge -r START:END /directorio/trunk   /directorio/branch</pre>
<p>Cualquiera de las dos anteriores te hace un merge a la copia local que está en /directorio/branch.</p>
<p>Para finalmente subir (a la branch) los cambios obtenidos</p>
<pre>$ svn ci -m "Merge del trunk a mi branch START:END"  /directorio/branch</pre>
<p>Si no se pusieron de acuerdo tus programadores, probablemente salgan conflictos, arreglalos.</p>
]]></content:encoded>
			<wfw:commentRss>http://zarzamora.com.mx/archivo-historico/597/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CMake para tus projectos II: Kdevelop</title>
		<link>http://zarzamora.com.mx/archivo-historico/527</link>
		<comments>http://zarzamora.com.mx/archivo-historico/527#comments</comments>
		<pubDate>Mon, 08 Sep 2008 18:54:27 +0000</pubDate>
		<dc:creator>Desert Zarzamora</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[cmake]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[kdevelop]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://zarzamora.com.mx/?p=527</guid>
		<description><![CDATA[En el post anterior expliqué como hacer un par de CMakeLists.txt para generación automática de Makefiles. Pero CMake es mucho mas potente, tanto que puede generar proyectos de KDevelop, Visual Studio (C++), Code::Blocks, Dev C++, X-code, etc, etc&#8230; Creación automática de un proyecto de KDevelop con CMake Usaré exactamente lo que se describe en el [...]]]></description>
			<content:encoded><![CDATA[<p>En el <a href="http://zarzamora.com.mx/archivo-historico/501">post anterior</a> expliqué como hacer un par de CMakeLists.txt para generación automática de Makefiles. Pero <a href="http://www.cmake.org/HTML/Documentation.html">CMake</a> es mucho mas potente, tanto que puede <a href="http://www.cmake.org/HTML/cmake-2.6.html#section_Generators">generar proyectos</a> de KDevelop, Visual Studio (C++), Code::Blocks, Dev C++, X-code, etc, etc&#8230;</p>
<h3>Creación automática de un proyecto de KDevelop con CMake</h3>
<p>Usaré exactamente lo que se describe en el <a href="http://zarzamora.com.mx/archivo-historico/501">post anterior</a>. Lo único que debe tenerse precaución es en eliminar todo lo que pudiera quedar dentro del directorio <strong>build/</strong> de generaciones pasadas. El directorio <strong>build/</strong> debe estar vacío.</p>
<pre>$ <strong>cd build/</strong>
$ <strong>cmake -G KDevelop3 ../</strong>
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Check size of void*
-- Check size of void* - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Configuring done
-- Generating done
-- Build files have been written to: /home/ariel/Documentos/holaMundoCMake/build</pre>
<p>Y listo. Nota la opcion &#8220;<strong>-G KDevelop3</strong>&#8220;. En el directorio <strong>build/</strong> se auto genera un proyecto de KDevelop llamado <strong>HELLO.kdevelop</strong> pues HELLO es el nombre del proyecto que definimos en CMakeLists.txt. Ahora se puede abrir con KDevelop (C/C++). <strong>Project-&gt;Open Project</strong> y elegimos <strong>HELLO.kdevelop</strong>.</p>
<p><a rel="lightbox" href="http://zarzamora.com.mx/wp-content/uploads/2008/09/kdevelop-cmake.jpg"><img title="kdevelop-cmake" src="http://zarzamora.com.mx/wp-content/uploads/2008/09/kdevelop-cmake-300x236.jpg" alt="Abrir un projecto KDevelop generado por CMake" width="180" height="142" /></a><a rel="lightbox" href="http://zarzamora.com.mx/wp-content/uploads/2008/09/kdevelop-cmake-ejecuta.jpg"><img class="alignnone size-medium wp-image-534" title="kdevelop-cmake-ejecuta" src="http://zarzamora.com.mx/wp-content/uploads/2008/09/kdevelop-cmake-ejecuta-300x179.jpg" alt="" width="237" height="141" /></a></p>
<p>El proyecto compila, ejecuta y tenemos el arbol de inclusiones. Tambien podemos usar el debugger y el completador de código. Todo lo de KDevelop funciona porque es un proyecto nativo.</p>
<p>Ah, para que el completador de código funcione, debes tener KDevelop 3.5.2 al menos.</p>
]]></content:encoded>
			<wfw:commentRss>http://zarzamora.com.mx/archivo-historico/527/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CMake para tus proyectos</title>
		<link>http://zarzamora.com.mx/archivo-historico/501</link>
		<comments>http://zarzamora.com.mx/archivo-historico/501#comments</comments>
		<pubDate>Sun, 07 Sep 2008 18:25:08 +0000</pubDate>
		<dc:creator>Desert Zarzamora</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[cmake]]></category>
		<category><![CDATA[codeblocks]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[kdevelop]]></category>
		<category><![CDATA[makefile]]></category>
		<category><![CDATA[multiplataforma]]></category>
		<category><![CDATA[programacion]]></category>

		<guid isPermaLink="false">http://zarzamora.com.mx/?p=501</guid>
		<description><![CDATA[Yo era de los que en algun día de la newbie-esca vida me atemorizaban los Makefiles. Temía que en la oscuridad de la noche saliera un Makefile del ropero, o que por debajo de la cama un Makefile me jalara los pies. Pues no mas. CMake es una excelente herramienta para generar Makefiles, y no [...]]]></description>
			<content:encoded><![CDATA[<p>Yo era de los que en algun día de la <em>newbie-esca</em> vida me atemorizaban los Makefiles. Temía que en la oscuridad de la noche saliera un Makefile del ropero, o que por debajo de la cama un Makefile me jalara los pies. Pues no mas.</p>
<p>CMake es una excelente herramienta para generar Makefiles, y no solo eso tambien genera soluciones de Visual Studio, Code::Blocks, Kdevelop entre muchas otras. Así que me puse a investigar y resulta que CMake es trivial de usar, hasta un newbie como yo lo puede usar (por lo tanto <a href="http://ubaldolnx.blogspot.com/">otros newbies</a> también podrían usarlo).</p>
<h3>1. Hello World: El código fuente</h3>
<p>Usaremos este código que muestra CMake para compilar y enlazar un programa principal con una librería extra generada por nosotros mismos. La siguiente estructura de directorios es la que hay que crear:</p>
<pre><span style="color: #0000ff;">holaMundoCMake</span>
|-- CMakeLists.txt
|-- <span style="color: #0000ff;">build</span>
`-- <span style="color: #0000ff;">src</span>
    |-- hola.cpp
    `-- <span style="color: #0000ff;">milib</span>
        |-- CMakeLists.txt
        |-- milib.cpp
        `-- milib.h</pre>
<p>La idea aqui es que vamos a generar un pequeño programita a partir del codigo en <strong>hola.cpp</strong> y de la libreria <strong>milib.cpp</strong>, el código de hola.cpp es muy sencillo:</p>
<p><strong>hola.cpp:</strong></p>
<pre>#include "milib.h"
int main(int argc, char* argv){
printf("\n Hola mundo desde main");
hola(2);
printf("\n");
}</pre>
<p>Y lo que hace es cargar el header milib.h que es donde está definida la función hola().</p>
<p><strong>milib.h</strong>:</p>
<pre>#include &lt;stdio.h&gt;
//Prototipo de funcion
void hola(int);</pre>
<p><strong>milib.c:</strong></p>
<pre>#include "milib.h"
// Implementacion de la funcion
void hola(int veces){
  int i=0;
  while (i&lt;veces){
    printf("\n [%u] Hola Mundo, desde 'milib'" , i);
    i++;
  }
}</pre>
<p>El código es realmente trivial (si no lo comprendes mejor ni sigas leyendo). Hasta este punto no hemos usado nada de CMake ni hemos creado Makefiles ni nada. El código bien podríamos compilarlo a mano.</p>
<h3>2. Hello World: Las CMakeLists.txt para CMake</h3>
<p>Hay un archivo de CMake en <strong>holaMundoCMake/CMakeLists.txt</strong> y hay otro en <strong>holaMundoCMake/src/milib</strong><strong>/CMakeLists.txt</strong>, éstos son los archivos clave para CMake. Con los comentarios se explican solos.</p>
<p><strong>holaMundoCMake/CMakeLists.txt:</strong></p>
<pre># El nombre del proyecto "HELLO".
# CMake genera automaticamente una variable llamada
# HELLO_SOURCE_DIR que puede llamarse usando
# ${HELLO_SOURCE_DIR} con la ruta del codigo
# lo mismo con ${HELLO_BINARY_DIR} para binarios

project (HELLO)

# Le decimos donde poner los binarios de librerias y ejecutables
# CMake admite instrucciones partidas en varias lineas
SET (LIBRARY_OUTPUT_PATH    ${HELLO_BINARY_DIR}/bin
	CACHE PATH "Directory for Libraries")
SET (EXECUTABLE_OUTPUT_PATH ${HELLO_BINARY_DIR}/bin
	CACHE PATH "Directory for Executables")

# Decimos a CMake que haga recursion a los siguientes directorios
# en orden de aparicion
add_subdirectory (src/milib)

# Directorios que debe incluir, ademas de los estandar.
include_directories (${HELLO_SOURCE_DIR}/src/milib/)

# Directorios para el enlazador, ademas de los estandar
# Para este ejemplo no los necesitamos ya que la unica libreria
# adicional es 'milib' y ya sabe donde encontrarla pues el mismo
# la genera
#link_directories (aqui pones mas rutas separadas por espacios)

# Decirle que queremos un ejecutable llamado holaMundo
# y le decimos el source para que lo compile
add_executable (holaMundo src/hola.cpp)

# Tenemos una libreria adicional llamada milib, enlazarla
target_link_libraries (holaMundo milib)</pre>
<p>El segundo CMakeLists sirve para compilar la libreria &#8220;milib&#8221; y es mucho mas corto:</p>
<p><strong>holaMundoCMake/src/milib</strong><strong>/CMakeLists.txt</strong></p>
<pre># Agregar una libreria llamada milib generada poru un cpp
# se pueden agregar muchas librerias con varios add_library
# Se deben listar todos los archivos fuente
add_library (milib milib.cpp milib.h)</pre>
<h3>3. Hello World: Generar Makefiles con CMake y compilar</h3>
<p>En linux el modo por default es generar <strong>Makefiles</strong>, así que entramos al directorio build que actualmente está vacío y generamos los <strong>Makefiles</strong>:</p>
<pre>~/Documentos$ <strong>cd holaMundoCMake
</strong>~/Documentos/holaMundoCMake/$ <strong>cd build
</strong>~/Documentos/holaMundoCMake/build$ <strong>cmake ../</strong>
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Check size of void*
-- Check size of void* - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Configuring done
-- Generating done
-- Build files have been written to: /home/ariel/Documentos/holaMundoCMake/build</pre>
<p>Listo, ya estan los Makefiles generados, ahora a compilar con make:</p>
<pre>~/Documentos/holaMundoCMake/build$ <strong>make</strong>
Scanning dependencies of target milib
[ 50%] Building CXX object src/milib/CMakeFiles/milib.dir/milib.o
Linking CXX static library ../../bin/libmilib.a
[ 50%] Built target milib
Scanning dependencies of target holaMundo
[100%] Building CXX object CMakeFiles/holaMundo.dir/src/hola.o
Linking CXX executable bin/holaMundo
[100%] Built target holaMundo
ariel@surfer:~/Documentos/eclipse/holaMundoCMake/build$ make clean
ariel@surfer:~/Documentos/eclipse/holaMundoCMake/build$ make
[ 50%] Building CXX object src/milib/CMakeFiles/milib.dir/milib.o
Linking CXX static library ../../bin/libmilib.a
[ 50%] Built target milib
[100%] Building CXX object CMakeFiles/holaMundo.dir/src/hola.o
Linking CXX executable bin/holaMundo
[100%] Built target holaMundo</pre>
<p>En el directorio <strong>build/bin</strong> se encuentra el binario holaMundo,</p>
<pre>~/Documentos/holaMundoCMake/build$ <strong>cd bin/</strong>
~/Documentos/holaMundoCMake/build$ <strong>./holaMundo</strong>
Hola mundo desde main
[0] Hola Mundo, desde 'milib'
[1] Hola Mundo, desde 'milib'</pre>
<p>¡Listo! ¿Quién dijo que habría que generar Makefiles a mano? Generar <strong>CMakeLists.txt</strong> es mucho mas fácil y mas intuitivo.</p>
]]></content:encoded>
			<wfw:commentRss>http://zarzamora.com.mx/archivo-historico/501/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

