ubuntu-fr

Communauté francophone des utilisateurs d'Ubuntu

Planet Ubuntu-fr - Java

Fil des billets

samedi, mai 30 2009

Gravatar de RespawnerDémo : la version 1.1.1 de gSplit en vidéo via Respawner

Ç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.
dimanche, mai 3 2009

Gravatar de RespawnerLe système de notification à portée de main avec java-gnome via Respawner

Il m'est arrivé, à plusieurs reprises, de parler du binding java-gnome. Depuis que je passe sur le canal IRC régulièrement, j'ai eu l'occasion, avec des utilisateurs et hackers plus expérimentés que moi, de travailler sur le système de notification. Le système se base donc sur libnotify qui est utilisé par le joli notify-osd qui a fait son apparition avec Jaunty Jackalope.

Le travail n'est pas encore dans la branche principale de java-gnome mais ça ne devrait pas tarder. Tout ceci grâce à Serkan Kaba qui a tout développé sur sa branche personnelle dédiée à libnotify. Pour la compiler, on passe par les commandes suivantes sans oublier d'installer le paquet libnotify-dev :
$ bzr checkout <url>
$ cd libnotify
$ ./configure --prefix=/usr
$ make
$ sudo make install


Il est alors possible d'utiliser le binding, un exemple est disponible et donne le résultat que voici.

On pourra donc espérer voir cette nouvelle fonctionnalité dans la prochaine version de java-gnome (qui attendra un bon moment quand même à cause de la sortie très récente de la release 4.0.11). Notez qu'il est également possible d'interagir avec le système de notification via dbus mais la solution proposée par java-gnome paraît beaucoup plus simple d'emploi et a l'avantage de ne pas avoir à installer la dépendance dbus-java.

jeudi, mars 19 2009

Gravatar de RespawnerDes nouvelles du front via Respawner

Ça fait un bon moment que je ne parle plus trop de gSplit et pourtant le développement ne s'est pas arrêté. J'ai d'ailleurs profité de la nouvelle version de java-gnome pour actualiser le code source et donc en profiter. Il y a donc eu des évolutions au niveau du code, il restait un bon petit paquet de défauts de jeunesse que j'ai corrigé en faisant le tour des fichiers une bonne fois. mais bon niveau utilisateur ce n'est pas très parlant ceci. On voit aussi niveau interface graphique qu'il y a eu quelques rectifications et modifications d'icônes. À part ceci, on peut noter 3 ajouts dont les idées me sont venues en voyant d'autres logiciels en action ou grâce à des demandes qui m'ont été faites.

On va commencer par la fenêtre de logs (historique). Elle permet de voir en détails ce que le logiciel fait lorsque l'on l'utilise. L'idée m'est apparue en voyant de genre de fenêtres sur d'autres logiciels (comme Transmission).

Ensuite, on va se concentrer sur la nouvelle disposition de la liste des fichiers à assembler. Plus lisible, ré-organisable, bref plus dynamique. Désormais, elle utilise une modèle en arbre. La première ligne correspond au chemin et au nom du fichier qui va être créé et les "sous-lignes" elles correspondent aux parties à assembler. Elles sont détectées automatiquement si elles se situent dans un même dossier et qu'elles sont nommées comme la convention le veut. Par défaut, elles sont organisées par ordre alphabétique mais elles peuvent être réorganisées via le menu contextuel disponible grâce à la sélection d'une ligne suivi d'un clic-droit. L'idée vient de deux commentaires dans des billets précédents.

Enfin, on va terminer sur la dernière touche personnelle que j'ai terminée aujourd'hui. J'ai eu l'idée de la faire après avoir fait une mise à jour vers Jaunty de ma machine virtuelle et avoir vu la boîte de dialogue du gestionnaire de mise à jour. On a donc droit maintenant aux détails dans la fenêtre de progression. Assez simple à comprendre je pense, l'icône verte est destinée à l'action terminée, la bleue pour l'action en cours et la pointe de flèche pour les actions à venir.

Donc non, nous ne sommes pas morts. La dernière version estampillée 1.1 est disponible via le SVN et doit être compilée avec Ant. Elle utilise l'API java-gnome en version 4.0.10 comme je l'ai déjà dit. Les paquets ne sont pas encore faits. C'est mon gros point faible, donc si quelqu'un se sent de m'aider (et voir apparaître son nom dans les auteurs bien entendu) il est le bienvenu. Le paquet pour java-gnome est fait, on peut donc s'en servir comme dépendances dans un dépôt perso.

mercredi, février 11 2009

Gravatar de RespawnerCréer un widget GTK personnalisé avec java-gnome via Respawner

Depuis plusieurs semaines, je suis le développement de la version 2 de emesene. Au programme, une réécriture complète du code (Python). Bref, ce n'est pas l'objet du billet. Donc l'autre jour, je me décide à tester la version SVN pour voir ce qui marche et ce qui ne marche pas. Tout de suite je suis attiré par un bouton sur l'interface de login.

