Sometimes I write things, sometimes I don't.

To content | To menu | To search

Friday 18 November 2011

Chaînes de caractères dynamiques

mobile.png Tout bon programmeur Android a pour habitude de lister toutes les chaînes de caractères (ou presque) dans le fichier res/values/strings.xml. A priori, seules les chaînes de caractères statiques ne peuvent être mises dans ce fichier. Mais, il existe des méthodes pour rendre ces chaînes un petit peu plus dynamique qu'elles n'y paraissent. Voyons tout ça.

1. Les formes plurielles

Les formes plurielles varient plus ou moins d'un langage à un autre. Par exemple, en français, on peut vouloir écrire :

  • Je ne possède pas de stylo.
  • Je possède un stylo.
  • Je possède des stylos.

L'API Android met à disposition plusieurs distinctions de formes plurielles grâce à 6 mot clés.

  1. zero, pour la quantité 0 ;
  2. one, pour la quantité 1 ;
  3. two, pour la quantité 2 ;
  4. few, pour représenter une petite quantité ;
  5. many, pour représenter une moyenne quantité ;
  6. other, pour représenter une quantité supérieure à une autre suivant la langue.

En français, on aura tendance à n'utiliser que zero, one et other.
Ainsi pour former les chaînes précédemment citées on mettra dans notre fichier res/values/strings.xml le code suivant :

<?xml version="1.0" encoding="utf-8"?>
<resources>
  <plurals name="nombreDeStylos">
    <item quantity="zero">Je ne possède pas de stylo.</item>
    <item quantity="one">Je possède un stylo.</item>
    <item quantity="other">Je possède des stylos.</item>
  </plurals>
</resources>

Dans le code Java, on récupérera la bonne forme de cette manière.

final List<Stylo> stylos = getStylos();
final int count = stylos.size();
final String text = this.getResources().getQuantityString(R.plurals.nombreDeStylos, count, count);

2. Formatage des chaînes

Il peut être également utile d'afficher des nombres dans les chaînes de caractères comme par exemple : "Bonjour X, vous avez Y nouveaux messages !". Cela se fait de manière relativement simple grâce à la méthode String.format(String, Object...) de Java. Cette méthode est également invoquée automatiquement lors de l'utilisation de Context.getString(int, Object...). La chaîne de caractères à formater doit contenir quelques marques de formatage comme %1$s pour dire qu'il faut remplacer cette marque par le premier argument et que celui-ci est une chaîne de caractère ou encore %2$d pour dire qu'il faut mettre ici le second argument qui est un entier.
Ainsi dans le fichier res/values/strings.xml on écrira :

<string name="welcome_message">Bonjour %1$s, vous avez %2$d nouveaux messages !</string>

Et on utilisera le code Java suivant :

final String username = "toto";
final int mailCount = 10;
final String text = String.format(this.getResources().getString(R.string.welcome_message), username, mailCount);

On pourra aussi utiliser celui-ci :

final String username = "toto";
final int mailCount = 10;
final String text = this.getResources().getString(R.string.welcome_message, username, mailCount);

3. Conclusion

Comme on peut le voir Android met à disposition plusieurs méthodes pour manipuler les chaînes de caractères et les rendre aussi flexibles que possible tout en simplifiant un maximum le travail des traducteurs par exemple. Il ne reste plus qu'à exploiter ces possibilités pour créer un code simple et efficace.

Monday 24 January 2011

GNOME Split en version 1.0

astuce.pngJ’aurais du en parler plus tôt, beaucoup plus tôt même. Le 18 novembre 2010 a été pour moi l’occasion de partager la version 1.0 de GNOME Split, nom de code Stable Isotope.

Cette version est donc sortie plus ou moins un an après la toute première version tout public de GNOME Split. Elle apporte principalement des corrections de bugs plutôt gênants et qui étaient là depuis pas mal de temps.

