Valhalla.fr
Sic Itur Ad Absurdum
23 Août 2004 On paye...

J’ai pas grand chose à dire alors je vais gueuler un peu sur les boites informatiques, et pour aujourd’hui on va taper un peu sur Microsoft (comme pour pas changer…) et sur Apple.

Apple d’abord car je viens d’acheter mon premier Mac. D’ailleurs je suis en train de rédiger cette note dessus: le clavier est beaucoup mieux que celui de mes 2 PC, et l’écran au format panoramique 16/9 est une merveille. Et puis aussi OS X, le système d’exploitation, qui est très stable, ergonomique, simple, beau, intelligent et rapide. Et en plus on sent que c’est un Unix: quand je copie un fichier de 3 GO de mon disque dur local vers mon disque dur amovible par firewire, je peux faire autre chose sans ralentissement: il y a une vrai gestion du multitâche! En plus mon PowerBook est léger, beau, silencieux, très plat, etc … bref, tout va pour le mieux dans le meilleur des mondes.

Cependant, puisque j’ai décidé de gueuler, il va bien falloir trouver quelque chose: et bien c’est sur Quicktime que j’ai décidé de taper aujourd’hui. Quicktime c’est bien: on clique sur une icone d’un fichier divx, ça s’ouvre, et on peut mate le film. Bref, c’est comme Windows Media Player sous Windows. Cependant, on a beau chercher, on ne peut pas lire de film en mode plein écran, on est obligé de se farcir la fenêtre du soft! pourtant win media player le fait bien lui, il suffit de double-cliquer sur l’image, et hop ça passe en plein écran! Et bien non, le Quicktime quand on clique il aime pas et il met le film en pause… Comment faire alors ? C’est Apple, c’est c’est pas compliqué… il suffit de sortir votre CB et de passer par l’applestore pour débourser 20 euros et passer en version enregistrée de QT. Même pas de fichier à télécharger, après la transaction Apple nous donne un serial qu’il suffit d’entrer dans QT pour dévérouiller ses fonctions cachées. C’est pas de l’abus ça ? franchement… ne pas pouvoir lire un film en plein écran sans avoir à payer… Enfin, je vais pas trop me plaindre parcequ’en ce qui me concerne j’avais besoin d’acheter la version complète pour pourvoir exporter des séquences.

Après avoir tapé sur Apple, on peut aller voir un coup du côté de Microsoft… ah non! je ne vais pas cracher une fois de plus sur XP en disant que c’est instable, que Billou veut conquérir le monde, etc… rien à battre de tout ça. J’ai envie de parler de MS Office qui m’a couté 550 euros et qui bug et qui me gonfle…

En effet, j’ai paramétré la langue par défaut du modèle: espagnol. La langue de tous les styles: espagnol. La langue globale du document et la langue de tous les sous-styles dans mon fichier dérivé du modèle.

Mais rien n’y fait, quand après avoir utilisé un style de titre (titre 1, titre 2, titre 3, etc) j’appuie sur ((Entrée)) pour passer à la ligne suivante et commencer à entrer le texte du paragraphe, Word se remet logiquement sur le style "Normal", avec la bonne police, les bonnes marges et co… sauf la langue! Cet idiot repasse systématiquement en français! Et pas moyen de faire comprendre à cette foutue machine que tout ce que je tape dans ce fichier est en e-s-p-a-g-n-o-l ! Il veut rien savoir l’animal, il refuse catégoriquement de comprendre ! Je dois remettre manuellement la langue par défaut sur espagnol à chaque nouveau paragraphe! Et comme parfois j’ai 10 paragraphes de 3 lignes à la suite, c’est lourd ! (oui, oui, je ne fais pas de gros patés de texte comme dans mon blog… normal c’est sérieux là!).

Et l’aide de Word elle est vraiment moisie: le compagnon office de Word 2002 PC est très intelligent: il a toujours compris les questions que je lui posais, et a toujours donné la bonne réponse, mais le compagnon Office de Word 2004 Mac, c’est un pur lobotomisé, il entrave que dalle! bref, après 20 minutes d’énervement devant le manifique écran de mon mac, j’ai fini par lire ce terrible texte qui disait grosso-modo (mais non t’es pas grosse Germaine, je parle pas de toi!) "Word il est très futé, il s’adapte tout seul comme un grand à la langue de votre clavier et applique cette même langue au correcteur orthographique de votre document!". Mon dieu qu’il est con… je vais devoir taper avec un clavier QWERTY pour accéder au correcteur espagnol ? Imbécile!