Trouvant ce widget GTK plutôt intéressant, je me décide de chercher son nom pour tenter de l'utiliser. Malheureusement, impossible de le trouver. En effet, le(s) développeur(s) de emesene nous avai(en)t concocté un widget GTK "custom".
Ce composant permet ici de choisir le statut à utiliser pour se connecter. Étant de nature plutôt curieux, j'ai tout de suite sauté sur l'occasion pour tenter de reproduire ceci en Java avec l'aide de java-gnome.

Commençons sans plus attendre. On va faire ça bien et utiliser au total 3 classes et une énumération (Icons, Main, Status, StatusButton). On va reproduire un bouton identique à celui de emesene avec un peu plus de statuts et d'icônes. Vous pouvez trouver une archive du projet fait via Eclipse en cliquant sur ce lien. Je vous passe la récupération des icônes et leur utilisation, on va se concentrer sur la construction du bouton de statut.

Comme je l'ai dit plus haut, ce bouton de statut n'existe pas par défaut. Il faut donc le créer et lui faire faire ce que l'on souhaite. Ici il s'agit simplement de lui faire afficher une icône et un menu lorsque le bouton est activé via un clique avec la souris. Pour que notre composant soit considéré en tant que widget par l'API java-gnome, on va jouer avec l'héritage et attribuer à notre classe StatusButton la classe mère Button de l'API.
    public class StatusButton extends Button {
        ...
    }


Notre classe se composera de 2 champs, d'un constructeur ainsi que de 3 méthodes dont 2 qui seront des méthodes redéfinies de la classe Button. Commençons par voir à quoi vont nous servir les 2 champs. Le premier sera un structure de données de type Map qui va nous permettre de construire un cache pour ne pas charger les icônes à chaque fois. Il sera utilisé également de manière static pour être commun à chaque StatusButton de notre interface s'il y en a plusieurs.
    private static HashMap<Integer, Image> _cache = new HashMap<Integer, Image>();

Le second champ sera quant à lui un simple objet de type org.gnome.gtk.Image. Il représentera donc l'image actuellement affichée par le bouton.
    private Image _image;

La construction du bouton se fera via le constructeur de notre classe. Il ne demandera aucun argument et fera appel au constructeur de la classe mère via le mot clé super.
    public StatusButton() {
        super();
        ...
    }


C'est ici que l'on va définir ce que le bouton affichera, son style ainsi que l'action à faire en cas de clique. Notre bouton sera donc (si le curseur n'est pas dessus) plat et ressemblera donc à un Label. Par défaut, il affichera l'icône associée au statut "En ligne".
    this.setStatus(Status.ONLINE);
    this.setRelief(ReliefStyle.NONE);
    this.setBorderWidth(0);


Maintenant, nous allons définir l'action réalisée si l'utilisateur clique sur le bouton via le listener Button.Clicked. Il est effectivement possible d'utiliser tous les listeners utilisables par la classe Button car notre widget hérite directement d'elle.
    this.connect(new Button.Clicked() {
        @Override
        public void onClicked(Button source) {
            ...
        }
    });


Lors du clique nous allons donc construire un menu contenant tous les statuts pour pouvoir en sélectionner un et ainsi changer l'icône affichée par notre bouton. Pour cela, on utilise des objets de type Menu, ImageMenuItem pour finalement popup le menu. Tout ceci est donc à placer dans la méthode onClicked ci-dessus.
    Menu contextMenu = new Menu();
    for (final Status status : Status.values()) {
        ImageMenuItem item = new ImageMenuItem(new Image(status.getIcon()), status.toString());
        contextMenu.append(item);

        item.connect(new MenuItem.Activate() {
            @Override
            public void onActivate(MenuItem source) {
                StatusButton.this.setStatus(status);
            }
        });
    }
    contextMenu.showAll();
    contextMenu.popup();


Une fois ce code terminé, notre constructeur est prêt. Regardons donc de plus près les méthodes utilisées à savoir setStatus, show et showAll. Ces deux dernières viennent de la classe mère Button et permettent d'afficher le widget.
    @Override
    public void show() {
        _image.show();
        super.show();
    }

    @Override
    public void showAll() {
        this.show();
    }


La méthode setStatus, elle permettra simplement de changer l'icône affichée par le bouton. Elle mettra également l'icône en cache si elle n'y est pas déjà.
    public void setStatus(Status status) {
        if (_cache.containsKey(status.getId()))
            _image = _cache.get(status.getId());
        else {
            _image = new Image(status.getIcon());
            _cache.put(status.getId(), _image);
        }
        this.setImage(_image);
    }


A ce stade, on a fait le tour de la construction du widget en lui-même. Je vous invite à jeter un oeil sur l'énumération Status et la classe Icons. Pour finir, on va regarder comment construire une fenêtre simple pour tester notre bouton (voir la classe Main).

On construit donc une fenêtre simple qui va contenir une VBox laquelle va avoir un Label et un StatusButton.
    final Window window = new Window();
    ...
    final Alignment align = new Alignment(0.0f, 0.0f, 0.0f, 0.0f);
    ...
    final VBox vbox = new VBox(false, 0);
    align.add(vbox);

    final Label label = new Label("Click on the above button.");
    vbox.add(label);
    final StatusButton button = new StatusButton();
    vbox.add(button);

    window.showAll();