split-view.png
Comme on peut le voir l’interface n’a pas changé et j’avoue qu’elle me plaît bien comme elle est actuellement. Donc a priori, ça ne devrait pas (ou peu) changer par la suite. Voyons tout de même les corrections et quelques nouveautés qu’apporte la version 1.0 par rapport à la 0.9.

  • Amélioration des performances : les opérations de découpages et d’assemblages prennent en moyenne 2 fois moins de temps par rapport aux versions précédentes.
  • Prise en compte des cas où un ou plusieurs fichiers à assembler ne sont pas disponibles.
  • Meilleure gestion des exceptions et des erreurs dans le code.
  • Fenêtre de préférences légèrement revue pour la rendre plus compacte.
  • Correction générale de l’assistant, les pages ne se dupliquent plus.
  • Meilleure gestion de la fermeture des flux de fichiers lors d’un arrêt brutal (CTRL + C par exemple).
  • Affichage du pourcentage d’avancement dans le titre de la fenêtre.
  • Correction d’un bug qui ne permettait pas de découper des fichiers de plus de 2 Gio.
  • Mise à jour des traductions (traduction française complète).

J’espère que cette nouvelle version répondra aux attentes de beaucoup de personnes. Et nous voilà donc sur le chemin vers la 2.0 qui devra permettre après toutes les versions intermédiaires de découper un fichier en cryptant les données via mot de passe et aussi d’uploader des fichiers directement sur des sites web dédiés afin de les partager.

Comme toujours, les archives de code sont et le dépôt pour les ubunteros est ici.

Thursday 6 January 2011

Et quand l'activité a besoin d'un objet ?

mobile.pngJe ne me souviens pas avoir parlé de programmation Android par ici. ce billet est donc l’occasion de commencer l’exploration du merveilleux OS mobile que nous fournit gracieusement Google. J’ai un smartphone qui carbure avec Android depuis bientôt 2 ans et je ne m’étais intéressé que vaguement à la programmation d’applications dessus. Dans mon parcours universitaire, j’ai eu l’occasion d’aborder ce sujet et mon projet tuteuré consiste principalement à faire une application pour Android. Trêve de blabla, passons à l’action.

Je ne vais pas refaire un cours sur Android, nombre de tutoriaux et d’exemples sont disponibles sur la toile. Dans le cadre de mon projet, j’avais donc un souci pour passer de l’information d’une activité à une autre. En effet, seuls les types primitifs et quelques autres trucs peuvent être passés d’une activité à une autre. Malheureusement, pas moyen de faire voyager un objet “simple” sans modification. Il faut qu’il implémente soit Serializable (connu par tous les bons programmeurs Java) soit Parcelable (propre à Android), “pour les surprendre on peut aussi faire les deux” (private joke).

Dans le cas présent, nous allons voir comment faire en implémentant l’interface Parcelable car cela demande un peu plus de code et de compréhension. Considérons un objet Message, sa classe (de base) s’écrirait très simplement.

class_message.png
Pour pouvoir faire naviguer cet objet entre plusieurs activités, on va donc le faire implémenter l’interface citée précédemment. Et c’est ici qu’il faut penser à quelques ajouts bien précis. L’objet implémentant Parcelable doit contenir un champ static appelé CREATOR de type Parcelable.Creator. De plus, 2 méthodes seront à redéfinir. Notre classe message se transforme alors comme la suivante.

class_message_parcelable.png
À ce stade, tous nos objets de type Message pourront être transférés d’une activité à une autre. Pour cela, on va donc utiliser un Bundle avec la méthode putParcelable(Parcelable).

class_sender.png
À noter qu'en tant qu’identifiant de l’objet dans le bundle, j’ai mis son nom complet (package + classe) ce n’est pas un hasard. Maintenant, on peut voir comment récupérer l’objet dans l’activité qui va le réceptionner.

class_receiver.png
Voilà qui est fait. Remarquez qu’il n’y a pas besoin de “caster” l’objet de type Parcelable récupéré, je vous laisse deviner grâce à quoi. Je ne prétends pas que ma méthode soit la meilleure, ni la plus sécurisée, etc… Tout ce que je sais, c’est que pour l’instant ça marche. L’expérience venant en codant, j’en saurai davantage sur l’efficacité de cette technique plus tard. Toutes améliorations et/ou remarques sont les bienvenues.

Wednesday 30 June 2010

Sortie de GNOME Split 0.8

code.pngIl y a quelques heures, je viens de sortir une nouvelle version de GNOME Split. Cette dernière est numérotée 0.8 et représente une étape de plus vers la 1.0. Cela fait un an environ que le voyage a commencé après la mort inévitable de gSplit.

GNOME Split 0.8 tire donc partie de java-gnome 4.0.16 et des dernières nouveautés offertes. Aucune nouveauté géniale n’a été ajoutée. Il s’agit simplement d’une amélioration de l’interface graphique.