En plus, c’est pas pour dire mais mon mac il a un gros défaut de ce point de vue là: il a un vrai clavier franco-français du fin fond de l’Auvergne au pinard qui tache: pas moyen de faire un accent sur un O, un A ou un I, ou même la tilde de Espana (oui, elle y est pas, ben je viens de vous le dire, on peut pas le faire, du moins sans s’exploser les poignets toutes les 20 secondes à faire des combinaisons de Pomme+alt+f8+up+fn+maj+mettre_un_doigt_dans_l’oreille+mettre_un_pied_derrière_la_tête!!). Donc là Word il est paramétré, et j’y ai passé un temps fou… quand je tape espana il me le met l’accent, et tout ça automatiquement, et pareil quand je tape ‘d’ il me met ‘derecho’, etc, etc, ça va très vite de taper des abréviations comme ça! Seulement, ça ne marche que quand la langue du document est l’espagnol, parceque quand je tape ‘d’ avec la langue par défaut français, ça met ‘droit’, et pas ‘derecho’, donc je me retrouve avec un mot français en plein milieu de monde texte espagnol! grrr…

Vivement que la dictée vocale fonctionne efficacement…!

à Montpellier le 23/08/2004

• 957 mots • #société #informatique #microsoft
22 Août 2004 Encore de la pub !

Ahhh !! J’ai fini de paramétrer mon blog ! Il est tout beau, il est tout bleu ! J’espère que la présentation est plaisante, en tout cas elle est sobre et claire ! Mais… il y a un bandeau de pub en haut ! Rahhh c’est pas possible ça, il faut toujours qu’on nous mette de la pub !

NB: ce texte a été le premier de mon blog en kit mis en place grâce à un prestataire de blogs gratuit. Je le laisse tel quel, mais sachez que quand je parle de "blog" dans ce texte, je ne fais pas référence à ce site, mais à mon premier blog, le gratuit, le plein de pub !

Tu surfes sur internet pour trouver un site qui te permet de créer le tien, tu trouves Lycos qui offre un espace gratuit. Tout content tu t’inscris, tu balances sur le FTP toutes tes pages HTML que tu travailles depuis 15 jours sur Dreamweaver, et quand appuies sur ((Entree)) après avoir fébrilement tapé l’URL de ton site dans la barre d’adresse de ton Internet Explorer que tu as customisé avec YahooBar, GoogleBar, BumbassBar, AdvertisingBar, UselessBar et FUbar et qui te prends la moitié de la hauteur de ton écran, ta page d’accueil se charge. Magnifique ! Tiens… j’avais pas vu ça, ce petit machin bleu sur le côté ! C’est quoi ? Allez je vais cliquer dessus pour voir… rah ! pas eu le temps de cliquer ! un truc a surgi au milieu de mon écran m’offrant d’acheter un pack de 20 boites de viagra pour le prix de 19 avec un prix HT sans les frais de ports dans une cyber-boutique Made in China… et je peux pas le fermer ! Non… je peux pas, je le sais bien. Quand même, je sais reconnaître un vulgaire popup, ces machins qui surgissent de partout quand on visite un site porno ou de warez, ces machins qui en ouvrent 3 quand on en ferme 1, ces trucs qui se plancent sur l’écran de manière à ce que les boutons de fermeture et de réduction de la fenêtre soient inaccessibles au click de la souris, ces horreurs qui imitent des fenêtres de dialogue de Windows pour t’inciter à cliquer sur OK… Non, ce n’en est pas un ! Ou alors c’est un vicieux ! un new-age ! car celui là l’a pas de cadre, il n’est pas dans uine fenêtre ! On ne peut pas le fermer, même pas faire un click-droit dessus, on ne peut que subir !