Enfin, on écrit notre méthode principale à savoir le main. Il initialisera GTK, chargera les icônes et affichera la fenêtre.
    public static void main(String[] args) {
        Gtk.init(args);

        Icons.loadIcons();
        new Main();

        Gtk.main();
    }


Et finalement, on doit se retrouver avec quelque chose dans ce genre.

lundi, janvier 26 2009

Gravatar de RespawnerLe point sur gSplit en vidéo via Respawner

Depuis le dernier screencast sur gSplit, il y a eu pas mal de changements. Qu'ils soient d'ordre graphique ou autre il est toujours intéressant de les découvrir en vidéo. Voici donc un screencast où je vous présente les nouveautés les plus intéressantes et flagrantes. Bah oui hein, après tout les corrections de bugs c'est moins intéressant pour un logiciel en cours de développement. Et puis, vous savez ce qu'on dit, on corrige un bug et on en ouvre deux autres ^^.

Vous pouvez donc visionner le screencast ci-dessous ou bien encore mieux télécharger la version OGG en 800x600 qui est de bien meilleure qualité.

Il n'y a pas de paquet Debian de test pour cette fois, si vous voulez donc utiliser gSplit, vous pouvez suivre ce guide. Vous pouvez aussi visiter l'espace dédié à gSplit sur Launchpad. C'est là-bas que seront gérés les rapports de bugs par exemple.
dimanche, janvier 4 2009

Gravatar de RespawnerLes nouveautés gSplit de la semaine via Respawner

Pas de screencast cette fois. Aujourd'hui on va se contenter d'un billet simple. gSplit avance toujours grâce à vos idées et j'en ai reçu un bon paquet cette semaine je n'ai donc pas eu le temps de tout faire naturellement. Je me suis focalisé avant sur ce que je voulais coder avant tout. Il y a donc eu des correctifs divers de faits avec quelques réécritures de code. Il faut noter tout de même deux nouveautés peut-être même trois après tout.

On note notamment une boîte de dialogue de progression plus complète avec la possibilité de mettre en pause mais aussi de reprendre le découpage ou l'assemblage des fichiers. Cette même boîte de dialogue est aussi utilisé lors du calcul d'une signature MD5 afin de montrer que le programme tourne correctement (barre de progression faisant des allers-retours).


Boîte de dialogue de progression


Boîte de dialogue de progression (en pause)

Le fenêtre de préférences a accueilli de nouveaux composants qui auparavant étaient directement situés dans l'interface. Elle accueille donc en plus un champ pour modifier la taille du suffixe, un case à cocher pour sauvegarder la signature MD5 du fichier ainsi qu'une autre pour demander la suppression automatique des parties après assemblage.

Boîte de dialogue des préférences

Enfin dernière nouveauté, en cas d'erreur ou d'exception non-supportés par le programme à la base, une boîte de dialogue apparaît afin de vous permettre de faire un rapport de bug pour que ce dernier soit corrigé le plus vite possible. Il vous suffira alors de cliquer sur le bouton prévu puis à compléter le formulaire en donnant les informations contenant dans la vue de texte.

Boîte de dialogue de debug

Au niveau des changements un peu plus mineurs, seul les suffixes numériques peuvent être utilisés, le modèle du nom des fichiers se voient automatiquement ajouté le suffixe .part après le nom de base du fichier à découper. Ce qui va venir (espérons) prochainement sont la détection automatique de tous les fichiers de parties, l'autorisation de la suppression des parties seulement si les signatures MD5 correspondent parfaitement (ce qui implique une vérification automatique après assemblage), la possibilité de trier manuellement les parties pour choisir l'ordre d'assemblage, l'ajout du support du drag & drop (il faut attendre une prochaine version de java-gnome).

