lundi 8 février 2010

C'est l'histoire d'un make

Il n'y a pas d'alternative viable aux autotools.

Tel est le point de vue sur les moteurs de production (heu... c'est quoi ce terme ? ils ont fumé quoi chez Wikipédia ?) que j'ai défendu ces dix dernières années, depuis le début du développement de Yabause. Cela n'a pas été facile tous les jours, il a fallu que réfute les arguments contraires de toutes les manières possibles : soit en argumentant, soit en jouant de mauvaise foi, soit en éliminant mes adversaires (heu...) ; bref, il a fallu que je bataille durement... mais voila, toutes les bonnes choses ont une fin et aujourd'hui Yabause est en train de quitter les autotools pour CMake.

Les opposants aux autotools ont donc remporté la bataille et leur victoire s'appuie sur quelques points :
  • les autotools sont prévus pour un environnement Unix, leurs dépendances ne sont raisonnables que dans ce cadre ; demander à un utilisateur Windows d'installer une couche d'émulation de l'environnement Unix pour compiler un logiciel n'a aucun sens ;
  • de plus, Yabause nécessitait des autotools récents ; par exemple les versions par défaut de MinGW ou celles installées sur Mac OS X n'étaient pas suffisantes, il fallait donc les installer à la main (avec leur dépendances aussi, pendant qu'on y est) ;
  • les scripts autotools sont difficilement maintenables et ceci pour plusieurs raisons, notamment la séparation entre configuration (autoconf) et construction (automake) ou encore le fait qu'autoconf ne soit qu'un système de macros, etc. ;
  • les autotools ne sont pas réellement des outils, mais plutôt une quête mystique : il faut être initié, lire de vieux grimoires et admettre qu'au final, on ne peut pas tout comprendre ; par exemple dans le manuel d'automake : « The reason for this is a bit hard to explain, but suffice to say that it simply won't work. »
  • Sûrement plein d'autres raisons... il faudrait demander aux purs anti-autotools :)
Au final, le point qui m'a permis de tenir aussi longtemps sans changer de système était que, d'accord, on change de système... mais qui s'occupe de réécrire le biniou ?

Et la, je dois avouer que mes adversaires ont été forts, très fort ; parce que c'est moi qui ai lancé le mouvement ! Bon, par contre, j'ai rapidement été rejoint par le reste de l'équipe et c'est à ce moment que j'ai compris que j'avais fait le bon choix : je n'allais plus être seul à maintenir ces saletés de scripts de construction !

À l'heure actuelle, nous sommes toujours en train de travailler sur les nouveaux scripts (on ne rattrape pas une dizaine d'années en deux semaines...), mais dans l'ensemble les choses se passent bien : les principaux ports (cross-) compilent et CMake a clairement une syntaxe et une utilisation plus agréable que les autotools. J'ai d'ailleurs un peu peur d'avoir été converti... je ne suis pas sur que je réutiliserais les autotools pour un projet un jour ; il va falloir que je trouve un nouveau titre à mon blog :)

vendredi 4 décembre 2009

Une seule traduction vous manque, et tout est cassé

Problème

Comme expliqué précédemment, je passe une bonne partie de mon temps de travail à développer Okawix, un navigateur en mode non connecté. Le logiciel est codé avec le Framework Mozilla, donc avec XUL/Javascript, et utilise aussi le système de traduction du Framework, enfin... les systèmes : des DTD pour la partie XUL et des fichiers properties pour Javascript.
Ces deux systèmes ont l'avantage d'être cohérents (genre, des DTD pour du XML, c'est la sauce, quoi), mais à l'usage présentent rapidement un inconvénient : toutes les chaînes doivent être traduites. Si une traduction manque dans un .properties, une exception sera levée à l'exécution ; bon là, c'est pas si grave, une exception ça peut encore se gérer. Si une traduction manque dans une DTD, les fichiers XUL utilisant cette traduction ne peuvent plus être affiché ; hu... là, ça peut faire mal.
J'ai donc pris rapidement l'habitude de traduire toutes les nouvelles chaînes en anglais et en français, les deux seules langues proposées par Okawix... avant. En effet, les traductions d'Okawix sont dorénavant gérées par le projet translatewiki.net (TWN), ce qui veut dire plein de traductions, dont certaines ne sont pas complètes ; ce qui veut aussi dire mise à jour de notre SVN automatiquement depuis TWN. De plus, Okawix créé automatiquement une liste des langues disponibles ; et pour finir, une fois une langue incomplète choisie il devient difficile de relancer le logiciel sans manipuler à la main la configuration du logiciel. Ouch...
Il fallait donc trouver une solution et après avoir demandé en vain à Google, j'en suis arrivé à la conclusion qu'il fallait que je trouve cette solution tout seul :)