Bon… ça y est, les émotions sont passées. J’ai eu ma dose de pub, je vais pas sortir de chez moi car je vais machinalement ouvrir ma boite aux lettres pour y trouver une dizaine de feuilles de choux publicitaires, je vais pas sortir de chez moi car il y a plein d’affiches de partout, dans la rue, aux arrets de bus, dans le métro… je vais allumer la télé… euh… non c’est pas une bonne idée, le Monsieur de TF1 a bien expliqué dans Le Monde que ses émissions ne servaient qu’à mettre le téléspectateur en condition, le préparer à subir la "petite page de pub"… 2 pour le prix d’un, 50% de réduction, gagnez des points, grattez ici, gagnez une Twingo, un set de casserolles inox et 6 mois en pension complète à La Courneuve… c’est pas pénible ? Ah… vous êtes d’accord avec moi ! merci. je préfère…

Allons… il ne faut pas sombrer dans la déprime… changez vous les idées, et puisque vous êtes devant votre ordinateur, discutez par internet avec vos amis, lancez ICQ ou MSN, et essayez d’ignorer le bandeau de pub en bas, ou relevez vos e-mails et ignorez les 872 spam pour répondre aux 4 e-mails intéressants que vous avez reçu !

Mais surtout, surtout… ne piratez pas de musique ! Enfin, si, piratez à gogo, on s’en tape après tout, il n’ont qu’à pas vendre de la merde @ star’ac à 200 balles le CD, mais ne téléchargez pas avec Kazaa ! Prennez quelque chose de propre, par exemple une version d’e-mule opensource, car le Kazaa il est mignon mais il installe une demi-douzaine de gentils spywares sur votre ordinateur, et bien entendu on ne peut pas les dégommer sans bouziller Kazaa… ces bestioles c’est comme des morpions: ça s’incruste dans votre ordi, ça s’accroche pour pas qu’on puisse désinstaller, et ça vous suce le sang, ça bouffe un max de ressources système et ça balance allègrement des bandeaux de pub de partout sur votre ordi, et cerise sur la choucroutte, ça grapille plein d’informations sur vous de manière à être spammé plus efficacement de ce tas de merde de spam. Non mais sérieusement, comment un informaticien peut-il programmer un programme comme Gator ? Sérieux… je réfèrerais être le mec qui a foiré son code dans Win95 et qui a fait apparaitre un bel écran bleu "kernel panic" lors de la présentation officielle par Billou qu’un membre de cette pitoyable équipe de pollueurs qui ose sortir des logiciels parasite tels que celui-ci. J’ai envie de dire "la pub aux chiottes", mais aux chiottes c’est bien connu la pub nous colle au cul (désolé, mais ça rime!) avec les magasines qu’on paye 50 balles pour avoir 200 pages dont 100 de pub.

Donc finalement, on va pas bouger. On va fermer les yeux, et on va réfléchir un peu. Ca sert à quoi toute cette pub ? Ca sert à faire connaitre les produits et à inciter les pigeons… pardon, les consommateurs… à acheter. Franchement, quand vous relevez votre boite e-mails que vous avez depuis 4 ans et dont vous avez laissé l’adresse en clair, sans le salvateur tag NOSPAM dans les forums, newsgroups, sites web et co, après 1 mois de vacances à Petaouchnok, et que vous voyez ((Téléchargement de 2832 messages)), sachant que 99,9% sont du spam, dites moi, franchement, y a-t-il la moindre chance que la société PornRox, éditrice du site www.trucporno.com, et qui vous a envoyé le 1456 ème e-mail pendant votre mois de vacances, parvienne a faire connaitre de vous son produit, et réussisse à vous faire visiter son site et sortir votre CB ? Ceux qui répondent "oui", ils sortent !

#Morale1: la pub ça sert à rien,
#Morale2: la pub ça fait chier,
#Morale3: il faut refuser la pub et tout faire pour l’erradiquer!,
#Morale4: virez moi ce bandeau de pub au dessus de mon blog, par pitié…

à Montpellier le 22/08/2004

• 1098 mots • #internet #web #publicité
19 Oct 2001 Comment travailler avec les variables d'environnement dans une application Java ?

Les variables d’environnement sont des chaînes des texte donnant des informations utiles à l’exécution d’un programme Java.
Il faut faire attention car certaines variables d’environnement ne sont pas portables: par exemple les systèmes Applet/Mac n’ont pas de varibales d’environnement, et les systèmes DOS (Windows) utilisent un système de variables d’environnement différent de celui utilisé sur les systèmes UNIX.

