Sometimes I write things, sometimes I don't.

To content | To menu | To search

Programmation

Entries feed - Comments feed

Sunday 22 January 2012

Une extension à Nautilus pour GNOME Split

astuce.pngBientôt 2 ans après avoir exprimé ma volonté de créer une extension pour Nautilus afin de pouvoir lancer un découpage ou un assemblage avec GNOME Split, cette extension est enfin arrivée.

Le but de l'extension est de proposer deux nouvelles entrées dans le menu contextuel de Nautilus. Lors d'un clic droit sur un fichier quelconque l'item "Découper le fichier..." apparaît, l'utiliser permet de lancer GNOME Split avec les arguments qui vont biens pour découper le fichier sélectionné. Lors d'un clic droit sur un fichier étant considéré comme la première partie d'un fichier qui a été découpé auparavant, l'entrée "Assembler les fichiers..." apparaît permettant de lancer GNOME Split pour assembler les parties.

nautilus-extension-decoupage.png
Concrètement, cette extension de Nautilus est codée en C, publiée sous GPL version 3 et déjà présente dans le PPA pour la version 11.10 d'Ubuntu.

    ~$ sudo add-apt-repository ppa:gnome-split-team/ppa
    ~$ sudo aptitude update
    ~$ sudo aptitude install nautilus-gnome-split


N'étant pas expert en développement d'extensions pour Nautilus toute aide est la bienvenue.
En espérant que cette extension soit utile.

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.

Thursday 28 April 2011

Google Summer of Code 2011

java.pngLe Google Summer of Code est un programme organisé tout les ans par Google depuis 2005. Il permet pendant une période de donner l’opportunité à des projets libres de se développer en embauchant des étudiants volontaires qui sont rémunérés de fin mai à fin août.

Pourquoi je parle de ça aujourd’hui ? Parce que lundi, ma candidature a été officiellement approuvée. J’aurais donc durant cet été l’immense honneur de travailler pour Debian, un projet que j’apprécie tout particulièrement. J’aurais pour but d’empaqueter et de contribuer à Jigsaw avec l’aide de Tom Marble.

debian.jpg
Qu’est-ce que Jigsaw ? C’est la prochaine grosse évolution du JDK et de la machine virtuelle Java qui devrait être fournie avec Java 8. Elle permet de ne plus voir la JVM comme un gros bloc mais comme plusieurs modules qui pourront s’assembler. Ainsi, dans Debian, l’installation d’une application Java ne devrait installer que les modules dont elle a besoin. De cette manière, les performances devraient être améliorées : moins de mémoire consommée, temps de démarrage plus rapide, etc…

Pour un programme simple type Hello World ça nous donnerait :

Avec le JDK et la JVM actuelle :

  • JDK : 136 Mio à télécharger
  • Application : 425 octets
  • Total : 136.000425 Mio

Avec Jigsaw :

  • JDK : 30 Kio (à la louche)
  • Application : 425 octets
  • Total : 30.425 Kio

Sacrée différence n’est-ce pas ? Maintenant, il n’y a plus qu’à faire. Je pense que ce Summer of Code sera pour moi l’occasion d’apprendre beaucoup sur le futur de Java ainsi que sur Debian tout en me gardant bien occupé durant l’été.

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 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 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.

- page 1 of 5