Je remercie eclipse qui m'a proposé des paquets fonctionnels pour Ubuntu et Debian ainsi que pour ses remarques plutôt pertinentes afin d'assurer un avenir meilleur à gSplit en tant que paquet. Je mettrai en ligne ses paquets un de ces jours (si j'y pense ^^). Notez aussi que le PPA se met progressivement en place. Je viens (il y a quelques minutes) de "packager" la dernière version de java-gnome dont gSplit va donc dépendre (pour le moment seulement pour Intrepid). Vous pouvez si vous le souhaitez ajouter dans votre sources.list les deux lignes suivantes (attention ! c'est un dépôt non-officiel il y a donc un risque possible pour votre système en l'utilisant).
    deb http://ppa.launchpad.net/respawneral/ubuntu intrepid main
    deb-src http://ppa.launchpad.net/respawneral/ubuntu intrepid main


Au passage, si vous avez des idées de créations d'une icône et si vous vous sentez de le faire n'hésitez pas à me la proposer.
lundi, décembre 29 2008

Gravatar de RespawnergSplit épisode 3 via Respawner

Je sais je sais, je suis en retard d'un jour ^^. Mais mieux vaut tard que jamais. Voici donc un nouveau screencast présentant l'évolution de gSplit pendant la semaine qui vient de passer. La version présentée, numérotée 0.8, est extraite de la dernière version SVN, à savoir la révision 56 qui a été terminée à 20h27 aujourd'hui.


Version 800x600 au format Ogg.
Qu'il y a-t-il donc de nouveau ?
  1. Fenêtre de préférences (très light) ;
  2. Onglet Vérification fonctionnel ;
  3. Possibilité d'enregistrer la signature MD5 d'origine dans un fichier (proposé par altg) ;
  4. Correction du clignotement de la barre de statut ;
  5. Ajout d'une fenêtre de progression.

Qu'il y a-t-il de prévu ?

  1. Possibilité pour arrêter le découpage ou l'assemblage en cours d'exécution ;
  2. gSplit version 1.0 (première version stable) ;
  3. Paquets sources et binaires ;
  4. Gestion de java-gnome comme dépendances des paquets ;
  5. Dépôt de paquets ;
  6. Vos idées ?

Merci encore aux personnes participant à l'élaboration du programme par leurs remarques. De l'aide pour le code, les idées, la traduction ou encore la réalisation de paquets est la bienvenue. Vous trouverez le paquet binaire de la version 0.8 ici. N'oubliez pas que ce dernier peut être dangereux pour votre système (version instable oblige) !

dimanche, décembre 21 2008

Gravatar de RespawnergSplit s'illustre une nouvelle fois via Respawner

Nous voici une semaine après le premier screencast. Une semaine qui a apporté un grand nombre de changements au sein de gSplit. C’est donc l’occasion d’une nouvelle vidéo pour illustrer les nouveautés apparue. C’est partie pour le tour du propriétaire.


Version 800x600 au format Ogg

Les nouveautés :
  • nouveau système de traduction (fichiers .po et .mo) ;
  • nouvelle interface graphique ;
  • ajout de la fonction d’assemblage des fichiers ;
  • correctifs divers.
Ce qui va venir :
  • ajout d’une fonction de comparaison entre fichiers ;
  • gSplit version 1.0 ;
  • paquets Debian (sources + binaires) ;
  • dépôt de paquets ;
  • vos idées.
De nouvelles idées, traductions sont les bienvenues. Vous trouverez un peu plus d’informations sur le site web de gSplit. Vous pouvez aussi télécharger ce paquet debian pour tester gSplit mais n’oubliez que c’est une version en développement et que vous prenez des risques en l’utilisant.
vendredi, décembre 19 2008

Gravatar de KagouFlash et Java pour Ubuntu 64bits via Kagou

Voilà que tombe la dernière barrière qui m'empêchait de profiter pleinement de la version 64bits de mon système d'exploitation préféré. Après la mise à disposition de flash en 64bits natif (sans passer par une couche d'émulation) par Adobe :

cd
wget http://download.macromedia.com/pub/labs/flashplayer10/libflashplayer-10.0.d21.1.linux-x86_64.so.tar.gz
tar xvf libflashplayer-10.0.d21.1.linux-x86_64.so.tar.gz
sudo mv libflashplayer.so /usr/lib/mozilla/plugins/
exit 

Relancez firefox et profitez des animations !

Il est à noter qu'il vous faut au préalable supprimer flash 32bits que vous auriez pu déjà installer, et également que ces manipulations entraînent l'installation d'un bout de logiciel non supporté officiellement par Ubuntu ;)

Je disais donc que voici le plugin 64bits en java, tant attendu par certain :) L'installation de java en 64 bits se faisant en installant simplement le paquet nommé sun-java6-jre. Voici un exemple de commandes afin d'installer le plugin :

cd
wget http://www.java.net/download/jdk6/6u12/promoted/b02/binaries/jre-6u12-ea-bin-b02-linux-amd64-08_dec_2008.bin
cd /opt/
sudo sh ~/jre-6u12-ea-bin-b02-linux-amd64-08_dec_2008.bin
cd /usr/lib/mozilla/plugins/
sudo ln -s /opt/jre1.6.0_12/lib/amd64/libnpjp2.so
exit 

Relancez firefox et profitez des applets en java comme l'applet IRC sur le site d'ubuntu-fr ;)

Notez également que tout comme flash cette manipulation est à faire en connaissance de cause car elle peut être source de problème et n'est pas maintenue officiellement par Ubuntu.

mardi, décembre 16 2008

Gravatar de LittlewingSun fournit un plugin 64 bits pour gnu/linux via Littlewing

Après le début du support 64 bits d' Adobe Flash, des prémices de wine 64, voici Sun qui fournit désormais un plugin java 64 bits pour GNU/Linux. A mon avis, ca en est encore aux prémices. La version fournie sur le site de Sun est soit une tarball à installer soit même, soit un fichier RPM.

Que reste t'il à passer en 64 bits? Quelques codecs videos et drivers? En tout cas c'est une bonne nouvelle pour le support 64 bits sur GNU/Linux et Ubuntu/Linux par la même occasion. D'ici un an peut être, je repasserai mes stations de travail vers la version ubuntu amd64 :-)