Nous allons distinguer dans cet article 3 types de variables différents: celles que l’on peut spécifier à l’exécution d’un programme Java, en ajoutant des options à la commende "java maClasse" (portables sur tous les systèmes d’exploitation); celles que l’on peut définir avant l’exécution d’un programme, une bonne fois pour toutes, comme le célébrissime CLASSPATH (ce sont ces variables d’enviromment qui posent problème selon l’OS sous lequel est exécuté notre application Java); et, pour finir, les variables système, définies par la spécification Java, non modifiables, qui renseignent sur la JVM utilisée, et qui sont indépendantes de l’OS sous lequel tourne notre programme.

1) Premier type

Lors du travail avec les Properties, java.util.Properties, on utilise un fichier de propriétés. On peut par exemple créer 3 fichiers de propriétés qui renfermeront les valeurs en chaînes dures des textes d’une interface graphique.
On aura donc par exemple:

# Premier fichier: pour une enterface en français
# Ce fichier s’appelle francais.properties
monBouton1 = "OK"
monBouton2 = "Annuler"
# Second fichier: pour la même application, avec l’interface traduite en anglais
# Ce fichier s’appelle anglais.properties
monBouton1 = "OK"
monBouton2 = "Cancel"
# Troisième fichier: pour la même application, avec l’interface traduite en martien (langue des petits hommes verts)
# Ce fichier s’appelle martien.properties
monBouton1 = "GlupGlup"
monBouton2 = "Gniorf"

On a ainsi 3 fichiers qui contiennent le label de tous les éléments de notre interface graphique. On va lancer notre programme en lui indiquant que l’on veut utiliser l’un ou l’autre des fichiers… selon si notre utilisateur est français, américian, ou martien !

java -Dlangue=martien.properties MaClasse

On utilise une variable que l’on appelle "langue" dans laquelle sera stockée le nom du fichier de propriétés à charger.
Il ne nous reste plus qu’à charger ce fichier dans notre programme Java.

String env = System.getProperty("langue");

Alors, quelle langue parlera notre application ? Vous dites le martien ? C’est ça !
Notre variable "langue" contient le nom du fichier de propriétés à charger, nous allons donc le charger:

Properties envVars = new Properties();
envVars.load(env);

NOTE: on a travaillé avec les propriétés, ce qui a un peu compliqué les choses, mais c’était pour donner un exemple pratique, on aurait aussi bien pu, par exemple, indiquer une image à charger:

java -Dimage=monLogo.gif MaClasse
ImageIcon img = new ImageIcon(System.getProperty("image"));

Il est très important dans tous les cas de ne pas laisser d’espace entre le -D et le nom de la variable et des deu côtés du =.

2) Second type

Si vous avec compris le premier type, vous avec compris le second, car c’est une variation du premier…

On définit une variable, par exemple:

# Sous DOS (Windows), on ajoute cette ligne à l’autoexec.bat
MON_CHEMIN_PERSO="C:\Mes Documents\Mes Images\"
# Sous UNIX
export MON_CHEMIN_PERSO=/home/moi/mes_images/:$MON_CHEMIN_PERSO

Et au lancement de notre programme Java, on écrira:

# Windows
java MaClasse %MON_CHEMIN_PERSO%
# UNIX
java MaClasse $MON_CHEMIN_PESO

La procédure pour récupérer la variable dans le programme, on la lit dans la méthode main() comme argument[0].
Personnellement je n’aime pas cette methode, mais elle existe…

3) Troisième type

Comme expliqué plus haut, le troisième type est totalement différent: vous ne pouvez pas modifier les variables d’environnement ce de type, elles sont internes au langage Java et servent à fournir des informations sur la JVM hôte.

La syntaxe pour récupérer ce genre de propriétés est la suivante:

String propriete = java.lang.System.getProperty(String prop);
Exemple:
final String USER_HOME = System.getProperty("user.home");

Voici un tableau des différentes propriétés auxquelles l’on peut avoir accès:
Sur fond bleu clair les plus utilisées.


Valeur


Signification

