xbright’s world

« Wikipédia est une œuvre du seigneur jesus, qui es-tu pour contredire ses actes ? » ~ fluo★

 

Statistiques des projets dans CodingTeam, où quand SVG remplace Flash

Ce billet a pour but de vous présenter une des nombreuses killer feature que contiendra CodingTeam (qui devrait d'ailleurs sortir dans plus très longtemps) et donc de vous intéresser au développement du projet à l'insu de votre plein gré. En effet, avec ce genre de billet, mon but inavoué est de vous intéresser à CodingTeam via des petits entrebâillements de porte laissant entrevoir des choses chouettes et sexy. Grâce à ça, donc, je pourrai faire naitre chez vous une genre de fièvre, une attente insoutenable et une impatience de voir la sortie de CodingTeam 0.9, alors qu'au départ, vous n'en aviez pas réellement grand chose à faire.

Et cette méthode marche ! Voilà quelques jours que je parle de ce futur scoop sur les salons Jabber et voici une réaction (je suis gentil, j'ai mis des majuscules à ses smileys histoire qu'il soit présentable) :

[03:57:47] louiz': t'es chiant, t'arrives à me faire avoir hâte d'un truc qui a pourtant pas tant d'importance pour moi :D
[03:57:49] louiz': magne toi :P

Et cette petite lueur qui ravive en vous la flamme du fan de CodingTeam, c'est l'intégration de graphiques en SVG pour les projets, dans la forge ! Un truc que personne n'attendait, qui n'avait jamais été prévu ni même évoqué, mais qui arrive, pourtant.

Voici une capture de la bête dans son élément naturel prise il y a quelques heures.

C'est bien sûr un aperçu et peut-être que beaucoup de choses changeront encore (ou pas), mais c'est déjà un premier jet qui fonctionne pas trop mal. Là, il s'agit donc de comparer, par versions publiées, le nombre de bugs rapportés au nombre de bugs encore ouverts. Mais, vous vous doutez bien que sur une forge, il y a bien d'autres chiffres disponibles. Donc, si il s'avère que tout ça tourne bien, il y aura bien les statistiques en SVG dans la prochaine version de CodingTeam, et ça touchera plusieurs points important de la conception d'un logiciel.

Et les traditionnelles informations pour en savoir plus et/ou pour participer (et, avec de la chance, peupler le salon des utilisateurs désespérément pas-très-fréquenté) :
On y parle français et anglais, donc, n'hésitez pas, viendez !
De même, pour l'accès au dépôt Subversion : svn co http://svn.codingteam.net/code/codingteam/trunk codingteam
Les lecteurs sérieux auront d'ailleurs remarqué que j'ai renommé le projet source sur la forge, en codingteam, ce qui est quand même bien plus logique, même si ça va poser des problèmes de flux à certain, voilà, ils sont au courant, mettez vous à jour (mais par contre, le dépôt reste accessible via source ou codingteam, histoire de pas avoir d'embêtements).

Et tout ça nous amène donc à nous poser cette petite question : pourquoi les gens utilisent Flash pour afficher ce genre de choses ?
Google Analytics et tout un tas d'autres applications génèrent leurs graphiques via Flash. Alors que Flash, saimal parce que c'est pas ouvert, le client officiel n'est pas libre et c'est bien lourd au point de souvent causer le plantage de mon navigateur. Là au moins, avec SVG, on a quelque chose de logique (un fichier XML avec tout plein de coordonnées à calculer - miam, ou pas - et une feuille de style), c'est « simple » et c'est beau. Quand on regarde un graphique généré par SVG et un autre généré par Flash, on a du mal à voir la différence, puisqu'il y a les mêmes artifices (rollover, infobulles...). Alors autant choisir SVG, parce que, si une chose est incontestable, c'est que XML sailebien.

SVG roulaise, CodingTeam roulaise !
Et on remercie tous chaleureusement MsieurHappy qui, après avoir fait tout un tas de tests en rapport avec la génération de graphes en SVG, m'a soumis l'idée, une preuve de concept (avant tout le monde, yeah !) et plein de conseils pour réaliser quelque chose de bien.
Publié le vendredi 11 juillet 2008, 04:27 par xbright | 4 commentaires
Tags : codingteam php
 

Internationaliser votre application PHP avec gettext

Développer une application, c'est bien. La distribuer où l'utiliser, c'est mieux. Cependant, tout le monde ne parle pas votre langue, d'où l'intérêt de l'internationaliser (et paf, une introduction toute pourrie \o/). Dans ce billet, je vous présenterai donc comment j'utilise gettext dans CodingTeam, afin de traduire l'application.

Traduire une application se fait généralement à l'aide d'outils dédiés comme gettext. Vous écrivez votre code en mettant tous vos textes traduisibles d'une certaine manière et il va aller les chercher pour en faire un fichier modèle (pot), qui servira ensuite à générer des fichiers de langue (po).
En PHP et comme dans beaucoup d'autres langages, il y a déjà quelque chose de tout préparé, ce qui permet de l'utiliser directement, sans rien installer d'autre.

Ma façon d'utiliser gettext est inspirée de la lecture de bon nombre d'articles sur le net. En gros, j'utilise ce code pour charger gettext :
setlocale(LC_ALL, $lang.'.UTF-8');

bindtextdomain('nomdedomaine', 'i18n');
textdomain('nomdedomaine');
bind_textdomain_codeset('nomdedomaine', 'UTF-8');

Dans cet exemple, $lang doit valoir quelque chose comme en_GB ou fr_FR et nomdedomaine devrait être le nom de votre application.
Dans le répertoire i18n, il devrait se trouver un dossier fr_FR contenant un autre dossier LC_MESSAGES qui accueillera le binaire produit par gettext (mo).

De même, on peut faire en sorte que la langue soit enregistrée par l'utilisateur, donnée dans l'URL, lue depuis l'en-tête adéquate... Voilà une manière assez rapide^Wmoche et ne respectant pas les spécifications, de se baser sur la langue du navigateur :
$langlist = array('fr' => 'fr_FR', 'en' => 'en_GB');
$accept_language = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);

foreach ($accept_language as $value)
{
    $choice = mb_substr($value, 0, 2);

    if (array_key_exists($choice, $langlist))
    {
           $lang = $langlist[$choice];
            break;
    }

}

if (empty($lang))
    $lang = 'en_GB';

À noter qu'il n'y a pas besoin de générer de .po/.mo pour la langue dans laquelle vous écrivez vos textes au sein de votre application vu qu'ils sont chargés par défaut si gettext n'arrive pas à trouver les traductions qui vont bien.

Pour créer le modèle, j'utilise ce script, qui est bien sûr adaptable. Dès que j'ai créé le .pot, je peux lancer cet autre script qui va me créer le fichier de traduction pour la langue que je désire. Une fois que j'ai traduit toutes les chaines, il me reste à lancer ce dernier script pour générer le binaire !

C'est là qu'on arrive au point relativement intéressant de ce billet (l'avant-ici a des airs de déjà-vu). J'ai toujours utilisé la fonction _() ou gettext() couplée à sprintf() afin de remplacer des éléments par d'autres. Exemple, si je veux traduire « Toto a mangé 4 bananes », j'écris : sprintf(_('Toto a mangé %d bananes'), 4); jusqu'au jour où je me suis rendu compte que si je voulais insérer plusieurs éléments dans la chaine tout en les nommant (afin de pouvoir changer leur ordre), j'allais au devant d'une syntaxe affreuse, repoussante, typiquement-php, à jeter par la fenêtre : sprintf(_('Le %2$s achète %1$d bananes.'), 42, 'monsieur'); !
%2$s, %1$s ! Mais qui est allé pondre cette horreur ?

Nostalgique de la façon bien plus propre de remplacer des occurrences dans des chaines en Python, j'ai donc écrit cette fonction, que je vous partage. Et j'espère qu'elle vous sera utile. En tout cas, c'est bien plus facile de ne pas se tromper, le traducteur a en face de lui quelque chose qui a une signification et ça ne fait pas tâche.
/**
* Translate a string and add arguments
*
* Gets the translated string from gettext and add arguments in it with
* the Python way instead of the *ugly* PHP way (sprintf).
*
* @param $str
* The string to be translated.
* @param $args
* All arguments to be added.
* @return
* The translated and formatted string.
*/
function i18n($str, $args=array())
{
// Get the translated string
$str = gettext($str);

// Add arguments to the string if exist
if (count($args) > 0)
// Fetching all arguments
foreach ($args as $key => $value)
{
// Decimal value
if (is_numeric($value))
$type = 'd';
// String value
elseif (is_string($value))
$type = 's';

// Replace
$str = str_replace('%('.$key.')'.$type, $value, $str);
}

// Return the translated string with arguments
return $str;
}

Publié le dimanche 8 juin 2008, 22:54 par xbright | 5 commentaires
Tags : php Planet
 

Des nouvelles de la version de développement de CodingTeam.

M'étant résigné à ne pas publier les quelques billets que j'hésitais à publier (ceux qui auraient pu peut être me faire passer - bien malgré moi - pour l'alcoolo de service ou pour le type qui trolle à plein régime sur la communauté d'un projet qui commence par « Ubun » et qui finit par « tu ») et ayant remarqué que je n'avais pas publié un billet ici depuis un bon paquet de temps, j'ai enfin réussi à trouver un sujet sympa à aborder \o/

Je vais donc dresser un état des lieux de ce qui est fait et de ce qu'il reste à faire avant de pouvoir espérer une possible sortie du premier opus de la branche 0.9 de CodingTeam (un truc chiadé et hyper-stable que nous envient les américains, ou pas). En tout cas, il n'y a toujours aucune date prévue pour la sortie (vu qu'il reste quand même pas mal de travail, même si il est déjà bien avancé).

Pour ceux qui ne seraient pas au fait de ce qu'est CodingTeam (les nuls :-O), il s'agissait après la sortie de la première version stable (la 0.42), de reprendre le code de zéro afin de produire un logiciel beaucoup plus intéressant (mieux codé, objet, modulable, et tout pleins de bonnes choses) et bien sûr, d'ajouter pas mal de fonctionnalités assez chouettes.

En exclusivité prime-time, voici une jolie copie d'écran de ce que donnera CodingTeam 0.9 :

Ainsi, le travail de réécriture entière du code source a été commencé. Certains points initalement prévus pour la 0.1 ont aussi été ajoutés ou prévus, il s'agit de l'intégration de Subversion, la donation sur les projets, la mise en cache des pages, l'avatar jabber, les notifications jabber...). Aussi, notons que l'écriture du bloc notes a été terminée (il s'agissait de créer un genre de pastebin, mais complètement intégré à CodingTeam), que des nouvelles fonctions d'administration de la forge ont été ajoutées un peu partout comme par exemple la possibilité de devoir valider les nouveaux projets, pas mal de nouvelles options de classement et d'exploration des projets, un joli nuage de tags, et pleins de bonnes choses du genre :-)).
Il n'y a pas de moyen, pour le moment, de tester le trunk CodingTeam sans l'installer chez vous, et ce n'est pas bien compliqué, le fichier INSTALL est plutôt complet (mais écrit avec sûrement de grosses fôtes /o\).

Et concernant la bonne majorité des idées des utilisateurs (sur la page Roadmap liée un peu plus haut, vous pouvez vous aussi y inscrire vos idées), elles seront implémentées.

Pour vous rendre compte de l'avancement du projet, il suffit de récupérer la copie de travail sur http://svn.codingteam.net/code/source/trunk !
Et si vous voulez en discuter, le salon Jabber dédié à CodingTeam : codingteam@conference.codingteam.net
Et le salon Jabber dédié au développement de CodingTeam : codingteam-dev@conference.codingteam.net
Concernant l'équipe de développement, je suis globalement seul, mais certains envoient leurs contributions (ne serait ce qu'en participant aux discussions sur le salon de développement ou en m'envoyant du code) :-)
Publié le samedi 1 mars 2008, 16:41 par xbright | 15 commentaires
Tags : codingteam forge logiciel libre php Planet
 

Mon petit compte rendu de ce premier Code Bar.

Depuis hier après midi jusqu'à aujourd'hui, se tenait la première édition du Code Bar sur Jabber !

Tout comme l'avait préparé les organisateurs Omega et Elghinn sur le salon programmation@chat.jabberfr.org. Cette soirée (nuit ?) s'est donc déroulée dans la bonne humeur et a été productive.


Voilà un log de tous les commit effectués sur le SVN de l'occasion (deux projets étaient proposés pour cette première édition : Gajim et CodingTeam). Il y en a eu plus d'une cinquantaine, pour - au mieux de la soirée - une vingtaine de connectés au salon, dont seulement 7 avaient un accès en écriture au dépôt SVN.


Concernant Gajim, les principaux développements ont été l'amélioration du support de PEP, des travaux divers sur le trunk où encore - j'y ai un peu participé - sur une branche à part nommée chat2muc : pour transformer un chat normal en salon de discussion, XEP-0045). Bien entendu, nous n'avons pas terminé cette intégration, et nous la continuons sur le salon gajim-chat2muc@conference.codingteam.net !

CodingTeam a bénéficié de l'aide de quelques uns aussi via le dépôt mis en place pour l'occasion sur le serveur de Elghinn.
Ainsi, l'intégration Jabber dans la forge a été travaillée et j'ai synchronisé le travail effectué avec le trunk officiel !

Historiques des salons :

Merci donc à tous les participants pour le coup de pouce aux projets ;-)
Publié le dimanche 3 juin 2007, 07:39 par xbright | 3 commentaires
Tags : codingteam Jabber php Planet Python
 

Créer des fils RSS avec mise en cache

Publié le vendredi 6 avril 2007, 14:19 par xbright | 4 commentaires
Tags : php Planet rss web 2.0