dimanche, décembre 14 2008

Gravatar de RespawnerLe petit split illustré via Respawner

Cette fois, je me suis laissé tenter. Je vous ai concocté une (petite) vidéo au lieu d’un long billet. J’espère que vous l’apprécierez. Vous comprendrez vite de quoi ça parle. Pour info, la voix est bien la mienne, donc je fais ce que je peux hein ^^.


Je suis conscient que la vidéo ne passe pas très bien via un petit player comme ça, vous pouvez donc télécharger la version 800x600 au format libre Ogg. Le tout a été produit via RecordMyDesktop et quelques traitements via FFMPEG (un billet devrait arriver sur ce sujet).

Et enfin pour ceux qui souhaitent tester le programme voici le paquet Debian. Attention, ce programme est en cours de développement, utilisez-le seulement si vous savez ce que vous faites !

Comme je le dis à la fin, n’hésitez pas à me contacter pour toutes informations, critiques ou demandes.
samedi, novembre 15 2008

Gravatar de RespawnerRéalisation du paquet Debian pour notre application via Respawner

Lors du billet précédent, nous avons réalisé un générateur de mot de passe en Java avec une interface GTK+. Maintenant, nous allons enfermer tout ça dans un joli paquet Debian afin de diffuser et d’installer plus facilement notre application. Nous allons aussi en profiter de l’installation du paquet pour créer une entrée dans le menu GNOME, ce qui est toujours utile et plus sympa à voir.

Tout d’abord, nous allons commencer par modifier un peu notre programme. En effet, une fois installé, le chemin du dossier data ne sera pas le même que nous utilisions auparavant. Pour cela, on va faire simple. On va commencer par modifier le script shell permettant de lancer le programme. On commence par enlever son extension .sh qui ne sert pas à grand chose et qui va faire tâche une fois que ce script va se retrouver avec tous les autres déjà présents. Enfin on change les 2 premières lignes non commentées par celles-ci.
CLASSPATH=${CLASSPATH}:/usr/share/password-generator/data/gtk-4.0.jar
CLASSPATH=${CLASSPATH}:/usr/share/password-generator/passgenerator.jar


Maintenant, au tour des chemins qui se trouvent dans le code Java. Pour les modifier, on va créer une variable globale contenant le chemin, il ne restera ainsi qu’à concaténer le nom d’un fichier en cas de besoin. On ouvre alors le fichier PasswordGenerator.java. On ajoute tout de suite après la première accolade ceci.
public static final String DATA_PATH = "/usr/share/password-generator/data/";

On enregistre, puis on ouvre le fichier GtkInterface.java. On ajoute l’import suivant.
import static generator.PasswordGenerator.DATA_PATH;

On change la valeur du champ GLADE_FILE par celle-ci DATA_PATH + "PasswordGenerator.glade". Puis on cherche la ligne :
icon = new Pixbuf("./data/lock-logo.png");
Pour la remplacer par celle la.
icon = new Pixbuf(DATA_PATH + "lock-logo.png");

Il ne reste alors qu’à enregistrer.

Il faut maintenant compiler notre application. Pour ceci, on utilise le script Ant. Il faut donc que Ant soit installé (voir ce billet si ce n’est pas le cas). On se rend dans le dossier contenant le projet et on compile.
~$ cd workspace/PasswordGenerator
~/workspace/PasswordGenerator$ ant clean dist


On trouve alors un fichier passgenerator.zip dans le dossier build créé. On le récupère et le met dans notre répertoire perso. On en extrait tous les fichiers.
~$ unzip passgenerator.zip

Pour former un paquet Debian, il faut que l’on respecte une arborescence entre dossiers et sous-dossiers bien précise. Toujours dans le répertoire personnel, on crée le dossier password-generator.
~$ mkdir password-generator

Ce dossier doit contenir 2 sous-dossiers nommés respectivement DEBIAN et usr.
Commençons par nous intéresser au dossier DEBIAN et à son contenu. Il faut tout d’abord le créer et l’utiliser.
~$ mkdir password-generator/DEBIAN && cd password-generator/DEBIAN

A l’intérieur on va y déposer 3 fichiers : control, postinst et postrm.
Le fichier control permet de décrire le paquet : dépendances, description, nom, auteur et mainteneur du paquet… Voici son contenu pour nous.
Package: PasswordGenerator
Version: 1.0
Section: base
Priority: optional
Architecture: all
Depends: bash, sun-java6-jre
Maintainer: Guillaume Mazoyer <respawneral@gmail.com>
Description: Password generator written in Java and using GTK+.


Vous pouvez changer le nom du mainteneur du paquet, je ne vous en voudrais pas ^^. On remarque comme dépendances bash et sun-java6-jre (pour la JVM). On comprend vite comment ce fichier est utilisé une fois que l’on tente d’installer le paquet avec Gdebi.
Pour ce qui est de postinst et postrm, ce sont en fait 2 scripts. postinst est le script lancé après installation du paquet et postrm est le script exécuté après suppression du paquet. On va les utiliser entre autre pour créer le lanceur dans le menu GNOME et le supprimer. Dans la même veine, il est possible de créer les fichiers preinst et prerm qui correspondent aux scripts lancés avant installation et avant suppression.

