<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>geexbox &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://en.wordpress.com/tag/geexbox/</link>
	<description>Feed of posts on WordPress.com tagged "geexbox"</description>
	<pubDate>Tue, 22 Dec 2009 17:48:32 +0000</pubDate>

	<generator>http://en.wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[Un (tout petit) tour d'horizon]]></title>
<link>http://skywalker13.wordpress.com/2009/11/23/un-tout-petit-tour-dhorizon/</link>
<pubDate>Mon, 23 Nov 2009 15:43:27 +0000</pubDate>
<dc:creator>Mathieu SCHROETER</dc:creator>
<guid>http://skywalker13.wordpress.com/2009/11/23/un-tout-petit-tour-dhorizon/</guid>
<description><![CDATA[Yop, un tout petit tour d&#8217;horizon s&#8217;impose. Le travail sur (et autour de) Enna fait son ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Yop,</p>
<p style="text-align:justify;">un<a href="http://skywalker13.wordpress.com/files/2009/11/valhalla.png"><img class="alignright size-thumbnail wp-image-848" style="border:0 none;margin-right:2px;margin-left:2px;" title="valhalla" src="http://skywalker13.wordpress.com/files/2009/11/valhalla.png?w=150" alt="" width="120" height="63" /></a> tout petit tour d&#8217;horizon s&#8217;impose. Le travail sur (et autour de) Enna fait son petit bonhomme de chemin. Le design était sans cesse modifié mais depuis quelques semaines on a enfin quelque chose de relativement stable. Personnellement je n&#8217;ai pas beaucoup travaillé sur Enna car je continue à me concentrer sur libvalhalla. Il y a encore deux régressions de Enna qui sont dues à l&#8217;utilisation de libvalhalla.</p>
<blockquote>
<p style="text-align:justify;">Je parle de régressions, bien qu&#8217;il n&#8217;y a jamais eu de sortie officielle et stable. Il faut comprendre par là qu&#8217;avec toutes les modifications qui ont été apportées à Enna, de temps en temps des fonctionnalités disparaissent simplement parce qu&#8217;elle devraient être gérées d&#8217;une autre manière.</p>
</blockquote>
<p style="text-align:justify;"><strong>La première régression</strong> que je veux souligner est celle de pouvoir reprendre la lecture d&#8217;un film à l&#8217;endroit où il a été interrompu. Dit comme ça, il n&#8217;y a rien d&#8217;exceptionnel. Mais &#8220;à l&#8217;époque&#8221;, l&#8217;enregistrement se faisait à l&#8217;aide de <a href="http://wiki.enlightenment.org/index.php/Eet">Eet</a> qui était également utilisé pour stocker les méta-données des fichiers audio/vidéos. Depuis l&#8217;arrivée de libvalhalla et donc d&#8217;une base de donnée SQLite, Eet n&#8217;avait plus beaucoup de sens et cette partie a été simplement supprimée d&#8217;Enna. Mais la lib ne permet pas l&#8217;écriture depuis son API publique pour plusieurs raisons. Tout d&#8217;abord Valhalla ce n&#8217;est pas une bibliothèque pour gérer une base de donnée, mais c&#8217;est avant tout un scanner de fichiers, des &#8220;parsers&#8221; et des &#8220;grabbers&#8221;. Les données sont récupérées par elle automatiquement. Il est donc possible de les lire depuis l&#8217;API publique. Lorsque des données doivent être modifiées, elles le sont depuis les fichiers (tags ID3 par exemple), ou alors depuis les site internets qui fournissent des informations (les grabbers, ImDB, Amazon, etc, &#8230;).</p>
<p style="text-align:justify;">Mais pour répondre à certains besoins comme la sauvegarde de la position d&#8217;un film, il est nécessaire de reconsidérer cette question sur libvalhalla. J&#8217;ai donc commencé à travailler sur cet aspect il y a peu de temps. Il y aura ainsi une information qui permettra d&#8217;identifier des données venant de l&#8217;extérieur (parser, grabbers, &#8230;) et des données venant de l&#8217;intérieur. Pour mieux comprendre pourquoi il est nécessaire de faire des séparations, l&#8217;exemple d&#8217;un champ &#8220;playcount&#8221; est bien adapté. Le &#8220;playcount&#8221; (donc le nombre de fois qu&#8217;un fichier est lu), dépend uniquement de l&#8217;utilisateur d&#8217;Enna. Si le fichier en question est modifié (les tags par exemple), ce champ doit rester intacte ce qui n&#8217;est pas possible actuellement.</p>
<p style="text-align:justify;"><strong>La deuxième régression</strong> concerne les &#8220;snapshots&#8221; (ou &#8220;fanarts&#8221;). Ils servent à avoir une image illustrant une video. Par exemple les images suivantes présentent les résultats pour quatre &#8220;trailers&#8221; où des données intéressantes ont pu être récupérées par les &#8220;grabbers&#8221; (j&#8217;ai récupéré les &#8220;trailers&#8221; sur le site d&#8217;Apple, merci au blogger en lien <a href="http://www.hd-trailers.net/blog/how-to-download-hd-trailers-from-apple/">&#60;ici&#62;</a> et <a href="http://www.hd-trailers.net/blog/2009/08/20/direct-download-links-from-apple-are-not-working/">&#60;ici&#62;</a> pour l&#8217;astuce).</p>
<p style="text-align:center;"><a href="http://skywalker13.wordpress.com/files/2009/11/terminator-salvation.jpg"><img class="size-medium wp-image-886 alignnone" style="border:0 none;margin:0;" title="Terminator Salvation" src="http://skywalker13.wordpress.com/files/2009/11/terminator-salvation.jpg?w=300" alt="" width="219" height="123" /></a><a href="http://skywalker13.wordpress.com/files/2009/11/inglourious-basterds.jpg"><img class="size-medium wp-image-884 alignnone" style="border:0 none;margin:0;" title="Inglourious Basterds" src="http://skywalker13.wordpress.com/files/2009/11/inglourious-basterds.jpg?w=300" alt="" width="219" height="123" /></a><a href="http://skywalker13.wordpress.com/files/2009/11/inglourious-basterds.jpg"></a><a href="http://skywalker13.wordpress.com/files/2009/11/silent-hill.jpg"><br />
<img class="size-medium wp-image-885 alignnone" style="border:0 none;margin:0;" title="Silent Hill" src="http://skywalker13.wordpress.com/files/2009/11/silent-hill.jpg?w=300" alt="" width="219" height="123" /></a><a href="http://skywalker13.wordpress.com/files/2009/11/gran-torino.jpg"><img class="size-medium wp-image-889 alignnone" style="border:0 none;margin:0;" title="Gran Torino" src="http://skywalker13.wordpress.com/files/2009/11/gran-torino.jpg?w=300" alt="" width="219" height="123" /></a></p>
<p style="text-align:justify;">Dans tous ces exemples les images de fond ont pu être téléchargées sur le site <a href="http://www.themoviedb.org">TheMovieDB.org</a>. Mais il peut arriver qu&#8217;aucune image ne soient disponibles et donc une alternative est nécessaire. Actuellement il y a une image de fond par défaut pour ces cas de figure, mais le but est de créer un &#8220;snapshot&#8221; directement avec le contenu de la vidéo. Cette fonctionnalité était disponible à l&#8217;époque où libvalhalla n&#8217;existait pas, et libplayer faisait office d&#8217;intermédiaire pour récupérer l&#8217;image à 20% de la vidéo. L&#8217;idée désormais est donc d&#8217;utiliser le &#8220;grabber&#8221; FFmpeg (ajouté il y a peu de temps) pour extraire l&#8217;image. Bien sûr, il ne faut pas l&#8217;extraire dans les cas où TheMovieDB contient déjà un &#8220;snapshot&#8221; de bien meilleur qualité.</p>
<p style="text-align:justify;">Il y bien entendu toujours un panneau d&#8217;informations pour les vidéos. Il va encore probablement subir des modifications, et donc rien de ce qui est montré dans ces &#8220;screenshots&#8221; ne peut être considéré comme définitif.</p>
<p style="text-align:center;"><a href="http://skywalker13.wordpress.com/files/2009/11/silent-hill-panel.jpg"><img class="size-medium wp-image-895 aligncenter" style="border:0 none;margin-top:0;margin-bottom:0;" title="Silent Hill Panel" src="http://skywalker13.wordpress.com/files/2009/11/silent-hill-panel.jpg?w=300" alt="" width="379" height="213" /></a></p>
<h3 style="text-align:justify;">&#8230;</h3>
<p style="text-align:justify;">Il y a encore d&#8217;autres choses qui ont évoluées aussi bien au niveau de l&#8217;audio que de la vidéo, mais mon objectif  pour ce billet est uniquement de parler des deux régressions. Du côté de libvalhalla, les &#8220;grabbers&#8221; tels que Amazon, Allocine et LyricWiki re-fonctionnent normalement (espérons que se sois pour encore longtemps). A part ça, une grande partie des modifications sont internes tel que de l&#8217;optimisation et des corrections de bugs par exemple.</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;">
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Une image pour illustrer libvalhalla]]></title>
<link>http://skywalker13.wordpress.com/2009/11/05/un-logo-pour-illustrer-libvalhalla/</link>
<pubDate>Thu, 05 Nov 2009 22:12:27 +0000</pubDate>
<dc:creator>Mathieu SCHROETER</dc:creator>
<guid>http://skywalker13.wordpress.com/2009/11/05/un-logo-pour-illustrer-libvalhalla/</guid>
<description><![CDATA[Il manquait une illustration pour libvalhalla. C&#8217;est toujours plus sympathique de pouvoir fair]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p style="text-align:center;"><a href="http://skywalker13.wordpress.com/files/2009/11/valhalla.png"><img class="aligncenter size-medium wp-image-848" style="border:0 none;margin-top:20px;margin-bottom:20px;" title="valhalla" src="http://skywalker13.wordpress.com/files/2009/11/valhalla.png?w=300" alt="valhalla" width="300" height="159" /></a></p>
<p style="text-align:justify;">Il manquait une illustration pour libvalhalla. C&#8217;est toujours plus sympathique de pouvoir faire référence à une bibliothèque par l&#8217;intermédiaire d&#8217;images. Ce n&#8217;est pas non plus pour rien que je lui ai donné ce nom. Contrairement à celle que j&#8217;avais fais pour libplayer, cette fois j&#8217;ai choisi un style un peu plus classique et complètement monochrome.</p>
<p style="text-align:justify;">Les personnages représentent des Valkyries à la recherche de vos fichiers multimédias perdus dans les champs de batailles de vos disques durs.</p>
<blockquote>
<p style="text-align:justify;">C&#8217;est sûrement le billet le plus court que je n&#8217;ai jamais publié <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> .</p>
</blockquote>
<p style="text-align:justify;">A bientôt,</p>
<p style="text-align:justify;padding-left:30px;">Mathieu SCHROETER</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Force-stop, on demand, events, ...]]></title>
<link>http://skywalker13.wordpress.com/2009/10/11/force-stop-on-demand-events/</link>
<pubDate>Sun, 11 Oct 2009 16:17:09 +0000</pubDate>
<dc:creator>Mathieu SCHROETER</dc:creator>
<guid>http://skywalker13.wordpress.com/2009/10/11/force-stop-on-demand-events/</guid>
<description><![CDATA[Hello, avec les projets GeeXboX parfois j&#8217;ai l&#8217;impression de ne jamais arriver au bout. ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Hello,</p>
<p style="text-align:justify;">avec les projets GeeXboX parfois j&#8217;ai l&#8217;impression de ne jamais arriver au bout. Quand quelque chose se termine, il y a toujours autre chose à faire. On ne risque pas de s&#8217;ennuyer. Mais il arrive qu&#8217;on fasse les choses à double, triple ou pire. Tout ça pour dire que les fonctionnalités présentées dans le billet précédent (&#8220;force-stop&#8221;, &#8220;on demand&#8221; et &#8220;events&#8221;) sont implémentées.</p>
<blockquote>
<p style="text-align:justify;">Je vous invite à lire <a href="http://skywalker13.wordpress.com/2009/08/23/avancement-des-grabbers/">l&#8217;article à ce lien</a> si vous ne comprenez pas de quoi je parle; reste aussi à être intéressé par ce genre d&#8217;article <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
</blockquote>
<h3 style="text-align:justify;">En quelques phrases</h3>
<h4>force-stop</h4>
<p style="text-align:justify;">Je ne vais pas revenir sur les détails. La réalisation du &#8220;force-stop&#8221; a introduit de nouvelles tables dans la base de donnée. Une table pour sauvegarder les &#8220;grabbers&#8221; et une table pour sauvegarder les contextes du &#8220;downloader&#8221;. En résumé, lorsqu&#8217;un fichier a été traité par un &#8220;grabber&#8221; et que les données ont été sauvegardées, la relation avec ce &#8220;grabber&#8221; est également introduite dans la base de donnée. Ça évite ainsi au prochain démarrage de &#8220;regrabber&#8221; les même données. Pour le &#8220;downloader&#8221; l&#8217;idée est un tout petit peu différente. Lorsque Valhalla se termine, il sauvegarde toutes les listes de fichiers à télécharger dans la base de donnée. Au prochain démarrage, quand le scanner tombe sur un fichier où il y avait encore des données à télécharger, il réintroduit les listes dans les structures.</p>
<h4 style="text-align:justify;">ondemand</h4>
<p style="text-align:justify;">Pour le &#8220;ondemand&#8221; le travail s&#8217;est montré un peu plus compliqué que je le pensais. Étant donné que le &#8220;ondemand&#8221; peut se passer à n&#8217;importe quel moment il y a de nombreux cas à considérer. Par exemple, vous faites une requête &#8220;ondemand&#8221;, le fichier de la requête n&#8217;a pas été vu par le scanner. Le &#8220;ondemand&#8221; se met en branle et ce fichier se retrouve dans le mécanisme, puis le scanner voit le fichier et l&#8217;introduit presque en même temps dans le mécanisme. Du coup vous vous trouvez avec deux paquets différents pour un même fichier. Il y a ainsi deux-trois astuces pour gérer ce cas de figure ainsi que beaucoup d&#8217;autres (je vous épargne le plus tordu sur lequel je suis tombé). Aucune nouvelle table a été introduite pour cette fonctionnalité, uniquement un nouveau champ dans la table des fichiers, pour savoir si le fichier existe dans les chemins du scanner, ou pas.<br />
Grosso modo le &#8220;ondemand&#8221; se passe ainsi: pause de tous les threads en aval au scanner (donc depuis le DBManager); il attend que tout le monde s&#8217;en dort; il cherche dans les queues si le fichier à traiter existe déjà; en fonction de ça il créer un nouveau ou il modifie l&#8217;existant; puis il réveille tout le monde. Les paquets &#8220;ondemand&#8221; ont également une haute priorité et sont donc traités le plus rapidement possible par les différents threads de Valhalla.</p>
<h4 style="text-align:justify;">events</h4>
<p style="text-align:justify;">Concernant les événements, il y a simplement des retours au &#8220;front-end&#8221; pour lui signaler quelle étapes ont été réalisées, via un <a href="http://fr.wikipedia.org/wiki/Fonction_de_rappel">callback</a>. Les événements sont possibles uniquement avec les requêtes &#8220;ondemand&#8221;.</p>
<h3 style="text-align:justify;">L&#8217;architecture</h3>
<h3 style="text-align:justify;"><a href="http://skywalker13.wordpress.com/files/2009/10/valhalla-internals.png"><img class="aligncenter size-full wp-image-825" style="border:0 none;" title="valhalla-internals" src="http://skywalker13.wordpress.com/files/2009/10/valhalla-internals.png" alt="valhalla-internals" width="450" height="225" /></a></h3>
<p style="text-align:justify;">Deux threads ont donc fait leur apparition (en rose pâle). L&#8217;architecture n&#8217;a donc pas été modifiée, mais étendue. Au lieu de n&#8217;avoir que le scanner comme intervenant pour l&#8217;ajout de fichiers, il y a donc le &#8220;ondemand&#8221; en parallèle. Les événements sont traités exclusivement par le DBManager.</p>
<p style="text-align:justify;">Comme toujours, ces diagrammes sont un peu simplifiés. Par exemple, les commandes &#8220;ondemand&#8221; ne sont pas bloquantes. Et donc en réalité il y a une queue devant la flèche entrante du &#8220;front-end&#8221;. Mais ça n&#8217;apportait rien d&#8217;intéressant à la lecture de ce diagramme. Il suffit de lire la documentation Doxygen pour connaître ce genre de précision quant a l&#8217;utilisation des fonctions publiques.</p>
<h3 style="text-align:justify;">La base de donnée</h3>
<p style="text-align:justify;"><a href="http://skywalker13.wordpress.com/files/2009/10/valhalla-db.png"><img class="aligncenter size-full wp-image-826" style="border:0 none;" title="valhalla-db" src="http://skywalker13.wordpress.com/files/2009/10/valhalla-db.png" alt="valhalla-db" width="450" height="472" /></a></p>
<p style="text-align:justify;">Les modifications sur la base de donnée concernent les tables <em>grabber</em>, <em>dlcontext</em>, <em>file</em> ainsi que la table d&#8217;allocation pour les relations (n,n) avec les &#8220;grabbers&#8221;. Les champs <em>interrupted__</em> et <em>outofpath__</em> ont intégrés la table <em>file</em>. Notez bien que les champs terminés par __ sont utilisés uniquement comme données internes pour le bon fonctionnement de Valhalla.</p>
<h3 style="text-align:justify;">Mais encore &#8230;</h3>
<p style="text-align:justify;">Comme je le disais au début, on aime faire du travail à double et même à triple. Écrire des &#8220;grabbers&#8221; dans Enna pour ensuite les porter dans Valhalla. Et le meilleur c&#8217;est quand le fournisseur d&#8217;un service utilisé par un &#8220;grabber&#8221; aime se foutre du monde. Amazon par exemple, un jour il décide de dire que toutes les requêtes pour le service doivent être signées <a href="http://fr.wikipedia.org/wiki/HMAC">HMAC-SHA256</a> (c&#8217;est limite ridicule mais ça n&#8217;engage que moi). Ou alors la <a href="http://fr.wikipedia.org/wiki/MPAA">MPAA</a>/<a href="http://fr.wikipedia.org/wiki/RIAA">RIAA</a> qui aime emmerder les petits (et dire qu&#8217;ils sont payés pour ça) et qui empêche ainsi Lyricwiki de fournir une WebAPI pour les paroles des chansons. Du coup deux &#8220;grabbers&#8221; cassés, le &#8220;grabber&#8221; Lyricwiki qui a été fixé d&#8217;une autre manière mais qui s&#8217;est vu à nouveau être inutilisable (je crois, je ne m&#8217;en suis pas occupé).</p>
<p style="text-align:justify;">En ce qui concerne Amazon c&#8217;est pas une grosse affaire mais j&#8217;ai la flemme. C&#8217;est fatiguant de devoir toujours revenir sur ce qui a déjà été fait, encore et encore. Imaginez le jour où il y a une release. Vous aurez deux-trois &#8220;grabbers&#8221; de morts en à peine quelques semaines.</p>
<p style="text-align:justify;">Finalement avant de fixer des &#8220;grabbers&#8221; mieux vaut attendre le dernier moment.</p>
<h4 style="text-align:justify;">Mais encore &#8230;, &#8230;</h4>
<p style="text-align:justify;">Il manque (et oui) des moyens depuis l&#8217;API publique pour modifier des méta-données; un exemple: le &#8220;play-count&#8221;. Vous pouvez imaginez d&#8217;autres types de champs dans cette idée. mais qui dit modifier les données dit aussi de considérer deux cas de figure:</p>
<ol>
<li>Modifier uniquement dans la base de donnée</li>
<li>Modifier également dans le fichier en question (avec FFmpeg)</li>
</ol>
<p>Selon les méta-données et le type de fichier, seul le cas (1.) est envisageable. Mais pour par exemple un OGG et l&#8217;artiste, il peut être bien de pouvoir directement l&#8217;écrire dans le fichier. Tout ceci reste encore sujet à réflexion.</p>
<p>A bientôt,</p>
<p style="padding-left:30px;">Mathieu SCHROETER</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Making a Multi Booting CD DVD USB]]></title>
<link>http://phoxis.wordpress.com/2009/09/01/multi_boot_cddvdusb/</link>
<pubDate>Tue, 01 Sep 2009 07:30:16 +0000</pubDate>
<dc:creator>phoxis</dc:creator>
<guid>http://phoxis.wordpress.com/2009/09/01/multi_boot_cddvdusb/</guid>
<description><![CDATA[Introduction Everybody likes to use, test and hack with the mini distros, but no one likes to burn a]]></description>
<content:encoded><![CDATA[Introduction Everybody likes to use, test and hack with the mini distros, but no one likes to burn a]]></content:encoded>
</item>
<item>
<title><![CDATA[[IT] Io &amp; il mio Asus eeePC 701 4G Nero (netbook) / Episodio 9: la guida completa per usare le schede SD/SDHC come "cartucce" ed avere a disposizione infinite distribuzioni Linux sul nostro netbook]]></title>
<link>http://eldino.wordpress.com/2009/07/28/it-io-il-mio-asus-eeepc-701-4g-nero-netbook-episodio-9-la-guida-completa-per-usare-le-schede-sdsdhc-come-cartuccie-ed-avere-a-disposizione-infinite-distribuzioni-linux-sul-nostro-net/</link>
<pubDate>Tue, 28 Jul 2009 00:00:05 +0000</pubDate>
<dc:creator>eldino</dc:creator>
<guid>http://eldino.wordpress.com/2009/07/28/it-io-il-mio-asus-eeepc-701-4g-nero-netbook-episodio-9-la-guida-completa-per-usare-le-schede-sdsdhc-come-cartuccie-ed-avere-a-disposizione-infinite-distribuzioni-linux-sul-nostro-net/</guid>
<description><![CDATA[Obiettivo della guida Mantenere Windows XP SP3 (o altro sistema operativo principale) sull&#8217;SSD]]></description>
<content:encoded><![CDATA[Obiettivo della guida Mantenere Windows XP SP3 (o altro sistema operativo principale) sull&#8217;SSD]]></content:encoded>
</item>
<item>
<title><![CDATA[Un bug particulier avec Enna/libplayer]]></title>
<link>http://skywalker13.wordpress.com/2009/07/17/un-bug-particulier-avec-ennalibplayer/</link>
<pubDate>Fri, 17 Jul 2009 10:59:02 +0000</pubDate>
<dc:creator>Mathieu SCHROETER</dc:creator>
<guid>http://skywalker13.wordpress.com/2009/07/17/un-bug-particulier-avec-ennalibplayer/</guid>
<description><![CDATA[Hello, comme je l&#8217;ai plus d&#8217;une fois expliqué, la vidéo sous Enna passe par libplayer. E]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Hello,</p>
<p style="text-align:justify;">comme je l&#8217;ai plus d&#8217;une fois expliqué, la vidéo sous <em>Enna</em> passe par <em>libplayer</em>. Et depuis quelque temps, Ben et Nico m&#8217;ont à nouveau sensibilisé sur un problème d&#8217;aspect avec les vidéos.<br />
Le plus simple des aspects correspond à une stupide fraction:</p>
<p style="text-align:center;"><code style="border:0;background-color:transparent;"><img src='http://l.wordpress.com/latex.php?latex=%5Ctextbf%7Baspect%7D%3D%5Cfrac%7B%5Ctextbf%7Blargeur%7D%7D%7B%5Ctextbf%7Bhauteur%7D%7D&#038;bg=ffffff&#038;fg=000000&#038;s=0' alt='\textbf{aspect}=\frac{\textbf{largeur}}{\textbf{hauteur}}' title='\textbf{aspect}=\frac{\textbf{largeur}}{\textbf{hauteur}}' class='latex' /></code></p>
<p style="text-align:justify;">Mais celle-ci <span style="text-decoration:underline;">n&#8217;est pas toujours vraie</span>, ainsi l&#8217;aspect peut être directement enregistré en tant que propriété dans le fichier vidéo. Un exemple courant étant les films DVD. La définition de l&#8217;image est de 720&#215;576 (PAL) néanmoins l&#8217;aspect peut être du 4:3, 16:9 ou du cinémascope 2.39:1. Pourtant l&#8217;image est toujours enregistrée afin d&#8217;utiliser un maximum de surface et donc les pixels ne sont pas carrés. Considérer le pixel carré est le dernier recours au cas où la vidéo ne donnerait aucune information sur son aspect.</p>
<h3 style="text-align:justify;">Le bug&#8230;</h3>
<p style="text-align:justify;"><img class="alignright size-full wp-image-691" style="border:0 none;margin-right:5px;margin-left:5px;" title="Enna" src="http://skywalker13.wordpress.com/files/2009/07/icon_enna_64.png" alt="Enna" width="64" height="64" />Le problème rencontré part Ben et Nico n&#8217;était pas reproductible chez moi. Et étant principalement responsable de <em>libplayer</em> depuis toutes les modifications que j&#8217;ai apporté, et donc connaissant de fond en comble sa structure et son fonctionnement actuel, il est forcément de mon devoir que de corriger les problèmes connus.<br />
Quand ils utilisaient <em>libplayer</em> avec <em>Enna</em>, ils avaient certaines vidéos qui s&#8217;affichaient avec un aspect de 1.00. Ce qui engendre donc une image parfaitement carrée. S&#8217;ils testaient cette même vidéo avec le logiciel <em>test-player</em> qui utilise <em>libplayer</em>, l&#8217;aspect était correcte. Là où ça devenait encore plus étrange, c&#8217;est quand j&#8217;ai testé la même vidéo que Nico et j&#8217;avais un aspect correct aussi bien sous <em>Enna</em> que sous <em>test-player</em>. Je ne savais donc pas comment reproduire le bug, même que j&#8217;avais de plus en plus de doute sur l&#8217;existence de ce bug. Non pas que je n&#8217;ai pas confiance en leurs manipulations (surtout qu&#8217;ils sont deux à être victime de ce problème) mais plutôt que je fais toujours une grande quantité de testes lorsque j&#8217;ajoute ou modifie des fonctionnalités dans la bibliothèque. Les problèmes d&#8217;aspect je les ai particulièrement travaillé quand j&#8217;ai rajouté le support de la navigation DVD pour les wrappers <em>MPlayer</em> et <em>xine</em>. Car il y a des conversions de coordonnées à effectuer pour que la souris agissent au bon endroit sur la surface de l&#8217;image et cela en tenant compte de l&#8217;aspect et des offsets en x et y.</p>
<p style="text-align:justify;">Nico m&#8217;a alors transmis les logs <em>Enna</em> lorsque le problème survient et j&#8217;ai pu identifier le problème indirectement. <em>libplayer</em> écrit dans ses logs certaines informations sur les modifications qu&#8217;il effectue sur la fenêtre vidéo. Il apparait que la ligne qui indique l&#8217;aspect de l&#8217;image utilisait une virgule pour séparer les décimales. Sur mon ordinateur cette même ligne ne s&#8217;écrit pas avec une virgule, mais avec un point.</p>
<h3 style="text-align:justify;">Un problème de <a href="http://en.wikipedia.org/wiki/Locale">LOCALE</a></h3>
<p style="text-align:justify;"><em>libplayer</em> utilise abondamment la fonction atof() pour la conversion des valeurs réelles transmissent par <em>MPlayer</em>. Une de ces valeurs est l&#8217;aspect. <em>MPlayer</em> retourne la valeur dans un champ ID_VIDEO_ASPECT=1.85 par exemple. Et ce champ a toujours un point comme délimiteur dans le cas d&#8217;un <em>MPlayer</em> utilisé avec <em>libplayer</em> (<em>MPlayer</em> doit toujours être en anglais). Là où ça devient un problème c&#8217;est le comportement de la fonction atof(). En fonction de la LOCALE du système, elle considère que le délimiteur est une virgule et non un point. De ce fait, (et surtout parce que la fonction atof() ne peut pas échouer) l&#8217;aspect lu n&#8217;était pas 1.85, mais 1. atof() ignorait tous les caractères depuis le point.</p>
<p style="text-align:justify;">Bien qu&#8217;étant de langue francophone, en Suisse-Romande nous n&#8217;avons pas du tout la même LOCALE que la France. Notre clavier est également différent (disposition QWERTZ). Nous utilisons le point comme séparateur de décimale et non la virgule et la LOCALE est &#8220;fr_CH&#8221;. En France, la LOCALE est &#8220;fr_FR&#8221; et le séparateur de décimale est une virgule. Ceci explique pourquoi je ne pouvais pas reproduire l&#8217;erreur. Qui pense aux LOCALEs quand il y a un bug sur l&#8217;aspect des vidéos? Et bien je tâcherais d&#8217;y penser à partir de maintenant.<br />
Quoi qu&#8217;il en soit, de nombreux français devaient avoir des problème, mais je n&#8217;ai pas eu d&#8217;autres retours que les autres développeurs. Je suppose que les éventuels utilisateurs d&#8217;<em>Enna</em> se sont dit qu&#8217;étant donné qu&#8217;aucune version stable existe, ça finirait par être fixé pour la finale? Sachez qu&#8217;il y a un site où vous pouvez rapporter les problèmes: <a href="http://enna.geexbox.org">enna.geexbox.org</a>, vérifiez si le bug est déjà listé et dans le cas contraire n&#8217;hésitez pas à vous inscrire et à soumettre un rapport de bug.</p>
<h3 style="text-align:justify;">Correction</h3>
<p style="text-align:justify;">Pour y remédier il suffit donc de changer de LOCALE avec <em>libplayer</em>. Mais il n&#8217;y a pas de raison apparente de changer la LOCALE pour toute la bibliothèque. Ainsi il suffit de réécrire une fonction atof() qui s&#8217;exécute dans une autre LOCALE. En principe un programme utilise la LOCALE &#8220;C&#8221;. Qui est celle par défaut. <em>Enna</em> étant internationalisé, la LOCALE change selon la langue. Ceci explique donc pourquoi le bug apparaissait sous <em>Enna</em> mais pas sous <em>test-player</em>.</p>
<p style="text-align:justify;">En principe, la LOCALE se change avec la fonction setlocale(). Mais avant de dire youpie il faut garder à l&#8217;esprit que <em>libplayer </em>utilise abondamment les threads. Lorsque la fonction atof() est appelée, <em>Enna</em> peut être en train de faire autre chose. Et cet autre chose peut très bien être influencé par la LOCALE en cours. Le fait d&#8217;utiliser la fonction setlocale() modifie la LOCALE pour tout le processus.<br />
Il est donc nécessaire d&#8217;avoir recours à une fonction qui ne modifie la LOCALE que sur le thread où atof() est exécuté. Cette fonction s&#8217;appelle uselocale(), le nouveau atof() se présente donc ainsi (<a href="http://hg.geexbox.org/libplayer/rev/398947e251f0">patch libplayer</a>):</p>
<pre class="brush: cpp;">
#define _GNU_SOURCE
#include &#60;locale.h&#62;
#include &#60;stdlib.h&#62;

double
my_atof (const char *nptr)
{
  double res;
  locale_t new_locale, prev_locale;

  new_locale = newlocale (LC_NUMERIC_MASK, &#34;C&#34;, NULL);
  prev_locale = uselocale (new_locale);
  res = atof (nptr);
  uselocale (prev_locale);
  freelocale (new_locale);

  return res;
}
</pre>
<p>Afin de simplifier la fonction et d&#8217;éviter atof() qui a une réputation d&#8217;obsolescence je l&#8217;ai remplacé par strtod_l(). Du même coup il est possible d&#8217;éliminer uselocale() et donc de ne plus changer la LOCALE du thread.</p>
<pre class="brush: cpp;">
#define _GNU_SOURCE
#include &#60;locale.h&#62;
#include &#60;stdlib.h&#62;

double
my_atof (const char *nptr)
{
  double res;
  locale_t new_locale;

  new_locale = newlocale (LC_NUMERIC_MASK, &#34;C&#34;, NULL);
  res = strtod_l (nptr, NULL, new_locale);
  freelocale (new_locale);

  return res;
}
</pre>
<blockquote><p>On notera que strtod() peut retourner HUGE_VAL contrairement à atof().</p></blockquote>
<p>A bientôt,</p>
<p style="padding-left:30px;">Mathieu SCHROETER</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[GeexBox]]></title>
<link>http://rosaindonesia.wordpress.com/2009/06/09/geexbox/</link>
<pubDate>Tue, 09 Jun 2009 03:03:00 +0000</pubDate>
<dc:creator>rosa lina</dc:creator>
<guid>http://rosaindonesia.wordpress.com/2009/06/09/geexbox/</guid>
<description><![CDATA[Geexbox merupakan sebuah perangkat multimedia dan ga cuma itu geexbox ini juga adalah sebuah distro ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p style="text-align:justify;">Geexbox merupakan sebuah perangkat multimedia dan ga cuma itu geexbox ini juga adalah sebuah distro dengan sistem operasi linux lengkap dengan berbagai utilitas termasuk utilitas jaringannya.</p>
<p style="text-align:justify;">Untuk menjalankan geexbox, kita ga perlu harddisk, cukup CDROM atau USB stick. Nah, karena geexbox ini dilisensikan open source so setiap orang bebas untk mengubah dan membangun versinya sendiri.</p>
<p>Konfigurasi minimal yang dibutuhkan untuk menjalankan geexbox:</p>
<ul>
<li>CPU minimal Pentium</li>
<li>Graphic Card yang kompatibel dengan standar VESA 2.0. Sebagian besar graphic card keknya dah memenuhi standar ini</li>
<li>Kartu suara (sound card) yang kompatible sama ALSA</li>
<li>RAM paling dikit 64 MB</li>
<li>CD-ROM atw DVDROM</li>
<li>Motherboard yang bisa memboot dari CDROM ^_^</li>
<li>Lengkapnya bisa diliat aja sendiri di http://www.lirc.org</li>
</ul>
<p style="text-align:justify;">Klw pingin&#8230; sekali lagi klo pingin mengubah, mengkompilasi atau melakukan kustomisasi untuk membuat geexbox itu sendiri, maka beberapa perangkat lunak berikut dibutuhkan:</p>
<ul>
<li>gcc : the GNU compiler collection, digunakan untuk mengembangkan projek secara keseluruhan. avoid to use GCC 2.96 karena ga kompatibel untuk mengkompilasi mplayer</li>
<li>make: GNU make, program untuk menentukan bagian mana dari program besar yang harus di kompilasi dan perintah apa yang diberikan utnuk melakukan kompilasi ulang bila perlu.</li>
<li>patch: digunakan untuk menambah (patch) beberapa paket untuk menyesuaikan agar sesuai denagn lingkungan geexbox dan menambah beberapa fitur.</li>
<li>wget: buat ngedonlot berkas dari web</li>
<li>nasm: program assembler gitu, digunakan untuk melakukan kompilasi uClibc di geexbox</li>
<li>dosfstools: untuk membuat dan menguji file dalam format FAT MS-DOS</li>
<li>mkisofs: membuat image file untuk CDROM sesuai dengan format CDROM ISO-9660</li>
<li>mkzftree: membuat iso image yang terkompress</li>
<li>cdrecord: merekam atau membakar CD</li>
</ul>
<p>GeexBox bisa di download di <a href="http://www.geexbox.org/en/downloads.html">sini<br />
</a></p>
<p style="text-align:justify;">Klo geexboxnya dah di bakar maka untuk menjalankan geexbox tidaklah sulit, langkah pertama, aturlah BIOS sehingga memboot dari CDROM. Habis tu masukin deh CDnya.</p>
<p>klo udah, maka boot prompt si geexbox akan muncul. Akan muncul 3 pilihan: Install, Debug, dan defaultnya Menjalankan.</p>
<p>Setelah itu, akan muncul layar yang menunjukan proses boot dari Geexbox, tunggu aja sampe batang penunjuk kemajuan proses penuh atau berada di kanan.</p>
<p style="text-align:center;"><img class="size-medium wp-image-253 aligncenter" title="gx-boot-full-omc" src="http://rosaindonesia.wordpress.com/files/2009/06/gx-boot-full-omc.jpeg?w=300" alt="gx-boot-full-omc" width="300" height="225" /></p>
<p style="text-align:justify;">Geexbox sangat mudah untuk dioperasikan melalui menu yang dapat dipilih dengan menggunakan tombol naik dan turun untuk memilih menu, sedangkan untuk memilih submenu bisa pake tombol panah kanan dan tombol panah kiri untuk kembali ke menu sebelumnya.</p>
<ul>
<li><img class="alignright size-medium wp-image-258" title="gx-menu-aqua-full" src="http://rosaindonesia.wordpress.com/files/2009/06/gx-menu-aqua-full.jpeg?w=300" alt="gx-menu-aqua-full" width="300" height="225" />Open
<ul>
<li>open file -&#62; menjalankan berkas multimedia (audio atau video)</li>
<li>open playlist -&#62; menjalankan daftar lagu (playlist) yang kompatibel denagn MPlayer</li>
<li>play DVD -&#62; menjalankan bagian pertama DVD dan judul</li>
<li>Play VCD -&#62; memainkan super VCD atau VCD track eprtama</li>
<li>play Audio CD -&#62; memainkan Cd audio</li>
</ul>
</li>
<li>Controls
<ul>
<li>Pause -&#62; menghentikan sementara atau melanjutkan kembali (resume)</li>
<li>Stop -&#62; menghentikan</li>
<li>Eject -&#62; Mengeluarkan cd dari drive</li>
<li>Chapter selection -&#62; memilih bagian DVD</li>
<li>Prev/Next -&#62; melompat ke bagian berikutnya (next) atau sebelumnya (prev)</li>
<li>Jump to -&#62; melompat ke trak vcd lain, atau kebagian dvd lain</li>
</ul>
</li>
<li>Options
<ul>
<li> Aspect -&#62; menentukan ratio gambar, dengan pilihan
<ul>
<li>Original -&#62; mereset ratio gambar ke nilai asli</li>
<li>4:3 -&#62; mengganti ratio tinggi/lebar gambar ke 4:3</li>
<li>16:9 -&#62; mengganti ratio tinggi/lebar gambar ke 16:9 -&#62; untuk widescreen pake yang ini jd ga ada garis item di pinggir kiri dan kanan</li>
<li>Cinemascope -&#62; mengganti ratio gambar ke 2:35</li>
</ul>
</li>
<li>Audio Channel -&#62; mengganti audio channel (bahasa indonesianya apa sih???)</li>
<li>Subtitle selection -&#62; mengganti pilihan teks terjemahan</li>
<li>Switch TV-out -&#62; mengganti tampilan dari monitor ke TV-out</li>
<li>switch vertical sync -&#62; on/off sinkronisasi vertikal</li>
<li>Help -&#62; menampilkan keterangan bantu via On Screen Display</li>
<li>Quit -&#62; menghentikan geexbox DAN mematikan kompie</li>
</ul>
</li>
</ul>
<p style="text-align:justify;">Geexbox merupakan distro yang tergolong liveCD, which means suatu sistem linux yang dapat dijalankan langsung dari CDROM tanpa perlu diinstal ke harddisk terlebih dahulu. However, geexbox bisa juga diinstall di media lain, sehingga dengan mudah dapat diinstall di harddisk. Geexbox juga bisa diinstall di harddisk dengan partisi tersendiri, juga dapat diinstall di partisi kosong yang butuhkan hanyalah partisi dengna ukuran 8MB tapi klw mw nambah codec lainnya mendingan 16MB deh&#8230; ^_^</p>
<p style="text-align:justify;">Jika geexbox nya sering dipake, maka akan sangat memudahkan bila diinstal di harddisk. cara nginstallnya ada 2:</p>
<ul>
<li>dari sistem GNU/linux yang ada di kompie</li>
<li>ketika memboot geexbox melalui CDROM</li>
</ul>
<p style="text-align:justify;">langkah ke2 lebih mudah buat yang kurang menguasai command2 yang ada di linux. Caranya adalaaaaaaaaaaahh:</p>
<p>pada waktu prompt isolinux awal sebelum booting ketik install</p>
<blockquote><p>boot: install</p></blockquote>
<p>geexbox akan mulai dijalankan. Pertama kali akan mendeteksi hardware secara otomatis, kemudian menentukan harddisk mana yang mau di instalin geexbox. Program Geexbox akan mendeteksi secara otomatis harddisk yang ada dan menampilkannya, ikutin aja instruksinya trs pilih harddisk mana yang mw diinstall..</p>
<p style="text-align:justify;">setelah menentukan harddisk yang mana, maka program penginstal geexbox akan melakukan pekerjaan pembuatan partisi. Gunakan tanda panah untuk memilih partisi yang masih kosong, dan tekan tombol NEW, tentukan ukuran yang diperluin, yaaa 10 MB lah dah cukup bwt nginstall geexbox.</p>
<p style="text-align:justify;">lalu&#8230; pilih jenis partisi yang ingin digunakan. File sistem yang didukung adalah FAT 16/32 dan EXT 2/3. Pilih type 0B utnuk FAT 32 (disarankan bila ingin melihat adan mengedit dari MS Windows) atau type 83 untuk EXT (Linux). Selesaikan dengan menekan finish, lalu write dan finish.</p>
<p style="text-align:justify;">Setelah itu, tentuin deh apakah partisi tersebut bootable apa engga, caranya dengan memilih flag bootable.</p>
<p style="text-align:justify;">Habis itu, pilih jenis partisi yang dibuat, dengan memilih anga dari daftar partisi tersebut. Untuk partisi FAT16 gunakan 06</p>
<p style="text-align:justify;">kemudian tentukan apakah partisi yang dibuat merupakan partisi primari atau logikal. Pada linux biasanya partisi primari akan ditandai dengan hdx1, hdx2, hdx3, dan hdx4 (x adalah tanda partisi misal hda, hdb). Sedangkan partisi logical adalah hdx5 dan seterusnya</p>
<p>klo dah selesai, cfdisk akan bertanya untuk memastikan pilihan yang udah dilakukan, cek lagi apa udah sesuai dengan yang kita inginkan&#8230; karena setelah partisi tertulis akan sulit untuk melakukan perbaikan dari pilihan yang telah dilakukan, apalagi klo di dalam harddisk tersebut ada partisi lain yang ada datanya&#8230;</p>
<p style="text-align:justify;">setelah proses penulisan selesai, maka geexbox akan nanyain di partisi manakah yang akan diinstal, tekan saja OK jika ingin melanjutkan proses instalasi.</p>
<p style="text-align:justify;">Pada proses instalasi, pertama kali partisi yang dipilih akan diformat dan file system dibuat di partisi tersebut. Setelah itu, berkas2 geexbox akan disalin ke dalam partisi tersebut, dan tahapan selanjutnya adalah geexbox akan menginstal bootloader di MBR.</p>
<p style="text-align:justify;">bootloader itu adalah program yang memungkinkan untuk memboot suatu partisi, dikenal bootloader GRUB atau SysLinux. Geexbox sendiri menggunakan GRUB sebagai bootloader. Tapi klo ingin memboot dari USB maka pilih lah SysLinux.</p>
<p style="text-align:justify;">Klo di harddisk udah ada bootloader, maka ga perlu nginstal bootloader baru. Caranya:</p>
<p style="text-align:justify;">dari GeeXboX CD, simply copy the GEEXBOX folder into your Linux /         partition (we suppose it to be /dev/sda1 here).         Modify the /boot/grub/menu.lst file to add:</p>
<blockquote><p><strong> title       GeeXboX<br />
root        (hd0,1)<br />
kernel      /GEEXBOX/boot/vmlinuz root=/dev/ram0 rw rdinit=linuxrc boot=UUID=$my_uuid lang=en keymap=qwerty splash &#8230;<br />
initrd      /GEEXBOX/boot/initrd.gz<br />
quiet</strong></p></blockquote>
<p>Just take are about two things:<br />
- the field <strong>root (hd0,1)</strong> is to be adapted according to the rest of your GRUB&#8217;s configuration.<br />
- the <strong>$my_uuid</strong> value is the unique ID of your partition. Check within your GRUB config file, which value is set for other OS on the same partition or use <strong>ls -l /dev/disk/by-uuid/</strong> to see which uuid matches your partition.</p>
<p style="text-align:justify;">tapi klo di kompie belum ada OS yang memiliki kemampuan multiboot maka disarankan untuk menginstal bootloader di harddisk. Program installer Geexbox akan menscan harddisk untuk membaca sistem operasi yang telahada dan membuat sustem multiboot yang akan memungkinkan kita untuk memilih memboot sistem operasi yang lama, ata u memboot geexbox.</p>
<p style="text-align:justify;">Instalasi selesai, kita bisa memboot Geexbox dari harddisk seperti halnya sistem linux pada umumnya. Ketika sistem diboot maka GRUB akan menampilkan pilihan boot. Minimal adalah Geexbox dan Geexbox (Debug). Yang pertama adalah sistem geexbox dan yang kedua adalah untuk keperluan debug bila sistem tidak berfungsi atau tidak bisa memboot.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Valhalla: les nouvelles fonctions de sélection]]></title>
<link>http://skywalker13.wordpress.com/2009/05/31/valhalla-les-nouvelles-fonctions-de-selection/</link>
<pubDate>Sun, 31 May 2009 15:30:24 +0000</pubDate>
<dc:creator>Mathieu SCHROETER</dc:creator>
<guid>http://skywalker13.wordpress.com/2009/05/31/valhalla-les-nouvelles-fonctions-de-selection/</guid>
<description><![CDATA[Hello, depuis peu, les modifications évoquées dans le billet précédent ont été réalisées. L&#8217;AP]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Hello,</p>
<p style="text-align:justify;">depuis peu, les modifications évoquées dans le <a href="http://skywalker13.wordpress.com/2009/05/09/quoi-de-neuf-dans-la-valhalla/">billet précédent</a> ont été réalisées. L&#8217;API a été modifiée pour toutes les fonctions qui permettent d&#8217;effectuer des sélections sur la base de donnée. Ce blog étant aussi en quelque sorte un carnet de laboratoire, je vais donc y expliquer le fonctionnement de ces fonctions ainsi que la manière de les utiliser. A terme, ces informations figureront directement dans la documentation (en anglais) de libvalhalla. Il est judicieux de consulter la documentation Doxygen déjà présente dans l&#8217;en-tête public (valhalla.h) qui peut être généré via un paramètre du script &#8220;configure&#8221;.</p>
<blockquote>
<p style="text-align:justify;">Cet article est long et très spécifique à libvalhalla du côté développeur uniquement. Si vous êtes un simple utilisateur d&#8217;Enna, vous ne verrez pas vraiment de différence par rapport à avant car les modifications sont majoritairement internes.</p>
</blockquote>
<p>Il y a trois fonctions publiques et chacune est complémentaire aux autres.</p>
<pre class="brush: cpp;">
int valhalla_db_metalist_get (
  valhalla_t *handle,
  valhalla_db_item_t *search,
  valhalla_db_restrict_t *restriction,
  int (*result_cb) (void *data,
                    valhalla_db_metares_t *res),
  void *data);

int valhalla_db_filelist_get (
  valhalla_t *handle,
  valhalla_file_type_t filetype,
  valhalla_db_restrict_t *restriction,
  int (*result_cb) (void *data,
                    valhalla_db_fileres_t *res),
  void *data);

int valhalla_db_file_get (
  valhalla_t *handle,
  int64_t id, const char *path,
  valhalla_db_restrict_t *restriction,
  valhalla_db_filemeta_t **res);
</pre>
<p><img class="aligncenter size-full wp-image-638" title="bird" src="http://skywalker13.wordpress.com/files/2009/05/bird1.png" alt="bird" width="200" height="67" /></p>
<h3>valhalla_db_metalist_get</h3>
<h4>Utilisation simple</h4>
<p style="text-align:justify;">Elle permet de récupérer une liste de metadata. Cela veut dire, par exemple une liste d&#8217;albums, d&#8217;auteurs, d&#8217;artistes, de genres; peu importe le nom, vous pouvez récupérer n&#8217;importe quelle liste. Le résultat se présente toujours sous la forme du nom du champ (comme &#8220;author&#8221;) avec une valeur et un groupe. Sous la forme d&#8217;un tableau, cela donnerait quelque chose comme:</p>
<table style="border:1px solid;width:100%;" border="0">
<tbody>
<tr>
<td style="border-bottom:1px solid;"><strong>meta id</strong></td>
<td style="border-bottom:1px solid;"><strong>meta name</strong></td>
<td style="border-bottom:1px solid;"><strong>data id</strong></td>
<td style="border-bottom:1px solid;"><strong>data value</strong></td>
<td style="border-bottom:1px solid;"><strong>group</strong></td>
</tr>
<tr>
<td>2</td>
<td>author</td>
<td>1665</td>
<td>Dido</td>
<td>ENTITIES</td>
</tr>
<tr>
<td>2</td>
<td>author</td>
<td>456</td>
<td>Ennio Morricone</td>
<td>ENTITIES</td>
</tr>
<tr>
<td>2</td>
<td>author</td>
<td>1257</td>
<td>John Williams</td>
<td>ENTITIES</td>
</tr>
<tr>
<td>2</td>
<td>author</td>
<td>1224</td>
<td>Linkin Park</td>
<td>ENTITIES</td>
</tr>
</tbody>
</table>
<p style="text-align:justify;">Dans cet exemple, uniquement les auteurs sont présents, mais il est également possible de demander une liste de metadata selon un groupe et non selon un nom de meta ou un id. Vous pouvez typiquement demander la liste de toutes les metadata qui appartiennent au group ENTITIES. De ce fait, vous trouverez la liste de tous les auteurs, artistes, compositeurs, studios, etc,&#8230;</p>
<p style="text-align:justify;">Sans rentrer encore dans les détails du code, une telle liste se récupère de cette manière:</p>
<pre class="brush: cpp; light: true; wrap-lines: false;">
valhalla_db_item_t s = VALHALLA_DB_SEARCH_TEXT (&#34;author&#34;, ENTITIES);
valhalla_db_metalist_get (handle, &#38;s, NULL, callback, NULL);
</pre>
<p style="text-align:justify;">Et sans expliquer en détail la fonction, l&#8217;argument &#8220;handle&#8221; correspond au pointeur sur votre instance de valhalla, &#8220;s&#8221;  (pour search) défini ce que vous cherchez, le troisième argument permet de spécifier des restrictions (qui sont expliquées dans le chapitre suivant), le callback est la fonction dans laquelle chaque ligne du résultat est envoyée et le dernier argument est un pointeur void qui peut être récupéré dans le callback.</p>
<p style="text-align:justify;">Les macros  VALHALLA_DB_SEARCH_XXX sont présentes pour simplifier l&#8217;utilisation de libvalhalla. Elles ne sont pas indispensables. En réalité, elle ne font qu&#8217;attribuer les valeurs au bon endroit dans la structure valhalla_db_item_t. Actuellement il existe trois macros différentes:</p>
<p style="text-align:justify;padding-left:30px;"><em>VALHALLA_DB_SEARCH_ID(meta_id, group)<br />
VALHALLA_DB_SEARCH_TEXT(meta_text, group)<br />
VALHALLA_DB_SEARCH_GRP(group)</em></p>
<p style="text-align:justify;">Vous pouvez donc chercher une liste de meta en fonction de l&#8217;id, du texte, ou alors vous pouvez récupérer plusieurs noms de metadata différents dans le cas d&#8217;une recherche selon un groupe.</p>
<h4 style="text-align:justify;">Utilisation étendue</h4>
<p style="text-align:justify;">Récupérer une liste comme expliqué dans le chapitre précédent est la fonctionnalité la plus simple offerte par cette fonction. Il va de soit qu&#8217;il faut pouvoir donner quelques restrictions sur la liste retournée. Il est courant de ne pas vouloir une liste complète. Un exemple parlant concerne la metadata &#8220;album&#8221;. Il est intéressant de pouvoir récupérer tous les albums d&#8217;un auteur en particulier. Et c&#8217;est ici qu&#8217;interviennent les restrictions. Elles permettent d&#8217;inclure ou d&#8217;exclure certains résultats. D&#8217;un point de vue SQL, se sont des sous-requêtes qui limitent les résultats à leur ensemble, ou alors à tous les résultats différents de leur ensemble.</p>
<p style="text-align:justify;">Voici un premier exemple. Vous voulez tous les albums de Dido:</p>
<pre class="brush: cpp; light: true; wrap-lines: false;">
valhalla_db_item_t s = VALHALLA_DB_SEARCH_TEXT (&#34;album&#34;, TITLES);
valhalla_db_restrict_t r1 = VALHALLA_DB_RESTRICT_STR (IN, &#34;author&#34;, &#34;Dido&#34;);
valhalla_db_metalist_get (handle, &#38;s, &#38;r1, callback, NULL);
</pre>
<p>Le résultat sera un tableau de la même forme que vue précédemment, mais qui contiendra uniquement les albums de Dido.</p>
<table style="border:1px solid;width:100%;" border="0">
<tbody>
<tr>
<td style="border-bottom:1px solid;"><strong>meta id</strong></td>
<td style="border-bottom:1px solid;"><strong>meta name</strong></td>
<td style="border-bottom:1px solid;"><strong>data id</strong></td>
<td style="border-bottom:1px solid;"><strong>data value</strong></td>
<td style="border-bottom:1px solid;"><strong>group</strong></td>
</tr>
<tr>
<td>3</td>
<td>album</td>
<td>1666</td>
<td>Life For Rent</td>
<td>TITLES</td>
</tr>
<tr>
<td>3</td>
<td>album</td>
<td>1669</td>
<td>No Angel</td>
<td>TITLES</td>
</tr>
<tr>
<td>3</td>
<td>album</td>
<td>1725</td>
<td>Safe Trip Home</td>
<td>TITLES</td>
</tr>
</tbody>
</table>
<p style="text-align:justify;">Cette requête est déjà bien plus sophistiquée, car vous pouvez imaginer de donner ce genre de restriction pour n&#8217;importe quel metadata. Un autre exemple, vous pourriez lister tous les albums d&#8217;une certaine année. Il n&#8217;y a aucune limite sur les choix des restrictions. Mais ceci n&#8217;est pas suffisant, et il y a donc des possibilités un peu plus complexes afin d&#8217;avoir des résultats plus spécifiques.</p>
<p style="text-align:justify;">Tout d&#8217;abord, dans l&#8217;exemple précédent, la macro VALHALLA_DB_RESTRICT est utilisée avec un premier argument &#8220;IN&#8221;. Il est possible d&#8217;inverser la logique en y inscrivant &#8220;NOTIN&#8221; à la place. Le résultat deviendrait alors la liste de tous les albums qui existent dans la base de donnée, sauf ceux de Dido.</p>
<h4 style="text-align:justify;">Utilisation avancée</h4>
<p style="text-align:justify;">L&#8217;utilisation étendue permet déjà d&#8217;effectuer de nombreuse recherches intéressantes. Néanmoins pour les cas les plus précis, elle ne suffit pas. Il est nécessaire parfois de cumuler les restrictions pour affiner le résultats, ou tout simplement, pour avoir des résultats un peu plus exotiques. Ainsi les restrictions sont des listes chaînées, et il est possible de les lier très facilement. Commençons par un exemple, nous désirons la liste de tous les albums de Dido qui ne sont pas de 2003.</p>
<pre class="brush: cpp; light: true; wrap-lines: false;">
valhalla_db_item_t s = VALHALLA_DB_SEARCH_TEXT (&#34;album&#34;, TITLES);
valhalla_db_restrict_t r1 = VALHALLA_DB_RESTRICT_STR (IN, &#34;author&#34;, &#34;Dido&#34;);
valhalla_db_restrict_t r2 = VALHALLA_DB_RESTRICT_STR (NOTIN, &#34;year&#34;, &#34;2003&#34;);
VALHALLA_DB_RESTRICT_LINK (r2, r1);
valhalla_db_metalist_get (handle, &#38;s, &#38;r1, callback, NULL);
</pre>
<p style="text-align:justify;">Une nouvelle macro est donc introduite. Elle permet de lier très simplement les restrictions ensemble. La macro doit être comprise de cette manière. &#8220;link from r2 to r1&#8243;, soit lier de r2 à r1. Ainsi c&#8217;est r1 qui doit être spécifié dans la fonction valhalla_db_metalist_get(). Il n&#8217;y a aucune limite sur le nombre de liens possibles (mise à part qu&#8217;une requête ne doit pas dépasser 4096 caractères), néanmoins il ne faut pas tenter de lier toutes les restrictions sur la même car seul le dernier lien sera considéré. Avec trois restrictions, la bonne manière de procéder est donc:</p>
<pre class="brush: cpp; light: true; wrap-lines: false;">
valhalla_db_item_t s = VALHALLA_DB_SEARCH_TEXT (&#34;album&#34;, TITLES);
valhalla_db_restrict_t r1 = VALHALLA_DB_RESTRICT_STR (IN, &#34;author&#34;, &#34;Linkin Park&#34;);
valhalla_db_restrict_t r2 = VALHALLA_DB_RESTRICT_STR (NOTIN, &#34;year&#34;, &#34;2003&#34;);
valhalla_db_restrict_t r3 = VALHALLA_DB_RESTRICT_STR (NOTIN, &#34;genre&#34;, &#34;Alternative&#34;);
VALHALLA_DB_RESTRICT_LINK (r3, r2);
VALHALLA_DB_RESTRICT_LINK (r2, r1);
valhalla_db_metalist_get (handle, &#38;s, &#38;r1, callback, NULL);
</pre>
<p style="text-align:justify;">Ici, la liste concernera donc tous les albums de Linkin Park, qui ne sont pas de 2003 et qui ne sont pas du rock/metal alternatif. Okay, la liste ne risque pas d&#8217;être bien longue avec cet exemple <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> , mais ce qui compte c&#8217;est de montrer le principe. Les restrictions sont liées de la manière suivante: de r3 à r2 et de r2 à r1. En code ça donnerait donc:</p>
<pre class="brush: cpp; light: true;">
r2.next = &#38;r3;
r1.next = &#38;r2;
</pre>
<p>Le code ci-dessus peut très bien remplacer la macro si vous préférez.</p>
<p style="text-align:justify;">Il y a encore une macro que je n&#8217;ai pas vraiment présenté. Pour l&#8217;argument de recherche de la fonction, il est possible d&#8217;indiquer uniquement un groupe (comme je l&#8217;ai mentionné plus haut dans ce billet). Si le groupe est mit à NIL, il y aura toutes les metadata qui seront listées, autrement il n&#8217;y aura que les metadata liées au groupe.</p>
<p style="text-align:justify;">Un dernier exemple qui retourne absolument toutes les metadata liées à Dido pour son album Life For Rent.</p>
<pre class="brush: cpp; light: true; wrap-lines: false;">
valhalla_db_item_t s = VALHALLA_DB_SEARCH_GRP (NIL);
valhalla_db_restrict_t r1 = VALHALLA_DB_RESTRICT_STR (IN, &#34;author&#34;, &#34;Dido&#34;);
valhalla_db_restrict_t r2 = VALHALLA_DB_RESTRICT_STR (IN, &#34;album&#34;, &#34;Life For Rent&#34;);
VALHALLA_DB_RESTRICT_LINK (r2, r1);
valhalla_db_metalist_get (handle, &#38;s, &#38;r1, callback, NULL);
</pre>
<table style="border:1px solid;width:100%;" border="0">
<tbody>
<tr>
<td style="border-bottom:1px solid;"><strong>meta id</strong></td>
<td style="border-bottom:1px solid;"><strong>meta name</strong></td>
<td style="border-bottom:1px solid;"><strong>data id</strong></td>
<td style="border-bottom:1px solid;"><strong>data value</strong></td>
<td style="border-bottom:1px solid;"><strong>group</strong></td>
</tr>
<tr>
<td>6</td>
<td>track</td>
<td>19</td>
<td>1</td>
<td>ORGANIZATIONAL</td>
</tr>
<tr>
<td>6</td>
<td>track</td>
<td>225</td>
<td>10</td>
<td>ORGANIZATIONAL</td>
</tr>
<tr>
<td>6</td>
<td>track</td>
<td>229</td>
<td>11</td>
<td>ORGANIZATIONAL</td>
</tr>
<tr>
<td>6</td>
<td>track</td>
<td>242</td>
<td>12</td>
<td>ORGANIZATIONAL</td>
</tr>
<tr>
<td>6</td>
<td>track</td>
<td>92</td>
<td>2</td>
<td>ORGANIZATIONAL</td>
</tr>
<tr>
<td>5</td>
<td>year</td>
<td>50</td>
<td>2003</td>
<td>TEMPORAL</td>
</tr>
<tr>
<td>6</td>
<td>track</td>
<td>202</td>
<td>3</td>
<td>ORGANIZATIONAL</td>
</tr>
<tr>
<td>6</td>
<td>track</td>
<td>101</td>
<td>4</td>
<td>ORGANIZATIONAL</td>
</tr>
<tr>
<td>6</td>
<td>track</td>
<td>223</td>
<td>5</td>
<td>ORGANIZATIONAL</td>
</tr>
<tr>
<td>6</td>
<td>track</td>
<td>96</td>
<td>6</td>
<td>ORGANIZATIONAL</td>
</tr>
<tr>
<td>6</td>
<td>track</td>
<td>231</td>
<td>7</td>
<td>ORGANIZATIONAL</td>
</tr>
<tr>
<td>6</td>
<td>track</td>
<td>196</td>
<td>8</td>
<td>ORGANIZATIONAL</td>
</tr>
<tr>
<td>6</td>
<td>track</td>
<td>187</td>
<td>9</td>
<td>ORGANIZATIONAL</td>
</tr>
<tr>
<td>1</td>
<td>title</td>
<td>1673</td>
<td>BonusTrack</td>
<td>TITLES</td>
</tr>
<tr>
<td>2</td>
<td>author</td>
<td>1665</td>
<td>Dido</td>
<td>ENTITIES</td>
</tr>
<tr>
<td>1</td>
<td>title</td>
<td>1668</td>
<td>Do You Have A Little Time</td>
<td>TITLES</td>
</tr>
<tr>
<td>1</td>
<td>title</td>
<td>1672</td>
<td>Dont Leave Home</td>
<td>TITLES</td>
</tr>
<tr>
<td>1</td>
<td>title</td>
<td>1666</td>
<td>Life For Rent</td>
<td>TITLES</td>
</tr>
<tr>
<td>3</td>
<td>album</td>
<td>1666</td>
<td>Life For Rent</td>
<td>TITLES</td>
</tr>
<tr>
<td>1</td>
<td>title</td>
<td>1678</td>
<td>Marys In India</td>
<td>TITLES</td>
</tr>
<tr>
<td>4</td>
<td>genre</td>
<td>104</td>
<td>Pop</td>
<td>CLASSIFICATION</td>
</tr>
<tr>
<td>1</td>
<td>title</td>
<td>1670</td>
<td>Sand In My Shoes</td>
<td>TITLES</td>
</tr>
<tr>
<td>1</td>
<td>title</td>
<td>1669</td>
<td>See The Sun</td>
<td>TITLES</td>
</tr>
<tr>
<td>1</td>
<td>title</td>
<td>1674</td>
<td>See You When Youre 40</td>
<td>TITLES</td>
</tr>
<tr>
<td>1</td>
<td>title</td>
<td>1675</td>
<td>Stoned</td>
<td>TITLES</td>
</tr>
<tr>
<td>1</td>
<td>title</td>
<td>1671</td>
<td>This Land Is Mine</td>
<td>TITLES</td>
</tr>
<tr>
<td>1</td>
<td>title</td>
<td>1664</td>
<td>White Flag</td>
<td>TITLES</td>
</tr>
<tr>
<td>1</td>
<td>title</td>
<td>1667</td>
<td>Who Makes You Feel</td>
<td>TITLES</td>
</tr>
</tbody>
</table>
<h4>Et d&#8217;un point de vue SQL</h4>
<p style="text-align:justify;">La requête SQL qui effectue les sélections est créée en fonction des arguments de la fonction. Elle se construit comme des lego qui s&#8217;imbriquent les uns dans les autres. D&#8217;une manière général, sa forme est:</p>
<pre class="brush: sql; wrap-lines: false;">
SELECT meta.meta_id, data.data_id, meta.meta_name, data.data_value
FROM (
 data INNER JOIN assoc_file_metadata AS assoc
 ON data.data_id = assoc.data_id
) INNER JOIN meta
ON assoc.meta_id = meta.meta_id
-- Les conditions sont optionnelles
WHERE
  -- Une sous-requête apparait par le biais des restrictions.
  -- Il y a autant de sous-requêtes que de restrictions du type IN, NOT IN.
  assoc.file_id &#60;IN&#124;NOT IN&#62; (
    SELECT assoc.file_id
    FROM (
      data INNER JOIN assoc_file_metadata AS assoc
      ON data.data_id = assoc.data_id
    ) INNER JOIN meta
    ON assoc.meta_id = meta.meta_id
    -- A choix, il peut y avoir un ID ou du texte.
    WHERE meta.&#60;meta_id&#124;meta_name&#62; = &#60;ID&#124;&#34;TEXT&#34;&#62; AND data.&#60;data_id&#124;data_value&#62; = &#60;ID&#124;&#34;TEXT&#34;&#62;
  )
  -- L'argument search indique quel meta et/ou quel groupe doit être listé
  AND meta.&#60;meta_id&#124;meta_name&#62; = &#60;ID&#124;&#34;TEXT&#34;&#62;
  AND assoc._grp_id = &#60;ID&#62;
GROUP BY assoc.meta_id, assoc.data_id
ORDER BY data.data_value;
</pre>
<p style="text-align:justify;">Sa longueur varie fortement selon le nombre de conditions. Il est possible de visualiser les requêtes générées par Valhalla en utilisant la verbosité maximale de la bibliothèque.</p>
<pre><img class="aligncenter" title="bird" src="http://skywalker13.wordpress.com/files/2009/05/bird1.png" alt="bird" width="200" height="67" /></pre>
<h3>valhalla_db_filelist_get</h3>
<h4 style="text-align:justify;">Utilisation simple</h4>
<p style="text-align:justify;">La récupération d&#8217;une liste de fichiers ressemble à celle pour les metadata. La différence vient principalement du deuxième argument qui fait référence au type de fichier (audio, video, etc, &#8230;). Ce qui limite ensuite la liste se sont les restrictions. L&#8217;utilisation étant exactement la même, je vais aller droit au but avec des exemples.</p>
<p style="text-align:justify;">Pour lister la totalité des fichiers référencés dans la base de donnée, rien de plus simple:</p>
<pre class="brush: cpp; light: true;">
valhalla_db_filelist_get (handle, VALHALLA_FILE_TYPE_NULL, NULL, callback, NULL);
</pre>
<p style="text-align:justify;">Le fait d&#8217;indiquer un type de fichier NULL, permet d&#8217;ignorer le type. Le résultat de cette requête correspond à un tableau de ce genre qui contiendrait la totalité de l&#8217;arborescence:</p>
<table style="border:1px solid;width:100%;" border="0">
<tbody>
<tr>
<td style="border-bottom:1px solid;"><strong>id</strong></td>
<td style="border-bottom:1px solid;"><strong>path</strong></td>
<td style="border-bottom:1px solid;"><strong>filetype</strong></td>
</tr>
<tr>
<td>&#8230;</td>
<td>&#8230;</td>
<td>&#8230;</td>
</tr>
<tr>
<td>101</td>
<td>/home/foo/bar/dido/life_for_rent/sand_in_my_shoes.m4a</td>
<td>AUDIO</td>
</tr>
<tr>
<td>102</td>
<td>/home/foo/bar/dido/life_for_rent/white_flag.m4a</td>
<td>AUDIO</td>
</tr>
<tr>
<td>103</td>
<td>/home/foo/bar/dido/life_for_rent/who_makes_you_feel.m4a</td>
<td>AUDIO</td>
</tr>
<tr>
<td>&#8230;</td>
<td>&#8230;</td>
<td>&#8230;</td>
</tr>
</tbody>
</table>
<h4>Avec les restrictions</h4>
<p style="text-align:justify;">Il est ensuite facile de faire du tri avec les restrictions, de la même manière que pour la fonction précédente. Par exemple, pour lister tous les fichiers d&#8217;Ennio Morricone qui ne sont référencés dans aucun album.</p>
<pre class="brush: cpp; light: true; wrap-lines: false;">
valhalla_db_restrict_t r1 = VALHALLA_DB_RESTRICT_STR (IN, &#34;author&#34;, &#34;Ennio Morricone&#34;);
valhalla_db_restrict_t r2 = VALHALLA_DB_RESTRICT_STR (NOTIN, &#34;album&#34;, NULL);
VALHALLA_DB_RESTRICT_LINK (r2, r1);
valhalla_db_filelist_get (handle, VALHALLA_FILE_TYPE_NULL, &#38;r1, callback, NULL);
</pre>
<p>Et ci-dessous, un autre exemple qui correspond à la catégorie &#8220;Non Classé&#8221; dans Enna. Tous les fichiers qui ne sont ni dans un album, ni lié à un author et dont le genre est indéfini.</p>
<pre class="brush: cpp; light: true; wrap-lines: false;">
valhalla_db_restrict_t r1 = VALHALLA_DB_RESTRICT_STR (NOTIN, &#34;album&#34;, NULL);
valhalla_db_restrict_t r2 = VALHALLA_DB_RESTRICT_STR (NOTIN, &#34;author&#34;, NULL);
valhalla_db_restrict_t r3 = VALHALLA_DB_RESTRICT_STR (NOTIN, &#34;genre&#34;, NULL);
VALHALLA_DB_RESTRICT_LINK (r3, r2);
VALHALLA_DB_RESTRICT_LINK (r2, r1);
valhalla_db_filelist_get (handle, VALHALLA_FILE_TYPE_NULL, &#38;r1, callback, NULL);
</pre>
<p>Facile, non?</p>
<blockquote>
<p style="text-align:justify;">A noter que ce n&#8217;est pas encore totalement optimal, car le groupe ne peut pas être donné avec les restrictions. Ainsi n&#8217;importe quel metadata de n&#8217;importe quel groupe est considérée dans l&#8217;inclusion comme l&#8217;exclusion.</p>
</blockquote>
<h4>Et d&#8217;un point de vue SQL</h4>
<p style="text-align:justify;">La aussi, la requête ressemble beaucoup à la précédente avec des différences au niveau de ce qui est sélectionné et dans quelle table.</p>
<pre class="brush: sql; wrap-lines: false;">
SELECT file_id, file_path, _type_id
FROM file AS assoc
-- Les conditions sont optionnelles
WHERE
  -- Une sous-requête apparait par le biais des restrictions.
  -- Il y a autant de sous-requêtes que de restrictions du type IN, NOT IN.
  assoc.file_id &#60;IN&#124;NOT IN&#62; (
    SELECT assoc.file_id
    FROM (
      data INNER JOIN assoc_file_metadata AS assoc
      ON data.data_id = assoc.data_id
    ) INNER JOIN meta
    ON assoc.meta_id = meta.meta_id
    -- A choix, il peut y avoir un ID ou du texte.
    WHERE meta.&#60;meta_id&#124;meta_name&#62; = &#60;ID&#124;&#34;TEXT&#34;&#62; AND data.&#60;data_id&#124;data_value&#62; = &#60;ID&#124;&#34;TEXT&#34;&#62;
  )
  -- Le type n'est pas inscrit dans la requête si la valeur est NULL.
  AND _type_id = &#60;ID&#62;
ORDER BY file_id;
</pre>
<p style="text-align:justify;">Si dans la clause FROM, la table &#8220;file&#8221; créer un alias &#8220;assoc&#8221;, c&#8217;est uniquement pour une question de factorisation dans le code par rapport à la sous-requête.</p>
<pre><img class="aligncenter" title="bird" src="http://skywalker13.wordpress.com/files/2009/05/bird1.png" alt="bird" width="200" height="67" /></pre>
<h3>valhalla_db_file_get</h3>
<p style="text-align:justify;">Maintenant que l&#8217;on a vu comment récupérer des listes de metadata ainsi que des listes de fichiers, il est important de pouvoir aussi récupérer des metadata en fonction d&#8217;un fichier spécifique. Cette possibilité n&#8217;existait pas avec l&#8217;ancien modèle car les fichiers étaient toujours retournés dans une liste. Ici il est question d&#8217;un seul fichier à la fois. Il faut également être conscient que cette fonction est liée uniquement à la base de donnée, si un fichier non référencé dans la base mais existant quelque part est donné en argument, aucun résultat ne sera retourné (cette possibilité existera quand j&#8217;implémenterai le &#8220;scan on-demand&#8221;).</p>
<p style="text-align:justify;">Les arguments sont donc l&#8217;id du fichier, le chemin du fichier, des restrictions et le pointeur sur la structure de résultat. Il n&#8217;y a pas de callback pour l&#8217;utilisateur car le résultat est limité à un seul fichier (en réalité il y a un callback interne qui récupère toutes les metadata car le vrai résultat est sur plusieurs lignes).</p>
<p style="text-align:justify;">Les metadata sont disponibles dans une structure chaînée. Je dois également introduire une nouvelle possibilité des restrictions. Mais tout d&#8217;abord, voici un exemple:</p>
<pre class="brush: cpp; light: true; wrap-lines: false;">
valhalla_db_filemeta_t *metadata = NULL;
valhalla_db_restrict_t r1 = VALHALLA_DB_RESTRICT_STR (EQUAL, &#34;track&#34;, NULL);
valhalla_db_restrict_t r2 = VALHALLA_DB_RESTRICT_STR (EQUAL, &#34;title&#34;, NULL);
VALHALLA_DB_RESTRICT_LINK (r2, r1);
valhalla_db_file_get (handle, 0, &#34;/home/foo/bar/dido/life_for_rent/white_flag.m4a&#34;, &#38;r1, &#38;metadata);
/* ... */
VALHALLA_DB_FILEMETA_FREE (metadata);
</pre>
<p style="text-align:justify;">L&#8217;argument EQUAL dans la macro VALHALLA_DB_RESTRICT sert à limiter les résultats à des metadata précises. Sans les restrictions, la structure metadata contiendrait absolument toutes les metadata. Mais dans cet exemple, la structure contient uniquement le track et le titre. A noter qu&#8217;utiliser IN ou NOTIN ici ça n&#8217;a aucun sens. De même qu&#8217;utiliser EQUAL pour les deux fonctions précédentes (voir la conclusion).</p>
<blockquote>
<p style="text-align:justify;">Il faut être conscient que plusieurs tracks et plusieurs titres peuvent être retournés pour un même fichier. Car rien n&#8217;exclus que certains noms de metadata n&#8217;existent pas dans différents groupes. Et comme je l&#8217;ai dis plus haut, il n&#8217;est pour le moment pas possible de limiter une restriction à un groupe. Néanmoins le groupe est un champ de la structure valhalla_db_filemeta_t, il est donc possible de faire un tri à postériori.</p>
</blockquote>
<p>Après utilisation des metadata, il ne faut pas oublier de les libérer avec VALHALLA_DB_FILEMETA_FREE().</p>
<h4>Et d&#8217;un point de vue SQL</h4>
<pre class="brush: sql; wrap-lines: false;">
SELECT file.file_id, assoc._grp_id, meta.meta_id, data.data_id, meta.meta_name, data.data_value
FROM ((
    file INNER JOIN assoc_file_metadata AS assoc
    ON file.file_id = assoc.file_id
  ) INNER JOIN data
  ON data.data_id = assoc.data_id
) INNER JOIN meta
ON assoc.meta_id = meta.meta_id
-- Les conditions sont optionnelles
WHERE
  -- Une condition apparait par le biais des restrictions.
  -- Il y a autant de conditions que de restrictions du type EQUAL.
  -- A choix, il peut y avoir un ID ou du texte. Chaque restriction
  -- est séparée par un OR.
  (
    (meta.&#60;meta_id&#124;meta_name&#62; = &#60;ID&#124;&#34;TEXT&#34;&#62; AND data.&#60;data_id&#124;data_value&#62; = &#60;ID&#124;&#34;TEXT&#34;&#62;)
    &#60;OR&#62; ...
  )
  -- Il faut l'id d'un fichier ou un path
  AND file.&#60;file_id&#124;file_path&#62; = &#60;ID&#124;&#34;PATH&#34;&#62;
;
</pre>
<p style="text-align:justify;">Cette requête retourne autant de lignes qu&#8217;il y a de metadata. Mais pour l&#8217;utilisateur, tout est transparent car les résultats sont tous retournés dans une structure chaînée.</p>
<h3>En conclusion</h3>
<p style="text-align:justify;">Les possibilités de ce nouveau système sont très larges par rapport à l&#8217;ancien. Bien qu&#8217;il y ait encore quelques manques pour pouvoir spécifier des groupes avec les restrictions, il est possible de retrouver les données avec peu de lignes de code et simplement, tout en ayant des requêtes relativement complexes qui se créer en interne. Il y aura forcément des modifications à l&#8217;avenir, je tâcherais de garder à jour cet article.</p>
<p style="text-align:justify;">Et pour en revenir aux restrictions et à l&#8217;argument qui peut prendre la valeur IN, NOTIN ou EQUAL, il faut comprendre que c&#8217;est avant tout une question de factorisation en interne. IN et NOTIN devraient être utilisés uniquement avec les deux premières fonctions présentées qui récupèrent des listes, et EQUAL devrait être utilisé uniquement pour la récupération des metadata d&#8217;un fichier. Je vais continuer à travailler sur ces éléments dans les jours à venir afin d&#8217;éviter des confusions.</p>
<p style="text-align:justify;">A bientôt,</p>
<p style="text-align:justify;padding-left:30px;">Mathieu SCHROETER</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Un article par semaine !]]></title>
<link>http://abbottswharf.wordpress.com/2009/05/19/un-article-par-semaine/</link>
<pubDate>Tue, 19 May 2009 20:39:36 +0000</pubDate>
<dc:creator>Sebastien Benistant</dc:creator>
<guid>http://abbottswharf.wordpress.com/2009/05/19/un-article-par-semaine/</guid>
<description><![CDATA[C&#8217;est pourtant pas compliquer d&#8217;écrire un article par semaine ! Et pourtant, je lutte ]]></description>
<content:encoded><![CDATA[C&#8217;est pourtant pas compliquer d&#8217;écrire un article par semaine ! Et pourtant, je lutte ]]></content:encoded>
</item>
<item>
<title><![CDATA[Quoi de neuf dans la Valhalla]]></title>
<link>http://skywalker13.wordpress.com/2009/05/09/quoi-de-neuf-dans-la-valhalla/</link>
<pubDate>Sat, 09 May 2009 14:11:23 +0000</pubDate>
<dc:creator>Mathieu SCHROETER</dc:creator>
<guid>http://skywalker13.wordpress.com/2009/05/09/quoi-de-neuf-dans-la-valhalla/</guid>
<description><![CDATA[Au pays du dieu Odin, il est temps de ne plus limiter l&#8217;entrée de la Valhalla uniquement aux g]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p style="text-align:justify;"><img class="alignleft size-thumbnail wp-image-565" style="margin-right:15px;" title="Odin" src="http://skywalker13.wordpress.com/files/2009/05/odin.png?w=82" alt="Odin" width="82" height="150" />Au pays du dieu Odin, il est temps de ne plus limiter l&#8217;entrée de la Valhalla uniquement aux guerriers valeureux. Mais soyons fous et acceptons tout le monde, et peu importe leurs caractéristiques (cf. <a title="Valhalla Scanner" href="http://skywalker13.wordpress.com/2009/03/14/valhalla/">Valhalla Scanner</a>).</p>
<p style="text-align:justify;">Je travail ainsi à la refonte complète de la structure de la base de donnée. Pour rappel, le problème majeur vient du manque de souplesse à l&#8217;insertion des méta-données. Il n&#8217;est pas possible d&#8217;y insérer des informations autres que le titre, l&#8217;année, le numéro de piste, l&#8217;auteur, l&#8217;album et le genre. De nombreux fichiers offrants bien d&#8217;autres informations il est donc indispensable de revoir le modèle complètement. Mais qui dit nouveau modèle, dit aussi nouveau code et nouvelle API. La conséquence de cette réécriture provoquera indéniablement une fracture avec le module actuellement présent dans Enna et avec les bases de données générées par le système actuel. En date de cet article, je n&#8217;ai pas encore écris les modifications mais j&#8217;ai néanmoins fais les réflexions nécessaires. Et se sont ces réflexions que je vais partager ici &#8220;en partie <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> &#8220;.</p>
<h3 style="text-align:justify;">Nouveau modèle</h3>
<p style="text-align:justify;">L&#8217;idée est de se détacher des noms donnés au méta-données. Tel que &#8220;genre&#8221;, &#8220;author&#8221; et &#8220;album&#8221; par exemple. Ce ne sont finalement que des noms et devraient donc être traités comme de simple donnée dans la base de donnée. Il n&#8217;y aura donc plus de table nommée &#8220;genre&#8221;, etc. Mais une table regroupant les noms, et une seconde table regroupant les valeurs et gardant indirectement une relation entre le nom et la valeur.</p>
<p style="text-align:justify;">Un tel système permet d&#8217;insérer une infinité de noms différents de méta-données et d&#8217;éviter en même temps les duplications. Il est important d&#8217;assurer un minimum de redondance. Si un genre est inséré, il ne faudrait pas qu&#8217;il soit réinséré trois fois si trois nouvelles données nommées &#8220;genre&#8221; seraient envoyées par le scanner. De même pour les valeurs, la valeur &#8220;rock&#8221; par exemple devrait apparaitre qu&#8217;une seule fois dans la base de donnée. Ainsi tous les fichiers qui feraient référence à &#8220;genre&#8221;-&#62;&#8221;rock&#8221; seraient tous liés à la même information. Ce qui est le cas avec l&#8217;ancien modèle, et il est important de conserver cette caractéristique pour une question de bon-sens et de qualité.</p>
<p style="text-align:justify;">Mais rendre le modèle complètement générique apporte un nouveau problème. Il devient difficile de retrouver les informations qui concernent un même thème. Imaginez un fichier qui utilise le nom &#8220;genre&#8221; et un autre type de fichier qui utilise le nom &#8220;style&#8221;. Peut être que ces deux fichiers sont de la musique et que les deux contiennent la valeur &#8220;rock&#8221;. Mais une fois nous avons &#8220;genre&#8221;-&#62;&#8221;rock&#8221; et une fois nous avons &#8220;style&#8221;-&#62;&#8221;rock&#8221;.<br />
Pour y remédier, il peut être judicieux de créer une troisième table qui permettrait de regrouper les paires nom-&#62;valeur sous des noms d&#8217;ensemble. Cette table se nommerait donc &#8220;group&#8221; et contiendrait une liste (pouvant être étendue si nécessaire) de différents groupes possibles. Voici une première liste de groupes (qui va encore évoluer):</p>
<p style="text-align:justify;padding-left:30px;"><strong>Miscellaneous, Entity, Title, Classification, Personal, Temporal, Spacial, Commercial, Legal, Technical, Identifier, Musical, Contact, Organizational</strong></p>
<p style="text-align:justify;">Typiquement, par rapport à l&#8217;exemple précédent pour &#8220;genre&#8221; et &#8220;style&#8221;, il serait judicieux de regrouper ces paires dans le groupe &#8220;Classification&#8221;. Ainsi il serait facile de ressortir toutes les paires par groupe pour créer des listes de genre et de style en étant sûr que le nom &#8220;genre&#8221; ne fait pas référence à autre chose. On pourrait très bien imaginer que pour certains formats de fichier, ce soit des noms français et que ça ferait référence au genre (sexe) et non au style de musique. Il faudrait donc pouvoir assigner un autre groupe pour ces particularités. Ainsi, lors de l&#8217;insertion des méta-données d&#8217;un fichier, il sera obligatoire de chaque fois spécifier le groupe. Mais dans les cas &#8220;inconnu&#8221;, il sera toujours possible d&#8217;utiliser le groupe &#8220;Miscellaneous&#8221;.</p>
<p style="text-align:justify;">Ça sera donc aux parsers de dire quel paire va dans quel groupe. Cela peut paraître un peu contraignant, car ça demande quelques réflexions sur le fonctionnement des parsers. Mais afin de pouvoir récupérer de la manière la plus exhaustives possible des informations depuis l&#8217;extérieur (comme Enna), il est indispensable de les regrouper correctement. Avec l&#8217;ancien système, ce n&#8217;est pas possible et c&#8217;est donc un plus que j&#8217;estime intéressant. Sans oublier que le nom des méta-données pourra également être récupéré depuis l&#8217;extérieur, et donc un tri pourra se faire sur les &#8220;genre&#8221; et sur les &#8220;style&#8221;, etc,.. si nécessaire. Et bien sûr, il sera qu&#8217;en même possible de récupérer tous les &#8220;genre&#8221; sans tenir compte des groupes.<br />
<em>(Quand je parle de &#8220;l&#8217;extérieur&#8221;, je parle donc des accès effectués depuis l&#8217;API et des valeurs récupérées. Je parle également toujours du genre, mais c&#8217;est un exemple.. l&#8217;idée est la même pour toutes les méta-données.)</em></p>
<h4 style="text-align:justify;">Diagramme Entité/Relation</h4>
<p style="text-align:justify;">Le diagramme <a href="http://en.wikipedia.org/wiki/Entity-relationship_model">E/R</a> ci-dessous résume assez bien à quoi va ressembler la base de donnée. Il se peut qu&#8217;il évolue encore, mais la forme générale (les relations) ne devraient pas trop bouger.</p>
<p style="text-align:center;"><a href="http://skywalker13.wordpress.com/files/2009/08/valhalla-db.png"><img class="size-medium wp-image-554 aligncenter" style="border:0 none;" title="Valhalla E/R" src="http://skywalker13.wordpress.com/files/2009/08/valhalla-db.png?w=400" alt="Valhalla E/R" /></a></p>
<blockquote>
<p style="text-align:justify;">D&#8217;habitude je préfère travailler avec des diagrammes <a href="http://fr.wikipedia.org/wiki/Merise_(informatique)">MERISE</a>, mais le logiciel <a href="http://projects.gnome.org/dia/">Dia</a> est mieux adapté pour du E/R. Pour les non-adeptes des E/R, le rectangle/losange &#8220;is defined by&#8221; correspond à une table d&#8217;allocation ayant pour clef primaire (file_id, meta_id et data_id).</p>
</blockquote>
<h3 style="text-align:justify;">But final</h3>
<p style="text-align:justify;">Cette petite analyse du modèle est un premier pas vers une future modification de Valhalla, dans laquelle il sera possible d&#8217;y introduire directement les grabbers d&#8217;Enna <em>(les grabbers sont les modules qui permettent de récupérer des informations et des images via Allocine, IMdB, etc,..)</em>.</p>
<p style="text-align:justify;">Il y a quelques indications dans <a href="http://hg.geexbox.org/libvalhalla/file/11e17084634e/TODO">ce document</a> (voir aussi <a href="http://www.geexbox.org/~schroeterm/valhalla/new_valhalla.png">ici</a>), mais j&#8217;en parlerais plus en détail dans un nouvel article, dès que j&#8217;en aurais terminé avec le nouveau modèle et son implémentation.</p>
<p style="text-align:justify;">A bientôt,</p>
<p style="text-align:justify;padding-left:30px;">Mathieu SCHROETER</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Searching for My ‘Ideal’ media center Part 2]]></title>
<link>http://slowgeek.wordpress.com/2009/04/10/searching-for-my-%e2%80%98ideal%e2%80%99-media-center-part-2/</link>
<pubDate>Fri, 10 Apr 2009 01:06:26 +0000</pubDate>
<dc:creator>slowgeek</dc:creator>
<guid>http://slowgeek.wordpress.com/2009/04/10/searching-for-my-%e2%80%98ideal%e2%80%99-media-center-part-2/</guid>
<description><![CDATA[Nerusin post yg kemaren. Begitu tahu permasalahannya terletak pada permission mounted folder yg di b]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Nerusin post yg kemaren. Begitu tahu permasalahannya terletak pada permission mounted folder yg di buat otomatis oleh ivman, ada 2 hal yg dpt saya pikirkan. Yang pertama, there&#8217;s gotta be some way to make ivman to set permission for every folder it&#8217;s created. So, saya cari settingnya pada file xml milik ivman di /etc/ivman. Ada satu setting yaitu ttg umask yang defaultnya bernilai &#8216;007&#8242; yang mungkin berhubungan dgn masalah perijinan ini. Hmmm, ternyata dugaanku benar, umask mmg ada berhubungannya. Tanpa riset lebih lanjut lgs aku ganti aja menjadi &#8216;777&#8242; dgn harapan semua user diijinkan untuk mengakses, perkiraaan saya setting umask=chmod. Ternyata tetep gak bs <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  Sempet saya tanyakan ama temen2x Assistant Lab di kantor, ternyata mereka jg gak familiar. Googling bentar akhirnya semua jd jelas. Umask kebalikan dari chmod, jd nilai yg seharusnya adalah &#8216;000&#8242;. Reboot lagi tapi tetep gak bisa <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /><br />
<!--more--><br />
Karena udah mulai bosan ama hal spt ini, saya putuskan melakukan cara kedua. Bikin autologinnya menjadi user root, jd apapun yg diset ivman pasti bisa dibaca. The problem is, taruh dimana setting autologin nya ? Akhirnya aku ubek2x yg namanya /etc, semua file yg sekiranya berhubungan autolgin saya baca semua. Mulai file inittab sampai file dan direktori rc dan temen2xnya. Tetep gak nemu <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  akhirnya saya coba set autologin pake MCC dan ternyata malah paket autologin tdk terinstall. Heeeh, lha selama ini saya autologin pake apa ? Ok, saya turuti permintaanya, install paket autologin nya. Trus saya pilih user root kemudian reboot. Tp apa yg terjadi, tetep aja login pake user live <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  And then I gave up, I don&#8217;t want to spend more time for something that should running out of the box&#8230;</p>
<p>Well, Saya tidak mengira hanya untuk sebuah Media Center dengan fitur yg sederhana saja menghabiskan waktu dan tenaga sebanyak ini. Udah gitu gagal pula <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  Positifnya, saya skr jd lebih tahu proses internal booting Linux. Akhirnya saya putuskan untuk tetep memakai GeexBox dan istri saya harus bisa menerima tampilan UI GeexBox yang terlalu sederhana tersebut <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Using GeexBox everything work since the first time I installed it to CF.</p>
<p>Tapi terus terang saya masih penasaran mengenai Freevo. Maybe another time or another project&#8230;</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Searching for My 'Ideal' media center]]></title>
<link>http://slowgeek.wordpress.com/2009/04/08/searching-for-my-ideal-media-center/</link>
<pubDate>Wed, 08 Apr 2009 03:29:21 +0000</pubDate>
<dc:creator>slowgeek</dc:creator>
<guid>http://slowgeek.wordpress.com/2009/04/08/searching-for-my-ideal-media-center/</guid>
<description><![CDATA[Beberapa hari terakhir ini saya menghabiskan banyak waktu untuk melakukan riset mengenai software me]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Beberapa hari terakhir ini saya menghabiskan banyak waktu untuk melakukan riset mengenai software media center. Mulai yang berbasis Windows sampai dengan Linux (pengennya sih pake Haiku, hehehe)</p>
<p>Anyway berikut ini kriteria media center yang saya cari :</p>
<ol>
<li>Lightweight</li>
<p>krn berjalan di pc memakai prosesor VIA C3 dgn Memory 256 MB</p>
<li>Running from Compact Flash</li>
<li>Support TV &#38; FM Radio</li>
<li>Basic support : Video player, Music Player &#38; Picture Viewer</li>
<li>WAF (Wife Accepted Factor) <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  </li>
</ol>
<p>Dengan kriteria diatas mestinya mudah bukan ? Well, I&#8217;m completely wrong about that <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /><br />
<!--more--><br />
Pertama2x mengenai pemilihan OS. Karena saya ingin diinstall ke CF maka Windows XP bukan menjadi pilihan utama. Ya, saya tahu saya bisa melakukan kustomisasi dengan aplikasi seperti nlite atau xplite untuk mendietkan Windows menjadi lebih ramping. I&#8217;ve done that in the past. Actually I succeeded making under 300 MB Windows XP installation with everything working perfectly. Tapi masalahnya pada terletak pada software media center (MC) nya  itu sendiri. Tidak ada MC di Windows yang cukup ringan untuk berjalan di prosesor VIA C3. Saya sudah mencoba XBMC, Media Portal, Elisa, Meebo dan ada satu lg yg saya lupa namanya. Bahkan saya mencoba interface untuk CarPC seperti FreeRunner dan FreeIce hanya untuk mencari interface yang ringan dan tidak bloat (coba pake FreeIce, it&#8217;s the favorite so far). Tp tidak ada yang berjalan lancar pada sistem saya. Jadi jalan terakhir harus memakai Linux.</p>
<p>Sebenarnya ada satu Distro Linux untuk MC yang sampe saat ini tetap saya pakai dan selalu menjadi favorite. Distro tersebut adalah GeexBox. In fact, tinggal install GeexBox ke CF maka selesai sudah. Hampit semua kriteria diatas terpenuhi dengan memakai Geexbox. Hanya pada 1 hal GeexBox gagal, which is WAF <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  UI GeexBox terlalu sederhana yg menyebabkan Istri saya tidak tertarik memakainya <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>So the journey continue&#8230;&#8230;</p>
<p>Untung ada <a href="http://www.telematicsfreedom.org/en/project/14/floss-media-center-state-art">site ini</a> yang banyak membantu kondisi Open Source MC saat ini. Dari daftar tersebut ada 2 aplikasi yang menjadi perhatian saya, Freevo dan MyMediaSystem (MMS). I&#8217;ve tried MMS in the past too, try to compile it under Puppy Linux. Berhasil sih, cuman butuh proses yg lama untuk belajar dan compilasinya. Ditambah lagi pada versi terbaru 1.10 tidak support Radio lagi <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> . Jadi satu2xnya harapan ada pada pundak Freevo <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Freevo yang ada skr ini msh merupakan versi lama yaitu versi 1.83. Pengembangan untuk versi 2.x berjalan sangat lamban. Malah kl tdk salah mau direwrite ulang. GeexBox yg dulu berencana memakai Freevo 2.x sebagai basis MC terpaksa meninggalkan dan sekarang malah sedang membangun MC versi mereka sendiri (Enna). </p>
<p>Krn pengen cepet selesai maka saya berusaha menggunakan Distro Linux khusus Freevo yg ada, yaitu FreevoLive dan Piren. Pertama saya coba Piren karena lebih up2date (berbasis Debian Lenny). Sayangnya gagal ketika diinstall ke CF <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  Karena berbasis Debian maka saya coba install Debian nya yg asli. Ternyata gagal juga <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> . Kemudian saya menemukan <a href="http://doc.freevo.org/Hardware/CompactFlash">dokumentasi</a> mengenai installasi Freevo pada CF menggunakan Ubuntu Intrepid. Saya mencoba langkah demi langkah sesuai dokumentasi tp tetep gagal juga. Ternyata Debian dan Ubuntu hanya support CF dengan konverter CF to IDE yg menggunakan UDMA. Sayangnya yg saya punya hanya support PIO4. So back to zero again&#8230;</p>
<p>Akhirnya saya mencoba FreevoLive (berbasis Mandriva 2007.1 Spring), dan ternyata berhasil install ke CF <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Horay&#8230;. <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  tp ternyata muncul permasalahan baru. Freevo yg dipakai ternyata versi 1.7.3, cukup lama karena versi terbaru utk Mandriva adalah versi 1.8.0 (lama juga sih, tp utk saat ini blm ada pilihan lain&#8230;).<br />
Saya coba mengupdate Freevonya lebih dahulu. Berhubung ini pengalaman pertama saya mengoprek Mandriva maka saya sempet bingung jg melakukan automatic update. Karena udah tidak sabar (udah banyak waktu yg saya habiskan utk masalah MCE ini) maka saya update manual, yaitu download paket rpm nya satu persatu. Setelah melalui dependency hell akhirnya kelar juga updatenya (note to myself, don&#8217;t try to update Mandriva manually because it&#8217;s really exhausted). Tp ketika dijalankan memakai automatic login (user biasa, bukan root) jadi malah gagal <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  ternyata harus mengetikkan perintah &#8216;freevo cache&#8217; dahulu ketika selesai update. Akhirnya bisa jalan juga, hehehe&#8230;.</p>
<p>Tp kok gak support automount untuk USB storage ya. Padahal ketika pake XFCE bisa lgs dimount <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  ya terpaksa oprek2x lg <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  Pertama saya coba pake setting plugin bawaan Freevo, gagal <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  Browsing sebentar ternyata bisa dilakukan menggunakan usbmount. Cari usbmount utk Mandriva, tidak ada <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  Googling lagi nemu pmount. Cari pmount untuk Mandriva ternyata ada <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Install pmount, sukses ! trus pmount nya hrs diapakan nih ? Googling lg, ternyata pmount tidak bisa otomatis, hrs diketikkan manual <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  udah mulai nyerah nih&#8230; Coba googling sekali lg nemu ivman. ivman handler otomatis untuk even HAL yang kebetulan biasa dipake bareng pmount. Seep. Trus cari ivman for Mandrive, ketemu. Lgs aja install, sukses !. Coba jalankan ivman dan tancepin usb flashnya, sukses ! <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Akhirnya&#8230; <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  skr restart menggunakan automatic login (bukan root), gagal <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  user biasa tidak dpt ijin untuk mengakses folder hasil mount yg dibikin ivman. Googling lg, oops udah jam 7.00. Waktunya ngantor dulu <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Diterusin entar malem, tinggal dikit lg nih <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Vim &amp; l'indentation]]></title>
<link>http://skywalker13.wordpress.com/2009/04/04/vim-lindentation/</link>
<pubDate>Sat, 04 Apr 2009 12:56:44 +0000</pubDate>
<dc:creator>Mathieu SCHROETER</dc:creator>
<guid>http://skywalker13.wordpress.com/2009/04/04/vim-lindentation/</guid>
<description><![CDATA[Hello, S&#8217;il y a bien quelque chose qui me dérange dans les codes sources se sont les mélanges ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p style="text-align:justify;">Hello,</p>
<p style="text-align:justify;">S&#8217;il y a bien quelque chose qui me dérange dans les codes sources se sont les mélanges entre les tabulations et les espaces avec l&#8217;indentation. Une des justification de ne pas utiliser les deux façons de faire en même temps, est tout simplement le résultat d&#8217;un `diff`. La première colonne du `diff &#8211;unified` est réservée à un espace, un &#8216;-&#8217; ou alors un &#8216;+&#8217;. Ainsi lorsqu&#8217;un patch est lu et que les tabulations se mélangent avec les espaces, les éléments ne sont plus alignés comme dans cet exemple:</p>
<pre class="brush: diff;">
 void foobar (void)
 {
-        printf (&#34;Hello &#34;);
+	printf (&#34;World!\n&#34;);
 }
</pre>
<p style="text-align:justify;">Le premier <em>printf</em> utilisant 8 espaces et le second une tabulation. <strong>(à noter que l&#8217;affichage dans WordPress est faussé, à moins de regarder le code en cliquant sur le lien &#8220;view plain&#8221;)</strong></p>
<p style="text-align:justify;">Souvent dans les sources avec une indentation de 4 espaces, les tabulations sont utilisées pour chaque 8 espaces. Il y a donc régulièrement des lignes qui mélangent les deux en commençant par une tabulation, puis 4 espaces afin d&#8217;atteindre le 3ème niveau, et ainsi de suite.</p>
<p style="text-align:justify;">Alors je n&#8217;ai rien contre les tabulations, mais seulement si elles sont utilisées pour représenter une indentation de 8 colonnes tel que c&#8217;est le cas dans le noyau Linux. Il y a même parfois pire. Certaines personnes changent la configuration du TAB afin qu&#8217;il fasse 4 colonnes au lieu de 8 (qui est la valeur par défaut). Ainsi pour les autres développeurs, la lecture du code est très difficile. Chose qui ne peut en aucun cas arriver avec des espaces.</p>
<h3 style="text-align:justify;"><a href="http://www.vim.org">Vim</a></h3>
<p style="text-align:justify;"><img class="alignright size-thumbnail wp-image-544" title="Vim" src="http://skywalker13.wordpress.com/files/2009/04/wiki.png?w=83" alt="Vim" width="83" height="96" />Mon but n&#8217;est pas d&#8217;ouvrir un troll entre Vi(m) et Emacs. En ce qui me concerne, j&#8217;utilise Vim pour une raison &#8220;historique&#8221;. C&#8217;est tout simplement le premier éditeur de texte évolué que j&#8217;ai utilisé sous Linux et je n&#8217;ai jamais eu l&#8217;envie de changer mes habitudes, celui-ci me donne entière satisfaction.</p>
<p style="text-align:justify;">Afin de pouvoir travailler dans de bonnes conditions pour le développement, voici ma configuration actuelle de Vim (~/.vimrc).</p>
<pre class="brush: plain;">
&#34; Global settings
:set nocompatible
:syntax on
:set hlsearch
:set shiftwidth=2
:set background=dark
:set cursorline

&#34; Show line number
:set number
:highlight LineNr term=bold ctermfg=darkgray guifg=darkgray

&#34; Special configuration for development
:filetype on
:autocmd FileType c,cpp,cxx,h set cindent&#124;set tabstop=8&#124;set softtabstop=2&#124;set expandtab
:autocmd FileType make setlocal noexpandtab

&#34; Special highlighting for Doxygen
:let g:load_doxygen_syntax=1

&#34; Show when a line exceeds 80 chars
:au BufWinEnter * let w:m1=matchadd('ErrorMsg', '\%&#62;80v.\+', -1)

&#34; Highlight Tabs and Spaces
:highlight Tab ctermbg=darkgray guibg=darkgray
:highlight Space ctermbg=darkblue guibg=darkblue
:au BufWinEnter * let w:m2=matchadd('Tab', '\t', -1)
:au BufWinEnter * let w:m3=matchadd('Space', '\s\+$\&#124; \+\ze\t', -1)
:set list listchars=tab:»·,trail:·
</pre>
<p style="text-align:justify;">En plus de la coloration syntaxique, il y a quelques paramètres pour éviter des bavures dans le code. L&#8217;un d&#8217;eux permet de montrer explicitement si une ligne dépasse les 80 caractères. Elles apparaissent en rouge mais ne sont pas coupées. Parfois il est voulu de dépasser cette limite. Deux autres paramètres mettent en évidence les espaces non désirés (à la fin d&#8217;une ligne par exemple), ainsi que les tabulations.</p>
<p style="text-align:justify;">Il y a également des paramètres pour faciliter l&#8217;indentation. Celle-ci est définie pour 2 espaces tout en affichant les tabulations sur 8 colonnes. Il faut aussi être conscient que les &#8220;highlights&#8221; ont un prix et qu&#8217;ils ralentissent l&#8217;affichage de manière significative.</p>
<p style="text-align:justify;">Vous pouvez voir ci-dessous un &#8220;screenshot&#8221; de Vim avec une tabulation et des espaces non-désirés (qui utilisent la configuration susmentionnée).</p>
<div id="attachment_539" class="wp-caption aligncenter" style="width: 410px"><a href="http://skywalker13.wordpress.com/files/2009/04/vim_highlight.png"><img class="size-medium wp-image-539" title="vim_highlight" src="http://skywalker13.wordpress.com/files/2009/04/vim_highlight.png?w=300" alt="vim_highlight" width="400" height="147" /></a><p class="wp-caption-text">Vim (cliquez sur l&#39;image pour la voir à sa taille original)</p></div>
<ul>
<li>Une doc complète sur Vim: <a href="http://www.swaroopch.com/notes/Vim_fr">www.swaroopch.com/notes/Vim_fr</a></li>
</ul>
<p style="text-align:justify;">A bientôt,</p>
<p style="text-align:justify;padding-left:30px;">Mathieu SCHROETER</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Valhalla Scanner]]></title>
<link>http://skywalker13.wordpress.com/2009/03/14/valhalla/</link>
<pubDate>Sat, 14 Mar 2009 10:59:56 +0000</pubDate>
<dc:creator>Mathieu SCHROETER</dc:creator>
<guid>http://skywalker13.wordpress.com/2009/03/14/valhalla/</guid>
<description><![CDATA[Hello, Un petit nouveau a fait son entrée dans les dépôts de GeeXboX. C&#8217;est un projet qui est ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p style="text-align:justify;">Hello,</p>
<p style="text-align:justify;">Un petit nouveau a fait son entrée dans les dépôts de GeeXboX. C&#8217;est un projet qui est né suite à quelques expériences négatives avec une autre bibliothèque. Elle m&#8217;avait alors motivé à en écrire une afin d&#8217;y apporter une vision un peu différente. Le but de Valhalla (ou libvalhalla), est très simple, elle va scanner des emplacements sur votre disque dur (par exemple) afin d&#8217;y trouver des fichiers audio/video pour les référencer dans une base de données. Il est alors facile ensuite d&#8217;y effectuer des requêtes permettant de générer des listes d&#8217;artistes, d&#8217;albums, etc,&#8230;</p>
<p style="text-align:justify;">Mais tout d&#8217;abord.. pourquoi Valhalla?</p>
<blockquote>
<p style="text-align:justify;">Dans la <a title="Mythologie nordique" href="http://fr.wikipedia.org/wiki/Mythologie_nordique">mythologie nordique</a>, la <strong>Valhöll</strong> (ou Walhalla, Valhalla, Valhalle), demeure-des-occis, est le lieu où les guerriers valeureux sont amenés. C&#8217;est sur les champs de bataille que des vierges guerrières (pour les celts) ou des <a title="Valkyrie" href="http://fr.wikipedia.org/wiki/Valkyrie">Valkyries</a> (pour les germains), cherchent et récupèrent les hommes les plus braves et les plus valeureux afin de les ramener dans <a title="Ásgard" href="http://fr.wikipedia.org/wiki/%C3%81sgard">Ásgard</a>, où <a title="Odin" href="http://fr.wikipedia.org/wiki/Odin">Odin</a> les attend pour les préparer à la bataille finale, le <a title="Ragnarök" href="http://fr.wikipedia.org/wiki/Ragnar%C3%B6k">Ragnarök</a>.<br />
Dans la Valhöll(palais de Thor), les guerriers alors nommés <a title="Einherjar" href="http://fr.wikipedia.org/wiki/Einherjar">Einherjar</a> sont heureux : ils combattent, se tuent, renaissent pour encore se pourfendre dans un champ clos.</p>
<p><span style="color:#808080;"><span style="font-size:80%;">Valhöll. (2009, mars 10). <em>Wikipédia, l&#8217;encyclopédie libre</em>. Page consultée le 17:42, mars 12, 2009 à partir de <a class="external free" title="http://fr.wikipedia.org/w/index.php?title=Valh%C3%B6ll&#38;oldid=38802776" rel="nofollow" href="http://fr.wikipedia.org/w/index.php?title=Valh%C3%B6ll&#38;oldid=38802776">http://fr.wikipedia.org/w/index.php?title=Valh%C3%B6ll&#38;oldid=38802776</a>.</span></span></p></blockquote>
<p style="text-align:justify;">Je cherchais un nom qui sort de l&#8217;ordinaire tout en gardant un sens par rapport à la fonctionnalité de cette bibliothèque. Si la définition de La Valhalla ci-dessus ne vous a pas convaincu, imaginez que les scanners sont les Valkyries, que les braves sont les fichiers audio/video, et qu&#8217;elles les emmènent à la Valhalla (dans la base de donnée). Ceux-ci mourant et renaissant sans cesse dans un champ clos (les fichiers pouvant être rescannés en boucle afin d&#8217;y repérer les modifications).</p>
<p><em>(A noter que Valgrind est la porte qui mène à La Valhalla)</em></p>
<h3>Fonctionnement</h3>
<div id="attachment_459" class="wp-caption alignright" style="width: 161px"><img class="size-medium wp-image-459" title="SQLite" src="http://skywalker13.wordpress.com/files/2009/03/pastedpic_02282009_130424.png?w=300" alt="SQLite" width="151" height="45" /><p class="wp-caption-text">Small. Fast. Reliable.</p></div>
<p style="text-align:justify;">Valhalla se base sur deux bibliothèques principales. Tout d&#8217;abord il y a la libavformat (de FFmpeg) qui permet de récupérer les méta-données, puis SQLite qui s&#8217;occupe de gérer la base de donnée. Si ces libs ont été choisies c&#8217;est pour de bonnes raisons. Comme je l&#8217;ai dis plus haut, libvalhalla est née suit à des expériences avec une autre lib. En premier lieu, cela concerne le moyen pour récupérer les méta-données. Sans rentrer dans des détails inutiles, pour se faire il est nécessaire de passer par des démuxeurs et en créer peut avoir un avantage certain sur la rapidité. Néanmoins beaucoup de travail serait nécessaire pour gérer la plupart des formats de fichier, et c&#8217;est ici qu&#8217;intervient FFmpeg. Cette bibliothèque étant la plus aboutie, elle supporte énormément de formats. Il est donc facile de récupérer les méta-données sans se soucier du &#8220;comment&#8221;. La deuxième raison est purement technique. Certains aspects dans la construction de l&#8217;autre lib ne me plaisaient pas (à tord ou à raison).<br />
Concernant SQLite, c&#8217;est un excellent outil (et très léger et rapide) de gestion de base de données.</p>
<h4 style="text-align:justify;">Architecture</h4>
<p style="text-align:justify;">Avant d&#8217;aborder l&#8217;architecture en elle-même j&#8217;aimerais expliquer mes choix. Tout d&#8217;abord Valhalla repose sur les threads. Parce que j&#8217;aime travailler avec les threads même si de nombreuses personnes estiment que les &#8220;threads are evil&#8221;. Ensuite il y a une raison liée à l&#8217;aspect pratique et à l&#8217;aspect vitesse. D&#8217;un point de vue pratique, les threads sont un moyen facile de créer des tâches parallèles et aussi de créer des tâches de fond. Il est intéressant dans le cas d&#8217;Enna, de pouvoir l&#8217;utiliser sans être bloqué par Valhalla.</p>
<p style="text-align:justify;padding-left:30px;">J&#8217;entends certaines personnes me parler des fork(), alors oui c&#8217;est également un moyen.. mais franchement, communiquer entre des sous-processus c&#8217;est pénible et nettement moins efficace que de le faire directement entre deux threads qui partagent le même espace mémoire. Les fork() doivent être utilisés si le contexte le demande. Tel que c&#8217;est le cas dans libplayer pour travailler avec MPlayer.</p>
<p style="text-align:justify;">L&#8217;aspect vitesse est également intéressant car aujourd&#8217;hui il est courant de trouver des ordinateurs avec au moins 2 cores. Alors quitte à faire travailler les démuxeurs sur les deux (ou plus), je vous montrerais des petites statistiques plus loin.</p>
<p style="text-align:justify;">La figure ci-dessous présente une vision simplifiée de l&#8217;architecture.</p>
<p style="text-align:center;"><a href="http://skywalker13.wordpress.com/files/2009/03/valhalla-internals-old.png"><img class="aligncenter size-full wp-image-770" style="border:0 none;" title="Valhalla Internals" src="http://skywalker13.wordpress.com/files/2009/03/valhalla-internals-old.png" alt="Valhalla Internals" width="450" height="318" /></a></p>
<p style="text-align:justify;">Il y a trois parties principales. En vert, le scanner s&#8217;occupe de chercher tous les fichiers qui respectent certains critères relatifs à leur nom. Puis chaque référence aux fichiers est envoyée à la partie jaune (Database) qui va vérifier si le fichier existe déjà dans la base de donnée ou s&#8217;il est nouveau. Si des modifications sont nécessaires, alors il est envoyé à la partie orange (Parser) afin que les méta-données soient récupérées. Le parser renvoit les données à la Database qui va alors insérer les modifications adéquates dans la base de données à travers SQLite. Chaque bloc représenté dans la figure est un thread. La partie orange peut contenir plusieurs parsers et donc plusieurs threads.</p>
<h4 style="text-align:justify;">FFmpeg</h4>
<div id="attachment_437" class="wp-caption alignright" style="width: 149px"><img class="size-medium wp-image-437" title="FFmpeg" src="http://skywalker13.wordpress.com/files/2009/03/pastedpic_02282009_130747.png?w=300" alt="FFmpeg" width="139" height="34" /><p class="wp-caption-text">A complete, cross-platform solution for audio and video.</p></div>
<p style="text-align:justify;">Les parsers utilisent la bibliothèque libavformat d&#8217;FFmpeg pour réaliser l&#8217;extraction des méta-données. Il y a cependant un problème de vitesse. libavformat fait appel à des fonctions de &#8220;probe&#8221; afin d&#8217;identifier le format du fichier pour lui assigner le bon démuxeur. Et dans certains cas (fichiers altérés?), le &#8220;probe&#8221; prend beaucoup de temps car il y a beaucoup de démuxeurs et qu&#8217;il est parfois nécessaire de tester plusieurs fois un même fichier (en avançant dans les données) avant que la lib puisse deviner lequel est le bon.</p>
<p style="text-align:justify;">L&#8217;idée est donc de proposer un format directement à libavformat au lieu de le laisser procéder tout seul à la détection. Le moyen utilisé est très simple et efficace. Il est rare que le suffixe d&#8217;un fichier ne correspond pas au bon format. La première étape est donc de récupérer le nom du format qui est lié au suffixe (à l&#8217;extension). Typiquement, si les fichiers sont des .mp3, le nom est tout simplement &#8220;mp3&#8243;. Voir les détails dans <a href="http://hg.geexbox.org/libvalhalla/file/tip/src/lavf_utils.c">les sources</a>.</p>
<p style="text-align:justify;">
<pre class="brush: cpp;">
name = suffix_fmt_guess (file);
if (name)
  fmt = av_find_input_format (name);
</pre>
<p style="text-align:justify;">La deuxième étape est un petit peu plus compliquée. Bien que l&#8217;on a désormais une idée sur le démuxeur, il est exclus de l&#8217;utiliser tel quel. Si un format est forcé à l&#8217;ouverture du fichier, aucun test n&#8217;est réalisé par libavformat. Ainsi, une fonction de probe() a été écrite pour tester le démuxeur. L&#8217;avantage cette fois vient du fait qu&#8217;un seul démuxeur est testé, et non plus tous les démuxeurs de libavformat. Le gain en vitesse est impressionnant (j&#8217;ai constaté un gain de plus d&#8217;un facteur dix avec cette technique et un peu plus de 1000 MP3/OGG).</p>
<pre class="brush: cpp;">
if (fmt)
{
  int score = parser_probe (fmt, file);
  if (!score) /* Bad score? */
    fmt = NULL;
}
</pre>
<p style="text-align:justify;">Si vous êtes intéressé par la fonction parser_probe(), je vous invite à directement la consulter dans <a href="http://hg.geexbox.org/libvalhalla/file/tip/src/valhalla.c">les sources</a>. En résumé, la fonction est inspirée de libavformat/utils.c::av_open_input_file(), et dépend fortement de l&#8217;implémentation interne de libavformat en ce qui concerne les scores retournés par les fonctions de probe().</p>
<h4 style="text-align:justify;">Les priorités</h4>
<p style="text-align:justify;">Si vous désirez définir des priorités non temps réelles à des threads, voici l&#8217;astuce:</p>
<p style="text-align:justify;">
<pre class="brush: cpp;">
#include &lt;unistd.h&gt;
#include &lt;sys/resource.h&gt;
#include &lt;sys/syscall.h&gt;

static inline void
my_setpriority (int prio)
{
  pid_t pid = syscall (__NR_gettid);
  setpriority (PRIO_PROCESS, pid, prio);
}
</pre>
<p style="text-align:justify;">La fonction gettid() n&#8217;existe pas dans la glibc, il est donc obligatoire de passer par un appel système. Et sans utiliser setpriority(), il n&#8217;est pas possible à ma connaissance de baisser la priorité en étant un simple utilisateur.</p>
<h3>Défaut de jeunesse</h3>
<p style="text-align:justify;">Malheureusement un défaut relativement important a été soulevé par Aurélien (un des leader du projet GeeXboX et développeur de FFmpeg). Les méta-données disponibles dans les fichiers audio/video peuvent être très différentes d&#8217;un format à l&#8217;autre. Valhalla est limité dans le nombre de meta-données supportées. Une future mise à jour majeure devrait apporter beaucoup plus de souplesse pour la gestion des méta-données. A priori cela ne semble pas si compliqué, mais si l&#8217;on considère le fait que la base de données suit un modèle relationnel, il est difficile d&#8217;être complètement générique.</p>
<p style="text-align:justify;">Je n&#8217;ai pas encore pris le temps d&#8217;étudier toutes les possibilités pour y remédier. Mais ça fait partie de mes priorités pour Valhalla.</p>
<h3>Enna</h3>
<p style="text-align:justify;">Mon but principal est d&#8217;utiliser Valhalla dans Enna. Ainsi un nouveau module à fait son apparition et permet de retrouver de manière thématique les albums, les artistes, les genres ainsi que les fichiers non-classés. Le module est également paramétrable depuis le fichier <em>~/.enna/enna.cfg</em> pour surtout y indiquer les répertoires à scanner.</p>
<p><code>[valhalla]<br />
path=file:///home/foo/music<br />
path=file:///home/bar/music<br />
verbosity=info<br />
parser_number=2<br />
commit_interval=128<br />
# &#60;=0 for infinite<br />
scan_loop=-1<br />
# time [sec] for sleeping between loops<br />
scan_sleep=900<br />
# 0: normal, -20: higher, 19 lower<br />
scan_priority=19</code></p>
<p style="text-align:justify;">Quelques paramètres méritent certaines explications. Tout d&#8217;abord vous pouvez indiquer autant de &#8220;path&#8221; que vous le désirez. Les paths ne sont pas scannés en parallèle, mais séquentiellement. Il n&#8217;y a pas beaucoup d&#8217;avantage de scanner  plusieurs répertoires en parallèle car les accès au disque ne seront pas plus rapide.<br />
Vous pouvez bien sûr changer la verbosité de la bibliothèque. L&#8217;intérêt est limité pour de simples utilisateurs, mais ça peut être utile dans des cas de debuggage.</p>
<h4 style="text-align:justify;">Nombre de parsers</h4>
<p style="text-align:justify;">L&#8217;option &#8220;parser_number&#8221; indique le nombre de parsers à créer. Par défaut, le nombre <strong>maximum</strong> est de 8. Ce chiffre peut être changé à la compilation de Valhalla en passant le define PARSER_NB_MAX=# dans le CFLAGS. Mais il faut garder à l&#8217;esprit qu&#8217;il est inutile de définir beaucoup de parsers car ça n&#8217;augmentera en rien la vitesse.</p>
<h4>Intervalle entre les commits</h4>
<p style="text-align:justify;">L&#8217;option &#8220;commit_interval&#8221; permet de dire chaque combien de fichiers, les données sont réellement inscrites dans la base de données. Moins cette valeur est grande, et moins le scan sera rapide car SQLite augmentera le nombre d&#8217;écritures sur le disque dur. J&#8217;ai constaté un gain de ~20 en passant d&#8217;une valeur de 1 à une valeur de 128. Si vous définissez une valeur plus grande, le gain ne sera plus tellement visible et les données s&#8217;accumuleront dans la RAM. Le fait de mettre une petite valeur est également plus sûr, car en cas de plantage, plus de données seront écrites. C&#8217;est donc aussi une question de bon sens.</p>
<h4>Bouclage du scan et temps entre les scans</h4>
<p style="text-align:justify;">L&#8217;option &#8220;scan_loop&#8221; indique le nombre de bouclage qui doivent être effectués pendant qu&#8217;Enna est exécuté. L&#8217;intérêt est de détecter les modifications et les nouveaux fichiers. En mettant une valeur de 1, le scan se fera uniquement au démarrage d&#8217;Enna. Par contre avec une valeur plus petite ou égale à 0, le scan se fera chaque &#8220;scan_sleep&#8221; secondes. Vous pouvez bien sûr donner une valeur supérieure tel que 2, 3, etc,.. pour définir exactement le nombre de bouclages désiré.</p>
<h4 style="text-align:justify;">Priorité du scan</h4>
<p style="text-align:justify;">L&#8217;option &#8220;scan_priority&#8221; permet de garantir que le scanner, le gestionnaire de la base de données ainsi que les parsers, ne puissent pas monopoliser les ressources de votre système. Le fait de donner une valeur de 19, garanti que Valhalla aura la priorité la plus basse et son comportement sera bien une tâche de fond. Par défaut un utilisateur à une priorité de 0, et tous les programmes exécutés ont une priorité de 0 (vous ne pouvez donc donner que des priorités inférieures (valeurs positives ou égales)). Si vous n&#8217;avez pas les droits appropriés et que vous donnez une priorité de -1 à -20, Valhalla gardera une priorité de 0. Par contre, si vous êtes root, alors vous pouvez mettre n&#8217;importe quel priorité. (Il n&#8217;est pas recommandé de mettre une priorité supérieure ou égale à Enna à moins d&#8217;affecter directement la lecture des fichiers et l&#8217;interface.)</p>
<h3 style="text-align:justify;">La suite</h3>
<p style="text-align:justify;">Comme je l&#8217;ai expliqué plus haut, il reste beaucoup de travail pour rendre la bibliothèque plus générique envers les méta-données. Mais il reste également du travail au niveau de l&#8217;API, en ce qui concerne les fonctions pour sélectionner les données dans la base de données, et ces fonctions dépendent directement des méta-données.</p>
<p style="text-align:justify;">Bien sûr, il est possible d&#8217;effectuer des requêtes sur la base de données sans passer par Valhalla. Mais dans ce cas il faut être conscient qu&#8217;il peut y avoir des problèmes de parallélisme. SQLite utilise fcntl() pour bloquer l&#8217;accès au fichier le temps des modifications. Mais sur certains systèmes de fichier, cela est buggé (voir les <a href="http://www.sqlite.org/faq.html#q5">explications  ici</a>).</p>
<p style="text-align:justify;">Quelques modifications mineures sont également prévues, comme l&#8217;ajout de filtres sur les paths, pour par exemple ignorer les fichiers et dossiers cachés. Et également un moyen de récupérer l&#8217;information si un fichier contient des flux audio, video ou audio+video.</p>
<p style="text-align:justify;">Une mise à jour concernera également l&#8217;ajout d&#8217;informations sur la version du fichier de base de données et la version de Valhalla. Car actuellement, si des modifications structurelles sont effectuées sur la base de données, Valhalla ne fait aucun contrôle sur le fichier qui a été créé par une ancienne version. Ce qui peut provoquer des erreurs plus ou moins imprévisibles lors de l&#8217;exécution d&#8217;un scan. Le temps que j&#8217;implémente cette partie, il est judicieux d&#8217;effacer le fichier <em>~/.enna/valhalla_music.db</em> lors d&#8217;une mise à jour de Valhalla.</p>
<h3 style="text-align:justify;">Télécharger</h3>
<p>Pour télécharger Valhalla, rien de plus simple:</p>
<p><code>hg clone http://hg.geexbox.org/libvalhalla</code></p>
<p>La compilation et l&#8217;installation se fait comme pour n&#8217;importe quel logiciel.</p>
<p><code>./configure &#38;&#38; make &#38;&#38; sudo make install</code></p>
<p>Pensez aussi à faire un `sudo ldconfig` pour être sûr que la lib soit référencée pour le chargeur de programme.</p>
<p>Il est également important (indispensable) d&#8217;utiliser une version <strong>récente</strong> d&#8217;FFmpeg!</p>
<h3>Quelques statistiques</h3>
<p style="text-align:justify;">Comme promis, voici quelques statistiques liées à la vitesse du scan. Le premier scan est toujours le plus long. La vitesse dépend principalement de la vitesse d&#8217;accès du média sur lequel se trouve les fichiers. Puis en second lieu, elle dépend également du cache effectué par le système de fichier. Mes quelques tests ont été fait sur une partitions EXT3 avec principalement des fichiers MP3 (dont des corrompus), des fichiers OGG, WMA et M4A. (le fichier de base de données est bien sûr effacé entre chaque essai). Il y a 1090 fichiers et mon système est dual-core.</p>
<h4 style="text-align:justify;">Premier scan (sans cache)</h4>
<p style="text-align:justify;">Run: parser=2 loop=1 wait=0 priority=19 commit-int=128<br />
Time elapsing: 24675.591000 msec, 24.675591 sec</p>
<h4 style="text-align:justify;">Quelques scans (même config + cache)</h4>
<p style="text-align:justify;">Time elapsing: 1049.802000 msec, 1.049802 sec<br />
Time elapsing: 1183.110000 msec, 1.183110 sec<br />
Time elapsing: 1066.583000 msec, 1.066583 sec</p>
<p style="text-align:justify;">La vitesse a énormément changée et pourtant la bibliothèque à fait exactement le même job. Le cache du système de fichier a un effet très important.</p>
<h4 style="text-align:justify;">Avec un seul parser (1 parser + cache)</h4>
<p>Run: parser=1 loop=1 wait=0 priority=19 commit-int=128<br />
Time elapsing: 1500.876000 msec, 1.500876 sec<br />
Time elapsing: 1436.085000 msec, 1.436085 sec<br />
Time elapsing: 1637.296000 msec, 1.637296 sec</p>
<p style="text-align:justify;">On note en moyenne 1.10 sec pour 2 parsers et 1.53 sec pour 1 parser. Vous me direz que ça n&#8217;a rien d&#8217;exceptionnel et vous avez tout a fait raison. La différence est de 430 ms entre les deux moyennes. Mais en réfléchissant un peu, cela représente qu&#8217;en même un gain de ~40%.<br />
Ces statistiques ne sont pas très exhaustives car 1090 fichiers ce n&#8217;est pas grand chose. Il faudrait également effectuer beaucoup plus de tests pour avoir une statistique relevante. Mon but était juste de vous montrer que le nombre de parsers ne fait pas de miracle. Et qu&#8217;avoir plus d&#8217;un parser lors du premier scan ne changera quasiment rien. Mais si vous avez beaucoup plus de fichiers que moi, (des dizaines de milliers) l&#8217;impacte sera bien plus grand.</p>
<h4 style="text-align:justify;">Avec un commit-int à 1 (+ cache)</h4>
<p>Run: parser=2 loop=1 wait=0 priority=19 commit-int=1<br />
Time elapsing: 20299.520000 msec, 20.299520 sec<br />
Time elapsing: 18831.318000 msec, 18.831318 sec<br />
Time elapsing: 19063.652000 msec, 19.063652 sec</p>
<p>Voyez comme l&#8217;intervalle entre les commits effectués par SQLite sont très important. Passer de 1.5 sec à 20 sec n&#8217;est pas du tout négligeable.</p>
<h4>Avec un commit-int à 1024 (+ cache)</h4>
<p>Run: parser=2 loop=1 wait=0 priority=19 commit-int=1024<br />
Time elapsing: 935.655000 msec, 0.935655 sec<br />
Time elapsing: 1018.052000 msec, 1.018052 sec<br />
Time elapsing: 953.042000 msec, 0.953042 sec</p>
<p style="text-align:justify;">Il est intéressant de noter qu&#8217;avec un intervalle de 1024, Valhalla arrive à descendre en dessous de la seconde. Maintenant vous comprendrez qu&#8217;il est difficile de trouver une configuration parfaite pour tout le monde. Mais le gain entre un intervalle de 128 ou de 1024 n&#8217;a plus beaucoup d&#8217;impact. Sans compter que 128 est plus sûr dans le cas d&#8217;un crash.</p>
<p><em>(Tous les tests ont été effectué avec l&#8217;outil test-valhalla directement disponible depuis les sources.)</em></p>
<h3>Conclusion</h3>
<p style="text-align:justify;">Il reste beaucoup de travail à faire, mais vous pouvez utiliser cette bibliothèque correctement dans l&#8217;état actuel. Les performances sont à mon avis très bonnes et le nombre de parsers sera sûrement plus significatif dans le futur, car certaines améliorations auront forcément un impact sur la vitesse de récupération des méta-données. Même sur un système mono-processeur (mono-core), il est judicieux de garder 2 parsers. Parfois certains fichiers sont relativement altérés et difficiles à parser. Le fait de garder un deuxième parser assure un bon enchaînement si l&#8217;un d&#8217;eux perd du temps.</p>
<p style="text-align:justify;">A bientôt,</p>
<p style="text-align:justify;padding-left:30px;">Mathieu SCHROETER</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[February 2009 Progress Report]]></title>
<link>http://gxben.wordpress.com/2009/03/04/february-2009-progress-report/</link>
<pubDate>Tue, 03 Mar 2009 22:04:45 +0000</pubDate>
<dc:creator>ben</dc:creator>
<guid>http://gxben.wordpress.com/2009/03/04/february-2009-progress-report/</guid>
<description><![CDATA[So, what happened in the GeeXboX world since FOSDEM and the beginning of 2009. As you all may have s]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>So, what happened in the GeeXboX world since FOSDEM and the beginning of 2009. As you all may have seen, the 1.2 (and even 1.2.1) release finally landed out. It was a big relief and seems to please a lot of people from now on. In the mean time, we&#8217;ve upgraded major GeeXboX components, namely Linux kernel and X.Org and the development tree is now a really big mess (a.k.a. everything crashes so bad we don&#8217;t even know where to look for). The Linux graphics parts is currently evolving quite fast and most of drivers are being completely rewritted, resulting in a lot of issues. Though, we&#8217;ll try to fix it ASAP, especially now that Enna has been included in GeeXboX as new default UI, in order to provide you very soon with the very first 2.0-alpha release.</p>
<p>For video decoding fans, it is good to know that MPlayer now natively supports VDPAU, the h/w video decoding framework from nVidia. When used with the adequate nVidia proprietary drivers for X.Org, it is now possible to make MPEG-1/2/4, H.264 and VC-1 video decoding done by your GPU. It is not yet included in GeeXboX, as it relies on the non-redistribuable  proprietary driver but we&#8217;re considering a way to optionally add it afterwards. In the mean time, an experimental branch of FFMpeg is available, which provides multi-threading support. This is a much more elegant solution that actually finally allows you to use more than 1 thread (or CPU core) at a time for video decoding. On my Intel Q6600, using the 4 cores actually provides a 3x faster decoding speed, which is simply awesome. This has not yet been included into GeeXboX but it&#8217;ll definitely be part of the next alpha release.</p>
<p>And now comes the most interesting part: news from Enna. Most of our time and resources are currently wasted on Enna, our next-gen UI. Nico recently did a lot of work on it in order to both simplify the code and fasten it quite a bit. On my side, I&#8217;ve just finished adding a new weather module, that makes use of Google Weather Web API to provide you weather forecast (up to 4 days). But the following screenshot is probably better for you to see the newly added stuff:</p>
<p><img class="aligncenter size-full wp-image-99" title="weather2" src="http://gxben.wordpress.com/files/2009/03/weather2.jpeg" alt="weather2" width="500" height="281" /></p>
<p>Davide, on his side has started working on Enna for the very first time and he already manage to create a new games module that looks for all games installed to your Linux desktop and allows you to start them out from Enna interface. Being our DVB/VDR guru, Davide is also working on a new TV module for Enna that would allow Enna to directly use VDR (VideoDisk Recorder) to grab and display DVB streams (with recording capabilities) but it&#8217;s a long time plan, and still far from being completed.</p>
<p>The major contribution from these last days probably comes from Mat, who introduces a new component called <em>libvalhalla</em> that actually is an ultra-fast multi-threaded media scanner library that extracts metadata from all of your audio files (through FFMpeg libs) and save them back to an SQLite database. He of course also wrote the Enna browser plugin that makes use of <em>libvalhalla</em> allowing user to browse his media library by different criterias such as artist, album and so on &#8230;</p>
<p>Pretty good, isn&#8217;t it ? Now I feel that you&#8217;re all eager to test out the alpha release :p So let&#8217;s get back to the code and try to fix it so that we can provide it to you whenever it&#8217;s possible <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[10 Live-CDs worth giving a try]]></title>
<link>http://digitizor.com/2009/02/28/10-live-cds-worth-giving-a-try/</link>
<pubDate>Sat, 28 Feb 2009 23:09:19 +0000</pubDate>
<dc:creator>The Digitizor</dc:creator>
<guid>http://digitizor.com/2009/02/28/10-live-cds-worth-giving-a-try/</guid>
<description><![CDATA[This is the first part of the article, you might like to read Part 2 Live CDs are unique un-putdowna]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p><em>This is the first part of the article, you might like to read <a href="http://digitizor.com/2009/03/07/10-live-cds-worth-giving-a-try-2/" target="_self">Part 2</a></em></p>
<p style="text-align:justify;"><img class="alignright size-full wp-image-1097" title="live cd review best linux windows - digitizor" src="http://digitizor.wordpress.com/files/2009/02/live-cd.jpg" alt="live cd review best linux windows - digitizor" width="62" height="62" />Live CDs are unique un-putdownables that have the ability to run a complete, modern operating system on a computer lacking mutable secondary storage, such as a hard disk drive. Using Live CDs you can get the envirenment of your ever-loved OS on any computer even without ainstalling or altering any settings in that computer. Today we review Ten (10) live cds which, we feel are very good in terms of the functionality they provide. We have mentioned the unique feature and funcationalty of every Live CD distro. Go ahead, and try one today!</p>
<p style="text-align:justify;"><strong><img class="alignleft size-full wp-image-1088" title="Puppy Linux Logo - Digitizor" src="http://digitizor.wordpress.com/files/2009/02/puppylogo96.png" alt="Puppy Linux Logo - Digitizor" width="96" height="96" /><a href="http://www.puppylinux.org/" target="_blank">Puppy Linux</a></strong>: Puppy really is small, the live-CD typically being 85MB, yet there really is a complete set of GUI applications. Being so small, Puppy usually loads completely into RAM, which accounts for it&#8217;s incredible speed. Puppy Linux is extremely userfriendly and is highly recommended for Linux Newbies. It has all the applications required for daily use and can run multimedia out-of-the box <em>(and they say playing videos on Linux is not easy)</em>. Puppy Linux is very low on system resources and will breathe new life into old PCs.</p>
<p style="text-align:justify;"><img class="alignright size-full wp-image-1089" title="knoppix linux live cd logo - digitizor" src="http://digitizor.wordpress.com/files/2009/02/knoppix-logo.gif" alt="knoppix linux live cd logo - digitizor" width="89" height="93" /><a href="http://www.knopper.net/knoppix/index-en.html" target="_blank"><strong>KNOPPIX</strong></a> is a bootable Live system on CD or DVD, consisting of a representative collection of Linux software. Knoppix boasts about automatic hardware detection, and support for many graphics cards, sound cards, SCSI and USB devices and other peripherals, the works. KNOPPIX can be used as a productive Linux system for the desktop, educational CD, rescue system, or adapted and used as a platform for commercial software product demos. It is not necessary to install anything on a hard disk. Due to Knoppix&#8217;s on-the-fly decompression, the CD can have up to 2 GB of executable software installed on it. The DVD &#8220;Maxi&#8221; edition has over 8GB of software.</p>
<p style="text-align:justify;"><img class="alignleft size-full wp-image-1090" title="slax linux, kill bill edition logo - digitizor" src="http://digitizor.wordpress.com/files/2009/02/slax.png" alt="slax linux, kill bill edition logo - digitizor" width="86" height="79" /><a href="http://www.slax.org/" target="_blank"><strong>Slax</strong></a> is a portable, small and fast Linux operating system with a modular approach and outstanding design. Despite its small size, Slax provides a wide collection of pre-installed software for daily use, including a well organized graphical user interface and useful recovery tools for system administrators. The modular approach gives you the ability to include any other software in Slax easily. Say, if you&#8217;re missing your favourite text editor, networking tool or game, simply download a module with the software and copy it to Slax. You don&#8217;t even need to install or configure anything.</p>
<p style="text-align:justify;"><img class="alignright size-full wp-image-1093" title="Ultimate Boot CD for Windows Logo (UBCD) - digitizor" src="http://digitizor.wordpress.com/files/2009/02/sitebanner.jpg" alt="Ultimate Boot CD for Windows Logo (UBCD) - digitizor" width="100" height="74" /><a href="http://www.ubcd4win.com/" target="_blank"><strong>UBCD for Windows</strong></a> is a bootable recovery CD that contains software used for repairing, restoring, or diagnosing almost any computer problem which has Windows Operating System installed on it. Almost all software included in UBCD4Win are freeware utilities for Windows. UBCD4Win is based on <a href="http://www.nu2.nu/pebuilder/" target="_blank">Bart&#8217;s PE</a>. Bart&#8217;s PE builds a Windows &#8220;pre-install&#8221; environment CD, basically a simple Windows® XP booted from CD. UBCD4Win includes network support and allows you the ability to modify NTFS volumes, recover deleted files, create new NTFS volumes, scan hard drives for viruses, etc.</p>
<p style="text-align:justify;"><strong><img class="alignleft size-full wp-image-1095" title="geexbox logo home theatre linux - digitizor" src="http://digitizor.wordpress.com/files/2009/02/geexbox-logo-trans.png" alt="geexbox logo home theatre linux - digitizor" width="71" height="90" /><a href="http://geexbox.org/en/index.html" target="_blank">GeexBox</a></strong> is a standalone LiveCD-based distribution which aims at turning your computer into a so called HTPC (Home Theater PC) or Media Center. It&#8217;s a ready to boot operating system than works on any Pentium-class x86 computer or PowerPC Macintosh, implying no software requirement. You can even use it on a diskless computer, the whole system being loaded in RAM. Despite his tiny ISO image size <em>(~20MB)</em>, the distribution comes with a complete and automatic hardware detection, not requiring any driver to be added. It supports playback of nearly any kind of audio/video and image files and all known codecs and containers are shipped in, allowing playing them through various physical supports, either being CD, DVD, HDD, LAN or Internet.</p>
<p style="text-align:justify;">This article will be continued in it`s second part where we will tell you about five more awesome Live-CD based distributions. So keep watching till we author the Part 2. You can read our Linux related articles in the <a href="http://digitizor.wordpress.com/category/linux/" target="_blank">Linux Section</a>.</p>
<p style="text-align:justify;"><em>This is the first part of the article, you might like to read <a href="http://digitizor.com/2009/03/07/10-live-cds-worth-giving-a-try-2/" target="_self">Part 2</a></em></p>
<p><span class="technoratitag">Technorati Tags: <a rel="tag" href="http://www.technorati.com/tags/live cd">live cd</a>, <a rel="tag" href="http://www.technorati.com/tags/linux">linux</a>, <a rel="tag" href="http://www.technorati.com/tags/windows">windows</a>, <a rel="tag" href="http://www.technorati.com/tags/software">software</a></span></p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[GeexBox !!!]]></title>
<link>http://warlockcyber.wordpress.com/2009/02/16/geexbox/</link>
<pubDate>Mon, 16 Feb 2009 01:14:20 +0000</pubDate>
<dc:creator>war10ck3d</dc:creator>
<guid>http://warlockcyber.wordpress.com/2009/02/16/geexbox/</guid>
<description><![CDATA[GeexBox adalah Linux multimedia yang mampu menjadikan komputer Anda sebagai media hiburan. GeexBox b]]></description>
<content:encoded><![CDATA[GeexBox adalah Linux multimedia yang mampu menjadikan komputer Anda sebagai media hiburan. GeexBox b]]></content:encoded>
</item>
<item>
<title><![CDATA[Instalamos Ubuntu 8.10, Ahora Qué?]]></title>
<link>http://horusint.wordpress.com/2009/02/15/instalamos-ubuntu-810-ahora-que/</link>
<pubDate>Sun, 15 Feb 2009 03:48:35 +0000</pubDate>
<dc:creator>Horus Int</dc:creator>
<guid>http://horusint.wordpress.com/2009/02/15/instalamos-ubuntu-810-ahora-que/</guid>
<description><![CDATA[Esta es una nota de Es excelente por lo cual la replico aqui como consulta. En principio me autoplag]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Esta es una nota de <a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/"><br />
Es excelente por lo cual la replico aqui como consulta.</a></p>
<blockquote><p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">En principio me autoplagio y actualizo este post que escribi hace tiempo:<br />
Cosas a hacer despues de instar Ubuntu 8.04 Hardy Heron,<br />
pero actualizando alguna cosilla con respecto a la nueva version.<br />
De todas formas recomiendo leer el post anterior pues muy pocas cosas<br />
cambian y ademas se completa bastante con los mas de 170 comentarios que vosotros<br />
habeis ido dejando.</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Aqui un “popurri” interesante de cosas que podemos hacer y aplicaciones que podemos<br />
instalar justo despues de acabar la instalacion de Ubuntu 8.10 Intrepid Ibex.<br />
Vamos al grano.</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* Instalar software mas rapidamente.<br />
Suele ocurrir (y especialmente) cuando sale una nueva version de Ubuntu, que los repositorios desde los<br />
cuales nos solemos descargar software estan muy saturados.<br />
Si queremos descargar e instalar el software mas rapidamente, tendremos que modificar la lista de repositorios.<br />
Existe una opcion de Synaptic, que nos permite seleccionar un servidor mas cercano a nuestra region.<br />
Para cambiar este servidor a uno mas cercano vamos a Sistema &#62; Administracion &#62; Origenes de software<br />
y en la pestaña “Software de Ubuntu”, seleccionamos “descargar desde:” indicando la region mas cercana<br />
a la nuestra.</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* Instalar el software basico de compilacion<br />
Si queremos compilar algun paquete del que solo tenemos el codigo fuente, tendremos que instalar los paquetes<br />
basicos de compilacion. Lo instalamos con:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ sudo aptitude install build-essential</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">y a partir de entonces ya podemos compilar.</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* Instalar los extra restrictivos.</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Hay ciertos paquetes que no vienen por defecto en Ubuntu por cuestiones legales.<br />
Cuando se instala ubuntu, por defecto y debido a un tema de licencias no instala<br />
todo ese software comercial que no ha liberado el codigo fuente, como por ejemplo puede ser<br />
el plugin de flash, o los codecs para poder reproducir algunos formatos de video.<br />
Existe un metapaquete (un paquete que agrupa e instala muchos mas paquetes)<br />
llamado ubuntu-restricted-extras que nos permite<br />
instalar todo este software que no es instalado por defecto.<br />
Tras habilitar los repositorios universe y multiverse podemos instalar este metapaquete con:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ sudo apt-get install ubuntu-restricted-extras</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Los paquetes serian:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">kubuntu-restricted-extras &#8211; Commonly used restricted packages<br />
ubuntu-restricted-extras &#8211; Commonly used restricted packages<br />
xubuntu-restricted-extras &#8211; Commonly used restricted packages</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Para Instalar flash player, nos pueden interesar los siguientes paquetes:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">flashplugin-nonfree &#8211; Instalador del complemento de Adobe Flash Player<br />
flashplugin-nonfree-extrasound &#8211; Reproductor de Flash de Adobe compatible con las bibliotecas Esound y OSS</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ apt-get install flashplugin-nonfree libflashsupport flashplugin-nonfree-extrasound</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Otra opcion es añadir:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* el repositorio mediubuntu para Intrepid:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">mediubuntu es un repositorio donde podemos encontrar algunas aplicaciones y codecs que no son instalador por defecto en intrepid, Para instalarlo:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Agregamos el repositorio:<br />
sudo wget http://www.medibuntu.org/sources.list.d/intrepid.list &#8211;output-document=/etc/apt/sources.list.d/medibuntu.list</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Agregamos la llave GPG<br />
sudo apt-get update &#38;&#38; sudo apt-get install medibuntu-keyring &#38;&#38; sudo apt-get update</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">y tras actualizar ya podriamos instalar software desde synaptic como:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* libdvdcss2 – Para la reproducción de DVD.<br />
* non-free-codecs – Para el resto de codecs propietarios.<br />
* acroread – Acrobat Reader<br />
* mozilla-acroread – para ver pdf dentro de Linux</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">o</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* skype – cliente de mensajeria</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">entonces ya podemos:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* Instalar Mplayer con todos los codecs y soporte de DVD<br />
Si queremos reproducir peliculas con Mplayer ejecutamos:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ sudo apt-get install mplayer</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Para instalar una libreria que te permite ver los DVDs encriptados</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">sudo apt-get install libdvdcss2 libdvdread3</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">o algunos codecs windows:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Para i386:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ sudo apt-get install w32codecs</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Para amd64:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">sudo apt-get install w64codecs</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* Instalar Avant Window Navigator</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">AWN es un dock similar al de Mac, que nos permite lanzar aplicaciones desde una barra con iconos que se instala en nuestro escritorio. Lo instalariamos con:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">apt-get install avant-window-navigator</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">una vez instalado accedemos al programa desde<br />
Aplicaciones &#62; Accesorios &#62; Avant Window Navigator<br />
podemos cambiar sus preferencias desde Sistema &#62; Preferencias &#62; Awn manager</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">para tener un dock similar al de Mac, puedes bajarte este tema para Awn.</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* Instalar Sun Java Runtime Environment</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Si queremos instalar java para poder ejecutar aplicaciones basadas en Java o tener el plugin de Java para el navegador,<br />
ejecutamos:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ sudo apt-get install sun-java6-fonts sun-java6-jre sun-java6-plugin</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* Instalar Microsoft fonts package<br />
Si queremos utilizar algunas de las fuentes de texto de Microsoft como por ejemplo son:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* Andale Mono<br />
* Arial Black<br />
* Arial (Bold, Italic, Bold Italic)<br />
* Comic Sans MS (Bold)<br />
* Courier New (Bold, Italic, Bold Italic)<br />
* Georgia (Bold, Italic, Bold Italic)<br />
* Impact<br />
* Times New Roman (Bold, Italic, Bold Italic)<br />
* Trebuchet (Bold, Italic, Bold Italic)<br />
* Verdana (Bold, Italic, Bold Italic)<br />
* Webdings</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Ejecutamos:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ sudo apt-get install msttcorefonts</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">y despues</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ sudo fc-cache</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">para reiniciar la cache de fuentes del sistema. a partir de ahora tenemos disponibles esas fuentes<br />
de texto para poder usarlas con nuestros programas favoritos.</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Si acaso no tuvieramos Firefox, podemos instalar la version 3.0 con:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ sudo apt-get install firefox-3.0</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* Instalar adobe reader<br />
Para leer documentos PDF, si estamos mas acostumbrados a usar el Adobe reader,<br />
y no queremos usar el visor interno del propio Gnome, podemos instalar este visor con:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ sudo apt-get install acroread</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* aMSN<br />
Tienes amigos con los que quieres hablar mediante el Msn???. Podras seguir conversando con ellos<br />
si instalas este cliente de mensajeria:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ sudo apt-get install amsn</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* amule<br />
Emule, es uno de los programas P2P mas populares para descargar por internet. La version en Linux se<br />
instala con:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ sudo aptitude install amule</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* reproducir videos, VLC<br />
VideoLan VLC es uno de los mejores reproductores de video. Lo puedes instalar con:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ sudo apt-get install vlc</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* reproducir videos, Smplayer</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Otra alternativa a VLC para visualizar videos:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ sudo apt-get install smplayer</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* Apagar el altavoz interno del PC<br />
si te molesta una forma de hacerlo es deshabilitarlo con el comando:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ sudo modprobe -r pcspkr</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">puede volver a activarse con:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ sudo modprobe pcspkr</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* Que no se muestren las unidades en el escritorio<br />
Si quieres que no te aparezcan los iconos con las particiones que tienes en tus discos puedes<br />
ocultar los iconos ejecutando:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ gconf-editor</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">se abrira el editor del registro. entocnes debes buscar la cadena “volumes_visible” en<br />
apps/nautilus/desktop Puedes activar o desactivar esta opcion para mostrar<br />
los iconos de tus volumnes.</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* Eliminar kernels antiguos<br />
Ya se encarga de ello Intrepid. Genial.</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* Instalar wine</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Si tienes alguna aplicacion para Windows que uses y no esta disponible para Linux, es posible que<br />
puedas ejecutarla con wine.</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Ejecutas:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">para obtener la version estable:<br />
$ apt-get install wine</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">si quieres la mas nueva:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Añade el siguiente repositorio:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ sudo wget http://wine.budgetdedicated.com/apt/sources.list.d/intrepid.list -O /etc/apt/sources.list.d/winehq.list</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Actualizamos el sistema:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ sudo apt-get update</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">y ya instalamos wine:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ sudo apt-get install wine</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Despues ejecutamos:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ winecfg</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Para configurar Wine.</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Si ademas queremos una apariencia grafica de wine que este mas de acorde con Ubuntu hacemos:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ gedit ~/.wine/user.reg</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Y remplazamos la seccion [Control Panel\\Colors] con:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">[Control Panel\\Colors] 1176981676<br />
“ActiveBorder”=”239 235 231″<br />
“ActiveTitle”=”203 133 61″<br />
“AppWorkSpace”=”198 198 191″<br />
“Background”=”93 77 52″<br />
“ButtonAlternativeFace”=”200 0 0″<br />
“ButtonDkShadow”=”85 85 82″<br />
“ButtonFace”=”239 235 231″<br />
“ButtonHilight”=”255 255 255″<br />
“ButtonLight”=”255 255 255″<br />
“ButtonShadow”=”198 198 191″<br />
“ButtonText”=”0 0 0″<br />
“GradientActiveTitle”=”239 235 231″<br />
“GradientInactiveTitle”=”239 235 231″<br />
“GrayText”=”198 198 191″<br />
“Hilight”=”246 200 129″<br />
“HilightText”=”0 0 0″<br />
“InactiveBorder”=”239 235 231″<br />
“InactiveTitle”=”239 235 231″<br />
“InactiveTitleText”=”255 255 255″<br />
“InfoText”=”0 0 0″<br />
“InfoWindow”=”255 255 166″<br />
“Menu”=”239 235 231″<br />
“MenuBar”=”239 235 231″<br />
“MenuHilight”=”246 200 129″<br />
“MenuText”=”0 0 0″<br />
“Scrollbar”=”239 235 231″<br />
“TitleText”=”255 255 255″<br />
“Window”=”255 255 255″<br />
“WindowFrame”=”0 0 0″<br />
“WindowText”=”0 0 0″</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">(original de http://www.ubuntumini.com/2008/10/installing-wine-in-ubuntu-810-intrepid.html)</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Tambien podemos instalar winetricks para poder añadir muchas DLLs que usa Wine de manera<br />
facil.</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* Personalizar las animaciones y efectos de Compiz</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Si quieres poder seleccionar de manera sencilla que animaciones y efectos deseas activar en compiz<br />
nada mejor que instalar su administrador:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ sudo apt-get install compizconfig-settings-manager emerald</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">y no te olvides de fusion-icon:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">sudo apt-get install fusion-icon</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Se añadira un icono al panel que te permitira acceder muy rapidamente a todas las opciones<br />
de Compiz.</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Entonces ya podremos acceder al administrador de Compiz desde: Sistema &#62; Preferencias &#62; Configuracion avanzada de los efectos de escritorio y al gestor Emerald desde Sistema &#62; Preferencias &#62; Gestor de Temas de Emerald</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Cuando hagas esto y si usas Compiz y usas Emerald como decorador de ventanas, es posible que los bordes se vean mal o que no te cargue directamente Emerald cuando inicias sesion.<br />
Para solucionarlo vas a “Configuracion avanzada de efectos de escritorio” y en el plugin “Window Decoration”<br />
debemos cambiar el apartado “Command” por esta linea:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">/usr/bin/emerald &#8211;replace</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* Instalar Eclipse</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Yo como desarrollador de Java tambien incluiria un editor como Eclipse para hacer mis programas:<br />
$ apt-get install eclipse</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">o</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ apt-get install eclipse-gcj</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">si quiero ejecutar la version de Eclipse que corre con GCJ.<br />
haz:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ sudo apt-cache search eclipse<br />
y podras ver todos los plugins adicionales que puedes instalar, p.ej para programar en python o Php<br />
usando eclipse.</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Tambien si te gusta mas, puedes usar netbeans:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ apt-get install netbeans</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Si tenemos problemas con la grafica:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* Envy para poder instalar tu tarjeta de video:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ sudo apt-get install envyng-gtk envyng-core</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">y lo inicias con<br />
$ envyng</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Si queremos un buen capturador de pantallas:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$apt-get install gscrot</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Si queremos poder ir cambiando el fondo de pantalla periodicamente:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ sudo apt-get install drapes</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Ir luego a sistema-&#62;preferencias-&#62;sesion y añadir drapes–tray.</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* Si cuando inicias no tienes activo el teclado numérico y quieres que al arrancar esté por defecto activado:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ sudo apt-get install numlockx<br />
$ numlockx on</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* Compresores/Descompresores adicionales</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ sudo apt-get install unrar rar p7zip-full unace unzip</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Si queremos tener una maquina virtual para poder por ejemplo ejecutar Windows XP u otro<br />
sistema operativo desde Ubuntu, instalariamos VirtualBox.</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* Instalar VirtualBox:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ sudo apt-get install virtualbox-ose vboxgtk virtualbox-ose-guest-utils</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">nos permite instalar el  VirtualBox-OSE, o</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ apt-get install virtualbox-2.0</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">pero este ya no es “libre”.</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Si queremos widgets en el escritorio, usamos screenlets:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* Instalar Screenlets:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">sudo apt-get install screenlets<br />
lo iniciamos con:<br />
screenlets-manager</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Ibex no incluye la ultima version de OpenOffice 3.0 sino la 2.4, pero podemos instalarlo y sustituir la actual.</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* Instalar OpenOffice 3.0:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Solo tenemos que añadir estas líneas a los repositorios, editamos el /etc/apt/sources.list y añadimos:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">#Openoffice<br />
deb http://ppa.launchpad.net/openoffice-pkgs/ubuntu intrepid main<br />
deb http://ppa.launchpad.net/openoffice-pkgs/ubuntu intrepid main</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Actualizamos la informacion de los repositorios:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">sudo aptitude update</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Y deberán aparecer lista las nuevas actualizaciones.</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Si por algún caso no aparecieran solo tenemos que ir hasta Sistema/administración/gestor de actualizaciones.</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Se instalara en ingles, para traducirlo instalamos:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ sudo aptitude install openoffice.org-l10n-es language-support-translations-es language-support-writing-es myspell-es</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Incluso podemos cambiarle su pantalla de Splash:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">copiariamos los archivos a /usr/lib/openoffice/program/intro.bmp<br />
pero renombrandolos a:<br />
openabout_ubuntu_sun.bmp y  openintro_ubuntu_sun.bmp</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">* Si queremos cambiar el grub y el splash:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ sudo apt-get install startupmanager</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Podemos instalar un buscador y lanzador rapido de aplicaciones:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">$ apt-get install gnome-do</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Para descargarnos ficheros podemos usar:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">JDownloader</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">y para videos de Youtube:</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">xviservicethief</a></p>
<p><a href="http://ubuntulife.wordpress.com/2008/11/03/cosas-a-hacer-despues-de-instalar-ubuntu-810-intrepid-ibex/">Pero hay aun muchas mas y esta lista podria crecer. ¿Que mas incluirias tu?</a></p></blockquote>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[GeeXboX 1.1]]></title>
<link>http://phoxis.wordpress.com/2009/02/10/geexbox-11/</link>
<pubDate>Tue, 10 Feb 2009 17:10:38 +0000</pubDate>
<dc:creator>phoxis</dc:creator>
<guid>http://phoxis.wordpress.com/2009/02/10/geexbox-11/</guid>
<description><![CDATA[If you are planning to scrap out your old 200MHz PC with 64MB of RAM, and buy a brand new one, then ]]></description>
<content:encoded><![CDATA[If you are planning to scrap out your old 200MHz PC with 64MB of RAM, and buy a brand new one, then ]]></content:encoded>
</item>
<item>
<title><![CDATA[GeeXboX developers meeting at FOSDEM'09]]></title>
<link>http://gxben.wordpress.com/2009/02/08/geexbox-developers-meeting-at-fosdem09/</link>
<pubDate>Sun, 08 Feb 2009 13:37:59 +0000</pubDate>
<dc:creator>ben</dc:creator>
<guid>http://gxben.wordpress.com/2009/02/08/geexbox-developers-meeting-at-fosdem09/</guid>
<description><![CDATA[The GeeXboX team members finally met at FOSDEM this weekend at Brussels, Belgium. It was a big pleas]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>The GeeXboX team members finally met at FOSDEM this weekend at Brussels, Belgium. It was a big pleasure finally meeting everyone IRL.</p>
<p><img class="aligncenter size-full wp-image-93" title="p1000188" src="http://gxben.wordpress.com/files/2009/02/p1000188.jpg" alt="p1000188" width="500" height="375" /></p>
<p>Attending members, from left to right: <em>Aurélien Jacobs, Nicolas Aguirre, Guillaume Lecerf, Davide Cavalca </em>and<em> Benjamin Zores</em>. <em>Mat</em> and <em>Andrew</em> were not able to join but it still was a very nice weekend.</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[GeeXboX 1.2]]></title>
<link>http://gatodiario.wordpress.com/2009/02/02/geexbox-12/</link>
<pubDate>Mon, 02 Feb 2009 10:51:16 +0000</pubDate>
<dc:creator>gatodiario</dc:creator>
<guid>http://gatodiario.wordpress.com/2009/02/02/geexbox-12/</guid>
<description><![CDATA[GeeXboX es un sistema operativo completo, corriendo con Linux y basado en el excelente MPlayer. No s]]></description>
<content:encoded><![CDATA[GeeXboX es un sistema operativo completo, corriendo con Linux y basado en el excelente MPlayer. No s]]></content:encoded>
</item>
<item>
<title><![CDATA[Avancement pour les "grabbers"]]></title>
<link>http://skywalker13.wordpress.com/2009/08/23/avancement-des-grabbers/</link>
<pubDate>Sun, 23 Aug 2009 11:23:27 +0000</pubDate>
<dc:creator>Mathieu SCHROETER</dc:creator>
<guid>http://skywalker13.wordpress.com/2009/08/23/avancement-des-grabbers/</guid>
<description><![CDATA[Hello, plusieurs grabbers ont intégrés Valhalla depuis le dernier article, merci à Benjamin pour son]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Hello,</p>
<p style="text-align:justify;"><a href="http://skywalker13.wordpress.com/files/2009/08/heidrun.png"><img class="alignright size-full wp-image-793" style="border:0 none;margin-left:5px;margin-right:5px;" title="Heidrun" src="http://skywalker13.wordpress.com/files/2009/08/heidrun.png" alt="Heidrun" width="100" height="215" /></a>plusieurs grabbers ont intégrés Valhalla depuis le dernier article, merci à Benjamin pour son travail. Il reste cependant quelques lacunes à combler. Certaines des fonctionnalités manquantes sont mineurs et je ne vais donc pas les aborder ici. Même que je ne compte pas travailler dessus tant que les plus importantes ne seront pas implémentées.</p>
<h3 style="text-align:justify;">Scan &#8220;on-demand&#8221;</h3>
<p style="text-align:justify;">C&#8217;est sûrement une des fonctionnalités la plus importante à faire avant l&#8217;intégration dans Enna. Son rôle est de permettre la récupération des méta-données en priorité (sur demande). L&#8217;idée est très simple, lorsque vous utilisez Enna et ciblez un fichier en particulier, le rôle du &#8220;on-demand&#8221; sera de fournir toutes les données le plus rapidement possible pour ce fichier. A moins que ces données soient déjà récupérées et sauvées dans la base de données (ainsi que les fichiers téléchargés tel que les couvertures).</p>
<p style="text-align:justify;">Bien que l&#8217;idée soit simple, l&#8217;implémentation est bien plus complexe. Valhalla étant un scanner de répertoire, il n&#8217;y a actuellement aucun mécanisme pour donner une priorité plus importante à un fichier plutôt qu&#8217;un autre. Comme je l&#8217;explique dans l&#8217;article précédent, les tâches des threads de Valhalla fonctionnent selon le principe du premier arrivé, premier servi. Il faut donc implémenter un moyen de mettre &#8220;un paquet&#8221; selon un LIFO (Last In, First Out) à la place d&#8217;un FIFO. Par exemple un attribut indiquerait que le paquet est prioritaire et les queues seraient utilisées en LIFO.<br />
Les queues dans Valhalla sont héritées de libplayer. Elles se nomment fifo_queue et n&#8217;ont pas du tout été prévues pour le LIFO comme le suggère leur nom. Il est peut être temps de les rendre plus polyvalentes. Je n&#8217;ai encore rien entrepris en ce sens, je ne fais que des réflexions sur une manière parmi d&#8217;autres de gérer le &#8220;on-demand&#8221;.</p>
<p style="text-align:justify;">Donner plus de priorité dans les queues ce n&#8217;est pas l&#8217;unique chose à prendre en compte. Le &#8220;on-demand&#8221; doit aussi pouvoir se faire sur des fichiers qui ne sont pas disponibles avec les chemins scannés par Valhalla. Ce qui induit que ces entrées doivent avoir un statu particulier dans la base de donnée, afin que Valhalla ne les supprime pas lors du prochain scan, croyant que se sont des fichiers effacés car introuvables. Quoi qu&#8217;il en soit, avant d&#8217;écrire la moindre ligne de code, il est important de faire toutes les considérations nécessaires afin de ne pas introduire des modifications trop intrusives aussi bien au niveau interne de Valhalla qu&#8217;au niveau de la structure de la base de donnée.</p>
<h3 style="text-align:justify;">Le &#8220;force-stop&#8221;</h3>
<p style="text-align:justify;">Depuis la première version de Valhalla, il est possible d&#8217;arrêter un scanner (et donc tous les threads en aval) même si le système est en train de travailler sur des fichiers à différents niveaux. Le fait d&#8217;avoir ajouté les grabbers à fortement compliqué cette fonctionnalité de &#8220;force-stop&#8221; qui n&#8217;est actuellement pas optimale. J&#8217;ai du faire un choix afin de pouvoir commiter le code sur les grabbers même si je n&#8217;ai pas terminé cette part du travail.</p>
<p style="text-align:justify;">Mais tout d&#8217;abord, pourquoi le &#8220;force-stop&#8221;? Lorsque vous êtes dans Enna, Valhalla tourne en arrière plan avec une priorité très basse afin de ne pas influencer l&#8217;interface et les lectures des fichiers. Si vous quittez Enna, vous voulez le faire immédiatement ce qui semble logique. Par contre pour Valhalla c&#8217;est plus compliqué. L&#8217;arrêter en plein au milieu de tâches l&#8217;oblige à ne pas pouvoir vider les queues des threads. Toutes les données dans ces queues sont donc libérées et perdues. Avant l&#8217;ajout des grabbers ce n&#8217;était pas du tout un problème, car le système se limitait à une seule étape; le parser. Un thread n&#8217;est pas tué avec le &#8220;force-stop&#8221;, mais sa dernière tâche est terminée normalement. La différence est que les tâches suivantes sont ignorées et le thread se termine comme s&#8217;il n&#8217;y avait rien de plus à faire. Ainsi avant l&#8217;ajout des grabbers, au pire les fichiers restant dans les queues n&#8217;étaient pas insérés/actualisés dans la base de donnée. Les fichiers qui étaient déjà insérés l&#8217;étaient au complet. Ceux qui ne l&#8217;étaient pas, ne l&#8217;étaient pas du tout. C&#8217;était du tout ou rien. Le prochain scan (démarrage d&#8217;Enna) permettait de continuer le travail très simplement. Les queues se repeuplaient par le scanner qui ne trouvait pas les fichiers dans la base de données, et ignorait ceux qui existaient déjà (c&#8217;est toujours le cas &#8220;plus-ou-moins&#8221; si vous compilez Valhalla sans les grabbers).</p>
<p style="text-align:justify;">Depuis que les grabbers sont présents, la complexité du &#8220;force-stop&#8221; a augmenté pour deux raisons. Un fichier peut exister dans plusieurs queues en même temps, et un fichier doit passer par plusieurs étapes avant d&#8217;être terminé. Les données d&#8217;un fichier dans la base de donnée ne peuvent plus être considérées comme du tout ou rien. Un fichier se retrouve complètement fragmenté quand les threads sont tous terminés en plein au milieu des tâches.</p>
<h4 style="text-align:justify;">Fonctionnement actuel</h4>
<p style="text-align:justify;">J&#8217;ai donc fais un choix intermédiaire pour que Valhalla fonctionne aussi en &#8220;force-stop&#8221; bien que le problème de fragmentation ne soit pas réglé. J&#8217;ai décidé de traiter un fichier comme c&#8217;est le cas sans le support des grabbers mais à une différence près. Un fichier est considéré comme interrompu tant qu&#8217;il n&#8217;a pas atteint l&#8217;étape ENDING (voir l&#8217;article <a href="http://skywalker13.wordpress.com/2009/08/11/le-support-des-grabbers-dans-la-valhalla/">précédent</a>). Donc au prochain scan (redémarrage de Valhalla), ce fichier repassera absolument par toutes les étapes. Le problème est donc que les données déjà grabbées (et sauvées dans la DB) sont re-grabbées ce qui prend beaucoup de temps inutile. Avec des milliers de fichiers et beaucoup de grabbers, il se trouve que Valhalla passe son temps à refaire encore et encore le même travail si on ne le laisse pas se terminer de lui même. Car pour qu&#8217;un fichier puisse atteindre l&#8217;étape ENDING quand il y a 5-6 grabbers, il faut se lever tôt <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> .<br />
Ce système est provisoire! Il est là en attendant que j&#8217;y travail. Et c&#8217;est une des raisons qui fait que Valhalla ne doit pas encore être utilisé avec les grabbers dans Enna.</p>
<p style="text-align:justify;">Pourquoi de la fragmentation? Alors ça n&#8217;a rien à voir avec votre disque dur, quand je parle de fragmentation c&#8217;est dans le sens où toutes les informations qui devraient l&#8217;être ne sont pas disponibles dans la base de donnée. Par exemple un fichier est passé par l&#8217;étape PARSING et GRABBING (le premier grabber). Les méta-données du parser ont été sauvées dans la DB, ainsi que celle du premier grabber par exemple. Néanmoins il y a peut être encore 4 grabbers avant le downloader et l&#8217;ENDING. Le &#8220;force-stop&#8221; arrête tout, vide les queues, quitte Valhalla. Il se trouve que le fichier en question a une partie des méta-données dans la base de donnée, mais on a aucune certitude qu&#8217;elle soient toutes disponibles car ce fichier est indiqué comme étant interrompu.</p>
<h4 style="text-align:justify;">Fonctionnement futur</h4>
<p style="text-align:justify;">Je suis en train de réfléchir à ce problème (sur papier pour le moment). Ce qu&#8217;il faut arriver à faire, c&#8217;est de sauver le contexte des fichiers interrompus pour pouvoir restaurer leur contexte à la prochaine exécution de Valhalla. Il n&#8217;y a donc pas 50 manières de faire. La sauvegarde du contexte doit être réalisée dans la base de donnée. Un mécanisme à l&#8217;exécution de Valhalla devra chercher les contextes, les restaurer puis les effacer de la base de données.</p>
<p style="text-align:justify;">Un contexte devra contenir les informations sur quels grabbers ont été traités en entier (ceux où les données sont vraiment sauvées) ainsi que la liste des fichiers qui doivent être téléchargés. Il faut aussi considérer les cas où des contextes ont été sauvés mais que certains grabbers ne sont plus disponibles avec Valhalla, ou même qu&#8217;un Valhalla sans le support des grabbers essaient d&#8217;utiliser la base de données qui contient ces contextes.</p>
<p style="text-align:justify;">Concernant le downloader c&#8217;est un peu différent par rapport aux autres threads. Comme je l&#8217;ai dis précédemment, un thread termine sa tâche en cours puis quitte. Pour le downloader une tâche peut être interrompue en plein au mieux. Cela veut simplement dire que pour un fichier en particulier, il y a par exemple un &#8220;cover&#8221;, un &#8220;backdrop&#8221; et peut être encore autre chose à télécharger. Il se peut que le &#8220;cover&#8221; soit téléchargé, que le &#8220;force-stop&#8221; se manifeste et donc le &#8220;backdrop&#8221; est ignoré. La tâche est à moitié réalisée. Il est donc nécessaire de sauvegarder l&#8217;état de cette tâche avant de quitter le thread du downloader.</p>
<p style="text-align:justify;">Finalement ça représente des ajouts de tables dans la base de données pour sauvegarder les contextes, des mécanismes pour gérer les contextes (sauvegarde, restauration et effacement), puis ensuite on pourra réfléchir sérieusement à l&#8217;intégration dans Enna.</p>
<h3 style="text-align:justify;">Les évènements</h3>
<p style="text-align:justify;">Le dernier point relativement important est la gestion des évènements pour un scan &#8220;on-demand&#8221;. Les données étant insérées au fur et à mesure dans la base de donnée, il est intéressant de recevoir une information sur ce qui est disponible afin de savoir quand aller les lire. Simplement, lorsque vous êtes sur un fichier en particulier avec Enna, un &#8220;backdrop&#8221; va se télécharger à un moment indéterminé. Un évènement sera envoyé par Valhalla à Enna quand le fichier sera sauvé et le &#8220;backdrop&#8221; s&#8217;affichera.</p>
<p style="text-align:justify;">C&#8217;est avant tout une question de confort que d&#8217;avoir cette fonctionnalité. Dans le cas contraire il serait nécessaire d&#8217;aller lire les données que lors de l&#8217;accès au fichier, et les images par exemple ne s&#8217;afficheraient qu&#8217;en changeant de fichier, puis en revenant sur le précédent (pour autant que quelque chose s&#8217;est téléchargé entre temps).</p>
<p style="text-align:justify;">
<p style="text-align:justify;">
<p style="text-align:justify;">&#8230;</p>
<p style="text-align:justify;">Il y a d&#8217;autres points mais moins prioritaires. Je compte travailler spécialement sur les trois problèmes présentés dans cet article. J&#8217;ai déjà fais un peu de travail sur le &#8220;force-stop&#8221;. Après je pense régler le &#8220;on-demand&#8221; puis les évènements.</p>
<p style="text-align:justify;">A bientôt,</p>
<p style="text-align:justify;padding-left:30px;">Mathieu SCHROETER</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Le support des "grabbers" dans la Valhalla]]></title>
<link>http://skywalker13.wordpress.com/2009/08/11/le-support-des-grabbers-dans-la-valhalla/</link>
<pubDate>Tue, 11 Aug 2009 19:17:50 +0000</pubDate>
<dc:creator>Mathieu SCHROETER</dc:creator>
<guid>http://skywalker13.wordpress.com/2009/08/11/le-support-des-grabbers-dans-la-valhalla/</guid>
<description><![CDATA[Les feuilles d&#8217;Yggdrasil ne sont plus si inaccessibles pour les braves de la Valhalla. Les ]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p style="text-align:justify;"><em>Les feuilles d&#8217;Yggdrasil ne sont plus si inaccessibles pour les braves de la Valhalla. Les &#8220;grabbers&#8221; auraient pu s&#8217;appeler <a href="http://en.wikipedia.org/wiki/Hei%C3%B0r%C3%BAn">Heidrun</a> mais on se contentera d&#8217;un nom plus technique.</em></p>
<p style="text-align:justify;">Les &#8220;grabbers&#8221; sont donc enfin supportés dans libvalhalla. Il y a encore du travail avant de pouvoir les utiliser correctement depuis Enna, mais l&#8217;essentiel est là. Pour ceux qui n&#8217;ont aucune idée de ce qui se cache derrière ce mot barbare &#8220;grabber&#8221;, on pourrait le définir simplement comme étant une manière de s&#8217;accaparer (si on traduit directement du mot anglais) ou alors de récupérer des données depuis des moyens extérieurs.<br />
Par exemple, libvalhalla peut récupérer des méta-données provenant directement des fichiers scannés, à l&#8217;aide d&#8217;FFmpeg (le parser). Mais si on désire retrouver la couverture CD/DVD il n&#8217;était pas possible de le faire jusqu&#8217;ici. C&#8217;est là qu&#8217;intervient le &#8220;grabber&#8221; tel que celui pour Amazon. On peut imaginer plein d&#8217;autres types de &#8220;grabbers&#8221;, mais celui d&#8217;Amazon est le seul porté sous Valhalla au moment où j&#8217;écris ce billet et il permet de &#8220;rapatrier&#8221; les couvertures CD/DVD.</p>
<h3 style="text-align:justify;">Architecture</h3>
<p style="text-align:justify;">L&#8217;architecture de la bibliothèque à été profondément changée. Trois nouveaux threads ont fait leur apparition et sont visibles dans l&#8217;image ci-dessous en tant que &#8220;Dispatcher&#8221;, &#8220;Grabber&#8221; et &#8220;Downloader&#8221;.</p>
<p style="text-align:justify;"><a href="http://skywalker13.wordpress.com/files/2009/08/valhalla-internals.png"><img class="aligncenter size-full wp-image-754" style="border:0 none;" title="Valhalla Internals" src="http://skywalker13.wordpress.com/files/2009/08/valhalla-internals.png" alt="Valhalla Internals" width="450" height="214" /></a></p>
<p style="text-align:justify;">L&#8217;image correspond au code, néanmoins elle est un petit peu simplifiée afin d&#8217;être suffisamment lisible et compréhensible. Le Dispatcher peut être vu comme un switch réseau. Son but et d&#8217;être très réactif (il ne fait donc pas grand chose) et de transmettre les &#8220;paquets&#8221; au bon endroit en fonction de l&#8217;état de celui-ci. Un &#8220;paquet&#8221; est une analogie au réseau, mais finalement dans le cas de libvalhalla, ce n&#8217;est rien de plus qu&#8217;une structure qui défini un fichier.</p>
<p style="text-align:justify;">Afin de bien comprendre l&#8217;architecture, je vais détailler le chemin effectué par un paquet. Lorsque le scanner trouve un fichier sur le disque, il &#8220;l&#8217;empacte&#8221; et le transmet au DBManager. Le DBManager va interroger la base de donnée pour savoir si ce fichier existe déjà, si oui il vérifie la date de dernière modification et ignore ce paquet si cette date n&#8217;a pas changée, autrement (ou si le fichier n&#8217;existe pas dans la base), il transmet le paquet au Dispatcher. Un paquet doit suivre 4 étapes avant d&#8217;être détruit.</p>
<ul>
<li><strong>Étape 0: PARSING</strong><br />
Récupération des méta-données à l&#8217;aide d&#8217;FFmpeg</li>
<li><strong>Étape</strong><strong> 1: GRABBING</strong><br />
Récupération de nouvelles données et (ou) fichiers texts (XML) à l&#8217;aide d&#8217;un ou de plusieurs grabbers</li>
<li><strong>Étape</strong><strong> 2: DOWNLOADING</strong><br />
Téléchargement des fichiers indiqués par le(s) grabber(s) (couvertures CD par exemple)</li>
<li><strong>Étape</strong><strong> 3: ENDING</strong><br />
Finalisation et destruction du paquet</li>
</ul>
<p>Le processus pour un paquet se résume donc en:</p>
<p style="padding-left:30px;"><em>Scanner -&#62; DBManager -&#62; Dispatcher -&#62; Parser -&#62; Dispatcher -&#62; Grabber -&#62; Dispatcher -&#62; Downloader -&#62; Dispatcher -&#62; DBManager -&#62; Scanner.</em></p>
<p style="text-align:justify;">Ce qui est <strong>faux</strong> en réalité, mais l&#8217;idée est correcte. L&#8217;intérêt de présenter le processus aussi simplement est uniquement là pour permettre de comprendre par la suite comment valhalla fonctionne. Si un paquet suivrait vraiment le processus ci-dessus, le système serait extrêmement lent (j&#8217;exagère peut être sur le mot &#8220;extrême&#8221;) mais il faut garder en tête que travailler avec des grabbers ça ne peut que ralentir, surtout s&#8217;il y a beaucoup de grabbers et s&#8217;ils font des accès sur internet.</p>
<h3 style="text-align:justify;">Comme un pipeline</h3>
<p style="text-align:justify;">Si le Dispatcher, le Parser, le Grabber et le Downloader sont sur des threads différents ce n&#8217;est pas juste pour pouvoir traiter plusieurs paquets en parallèles, mais aussi pour pouvoir traiter un même paquet à plusieurs endroits en même temps. L&#8217;idée est donc de récupérer les données &#8220;parsées&#8221; et &#8220;grabbées&#8221; aussi vite que possible dans la base de donnée. Ainsi même si un paquet n&#8217;a pas finit de suivre toutes les étapes du processus, il est qu&#8217;en même possible d&#8217;aller chercher les informations dans la base de données.</p>
<blockquote>
<p style="text-align:justify;">Pour ceux qui connaissent un peu les architectures des processeurs, ils connaissent également la représentation en <a href="http://en.wikipedia.org/wiki/Pipeline_(computing)">pipeline</a> du cycle d&#8217;exécution des instructions. J&#8217;ai vais donc expliquer le système par un dessin selon ce principe.</p>
</blockquote>
<p style="text-align:center;"><a href="http://skywalker13.wordpress.com/files/2009/08/valhalla-pipeline4.png"><img class="aligncenter size-full wp-image-780" style="border:0 none;" title="Valhalla Pipeline" src="http://skywalker13.wordpress.com/files/2009/08/valhalla-pipeline4.png" alt="Valhalla Pipeline" width="450" height="52" /></a></p>
<p style="text-align:justify;">Ce pipeline présente 4 fichiers traités par deux parsers parallélisés. Il y a chaque fois deux grabbers en série pour chaque fichier, avec un downloader à la fin du processus.</p>
<p style="text-align:justify;">Les tâches des threads de Valhalla fonctionnent en tant que FIFO (à ne pas confondre avec l&#8217;ordonnanceur du noyau). Le premier arrivé est donc le premier servi. Chaque fichier de ce pipeline peut être séparé en deux lignes. C&#8217;est ce qui arrive lorsqu&#8217;un grabber est en marche et que des méta-données doivent être sauvées dans la base de donnée. C&#8217;est cela qui permet d&#8217;avoir un temps de réaction intéressant. Il est inutile d&#8217;attendre que le processus soit terminé pour avoir les méta-données. Par exemple avec le &#8220;FILE 0&#8243;, le Scanner (jaune) transmet le paquet au DBManager (rose pâle), qui va le transmettre au Dispatcher (gris) afin d&#8217;être &#8220;parsé&#8221; (rose). Puis le paquet revient au Dispatcher et se voit transféré dans deux threads, le grabber (vert) et le DBManager. A ce moment là il se passe deux choses, le DBManager va insérer les méta-données du Parser dans la base de donnée et en même temps le grabber va commencer à traiter les nouvelles méta-données. Puis au &#8220;grabbing&#8221; suivant, c&#8217;est les méta-données du grabber précédent qui sont sauvées quand le deuxième grabber s&#8217;apprête à traiter les nouvelles méta-données. Au final c&#8217;est lors de l&#8217;étape du downloading que les dernières méta-données sont sauvées.<br />
En résumé, chaque case DBManager (de demi-hauteur) correspond à une insertion dans la base de donnée. Dans le cadre de cet exemple, il y a donc trois insertions par fichier (le parser + les deux grabbers).</p>
<blockquote>
<p style="text-align:justify;">J&#8217;ai omis quelques informations sinon cet article serait 5 fois plus long.</p>
</blockquote>
<p style="text-align:justify;">Il faut également prendre le diagramme avec des pincettes car il est impossible de prédire la forme exacte pour plusieurs raisons. Les cases &#8220;parser&#8221;, &#8220;grabber&#8221; et &#8220;downloader&#8221; en particulier sont très disproportionnées. Leur temps est une question de plusieurs dizaines de millisecondes à plusieurs secondes. Tout dépend de la taille des fichiers, du demuxer utilisé par FFmpeg, de la vitesse de votre connexion internet, du temps sur les accès aux disque dur, etc, &#8230; Le dispatcher se contente de quelques microsecondes, et dans le diagramme il prend autant de temps que le DBManager ce qui est absurde.<br />
Au premier abord on pourrait penser qu&#8217;il y a beaucoup de trous dans ce pipeline, mais en réalité les trous sont bien plus grand que ça si vous considérez qu&#8217;un parser prend 3 secondes pour un fichier. Néanmoins ce n&#8217;est pas du tout un problème (d&#8217;ailleurs s&#8217;il n&#8217;y avait pas de trous alors tous vos CPU seraient constamment à 100%; il ne faut pas oublier non plus que dans certaines étapes il y a des temps morts tel que les accès au disque dur et sur internet).</p>
<p style="text-align:justify;">Si vous regardez bien le diagramme, vous voyez des trous importants après les étapes &#8220;parser&#8221;. En fait, le scan du disque, le parsing et l&#8217;insertion des méta-données des parsers vont se faire très vite. A la même vitesse qu&#8217;avant l&#8217;ajout des grabbers dans Valhalla. Les grabbers ont aucun impacte sur les parsers car ils sont exécutés après eux. Ce n&#8217;est pas plus compliqué que ça.</p>
<p style="text-align:justify;">Il faut également interpréter ce diagramme d&#8217;un point de vue plus large. Imaginez le avec plus de 100 lignes (ou plus), ce qui peut arriver sans problème lorsqu&#8217;un scanner passe sur un de vos dossiers de musique. Cela donnerait visuellement tous les parsers qui descendraient à gauche en un escalier serré, et les grabbers seraient parsemés (avec des trous importants dans toutes les lignes). Néanmoins il peut y avoir des grabbers non utilisés par certains fichiers, voir même aucun grabber, ce qui complique fortement le diagramme.</p>
<h3 style="text-align:justify;">Quelques précisions</h3>
<p style="text-align:justify;padding-left:30px;">Il y a de la documentation avec les en-têtes de libvalhalla afin de savoir comment implémenter un grabber, mais je donerais des informations sur ce blog un de ces 4.</p>
<p style="text-align:justify;padding-left:30px;">L&#8217;application test-valhalla permet de tester les grabbers. Il suffit de lire l&#8217;aide de la commande.</p>
<p style="text-align:justify;padding-left:30px;">Valhalla peut être compilé sans le support des grabbers, ainsi les fichiers passent de l&#8217;étape 0 PARSING à l&#8217;étape 3 ENDING. La bibliothèque réagira exactement comme avant l&#8217;ajout des grabbers.</p>
<p style="text-align:justify;padding-left:30px;">Il manque également  des éléments pour une utilisation dans Enna, le fichier TODO vous en dira plus.</p>
<p style="text-align:justify;">Voilà, je n&#8217;ai pas la motivation d&#8217;en dire plus aujourd&#8217;hui, rien que de dessiner le pipeline ça m&#8217;a pris pas mal de temps. Je reviendrais donc sur certains aspects dans un prochain billet.</p>
<p style="text-align:justify;">A bientôt,</p>
<p style="text-align:justify;padding-left:30px;">Mathieu SCHROETER</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[La liste de lecture de libplayer]]></title>
<link>http://skywalker13.wordpress.com/2009/08/02/les-listes-de-lecture-de-libplayer/</link>
<pubDate>Sun, 02 Aug 2009 10:36:41 +0000</pubDate>
<dc:creator>Mathieu SCHROETER</dc:creator>
<guid>http://skywalker13.wordpress.com/2009/08/02/les-listes-de-lecture-de-libplayer/</guid>
<description><![CDATA[Hello, cet été j&#8217;ai bossé un peu sur libvalhalla pour ajouter le support des grabbers. Le trav]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Hello,</p>
<p style="text-align:justify;">cet été j&#8217;ai bossé un peu sur libvalhalla pour ajouter le support des grabbers. Le travail n&#8217;est pas terminé et rien n&#8217;a encore été commité car les modifications sont très intrusives et forment un tout. Je n&#8217;ai encore rien à présenter de concret mais j&#8217;espère en terminer avec ça les deux premières semaines d&#8217;août. Soit mes deux dernière semaines de congé.</p>
<h3 style="text-align:justify;">La liste de lecture</h3>
<p style="text-align:justify;"><img class="alignright size-thumbnail wp-image-32" style="border:0 none;margin:0 5px;" title="libplayer" src="http://skywalker13.wordpress.com/files/2008/08/logo.png?w=150" alt="libplayer" width="150" height="37" />Mais ce n&#8217;est pas de Valhalla que je désire parler. Mais plutôt de libplayer et de quelques fonctionnalités qui existent depuis bien longtemps et qui ne sont pas forcément connues et qui ne seront même jamais utilisées par Enna. Avant l&#8217;entrée en jeu d&#8217;Enna dans le monde de GeeXboX il y a eu quelques tentatives de nouveaux GUI tel que MPUI, OMCv1, OMC-SDL puis OMCv2. Aucun de ces projets n&#8217;a abouti mais libplayer a été créé en parallèle à OMCv1 (je précise v1 et v2 car il y a eu deux tentatives différentes de créer un GUI basé sur les EFL). Pendant une période, il avait été proposé de laisser la gestion des listes de lecture à libplayer. Au début cette gestion était très rudimentaire et ne permettait que d&#8217;ajouter des fichiers dans la liste. J&#8217;ai donc pris l&#8217;initiative d&#8217;étendre la gestion de ces listes, et spécialement avec l&#8217;ajout du superviseur (cf. <a href="http://skywalker13.wordpress.com/2008/07/30/libplayer-et-le-multi-threading/">libplayer-et-le-multi-threading</a>) qui date d&#8217;une année.</p>
<p style="text-align:justify;">Libplayer contient une playlist interne. Elle n&#8217;est pas accessible depuis l&#8217;API publique et uniquement une playlist peut exister dans un player à la fois. Cette liste se présente en une structure chaînée dans laquelle il est possible de progresser en avant ou en arrière. Cela implique que l&#8217;ordre d&#8217;insertion des fichiers défini l&#8217;ordre de lecture. Ainsi il existe deux manières de lire la liste. Pour cela il m&#8217;est nécessaire de présenter quelques fonctions de l&#8217;API publique, ainsi qu&#8217;une fonction interne un peu différente.</p>
<p style="text-align:justify;">Chaque entrée dans la playlist est un morceau de la structure chaînée, visible en tant que type opaque nommé <em>mrl_t</em>. Il y a quelques fonctions de base pour travailler avec ces type, tel que <em>mrl_new()</em>, <em>mrl_free()</em> et différents accesseurs. Mais il y a également des fonctions pour assigner un <em>mrl_t</em> à la playlist. Tel que <em>player_mrl_set()</em> et <em>player_mrl_append()</em> qui permettent d&#8217;insérer un mrl à l&#8217;emplacement courant, respectivement à la suite du mrl courant. Ainsi une série de <em>player_mrl_append()</em> vont permettre de remplir la liste de lecture. L&#8217;ordre d&#8217;insertion étant directement lié à l&#8217;ordre de lecture. Il existe également des fonctions pour supprimer des mrls tel que <em>player_mrl_remove()</em> et <em>player_mrl_remove_all()</em>.<br />
Tout ceci n&#8217;est qu&#8217;une présentation rapide de quelques fonctions de base. Certaines d&#8217;entre elles sont utilisées par Enna car il faut bien au moins assigner un <em>mrl_t</em> à libplayer pour qu&#8217;un fichier (url, dvd, &#8230;) puisse être lu. Mais il existe d&#8217;autres fonctionnalités pour effectuer des lectures automatisées de la liste de lecture. Ces fonctions n&#8217;ont aucun intérêt pour Enna qui gère déjà ses propres listes de lecture.</p>
<h4 style="text-align:justify;">Les fonctions de playback</h4>
<p style="text-align:justify;">Il y a trois fonctions de playback intéressantes pour la liste de lecture de libplayer.</p>
<ul>
<li><em>player_set_playback()</em><br />
Deux modes peuvent être défini, soit PLAYER_PB_SINGLE ou PLAYER_PB_AUTO. Dans le cas de &#8220;single&#8221;, seul le mrl en cours sera lu lors d&#8217;un appel à <em>player_playback_start()</em>. Le mode &#8220;auto&#8221; va permettre à libplayer de lire toute la liste de lecture sans une intervention de l&#8217;extérieur. A chaque morceau qui se termine, libplayer va passer au suivant jusqu&#8217;à atteindre la fin de la liste.</li>
</ul>
<p style="text-align:justify;">Le fait de lire la liste depuis la position courante jusqu&#8217;à la fin n&#8217;est pas toujours très intéressant, il existe donc deux fonctions qui sont très souvent présentes dans ce type de logiciel.</p>
<ul>
<li><em>player_set_loop()</em><br />
Pour autant que le mode est en &#8220;auto&#8221;, il est possible de dire à libplayer de répéter le même morceau un certain nombre de fois avec PLAYER_LOOP_ELEMENT, ou alors de répéter la liste de lecture avec PLAYER_LOOP_PLAYLIST. Un paramètre de cette fonction permet de dire combien de fois et si ce paramètre est négatif, le bouclage est infini.</li>
</ul>
<ul>
<li><em>player_set_shuffle()</em><br />
Ici aussi, le mode de playback doit être &#8220;auto&#8221;. Ainsi la liste de lecture sera mélangée et le morceau lu suivant sera différent de l&#8217;ordre d&#8217;insertion des morceaux dans la liste de lecture. Chaque activation et désactivation du &#8220;shuffle&#8221; va réinitialiser la liste de lecture et donc mélanger l&#8217;ordre.</li>
</ul>
<p style="text-align:justify;">Bien sûr il est possible de combiner les fonctionnalités. Si le &#8220;loop&#8221; est indiqué sur PLAYER_LOOP_PLAYLIST et que le &#8220;shuffle&#8221; est activé, chaque fois que libplayer arrive à la fin de la liste de lecture, il la mélangera à nouveau et recommencera autant de fois qu&#8217;il a été spécifié avec <em>player_set_loop()</em>.<br />
Vous vous dites qu&#8217;il n&#8217;y a rien d&#8217;exceptionnel la dedans, vous avez tout à fait raison. Mon but est uniquement de présenter quelques fonctionnalités exploitables partiellement que par un seul outil &#8220;test-player&#8221; et forcément ignorées d&#8217;Enna. Lorsque test-player est lancé, il suffit d&#8217;utiliser [#] pour changer de mode, [.] pour changer le bouclage (il y a quelques valeurs prédéfinies) et [,] pour mélanger la liste.</p>
<h3 style="text-align:justify;">L&#8217;automatisation de la lecture</h3>
<p style="text-align:justify;">J&#8217;ai parlé au début d&#8217;une fonction un peu différente. Cette fonction permet de rendre possible la lecture bouclée et mélangée. Mais avant ça un petit peu de théorie sur libplayer. Bien qu&#8217;il n&#8217;y a à priori rien d&#8217;exceptionnel d&#8217;automatiser la lecture dans libplayer, il faut qu&#8217;en même se poser une question. Le fait d&#8217;automatiser la lecture présage l&#8217;existence d&#8217;une boucle. Ainsi lorsqu&#8217;un fichier est lu en entier (donc un événement du type EOF est généré) il faut forcer le passage au morceau suivant d&#8217;une manière ou d&#8217;une autre.</p>
<p style="text-align:justify;">Imaginons que le playback a été défini en &#8220;auto&#8221; et que la lecture a été amorcée via <em>player_playback_start()</em>. Cette fonction de start ne doit en aucun cas être bloquée jusqu&#8217;à la fin de la lecture. La chaîne d&#8217;exécution peut se visualiser ainsi:</p>
<p style="text-align:justify;padding-left:30px;">démarrage de la lecture -&#62; sélection du morceau -&#62; lecture -&#62; événement de fin de lecture -&#62; sélection du morceau suivant -&#62; lecture -&#62; etc, &#8230;</p>
<p style="text-align:justify;">Il y a une rétroaction et ça complique grandement les choses. Le premier démarrage de la lecture est amorcé à l&#8217;extérieur via l&#8217;utilisateur et cette fonction n&#8217;est pas bloquée jusqu&#8217;à l&#8217;EOF (en réalité elle bloque jusqu&#8217;à ce que la lecture soit réellement lancée). Donc le programme qui utilise libplayer peut faire autre chose en même tant que le média se lit. Il est donc nécessaire d&#8217;intercepter la fin de la lecture à l&#8217;intérieur de libplayer pour que se sois la bibliothèque qui passe au morceau suivant. Le problème n&#8217;est peut être pas tout de suite évident, alors détaillons la chaîne.</p>
<p style="text-align:justify;">Lorsque la lecture se termine un événement est créé, il est ensuite envoyé dans un callback interne (pour que libplayer sache que la lecture est terminée) et se callback envoi l&#8217;événement à un callback externe (pour que l&#8217;utilisateur de la lib soit aussi informé). Si depuis ce callback interne, un nouveau <em>player_playback_start()</em> serait amorcé, le callback serait bloqué tant que la lecture n&#8217;a pas réellement commencé. Et dès que celle-ci démarre vraiment, la fonction est relâchée. De ce fait, le callback interne resterait bloqué par le <em>player_playback_start()</em> pendant tout ce temps (si c&#8217;est un flux réseau, ça peut prendre quelques secondes). Les événements qui arriveraient entre le EOF et la fin du nouveau start s&#8217;empileraient et ne seraient pas envoyés. Ainsi des événements périmés arriveraient à l&#8217;utilisateur <span style="text-decoration:underline;">après</span> le start et ce n&#8217;est pas acceptable.</p>
<blockquote>
<p style="text-align:justify;">En réalité c&#8217;est encore un peu plus compliqué que ça, mais il est inutile d&#8217;aller dans les détails.</p>
</blockquote>
<p style="text-align:justify;">Le <a href="http://skywalker13.wordpress.com/2008/07/30/libplayer-et-le-multi-threading/">superviseur et le gestionnaire d&#8217;événement</a> de libplayer permettent donc de gérer se problème. Lorsqu&#8217;un événement est envoyé, il est empilé dans un FIFO. Les événements sont prioritaires et le superviseur est désactivé lorsque l&#8217;un d&#8217;eux survient. Ainsi il ne peut jamais y avoir d&#8217;événements périmés. La deuxième chose concerne le superviseur en lui même. Il met à disposition deux moyens pour exécuter une commande tel que le <em>player_playback_start()</em> par exemple. Le premier est le mode WAIT, et le second NO_WAIT. La différence est que le premier est utilisé pour toutes les fonctions publiques. Cela veut dire que tant que la fonction n&#8217;est pas terminée (par exemple tant que le start n&#8217;a pas réellement commencé), l&#8217;utilisateur est bloqué. Le second mode permet de lancer une fonction mais sans aucune attente. Par exemple le start serait empilé dans le FIFO du superviseur mais n&#8217;attendrait pas. Ce mode n&#8217;est pas autorisé depuis l&#8217;API publique pour plusieurs raisons, dont une très importante. Lorsque l&#8217;utilisateur utilise la bibliothèque il doit être sûr que la commande soit effectivement exécutée afin d&#8217;avoir un comportement &#8220;normal&#8221; donc comme s&#8217;il n&#8217;y avait pas de parallélisme. Quand vous faites par exemple un <em>printf()</em>, vous voulez que celui-ci s&#8217;exécute à ce moment là et pas 2 secondes plus tard. Sinon dans le cas de libplayer, vous feriez un start, puis autre chose, un stop, get_property, etc,..  Sans savoir quand est-ce que les fonctions seront réellement exécutées. Dit autrement, les fonctions de l&#8217;API publique sont toutes <strong>synchrones</strong>. L&#8217;autre mode est asynchrone et demande quelques considérations. Pour les fonctions qui retournent des valeurs par exemple, si l&#8217;API publique était asynchrone, il faudrait pouvoir indiquer un callback pour chaque fonction afin d&#8217;avoir un moyen de récupérer les valeurs. Cette fonctionnalité n&#8217;est pas disponible actuellement.</p>
<p style="text-align:justify;">Mais revenons en à l&#8217;automatisation de la lecture. Pour que libplayer puisse passer au morceau suivant sans bloquer le callback du gestionnaire d&#8217;événement il doit travailler de manière <strong>asynchrone</strong>. C&#8217;est donc (à l&#8217;heure où j&#8217;écris ces lignes) le seul endroit où une fonction est utilisée en NO_WAIT (en vérité ce n&#8217;est pas tout à fait vrai, mais je vous épargne les autres cas particuliers). Cette fonction se nomme:</p>
<ul>
<li><em>player_mrl_next_play()</em><br />
Les fonctions <em>player_mrl_next()</em> et <em>player_mrl_previous()</em> à disposition dans l&#8217;API publique permettent de progresser dans la liste de lecture par rapport à l&#8217;ordre d&#8217;insertion des mrls. La fonction next_play est bien différente. Elle va tenir compte du &#8220;loop&#8221; et du &#8220;shuffle&#8221; et est donc un peu plus sophistiquée.</li>
</ul>
<p style="text-align:justify;">Je n&#8217;ai pas rendu accessible cette fonction depuis l&#8217;API publique pour aucune bonne raison. Elle peut très bien être utilisée de manière synchrone. Elle est utilisée en asynchrone dans libplayer pour libérer le callback le plus vite possible et donc pour respecter la bonne marche des événements. Le fait que les événements sont prioritaires au superviseur indique aussi que la fonction ne pourra jamais se terminer tant que le gestionnaire d&#8217;événement ne redonne pas la main au superviseur. Une fonction forcée en WAIT provoquerait irrémédiablement un deadlock. Autrement dit ce serait le serpent qui se mort la queue (ou qui se mort le FIFO).</p>
<h3 style="text-align:justify;">Conclusion</h3>
<p style="text-align:justify;">Le but de cet article est de montrer une facette peu connue de libplayer. Et que cette bibliothèque est bien plus qu&#8217;une simple couche d&#8217;abstraction sur MPlayer, xine, VLC et GStreamer. Les rôles du superviseur et du gestionnaire d&#8217;événement ne se limitent pas qu&#8217;aux cas d&#8217;utilisations exprimés précédemment. Il y a de nombreuses autres raisons mais ce n&#8217;est pas l&#8217;objectif de cet article que d&#8217;en parler en détail ici.</p>
<p style="text-align:justify;">A bientôt,</p>
<p style="text-align:justify;padding-left:30px;">Mathieu SCHROETER</p>
</div>]]></content:encoded>
</item>

</channel>
</rss>