java.version
Version du
JRE
java.vendor
"Vendor" du JRE
java.vendor.url
URL du "Vendor"
java.vm.specification.version
JVM version de specification
java.vm.specification.vendor
JVM "vendor" de specification
java.vm.specification.name
JVM nom de specification
java.vm.version
JVM version d'implémentation
java.vm.vendor
JVM "vendor" d'implémentation
java.vm.name
JVM nom d'implémentation
java.home
Répertoire
de java.exe
java.specification.version
JRE version de specification
java.specification.vendor
JRE "vendor" de specification
java.specification.name
JRE nom de specification
java.class.version
Numéro
de version de Java
java.class.path
Le CLASSPATH
java.ext.dirs
Répertoire
des extensions
os.name
Nom du système
d'exploitation
os.arch
Nom de l'architechture de l'OS
os.version
Numéro de version de
l'OS
file.separator
Sérarateur
de fichiers (1)
line.separator
Séparateur
de lignes (2)
path.separator
Séparateur de chemins
(3)
user.name
Nom du compte utilisateur
user.home
Répertoire
par défaut de l'utilisateur
user.dir
Répertoire
où se trouve la classe principale
(1)
"/" sous UNIX
"\" sous Windows</p>

(2)
"\n" sous UNIX
"\r" sous Mac
"\n\r" sous Windows

(3)
":" sous Unix </td> </tr> </tbody> </table>

Tutoriel distribué pour le FAQ Java de Java-France www.java-france.com / www.jgflsoft.com
Réédité sur Valhalla GFBLOG.
Ecrit à Montpellier le 19 octobre 2001.

• 1091 mots • #programmation #java
18 Oct 2001 Comment jouer un son dans une application Java ?

Le multimédia est devenu un problème majeur dans le développement de logiciels. En effet, un programme doté d’une belle interface, avec des boutons animés, qui font du bruits en réponse aux actions de l’utilisateur, etc…, est devenu un atout pour séduire le gran public. Même si votre logiciel est très puissant, le meilleur dans son domaine, beaucoup (toujours trop) d’utilisateurs lui préfèreront un concurrent si tant est que celui-ci soit plus beau et plus convivial. L’interface graphique n’est donc pas à négliger, loin de là !

Je vous propose donc un petit tutoriel expliquant comment jouer des sons dans un programme Java. Ce tutoriel est cependant particulier: il concerne Java 1.1 en plus ancien, mais il est intéressant tout de même ! Je m’explique: il n’était pas possible à l’époque de jouer un son autre part que dans des applets sans utiliser de classes non documentées et très peu connues. Ce sont ces classes bien pratiques qui sont utilisées ici.
Vous pouvez utiliser cette technique dans vos programmes Java 2 (SDK 1.2, 1.3 & 1.4) si vous ne voulez par avoir recours aux nouvelles techniques.
Les classes non documentées font partie du paquetage sun.audio .

On notera cependant une forte restriction: n’essayez pas de jouer un fichier de 3 GO contentenant l’integrale de la 9ème symphonie de Beethoven, en qualité CD… cela ne fonctionnera pas avec cette méthode. Le format utilisé en Java par défaut est le format AU, plutôt destiné à faire un "ping", "plouf", ou "plaf" lorsque l’utilisateur clique sur un bouton qu’à jouer un morceau de classique…

