Sometimes I write things, sometimes I don't.

To content | To menu | To search

Tag - Programmation

Entries feed - Comments feed

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.

Wednesday 25 August 2010

Effet de mode ou vrai plus ?

code.pngLes langages de programmation, il y en a énormément. Et beaucoup d’entre vous en connaissent une partie. Moi, je m’y suis intéressé un peu avant de rentrer en DUT. J’ai fait du Java surtout, et mon DUT a été l’occasion d’apprendre l’assembleur, le C et de me perfectionner en Java. J’ai bien entendu fait du script avec le shell sous Debian, Ubuntu, et compagnie. Aujourd’hui, je livre un sentiment personnel sur l’utilisation des langages de programmation dans le monde du Libre. Et j’ai cette impression que, bien que très diversifié dans la façon de faire un programme, le monde du FLOSS ne s’articule plus qu’autour d’un seul langage, à savoir, Python.

python.png
Si Python est si apprécié c’est qu’il possède des avantages. La puissance, la clarté du code, le côté script, la facilité d’apprentissage et j’en oublie certainement un bon paquet. Pour ma part, je n’arrive pas à m’y faire et ce n’est pas faute d’avoir essayé (même que GNOME Split devait être écrit en Python à la base). Aujourd’hui, Python est très utilisé et par énormément de monde. On sait par exemple que chez Canonical, ils aiment bien ce langage mais il n’y a pas qu’eux. J’ai constaté, qu’en ce moment, tous les débutants et les programmeurs expérimentés se tournent de plus en plus vers Python pour coder. Je trouve ça dommage. Il y a-t-il encore des gens qui s’intéressent à d’autres langages ? J’espère que oui, cela serait dommage de perdre une telle diversité. Je ne reproche rien à Python et c’est pour moi un langage comme un autre, je suis simplement triste de voir de moins en moins de programmes écrits en C, en C++, en Java ou que sais-je encore.

python-code.png
Pythonistes, je me répète, mais je tiens à dire que je ne blâme pas Python. J’ai simplement peur qu’un jour programmation veuille dire Python comme pour certains Linux veut dire Ubuntu. Je ne tiens pas non plus à lancer un troll du style “Python c’est nul, le C c’est de la vraie programmation”. J’aimerais seulement savoir si d’autres ont le même sentiment que moi à propos de l’abandon des autres langages de programmation. Beaucoup de monde le sait, je suis un Javaiste convaincu donc ce sentiment de solitude est assez naturel chez moi, peut-être à cause du fait que je travaille sur java-gnome et que ce n’est pas l’API la plus utilisée. Peu importe, suis-je le seul à me dire “je n’aime pas coder en Python, suis-je un irréductible gaulois non-pythoniste ?” ?

Si vous vous sentez attiré par Python, allez faire un tour du côté de l’AFPY. Ayant eu l’occasion de discuter avec des membres aux JDLL, je peux vous dire que vous aprendrez plein de choses.

Wednesday 9 September 2009

Exploitez vos codes C grâve à Java et sa JNI

Maintenant que je travaille depuis quelques semaines sur java-gnome, j'ai eu l'occasion (à plusieurs reprises) d'utiliser la JNI (pour Java Native Interface). Cet aspect de Java permet notamment d'exploiter du code C et C++ sans avoir à le réécrire totalement en Java ce qui n'est pas toujours possible (java-gnome n'est déjà pas complet alors réécrire GNOME en Java... on n'en parle même pas). Jusqu'à maintenant, je n'ai jamais vraiment cherché à comprendre comment la JNI fonctionnait, je me contentais de l'exploiter en me basant sur les divers codes déjà présents. Si j'écris cet article, on peut donc se douter que je suis allé un peu plus loin dans le sujet.

En effet, en recherchant une solution pour un problème (récupérer la taille de l'espace disque restant), je suis tombé sur de nombreux résultats dans lesquels les utilisateurs conseillaient d'utiliser un code natif via la JNI. C'est donc grâce à ça que j'ai décidé de comprendre comment la machine fonctionne (le côté JNI de java-gnome étant généré automatiquement, on ne le touche pas souvent). Pour comprendre comment utiliser la JNI, nous allons donc utiliser 3 méthodes que je qualifierais d'exemplaires. Pas parce que le code est impeccable, mais plutôt car on pourra voir comment gérer les paramètres et les types de retour.

Continue reading...

Sunday 16 August 2009

java-gnome's cool new stuffs

C'est vrai, c'est génial ! Ce que j'ai toujours aimé dans le projet java-gnome, c'est sa facilité d'accès lorsque l'on connaît un peu le langage Java. Je préfère de loin réaliser une interface graphique avec java-gnome qu'avec Swing. Pourquoi ? Déjà parce que c'est plus beau et surtout parce que c'est plus simple.

Bon trêve de compliments, je ne suis pas là pour expliquer à quel point écrire des applications avec java-gnome c'est bien. Quoi que ça serait presque çamais bon...

Depuis la version 4.0.12 de l'API, j'essaie de contribuer pas mal à son développement même si avec mon travail qui n'a rien à voir avec l'informatique je suis plutôt crevé en rentrant. Cependant, je prends quand même le temps de développer plusieurs branches. J'avais donc envie de faire un petit point sur les nouveautés qui arriveront (j'espère) pour la version 4.0.13 de java-gnome.