Solution

L'idée est d'avoir une traduction "par défaut", qui est toujours complète et qu'on va utiliser pour combler les manques dans les autres traductions ; dans Okawix, la traduction par défaut est l'anglais.
On commence par déclarer un "content provider" pour la traduction par défaut dans le manifest de l'application, dans le cas d'Okawix, ça donne :
content defaultlocale locale/en-US/interfacewiki/
qui déclare donc un "content provider" nommé "defaultlocale" et qui pointe vers la traduction anglaise (au passage, promis, un de ces jours, je vire tous ces "interfacewiki" qui trainent un peu partout dans Okawix).
Pour la partie DTD, il faut alors charger la DTD de la traduction par défaut en dernier, dans Okawix ça ressemble à ça :
<!DOCTYPE window [
<!--ENTITY % wikiDTD SYSTEM "chrome://interfacewiki/locale/okawix.dtd"-->
<!--ENTITY % defaultDTD SYSTEM "chrome://defaultlocale/content/okawix.dtd"-->
%wikiDTD;
%defaultDTD;
]>
L'idée est que une entité ne peut déclarée qu'une seule fois, celles qui sont déclarées dans la traduction en cours sont chargées en premier et celles de la traduction par défaut ne font que "combler les trous".

On applique le même principe, ou presque, pour les fichiers properties :
<stringbundleset id="wk-strings-set">
<stringbundle src="chrome://interfacewiki/locale/okawix.properties"/>
<stringbundle src="chrome://defaultlocale/content/okawix.properties"/>
</stringbundleset>
On charge d'abord la traduction en cours, puis on "comble les trous", tout pareil, quoi... sauf que dans le cas du javascript, tout n'est pas terminé : il nous faut une fonction pour récupérer la traduction dans le stringbundleset. Ce qui donne a peu près ça :
my_translate_function = function( aBundleset, aString ) {
for( var i = 0 ; i < aBundleset.childNodes.length ; i++ ) {
var bundle = aBundleset.childNodes[ i ];
try {
return bundle.getString( aString );
}
catch( someerror ) {
}
}
return aString;
}
La fonction parcourt l'ensemble des stringbundle et appelle leur fonction getString, si la traduction existe elle est renvoyée, sinon une exception est levée, on l'attrape et on continue. Si la traduction n'existe nul part, on renvoie la chaîne d'origine.

Voila... je ne sais pas exactement ce que les puristes penseront de ce genre de méthode, mais au moins avec ça Okawix est capable de survivre à des traductions partielles :)

vendredi 27 novembre 2009

Ein verrücktes Wochenende

Two weeks ago, I made up my mind about publishing a new post on every Friday, but... I just failed at doing so last week :) but there's some good reason: I have been busy with two events : the openZIM developers meeting and my mother's 70 birthday.
My journey began on Friday morning at 10:30 when my boss and I took train to Paris, then from Paris to Basel and finally from Basel to Schopfeim where we reach our goal around 19:00. We spent the evening and part of the night eating spätzle and drinking Weißbier while chatting in English, French and German. Well, I didn't talked so much in German as my skills in this domain are limited to "Danke", finding exact spelling of words on Wikipedia and using Google to translate a blog post title.
On Saturday morning, we joined the openZIM work-group up to 11:30 when it was time for us to head back to France. I got home at 20:00 when the second part of my week end began.
De retour chez moi donc, le temps de me rafraichir, de passer une tenue adéquate et de faire la route, j'arrive chez mes parents à 20:45 où je passe la soirée à bien manger (enfin, pas tant que ça, les voyages ça ouvre pas forcément l'appétit) et à bien boire (calva FTW !) ; je pouvais me permettre, je dormais sur place.
Enfin voila, pour résumer c'était un week-end bien rempli, j'ai pas eu le temps de faire un billet :p