Le fichier postinst va contenir ceci.
#!/bin/bash
LAUNCHER="/usr/share/applications/passgenerator.desktop"
touch $LAUNCHER
echo "[Desktop Entry]" > $LAUNCHER
echo "Name=Password Generator" >> $LAUNCHER
echo "Name[fr]=Générateur de mot de passe" >> $LAUNCHER
echo "Comment=Generate your passwords" >> $LAUNCHER
echo "Comment[fr]=Générez vos mots de passe" >> $LAUNCHER
echo "TryExec=passgenerator" >> $LAUNCHER
echo "Exec=passgenerator" >> $LAUNCHER
echo "Icon=gnome-lockscreen" >> $LAUNCHER
echo "Terminal=false" >> $LAUNCHER
echo "Type=Application" >> $LAUNCHER
echo "Categories=Utility;" >> $LAUNCHER
echo "MimeType=text/plain;" >> $LAUNCHER
echo "Password Generator successfully installed."


Et postrm lui contiendra ce code.
#!/bin/bash
LAUNCHER="/usr/share/applications/passgenerator.desktop"
rm $LAUNCHER
echo "Password Generator successfully uninstalled"


On crée le launcher et on le supprime ni plus ni moins.
A ce moment précis, les informations du paquet ainsi que le comportement d’installation et de suppression sont définis.