Passons donc au code commenté:

  1. import sun.audio.*;
  2. // Le fichier "xxx.au" à ouvrir
  3. File fichier = null;
  4. // les données audio...
  5. AudioData donnees = null;
  6. // le flux d'entrée pour ces données
  7. InputStream inputStr = null;
  8. /*
  9. * Méthode permettant d'ouvrir un fichier audio
  10. */
  11. public void open() {
  12. // "this" si la classe dans laquelle se trouve la méthode étend de Jframe ou Frame, ce qui est le cas classique
  13. FileDialog fd = new FileDialog(this, "Sélectionner un fichier AU");
  14. // afficher le FileChooser...
  15. fd.show();
  16. try {
  17. // assigner à notre fichier de départ, qui était "null" jusqu'à présent, un fichier réel
  18. fichier = new File(fd.getDirectory() + "/" + fd.getFile());
  19. // si l'assignation a bien fonctionné, le fichier n'est plus "null", donc:
  20. if (fichier != null) {
  21. // ouvrir notre flux d'entrée sur ce fichier
  22. FileInputStream fis = new FileInputStream(fichier);
  23. // créer un flux d'entrée spécial pour les fichiers audio
  24. AudioStream as = new AudioStream(fis);
  25. // et rediriger ce flux vers notre objet AudioData
  26. donnees = as.getData();
  27. }
  28. }
  29. catch (IOException e) {
  30. System.err.println(e);
  31. }
  32. }
  33. /*
  34. * Cette méthode permet de jouer le son enregistré dans notre fichier
  35. */
  36. public void play() {
  37. // si une lecture est déjà en cours, l'arrêter
  38. stop();
  39. // s'il n'y a aucun son à jouer, ouvrir un fichier
  40. if (donnees == null) open();
  41. // s'il y a des données à jouer:
  42. if (donnees != null) {
  43. // Créer un flux de données audio, lancer la lecture de ce flux, et le rediriger dans notre flux d'entrée
  44. AudioDataStream ads = new AudioDataStream(donnees);
  45. // lancer la lecture:
  46. AudioPlayer.player.start(ads);
  47. inputStr = ads;
  48. }
  49. }
  50. /*
  51. * Arrete de jouer le son en cours
  52. */
  53. public void stop() {
  54. if (inputStr != null) {
  55. AudioPlayer.player.stop(inputStr);
  56. inputStr = null;
  57. }
  58. }
  59. /*
  60. * Jouer le son de manière continue (facultatif)
  61. */
  62. public void loop() {
  63. stop();
  64. if (donnees == null) open();
  65. if (donnees != null) {
  66. // pour jouer un son de manière continue, on a besoin d'un flux spécial:
  67. // le ContinuousAudiodataStream, créé avec notre objet AudioData comme paramètre
  68. ContinuousAudioDataStream cads = new ContinuousAudioDataStream(donnees);
  69. // lancer la lecture:
  70. AudioPlayer.player.start(cads);
  71. inputStr = cads;
  72. }
  73. }

Ecrit par Narcanes pour l’association Java-France/Jgflsoft
www.java-france.com / www.jgflsoft.com
Réédité pour Valhalla GFBLOG.
Montpellier, 18 octobre 2001.

• 861 mots • #programmation #java
18 Oct 2001 L'équivalent de la fonction C scanf() en Java

Il n’existe pas par défaut en Java de méthode permettant de récupérer une série de nombres venant de l’utilisateur, comme le fait la méthode scanf() en C/C++. Il faut donc ruser, et écrire quelques lignes de code pour arriver à nos fins.

Pour récupérer un argument (chaîne, nombre, …) au cours de l’exécution d’un programme en ligne de commande, il faut utiliser le méthode readline() de la classe DataInputStream. Cette méthode renvoie une chaîne, nous devons ensuite convertir cette chaîne en nombre. Pour cela on utilisera les String Tokenizers.

Ce que vous devez faire: récupérer avec DataInputStream.readline() la chaîne de nombres.
L’utilisateur aura à saisir par exemple "23 32 5 47 22.3 55.221" pour avoir les entiers 23, puis 32, puis 5, puis 47, et les flottants 22.3 et 55.221.
Notre code sépare les différents nombres contenus dans la chaîne:

String s = "23 32 5 47 22.3 55.221";
java.util.StringTokenizer st = new java.util.StringTokenizer(s);
while (st.hasMoreTokens())
{ System.out.println("Le nombre suivant est: " + st.nextToken() + "\n");
}

Voici ce qui sort:
23
32
5
47
22.3
55.221

Pour convertir les chaînes sorties en nombres, on peut utiliser différentes méthodes, dont celle expliquée dans un autre article de cette FAQ (Convertir des String en int, float… et vice-versa).

Voici le code non commenté:

  • String str;
  • str = "25"; // nombre entier
  • int i = Integer.valueOf(str).intValue(); // créer un int à partir de la chaîne
  • System.out.println(i);
  • long l = Long.valueOf(str).longValue(); // créer un long à partir de la chaîne
  • System.out.println(l);
  • str = "25.6"; // nombre à virgule flottante
  • float f = Float.valueOf(str).floatValue(); // créer un float à partir de la chaîne
  • System.out.println(f);
  • double d = Double.valueOf(str).doubleValue(); // créer un double à partir de la chaîne
  • System.out.println(d);

Note: depuis Java 1.1, pour avoir un Short et/ou un Byte on passera par Integer (comme pour avoir un int) mais en utilisant soit Integer.byteValue() soit Integer.shortValue().

Ecrit par Narcanes pour l’association Java-France/Jgflsoft
www.java-france.com / www.jgflsoft.com
Réédité pour Valhalla GFBLOG.
Montpellier, 18 octobre 2001.

• 373 mots • #programmation #java