dimanche 15 novembre 2009

Télé Miksha

Le Métal n'est pas un style musical connu pour son humour délirant. Peut être que les appels à la destruction de l'univers par Satan, Chtulhu ou encore Pazuzu donnent une impression austère ; impression sûrement amplifiée par les noms rafraîchissants dont s'affublent certains spécimens tels que Necrophagist, Monstrosity, Vomitory, j'en passe et des meilleurs.

Pourtant, quelques groupes ont fait du décalage et de l'humour leur fond de commerce, comme Primus, Bumblefoot ou encore, dans un style complètement différent, Gronibard. Il arrive aussi plus rarement que des groupes « sérieux » se mettent à péter les fusibles. Par exemple, je suis tombé la dessus :



j'ai trouvé ça très bon ; surtout que pour avoir passé quelques soirées nuits à regarder des chaînes de télé-achat, je dois avouer que la parodie est plutôt bien réalisée (surtout l'épisode du lit).

Bon, à coté de ça, je ne suis pas sur d'être fan de la musique de Miksha ; mais bon, devant un tel effort je pense que je vais au moins tenter d'écouter :)

vendredi 13 novembre 2009

Twelve-step playlist

J'ai toujours détesté les compilations, les Best Of et dans une certaine mesure les albums Live aussi. Dans mon esprit, un album est un ensemble de chansons formant un tout cohérent ; vouloir les séparer pour les mélanger à d'autres morceaux n'a en fait qu'un seul sens : fournir du pré-maché à ceux ne voulant pas s'investir dans la découverte d'un style musical ou d'un groupe et répondre à la question "quel morceau écouter ?".

Bien entendu, j'avais exactement le même point de vue concernant les playlist ; et puis, en écoutant le dernier Dream Theater et plus particulièrement The Shattered Fortress, je me suis dit qu'en fait, les playlist pouvaient peut être avoir une utilité.

The Shattered Fortress est le dernier morceau d'une suite de cinq titres apparaissant sur les cinq derniers albums de Dream Theater. Le thème de la suite est la dépendance à l'alcool du batteur Mike Portnoy et les morceaux sont découpés en douze mouvements, chacun représentant l'une des étapes du programme des Alcooliques Anonymes. Vous pouvez trouver plus de détails sur la Twelve-step suite sur Wikipédia (en anglais, je vous déconseille l'article français...).

Du coup, je me disais que ça serait cool de pouvoir écouter les morceaux les uns à la suite des autres et... c'est exactement à ça que sert une playlist. Plus qu'à vérifier que Jiwa fournit bien tous les titres nécessaires. Oui. Bon ok, c'est parti !

La fameuse playlist est accessible ici : http://www.jiwa.fr/#playlist/469535 ; je viens de l'écouter, elle est plutôt cool... bon certes, il faut aimer les morceaux de plus de dix minutes et la musique pour les musiciens :)

Maintenant il ne me reste plus qu'à trouver d'autres utilisations amusantes des playlists.

vendredi 6 novembre 2009

Deezer c'est la meezer, jiwa voir ailleurs

Il fut un temps ou, pour pouvoir écouter de la musique, il fallait acheter des disques ; l'avènement d'Internet a changé la donne avec l'ouverture de plusieurs sites permettant d'écouter gratuitement de la musique, soit des albums entiers, soit des radios thématiques ou encore des « smart radio » qui sont plus ou moins sensées se régler sur les goûts de l'utilisateur.

