<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog du projet ZiK</title>
	<atom:link href="https://blog.developpez.com/zik/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/zik</link>
	<description></description>
	<lastBuildDate>Wed, 14 Dec 2011 16:32:19 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Sortie de ZiK 0.17.1</title>
		<link>https://blog.developpez.com/zik/p10584/zik/sortie_de_zik_0_17_1</link>
		<comments>https://blog.developpez.com/zik/p10584/zik/sortie_de_zik_0_17_1#comments</comments>
		<pubDate>Wed, 14 Dec 2011 16:32:19 +0000</pubDate>
		<dc:creator><![CDATA[vinc-mai]]></dc:creator>
				<category><![CDATA[Nouvelle version]]></category>
		<category><![CDATA[ZiK]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Un court billet pour annoncer la sortie de ZiK en version 0.17.1. Cette version apporte uniquement des corrections de bugs. Non, le développement de ZiK n&#8217;est pas stoppé.]]></description>
				<content:encoded><![CDATA[<p>Un court billet pour annoncer la sortie de ZiK en version 0.17.1.<br />
Cette version apporte uniquement des corrections de  bugs.</p>
<p>Non, le développement de ZiK n&rsquo;est pas stoppé.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title></title>
		<link>https://blog.developpez.com/zik/p9904/zik/title_190</link>
		<comments>https://blog.developpez.com/zik/p9904/zik/title_190#comments</comments>
		<pubDate>Tue, 19 Apr 2011 16:13:43 +0000</pubDate>
		<dc:creator><![CDATA[vinc-mai]]></dc:creator>
				<category><![CDATA[Nouvelle version]]></category>
		<category><![CDATA[ZiK]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Le lecteur audio ZiK est sorti en version 0.17. Les nouveautés sont : nouveaux icônes créés par J. Kaiden, fermeture du bug 28638 qui bloquer l&#8217;interface graphique, application du choix de session (multi/unique) sans redémarrage de ZiK, clôture d&#8217;un bug qui empêcher de recharger le navigateur de la session précédente, lors de l&#8217;édition de la liste de lecture le dialogue d&#8217;information n&#8217;est affichée plus qu&#8217;une fois, lors de l&#8217;affichage de la fenêtre ZiK utilise la [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Le lecteur audio <a href="http://zik.developpez.com/">ZiK</a> est sorti en version 0.17.</p>
<p>Les nouveautés sont :<br />
nouveaux icônes créés par J. Kaiden,<br />
fermeture du <a href="http://rubyforge.org/tracker/index.php?func=detail&amp;aid=28638&amp;group_id=5494&amp;atid=21256">bug 28638</a> qui bloquer l&rsquo;interface graphique,<br />
application du choix de session (multi/unique) sans redémarrage de ZiK,<br />
clôture d&rsquo;un bug qui empêcher de recharger le navigateur de la session précédente,<br />
lors de l&rsquo;édition de la liste de lecture le dialogue d&rsquo;information n&rsquo;est affichée plus qu&rsquo;une fois,<br />
lors de l&rsquo;affichage de la fenêtre ZiK utilise la position précédente,<br />
ajout d&rsquo;ascenseurs dans l&rsquo;assistant.</p>
<p>Et pour les modules :<br />
cacher ZiK lors d&rsquo;un clic sur la croix de la fenêtre (TrayICon),<br />
afficher/cacher ZiK (HotKeys),<br />
clôture d&rsquo;un bug qui empêcher les sessions multiple (HotKeys),<br />
clôture d&rsquo;un bug qui prévenait de rapatrier les informations depuis le web (Brainz).</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sortie de ZiK 0.16.2</title>
		<link>https://blog.developpez.com/zik/p9806/zik/nouvelle-version/sortie_de_zik_0_16_2</link>
		<comments>https://blog.developpez.com/zik/p9806/zik/nouvelle-version/sortie_de_zik_0_16_2#comments</comments>
		<pubDate>Sat, 12 Mar 2011 19:01:42 +0000</pubDate>
		<dc:creator><![CDATA[vinc-mai]]></dc:creator>
				<category><![CDATA[Nouvelle version]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Je viens de sortir la version 0.16.2 qui corrige 2 bogues afin d&#8217;éviter que ZiK ne plante au démarrage.]]></description>
				<content:encoded><![CDATA[<p>Je viens de sortir la version <a href="http://projets.developpez.com/projects/zik/files">0.16.2</a> qui corrige 2 bogues afin d&rsquo;éviter que ZiK ne plante au démarrage.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sortie de ZiK 0.16</title>
		<link>https://blog.developpez.com/zik/p9800/zik/nouvelle-version/sortie_de_zik_0_16</link>
		<comments>https://blog.developpez.com/zik/p9800/zik/nouvelle-version/sortie_de_zik_0_16#comments</comments>
		<pubDate>Fri, 11 Mar 2011 06:46:41 +0000</pubDate>
		<dc:creator><![CDATA[vinc-mai]]></dc:creator>
				<category><![CDATA[Nouvelle version]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Les nouveautés sont : un gem. l&#8217;installation des greffons de GStreamer au besoin (nécessite la future version 0.90.9 de ruby-gnome2), l&#8217;export des fichiers audio de la liste de lecture dans un répertoire. Cette nouvelle version corrige aussi des bogues.]]></description>
				<content:encoded><![CDATA[<p>Les nouveautés sont :<br />
un <a href="http://rubygems.org/gems/zik">gem</a>.<br />
l&rsquo;installation des greffons de GStreamer au besoin (nécessite la future version 0.90.9 de ruby-gnome2),<br />
l&rsquo;export des fichiers audio de la liste de lecture dans un répertoire.</p>
<p>Cette nouvelle version corrige aussi des bogues.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adapter une bibliothèque C pour ruby (1)</title>
		<link>https://blog.developpez.com/zik/p9266/ruby/adapter_une_bibliotheque_c_pour_ruby_1</link>
		<comments>https://blog.developpez.com/zik/p9266/ruby/adapter_une_bibliotheque_c_pour_ruby_1#comments</comments>
		<pubDate>Fri, 01 Oct 2010 15:17:24 +0000</pubDate>
		<dc:creator><![CDATA[vinc-mai]]></dc:creator>
				<category><![CDATA[debian-fr]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Introduction J&#8217;utilise régulièrement ruby-taglib. Malheureusement, certains bugs empêchent son utilisation avec ruby 1.9. Après avoir tenté, avec plus ou moins de succès, de corriger ces bugs, j&#8217;ai décidé de réécrire cette bibliothèque. La version originale est basée sur ruby/DL, bibliothèque que je n&#8217;ai jamais utilisée. Je profite de cette réécriture pour proposer une série d&#8217;articles sur la manière d&#8217;adapter une bibliothèque C. Préparation Je développe pour l&#8217;instant sous ubuntu 10.04 (je terminerai sûrement ces articles [&#8230;]]]></description>
				<content:encoded><![CDATA[<h2>Introduction</h2>
<p>
J&rsquo;utilise régulièrement <a href="http://www.hakubi.us/ruby-taglib/">ruby-taglib</a>. Malheureusement, certains bugs empêchent son utilisation avec ruby 1.9. Après avoir tenté, avec plus ou moins de succès, de corriger ces bugs, j&rsquo;ai décidé de réécrire cette bibliothèque. La version originale est basée sur <a href="http://ttsky.net/ruby/ruby-dl.html">ruby/DL</a>, bibliothèque que je n&rsquo;ai jamais utilisée. Je profite de cette réécriture pour proposer une série d&rsquo;articles sur la manière d&rsquo;adapter une bibliothèque C.
</p>
<p><span id="more-14"></span></p>
<h2>Préparation</h2>
<p>
Je développe pour l&rsquo;instant sous ubuntu 10.04 (je terminerai sûrement ces articles sous la version 10.10). J&rsquo;ai installé <a href="http://developer.kde.org/~wheeler/taglib.html">taglib</a>, ruby et rdoc soit les paquets debian suivant : libtagc0, libtagc0-dev, ruby, ruby-dev, rdoc.
</p>
<h2>Hiérarchie</h2>
<p>
La commande <b>tree</b> présente l&rsquo;arborescence de mon répertoire de travail.
</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ tree <br />
. <br />
&amp;#9500;&amp;#9472;&amp;#9472; extconf.rb <br />
&amp;#9500;&amp;#9472;&amp;#9472; lib <br />
&amp;#9474;   &amp;#9492;&amp;#9472;&amp;#9472; taglib2.rb <br />
&amp;#9492;&amp;#9472;&amp;#9472; taglib2.c</div></div>
<p>
Le fichier <b>extconf.rb</b>, écrit en ruby, permettra de préparer les sources en vue de compiler la bibliothèque. Le fichier <b>lib/taglib2.rb</b>, lui aussi écrit en ruby, est le fichier lu par l&rsquo;interpréteur ruby lors de l&rsquo;appel à <b>require &laquo;&nbsp;taglib2&Prime;</b> qui chargera notre future bibliothèque.Le fichier <b>taglib2.c</b>, écrit en C, contiendra les méthodes qui permettent d&rsquo;interfacer taglib.
</p>
<h2>Ruby</h2>
<p>
Dans un premier temps, j&rsquo;utiliserai seulement le langage ruby. J&rsquo;écris donc les premières lignes de code dans le fichier <b>lib/taglib2.rb</b>.
</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ cat lib/taglib2.rb &nbsp;<br />
module TagLib <br />
&nbsp; VERSION=[0, 0, 1] <br />
end</div></div>
<p>
Une constante nommée <b>VERSION</b> est définie comme un tableau contenant 3 entiers. D’ores et déjà, je peux tester mon code grâce à irb, un interpréteur ruby en ligne de commande. La bibliothèque n&rsquo;étant pas encore installée, j&rsquo;utilise un chemin relatif pour y accéder.
</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ irb <br />
&gt; require &quot;./lib/taglib2&quot; <br />
=&gt; true <br />
&gt; TagLib::VERSION <br />
=&gt; [0, 0, 1]</div></div>
<h2>Interface ruby/C</h2>
<h3>Exceptions</h3>
<p>
Nous nous intéressons enfin au fichier <b>taglib2.c</b>. Nous définissons, tout d&rsquo;abord, les différents types d&rsquo;exceptions qui peuvent être levés par la bibliothèque.
</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ cat taglib2.c <br />
#include &lt;ruby.h&gt; <br />
#include &lt;taglib/tag_c.h&gt; <br />
&nbsp;<br />
VALUE mTagLib; <br />
VALUE eBadPath, eBadFile, eBadTag, eBadAudioProperties; <br />
&nbsp;<br />
void <br />
Init_taglib2() <br />
{ <br />
&nbsp; mTagLib=rb_define_module(&quot;TagLib&quot;); <br />
&nbsp; eBadPath=rb_define_class_under(mTagLib, &quot;BadPath&quot;, rb_eException); <br />
&nbsp; &nbsp; eBadFile=rb_define_class_under(mTagLib, &quot;BadFile&quot;, rb_eException); <br />
&nbsp; &nbsp; eBadTag=rb_define_class_under(mTagLib, &quot;BadTag&quot;, rb_eException); <br />
&nbsp; &nbsp; eBadAudioProperties=rb_define_class_under(mTagLib, &quot;BadAudioProperties&quot;, rb_eException); <br />
}</div></div>
<p>
Les fichiers nécessaires au développement de la bibliothèque sont tout d&rsquo;abord inclus puis nous déclarons des variables de type <b>VALUE</b>. Ce type est utilisé pour toute variable représentant un objet du langage ruby. Les noms de variables représentant des exceptions sont généralement préfixés par la lettre <b>e</b>. Pour les modules, la lettre <b>m</b> est utilisée, pour les classes, la lettre <b>c</b>.<br />
Il s&rsquo;agit d&rsquo;une convention et non d&rsquo;une règle. Finalement, on retrouve la fonction <b>Init_taglib2</b> qui (re)définit le module TagLib ainsi que 4 classes descendant de la classe ruby <b>Exception</b> représentée en C par la variable <b>rb_eException</b>.
</p>
<p>
Le code suivant, écrit en ruby, est équivalent à la définition donnée en C de l&rsquo;exception <b>TagLib::BadPath</b>
</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">module TagLib <br />
class BadPath &lt; Exception <br />
end <br />
end</div></div>
<h3>Compilation</h3>
<p>
Afin de compiler notre bibliothèque, nous devons créer un fichier <b>Makefile</b>. La bibliothèque <b>mkmf</b> nous facilite le travail.
</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ cat -n extconf.rb <br />
1 &nbsp;require 'mkmf' <br />
2 &nbsp;<br />
3 &nbsp;have_header('ruby.h') || exit 1 <br />
4 &nbsp;have_header('taglib/tag_c.h') || exit(1) <br />
5 &nbsp;<br />
6 &nbsp;create_makefile(&quot;taglib2&quot;) <br />
$ ruby extconf.rb &nbsp;<br />
checking for ruby.h... yes <br />
checking for taglib/tag_c.h... yes <br />
creating Makefile</div></div>
<p>
Dans le fichier <b>extconf.rb</b>, la présence des fichiers « header » de ruby et de taglib sont vérifiées ligne 3 et 4. La ligne 6 permet de créer le fichier <b>Makefile</b> du projet taglib2. Lors du chargement d&rsquo;une interface ruby/C, la fontion appelée est de la forme <b>Init_NomDuProjet</b>,c&rsquo;est pourquoi l&rsquo;unique fonction du fichier  <b>taglib2.c</b> s&rsquo;appelle <b>Init_taglib2</b>. Il s&rsquo;agit de l&rsquo;équivalent de la fonction <b>main</b> d&rsquo;un programme C traditionnel.
</p>
<p>
Après avoir créer le fichier Makefile, compilons.
</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ ruby extconf.rb <br />
$ make</div></div>
<p>
Un bibliothèque dynamique <b>taglib2.so</b> vient de faire son apparition. Ruby permet de charger directement ce type de bibliothèque. Nous ajoutons donc l&rsquo;instruction (<b>require &laquo;&nbsp;taglib2.so&nbsp;&raquo;</b>) de chargement dans le fichier <b>lib/taglib2.rb</b>.
</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ cat lib/taglib2.rb &nbsp;<br />
require &quot;taglib2.so&quot; <br />
&nbsp;<br />
module TagLib <br />
VERSION=[0, 0, 1] <br />
end</div></div>
<h3>Test</h3>
<p>
Nous testons notre code sous irb.
</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ irb <br />
&gt; $:.unshift('.') <br />
&gt; $:.unshift('lib') <br />
&gt; require &quot;taglib2&quot; <br />
=&gt; true <br />
&gt; TagLib.constants <br />
=&gt; [&quot;BadFile&quot;, &quot;BadPath&quot;, &quot;BadAudioProperties&quot;, &quot;VERSION&quot;, &quot;BadTag&quot;] <br />
&gt; TagLib::BadPath.new <br />
=&gt; #&lt;TagLib::BadPath: TagLib::BadPath&gt;</div></div>
<p>
J&rsquo;ajoute tout d&rsquo;abord le répertoire courant et le répertoire <b>lib</b> dans les chemins vérifiés lors du chargement d&rsquo;un fichier afin que les appels à <b>require &laquo;&nbsp;taglib2&Prime;</b> et à <b>require &laquo;&nbsp;taglib2.so&nbsp;&raquo;</b> n&rsquo;échouent pas. Cette astuce ne sera plus nécessaire une fois la bibliothèque installée. On vérifie que les constantes définies dans les fichiers sources <b>lib/taglib2.rb</b> et <b>taglib2.c</b> sont accessibles.
</p>
<h2>Conclusion</h2>
<p>
Lors de ce premier billet, j&rsquo;ai mis en place les différents éléments (bibliothèques, fichiers) qui seront nécessaires à l&rsquo;interface ruby de taglib. Nous avons, déjà, réussi à obtenir un code fonctionnel. Il nous reste à porter les fonctions proposées par taglib afin de pourvoir accéder, en ruby, aux tags de fichiers musicaux.<br />À la prochaine.
</p>
<p>
Je ne suis pas un spécialiste du langage C, si vous avez des suggestions à faire sur mon code<br />
commentez ce billet.
</p>
<h2>Addendum</h2>
<p>Je rajoute la liste des billets faisant suite à celui-ci :</p>
<ul>
<li><a href="http://blog.developpez.com/zik/p9343/ruby/adapter-une-bibliotheque-c-pour-ruby-2/">billet 2</a>,</li>
<li><a href="http://blog.developpez.com/zik/p9348/ruby/adapter-une-bibliotheque-c-pour-ruby-3/">billet 3</a>,</li>
<li><a href="http://blog.developpez.com/zik/p9357/ruby/adapter-une-bibliotheque-c-pour-ruby-4/">billet 4</a>,</li>
<li><a href="http://blog.developpez.com/zik/p9360/ruby/adapter-une-bibliotheque-c-pour-ruby-5/">billet 5</a>.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Future 0.16</title>
		<link>https://blog.developpez.com/zik/p9573/zik/git/future_0_16</link>
		<comments>https://blog.developpez.com/zik/p9573/zik/git/future_0_16#comments</comments>
		<pubDate>Sat, 11 Dec 2010 03:17:16 +0000</pubDate>
		<dc:creator><![CDATA[vinc-mai]]></dc:creator>
				<category><![CDATA[git]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Quelques nouvelles de la version en développement. En réponse à la demande #28702, il est maintenant possible d&#8217;exporter l&#8217;ensemble des chansons composant la liste de lecture grâce au menu Liste de lecture/Export songs (à traduire). La liste est écrite, au format local, dans le fichier que vous avez spécifié dans le dialogue. Afin de respecter votre classement par dossier, une option du dialogue permet de recréer l&#8217;arborescence utilisée pour les fichier d&#8217;origine. L&#8217;ébauche d&#8217;un nouveau [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Quelques nouvelles de la version en développement.</p>
<p>En réponse à la demande <a href="http://rubyforge.org/tracker/index.php?func=detail&amp;aid=28702&amp;group_id=5494&amp;atid=21259">#28702</a>, il est maintenant possible d&rsquo;exporter l&rsquo;ensemble des chansons composant la liste de lecture grâce au menu <b>Liste de lecture/Export songs</b> (à traduire). La liste est écrite, au format local, dans le fichier que vous avez spécifié dans le dialogue. Afin de respecter votre classement par dossier, une option du dialogue permet de recréer l&rsquo;arborescence utilisée pour les fichier d&rsquo;origine.</p>
<p>L&rsquo;ébauche d&rsquo;un nouveau module fait son apparition dans le dépôt git. Il permettra d&rsquo;ajouter des entrées dans certains menus afin d&rsquo;appeler un programme externe. Pour l&rsquo;instant, seul le menu principal (en haut de la fenêtre ZiK) est concerné. Je pense ajouter la gestion des menus contextuels au niveau de la liste de lecture et du navigateur et la capacité à appeler un programme lors de la lecture d&rsquo;une nouvelle chanson.</p>
<p>Lien : <a href="http://www.developpez.net/forums/d1011166/applications/projets/projets-heberges/zik/informations-version-0-15pgit/">discussion sur le forum</a>.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sortie de ZiK 0.15.3</title>
		<link>https://blog.developpez.com/zik/p9468/zik/nouvelle-version/sortie_de_zik_0_15_3</link>
		<comments>https://blog.developpez.com/zik/p9468/zik/nouvelle-version/sortie_de_zik_0_15_3#comments</comments>
		<pubDate>Mon, 08 Nov 2010 17:33:42 +0000</pubDate>
		<dc:creator><![CDATA[vinc-mai]]></dc:creator>
				<category><![CDATA[Nouvelle version]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Cette nouvelle version corrige quelques bugs dont un qui empêche ZiK de fonctionner après une nouvelle installation.]]></description>
				<content:encoded><![CDATA[<p>Cette nouvelle version corrige quelques bugs dont un qui empêche ZiK de fonctionner après une nouvelle installation.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ZiK 0.15.2</title>
		<link>https://blog.developpez.com/zik/p9370/debian-fr/zik_0_15_2</link>
		<comments>https://blog.developpez.com/zik/p9370/debian-fr/zik_0_15_2#comments</comments>
		<pubDate>Mon, 11 Oct 2010 15:18:08 +0000</pubDate>
		<dc:creator><![CDATA[vinc-mai]]></dc:creator>
				<category><![CDATA[debian-fr]]></category>
		<category><![CDATA[Nouvelle version]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Cette version corrige des bogues dans l&#8217;assistant and dans le module brainz qui peuvent provoquer la fermeture de ZiK. L&#8217;entrée « éditer » a disparu du menu « liste de lecture » car il provoque un bogue. La liste peut toujours être éditée via le boutton ou le menu contextuel.]]></description>
				<content:encoded><![CDATA[<p>Cette version corrige des bogues dans l&rsquo;assistant and dans le module brainz qui peuvent provoquer la fermeture de ZiK.<br />
L&rsquo;entrée « éditer » a disparu du menu « liste de lecture » car il provoque un bogue. La liste peut toujours être éditée via le boutton ou le menu contextuel.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sortie de ZiK 0.15</title>
		<link>https://blog.developpez.com/zik/p9367/debian-fr/sortie_de_zik_0_15</link>
		<comments>https://blog.developpez.com/zik/p9367/debian-fr/sortie_de_zik_0_15#comments</comments>
		<pubDate>Sat, 09 Oct 2010 17:03:17 +0000</pubDate>
		<dc:creator><![CDATA[vinc-mai]]></dc:creator>
				<category><![CDATA[debian-fr]]></category>
		<category><![CDATA[Nouvelle version]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[La version 0.15 de ZiK est sortie. Un assistant explique le fonctionnement de ZiK lors d&#8217;une nouvelle installation. Il permet aussi une configuration rapide du logiciel. Il est disponible via le menu aide. L&#8217;édition de la liste de lecture et la recherche de pistes audio sont maintenant intégrées à la fenêtre principale. La vue compact permet d&#8217;afficher un plus grand nombre de pistes audio dans la liste de lecture. ZiK supporte maintenant ruby-taglib2 et les [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>La version 0.15 de ZiK est sortie.</p>
<p>Un assistant explique le fonctionnement de ZiK lors d&rsquo;une nouvelle installation. Il permet aussi une configuration rapide du logiciel. Il est disponible via le menu aide.<br />
L&rsquo;édition de la liste de lecture et la recherche de pistes audio sont maintenant intégrées à la fenêtre principale.<br />
La vue compact permet d&rsquo;afficher un plus grand nombre de pistes audio dans la liste de lecture.<br />
ZiK supporte maintenant ruby-taglib2 et les nouvelles versions de rghk (0.2) et de gtk (2.22).<br />
La traduction française a été mise à jour.<br />
Pour plus d&rsquo;informations, voyer le fichier ChangeLog.</p>
<p>Téléchargez ZiK sur <a href="http://projets.developpez.com/projects/zik/files">developpez.com</a>.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Adapter une bibliothèque C pour ruby (5)</title>
		<link>https://blog.developpez.com/zik/p9360/ruby/adapter_une_bibliotheque_c_pour_ruby_5</link>
		<comments>https://blog.developpez.com/zik/p9360/ruby/adapter_une_bibliotheque_c_pour_ruby_5#comments</comments>
		<pubDate>Thu, 07 Oct 2010 16:26:01 +0000</pubDate>
		<dc:creator><![CDATA[vinc-mai]]></dc:creator>
				<category><![CDATA[debian-fr]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Diverses fonctions Je vais présenter ici quelques fonctions utiles. Pour des questions de faciliter, j&#8217;ai créé deux nouvelles méthodes pour le module TagLib bien qu&#8217;elles n&#8217;aient rien avoir avec taglib. Utiliser un bloc rb_define_singleton_method(mTagLib, &#34;block&#34;, block, 0); La méthode TagLib.block ne prend aucun paramètre, mais un bloc doit lui être fourni. Elle exécute ce bloc en lui passant comme argument l&#8217;objet TagLib et retourne le bloc sous la forme d&#8217;un Proc. $ make $ irb [&#8230;]]]></description>
				<content:encoded><![CDATA[<h2>Diverses fonctions</h2>
<p>Je vais présenter ici quelques fonctions utiles. Pour des questions de faciliter, j&rsquo;ai créé deux nouvelles méthodes pour le module <b>TagLib</b> bien qu&rsquo;elles n&rsquo;aient rien avoir avec taglib.</p>
<h3>Utiliser un bloc</h3>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">rb_define_singleton_method(mTagLib, &quot;block&quot;, block, 0);</div></div>
<p>La méthode <b>TagLib.block</b> ne prend aucun paramètre, mais un bloc doit lui être fourni. Elle exécute ce bloc en lui passant comme argument l&rsquo;objet <b>TagLib</b> et retourne le bloc sous la forme d&rsquo;un <b>Proc</b>.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$ make <br />
$ irb <br />
&gt; require './lib/taglib2.rb' <br />
=&gt; true <br />
TagLib.block{|a| p a} <br />
TagLib <br />
=&gt; #&lt;Proc:0xb75ba510@(irb):2&gt;</div></div>
<p>Voici la fonction implémentant ce comportement.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">VALUE <br />
block(VALUE self) <br />
{ <br />
&nbsp; &nbsp; rb_yield(self); <br />
&nbsp; &nbsp; return rb_block_proc(); <br />
}</div></div>
<p><b>rb_yield</b> permet d&rsquo;appeler le bloc passé à la méthode alors que <b>rb_block_proc</b> permet de le manipuler sous la forme d&rsquo;un <b>Proc</b>.</p>
<h3>Utiliser des paramètres optionnels</h3>
<p>Je propose d&rsquo;écrire l&rsquo;équivalent de code écrit en ruby.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">def TagLib.n(tab=[&quot;Salut&quot;, &quot;Re&quot;]) <br />
&nbsp; &nbsp; tab.to_a <br />
&nbsp; &nbsp; tab.each{|s| $stdout.puts s} <br />
&nbsp; &nbsp; tab[0] <br />
end</div></div>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">rb_define_singleton_method(mTagLib, &quot;n&quot;, n, -1);</div></div>
<p>Le dernier argument lors de la déclaration de la méthode <b>TagLib.n</b> vaut <b>-1</b> ce qui indique que la méthode ne possède pas un nombre d&rsquo;arguments fixees. La fonction <b>rb_scan_args</b> permet de récupérer de manière propre les paramètres passés à la méthode. Le troisième argument de cette fonction est une chaîne de caractère représentant deux chiffres. Le premier indique le nombre de paramètres obligatoires, le second indique le nombre de paramètres optionnels.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">VALUE <br />
n1(VALUE str) <br />
{ <br />
&nbsp; &nbsp; return rb_funcall(rb_stdout, rb_intern(&quot;puts&quot;), 1, str); <br />
} <br />
&nbsp;<br />
VALUE <br />
n(int argc, VALUE* argv, VALUE self) <br />
{ <br />
&nbsp; &nbsp; VALUE tab; <br />
&nbsp;<br />
&nbsp; &nbsp; rb_scan_args(argc, argv, &quot;01&quot;, &amp;tab); <br />
&nbsp; &nbsp; if (NIL_P(tab)) <br />
&nbsp; &nbsp; &nbsp; &nbsp; tab=rb_ary_new3(2, rb_str_new2(&quot;Salut&quot;), rb_str_new2(&quot;Re&quot;)); <br />
&nbsp; &nbsp; rb_funcall(tab, rb_intern(&quot;to_a&quot;), 0); <br />
&nbsp;<br />
&nbsp; &nbsp; rb_iterate(rb_each, tab, n1, Qnil); <br />
&nbsp; &nbsp; return RARRAY(tab)-&gt;ptr[0]; <br />
}</div></div>
<p><b>TagLib.n</b> peut donc être appelée avec un paramètre ou sans. Si aucun argument n&rsquo;a été passé (<b>tab=nil</b>), tab est initialisé en créant un tableau contenant deux objets <b>String</b>. On vérifie ensuite que <b>tab</b> appartient à la classe <b>Array</b> ou s&rsquo;en rapproche (<a href="http://fr.wikipedia.org/wiki/Duck_typing">duck typing</a>). <b>rb_funcall</b> permet d&rsquo;appeler une méthode (deuxième argument) d&rsquo;un objet (premier argument) avec un certain nombre (troisième argument) de paramètres (arguments suivant). <b>rb_intern</b> permet d&rsquo;obtenir la méthode à partir d&rsquo;une chaîne de caractères.<br />
La fonction <b>n1</b> est ensuite appelé pour chacun des éléments du tableau grâce à <b>rb_iterate</b>. LA méthode retourne, finalement, le premier élément de <b>tab</b>, la macro <b>RARRAY</b> permettant d&rsquo;accéder à la structure interne d&rsquo;un objet de la classe <b>Array</b>, le champ <b>ptr</b> permettant d&rsquo;accéder aux éléments.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&gt; TagLib.n <br />
Salut <br />
Re <br />
=&gt; &quot;Salut&quot; <br />
&gt; TagLib.n([&quot;Bonjour&quot;]) <br />
Bonjour <br />
=&gt; &quot;Bonjour&quot;</div></div>
<h2>Liens utiles</h2>
<p>Quelques liens qui m&rsquo;ont aidé à écrire des extensions pour ruby en C :<br />
le fichier README.EXt fourni avec ruby,<br />
<a href="http://ruby-doc.org/docs/ProgrammingRuby/html/ext_ruby.html">ruby-doc</a>.<br />
En ce qui concerne taglib :<br />
l&rsquo;exemple dans les sources de taglib,<br />
le fichier bindings/c/tag_c.h.</p>
<h2>Sources</h2>
<p>Le code, présenté dans ces billets, implémentant le module, <b>TagLib</b> est téléchargeable <a href="http://zik.developpez.com/blog/c_ext/source/taglib2.tar.bz2">ici</a>.</p>
<h2>Conclusion</h2>
<p>Cette série d&rsquo;articles est finie. J&rsquo;espère qu&rsquo;ils vous seront utiles.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