gnome-split-0.8.png
Au niveau des changements qui ont été effectués, on notera qu’une partie du code a été réécrite, que le fichier de configure (Gentoo, Fedora et ArchLinux, si y’en a qui sont intéressés pour tester hésitez pas) a été mis à jour. Les unités utilisées pour les tailles de fichiers respectent les standards et leur représentation en chaînes de caractères est confiée à GLib. On remarquera aussi l’utilisation des accelerators dans les menus.

gnome-split-0.8-file.png
Enfin, et en vrac, la nouvelle barre d’information disponible dans GTK+ est utilisée pour montrer les informations et les warnings à l’utilisateur, la fenêtre principale se redimensionne automatiquement si nécessaire, des méthodes dépréciées ont été retirées du code, le curseur change d’état selon l’état de l’interface et des traductions ont été mises à jour et ajoutées.

Je profite de cet article pour faire le point sur les noms de code que je donne à chaque version. Je ne sais pas si quelqu’un l’aura remarqué mais chaque nom de code est en rapport avec une expression ou une scène de la série The Big Bang Theory. La version 0.8 se nomme Happy Birthday mais ça n’a pas vraiment de rapport avec la série.

Pour terminer, GNOME Split 0.8 est disponible sur Ubuntu via le PPA ou avec le code source bien évidemment. N’hésitez pas à faire de paquets pour vos distributions favorites et à me donner vos avis et éventuellement à me dire les modifications à apporter.

Monday 21 June 2010

Sortie de java-gnome 4.0.16 et le futur

java.pngIl y a quelques jours, le 17 juin 2010 pour être précis, une nouvelle version de java-gnome est sortie. Cette dernière, numérotée 4.0.16, apporte comme toujours son lot d’amélioration. Il y a eu tout de même moins de modifications par rapport à ce que l’on a pu voir précédemment mais quand même. Une nouvelle version apporte toujours un peu de neuf (ou de vieux remis à neuf) et ça fait plaisir.

1. Nouvelle version : 4.0.16

Ainsi, java-gnome comporte maintenant le support complet pour l’utilisation des “accelerators” (on peut peut-être traduire par “raccourcis”), qui sont des combinaisons de touches permettant d’activer des actions et des entrées dans les menus. Je pense que bon nombre d’entre nous connaissent le très classique CTRL + Q pour quitter un programme. Le coeur de l’API se situe dans la classe AcceleratorGroup mais il faudra aussi utiliser les méthodes setAccelerator() des classes MenuItem et Action. L’API native étant presque incompréhensible, le travail pour porter tout ça en Java a été assez conséquent.