Il ne reste plus qu’à organiser correctement le contenu du dossier usr. Ce dernier va contenir 2 sous-dossiers nommés respectivement bin et share. A l’intérieur de bin, on mettre le script shell de lancement de notre programme (passgenerator). Le répertoire share lui va contenir un sous-répertoire nommé password-generator dans lequel on trouvera un dossier doc (contenant la documentation à réaliser comme vous le souhaitez), le dossier data et notre fichier JAR (passgenerator.jar). Ainsi lors de l’installation de notre paquet, le contenu de usr/bin ira dans /usr/bin (du système) et celui de usr/share ira de la même façon dans /usr/share (du système. On doit obtenir une arborescence comme celle-ci.

On n’oublie pas de rendre exécutable les scripts.
~/password-generator$ chmod 755 DEBIAN/post*
~/password-generator$ chmod 755 usr/bin/passgenerator


Il ne nous reste plus qu’à “packager” ceci. Pour cela, on se place dans le répertoire personnel. Et on utilise dpkg-deb.
~/password-generator$ cd ~
~$ dpkg-deb --build password-generator


On obtient alors le fichier password-generator.deb. On peut l’installer grâce à Gdebi ou encore avec la commande suivante.
~$ sudo dpkg -i password-generator.deb

jeudi, novembre 13 2008

Gravatar de RespawnerRéalisation d'une application pour son bureau GNOME via Respawner

Lors d’un de mes précédents billets, j’avais expliqué brièvement comment réaliser une application pour l’environnement GNOME avec Glade et l’API java-gnome. Pour cela, nous avions réalisé une application très simple avec un bouton et un label. Aujourd’hui nous allons construire une application complète et vraiment “utile”. Pour ne pas trop compliquer ce billet, j’ai décidé donc que nous allions faire un générateur de mot de passe dont l’algorithme n’est pas très complexe. Voyons ceci dès maintenant.

1 - Utilisation de java-gnome

Je ne vais pas redétailler cette partie, si certain l’on raté, l’explication est dans ce billet.

2 - Le projet

J’utilise Eclipse pour mes projets en Java depuis mes débuts. Je vous propose donc de l’utiliser aussi. Voici l’arborescence du projet après fin du code.

Vu que je ne vais pas détailler chaque partie de mon code je vous propose le téléchargement du projet directement grâce au fichier PasswordGenerator.tar.bz2.

3 - Algorithme du générateur de mot de passe

L’algorithme que l’on va utiliser pour générer le mot de passe n’est pas très complexe à comprendre. Le but est de sélectionner un caractère aléatoirement dans une liste et de l’ajouter à la chaîne de caractères composant le mot de passe. On veut que le mot de passe soit un minimum modifiable, par conséquent, on va pouvoir via notre interface GTK+ sélectionner les types de caractères que l’on souhaite. On en distingue 4 :

  • les majuscules,
  • les minusucules,
  • les chiffres,
  • les caractères spéciaux.

Pour pouvoir réaliser ceci, on ne va donc pas se contenter d’une seule liste réunissant tout l’ensemble mais de 4 listes (en réalité des chaînes de caractères pour ne pas se compliquer la tâche) bien distinctes comportant chacune un type de caractères. Chose important, le nombre aléatoire que l’on va obtenir ne doit pas dépasser la taille de la liste. C’est à dire que si la liste comporte 26 caractères, il ne faut pas tomber sur un nombre supérieur à 26. Pour cela, on va réaliser notre propre méthode de génération de nombre aléatoire en utilisant ce que l’API nous offre déjà. Ce n’est pas très complexe, je vous laisse regarder le contenu du package nommé random.

Maintenant, voici l’en-tête de notre méthode de génération du mot de passe.
    public static String randomPassword(int length, boolean[] use)
Le premier argument, length, qui est un entier, correspond à la taille du mot de passe donc au nombre de caractères qu’il contiendra. Le deuxième argument est un tableau de booléens. Plus précisément, un tableau de 4 booléens qui va nous permettre de savoir quoi mettre dans le mot de passe. Le premier booléen correspond aux chiffres, le deuxième aux majuscules, le troisième aux minuscules et le dernier aux caractères spéciaux.

    StringBuilder password = new StringBuilder();
    String lowerChar = "azertyuiopqsdfghjklmwxcvbn";
    String upperChar = "AZERTYUIOPQSDFGHJKLMWXCVBN";
    String digits = "0123456789";
    String specialChar = "&~#{([-|_\\^@)]=}$%*!:/;.?,<> ";

Voici les suites de caractères à utiliser ainsi que la déclaration de la chaîne password qui va contenir le mot de passe. On utilise un StringBuilder et non un String basique car il va y avoir plusieurs opérations d’ajout d’un seul caractère c’est donc beaucoup plus propre de le faire ainsi que par des concaténation de chaînes.

    for (int i = 0; i < length; i++) {
        int rnd = -1;
        int charSet = Random.nextInt(4);

        if (!use[charSet]) {
            i--;
            continue;
        }
    ...
    }

Voici la boucle qui va générer le mot de passe. On initialise une variable qui s’incrémentera jusqu’à obtenir la valeur de la taille du mot de passe voulue. L’entier nommé rnd correspond à la valeur du nombre aléatoire utilisé pour choisir le caractère et l’entier nommé charSet va servir à sélectionner le type de caractères à utiliser. Ici un nombre entier compris entre 0 et 3 (inclus, le 4 est exclu). Le test avec la condition (!use[charSet]) permet de ne pas utiliser un type de caractères dans le cas ou on n’en voudrait pas. En gros, si la variable charSet prend une valeur qui permettra de sélectionner les chiffres mais que l’on ne veut pas de chiffres, le on rentrera dans le if qui va décrémenter i (pour annuler “l’effet” de l’itération) et lancer une nouvelle itération avec le mot-clé continue.

    switch (charSet) {
        case 0:
            rnd = Random.nextInt(digits.length());
            password.append(digits.charAt(rnd));
            break;

Ici, selon le type de caractères, on va sélectionner le caractère qui va bien et l’ajouter dans le mot de passe. Pour cela, on choisit un nombre compris entre 0 et la taille de la chaîne contenant le caractère puis on l’ajoute. Le case 0 correspond au cas des chiffres, on retrouve d’autres case pour les majuscules, minuscules et caractères spéciaux.

Enfin, après avoir itérer autant qu’il a fallut, on retourne le mot de passe sous forme de String. Rappelez-vous dans notre en-tête de méthode, on a bien spécifier que notre méthode retournait une variable de type String.
    return password.toString();

Vous pouvez retrouver tout ce code (en entier c’est mieux) dans le fichier Password.java.

4 - Réalisation de l’interface GTK+

Pour ce qui est du design même de l’interface, on ne va pas s’embêter et on va utiliser Glade, un outil dans j’ai parlé plusieurs fois et qui permet de réaliser très simplement son interface. Pour ce qui est de la fenêtre que l’on va faire on va gagner du temps et utiliser directement une boîte de dialogue qui comporte déjà 2 parties utiles. A savoir, une partie vide ainsi que une spécialement faite pour y mettre des boutons. Réalisons donc une interface ressemblant à ceci, avec une arborescence identique à celle proposée sur l’image ci-dessous. Le fichier Glade est disponible dans l’archive et se nomme PasswordGenerator.glade.


Une fois l’interface réalisé, il faut maintenant l’exploiter avec le code Java et lui faire réaliser les actions que l’on souhaite. Tout d’abord, qu’est-ce que l’on voit sur cette interface GTK+ ? On remarque qu’il y a 4 checkboxs correspondant à l’utilisation (case cochée, par défaut) ou non (case décochée) des types de caractères. On voit aussi une barre pour choisir la taille du mot de passe (valeur par défaut 8). On sait tous qu’un vrai mot de passe se compose d’au moins 8 caractères avec alternance majuscules, minuscules, chiffres et caractères spéciaux. Enfin, il y a 3 boutons, un bouton Quitter (qui veut tout dire), un Actualiser qui va permettre de générer le mot de passe (qui se situera dans la champ de texte) et un bouton Copier pour copier le mot de passe dans le presse-papier. Tous ces boutons sont des boutons “basiques” dont l’icône, le label et le mnemonic sont déjà définis. Nous allons donc voir seulement les actions associées à ses boutons pour le reste il vous suffira de voir le code ce n’est pas très complexe et il y a des commentaires.

Commençons par le bouton Quitter. Ce dernier a pour effet de terminer le programme. Voilà comment on code ceci.
    // Exit button
    Button exitButton = (Button) _glade.getWidget("exit_button");
    exitButton.connect(new Button.Clicked() {
        @Override
        public void onClicked(Button source) {
            Gtk.mainQuit();
        }
    });

On récupère l’élément bouton et au clic sur ce bouton on applique l’action Gtk.mainQuit() qui termine la boucle lancée par Gtk.main().

Après ceci, occupons-nous du bouton Actualiser qui lancera la génération du mot de passe. Idem on récupère le bouton mais au clic on lui applique une autre méthode que l’on a créé auparavant.
    // Refresh button
    Button applyButton = (Button) _glade.getWidget("apply_button");
    applyButton.connect(new Button.Clicked() {
        @Override
        public void onClicked(Button source) {
            GtkInterface.this.generatePassword();
        }
    });

La méthode generatePassword() va elle vraiment se charger de récupérer un mot de passe et d’actualiser le champ de texte de l’interface.
    private void generatePassword() {
        boolean[] checks = { _digitCheck.getActive(), _upperCheck.getActive(),
                _lowerCheck.getActive(), _specialCheck.getActive() };
        int length = (int) _lengthScale.getValue();

        if (!checks[0] && !checks[1] && !checks[2] && !checks[3])
            this.errorDialog(Languages.ERROR, Languages.CHECKBOX_ERROR);
        else {
            String password = Password.randomPassword(length, checks);
            _passwordEntry.setText(password);
        }
    }

On récupère la longueur du mot de passe. Et là un test, si on a décoché toutes les cases, on signale une erreur à l’utilisateur via une fenêtre spéciale appelée par la méthode errorDialog(String title, String text).

Pour finir, on définit l’action du bouton Copier. On va bien entendu copier le mot de passe dans le presse-papier dans le but de le coller plus tard bien entendu.
    // Copy button
    Button copyButton = (Button) _glade.getWidget("copy_button");
    copyButton.connect(new Button.Clicked() {
        @Override
        public void onClicked(Button source) {
            GtkInterface.this.copyToClipboard(_passwordEntry.getText());
        }
    });

C’est la méthode copyToClipboard(String text) qui va copier le contenu du champ texte dans le presse-papier si bien entendu l’environnement le supporte mais ça ne devrait pas poser de problème. Voici le contenu de cette méthode.
    private void copyToClipboard(String password) {
        try {
            StringSelection selection = new StringSelection(
                    password == null ? "" : password);
            Toolkit.getDefaultToolkit().getSystemClipboard().setContents(
                    selection, null);
        } catch (IllegalStateException e) {
            this.errorDialog(Languages.ERROR, Languages.COPY_ERROR);
        }
    }


N’oubliez pas surtout de regarder tous les autres fichiers pour comprendre le code et tous les appels de méthodes. Et normalement, après compilation (via le script Ant), Il ne reste qu’à dézipper le fichier .zip généré, donner les droits d’exécution au script shell et le lancer (on peut aussi utiliser le Run de Eclipse). Après tout ceci, on obtient notre joli générateur de mot de passe sans aucun problème.
Si vous avez des questions, besoin de plus d’explication, n’hésitez pas à demander.

jeudi, juillet 31 2008

Gravatar de CedynamixOpenJDK6 par défaut avec Ubuntu 8.10 Intrepid Ibex via Cedynamix

On apprend aujourd’hui par la biais de la mailing list ubuntu-devel-announce. que OpenJDK 6 (version Open Source de Java) sera le paquet par défaut sur Ubuntu 8.10 Intrepid Ibex pour Java Runtime Environment (JRE) et Java Development Kit (JDK). OpenJDK 6 sera disponible pour les architectures x86 et x86_64, Hotspot VM avec son compilateur JIT (Just In Time) sera utilisé comme une machine virtuelle par défaut. OpenJDK 6 est compatible avec la version 6 de Java.

Du libre encore du libre ça vous inspire ? ;-)

jeudi, juillet 24 2008

Gravatar de LittlewingLes plateformes SUN certifiées UBUNTU via Littlewing

J'ai abordé dans un récent article le partenariat entre SUN et Canonical / Ubuntu. Je me permets d'aborder une nouvelle fort intéressante qui n'est apparu que sur quelques blogs anglophones.

Ubuntu offre maintenant du support sur les plateformes SUN Fire, SUN Sparc et SUN Ultra. De son coté, SUN a mis à jour sa 'stack' pour Ubuntu Hardy 8.04 LTS. Il est désormais possible via les dépots Universe et Multiverse d'avoir un environnement de développement et d'execution sans faire d'installation tierce . [1]

Au menu :

  • JDK 6u6 et JDK au cas ou
  • Netbeans dans un vrai paquet et qui s'installe normalement à la mode apt-get
  • glassfish
  • java-db ou derby pour les intimes

Notes

[1] Pour plus d'informations, voir la page du site de SUN à ce sujet