<?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>Skywalker13</title>
	<atom:link href="http://skywalker13.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://skywalker13.wordpress.com</link>
	<description>Diary of a GeeXboX developer...</description>
	<lastBuildDate>Thu, 04 Apr 2013 19:46:25 +0000</lastBuildDate>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='skywalker13.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/6e5e3a71a42eb3606e9a3525adc8d94d?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Skywalker13</title>
		<link>http://skywalker13.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://skywalker13.wordpress.com/osd.xml" title="Skywalker13" />
	<atom:link rel='hub' href='http://skywalker13.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Reverse SSH tips</title>
		<link>http://skywalker13.wordpress.com/2013/04/04/reverse-ssh-tips/</link>
		<comments>http://skywalker13.wordpress.com/2013/04/04/reverse-ssh-tips/#comments</comments>
		<pubDate>Thu, 04 Apr 2013 19:36:11 +0000</pubDate>
		<dc:creator>Mathieu SCHROETER</dc:creator>
				<category><![CDATA[/dev/null]]></category>
		<category><![CDATA[cygwin]]></category>
		<category><![CDATA[openssh]]></category>
		<category><![CDATA[reverse]]></category>
		<category><![CDATA[ssh]]></category>
		<category><![CDATA[tunnel]]></category>

		<guid isPermaLink="false">http://skywalker13.wordpress.com/?p=1341</guid>
		<description><![CDATA[Hello, Today I will share some tips with SSH. It is very useful everytime even with crappy OS like Windows. One of the most funny feature is the TCP forwarding by Reverse SSH. For example in the case where you must connect to a SSH server and this one is behind a firewall. You have [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=skywalker13.wordpress.com&#038;blog=4019559&#038;post=1341&#038;subd=skywalker13&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Hello,</p>
<p>Today I will share some tips with SSH. It is very useful everytime even with crappy OS like Windows. One of the most funny feature is the TCP forwarding by Reverse SSH. For example in the case where you must connect to a SSH server and this one is behind a firewall. You have no access to the firewall because you are at work.</p>
<h3>First one</h3>
<p>You must connect the computer (behind the firewall) to a server available on Internet (at home).</p>
<pre class="brush: plain; title: ; notranslate">ssh -R 8888:localhost:22 homeuser@homeip</pre>
<p>It will create an SSH tunnel with your computer at home. You can choose an other port; 8888 is just for the example.</p>
<h3>Second one</h3>
<p>At home, you can connect to your computer at work by this way :</p>
<pre class="brush: plain; title: ; notranslate">ssh workuser@localhost -p 8888</pre>
<p>Easy, isn&rsquo;t it? Note that is possible to forward every things with SSH. All local servers in your company&#8230;</p>
<h3>But, with Windows it&rsquo;s a pain</h3>
<p>Not really, just use Cygwin. You can install openssh-server with the packages manager. Just use <em>ssh-host-config -y</em> from the Cygwin terminal. Start the terminal with admin rights if necessary. A service will be installed in order to start openssh. Start the service and enjoy.</p>
<p>You should search on the web for more examples and tips. Here you will found the essential.</p>
<p>Bye</p>
<p style="padding-left:30px;">Mathieu Schroeter</p>
<br /> Tagged: <a href='http://skywalker13.wordpress.com/tag/cygwin/'>cygwin</a>, <a href='http://skywalker13.wordpress.com/tag/openssh/'>openssh</a>, <a href='http://skywalker13.wordpress.com/tag/reverse/'>reverse</a>, <a href='http://skywalker13.wordpress.com/tag/ssh/'>ssh</a>, <a href='http://skywalker13.wordpress.com/tag/tunnel/'>tunnel</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/skywalker13.wordpress.com/1341/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/skywalker13.wordpress.com/1341/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=skywalker13.wordpress.com&#038;blog=4019559&#038;post=1341&#038;subd=skywalker13&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://skywalker13.wordpress.com/2013/04/04/reverse-ssh-tips/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4be2af9a8c02ddaa79d2de987ad91c4?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">[GO]Skywalker13</media:title>
		</media:content>
	</item>
		<item>
		<title>Mount a gunzip&#8217;ed image disk file from a network share</title>
		<link>http://skywalker13.wordpress.com/2013/03/03/1333/</link>
		<comments>http://skywalker13.wordpress.com/2013/03/03/1333/#comments</comments>
		<pubDate>Sun, 03 Mar 2013 10:16:06 +0000</pubDate>
		<dc:creator>Mathieu SCHROETER</dc:creator>
				<category><![CDATA[/dev/null]]></category>
		<category><![CDATA[avfs]]></category>
		<category><![CDATA[disk]]></category>
		<category><![CDATA[fuse]]></category>
		<category><![CDATA[image]]></category>
		<category><![CDATA[mount]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://skywalker13.wordpress.com/?p=1333</guid>
		<description><![CDATA[Hello, Some tips about a way to restore a very big gunzip&#8217;ed image disk from a network share. I&#8217;ve changed of computer and my previous disk was saved in a image with `dd` and a pipe on gunzip. The image is located on a network share. But I can not restore the whole image because [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=skywalker13.wordpress.com&#038;blog=4019559&#038;post=1333&#038;subd=skywalker13&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Hello,</p>
<p>Some tips about a way to restore a very big gunzip&rsquo;ed image disk from a network share. I&rsquo;ve changed of computer and my previous disk was saved in a image with `dd` and a pipe on gunzip. The image is located on a network share. But I can not restore the whole image because it uses too much spaces. Then, I will mount this one but it was compressed. The solution is `mountavfs`. You can use this command in order to open compressed files on the fly.</p>
<p>The steps are something like this:</p>
<pre class="brush: plain; title: ; notranslate">avfsd -o allow_root ~/.avfs
mountavfs</pre>
<p>Look at <a title="avf.sourceforge.net" href="http://avf.sourceforge.net" target="_blank">avf.sourceforge.net</a></p>
<p>&nbsp;</p>
<pre class="brush: plain; title: ; notranslate">sudo mount -t nfs 192.168.1.1:backup ~/mybackup</pre>
<p>Just my backup; mount yours as usual&#8230;</p>
<p>&nbsp;</p>
<pre class="brush: plain; title: ; notranslate">cd ~/.avfs/home/myuser/mybackup</pre>
<p>Here, I will found my image disk file.</p>
<p>&nbsp;</p>
<pre class="brush: plain; title: ; notranslate">sudo mount -o ro,loop,offset=$((63 * 512)) backup.img.gz ~/dst</pre>
<p>I mount my file from the ~/.avfs directory (then it will be uncompressed on the fly). I must specify the partition offset because the image is the whole disk with a GPT structure. Look for fdisk, gdisk in order to retrieve the offset. The first seems to be always 63th bloc.</p>
<p>Now you can see the whole content of your gunzip&rsquo;ed image in the ~/dst directory.</p>
<p>&nbsp;</p>
<p>Mathieu SCHROETER</p>
<br /> Tagged: <a href='http://skywalker13.wordpress.com/tag/avfs/'>avfs</a>, <a href='http://skywalker13.wordpress.com/tag/disk/'>disk</a>, <a href='http://skywalker13.wordpress.com/tag/fuse/'>fuse</a>, <a href='http://skywalker13.wordpress.com/tag/image/'>image</a>, <a href='http://skywalker13.wordpress.com/tag/mount/'>mount</a>, <a href='http://skywalker13.wordpress.com/tag/shell/'>shell</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/skywalker13.wordpress.com/1333/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/skywalker13.wordpress.com/1333/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=skywalker13.wordpress.com&#038;blog=4019559&#038;post=1333&#038;subd=skywalker13&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://skywalker13.wordpress.com/2013/03/03/1333/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4be2af9a8c02ddaa79d2de987ad91c4?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">[GO]Skywalker13</media:title>
		</media:content>
	</item>
		<item>
		<title>libvalhalla-2.1.0</title>
		<link>http://skywalker13.wordpress.com/2012/08/12/libvalhalla-2-1-0/</link>
		<comments>http://skywalker13.wordpress.com/2012/08/12/libvalhalla-2-1-0/#comments</comments>
		<pubDate>Sun, 12 Aug 2012 11:31:43 +0000</pubDate>
		<dc:creator>Mathieu SCHROETER</dc:creator>
				<category><![CDATA[GeeXboX]]></category>
		<category><![CDATA[Valhalla]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[libvalhalla]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[programmation]]></category>
		<category><![CDATA[release]]></category>

		<guid isPermaLink="false">http://skywalker13.wordpress.com/?p=1318</guid>
		<description><![CDATA[Hey ça faisait vraiment longtemps. Comme quoi, vaut mieux tard que jamais. J&#8217;ai publié une nouvelle version de libvalhalla qui remet à jour les grabbers Amazon et TMDB. C&#8217;était principalement des problèmes de changement d&#8217;API chez ces deux services. A noter que les grabbers qui se basent sur des scripts PHP maison sont cassés mais [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=skywalker13.wordpress.com&#038;blog=4019559&#038;post=1318&#038;subd=skywalker13&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Hey ça faisait vraiment longtemps. Comme quoi, vaut mieux tard que jamais.</p>
<p>J&rsquo;ai publié une nouvelle version de libvalhalla qui remet à jour les grabbers Amazon et TMDB. C&rsquo;était principalement des problèmes de changement d&rsquo;API chez ces deux services. A noter que les grabbers qui se basent sur des scripts PHP maison sont cassés mais non-réparés. Je pense à Allocine et ImDB. Mais pour ces deux grabbers il faut être clair, sans vrai webservice c&rsquo;est très pénible à maintenir. Il existe un webservice caché pour Allocine et j&rsquo;ai cet API sous la main. Par contre je ne sais pas si c&rsquo;est encore fonctionnel (car l&rsquo;API que j&rsquo;ai a plus d&rsquo;une année) et peut être que depuis tout ce temps il y a quelque chose d&rsquo;officiel. En ce qui concerne ImDB j&rsquo;en ai aucune idée.</p>
<p>A part ça il y a quelques changements plus spécifiques. Je vous invite à consulter le <a title="ChangeLog" href="http://hg.geexbox.org/libvalhalla/file/v2.1.0/ChangeLog" target="_blank">ChangeLog</a>.</p>
<p style="padding-left:30px;">Site : <a title="libvalhalla.geexbox.org" href="http://libvalhalla.geexbox.org" target="_blank">http://libvalhalla.geexbox.org</a></p>
<p style="padding-left:30px;">Sources : <a title="libvalhalla-2.1.0.tar.bz2" href="http://libvalhalla.geexbox.org/releases/libvalhalla-2.1.0.tar.bz2" target="_blank">http://libvalhalla.geexbox.org/releases/libvalhalla-2.1.0.tar.bz2</a></p>
<p>Bye bye</p>
<p style="padding-left:30px;">Mathieu</p>
<br /> Tagged: <a href='http://skywalker13.wordpress.com/tag/c/'>C</a>, <a href='http://skywalker13.wordpress.com/tag/libvalhalla/'>libvalhalla</a>, <a href='http://skywalker13.wordpress.com/tag/linux/'>Linux</a>, <a href='http://skywalker13.wordpress.com/tag/opensource/'>opensource</a>, <a href='http://skywalker13.wordpress.com/tag/programmation/'>programmation</a>, <a href='http://skywalker13.wordpress.com/tag/release/'>release</a>, <a href='http://skywalker13.wordpress.com/tag/valhalla/'>Valhalla</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/skywalker13.wordpress.com/1318/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/skywalker13.wordpress.com/1318/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=skywalker13.wordpress.com&#038;blog=4019559&#038;post=1318&#038;subd=skywalker13&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://skywalker13.wordpress.com/2012/08/12/libvalhalla-2-1-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4be2af9a8c02ddaa79d2de987ad91c4?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">[GO]Skywalker13</media:title>
		</media:content>
	</item>
		<item>
		<title>La bibliothèque des ELFs</title>
		<link>http://skywalker13.wordpress.com/2010/12/05/la-bibliotheque-des-elfs/</link>
		<comments>http://skywalker13.wordpress.com/2010/12/05/la-bibliotheque-des-elfs/#comments</comments>
		<pubDate>Sun, 05 Dec 2010 18:17:48 +0000</pubDate>
		<dc:creator>Mathieu SCHROETER</dc:creator>
				<category><![CDATA[/dev/null]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[DLL]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[POSIX]]></category>
		<category><![CDATA[programmation]]></category>
		<category><![CDATA[so]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://skywalker13.wordpress.com/?p=1215</guid>
		<description><![CDATA[Hello, Il y a beaucoup de choses que l&#8217;on apprend pas du tout dans les cours de programmation, et même en suivant une haute école pour une formation en tant qu&#8217;ingénieur. Heureusement les logiciels libres permettent de côtoyer des spécialistes qui ont une expérience pratique du logiciel, contrairement à de nombreux professeurs qui ne connaissent [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=skywalker13.wordpress.com&#038;blog=4019559&#038;post=1215&#038;subd=skywalker13&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Hello,</p>
<p style="text-align:justify;"><a href="http://skywalker13.files.wordpress.com/2010/12/gccegg-65.png"><img class="alignright size-full wp-image-1299" style="border:0 none;margin-left:5px;margin-right:0;" title="gcc" src="http://skywalker13.files.wordpress.com/2010/12/gccegg-65.png?w=450" alt=""   /></a>Il y a beaucoup de choses que l&rsquo;on apprend pas du tout dans les cours de programmation, et même en suivant une haute école pour une formation en tant qu&rsquo;ingénieur. Heureusement les logiciels libres permettent de côtoyer des spécialistes qui ont une expérience pratique du logiciel, contrairement à de nombreux professeurs qui ne connaissent que la théorie mais ne semblent pas vraiment pratiquer et passent ainsi à côté de potentiels problèmes importants. Je pense tout particulièrement au C dans le contexte des exécutables ELF utilisés par les OS Unix-like. Bien que beaucoup d&rsquo;écoles restent encore trop rattachées sur les technologies Microsoft, dans le monde des systèmes embarqués GNU/Linux est particulièrement présent. Néanmoins la formation sur le langage C n&rsquo;est pas toujours très bonne. Une erreur trop courante concerne les espaces de nom utilisés par les bibliothèques.</p>
<h3 style="text-align:justify;">Les fonctions &laquo;&nbsp;static&nbsp;&raquo;</h3>
<p style="text-align:justify;">Quand j&rsquo;étudiais le C++ à l&rsquo;école d&rsquo;ingénieur on devait travailler avec un outil que je déteste absolument, c&rsquo;est <a href="http://en.wikipedia.org/wiki/IBM_Rational_Rhapsody">Rhapsody</a>. Un générateur de code à partir d&rsquo;<a href="http://en.wikipedia.org/wiki/Unified_Modeling_Language">UML</a>. L&rsquo;UML c&rsquo;est très bien pour poser les idées et réfléchir sérieusement sur un programme. Mais le fait qu&rsquo;un langage de programmation ne soit pas objet ou orienté-objet n&rsquo;empêche pas de se donner des règles reposants sur les concepts objets. Bref, Rhapsody c&rsquo;est pire que tout, il génère du code (C, C++ ou autre) à partir d&rsquo;UML. Finalement le programmeur fait du dessin, des carrés, des ronds et les relie avec des flèches. Il presse un bouton et des centaines de lignes de code se génèrent. Wouhaw.. moi qui aime programmer.. Bientôt on devra se former en tant que graphiste avant de réaliser un logiciel :-).</p>
<p style="text-align:justify;">OK vous l&rsquo;aurez compris, je déteste ça. Mais là où je veux en venir c&rsquo;est à une petite anecdote. On travaillait donc sur ce logiciel et un des objet était instancié une seule fois (donc en tant que <a href="http://en.wikipedia.org/wiki/Singleton_pattern">Singleton</a>). Alors je demande à l&rsquo;assistant qui était présent avec nous pour répondre à nos questions:</p>
<blockquote>
<p style="text-align:justify;">Qu&rsquo;est-ce que c&rsquo;est concrètement un Singleton?</p>
</blockquote>
<p style="text-align:justify;">Il s&rsquo;assied et m&rsquo;explique ce que je sais déjà, c&rsquo;est à dire que l&rsquo;objet est instancié qu&rsquo;une seule fois. Il me montrait via l&rsquo;interface de Rhapsody comment on paramètre la classe pour être un Singleton. Et me ré-expliquait toujours la même chose. J&rsquo;essayais de reformuler ma question en vain. C&rsquo;est finalement en allant observer le code C généré que j&rsquo;ai vu l&rsquo;objet instancié en tant que variable globale statique.</p>
<p style="text-align:justify;">5 secondes pour lire le code et comprendre, 15 minutes d&rsquo;explication dans le monde &laquo;&nbsp;merveilleux&nbsp;&raquo; de Rhapsody et des formes géométriques.</p>
<h4 style="text-align:justify;">Mais revenons à nos fonctions statiques</h4>
<p style="text-align:justify;">Une chose que tout le monde apprend aux cours c&rsquo;est qu&rsquo;une variable déclarée comme étant &laquo;&nbsp;static&nbsp;&raquo; dans une fonction, garde sa valeur entre chaque appel de fonction. Par contre je n&rsquo;ai jamais eu un seul professeur qui nous ait expliqué à quoi sert une variable globale statique, ou alors une fonction statique (sauf les fonctions statiques en C++, mais ici je fais référence au C).</p>
<p style="text-align:justify;">En fait, il est très rare de voir un professeur proposer de créer une bibliothèque pendant un cours. En principe on créer des exécutables avec un <em>main</em>. En C je n&rsquo;ai jamais vu (en dehors des logiciels libres et des professionnels), des fonctions déclarées comme étant statiques. Que se sois du code créé par des professeurs ou par des étudiants. Pourtant l&rsquo;écriture de bibliothèques demandent quelques considérations supplémentaires qui concernent les espaces de nom et plus particulièrement les <a href="http://en.wikipedia.org/wiki/Executable_and_Linkable_Format">ELF</a>.</p>
<p style="text-align:justify;">Mais tout d&rsquo;abord une fonction &laquo;&nbsp;static&nbsp;&raquo; est une fonction qui n&rsquo;est pas &laquo;&nbsp;extern&nbsp;&raquo; (qui est le qualificateur de type par défaut). En étant &laquo;&nbsp;static&nbsp;&raquo; la visibilité de la fonction est restreinte au fichier source où elle a été déclarée. Une fonction externe peut être atteignable depuis n&rsquo;importe où dans les sources. Mais dans le cas des ELF c&rsquo;est encore plus subtile que ça car elle peut être atteinte depuis n&rsquo;importe quelles bibliothèques ou applications étant liées avec elle.</p>
<h4 style="text-align:justify;">Les Shared Object (so) et les DLL</h4>
<p style="text-align:justify;">Sans partir dans des explications compliquées et inutiles il faut bien faire la différence entre une <a href="http://en.wikipedia.org/wiki/Dynamic-link_library">DLL</a> (de chez Microsoft) et un Shared Object (qui vient du monde Unix). Les développeurs pour Windows connaissent bien:</p>
<pre class="brush: cpp; title: ; notranslate">__declspec(dllexport)</pre>
<p style="text-align:justify;">Qui est un qualificateur de type <a href="http://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx">inventé par Microsoft</a>. Il permet de spécifier les fonctions qui doivent être exportées par la DLL. Vous pouvez aussi utiliser un fichier .def qui donne la liste des fonctions à exporter. Ce principe existe aussi avec les gcc &gt;=4 mais est rarement utilisé à ma connaissance. Quoi qu&rsquo;il en soit dans tous les cas vous avez une liste de symboles exportés.</p>
<p style="text-align:justify;">La différence qui m&rsquo;intéresse c&rsquo;est au runtime, lorsque le lanceur d&rsquo;application doit charger les bibliothèques. Dans le cas d&rsquo;une DLL, le programme va rechercher les pointeurs sur les fonctions désirées à l&rsquo;aide de <em><a href="http://msdn.microsoft.com/en-us/library/ms684175.aspx">LoadLibrary</a></em>. C&rsquo;est lourd mais ça fonctionne. Dans le cas d&rsquo;un &laquo;&nbsp;so&nbsp;&raquo; le fonctionnement est très différent. Le lanceur de programme de Linux va charger les bibliothèques les unes après les autres dans l&rsquo;ordre où elles ont été liées. Lorsque le programme a besoin d&rsquo;une fonction, c&rsquo;est la première occurrence trouvée qui sera utilisée.</p>
<h4 style="text-align:justify;">Concrètement</h4>
<p style="text-align:justify;">Imaginons un programme qui utilise libplayer et libvalhalla. Si je n&rsquo;étais pas conscient du problème que je viens d&rsquo;expliquer, dans ces deux bibliothèques j&rsquo;aurais pu écrire une fonction qui a exactement le même nom (de part et d&rsquo;autre) comme par exemple:</p>
<p>libplayer:</p>
<pre class="brush: cpp; title: ; notranslate">void foobar (int a, int b);</pre>
<p>libvalhalla:</p>
<pre class="brush: cpp; title: ; notranslate">void foobar (int c);</pre>
<p style="text-align:justify;">Ces fonctions ne sont pas static car bien entendu j&rsquo;aimerais les utiliser partout dans les projets. Alors que se passe-t-il lorsqu&rsquo;on lie l&rsquo;application sur ces deux bibliothèques? Notez que ces deux fonctions ne sont pas non plus déclarées dans les en-têtes &laquo;&nbsp;publiques&nbsp;&raquo; que vous distribuez à vos développeurs. Par exemple vous donnez ceci à un ami:</p>
<p style="text-align:justify;padding-left:30px;">player.so (que vous avez compilé vous même)</p>
<p style="text-align:justify;">Et un fichier d&rsquo;en-tête:</p>
<p style="text-align:justify;padding-left:30px;">player.h</p>
<pre class="brush: cpp; title: ; notranslate">/* libplayer header */
void libplayer_is_the_best (void);</pre>
<p style="text-align:justify;">De même avec la seconde bibliothèque:</p>
<p style="text-align:justify;padding-left:30px;">valhalla.so<br />
valhalla.h</p>
<pre class="brush: cpp; title: ; notranslate">/* libvalhalla header */
void libvalhalla_is_the_best (void);</pre>
<p style="text-align:justify;">Maintenant vous avez créé une application tel que:</p>
<pre class="brush: cpp; title: ; notranslate">#include &lt;player.h&gt;
#include &lt;valhalla.h&gt;

int
main (void)
{
  libplayer_is_the_best ();
  libvalhalla_is_the_best ();
  return 0;
}</pre>
<p style="text-align:justify;">Dans libplayer.so il y a le symbole &laquo;&nbsp;foobar&nbsp;&raquo;, mais il existe également dans la bibliothèque libvalhalla.so. Lorsque vous liez votre application vous n&rsquo;avez aucune erreur. Vous utilisez deux fonctions considérées comme publiques et qui n&rsquo;ont pas du tout le même nom. Alors où est le problème? Et bien c&rsquo;est très simple. Quand vous liez votre programme vous devez passer les noms des bibliothèques. Par exemple:</p>
<p style="text-align:justify;"><strong>cas 1</strong>: gcc -lplayer -lvalhalla main.c -o main</p>
<p style="text-align:justify;">Mais vous auriez aussi pu faire</p>
<p style="text-align:justify;"><strong>cas 2</strong>: gcc -lvalhalla -lplayer main.c -o main</p>
<p style="text-align:justify;">Les deux façons sont correctes mais le comportement de l&rsquo;application <em>main</em> n&rsquo;est pas du tout le même. Les deux bibliothèques utilisent la fonction <em>foobar</em>. Cette fonction n&rsquo;a pas le même nombre d&rsquo;arguments dans libvalhalla que dans libplayer et leurs comportements sont différents. Les fonctions <em>libplayer_is_the_best</em> et <em>libvalhalla_is_the_best</em> utilisent &laquo;&nbsp;en théorie&nbsp;&raquo; leurs propres fonction <em>foobar</em>. Et bien en réalité ce n&rsquo;est pas le cas.</p>
<p style="text-align:justify;">Dans le cas 1, le chargeur de programme va commencer par player.so, puis par valhalla.so. Lorsque la fonction <em>libplayer_is_the_best</em> va utiliser <em>foobar</em>, alors le <em>foobar</em> de player.so va être utilisé. Mais lorsque valhalla.so va utiliser <em>foobar</em>, c&rsquo;est aussi le <em>foobar</em> de player.so qui sera utilisé (aïe). Dans le cas 2 c&rsquo;est le même principe mais inversé. Les conséquences peuvent être très imprévisibles.</p>
<p style="text-align:justify;">Si vous avez une application qui est liée à des dizaines de bibliothèques il faut espérer que tout le monde ait pris la peine de faire deux choses importantes:</p>
<ol>
<li style="text-align:justify;">Utilisez toujours un espace de nom pour vos fonctions. Par exemple libvalhalla en utilise trois  (libvalhalla_, valhalla_ et vh_). Un espace de nom en C ce n&rsquo;est rien d&rsquo;autre qu&rsquo;un nom identique que vous concaténez au début des noms. Par exemple nos <em>foobar</em> auraient pût se nommer <em>libplayer_foobar</em> et <em>libvalhalla_foobar</em>, ce qui aurait évité la collision.</li>
<li style="text-align:justify;">Déclarez toujours en static toutes les fonctions qui ne sont pas utilisées en dehors du fichier source. Une fonction static n&rsquo;a pas besoin d&rsquo;espace de nom, car elle n&rsquo;est jamais exportée! Et faire ainsi permet d&rsquo;aider le compilateur à effectuer de meilleurs optimisations.</li>
</ol>
<h3>Comment détecter et debugger les collisions</h3>
<p style="text-align:justify;">Une des solution c&rsquo;est de compiler votre programme entièrement en static. Il doit donc être lié aux .a de toutes les bibliothèques. Dans ce cas de figure, une collision sera forcément détectée par le linker.</p>
<p style="text-align:justify;">Pour debugger commencez par tout compiler en -O0 -g3, puis utilisez <a href="http://en.wikipedia.org/wiki/Valgrind">valgrind</a>. Vous arriverez à remonter sur l&rsquo;appel de fonction qui s&rsquo;est fait de la libA à la libB. Vous pourriez voir le <em>foobar</em> de player.so appelé par valhalla.so.</p>
<h3 style="text-align:justify;">En pratique&#8230;</h3>
<p style="text-align:justify;">Il y a de nombreux mois, j&rsquo;ai eu des problèmes de ce type avec <a href="http://wiki.videolan.org/Libvlc">libVLC</a> et libplayer, car les fonctions de getopt étaient exportées par libVLC bien que c&rsquo;était uniquement pour son propre usage. Ça me provoquait des collisions avec le getopt que j&rsquo;utilise dans libplayer-test. J&rsquo;ai bien entendu reporté le problème qui a été corrigé.</p>
<p style="text-align:justify;">J&rsquo;ai aussi eu un cas avec GeeXboX et le projet <a href="http://gupnp.org">GuPNP</a>. Le développeur principal a aussi été prévenu mais a priori il s&rsquo;en fiche (ce n&rsquo;est pas moi qui l&rsquo;a contacté mais un autre du team). Du coup ce n&rsquo;est pas possible de lier en static si on utilise deux de ses libs car elles ont les même fonctions non-static pour traiter le XML. Et le pire c&rsquo;est que le nom de ces fonctions n&rsquo;a pas d&rsquo;espace de nom très original. Notez qu&rsquo;en dynamique il n&rsquo;y a jamais de problème car heureusement dans les deux bibliothèques, les fonctions sont les mêmes.</p>
<p style="text-align:justify;">Bref, en fouillant bien on doit trouver ce genre d&rsquo;exemple un peu partout&#8230;</p>
<p style="text-align:justify;">J&rsquo;espère que ce poste vous sera utile pour vos propres développements.</p>
<p style="text-align:justify;">Bon code et à bientôt!</p>
<p style="text-align:justify;padding-left:30px;">Mathieu SCHROETER</p>
<br /> Tagged: <a href='http://skywalker13.wordpress.com/tag/c/'>C</a>, <a href='http://skywalker13.wordpress.com/tag/dll/'>DLL</a>, <a href='http://skywalker13.wordpress.com/tag/linux/'>Linux</a>, <a href='http://skywalker13.wordpress.com/tag/opensource/'>opensource</a>, <a href='http://skywalker13.wordpress.com/tag/posix/'>POSIX</a>, <a href='http://skywalker13.wordpress.com/tag/programmation/'>programmation</a>, <a href='http://skywalker13.wordpress.com/tag/so/'>so</a>, <a href='http://skywalker13.wordpress.com/tag/windows/'>Windows</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/skywalker13.wordpress.com/1215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/skywalker13.wordpress.com/1215/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=skywalker13.wordpress.com&#038;blog=4019559&#038;post=1215&#038;subd=skywalker13&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://skywalker13.wordpress.com/2010/12/05/la-bibliotheque-des-elfs/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4be2af9a8c02ddaa79d2de987ad91c4?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">[GO]Skywalker13</media:title>
		</media:content>

		<media:content url="http://skywalker13.files.wordpress.com/2010/12/gccegg-65.png" medium="image">
			<media:title type="html">gcc</media:title>
		</media:content>
	</item>
		<item>
		<title>OpenBricks</title>
		<link>http://skywalker13.wordpress.com/2010/10/19/openbricks/</link>
		<comments>http://skywalker13.wordpress.com/2010/10/19/openbricks/#comments</comments>
		<pubDate>Tue, 19 Oct 2010 20:08:12 +0000</pubDate>
		<dc:creator>Mathieu SCHROETER</dc:creator>
				<category><![CDATA[GeeXboX]]></category>
		<category><![CDATA[OpenBricks]]></category>
		<category><![CDATA[embedded]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[toolchain]]></category>

		<guid isPermaLink="false">http://skywalker13.wordpress.com/?p=1273</guid>
		<description><![CDATA[Hello, Un &#171;&#160;nouveau&#160;&#187; (notez bien les guillemets) projet vient de faire surface officiellement de nos dépôts. Il est nommé OpenBricks et son but et de fournir un environnement assisté pour construire sa propre distribution pour l&#8217;embarqué (ou pas, c&#8217;est pas une obligation). Au premier abord il n&#8217;y a rien de bien nouveau dans le principe, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=skywalker13.wordpress.com&#038;blog=4019559&#038;post=1273&#038;subd=skywalker13&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Hello,</p>
<p style="text-align:justify;"><a href="http://skywalker13.files.wordpress.com/2010/10/openbricks-400.png"><img class="alignleft size-thumbnail wp-image-1274" style="border:0 none;margin-right:10px;" title="OpenBricks" src="http://skywalker13.files.wordpress.com/2010/10/openbricks-400.png?w=225&#038;h=67" alt="OpenBricks" width="225" height="67" /></a>Un &laquo;&nbsp;nouveau&nbsp;&raquo; (notez bien les guillemets) projet vient de faire surface officiellement de nos dépôts. Il est nommé <a href="http://www.openbricks.org">OpenBricks</a> et son but et de fournir un environnement assisté pour construire sa propre distribution pour l&rsquo;embarqué (ou pas, c&rsquo;est pas une obligation). Au premier abord il n&rsquo;y a rien de bien nouveau dans le principe, car il existe déjà de gros projets qui vont en ce sens tel que <a href="http://www.openembedded.org">OpenEmbedded</a> ou encore <a href="http://buildroot.uclibc.org">Buildroot</a>. La première question étant bien sûr &laquo;&nbsp;<em>pourquoi réinventer la roue?</em>&nbsp;&raquo; est complètement illusoire dans notre cas. Car bien que ce projet voit le jour uniquement depuis ce mois, en réalité il couvre 8 ans de développement et d&rsquo;expérience.</p>
<p style="text-align:justify;">Je veux en parler sur mon blog pour une raison en particulier. Je parcours un peu les commentaires sur les news relatives à OpenBricks. Les réactions sont du genre <em>&laquo;&nbsp;beuh? à quoi ça sert? quel intérêt?&nbsp;&raquo;</em>.</p>
<p style="text-align:justify;">La réponse est très simple et tout simplement incroyable, <strong>OpenBricks sert à créer la distribution GeeXboX</strong>.</p>
<p style="text-align:justify;">Et un outil de ce genre vaut mieux le rendre un peu plus générique (c&rsquo;est comme si on avait transformé notre marteau planteur de clous GeeXboX en marteau universel). Avant OpenBricks le toolchain GeeXboX était très orienté sur les spécificités du multimédia et de ce que GeeXboX propose tel que les images ISO, le générateur d&rsquo;ISO, etc,&#8230; Ils arrivaient à certaines personnes d&rsquo;utiliser notre toolchain à d&rsquo;autres fins. Je l&rsquo;ai personnellement hacké pour avoir un petite distribution Linux perso sur mon Palm ainsi que pour un robot de laboratoire. Car bien que le toolchain GeeXboX était très axé sur le multimédia, c&rsquo;était facile à le modifier pour le dédier à autre chose.</p>
<p style="text-align:justify;">Alors on peut imaginer une autre réponse pour la question &laquo;&nbsp;à quoi ça sert?&nbsp;&raquo;, et bien <strong>OpenBricks sert à créer une distribution pour différentes applications et sans devoir bidouiller</strong> (contrairement à l&rsquo;époque).</p>
<p style="text-align:justify;">Que du positif! non?</p>
<p style="text-align:justify;">A+</p>
<p style="text-align:justify;padding-left:30px;">Mathieu SCHROETER</p>
<br /> Tagged: <a href='http://skywalker13.wordpress.com/tag/embedded/'>embedded</a>, <a href='http://skywalker13.wordpress.com/tag/framework/'>framework</a>, <a href='http://skywalker13.wordpress.com/tag/geexbox/'>GeeXboX</a>, <a href='http://skywalker13.wordpress.com/tag/openbricks/'>OpenBricks</a>, <a href='http://skywalker13.wordpress.com/tag/toolchain/'>toolchain</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/skywalker13.wordpress.com/1273/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/skywalker13.wordpress.com/1273/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=skywalker13.wordpress.com&#038;blog=4019559&#038;post=1273&#038;subd=skywalker13&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://skywalker13.wordpress.com/2010/10/19/openbricks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4be2af9a8c02ddaa79d2de987ad91c4?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">[GO]Skywalker13</media:title>
		</media:content>

		<media:content url="http://skywalker13.files.wordpress.com/2010/10/openbricks-400.png?w=150" medium="image">
			<media:title type="html">OpenBricks</media:title>
		</media:content>
	</item>
		<item>
		<title>Un petit retour sur Vim</title>
		<link>http://skywalker13.wordpress.com/2010/07/25/un-petit-retour-sur-vim/</link>
		<comments>http://skywalker13.wordpress.com/2010/07/25/un-petit-retour-sur-vim/#comments</comments>
		<pubDate>Sun, 25 Jul 2010 15:15:43 +0000</pubDate>
		<dc:creator>Mathieu SCHROETER</dc:creator>
				<category><![CDATA[/dev/null]]></category>
		<category><![CDATA[GeeXboX]]></category>
		<category><![CDATA[auto-completion]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[editor]]></category>
		<category><![CDATA[indentation]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[programmation]]></category>
		<category><![CDATA[vi]]></category>
		<category><![CDATA[Vim]]></category>

		<guid isPermaLink="false">http://skywalker13.wordpress.com/?p=1234</guid>
		<description><![CDATA[Hello, J&#8217;avais déjà écrit un article sur Vim il y a pas mal de temps. J&#8217;indiquais simplement ma configuration de l&#8217;éditeur. Depuis ce jour j&#8217;ai fait quelques modifications pour mon confort, mais absolument rien d&#8217;extraordinaire. J&#8217;aurais pu reprendre mon ancien article, mais quitte à en écrire un nouveau. Les différences par rapport à l&#8217;ancien se [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=skywalker13.wordpress.com&#038;blog=4019559&#038;post=1234&#038;subd=skywalker13&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Hello,</p>
<p style="text-align:justify;"><a href="http://skywalker13.files.wordpress.com/2009/04/wiki.png"><img class="alignright size-thumbnail wp-image-544" style="border:0 none;margin-left:5px;margin-right:0;" title="Vim" src="http://skywalker13.files.wordpress.com/2009/04/wiki.png?w=83&#038;h=96" alt="" width="83" height="96" /></a>J&rsquo;avais déjà écrit un article sur Vim il y a pas mal de temps. J&rsquo;indiquais simplement ma configuration de l&rsquo;éditeur. Depuis ce jour j&rsquo;ai fait quelques modifications pour mon confort, mais absolument rien d&rsquo;extraordinaire. J&rsquo;aurais pu reprendre mon ancien article, mais quitte à en écrire un nouveau.</p>
<p style="text-align:justify;">Les différences par rapport à l&rsquo;<a href="http://skywalker13.wordpress.com/2009/04/04/vim-lindentation/">ancien</a> se situent principalement au niveau de &laquo;&nbsp;l&rsquo;auto-completion&nbsp;&raquo;. Le but est d&rsquo;avoir quelque chose de mieux que des listes indigestes comme avec  <em>&lt;CTRL-P&gt;</em>, <em>&lt;CTRL-N&gt;</em>,&#8230;. Qui ont bien entendu aussi leurs utilités. J&rsquo;ai donc rajouté <a href="http://www.vim.org/scripts/script.php?script_id=1520">OmniCppComplete</a> que vous devez installer dans votre ~/.vim. Les menus de popup s&rsquo;affichent automatiquement dès que l&rsquo;on tape un [.] ou une &laquo;&nbsp;-&gt;&nbsp;&raquo; pour les structures par exemple. Si par contre vous tapez le nom d&rsquo;une fonction et que vous voulez la liste des arguments, alors commencez à taper un peu son nom, puis elle sera visible dans un popup avec <em>&lt;CTRL-X&gt; &lt;CTRL-O&gt;</em>.</p>
<p style="text-align:justify;">Le .vimrc ci-dessous créer également les tags à l&rsquo;aide de <em>&lt;CTRL-F12&gt;</em>. Alors n&rsquo;oubliez pas d&rsquo;installer <strong>ctags</strong> sur votre distribution.</p>
<pre class="brush: plain; title: ; notranslate">
&quot; Global settings
set nocompatible
syntax on
set hlsearch
set shiftwidth=2
set background=dark
set cursorline
inoremap &lt;S-Tab&gt; &lt;C-V&gt;&lt;Tab&gt;

&quot; Show line number
set number
highlight LineNr term=bold ctermfg=darkgray guifg=darkgray

&quot; Special configuration for devel
filetype on
filetype plugin on
set ofu=syntaxcomplete#Complete
autocmd FileType c,cpp,cxx,h,fl,php set cindent|set cino=:0|set tabstop=8|set softtabstop=2|set expandtab
autocmd FileType make setlocal noexpandtab

&quot; Special highlighting for Doxygen
let g:load_doxygen_syntax=1

&quot; Show when a line exceeds 80 chars
au BufWinEnter * let w:m1=matchadd('ErrorMsg', '\%&gt;80v.\+', -1)

&quot; Highlight Tabs and Spaces
au BufWinEnter * let w:m2=matchadd('Tab', '\t', -1)
au BufWinEnter * let w:m3=matchadd('Space', '\s\+$\| \+\ze\t', -1)
set list listchars=tab:»·,trail:·
highlight Tab ctermbg=darkgray guibg=darkgray
highlight Space ctermbg=darkblue guibg=darkblue

&quot; OmniCppComplete
let OmniCpp_NamespaceSearch = 1
let OmniCpp_GlobalScopeSearch = 1
let OmniCpp_ShowAccess = 1
let OmniCpp_ShowPrototypeInAbbr = 1
let OmniCpp_MayCompleteDot = 1
let OmniCpp_MayCompleteArrow = 1
let OmniCpp_MayCompleteScope = 1
let OmniCpp_DefaultNamespaces = [&quot;std&quot;, &quot;_GLIBCXX_STD&quot;]

&quot; CTags
map &lt;C-F12&gt; :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .&lt;CR&gt;&lt;CR&gt;
set tags=~/.vim/stdtags,tags,.tags,../tags
au CursorMovedI,InsertLeave * if pumvisible() == 0|silent! pclose|endif
set completeopt=menuone,menu,longest,preview
</pre>
<p style="text-align:justify;">
<p style="text-align:justify;">Bien entendu ce .vimrc est de loin pas parfait, mais il remplit parfaitement mes besoins. En quelques mots, les dépassements du 80ème caractère s&rsquo;affichent en rouge, les tabulations et les espaces en fin de ligne sont mis en évidence. Pour insérer une vraie tabulation alors il faut faire <em>&lt;SHIFT-TAB&gt;</em>&#8230;</p>
<p style="text-align:justify;">Un exemple avec libvalhalla que j&rsquo;ai &laquo;&nbsp;salopé&nbsp;&raquo; exprès :o)</p>
<p style="text-align:justify;">
<div id="attachment_1246" class="wp-caption aligncenter" style="width: 411px"><a href="http://skywalker13.files.wordpress.com/2010/07/vim.png"><img class="size-thumbnail wp-image-1246" style="border:0 none;" title="Vim" src="http://skywalker13.files.wordpress.com/2010/07/vim.png?w=401&#038;h=211" alt="" width="401" height="211" /></a><p class="wp-caption-text">Vim - libvalhalla</p></div>
<p>A bientôt,</p>
<p style="padding-left:30px;">Mathieu SCHROETER</p>
<br /> Tagged: <a href='http://skywalker13.wordpress.com/tag/auto-completion/'>auto-completion</a>, <a href='http://skywalker13.wordpress.com/tag/c/'>C</a>, <a href='http://skywalker13.wordpress.com/tag/editor/'>editor</a>, <a href='http://skywalker13.wordpress.com/tag/geexbox/'>GeeXboX</a>, <a href='http://skywalker13.wordpress.com/tag/indentation/'>indentation</a>, <a href='http://skywalker13.wordpress.com/tag/opensource/'>opensource</a>, <a href='http://skywalker13.wordpress.com/tag/programmation/'>programmation</a>, <a href='http://skywalker13.wordpress.com/tag/vi/'>vi</a>, <a href='http://skywalker13.wordpress.com/tag/vim/'>Vim</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/skywalker13.wordpress.com/1234/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/skywalker13.wordpress.com/1234/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=skywalker13.wordpress.com&#038;blog=4019559&#038;post=1234&#038;subd=skywalker13&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://skywalker13.wordpress.com/2010/07/25/un-petit-retour-sur-vim/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4be2af9a8c02ddaa79d2de987ad91c4?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">[GO]Skywalker13</media:title>
		</media:content>

		<media:content url="http://skywalker13.files.wordpress.com/2009/04/wiki.png?w=130" medium="image">
			<media:title type="html">Vim</media:title>
		</media:content>

		<media:content url="http://skywalker13.files.wordpress.com/2010/07/vim.png?w=300" medium="image">
			<media:title type="html">Vim</media:title>
		</media:content>
	</item>
		<item>
		<title>Quoi de neuf&#8230;</title>
		<link>http://skywalker13.wordpress.com/2010/07/03/quoi-de-neuf/</link>
		<comments>http://skywalker13.wordpress.com/2010/07/03/quoi-de-neuf/#comments</comments>
		<pubDate>Sat, 03 Jul 2010 21:30:37 +0000</pubDate>
		<dc:creator>Mathieu SCHROETER</dc:creator>
				<category><![CDATA[Daisy]]></category>
		<category><![CDATA[Enna]]></category>
		<category><![CDATA[GeeXboX]]></category>
		<category><![CDATA[libplayer]]></category>
		<category><![CDATA[Valhalla]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[libduck]]></category>
		<category><![CDATA[libvalhalla]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MPlayer]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[programmation]]></category>
		<category><![CDATA[vdpau]]></category>

		<guid isPermaLink="false">http://skywalker13.wordpress.com/?p=1224</guid>
		<description><![CDATA[Hello, Pas beaucoup de nouvelles depuis passablement de temps. Je vais faire néanmoins un petit tour en bref des quelques activités sur lesquels j&#8217;ai travaillé. Mon activité sur les projets GeeXboX à baissé nettement depuis quelques semaines pour plusieurs raisons. J&#8217;ai eu 3 mois de service civil où j&#8217;ai qu&#8217;en même pu travailler dans mon [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=skywalker13.wordpress.com&#038;blog=4019559&#038;post=1224&#038;subd=skywalker13&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Hello,</p>
<p style="text-align:justify;">Pas beaucoup de nouvelles depuis passablement de temps. Je vais faire néanmoins un petit tour en bref des quelques activités sur lesquels j&rsquo;ai travaillé. Mon activité sur les projets GeeXboX à baissé nettement depuis quelques semaines pour plusieurs raisons. J&rsquo;ai eu 3 mois de <a href="http://www.servicecivil.ch/pgs/scbref.html">service civil</a> où j&rsquo;ai qu&rsquo;en même pu travailler dans mon domaine (l&rsquo;informatique et plus précisément la programmation). Et de ces trois mois, sont nés deux petits projets hébergés sur les serveurs GeeXboX.</p>
<h3 style="text-align:justify;">DaisyDuck &amp; libduck</h3>
<p style="text-align:justify;"><img class="alignright" style="border:0 none;margin:5px 10px;" title="DaisyDuck" src="http://daisy.geexbox.org/daisyduck.png" alt="DaisyDuck" width="110" height="181" />Je vous invite à consulter le <a href="http://daisy.geexbox.org">site internet</a>. DaisyDuck est un lecteur de livre audio <a href="http://en.wikipedia.org/wiki/DAISY_Digital_Talking_Book">Daisy 2.02</a>, basé sur Qt et libVLC. Il est multi-plateforme et distribué aussi bien pour Windows que pour Linux. Il pourrait également être adapté sans trop de problème à MacOSX. Mais pour des questions de temps, je me suis arrêté à la version Windows.</p>
<p style="text-align:justify;">Il existe de &laquo;&nbsp;nombreux&nbsp;&raquo; (beaucoup de commerciaux aussi) programmes de lecteur de livre Daisy. Mais la grande différence avec DaisyDuck c&rsquo;est tout d&rsquo;abord libVLC. La plupart ne sont pas capables de lire une grande variété de format, et encore moins de protocole réseau. Même qu&rsquo;en principe pouvoir lire n&rsquo;importe quel format n&rsquo;est pas un respect entier des spécifications. Par contre c&rsquo;était le but de mon travail. Permettre la lecture de livre en ligne, ce que le logiciel est parfaitement capable de faire, et ça fonctionne à merveille. Merci à l&rsquo;équipe de VideoLAN.</p>
<p style="text-align:justify;">Le deuxième petit projet est donc libduck. Il est également présenté sur le site internet de DaisyDuck. Son but est de réaliser le &laquo;&nbsp;parsing&nbsp;&raquo; des fichiers Daisy 2.02.</p>
<blockquote>
<p style="text-align:justify;">Malheureusement je n&rsquo;ai pas utilisé libplayer comme base à DaisyDuck. La raison principale est que libplayer n&rsquo;est pas encore très utilisable (compilable) pour Windows pour différentes raisons techniques. Et faute de temps, je ne pouvais pas me permettre de travailler sur le port de libplayer dans mon temps destiné à mon service civil.</p>
</blockquote>
<h3 style="text-align:justify;">Valhalla</h3>
<p style="text-align:justify;">Bien que j&rsquo;ai terminé le service civil depuis fin mai, il me fallait également trouver un emploi. Et depuis mi juin, j&rsquo;effectue des trajets relativement longs par jour. Mon temps libre en soirée est devenu presque nul. Je me motive alors à travailler sur les projets GeeXboX, dans le train. Et faut bien l&rsquo;avouer, c&rsquo;est difficile d&rsquo;avancer vite. Mais ça avance qu&rsquo;en même, et sur libvalhalla cette fois ci.</p>
<p style="text-align:justify;">J&rsquo;ai commencé sérieusement à ajouter le support des langues pour les méta-données. Le patch devrait arriver très vite, peut être même demain. Par contre ce n&rsquo;est pas encore complet. Je dois adapter les fonctions pour les sélections des méta-données afin de pouvoir filtrer sur les langues, il me faut aussi encore implémenter le support des grabbers multi-lingues. Ou tout du moins, pouvoir paramétrer les grabbers multi-lingues pour récupérer les données dans une langue spécifique. Au moment où j&rsquo;écris ces lignes, j&rsquo;ai uniquement ajouté le support des langues dans la base de donnée, et adapté les grabbers afin que l&rsquo;information de langue soit correctement indiquée avec les meta-données. Par exemple, le grabber Allocine indique ainsi du &laquo;&nbsp;fr&nbsp;&raquo; pour ce qui est des résumés, catégories, etc,.. Les autres grabbers sont en principe en &laquo;&nbsp;en&nbsp;&raquo; et les données qui n&rsquo;ont pas de langue (par exemple un codec, la taille du fichier ou alors la résolution) sont indiquées comme &laquo;&nbsp;undef&nbsp;&raquo;. Toutes les méta-données récupérées par les &laquo;&nbsp;parsers&nbsp;&raquo; sont également en &laquo;&nbsp;undef&nbsp;&raquo;.</p>
<p style="text-align:justify;">Un autre projet dans lequel je veux me lancer sérieusement, c&rsquo;est de pouvoir paralléliser le &laquo;&nbsp;downloader&nbsp;&raquo; et les &laquo;&nbsp;grabbers&nbsp;&raquo; pour un même fichier. Afin de récupérer les images un peu plus vite. Mais je ne veux pas rentrer dans ce genre d&rsquo;explications avec ce poste.</p>
<h3 style="text-align:justify;">libplayer</h3>
<p style="text-align:justify;">Aux alentours de mai, j&rsquo;ai intégré le support de VDPAU directement dans libplayer. Alors non, il n&rsquo;y a rien d&rsquo;extraordinaire, ça concerne quelques lignes. L&rsquo;idée c&rsquo;est que pour pouvoir exécuter MPlayer correctement avec VDPAU, il faut connaître les caractéristiques du GPU. Et pour ça, il faut interroger la carte graphique. Avec GeeXboX, cela se faisait en dehors d&rsquo;Enna/libplayer avec un script et un exécutable. Mais ceci n&rsquo;est plus nécessaire, car maintenant libplayer fait cette tâche de manière transparente.</p>
<h3 style="text-align:justify;">Enna</h3>
<p style="text-align:justify;">Nicolas à modifié en profondeur le VFS d&rsquo;Enna. J&rsquo;ai donc pris le temps de retravailler le browser Valhalla. Celui-ci est désormais mieux fait au niveau des chemins d&rsquo;accès (je n&rsquo;ai pas envie d&rsquo;expliquer ça ici). Bref, en gros ce browser re-fonctionne avec le nouveau VFS mais il a qu&rsquo;en même quelques petites régressions qui ne devraient pas être trop difficiles à corriger.</p>
<h3 style="text-align:justify;">Le projet de &laquo;&nbsp;hardware&nbsp;&raquo;</h3>
<p style="text-align:justify;">Réaliser un set-top box GeeXboX est très nouveau et assez ambitieux. L&rsquo;idée est de partir de zéro, de la schématique au PCB puis aux prototypes, pour finir avec la distribution GeeXboX/Enna optimisée au mieux pour le matériel. Le seul gros obstacle actuellement c&rsquo;est la difficulté à avoir accès aux datasheets des composants intéressants (NDA nécessaires dans quasiment tous les cas). On vise bien sûr le full-HD avec si possible un petit plus par rapport aux autres boards. Tel que par exemple des ports miniPCIe. On a les ressources techniques, manque la doc :-). Ensuite il y aura forcément le problème du temps qui pourra être investi dans ce projet. Mais pour le moment je suis assez confiant.</p>
<h3 style="text-align:justify;">Pour terminer (et pour arrêter de parler de moi)</h3>
<h4>Toolchain</h4>
<p style="text-align:justify;">Davide fait un gros boulot depuis plusieurs semaines. Il a pris une excellente initiative concernant le toolchain GeeXboX. Le but est d&rsquo;avoir un toolchain basé sur <a href="http://code.google.com/p/opkg/">opkg</a>. Tout se construit via des paquetages, que se sois les dépendances pour la construction du toolchain (gcc, binutils, etc&#8230;) que les éléments du &laquo;&nbsp;target&nbsp;&raquo;.</p>
<p style="text-align:justify;">J&rsquo;ai toujours aimé le toolchain GeeXboX pour sa simplicité. On entend souvent parler d&rsquo;OpenWRT par exemple. Il est sûrement très bien, mais notre toolchain c&rsquo;est notre identité. J&rsquo;ai toujours été réticent à le voir se faire remplacer par une solution qui viendrait d&rsquo;ailleurs. Alors un grand merci à Davide pour avoir fait ce gros job!</p>
<h4 style="text-align:justify;">Le site web</h4>
<p style="text-align:justify;">Benjamin en avait marre du site web. Je le comprend tout à fait car j&rsquo;ai toujours eu la flemme d&rsquo;y faire des modifs. Faut être clair, chez GeeXboX en principe faut un peu toucher à tout. Mais parfois les tâches comme le site, pas grand monde à envie d&rsquo;y mettre les mains. Alors Benjamin à basculer sur WordPress qui simplifie grandement la vie aussi bien pour la facilité que pour le design.</p>
<p style="text-align:justify;">J&rsquo;aimerais qu&rsquo;en même dire un mot sur l&rsquo;ancien site. Il avait une particularité en comparaison à beaucoup d&rsquo;autres sites internet. Ce bon vieux site était entièrement réalisé en XML+XSL (un très bel exemple et très professionnel). Bien sûr les sources sont toujours bien au chaud, dans les <a href="http://hg.geexbox.org/site/">dépots Mercurial</a>.</p>
<h4 style="text-align:justify;">Enna</h4>
<p style="text-align:justify;">Nicolas a fait diverses modifications sur Enna en plus du VFS. Néanmoins je n&rsquo;ai pas encore pu compiler ces dernières modifs :-P. Faute de temps principalement, car je dois mettre à jour les EFL.</p>
<p style="text-align:justify;">A bientôt,</p>
<p style="text-align:justify;padding-left:30px;">Mathieu SCHROETER</p>
<p style="text-align:justify;">
<br /> Tagged: <a href='http://skywalker13.wordpress.com/tag/c/'>C</a>, <a href='http://skywalker13.wordpress.com/tag/enna/'>Enna</a>, <a href='http://skywalker13.wordpress.com/tag/geexbox/'>GeeXboX</a>, <a href='http://skywalker13.wordpress.com/tag/libduck/'>libduck</a>, <a href='http://skywalker13.wordpress.com/tag/libplayer/'>libplayer</a>, <a href='http://skywalker13.wordpress.com/tag/libvalhalla/'>libvalhalla</a>, <a href='http://skywalker13.wordpress.com/tag/linux/'>Linux</a>, <a href='http://skywalker13.wordpress.com/tag/mplayer/'>MPlayer</a>, <a href='http://skywalker13.wordpress.com/tag/opensource/'>opensource</a>, <a href='http://skywalker13.wordpress.com/tag/programmation/'>programmation</a>, <a href='http://skywalker13.wordpress.com/tag/valhalla/'>Valhalla</a>, <a href='http://skywalker13.wordpress.com/tag/vdpau/'>vdpau</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/skywalker13.wordpress.com/1224/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/skywalker13.wordpress.com/1224/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=skywalker13.wordpress.com&#038;blog=4019559&#038;post=1224&#038;subd=skywalker13&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://skywalker13.wordpress.com/2010/07/03/quoi-de-neuf/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4be2af9a8c02ddaa79d2de987ad91c4?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">[GO]Skywalker13</media:title>
		</media:content>

		<media:content url="http://daisy.geexbox.org/daisyduck.png" medium="image">
			<media:title type="html">DaisyDuck</media:title>
		</media:content>
	</item>
		<item>
		<title>Enna et les Metadata</title>
		<link>http://skywalker13.wordpress.com/2010/04/03/enna-et-les-metadata/</link>
		<comments>http://skywalker13.wordpress.com/2010/04/03/enna-et-les-metadata/#comments</comments>
		<pubDate>Sat, 03 Apr 2010 17:41:14 +0000</pubDate>
		<dc:creator>Mathieu SCHROETER</dc:creator>
				<category><![CDATA[Enna]]></category>
		<category><![CDATA[GeeXboX]]></category>
		<category><![CDATA[Valhalla]]></category>
		<category><![CDATA[libvalhalla]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[metadata]]></category>
		<category><![CDATA[opensource]]></category>

		<guid isPermaLink="false">http://skywalker13.wordpress.com/?p=1173</guid>
		<description><![CDATA[Hello, Depuis plusieurs semaines j&#8217;ai passablement baissé le rythme sur les projets. D&#8217;une part pour cause d&#8217;obligations qui ne me permettent pas de passer énormément de temps sur GeeXboX et d&#8217;autre part parce que depuis octobre à février j&#8217;ai passé beaucoup de temps sur Enna, libplayer et libvalhalla, et ça commençait un peu à me [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=skywalker13.wordpress.com&#038;blog=4019559&#038;post=1173&#038;subd=skywalker13&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Hello,</p>
<p style="text-align:justify;">Depuis plusieurs semaines j&rsquo;ai passablement baissé le rythme sur les projets. D&rsquo;une part pour cause d&rsquo;obligations qui ne me permettent pas de passer énormément de temps sur GeeXboX et d&rsquo;autre part parce que depuis octobre à février j&rsquo;ai passé beaucoup de temps sur Enna, libplayer et libvalhalla, et ça commençait un peu à me saturer.</p>
<p style="text-align:justify;">En principe je devrais me concentrer sur le générateur d&rsquo;ISO. Depuis la branche 2 de GeeXboX, ce pauvre générateur est complètement dépassé. Que se sois les fichiers de configuration qui ont changés, des variables renommées, la disparition des thèmes du bootsplash et du menu OSD. Bref plein de petites choses qui ensemble font un gros paquet. J&rsquo;ai qu&rsquo;en même commencé gentiment son nettoyage de printemps. Reste à trouver aussi la motivation nécessaire (comme d&rsquo;habitude).</p>
<h3 style="text-align:justify;">Enna et le &laquo;&nbsp;ondemand&nbsp;&raquo;</h3>
<p style="text-align:justify;"><a href="http://skywalker13.files.wordpress.com/2009/07/icon_enna_64.png"><img class="alignright size-full wp-image-691" style="border:0 none;margin-top:5px;margin-bottom:5px;" title="Enna" src="http://skywalker13.files.wordpress.com/2009/07/icon_enna_64.png?w=450" alt=""   /></a>Au début de la semaine, j&rsquo;ai fais quelques petites modifications sur libvalhalla. Puis en re-testant sous Enna, un ancien &laquo;&nbsp;problème&nbsp;&raquo; m&rsquo;a ennuyé plus que d&rsquo;habitude. C&rsquo;est un comportement bien connu depuis longtemps mais qui demandait peut être un surplus de motivation pour en venir à bout. Non pas que c&rsquo;est difficile à &laquo;&nbsp;corriger&nbsp;&raquo;, mais plutôt que ce n&rsquo;était pas spécialement intéressant à faire. Du coup j&rsquo;ai laissé trainé depuis des mois. Jusqu&rsquo;à cette semaine où ça m&rsquo;a particulièrement contrarié. Peut être était-ce juste une mauvaise journée, j&rsquo;ai donc qu&rsquo;en même pris le temps de régler cet &laquo;&nbsp;inconvénient&nbsp;&raquo;.</p>
<p style="text-align:justify;">Comme vous le savez (j&rsquo;espère), Enna utilise libvalhalla pour les méta-données. Si on ne se fie que sur ce que montre Enna, il y avait un comportement qui donnait l&rsquo;impression que c&rsquo;était très lent à afficher les méta-données. Par exemple, vous sélectionnez un film et il n&rsquo;y a pas de backdrop, de titre, etc,&#8230; Vous pouviez laisser une heure la sélection sur le même film, vous n&rsquo;auriez rien vu s&rsquo;afficher de plus. La première réaction c&rsquo;est que c&rsquo;est lent. Mais en réalité ce n&rsquo;est pas le cas. Il faut savoir que libvalhalla met à disposition plus de fonctionnalités qu&rsquo;Enna en utilise. Une de ces fonctionnalité est le &laquo;&nbsp;ondemand&nbsp;&raquo;. Celle-ci était (jusqu&rsquo;à hier) uniquement utilisée à moitié.</p>
<p style="text-align:justify;"><strong>Le principe (avant):</strong></p>
<ol>
<li>Vous sélectionnez un film</li>
<li>Enna envoie une requête &laquo;&nbsp;ondemand&nbsp;&raquo; à libvalhalla</li>
<li>libvalhalla va faire un certain nombre de choses pour donner plus de priorité à cette demande que pour les fichiers trouvés par le scanner.</li>
<li>Et c&rsquo;est tout :-)</li>
</ol>
<p style="text-align:justify;">En fait Enna demandait à libvalhalla de lui donner en priorité les metadata d&rsquo;un fichier, mais sans aller consulter libvalhalla pour savoir si les metadata étaient disponibles ou non. Du coup il était nécessaire de changer de fichier, puis de revenir sur le précédent pour que ça commence à afficher quelque chose. Bref, c&rsquo;est ça qui m&rsquo;a énervé en début de semaine.</p>
<p style="text-align:justify;">En fait libvalhalla peut signaler à Enna où en est le fichier dans les étapes que sont le &laquo;&nbsp;parsing&nbsp;&raquo;, &laquo;&nbsp;grabbing&nbsp;&raquo; et &laquo;&nbsp;downloading&nbsp;&raquo;. Mais Enna ignorait complètement ces événements.</p>
<p style="text-align:justify;"><strong>Le principe (depuis hier):</strong></p>
<ol>
<li>Vous sélectionnez un film</li>
<li>Enna envoie une requête &laquo;&nbsp;ondemand&nbsp;&raquo; à libvalhalla</li>
<li>libvalhalla va faire un certain nombre de choses pour donner plus de priorité à cette demande que pour les fichiers trouvés par le scanner.</li>
<li>libvalhalla envoie l&rsquo;événement &laquo;&nbsp;parsed&nbsp;&raquo;</li>
<li>Enna l&rsquo;attrape et remet à jour certaines metadata (comme le titre par exemple)</li>
<li>libvalhalla envoie un événement &laquo;&nbsp;grabbed&nbsp;&raquo; après chaque grabber.</li>
<li>Enna l&rsquo;attrape et remet à jour certaines metadata (comme le synopsis par exemple)</li>
<li>libvalhalla envoie un événement &laquo;&nbsp;ended&nbsp;&raquo;</li>
<li>Enna l&rsquo;attrape et remet à jour une fois pour toute.</li>
</ol>
<p>Ainsi, on voit apparaitre au fur et à mesure les informations (également dans le panneau d&rsquo;informations <em>CTRL+I</em>). C&rsquo;est bien plus sympathique.</p>
<p style="text-align:justify;">Le fait de sélectionner un fichier, indique à Enna qu&rsquo;une requête &laquo;&nbsp;ondemand&nbsp;&raquo; doit être envoyée à libvalhalla, et ce mécanisme a des effets importants. En passant d&rsquo;un fichier à l&rsquo;autre vous envoyez chaque fois une nouvelle requête &laquo;&nbsp;ondemand&nbsp;&raquo; (à noter que la requête n&rsquo;a aucun impacte si le fichier demandé est déjà complètement disponible dans la base de donnée).</p>
<h3>Rappel sur le &laquo;&nbsp;ondemand&nbsp;&raquo;</h3>
<p style="text-align:justify;">La fonction s&rsquo;utilise très simplement.</p>
<p style="text-align:justify;">
<pre class="brush: cpp; gutter: false; title: ; notranslate">
valhalla_ondemand (valhalla_t *handle, const char *path);
</pre>
<p style="text-align:justify;">On donne le chemin du fichier qui nous intéresse (qu&rsquo;il soit référencé par le scanner ou non). Maintenant imaginons qu&rsquo;on appel 10 fois cette fonction à petit intervalle de temps avec des fichiers différents. Le but du &laquo;&nbsp;ondemand&nbsp;&raquo; c&rsquo;est de donner une haute priorité à un fichier ou quelques fichiers. Si vous appelez la fonction pour beaucoup de fichiers, finalement ils deviennent tous &laquo;&nbsp;haute priorité&nbsp;&raquo; et entre eux il n&rsquo;y a plus de différence (trop de &laquo;&nbsp;ondemand&nbsp;&raquo;, tue le &laquo;&nbsp;ondemand&nbsp;&raquo;). Mais pour comprendre pourquoi, il m&rsquo;est nécessaire de donner plus de détails sur le fonctionnement de libvalhalla.</p>
<p style="text-align:justify;">J&rsquo;ai déjà donné passablement d&rsquo;explications dans d&rsquo;autres billets de ce blog, ainsi je vais aller droit au but. Le fait qu&rsquo;il y ait beaucoup de threads et qu&rsquo;un &laquo;&nbsp;paquet&nbsp;&raquo; (donc une structure qui identifie un fichier) peut exister dans plusieurs threads à la fois (des cas très particuliers que je ne vais pas expliquer ici); il est difficile de savoir où se trouve un fichier à un moment précis. Ainsi la requête &laquo;&nbsp;ondemand&nbsp;&raquo; va endormir tous les threads concernés pour pouvoir chercher le fichier pour qui il faut donner une plus haute priorité. Et c&rsquo;est cette action qui a un impacte non négligeable sur libvalhalla. La plupart des threads sont rapidement endormis. Mais certains sont un peu plus récalcitrants. Je pense tout particulièrement aux grabbers. Il suffit qu&rsquo;un webservice bloque (problème de connexion), et donc il est nécessaire d&rsquo;attendre le timeout de libcurl jusqu&rsquo;au moment de pouvoir endormir ce fameux thread. Ce timeout je l&rsquo;ai mis à 20 sec. Mais je me tâte presque à le réduire encore un peu (à noter qu&rsquo;avec libvalhalla-1 et donc Enna-0.4 les timeouts sont pires car se sont ceux de l&rsquo;OS et en principe ils sont bien supérieurs à 20 secondes).</p>
<p style="text-align:justify;">Maintenant imaginez plusieurs &laquo;&nbsp;ondemand&nbsp;&raquo; à des intervalles relativement proches et ce foutu webservice qui bloque. Il faut donc patienter sur libcurl. Ce phénomène est visible également à la fermeture d&rsquo;Enna. Si les grabbers sont actifs, au moment du &laquo;&nbsp;force-stop&nbsp;&raquo;; <strong>au pire</strong> avec Enna-devel vous devez attendre 20 sec sur un grabber. Il serait peut être bien que je permette de paramétrer ce temps directement depuis l&rsquo;<em>enna.cfg</em>. Actuellement il est en dur dans la configuration pour libcurl de libvalhalla.</p>
<blockquote>
<p style="text-align:justify;">Je parle de &laquo;&nbsp;timeout&nbsp;&raquo;, mais en réalité c&rsquo;est un petit peu différent. C&rsquo;est le temps maximal autorisé pour une transmission. Par exemple si un fichier prend plus de 20 secondes à être téléchargé, libcurl va qu&rsquo;en même l&rsquo;interrompre à 20 secondes.<br />
Ainsi en utilisant un temps bien trop faible, vous risquez de faire échouer bêtement la plupart des grabbers.</p>
<p style="text-align:justify;">L&rsquo;idéal serait de pouvoir forcer libcurl à interrompre une liaison indépendamment de la valeur du &laquo;&nbsp;timeout&nbsp;&raquo;. Ca serait particulièrement utile lors du &laquo;&nbsp;force-stop&nbsp;&raquo;.<br />
<em>[EDIT: ce problème a été fixé!]</em></p>
</blockquote>
<h4 style="text-align:justify;">Autre phénomène</h4>
<p style="text-align:justify;">Les threads de libvalhalla communiquent par l&rsquo;intermédiaire de FIFO. La haute priorité est simplement d&rsquo;utiliser le FIFO en tant que LIFO le temps du push. Dit autrement, au lieu de mettre le paquet au fond de la pile, on le met directement au-dessus. Ainsi s&rsquo;il y a plusieurs requêtes &laquo;&nbsp;ondemand&nbsp;&raquo;, chacune d&rsquo;elle va se remettre au-dessus. Peu importe que la requête a été fait avant ou après.  Chaque fois qu&rsquo;un paquet change de thread il se remet au-dessus. C&rsquo;est un peu comme si tous les paquets &laquo;&nbsp;ondemand&nbsp;&raquo; se battaient pour la première place.</p>
<p style="text-align:justify;">Au final, tous les paquets &laquo;&nbsp;ondemand&nbsp;&raquo; seront traités en priorité par rapport au scanner, tout en restant entre eux, sur le même pied d&rsquo;égalité.</p>
<h3 style="text-align:justify;">Il reste encore du travail</h3>
<p style="text-align:justify;">L&rsquo;état actuel n&rsquo;est pas encore parfait. Dans l&rsquo;activité musique, les requêtes &laquo;&nbsp;ondemand&nbsp;&raquo; se font uniquement lorsqu&rsquo;un fichier est sélectionné (tout comme pour la vidéo). Le passage d&rsquo;un fichier à l&rsquo;autre par le biais des boutons précédent/suivant et via l&rsquo;événement EOS (End Of Stream) ne provoque aucun &laquo;&nbsp;ondemand&nbsp;&raquo;. La raison vient directement de l&rsquo;implémentation du &laquo;&nbsp;mediaplayer&nbsp;&raquo;. Les actions ne se font pas dans l&rsquo;activité, mais directement en interne dans le mediaplayer. Et les metadata ne sont pas tout à fait considérées de la même manière entre l&rsquo;activité vidéo et musique. Pour avoir un &laquo;&nbsp;ondemand&nbsp;&raquo; plus homogène, il faudrait revoir en profondeur le &laquo;&nbsp;mediaplayer&nbsp;&raquo; et éliminer les particularités (ennuyeuses) de chaque activité.</p>
<p style="text-align:justify;">A bientôt,</p>
<p style="text-align:justify;padding-left:30px;">Mathieu SCHROETER</p>
<br /> Tagged: <a href='http://skywalker13.wordpress.com/tag/enna/'>Enna</a>, <a href='http://skywalker13.wordpress.com/tag/libvalhalla/'>libvalhalla</a>, <a href='http://skywalker13.wordpress.com/tag/linux/'>Linux</a>, <a href='http://skywalker13.wordpress.com/tag/metadata/'>metadata</a>, <a href='http://skywalker13.wordpress.com/tag/opensource/'>opensource</a>, <a href='http://skywalker13.wordpress.com/tag/valhalla/'>Valhalla</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/skywalker13.wordpress.com/1173/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/skywalker13.wordpress.com/1173/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=skywalker13.wordpress.com&#038;blog=4019559&#038;post=1173&#038;subd=skywalker13&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://skywalker13.wordpress.com/2010/04/03/enna-et-les-metadata/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4be2af9a8c02ddaa79d2de987ad91c4?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">[GO]Skywalker13</media:title>
		</media:content>

		<media:content url="http://skywalker13.files.wordpress.com/2009/07/icon_enna_64.png" medium="image">
			<media:title type="html">Enna</media:title>
		</media:content>
	</item>
		<item>
		<title>De &#171; POSIX &#187; à Windows</title>
		<link>http://skywalker13.wordpress.com/2010/02/19/de-posix-a-windows/</link>
		<comments>http://skywalker13.wordpress.com/2010/02/19/de-posix-a-windows/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 14:36:51 +0000</pubDate>
		<dc:creator>Mathieu SCHROETER</dc:creator>
				<category><![CDATA[Enna]]></category>
		<category><![CDATA[GeeXboX]]></category>
		<category><![CDATA[Valhalla]]></category>
		<category><![CDATA[clock_gettime]]></category>
		<category><![CDATA[libvalhalla]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[POSIX]]></category>
		<category><![CDATA[programmation]]></category>
		<category><![CDATA[QueryPerformanceCounter]]></category>
		<category><![CDATA[speedhack]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://skywalker13.wordpress.com/?p=1105</guid>
		<description><![CDATA[Hello, La sortie d&#8217;Enna au début janvier à réveiller des critiques de tous les genres. En principe (faut être honnête) elles ne m&#8217;intéressent pas spécialement. Tout d&#8217;abord je n&#8217;estime pas qu&#8217;il y ait de concurrence entre les logiciels libres. Beaucoup de projets s&#8217;inspirent d&#8217;autres projets et c&#8217;est normal. Et si quelqu&#8217;un désire une fonctionnalité spécifique [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=skywalker13.wordpress.com&#038;blog=4019559&#038;post=1105&#038;subd=skywalker13&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Hello,</p>
<p style="text-align:justify;">La sortie d&rsquo;<a href="http://enna.geexbox.org">Enna</a> au début janvier à réveiller des critiques de tous les genres. En principe (faut être honnête) elles ne m&rsquo;intéressent pas spécialement. Tout d&rsquo;abord je n&rsquo;estime pas qu&rsquo;il y ait de concurrence entre les logiciels libres. Beaucoup de projets s&rsquo;inspirent d&rsquo;autres projets et c&rsquo;est normal. Et si quelqu&rsquo;un désire une fonctionnalité spécifique il a plusieurs solutions. La première c&rsquo;est d&rsquo;utiliser le projet qui offre la fonctionnalité (non?). La seconde c&rsquo;est de critiquer simplement le projet car une fonctionnalité <strong>évidente</strong> est absente. Se sont ces critiques là que j&rsquo;ignore spécialement, car elles n&rsquo;apportent rien.  Après vous avez des gens qui critiquent mais qui aident spontanément et ils sont toujours les bienvenue.</p>
<h3 style="text-align:justify;">De &laquo;&nbsp;POSIX&nbsp;&raquo; à Windows</h3>
<p style="text-align:justify;">Une des critique facile est de dire qu&rsquo;Enna ne fonctionne pas sous Windows et qu&rsquo;<a href="http://xbmc.org">XBMC</a> par contre est multi-plateforme. Les gens qui le disent ont tendance à oublier (ou alors à ne pas du tout connaitre, même dans les grandes lignes) l&rsquo;histoire d&rsquo;XBMC. Et oui, à l&rsquo;origine XBMC ne fonctionnait pas nativement sous Linux. Le port à pris du temps, et c&rsquo;est le même problème quand il faut porter dans l&rsquo;autre sens.</p>
<p style="text-align:justify;">Pour en revenir à Enna, je n&rsquo;ai aucun intérêt personnel à l&rsquo;avoir sous Windows. Néanmoins il y a eu des progrès pour qu&rsquo;un jour, Enna puisse fonctionner sous Windows. Pour quand? Je n&rsquo;en sais rien et ça n&rsquo;a aucune importance.</p>
<p style="text-align:justify;">Concernant le titre, si j&rsquo;ai mis <a href="http://fr.wikipedia.org/wiki/POSIX">POSIX</a> entre guillemets c&rsquo;est parce que tout n&rsquo;est pas vraiment du POSIX. Certaines choses sont des extensions du GNU par exemple. Il y a des adaptations à faire aussi entre les systèmes qui se basent sur POSIX. Même entre les noyaux Linux et *BSD, voir même Hurd.</p>
<blockquote>
<p style="text-align:justify;">Par exemple libvalhalla fonctionne correctement sous les noyaux Linux et FreeBSD (je pense spécialement à <a href="http://www.debian.org/ports/kfreebsd-gnu/">Debian GNU/kFreeBSD</a>), elle fonctionne aussi avec <a href="http://www.gnu.org/software/hurd/hurd.html">Hurd</a> (testé avec <a href="http://www.debian.org/ports/hurd/">Debian GNU/Hurd</a>) à la différence que les priorités sur les threads ne sont pas gérées correctement. Chaque noyau à sa façon de faire des threads et ça demande de prendre en compte les cas particuliers.</p>
</blockquote>
<p style="text-align:justify;">J&rsquo;ai volontairement omis de mentionner Mac OS X, ou plus précisément <a href="http://en.wikipedia.org/wiki/Darwin_%28operating_system%29">Darwin</a>. Bien qu&rsquo;Apple dit qu&rsquo;il soit POSIX-compliant, il y a qu&rsquo;en même au moins un cas particulier dans libvalhalla car ce n&rsquo;est pas si POSIX que ça.</p>
<h4 style="text-align:justify;">MinGW</h4>
<p style="text-align:justify;">Le meilleur moyen de réaliser des ports Windows est sans aucun doute <a href="http://www.mingw.org">MinGW</a>. C&rsquo;est une base GCC et le compilateur peut être natif Windows ou alors compilé pour une <a href="http://en.wikipedia.org/wiki/Cross_compiler">compilation croisée</a> sous GNU/Linux (ou d&rsquo;autres OS). En principe depuis GNU/Linux on peut cross-compiler aussi bien pour Windows que pour Darwin (c&rsquo;est ainsi que les différentes versions du générateur d&rsquo;ISO sont faites). Néanmoins, ça peut paraitre étonnant mais il est plus facile de créer un compilateur croisé pour Windows (merci au projet MinGW) que pour Darwin.</p>
<blockquote>
<p style="text-align:justify;">J&rsquo;ai deux cross-compilateurs binaires pour Darwin8 (PPC et i686). Ils ont été créés il y a maintenant plusieurs années par un ancien membre de GeeXboX. Malheureusement il est parti avec les secrets de fabrication. Je n&rsquo;ai jamais réussi à les reproduire depuis les sources (et ce n&rsquo;est pas faute d&rsquo;avoir essayé). Si quelqu&rsquo;un à des pistes, elles m&rsquo;intéressent grandement!</p>
</blockquote>
<h3 style="text-align:justify;">libgeexbox-win32</h3>
<p style="text-align:justify;">Avant d&rsquo;espérer Enna sous Windows il faut bien sûr se concentrer sur les dépendances. Et ce qui nous intéresse ici c&rsquo;est donc libnfo, libplayer et libvalhalla. Au moment où j&rsquo;écris cet article, libnfo et libvalhalla sont &laquo;&nbsp;complètement&nbsp;&raquo; supportés sous Windows. Je vais reprendre quelques éléments intéressants qui ont posés des problèmes.</p>
<blockquote>
<p style="text-align:justify;">Notez les guillemets, car en ce qui concerne libvalhalla il reste un potentiel problème. Mais néanmoins la bibliothèque est utilisable.</p>
</blockquote>
<p style="text-align:justify;">Libvalhalla utilise des temporisations à différents endroits. Celles-ci sont réalisées à l&rsquo;aide de variable-conditions/mutex. L&rsquo;idée est d&rsquo;avoir des temporisations interruptibles contrairement à des fonctions du type sleep(), usleep() ou nanosleep() (attention, je parle bien de temporisations interruptibles sans l&rsquo;aide de <a href="http://en.wikipedia.org/wiki/Signal_%28computing%29">signaux</a>). La bibliothèque <a href="http://en.wikipedia.org/wiki/POSIX_Threads">Pthreads</a> de POSIX offre tout ce dont on a besoin. Ainsi libvalhalla et libplayer reposent complètement sur celle-ci. Mais ce n&rsquo;est pas directement de Pthreads que je désire parler, mais du temps pour pouvoir espérer avoir des temporisations plus ou moins précises. Les fonctions pthreads utilisent la structure `struct timespec` qui en théorie offre un champ à la nanoseconde. Même si la valeur peut être juste au moment de la lecture de l&rsquo;horloge, les appels de fonctions prennent de toutes façon des nanosecondes/microsecondes. Et même pour un système temps réel dur, c&rsquo;est très difficile de jouer dans ces ordres de grandeurs. Les seuls applications pratiques où je me suis vraiment amusé à compter les nanosecondes c&rsquo;est lorsque que je faisais du <a href="http://en.wikipedia.org/wiki/Vhdl">VHDL</a> sur un bon vieux Xilinx.</p>
<p style="text-align:justify;">Bref.. passons.. Mon but est de pouvoir traiter des temporisations de plusieurs centaines de millisecondes. Ce qui est très facile avec un noyau Linux. La structure timespec évoquée précédemment se présente ainsi.</p>
<pre class="brush: cpp; gutter: false; title: ; notranslate">
struct timespec {
  time_t sec;
  long int nsec;
}
</pre>
<p style="text-align:justify;">Sous *BSD, Linux et Darwin il est très facile de la peupler. Concernant Mac OS X et son pseudo POSIX-compliant, le noyau <a href="http://en.wikipedia.org/wiki/Mach_%28kernel%29">Mach</a> permet de récupérer une structure relativement semblable avec également des nanosecondes, mais la fonction POSIX clock_gettime() n&rsquo;existe pas chez Apple. Que le champ <em>nsec</em> soit juste ou non ça n&rsquo;a pas d&rsquo;importance, pour autant qu&rsquo;il ne soit pas faux dans les millisecondes. Finalement ces trois noyaux offrent les fonctions nécessaires et même plus. Mais on ne peut pas en dire autant de l&rsquo;API Windows.</p>
<h3 style="text-align:justify;">Une question de temps</h3>
<h4 style="text-align:justify;"><a href="http://msdn.microsoft.com/en-us/library/ms724390%28VS.85%29.aspx">GetSystemTime</a></h4>
<p style="text-align:justify;">Windows met à disposition des fonctions nommées GetSystemTime() et GetSystemTimeAsFileTime(). Elles sont sensées retourner une résolution à la milliseconde, respectivement à la centaine de nanoseconde. GetSystemTimeAsFileTime() est connu comme étant plus rapide que GetSystemTime(). Par contre cette fonction n&rsquo;existe pas sous Windows CE et perd donc de son intérêt (dès le moment qu&rsquo;on recherche la portabilité).</p>
<p style="text-align:justify;">Voyez plutôt le résultat en pratique avec mon PC.</p>
<pre style="text-align:justify;font-size:medium;"> WinXP                         GNU/Linux/Wine
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GetSystemTime ()
 1266227465.000000000          1266233962.000000000
 1266227465.000000000          1266233962.000000000
 1266227465.000000000          1266233962.000000000
 1266227465.000000000          1266233962.000000000
 1266227465.000000000          1266233962.000000000
 - wait 1 ms
 1266227465.015000000          1266233962.001000000
 - wait 2 ms
 1266227465.031000000          1266233962.003000000
 - wait 3 ms
 1266227465.046000000          1266233962.006000000
 - wait 4 ms
 1266227465.062000000          1266233962.010000000
 - wait 5 ms
 1266227465.078000000          1266233962.015000000
</pre>
<p style="text-align:justify;">A gauche il y a donc les résultats directement depuis Windows XP. A droite c&rsquo;est le même programme mais exécuté à travers Wine (le même PC est utilisé). Les attentes de 1 à 5 ms sont réalisées simplement par la fonction Sleep() également mise à disposition par l&rsquo;API Windows. Il est intéressant de noter que Windows n&rsquo;arrive pas à descendre à la milliseconde avec un Sleep(1). Problème connu ceci dit&#8230;</p>
<p style="text-align:justify;">A noter également que la fonction GetSystemTime() n&rsquo;est pas des plus performante. Elle est reconnue comme étant peu propice à offrir réellement 1 ms de résolution. J&rsquo;ai fais ainsi une seconde mesure avec 10&rsquo;000 lectures du compteur, pour détecter la résolution effective.</p>
<p style="text-align:justify;">Après plus de 8&rsquo;000 lectures, Windows retourne vraiment 15 ms de plus que la lecture précédente.</p>
<pre style="text-align:justify;font-size:medium;"> 1266484241.000000000
 1266484241.000000000
 ... ~8000 fois ...
 1266484241.000000000
 1266484241.000000000
 1266484241.015000000
 1266484241.015000000
 1266484241.015000000
 1266484241.015000000
</pre>
<h4><a href="http://msdn.microsoft.com/en-us/library/ms724397%28VS.85%29.aspx">GetSystemTimeAsFileTime</a></h4>
<p style="text-align:justify;">J&rsquo;ai donc refais les mêmes mesures mais avec GetSystemTimeAsFileTime() pour voir si on arrive à des meilleurs résultats. Le MSDN parle de 100 ns, on peut donc espérer une résolution utilisable à la milliseconde.</p>
<pre style="text-align:justify;font-size:medium;"> WinXP                         GNU/Linux/Wine
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
GetSystemTimeAsFileTime ()
 1266227465.078125000          1266233962.015939000
 1266227465.078125000          1266233962.015941000
 1266227465.078125000          1266233962.015942000
 1266227465.078125000          1266233962.015944000
 1266227465.078125000          1266233962.015945000
 - wait 1 ms
 1266227465.093750000          1266233962.017012000
 - wait 2 ms
 1266227465.109375000          1266233962.019076000
 - wait 3 ms
 1266227465.125000000          1266233962.022139000
 - wait 4 ms
 1266227465.140625000          1266233962.026204000
 - wait 5 ms
 1266227465.156250000          1266233962.031268000</pre>
<p style="text-align:justify;">La première chose qui frappe ici, c&rsquo;est que Windows semble donner que des valeurs multiples de 25. Donc d&rsquo;une résolution de 25 us. On est encore relativement loin des 100 ns promis par le MSDN. Mais pour tester la vrai résolution, j&rsquo;ai également fais tourner la lecture 10&rsquo;000 fois.</p>
<blockquote>
<p style="text-align:justify;">On constate que Wine arrive à atteindre la microseconde. Néanmoins on n&rsquo;a pas non plus la résolution de 100 ns. La raison est que Wine se base sur la fonction gettimeofday() qui sous les systèmes POSIX, ne donne pas une résolution meilleure que la microseconde. La structure est un <em>timeval</em> au lieu d&rsquo;un <em>timespec</em> avec un champ <em>usec</em> au lieu de <em>nsec</em>.</p>
</blockquote>
<p style="text-align:justify;">Ici aussi, après environ 8&rsquo;000 lectures, on constate une résolution d&rsquo;exactement <img src='http://s0.wp.com/latex.php?latex=109.375-93.75%3D15.625%5C%2Cms&amp;bg=ffffff&amp;fg=61636a&amp;s=0' alt='109.375-93.75=15.625&#92;,ms' title='109.375-93.75=15.625&#92;,ms' class='latex' />. C&rsquo;est aussi mauvais qu&rsquo;avant. Les microsecondes n&rsquo;apportent absolument rien. Au début je me suis fais avoir car je pensais vraiment que les 25 us étaient atteints. Et bien que la fonction est sensée être plus rapide d&rsquo;après mes recherches, en pratique (sous Windows XP), il n&rsquo;y a pas de quoi en faire une montagne. Il a fallut presque le même nombre de lecture (un peu plus de 8000) pour environ 15 ms.</p>
<pre style="text-align:justify;font-size:medium;"> 1266484241.093750000
 1266484241.093750000
 ... ~8000 fois ...
 1266484241.093750000
 1266484241.093750000
 1266484241.109375000
 1266484241.109375000
 1266484241.109375000
 1266484241.109375000
</pre>
<p style="text-align:justify;">Je pense qu&rsquo;elle est considérée comme plus rapide car elle ne peuple pas une structure relativement complexe comme GetSystemTime (voir <a href="http://msdn.microsoft.com/en-us/library/ms724950%28VS.85%29.aspx">SYSTEMTIME</a>). La structure utilisée avec la seconde fonction est <a href="http://msdn.microsoft.com/en-us/library/ms724284%28VS.85%29.aspx">FILETIME</a>.</p>
<p style="text-align:justify;">Finalement, comme première conclusion et pour garder la compatibilité avec Windows CE on peut utiliser GetSystemTime() sans regret.</p>
<h4 style="text-align:justify;">clock_gettime</h4>
<p style="text-align:justify;">Il existe donc un moyen d&rsquo;avoir une bien meilleur résolution. Le principe est d&rsquo;utiliser l&rsquo;horloge haute résolution (la TSC dans les processeurs x86) afin d&rsquo;atteindre la nanoseconde. Pour ce faire, Windows met à disposition deux fonctions, QueryPerformanceFrequeny() conjointement avec QueryPerformanceCounter().</p>
<p style="text-align:justify;">Le but final est de simuler la fonction clock_gettime() de POSIX qui permet d&rsquo;atteindre une résolution de 1 ns.</p>
<p style="text-align:justify;">La première fonction donne la fréquence de l&rsquo;horloge haute résolution et la seconde donne le nombre de ticks depuis la mise en route. La fréquence donnée est toujours (à peu de chose près) un multiple de 1193182 Hz.</p>
<p style="text-align:justify;">Le principe est donc de retrouver le tick qui correspond à un temps précis depuis <a href="http://en.wikipedia.org/wiki/Unix_epoch">EPOCH</a>. Puis de retrouver le temps en divisant simplement le nombre de ticks par la fréquence. L&rsquo;horloge étant au minimum cadencée à 1193182 Hz, on devrait avoir au moins une résolution de <img src='http://s0.wp.com/latex.php?latex=%5Cfrac%7B1%7D%7B1193182%7D%3D838.10%5C%2Cns&amp;bg=ffffff&amp;fg=61636a&amp;s=0' alt='&#92;frac{1}{1193182}=838.10&#92;,ns' title='&#92;frac{1}{1193182}=838.10&#92;,ns' class='latex' />.</p>
<pre style="text-align:justify;font-size:medium;"> WinXP                         GNU/Linux/Wine
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Freq: 3579545                 Freq: 1193182
 1266227465.156298915          1266233962.031381633
 1266227465.156301150          1266233962.031384147
 1266227465.156302826          1266233962.031385823
 1266227465.156304502          1266233962.031387499
 1266227465.156306178          1266233962.031389176
 - wait 1 ms
 1266227465.171900059          1266233962.032571728
 - wait 2 ms
 1266227465.187522995          1266233962.034622547
 - wait 3 ms
 1266227465.203157943          1266233962.037689975
 - wait 4 ms
 1266227465.218764954          1266233962.041754736
 - wait 5 ms
 1266227465.234392918          1266233962.046825211
</pre>
<p style="text-align:justify;">A noter que Wine donne toujours la fréquence la plus basse. Cette fréquence normalement dépend du matériel, mais Wine se base sur Linux pour récupérer le temps. Ainsi la fréquence peut être arbitraire. Windows XP me donne par contre une fréquence pas tout à fait correcte. Comme je l&rsquo;ai dis avant, celle-ci devrait être un multiple de 1193182, pourtant pour que ce multiple soit vrai, il faudrait alors 3579546 au lieu de 3579545. Je suppose que la fonction QueryPerformanceFrequeny() n&rsquo;arrondit pas la valeur.</p>
<p style="text-align:justify;">On trouve ici un pas de 1676/1677 ns. Aussi bien avec Windows qu&rsquo;avec Wine. Ce qui est très bon. Le temps perdu vient désormais des appels de fonctions et non plus de l&rsquo;imprécision des valeurs de temps.</p>
<p style="text-align:justify;">On pourrait crier victoire, mais en réalité il y a encore un problème potentiel. L&rsquo;horloge haute résolution est indépendante. Ce qui veut dire qu&rsquo;elle va forcément diverger par rapport à l&rsquo;horloge qui donne le &laquo;&nbsp;vrai&nbsp;&raquo; temps. Ainsi sur une longue période, l&rsquo;erreur entre les deux va s&rsquo;agrandir linéairement.</p>
<blockquote>
<p style="text-align:justify;">Étant donné que la résolution de GetSystemTimeAsFileTime() est trop imprécise pour de courtes mesures, il est nécessaire de faire des mesures sur plusieurs heures pour avoir des résultats significatifs.  Seul la résolution de 15.625 ms peut servir de référence et une telle divergence ne peut pas être détectée sur quelques minutes (à moins que QueryPerformanceCounter() et QueryPerformanceFrequeny() soient complètement faux). Je n&rsquo;ai donc rien à vous montrer au sujet de ce potentiel problème de divergence.</p>
</blockquote>
<h4 style="text-align:justify;">La synchronisation</h4>
<p style="text-align:justify;">Bien que je ne connaisse pas encore la divergence entre les horloges, on peu légitimement se poser la question de la resynchronisation.</p>
<p style="text-align:justify;">Le principe est d&rsquo;utiliser une information qui est fiable. Et donc a priori c&rsquo;est la seconde. L&rsquo;idée est de récupérer le tick qui correspond au changement de seconde. Ensuite ce tick est converti en un temps depuis EPOCH (un temps absolu en seconde). On mémorise cette seconde pour toute la durée de vie du programme.</p>
<p style="text-align:justify;">Dès que clock_gettime() est appelé, on regarde la valeur du compteur de l&rsquo;horloge haute résolution, puis on la soustrait à la valeur qui correspond aux secondes du début. On a donc une différence de valeur du compteur. On la divise par la fréquence du compteur ce qui nous donne la différence de temps. On additionne ce nouveau temps avec les secondes du départ pour enfin avoir le temps en nanoseconde depuis EPOCH.</p>
<p style="text-align:justify;">Le potentiel problème avec la synchronisation vient spécialement du fait d&rsquo;utiliser la seconde comme référence. Si la synchronisation commence au début d&rsquo;une nouvelle seconde, il faut attendre quasiment une seconde pour terminer la synchronisation. Ainsi actuellement dans le libvalhalla pour Windows, il n&rsquo;y a pas de resynchronisation. En fonction du décalage entre l&rsquo;horloge haute résolution et l&rsquo;horloge du temps, les timers finissent par se rentrer dedans ou alors par devenir de plus en plus écartés. Le fait qu&rsquo;ils divergent ou convergent dépend du matériel.</p>
<p style="text-align:justify;">Je vois deux solutions pour le moment.</p>
<ol>
<li style="text-align:justify;">Faire la resynchronisation en parallèle au reste du programme. Ainsi on peut continuer d&rsquo;utiliser clock_gettime() avec la précédente synchronisation.</li>
<li style="text-align:justify;">Synchroniser sur GetSystemTimeAsFileTime() avec son pas de 15.625 ms. Mais la compatibilité avec Windows CE est perdue.</li>
</ol>
<p>Il reste aussi à déterminer quand est-ce qu&rsquo;il faut resynchroniser.</p>
<p style="text-align:justify;">Un autre problème vient des changements de l&rsquo;heure du système. Si cela arrive, actuellement libvalhalla aura toutes les temporisations faussées sous Windows.</p>
<h4>Les Pthreads</h4>
<p style="text-align:justify;">Finalement, on peut se demander si tout cela vaut la peine. Les Pthreads pour Windows ont été conçus pour fonctionner sur un maximum de versions de Windows. Ainsi la référence de temps utilisée se fait via GetSystemTime(). Le clock_gettime() utilisé dans libvalhalla à deux raisons d&rsquo;être. D&rsquo;abord il sert à donner un temps absolu aux fonctions Pthreads, et il sert à faire les mesures de temps pour les statistiques. L&rsquo;aberration dans tout ce travail sur un clock_gettime() pour Windows est simplement que le temps donné aux fonctions Pthreads est de bien meilleur résolution que la résolution du temps interne au Pthreads-win32  (il faudrait néanmoins que je vérifie ce point, je n&rsquo;ai fais que survoler les sources de Pthreads-win32). Et avoir une résolution à la nanoseconde pour des statistiques n&rsquo;apporte rien.</p>
<p style="text-align:justify;">Un des seul intérêt restant c&rsquo;est donc le petit défi que ça représente.</p>
<p style="text-align:justify;">J&rsquo;hésite à enlever tout le code relatif à QueryPerformanceCounter() pour n&rsquo;utiliser que GetSystemTime() avec sa misérable résolution. Ou alors rajouter un test sur la fonction GetSystemTimeAsFileTime() pour la préférer à GetSystemTime() si elle existe. Tout ces problèmes me rappel toujours un peu plus pourquoi Windows à un noyau  qui n&rsquo;a rien de plus que les autres. Mais qui au contraire, ne créer que des problèmes supplémentaires.</p>
<h3 style="text-align:justify;">Speedhack</h3>
<p style="text-align:justify;">Je profite de cet article pour présenter les speedhacks (ces logiciels de triches permettant par exemple de se déplacer plus vite dans un jeu, très prisé à l&rsquo;époque sur Counter-Strike).</p>
<p style="text-align:justify;">Si j&rsquo;en parle ici c&rsquo;est qu&rsquo;ils reposent sur les fonctions de l&rsquo;horloge haute résolution, et plus précisément QueryPerformanceCounter(). Il y a un peu plus d&rsquo;un an, j&rsquo;avais écris un article à ce sujet que vous pouvez lire à <a href="http://www.gamesover.ch/programmation/speedhack.r2.pdf">cette adresse</a>. J&rsquo;en ai profité pour y faire deux trois améliorations et corrections.</p>
<p style="text-align:justify;">A bientôt,</p>
<p style="text-align:justify;padding-left:30px;">Mathieu SCHROETER</p>
<br /> Tagged: <a href='http://skywalker13.wordpress.com/tag/clock_gettime/'>clock_gettime</a>, <a href='http://skywalker13.wordpress.com/tag/enna/'>Enna</a>, <a href='http://skywalker13.wordpress.com/tag/geexbox/'>GeeXboX</a>, <a href='http://skywalker13.wordpress.com/tag/libvalhalla/'>libvalhalla</a>, <a href='http://skywalker13.wordpress.com/tag/linux/'>Linux</a>, <a href='http://skywalker13.wordpress.com/tag/opensource/'>opensource</a>, <a href='http://skywalker13.wordpress.com/tag/posix/'>POSIX</a>, <a href='http://skywalker13.wordpress.com/tag/programmation/'>programmation</a>, <a href='http://skywalker13.wordpress.com/tag/queryperformancecounter/'>QueryPerformanceCounter</a>, <a href='http://skywalker13.wordpress.com/tag/speedhack/'>speedhack</a>, <a href='http://skywalker13.wordpress.com/tag/valhalla/'>Valhalla</a>, <a href='http://skywalker13.wordpress.com/tag/windows/'>Windows</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/skywalker13.wordpress.com/1105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/skywalker13.wordpress.com/1105/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=skywalker13.wordpress.com&#038;blog=4019559&#038;post=1105&#038;subd=skywalker13&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://skywalker13.wordpress.com/2010/02/19/de-posix-a-windows/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4be2af9a8c02ddaa79d2de987ad91c4?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">[GO]Skywalker13</media:title>
		</media:content>
	</item>
		<item>
		<title>Mercurial, depuis fin 2006</title>
		<link>http://skywalker13.wordpress.com/2010/01/10/mercurial-depuis-fin-2006/</link>
		<comments>http://skywalker13.wordpress.com/2010/01/10/mercurial-depuis-fin-2006/#comments</comments>
		<pubDate>Sun, 10 Jan 2010 13:17:31 +0000</pubDate>
		<dc:creator>Mathieu SCHROETER</dc:creator>
				<category><![CDATA[/dev/null]]></category>
		<category><![CDATA[GeeXboX]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[cherry pick]]></category>
		<category><![CDATA[hg]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[mercurial]]></category>
		<category><![CDATA[namedbranches]]></category>
		<category><![CDATA[opensource]]></category>

		<guid isPermaLink="false">http://skywalker13.wordpress.com/2010/01/10/mercurial-depuis-fin-2006/</guid>
		<description><![CDATA[Hello, Cela fait plus de 3 ans qu&#8217;on utilise Mercurial dans les projets GeeXboX (avant on travaillait avec TLA Arch). Néanmoins on a de la peine à se conformer aux nouvelles fonctionnalités. Je souhaite en fait parler des branches. Avec Subversion (par exemple), les branches se présentent sous la forme de répertoires. Ça a le [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=skywalker13.wordpress.com&#038;blog=4019559&#038;post=1047&#038;subd=skywalker13&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Hello,</p>
<p style="text-align:justify;">Cela fait plus de 3 ans qu&rsquo;on utilise <a href="http://mercurial.selenic.com/">Mercurial</a> dans les projets GeeXboX (avant on travaillait avec TLA Arch). Néanmoins on a de la peine à se conformer aux nouvelles fonctionnalités. Je souhaite en fait parler des branches. Avec Subversion (par exemple), les branches se présentent sous la forme de répertoires. Ça a le mérite d&rsquo;être clair mais c&rsquo;est un peu comme collectionner des copies du dépôt principal. Je n&rsquo;ai jamais trop aimé cette approche, car personnellement je trouve ça un peu brouillon (ça n&rsquo;engage que moi).</p>
<p style="text-align:justify;">En parlant de brouillon, je vous invite à consulter cette page <a href="http://hg.geexbox.org">http://hg.geexbox.org</a> qui liste tous les dépôts existants sous GeeXboX. Si vous regardez la colonne &laquo;&nbsp;Last change&nbsp;&raquo;, vous verrez des &laquo;&nbsp;3 years ago&nbsp;&raquo; par exemple. Autant dire que certains dépôts sont complètement obsolètes aujourd&rsquo;hui. Et c&rsquo;est même confus, prenez par exemple &laquo;&nbsp;<a href="http://hg.geexbox.org/geexbox-v2/">geexbox-v2</a>&laquo;&nbsp;. Son nom est devenu absurde avec le temps. Car la dedans vous trouverez nos tentatives foireuses de supporter Freevo ;-). Je vous épargne la description des autres.</p>
<p style="text-align:justify;">Bref, là où je veux en venir c&rsquo;est que pour faire des branches, on s&rsquo;y prend à l&rsquo;ancienne et on clone les dépôts. Je pense donc spécialement à &laquo;&nbsp;<a href="http://hg.geexbox.org/geexbox-1.2/">geexbox-1.2</a>&nbsp;&raquo; qui est de loin pas obsolète, car c&rsquo;est lui qui contient tous les backports (spécialement les corrections de bugs) qui ont permis les versions 1.2.1 à 1.2.4 de GeeXboX. Personnellement il ne me plait pas beaucoup. Toutes les versions 1.2.x devraient être dans le dépôt principal &laquo;&nbsp;<a href="http://hg.geexbox.org/geexbox">geexbox</a>&laquo;&nbsp;.</p>
<p style="text-align:justify;">Ainsi depuis quelques temps je me suis un peu intéressé aux branches Mercurial. Et c&rsquo;est sur ce point que je vais m&rsquo;attarder dans ce billet. Il faut aussi savoir qu&rsquo;en 2006-2007, une fonctionnalité que je vais présenter ici n&rsquo;existait pas encore (en tout cas pas sous la même forme). Il n&rsquo;y a donc pas vraiment de mal d&rsquo;avoir trainé les bonnes vieilles copies de dépôts pour faire des branches&#8230;</p>
<blockquote>
<p style="text-align:justify;">Cet intérêt soudain pour les branches m&rsquo;est venu spécialement depuis les releases de libnfo, libplayer et libvalhalla. Je pense par exemple à avoir des branches pour des éventuels corrections sur les versions 1.0.0. Et surtout, sans faire des copies à l&rsquo;ancienne.</p>
</blockquote>
<h3 style="text-align:justify;">Les branches nommées (NamedBranches)</h3>
<p style="text-align:justify;">Mon but n&rsquo;est pas d&rsquo;écrire un tutoriel sur Mercurial. Je vais ainsi essayer d&rsquo;aller à l&rsquo;essentiel.  Un dépôt peut contenir des &laquo;&nbsp;<a href="http://mercurial.selenic.com/wiki/Head">heads</a>&nbsp;&raquo; et des branches. Plusieurs &laquo;&nbsp;<a href="http://mercurial.selenic.com/wiki/Head">heads</a>&nbsp;&raquo; apparaissent quand on commit des changements par rapport à une révision antérieure au &laquo;&nbsp;<a href="http://mercurial.selenic.com/wiki/Tip">tip</a>&laquo;&nbsp;. Ce qui demande donc de faire un &laquo;&nbsp;<a href="http://mercurial.selenic.com/wiki/Merge">merge</a>&nbsp;&raquo; et de le &laquo;&nbsp;<a href="http://mercurial.selenic.com/wiki/Commit">comitter</a>&laquo;&nbsp;.</p>
<p style="text-align:justify;">Par défaut il y a toujours une branche dans chaque dépôt et elle se nomme &laquo;&nbsp;default&nbsp;&raquo;. Passons directement à la pratique. J&rsquo;aimerais gérer les corrections de bugs pour libplayer-1.0.0. Admettons que je sois à la racine du dépôt, je créer alors une branche &laquo;&nbsp;v1.0&Prime; à partir du tag &laquo;&nbsp;v1.0.0&Prime;.</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
$ hg update v1.0.0
33 files updated, 0 files merged, 7 files removed, 0 files unresolved
$ hg branch v1.0
marked working directory as branch v1.0
</pre>
<p style="text-align:justify;">A priori j&rsquo;ai bien une nouvelle branche. Mais voyons ce que dit `hg branch` et `hg branches`.</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
$ hg branch
v1.0
$ hg branches
default                     1326:cac53e7d727f
</pre>
<p style="text-align:justify;">Du fait que je n&rsquo;ai pas &laquo;&nbsp;commité&nbsp;&raquo; la nouvelle branche, on ne la voit pas dans la liste des branches. Mais la première commande confirme que je suis bien dans la &laquo;&nbsp;v1.0&Prime; fraichement créée. Je vais donc &laquo;&nbsp;commiter&nbsp;&raquo; ce changement localement.</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
$ hg commit -m &quot;new branch v1.0 for bugfix&quot;
created new head
$ hg branches
v1.0                        1327:1c0c025f8a73
default                     1326:cac53e7d727f (inactive)
</pre>
<p>Si on désire passer d&rsquo;une branche à l&rsquo;autre, c&rsquo;est très simple.</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
$ hg update default
40 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg branch
default
$ hg update v1.0
33 files updated, 0 files merged, 7 files removed, 0 files unresolved
$ hg branch
v1.0
</pre>
<p style="text-align:justify;">A noter que s&rsquo;il y avait des changements non &laquo;&nbsp;commités&nbsp;&raquo; dans le dépôt, il ne serait pas possible de passer d&rsquo;une branche à l&rsquo;autre sans qu&rsquo;ils soient tous annulés ou &laquo;&nbsp;commités&nbsp;&raquo;. Mais regardons un peu ce que ça donne avec `hg view`.</p>
<p style="text-align:center;"><a href="http://skywalker13.files.wordpress.com/2010/01/hg-001.png"><img class="size-thumbnail wp-image-1052 alignnone" style="border:0 none;" title="hg.001" src="http://skywalker13.files.wordpress.com/2010/01/hg-001.png?w=200&#038;h=81" alt="" width="200" height="81" /></a> <a href="http://skywalker13.files.wordpress.com/2010/01/hg-002.png"><img class="alignnone size-thumbnail wp-image-1053" style="border:0 none;" title="hg.002" src="http://skywalker13.files.wordpress.com/2010/01/hg-002.png?w=200&#038;h=81" alt="" width="200" height="81" /></a></p>
<p style="text-align:justify;">On voit deux colonnes bien distinctes qui sont rattachées depuis le &laquo;&nbsp;<a href="http://mercurial.selenic.com/wiki/Tag">tag</a>&nbsp;&raquo; v1.0.0. Un petit tour dans `hg heads` nous montre bien qu&rsquo;il y en a deux. Et chacun est sur une branche différente.</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
$ hg heads
changeset:   1327:1c0c025f8a73
branch:      v1.0
tag:         tip
parent:      1230:6b3e2fed5f7a
user:        Mathieu Schroeter &lt;mathieu.schroeter@mycable.ch&gt;
date:        Sun Jan 10 10:26:50 2010 +0100
summary:     new branch v1.0 for bugfix

changeset:   1326:cac53e7d727f
user:        Mathieu Schroeter &lt;mathieu.schroeter@mycable.ch&gt;
date:        Sat Jan 09 20:34:51 2010 +0100
summary:     set winid to 0 by default (fix warning if USE_X11 is not defined)
</pre>
<p style="text-align:justify;">La branche &laquo;&nbsp;default&nbsp;&raquo; n&rsquo;est pas montrée explicitement.</p>
<p style="text-align:justify;">Ce qui m&rsquo;intéresse maintenant c&rsquo;est de gérer les corrections de bugs. Cette branche &laquo;&nbsp;v1.0&Prime; est à considérer pour exister <span style="text-decoration:underline;">aussi longtemps que tout le dépôt</span>.</p>
<h3 style="text-align:justify;">Le &laquo;&nbsp;cherry picking&nbsp;&raquo;</h3>
<p style="text-align:justify;">C&rsquo;est ce qu&rsquo;on appel le &laquo;&nbsp;<a href="http://en.wikipedia.org/wiki/Cherry_picking#Software_configuration_management">cherry picking</a>&nbsp;&raquo; car seulement quelques &laquo;&nbsp;<a href="http://mercurial.selenic.com/wiki/ChangeSet">changesets</a>&nbsp;&raquo; spécifiques m&rsquo;intéressent. Les corrections de bugs sont toutes dans la branche &laquo;&nbsp;default&nbsp;&raquo;. Pour importer ces changements dans le dépôt &laquo;&nbsp;v1.0&Prime; il y a plusieurs manières de faire. Mais personnellement la majorité des solutions que j&rsquo;ai trouvé ne me plaisent pas. Et il y a peu de temps, je suis tombé sur une extension officielle (mais non activée par défaut) qui permet de faire exactement ce genre de traitements (et même plus). Elle s&rsquo;appelle &laquo;&nbsp;<a href="http://mercurial.selenic.com/wiki/TransplantExtension">transplant</a>&nbsp;&raquo; et c&rsquo;est elle que je vais utiliser pour mon exemple.</p>
<p style="text-align:justify;">Il faut commencer par l&rsquo;activer dans le fichier ~/.hgrc:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
[extensions]
transplant=
</pre>
<p style="text-align:justify;">Je vais prendre une partie des corrections intéressantes et les transplanter dans la nouvelle branche.</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
$ hg transplant 1242
application de 95461fb8613f
patching file Makefile
Hunk #1 succeeded at 18 with fuzz 1 (offset -3 lines).
</pre>
<p style="text-align:justify;">Je répète pour chaque &laquo;&nbsp;changeset&nbsp;&raquo;. On peut spécifier plusieurs &laquo;&nbsp;changesets&nbsp;&raquo; en les séparant par &lsquo;:&rsquo; pour une plage REV1:REV4 par exemple. Mais avec le Mercurial d&rsquo;Ubuntu j&rsquo;évite de le faire, simplement parce que l&rsquo;extension me retourne une exception et un joli traceback Python. En prenant un après l&rsquo;autre, aucun problème.</p>
<p style="text-align:center;"><a href="http://skywalker13.files.wordpress.com/2010/01/hg-003.png"><img class="alignnone size-thumbnail wp-image-1054" style="border:0 none;" title="hg.003" src="http://skywalker13.files.wordpress.com/2010/01/hg-003.png?w=300&#038;h=160" alt="" width="300" height="160" /></a></p>
<p style="text-align:justify;">Le &laquo;&nbsp;screenshot&nbsp;&raquo; ci-dessus permet de voir les différents &laquo;&nbsp;changesets&nbsp;&raquo; appliqués sur la branche &laquo;&nbsp;v1.0&Prime;.</p>
<p style="text-align:justify;">Pour continuer à travailler sur la devel (branche &laquo;&nbsp;default&nbsp;&raquo;), rien de plus simple.</p>
<p style="text-align:justify;">
<pre class="brush: plain; gutter: false; title: ; notranslate">
$ hg update default
40 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ vi Makefile
$ hg commit -m &quot;dummy commit&quot;
$ hg heads
changeset:   1335:55589e41d0eb
tag:         tip
parent:      1326:cac53e7d727f
user:        Mathieu Schroeter &lt;mathieu.schroeter@mycable.ch&gt;
date:        Sun Jan 10 13:07:34 2010 +0100
summary:     dummy commit

changeset:   1334:81c124600c6b
branch:      v1.0
user:        Mathieu Schroeter &lt;mathieu.schroeter@mycable.ch&gt;
date:        Sat Jan 09 20:29:01 2010 +0100
summary:     fix 'make dist' in src
</pre>
<p>On voit clairement évoluer le &laquo;&nbsp;tip&nbsp;&raquo; de la branche &laquo;&nbsp;default&nbsp;&raquo; en parallèle à la branche &laquo;&nbsp;v1.0&Prime;.</p>
<p style="text-align:center;"><a href="http://skywalker13.files.wordpress.com/2010/01/hg-004.png"><img class="size-thumbnail wp-image-1075 aligncenter" style="border:0 none;" title="hg.004" src="http://skywalker13.files.wordpress.com/2010/01/hg-004.png?w=300&#038;h=175" alt="" width="300" height="175" /></a></p>
<h3 style="text-align:justify;">Un &laquo;&nbsp;push&nbsp;&raquo; avec plusieurs branches</h3>
<p style="text-align:justify;">Tout ceci n&rsquo;est qu&rsquo;un exemple, ainsi pour montrer le &laquo;&nbsp;<a href="http://mercurial.selenic.com/wiki/Push">push</a>&nbsp;&raquo; je vais utiliser un répertoire local. Admettons que je <a href="http://mercurial.selenic.com/wiki/Clone">clone </a>depuis <a href="http://hg.geexbox.org/libplayer" rel="nofollow">http://hg.geexbox.org/libplayer</a>.</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
$ cd ..
$ hg clone http://hg.geexbox.org/libplayer libplayer-local
requesting all changes
adding changesets
adding manifests
adding file changes
added 1327 changesets with 2268 changes to 111 files
updating working directory
104 files updated, 0 files merged, 0 files removed, 0 files unresolved
</pre>
<p style="text-align:justify;">C&rsquo;est donc le dépôt original où j&rsquo;ai qu&rsquo;une seule branche. Je retourne dans le dépôt qui contient la branche &laquo;&nbsp;v1.0&Prime; et je vais faire un &laquo;&nbsp;push&nbsp;&raquo; sur libplayer-local.</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
$ cd libplayer
$ hg push ../libplayer-local
pushing to ../libplayer-local
searching for changes
abort: push creates new remote branch 'v1.0'!
(did you forget to merge? use push -f to force)
</pre>
<p style="text-align:justify;">Le &laquo;&nbsp;push&nbsp;&raquo; est automatiquement annulé. Ce qui est très bien, ainsi Mercurial nous préviens qu&rsquo;on a créé une nouvelle branche. Il est alors nécessaire de le forcer (la première fois). Mercurial nous demande aussi si on a pas oublié de faire un &laquo;&nbsp;merge&nbsp;&raquo;. C&rsquo;est légitime dans le cas où on ne veut pas avoir deux branches séparées sur le dépôt distant.</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
$ hg push -f ../libplayer-local
pushing to ../libplayer-local
searching for changes
adding changesets
adding manifests
adding file changes
added 9 changesets with 6 changes to 2 files (+1 heads)
</pre>
<p style="text-align:justify;">Mercurial nous confirme qu&rsquo;on a bien ajouté un &laquo;&nbsp;head&nbsp;&raquo;. A partir de ce point je me suis posé la question de ce qui se passe si quelqu&rsquo;un clone ce dépôt avec ces deux &laquo;&nbsp;heads&nbsp;&raquo;. Est-ce qu&rsquo;il va avoir un avertissement s&rsquo;il tente de faire un &laquo;&nbsp;push&nbsp;&raquo;, du genre qu&rsquo;il devrait faire un &laquo;&nbsp;merge&nbsp;&raquo; ou forcer le &laquo;&nbsp;push&nbsp;&raquo;?! Ce serait ennuyeux si c&rsquo;était le cas, car les branches ne devraient pas intervenir. Le &laquo;&nbsp;head&nbsp;&raquo; n&rsquo;étant pas sur la même branche. J&rsquo;ai donc simplement testé pour m&rsquo;en assurer:</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
$ cd ..
$ hg clone libplayer-local libplayer-foobar
updating working directory
104 files updated, 0 files merged, 0 files removed, 0 files unresolved
</pre>
<p style="text-align:justify;">Cette manipulation revient au même que de cloner le dépôt sur hg.geexbox.org si j&rsquo;avais &laquo;&nbsp;pushé&nbsp;&raquo; les modifications. Sans me soucier des branches, je vais faire une modification dans libplayer-foobar, la &laquo;&nbsp;commiter&nbsp;&raquo;, puis faire un &laquo;&nbsp;push&nbsp;&raquo; dans libplayer-local comme si c&rsquo;était hg.geexbox.org/libplayer.</p>
<pre class="brush: plain; gutter: false; title: ; notranslate">
$ cd libplayer-foobar
$ vi Makefile
$ hg commit -m &quot;still a dummy commit&quot;
$ hg push ../libplayer-local
pushing to ../libplayer-local
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
</pre>
<p style="text-align:justify;">Il n&rsquo;y a aucune remarque de Mercurial par rapport aux branches. Cela prouve que tout fonctionne correctement. Honnêtement j&rsquo;avais toujours eu des doutes sur ces fonctionnalités. Au moins maintenant c&rsquo;est clair. Je vais alors retourner dans le dépôt libplayer-local pour vérifier le résultat avec `hg view`.</p>
<p style="text-align:center;"><a href="http://skywalker13.files.wordpress.com/2010/01/hg-005.png"><img class="size-thumbnail wp-image-1080 aligncenter" style="border:0 none;" title="hg.005" src="http://skywalker13.files.wordpress.com/2010/01/hg-005.png?w=300&#038;h=175" alt="" width="300" height="175" /></a></p>
<p style="text-align:justify;">Tout a fonctionné parfaitement..</p>
<h3 style="text-align:justify;">Conclusion</h3>
<p style="text-align:justify;">Maintenant que j&rsquo;en sais suffisamment sur les branches, je pense passer par ce moyen à l&rsquo;avenir. Il pourrait être même judicieux (peut être) de repasser tous les backports de geexbox-1.2 dans le dépôt geexbox. L&rsquo;idée serait de ne jamais écrire de nouveaux patchs dans les dépôts faisant références à des versions antérieures. Mais de toujours faire les modifications dans le &laquo;&nbsp;default&nbsp;&raquo; et uniquement des &laquo;&nbsp;transplant&nbsp;&raquo; dans les autres branches. Je pense par exemple au dossier debian/ dans les dépôts. Afin de garder l&rsquo;historique, une nouvelle release tel que libplayer-1.0.1 par exemple, serait enregistrée dans les changelogs du &laquo;&nbsp;default&nbsp;&raquo;, puis un &laquo;&nbsp;transplant&nbsp;&raquo; mettrait à jour la branche &laquo;&nbsp;v1.0&Prime;.</p>
<p style="text-align:justify;">Il reste une utilisation des branches qui me pose encore un problème. Les cas où l&rsquo;écriture d&rsquo;une fonctionnalité ne devrait pas se faire directement dans le &laquo;&nbsp;default&nbsp;&raquo; car elle introduirait des régressions. Une branche supplémentaire tel que &laquo;&nbsp;experimental&nbsp;&raquo; pourrait faire l&rsquo;affaire. On devrait ensuite faire un &laquo;&nbsp;merge&nbsp;&raquo; de cette branche dans le &laquo;&nbsp;default&nbsp;&raquo;. Ce qui me dérange c&rsquo;est qu&rsquo;on finit par collectionner les branches comme par exemple ici: <a href="http://hg.geexbox.org/enna/">http://hg.geexbox.org/enna/</a>. Il y a &laquo;&nbsp;new_vfs&nbsp;&raquo; et &laquo;&nbsp;new_vfs_system&nbsp;&raquo;. Ces branches n&rsquo;ont plus vraiment de raison d&rsquo;être car elles ont été &laquo;&nbsp;mergées&nbsp;&raquo;. Dans le cas de l&rsquo;exemple présenté au-dessus avec la branche &laquo;&nbsp;v1.0&Prime;, c&rsquo;est parfaitement normal de la garder pour toujours. Je n&rsquo;ai donc pas encore trouvé de solution propre (c&rsquo;est une question de point de vue) pour travailler avec des branches de courtes durées de vie.</p>
<p style="text-align:justify;">Si quelqu&rsquo;un à une idée&#8230;</p>
<p style="text-align:justify;">A bientôt,</p>
<p style="text-align:justify;padding-left:30px;">Mathieu SCHROETER</p>
<br /> Tagged: bug, cherry pick, GeeXboX, hg, Linux, mercurial, namedbranches, opensource <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/skywalker13.wordpress.com/1047/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/skywalker13.wordpress.com/1047/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=skywalker13.wordpress.com&#038;blog=4019559&#038;post=1047&#038;subd=skywalker13&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://skywalker13.wordpress.com/2010/01/10/mercurial-depuis-fin-2006/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/d4be2af9a8c02ddaa79d2de987ad91c4?s=96&#38;d=http%3A%2F%2F1.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96&#38;r=G" medium="image">
			<media:title type="html">[GO]Skywalker13</media:title>
		</media:content>

		<media:content url="http://skywalker13.files.wordpress.com/2010/01/hg-001.png?w=200" medium="image">
			<media:title type="html">hg.001</media:title>
		</media:content>

		<media:content url="http://skywalker13.files.wordpress.com/2010/01/hg-002.png?w=200" medium="image">
			<media:title type="html">hg.002</media:title>
		</media:content>

		<media:content url="http://skywalker13.files.wordpress.com/2010/01/hg-003.png?w=300" medium="image">
			<media:title type="html">hg.003</media:title>
		</media:content>

		<media:content url="http://skywalker13.files.wordpress.com/2010/01/hg-004.png?w=300" medium="image">
			<media:title type="html">hg.004</media:title>
		</media:content>

		<media:content url="http://skywalker13.files.wordpress.com/2010/01/hg-005.png?w=300" medium="image">
			<media:title type="html">hg.005</media:title>
		</media:content>
	</item>
	</channel>
</rss>