accelerators.png
De manière plus rapide, le support des opérateurs utilisables avec Cairo a été ajouter avec la classe Operator. Une bonne quantité d’exemple en image en montre le principe (images bien entendu générées avec java-gnome lors de la construction de la documentation. Le style CENTER a été ajouté dans la classe ButtonBoxStyle. Les fichiers .defs on été mis à jour pour prendre en compte les modifications apportées par GTK 2.18 et et le widget InfoBar a été ajouté (effectués par votre serviteur). Les interfaces Activatable et Editable ont reçu quelques changements tout comme la classe Glib qui comporte une nouvelle méthode formatSizeForDisplay() permettant de formater un taille d’octets en une chaîne de caractères plus lisibles pour nous humains. Enfin, une dernière méthode ensureNative() a été ajoutée à la classe Window de GDK.

2. Le futur

En tant que contributeur et avec les autres personnes travaillant sur java-gnome, nous nous sommes aperçu que maintenir un jeu de fichiers .defs pour générer la partie non publique de l’API commençait à être compliqué. Nous avons alors changer un peu le plan prévu. C’est pourquoi, en ce moment, certains travaillent sur l’utilisation du projet GObject Introspection pour générer une partie de l’API. C’est probablement le meilleur moyen d’avoir une source donnée la plus complète et la plus à jour afin de garder les bindings les plus proches des dernières versions des bibliothèques natives. Cependant, la migration vers GObject Introspection demande un travail long et délicat puisqu’il faut réécrire une partie du générateur de code que l’on sait stable puisqu’il commence à prendre de l’âge. J’espère tout de même que l’on aura quelque chose de fonctionnel assez vite afin de tester et stabiliser le code le plus rapidement possible.

Le futur de java-gnome prévoit de bonnes surprises, c’est certain. Tout ça dans le but d’améliorer encore l’API telle qu’on la connaît et de toucher un public toujours plus grand.

Monday 4 January 2010

GNOME Split sort en version 0.3

Je n'avais pas signalé la sortie de la version 0.2, et bien je vais me rattraper avec celle de la version 0.3. GNOME Split, le logiciel de découpage et assemblage de fichiers, évolue petit à petit. La version 0.1 était une première version plutôt avancée, par conséquent la version 0.2 n'a vu arriver que des corrections de bugs (dont un critique pour les utilisateurs de la version 2.22.3 de glib). Alors qu'est-ce qu'il y a dans cette version ?

  • Découpage et assemblage au format GNOME Split,
  • Découpage et assemblage au format Xtremsplit,
  • Découpage et assemblage sans format spécifique (semblable à la commande "split", assemblage par "cat" possible),
  • Réorganisation de la boîte de dialogue de préférences,
  • Optimisation du code de l'interface graphique,
  • Ajout d'info bulle sur les boutons de la barre d'outils,
  • Correction de bugs divers.

Le code source peut être récupéré soit via cette archive, soit via le dépôt Bazaar. Pour les utilisateurs de Ubuntu 9.10 Karmic Koala, un dépôt PPA (dépôt non officiel donc attention hein) est à disposition. Une fois ce dernier ajouté, il ne suffira alors qu'à utiliser la commande :
~$ sudo aptitude install gnome-split

Thursday 17 December 2009

Sortie de java-gnome 4.0.14

Une nouvelle version de java-gnome est disponible depuis hier. Il s'agit de la version 4.0.14 de l'API. Elle apporte notamment une intégration de la correction orthographique via l'API Enchant, une amélioration de la gestion des pointeurs (de souris) grâce à GDK. On voit apparaître de même une meilleure gestion du rendu de texte. Une autre nouveauté est l'apparition du widget LinkButton qui offre la possibilité d'ouvrir une URL grâce à un bouton (travail effectué par Serkan Kaba et moi-même).


Il est désormais possible de créer ses propres tailles de papier afin de pouvoir utiliser le format PDF via Cairo même si la taille n'est pas standard. On a également droit à un lot de corrections principalement typographiques. Comme certains le savent ou l'ont remarqué, avec GNOME 2.28, les icônes dans les menus peuvent être masquées ou non selon la configuration (elles le sont par défaut). Il est toutefois possible d'en forcer l'affichage maintenant grâce à de nouvelles méthodes dans l'API ou bien de continuer à utiliser les paramètres globaux. Au niveau de la compilation de la bibliothèque, l'utilisation de Xvfb permet aux packageurs de lancer tout de même la suite de tests et de générer la javadoc. Enfin, un bug critique a été corrigé contourné. Ce dernier faisait crasher l'application directement si l'utilisateur utilisait la version 2.22.3 de glib.

La news complète de la sortie de java-gnome 4.0.14 est ici, le téléchargement des sources lui est par . À noter que GNOME Split 0.1 utilise la version 4.0.13 et que GNOME Split 0.2 utilisera la version 4.0.14. La dernière release de java-gnome est déjà disponible sur Gentoo, Arch Linux, bientôt pour Debian, pour Ubuntu ça sera pour Lucid Lynx (mais je vais demander un backport dans Karmic Koala).

À vos codes.

Thursday 10 December 2009

GNOME Split sort en version 0.1

Comme je l'avais annoncé la semaine dernière la sortie de la première version de GNOME Split était imminente. Et bien aujourd'hui, c'est officiel, la version 0.1 est désormais disponible. Vous pouvez la télécharger sur la page du projet sur Launchpad.

Pour l'instant, il est possible de découper et assembler des fichiers au format Xtremsplit (extension en .xtm) et au format GNOME Split (extension .gsp). Pas de paquet pour les diverses distributions (en fait pour le moment j'ai du mal à packager le tout pour Ubuntu sur mon PPA). Aucun bug n'a été trouvé pour le moment (sachant que j'ai été le seul cobaye), à vous donc de me les rapporter. Pour les impatients qui n'ont pas peur de compiler, un tutoriel est disponible ici et pour ceux qui sont intéressés, il est possible de suivre le développement ici.

- page 1 of 6