Je commence par la première branche que j'ai codé seul et qui est terminée (elle est en attente d'intégration défintive dans l'API). Cette branche est nommée entry-gtk-2.16. Elle a pour but d'ajouter les fonctionnalités arrivées pour les GtkEntry avec GTK 2.16 dans la classe Entry de java-gnome. Ainsi tout comme avec la bibliothèque de développement en C, on pourra mettre des icônes des deux côtés de l'entrée de texte ou encore se servir de l'indicateur de progression qui y est intégré. Voici une démonstration :


Les branches suivantes que je développe étaient auparavant codées par Serkan Kaba qui depuis a lancé un appel afin que quelqu'un reprenne son travail. C'est donc ce que j'ai fait avec 3 de ses branches.

Je me suis intéressé pour commencer à l'intégration de libsexy dans java-gnome. Cette bibliothèque apporte quelques widgets intéressants en plus à GTK. Je peux à présent considérer mon travail sur l'intégration de libsexy presque terminé puisque tout a été implémenté par Serkan et moi. On pourra, donc une fois le merge avec le code l'API fait, utiliser des Labels contenant des liens,


mais aussi, des Entrys supportant les corrections orthographiques (truc dont j'ai besoin),


des textes d'astuces (tooltips) différents selon les lignes des TreeViews et enfin, des widgets Tooltip pouvant contenir des choses plus complexes que des simples lignes de texte.


J'ai également décidé de ne pas implémenter le SexyIconEntry puisque la classe Entry de GTK 2.16 offre encore plus de fonctionnalités.

J'ai aussi travaillé sur une branche visant à implanter le widget offert par la bibilothèque nommée VTE (pour Virtual Terminal Emulator). Les amateurs de GNOME connaissent probablement ce widget puisque c'est lui qui est utilisé par l'émulateur de terminal de GNOME.


Enfin, pour terminer, j'ai terminé le code d'une branche dédiée à ajouter les fonctionnalités liées au LinkButton (bouton contenant un lien). On pourra donc alors profiter de ce widget dans java-gnome mais également profiter de ses nouveautés dans la boîte de dialogue AboutDialog. En effet, jusqu'à présent, on ne pouvait qu'insérer un lien et l'afficher afin de spécifier le site web de l'application à laquelle cette boîte de dialogue était attachée. Maintenant, ce lien devient intéractif, c'est-à-dire qu'un clic dessus permettra d'ouvrir le navigateur web à l'adresse donnée.


C'est tout pour le moment, j'espère que chacune de ses branches sera intégrée dans java-gnome avant la sortie de la version 4.0.13 (qui sera d'ailleurs peut-être estampillée 4.1.1) et qui promet encore de belles choses.

Ah oui j'oubliais, on m'a des fois fait la remarque suivante : "Wa pour développer java-gnome faut connaître le C et la JNI non ?". Et bien en fait non, il n'y a pas besoin de savoir manipuler le C et la JNI. En effet, tout ce qui est code C / JNI est automatiquement généré par un ... générateur ... qui grâce à des fichiers de types .defs et les .h des bibliothèques génère le code C / JNI automatiquement. Il ne reste donc que l'API public (haut niveau si je peux dire ça comme ça) à écrire. Bien entendu, il y a toujours des cas particuliers (comme je suis un grand chanceux, je suis tombé dessus...) où il faut écrire quelques bouts de code en C pour contourner certains "manques" de Java (comme les callbacks).

Friday 24 July 2009

Sortie de java-gnome en version 4.0.12

C'est aujourd'hui, vendredi 24 juillet 2009, que java-gnome est sortie en version 4.0.12. Je rappelle que cette bibliothèque permet aux développeurs Java de créer des applications utilisant les différentes bibliothèques offertes (telles que GTK, Cairo, Pango, etc...) et utilisées par GNOME.

Parmi les nouveautés, on retrouve :

  • la gestion des sourceviews. Widgets qui permettent de colorer du texte (utilisés notamment pour afficher du code source dans les éditeurs de texte),
  • la possibilité d'activer la correction orthographique dans les zones de texte,
  • l'utilisation de la fameuse libnotify, qui permet de gérer les notifications (compatible avec le système Notify OSD utilisé par Jaunty Jackalope), et,
  • l'ajout de fonctionnalités pour vérifier qu'une seule et unique instance d'une application est exécutée.



En plus de ces nouvelles choses, de nombreux éléments des bibliothèques GTK, Cairo et GDK ont retouché afin de les prendre en charge ou de les complèter. C'est le cas notamment avec la classique boîte de dialogue "À propos" qui, maintenant, peut afficher les auteurs, les documentalistes, les artistes et la licence du programme. Les objets de type Pixbuf (images / icônes) peuvent maintenant également être construits directement via des données de type byte. Une amélioration de la sélection de fichier via une boîte de dialogue ainsi que la gestion des filtres ont été codés. Et enfin, il est désormais possible d'utiliser les complétions automatiques dans les entrées de texte via la classe EntryCompletion.

Cette nouvelle version de java-gnome a été pour moi l'occasion de contribuer à son développement. En effet, je me suis chargé d'ajouter les différentes méthodes pour spécifier les auteurs, documentalistes, artistes et la licence dans la boîte de dialogue "À propos" et j'ai également codé le support des EntryCompletions (grâce à l'aide et aux conseils de Andrew Cowie). Bref, une expérience, dans un projet open source déjà bien établi, qui a été très enrichissante et que j'ai beaucoup apprécié. La preuve : j'ai déjà une branche de développement prête (et une autre en cours) pour la version 4.0.13 qui arrivera d'ici quelques mois.

Sunday 31 May 2009

Démo : la version 1.1.1 de gSplit en vidéo

Ça commence à faire un petit moment que je n'avais pas parlé de gSplit et donc que je n'avais pas fait part de mon développement sous Ubuntu avec Java et GTK. Donc voilà une petite vidéo pour vous montrer l'actuelle version stable (numérotée 1.1.1) du petit gSplit.

La vidéo est téléchargeable.

Dès à présent, vous pouvez trouver une version packagée de gSplit dans mon PPA sur Launchpad (bien entendu, c'est un dépôt non officiel donc il faut faire attention). Pour le moment, seules les personnes utilisant Jaunty Jackalope peuvent en profiter. Pour plus d'informations pour obtenir gSplit, vous pouvez jeter un coup d'oeil sur la page qui lui est dédiée dans la documentation.

Dans un deuxième temps, comme dit à la fin de la vidéo, dans le but de développer la version 2.0.0 (qui est déjà commencée en fait), vous pouvez me suggérer toutes vos idées pour améliorer le programme aussi bien au niveau ergonomique qu'au niveau des fonctionnalités. Je prendrai note et tenterai de faire le maximum pour contenter tout le monde.

Tuesday 31 March 2009

Serveur HTTP en Python en 1 minute

Encore une preuve que Python ça se code facilement et que ça veut simplifier la vie du programmeur un maximum. Faire un serveur HTTP en C, C++, Java, etc... ça peu prendre du temps, pas mal de temps même. Le faire en Python ça prend en gros 10 lignes. Bien sûr ça reste un support "simple" du protocole HTTP 1.1 mais ça reste quand même très très pratique.

On crée un fichier server_http.py puis on l'édite et on y insère le code suivant.
#!/usr/bin/env python

import os

from BaseHTTPServer   import HTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler

os.chdir(os.path.expanduser("~/dossier_de_base/"))

httpd = HTTPServer(('', 8080), SimpleHTTPRequestHandler)
httpd.serve_forever()


On peut ensuite lancer le script via la commande :
user@computer:~$ python server_http.py

Et après, on ouvre son navigateur web et on peut accéder à son serveur en entrant l'adresse http://localhost:8080/

Friday 9 January 2009

Cacher un mot de passe dans une application Java en console

Petit mémo à moi-même. S'il y a bien une chose que je n'aime pas dans une application Java qui se déroule dans un terminal c'est de voir le mot de passe tapé s'il faut en entrer un à un moment. Pour résoudre ce problème, une classe existe et permet de créer une application en mode console avec les avantages de simplifier la lecture au clavier et de pouvoir cacher un mot de passe lors de sa frappe. Et la classe qui permet donc de faire ceci est nommée ... Console. Elle dispose de méthodes telles que readLine() et readPassword() qui sont très pratiques à utiliser. On retrouve également le fameux printf(format, arg1, arg2, ...) cher aux programmeurs en langage C. Voici un exemple d'une utilisation basique de Console. On demande un login et un mot de passe puis on les affiche.

import java.io.Console;
public class TestConsole {
    public static void main(String[] args) {
        String username = null;
        String password = null;
        Console console = System.console();

        System.out.print("Username: ");
        username = console.readLine();

        System.out.print("Password: ");
        password = new String(console.readPassword());

        System.out.println("Username = " + username);
        System.out.println("Password = " + password);
    }
}

- page 1 of 3