Je suis venu à utiliser ce genre de services à cause de mon iPod : je cherchais une application pour écouter une « radio » Metal, de préférence des choses que je connaissais pas et si possible des choses que j'aurais bien aimé. À l'époque, j'ai testé les applications de Deezer puis de Last.fm et le second atomise clairement le premier, tant au niveau de l'adaptation aux goûts de l'utilisateur que de la variété des morceaux. J'ai alors connu une période de bonheur éphémère jusqu'au jour ou Last.fm a décidé qu'il faudrait maintenant payer... retour à Deezer.

Un des seuls (le seul, peut être) avantages de Deezer sur Last.fm est qu'il permet d'écouter des albums entier en utilisant l'interface Web. J'ai alors commencé une autre utilisation de ce type de site : écouter des albums sur mon ordinateur grâce à l'application flash (urk). S'en est suivi une deuxième période de stabilité ; j'utilisais de temps en temps les radios de Deezer malgré leurs défauts : les « smart radio » me ramènent invariablement aux mêmes groupes, même morceaux, entrecoupé de morceaux de publicité n'ayant rien à voir avec la choucroute ; les web radios diffusent toujours les mêmes morceaux avec une sélection... heu... disons qu'il faudrait leur expliquer que non, Alice Cooper ne fait pas de Metal ; mais au moins, j'ai accès aux albums complets sur le site... ou pas.

Il semblerait que les albums aient tendances à « disparaître » sur Deezer, sans prévenir en plus ; la sélection d'albums que j'avais commencé à construire existe toujours, mais certains ne pointent plus vers rien... super... Je me suis alors tourné vers un troisième service : Jiwa, qui comme Deezer, fournit l'accès aux albums complets. Le catalogue semble aussi plus fournit (au moins, en ce qui concerne le Metal) et, pour l'instant, les albums ont l'air de rester fidèles à leur poste dans ma sélection :) Par contre, au niveau radio, c'est le désert total : pas d'application iPod et si les radios de Deezer sont mauvaises, celles de Jiwa sont pathétiques ; les deux seules radios Metal sont "Hardcore / Metal" qui ne diffuse en fait que du Hardcore, aucun intêret donc, et Metal Symphonique, qui semble dédié aux groupes inconnus de Power Metal chanté par des nanas. Je passe.

Donc voila, en ce moment j'utilise Jiwa pour écouter des albums sur mon ordi et j'en suis assez content ; je continue d'utiliser les radios de Deezer pour l'iPod, faute de mieux. Peut être qu'un jour, je serais assez riche pour dépenser les 3 euros / mois d'abonnement à Last.fm :)

mercredi 21 octobre 2009

Grosse Fatigue

Les lecteurs attentifs l'auront noté : ce blog, après l'effervescence des débuts, est retombé dans une léthargie profonde ; mais ce n'est que la partie visible de l'iceberg. Depuis un mois environ, j'ai eu une phase à vide, ou je n'avais plus aucun courage pour maintenir quoi que ce soit ; ce qui s'est plus ou moins ressenti sur mes projets personnels. Mais bon, je ne m'excuserais pas plus longtemps pour le manque de billets, je ne voudrais pas passer pour l'homme le plus ennuyeux du monde ;)

Récemment, j'ai repris une activité timide, notamment sur DeSmuME et Yabause (enfin, sur mini18n, en fait), mais surtout sur respire (ma bibliothèque de manipulation de fichiers resources) qui devrait bientôt être assez développée pour réécrire le fichier resource de Yabause à l'identique. Et oui ! Incroyable ! Elle sera capable de faire rien, ce qu'on appelle un point fixe en mathématiques :) Mais heu... bon... ensuite, je pourrais ajouter des trucs super intéressants dedans :p

Pour finir, un peu de musique avec un truc sur lequel je bloque depuis un moment déja : L'hymne à la joie de The CNK ; c'est très très bon et en plus, c'est français, unbelibubble, non ?